diff --git a/Internal/de/PROJECT_CONTEXT.md b/Internal/de/PROJECT_CONTEXT.md index 8e0f6fe..a09d95e 100644 --- a/Internal/de/PROJECT_CONTEXT.md +++ b/Internal/de/PROJECT_CONTEXT.md @@ -1,6 +1,6 @@ # Papa-Kind-Treff – Projektkontext -Stand: 2026-08-05 +Stand: 2026-08-07 ## Kurzbeschreibung Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind lokale Events, Termine und Treffen, ein Community-Forum, Mitgliederprofile mit optionalen Kinderinfos und ein Moderations-/Adminbereich. @@ -23,6 +23,7 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l - Profiladresse kann per Suche oder Browser-Standort übernommen werden. - Der Bereich `Events` ist wieder auf echte eigene Events und Event-Teilnahmen begrenzt. - Der Bereich `Events` bietet zusätzlich einen manuellen ICS-Export und einen persönlichen abonnierbaren Kalender-Feed für alle eigenen Events und Event-Teilnahmen. +- Der Bereich `Events` ist im UI in `Meine Events` und `Synchronisation` getrennt, damit Event-Verwaltung und Kalender-Themen sauberer getrennt bleiben. - Orte und Veranstaltungen als Ausflugsziele sind vorerst in einen separaten Mitgliederbereichspunkt `Ausflugsziele` verschoben. - Die Eingabe im Bereich `Events` soll so einfach wie möglich bleiben und zeigt deshalb nur die für echte Termine relevanten Felder. - Kategorien werden im Mitgliederbereich per Sucheingabe mit bestehenden Vorschlägen und automatischer Neuanlage gepflegt. @@ -39,6 +40,10 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l - Ziel: spätere Unterscheidung zwischen eigenem Event, Partner-Angebot, allgemeinem Ort und redaktionellem Termin - Google ist noch nicht aktiv integriert; das System wird nur vorbereitend über Settings und Datenfelder darauf ausgelegt +## Vorgemerkte To-dos +- Kalender-Integration großer Anbieter soll später zusätzlich zum ICS-Feed kommen, zuerst vor allem für Google und Microsoft/Outlook. +- Zielbild dafür ist keine Rücksynchronisierung, sondern ein nutzerseitiges OAuth-Login über Papa-Kind-Treff und danach eine direkte Kalender-Verknüpfung oder Event-Synchronisierung beim jeweiligen Anbieter. + ## Pflegehinweis Bei Änderungen immer auch die parallelen Dateien in `Internal/en/` prüfen und inhaltlich gleichziehen. diff --git a/Internal/en/PROJECT_CONTEXT.md b/Internal/en/PROJECT_CONTEXT.md index 8087f32..7eba344 100644 --- a/Internal/en/PROJECT_CONTEXT.md +++ b/Internal/en/PROJECT_CONTEXT.md @@ -1,6 +1,6 @@ # Papa-Kind-Treff – Project Context -Updated: 2026-08-05 +Updated: 2026-08-07 ## Summary Papa-Kind-Treff is a PHP-based platform for fathers. Core areas are local events, appointments, and meetups, a community forum, member profiles with optional child information, and a moderation/admin area. @@ -23,6 +23,7 @@ Papa-Kind-Treff is a PHP-based platform for fathers. Core areas are local events - Profile address can be completed via address search or browser-based location import. - The `Events` area is limited again to real own events and event participations. - The `Events` area now also provides a manual ICS export and a personal subscribable calendar feed for all own events and event participations. +- The `Events` area is now separated in the UI into `My Events` and `Synchronization` so that event management and calendar tasks stay clearly separated. - Places and event-like outing targets were moved for now into a separate member-area section `Outings`. - The `Events` input flow should stay as simple as possible and therefore only shows fields relevant for real scheduled events. - Categories in the member area are handled via a search input with existing suggestions and automatic creation when needed. @@ -39,6 +40,10 @@ Papa-Kind-Treff is a PHP-based platform for fathers. Core areas are local events - Goal: later distinguish between own event, partner offer, general place, and editorial event entry - Google is not integrated productively yet; the system is only being prepared for it via settings and data fields +## Deferred To-dos +- Large calendar-provider integrations should be added later in addition to the ICS feed, starting primarily with Google and Microsoft/Outlook. +- The target model is no reverse sync, but a user-side OAuth login through Papa-Kind-Treff followed by a direct calendar connection or event synchronization at the respective provider. + ## Maintenance Note - Whenever one of these files changes, the matching files in `Internal/de/` and `Internal/en/` must be kept aligned. - The root `README.md` acts as the startup document for new chats and should be reviewed alongside major context changes. diff --git a/README.md b/README.md index 1007efe..4328a0f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Papa-Kind-Treff – Start-Doku -Stand: 2026-08-05 +Stand: 2026-08-07 Diese Datei ist die zentrale Start-Doku für neue Chats und den schnellen Projekteinstieg. @@ -42,6 +42,8 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter mit Fokus auf: - Die Eingabe im Mitgliederbereich ist jetzt bewusst vereinfacht: zuerst nur Pflichtangaben, optionale Angaben in einklappbaren Bereichen - Kategorien werden jetzt über eine Sucheingabe mit bestehenden Vorschlägen gepflegt; neue Kategorien werden automatisch angelegt und sind für Seiten-Admins im Systembereich zusammenführbar - Im Mitgliederbereich `Events` gibt es jetzt zusätzlich einen ICS-Download und einen persönlichen abonnierbaren Kalender-Feed für alle eigenen Events und Event-Teilnahmen +- Der Bereich `Events` ist im Mitgliederbereich jetzt zusätzlich in die Tabs `Meine Events` und `Synchronisation` gegliedert +- Für später vorgemerkt: direkte Kalender-Anbindung großer Anbieter wie Google und Microsoft/Outlook per OAuth, zusätzlich zum bestehenden ICS-Feed ## Datenschutz und Sicherheit - sensible Profilfelder werden app-seitig verschlüsselt gespeichert diff --git a/partials/landing/account/dashboard.php b/partials/landing/account/dashboard.php index 7fa682f..1ce61a8 100755 --- a/partials/landing/account/dashboard.php +++ b/partials/landing/account/dashboard.php @@ -282,75 +282,24 @@ if (!empty($canManageSystemSettings)) {

Hier verwaltest du nur echte eigene Events und Events, an denen du teilnimmst.

-
+
- - ICS herunterladen -
- + + + - - -
- Events mit deiner Teilnahme -

Events anderer Nutzer, bei denen du eingetragen bist.

-
- -

Aktuell nimmst du an keinen zukünftigen Events teil.

- - - -
- Vergangene Teilnahmen anzeigen - -

Keine vergangenen Event-Teilnahmen.

+ + + + +
+ +
+ Events mit deiner Teilnahme +

Events anderer Nutzer, bei denen du eingetragen bist.

+
+ +

Aktuell nimmst du an keinen zukünftigen Events teil.

- +
+ Vergangene Teilnahmen anzeigen + +

Keine vergangenen Event-Teilnahmen.

+ +
    + +
  • +
    + +
    + +
    +
    +
  • + +
+ +
+
+ +
@@ -1309,6 +1332,8 @@ if (!empty($canManageSystemSettings)) { const profileAddressNeedsValidation = document.getElementById('profileAddressNeedsValidation'); const profileAddressResults = document.getElementById('profileAddressResults'); const profileAddressResultsModal = document.getElementById('modalProfileAddressResults'); + const eventTabButtons = document.querySelectorAll('[data-event-tab-trigger]'); + const eventTabPanels = document.querySelectorAll('[data-event-tab-panel]'); let map, marker; const existingCategories = ; let lastAutoGeocodeQuery = ''; @@ -1437,6 +1462,25 @@ if (!empty($canManageSystemSettings)) { categoryInput?.addEventListener('input', syncCategoryInputState); syncCategoryInputState(); + function setEventTab(nextTab) { + const activeTab = nextTab || 'my-events'; + eventTabButtons.forEach((button) => { + const isActive = button.getAttribute('data-event-tab-trigger') === activeTab; + button.classList.toggle('is-active', isActive); + button.setAttribute('aria-selected', isActive ? 'true' : 'false'); + }); + eventTabPanels.forEach((panel) => { + panel.hidden = panel.getAttribute('data-event-tab-panel') !== activeTab; + }); + } + + eventTabButtons.forEach((button) => { + button.addEventListener('click', () => { + setEventTab(button.getAttribute('data-event-tab-trigger') || 'my-events'); + }); + }); + setEventTab('my-events'); + function ensureLeaflet(callback) { if (!window.PKTConsent || !window.PKTConsent.has('external_services')) { alert('Für Karten und Adresssuche bitte zuerst die externen Dienste in den Cookie-Einstellungen erlauben.'); diff --git a/public/assets/css/app.css b/public/assets/css/app.css index b8e94de..fa82f0b 100755 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -239,6 +239,11 @@ body { .account-panel__head { padding: 22px 24px; border-bottom: 1px solid var(--color-border); background: #fffdfa; } .account-panel__head h2 { margin: 0 0 6px; } .account-panel__body { padding: 24px; } +.account-inline-tabs { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 18px; } +.account-inline-tabs__button { appearance: none; border: 1px solid var(--color-border); background: #fff; color: var(--color-text); border-radius: 999px; padding: 11px 16px; font: inherit; font-weight: 700; cursor: pointer; transition: background .15s ease, color .15s ease, border-color .15s ease; } +.account-inline-tabs__button:hover { border-color: var(--color-primary); color: var(--color-primary); } +.account-inline-tabs__button.is-active { background: var(--color-primary); color: var(--color-primary-contrast); border-color: var(--color-primary); } +.account-inline-tab-panel[hidden] { display: none; } .account-kv { display: grid; gap: 10px; margin: 0; } .account-kv div { display: grid; grid-template-columns: 190px minmax(0, 1fr); gap: 14px; } .account-kv--compact { gap: 8px; }