dasdsad
All checks were successful
Deploy / deploy (push) Successful in 54s

This commit is contained in:
2026-08-08 00:18:20 +02:00
parent ddac1c182b
commit 49b248a39f
4 changed files with 79 additions and 60 deletions

View File

@@ -23,7 +23,8 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l
- Profiladresse kann per Suche oder Browser-Standort übernommen werden. - 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` 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` 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. - Der Bereich `Events` ist im UI in `Meine Events`, `Synchronisation` und `Abgelaufene Events` getrennt, damit aktive Events, Kalender-Themen und Vergangenes sauber getrennt bleiben.
- In `Meine Events` sitzt der Button `Neues Event anlegen` direkt in der Box `Eigene Events`; die bisherige Teilnahme-Box heißt jetzt `Angemeldete Events` und enthält zusätzlich einen direkten Link zur `Event Suche`.
- Orte und Veranstaltungen als Ausflugsziele sind vorerst in einen separaten Mitgliederbereichspunkt `Ausflugsziele` verschoben. - 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. - 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. - Kategorien werden im Mitgliederbereich per Sucheingabe mit bestehenden Vorschlägen und automatischer Neuanlage gepflegt.

View File

@@ -23,7 +23,8 @@ 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. - 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 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 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. - The `Events` area is now separated in the UI into `My Events`, `Synchronization`, and `Expired Events` so that active events, calendar tasks, and past items stay clearly separated.
- Inside `My Events`, the `Create New Event` button now lives directly in the `Own Events` box; the previous participation box is now labeled `Registered Events` and also includes a direct link to `Event Search`.
- Places and event-like outing targets were moved for now into a separate member-area section `Outings`. - 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. - 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. - Categories in the member area are handled via a search input with existing suggestions and automatic creation when needed.

View File

@@ -42,7 +42,7 @@ 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 - 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 - 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 - 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 - Der Bereich `Events` ist im Mitgliederbereich jetzt zusätzlich in die Tabs `Meine Events`, `Synchronisation` und `Abgelaufene Events` 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 - 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 ## Datenschutz und Sicherheit

View File

@@ -282,18 +282,23 @@ if (!empty($canManageSystemSettings)) {
<p class="muted">Hier verwaltest du nur echte eigene Events und Events, an denen du teilnimmst.</p> <p class="muted">Hier verwaltest du nur echte eigene Events und Events, an denen du teilnimmst.</p>
</div> </div>
<div class="account-panel__body"> <div class="account-panel__body">
<div class="flex gap-12" style="margin:0 0 18px 0; flex-wrap: wrap;">
<button class="btn" type="button" data-modal-open="modalEvent">Eigenes Event anlegen</button>
</div>
<div class="account-inline-tabs" role="tablist" aria-label="Event-Bereiche"> <div class="account-inline-tabs" role="tablist" aria-label="Event-Bereiche">
<button class="account-inline-tabs__button is-active" type="button" role="tab" aria-selected="true" data-event-tab-trigger="my-events">Meine Events</button> <button class="account-inline-tabs__button is-active" type="button" role="tab" aria-selected="true" data-event-tab-trigger="my-events">Meine Events</button>
<button class="account-inline-tabs__button" type="button" role="tab" aria-selected="false" data-event-tab-trigger="sync">Synchronisation</button> <button class="account-inline-tabs__button" type="button" role="tab" aria-selected="false" data-event-tab-trigger="sync">Synchronisation</button>
<button class="account-inline-tabs__button" type="button" role="tab" aria-selected="false" data-event-tab-trigger="past-events">Abgelaufene Events</button>
</div> </div>
<div class="account-inline-tab-panel" data-event-tab-panel="my-events"> <div class="account-inline-tab-panel" data-event-tab-panel="my-events">
<div class="card" style="margin-bottom:18px;"> <div class="card" style="margin-bottom:18px;">
<strong>Eigene Events</strong> <div style="display:flex; justify-content:space-between; gap:12px; align-items:flex-start; flex-wrap:wrap;">
<p class="muted small" style="margin:8px 0 0;">Von dir organisierte Treffen oder Events mit eigener Teilnahme-Logik.</p> <div>
<strong>Eigene Events</strong>
<p class="muted small" style="margin:8px 0 0;">Von dir organisierte Treffen oder Events mit eigener Teilnahme-Logik.</p>
</div>
<div class="flex gap-12" style="flex-wrap:wrap;">
<button class="btn" type="button" data-modal-open="modalEvent">Neues Event anlegen</button>
</div>
</div>
</div> </div>
<?php if (!$eventsUpcoming): ?> <?php if (!$eventsUpcoming): ?>
<p class="muted small">Keine zukünftigen eigenen Events angelegt.</p> <p class="muted small">Keine zukünftigen eigenen Events angelegt.</p>
@@ -335,35 +340,16 @@ if (!empty($canManageSystemSettings)) {
<?php endforeach; ?> <?php endforeach; ?>
</ul> </ul>
<?php endif; ?> <?php endif; ?>
<details style="margin-top:12px;">
<summary style="cursor:pointer;">Vergangene Events anzeigen</summary>
<?php if (!$eventsPast): ?>
<p class="muted small">Keine vergangenen Events.</p>
<?php else: ?>
<ul class="dash-list" style="margin-top:10px;">
<?php foreach ($eventsPast as $e): ?>
<li>
<div style="display:flex; justify-content:space-between; gap:12px; align-items:center; flex-wrap: wrap;">
<div>
<strong><?= htmlspecialchars($e['title'], ENT_QUOTES) ?></strong>
<?php if ($e['status'] === 'cancelled'): ?>
<span class="badge" style="background:#fee2e2; color:#991b1b;">Abgesagt</span>
<?php endif; ?>
<div class="muted small" style="margin-top:4px;">
<?= htmlspecialchars($e['city'], ENT_QUOTES) ?> · <?= htmlspecialchars($e['starts_at'], ENT_QUOTES) ?> · <?= htmlspecialchars($e['visibility'], ENT_QUOTES) ?>
· Anmeldungen: <?= (int)$e['participant_count'] ?>
</div>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</details>
<div class="card" style="margin:22px 0 14px;"> <div class="card" style="margin:22px 0 14px;">
<strong>Events mit deiner Teilnahme</strong> <div style="display:flex; justify-content:space-between; gap:12px; align-items:flex-start; flex-wrap:wrap;">
<p class="muted small" style="margin:8px 0 0;">Events anderer Nutzer, bei denen du eingetragen bist.</p> <div>
<strong>Angemeldete Events</strong>
<p class="muted small" style="margin:8px 0 0;">Events anderer Nutzer, bei denen du eingetragen bist.</p>
</div>
<div class="flex gap-12" style="flex-wrap:wrap;">
<a class="btn ghost" href="/search">Event Suche</a>
</div>
</div>
</div> </div>
<?php if (!$eventsJoinedUpcoming): ?> <?php if (!$eventsJoinedUpcoming): ?>
<p class="muted small">Aktuell nimmst du an keinen zukünftigen Events teil.</p> <p class="muted small">Aktuell nimmst du an keinen zukünftigen Events teil.</p>
@@ -388,30 +374,6 @@ if (!empty($canManageSystemSettings)) {
<?php endforeach; ?> <?php endforeach; ?>
</ul> </ul>
<?php endif; ?> <?php endif; ?>
<details style="margin-top:12px;">
<summary style="cursor:pointer;">Vergangene Teilnahmen anzeigen</summary>
<?php if (!$eventsJoinedPast): ?>
<p class="muted small">Keine vergangenen Event-Teilnahmen.</p>
<?php else: ?>
<ul class="dash-list" style="margin-top:10px;">
<?php foreach ($eventsJoinedPast as $entry): ?>
<li>
<div>
<strong><?= htmlspecialchars((string)$entry['title'], ENT_QUOTES) ?></strong>
<div class="muted small" style="margin-top:4px;">
<?= htmlspecialchars(trim(implode(' · ', array_filter([
(string)($entry['city'] ?? ''),
!empty($entry['starts_at']) ? (string)$entry['starts_at'] : null,
!empty($entry['host_name']) ? 'Von ' . (string)$entry['host_name'] : null,
!empty($entry['participation_status']) ? 'Status: ' . (string)$entry['participation_status'] : null,
]))), ENT_QUOTES) ?>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</details>
</div> </div>
<div class="account-inline-tab-panel" data-event-tab-panel="sync" hidden> <div class="account-inline-tab-panel" data-event-tab-panel="sync" hidden>
@@ -444,6 +406,61 @@ if (!empty($canManageSystemSettings)) {
<p class="muted small" style="margin:8px 0 0;">Für laufende Aktualisierungen solltest du deshalb den persönlichen Kalender-Feed abonnieren.</p> <p class="muted small" style="margin:8px 0 0;">Für laufende Aktualisierungen solltest du deshalb den persönlichen Kalender-Feed abonnieren.</p>
</div> </div>
</div> </div>
<div class="account-inline-tab-panel" data-event-tab-panel="past-events" hidden>
<div class="card" style="margin-bottom:18px;">
<strong>Vergangene eigene Events</strong>
<p class="muted small" style="margin:8px 0 0;">Hier siehst du deine bereits abgelaufenen oder vergangenen eigenen Events.</p>
</div>
<?php if (!$eventsPast): ?>
<p class="muted small">Keine vergangenen Events.</p>
<?php else: ?>
<ul class="dash-list" style="margin-top:10px;">
<?php foreach ($eventsPast as $e): ?>
<li>
<div style="display:flex; justify-content:space-between; gap:12px; align-items:center; flex-wrap: wrap;">
<div>
<strong><?= htmlspecialchars($e['title'], ENT_QUOTES) ?></strong>
<?php if ($e['status'] === 'cancelled'): ?>
<span class="badge" style="background:#fee2e2; color:#991b1b;">Abgesagt</span>
<?php endif; ?>
<div class="muted small" style="margin-top:4px;">
<?= htmlspecialchars($e['city'], ENT_QUOTES) ?> · <?= htmlspecialchars($e['starts_at'], ENT_QUOTES) ?> · <?= htmlspecialchars($e['visibility'], ENT_QUOTES) ?>
· Anmeldungen: <?= (int)$e['participant_count'] ?>
</div>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<div class="card" style="margin:22px 0 14px;">
<strong>Vergangene Teilnahmen</strong>
<p class="muted small" style="margin:8px 0 0;">Events anderer Nutzer, an denen du in der Vergangenheit teilgenommen hast.</p>
</div>
<?php if (!$eventsJoinedPast): ?>
<p class="muted small">Keine vergangenen Event-Teilnahmen.</p>
<?php else: ?>
<ul class="dash-list" style="margin-top:10px;">
<?php foreach ($eventsJoinedPast as $entry): ?>
<li>
<div>
<strong><?= htmlspecialchars((string)$entry['title'], ENT_QUOTES) ?></strong>
<div class="muted small" style="margin-top:4px;">
<?= htmlspecialchars(trim(implode(' · ', array_filter([
(string)($entry['city'] ?? ''),
!empty($entry['starts_at']) ? (string)$entry['starts_at'] : null,
!empty($entry['host_name']) ? 'Von ' . (string)$entry['host_name'] : null,
!empty($entry['participation_status']) ? 'Status: ' . (string)$entry['participation_status'] : null,
]))), ENT_QUOTES) ?>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
</div> </div>
</section> </section>
<?php endif; ?> <?php endif; ?>