76 lines
4.1 KiB
Markdown
76 lines
4.1 KiB
Markdown
# Seite: Veranstaltungsliste
|
|
|
|
## Route
|
|
|
|
`/shows`
|
|
|
|
Die Route ist der Standardpfad des Shows-Moduls. In `shows-routing.module.ts` ist kein eigener `canActivate`-Guard auf dieser Route definiert.
|
|
|
|
## Zweck
|
|
|
|
Die Veranstaltungsliste ist der Einstieg in den Veranstaltungsbereich. Sie trennt eigene, noch zu bearbeitende Veranstaltungen von bereits veröffentlichten Veranstaltungen und bietet für berechtigte Benutzer Filter sowie den Einstieg zur Neuanlage.
|
|
|
|
## Datenquellen
|
|
|
|
- `ShowService.list$()` liefert die für den aktuellen Benutzer sichtbaren Veranstaltungen.
|
|
- `ShowService.list$(false, true)` liefert eigene Veranstaltungen inklusive archivierter eigener Einträge.
|
|
- `ShowService.listPublicSince$(lastMonths)` fragt veröffentlichte, nicht archivierte Veranstaltungen serverseitig nach Zeitraum ab.
|
|
- Falls die serverseitige Abfrage keine Ergebnisse liefert, nutzt die Liste einen lokalen Fallback aus geladenen veröffentlichten und nicht archivierten Shows.
|
|
- `FilterStoreService.showFilter$` speichert Zeitraum, Ersteller, Veranstaltungstyp und Archiv-Filter.
|
|
- `UserService.user$` bestimmt den aktuellen Benutzer und dessen Rolle.
|
|
- `FilterComponent.owners$()` baut die Ersteller-Auswahl aus den in Shows verwendeten `owner`-IDs und `UserService.getUserbyId$()`.
|
|
|
|
## Wichtige UI-Elemente
|
|
|
|
- Seitenrahmen `app-page-frame` mit Titel `Veranstaltungen`.
|
|
- Sidebar mit `app-filter`, sichtbar für Rollen mit Sidebar-Zugriff.
|
|
- Karte `Meine Veranstaltungen` für eigene Entwürfe, nicht gemeldete veröffentlichte Veranstaltungen und optional archivierte Veranstaltungen.
|
|
- Karte `Veröffentlichte Veranstaltungen` für veröffentlichte, nicht archivierte Veranstaltungen.
|
|
- Listeneintraege zeigen Datum, Erstellername, übersetzten Veranstaltungstyp und optional ein Status-Badge.
|
|
- Button `Neue Veranstaltung anlegen`, der nach `/shows/new` führt.
|
|
- Hinweiszeile bei aktiven Filtern mit Anzahl der angezeigten Veranstaltungen und Aktion `Filter zurücksetzen`.
|
|
|
|
## Aktionen
|
|
|
|
- Veranstaltung öffnen: Klick auf einen Listeneintrag navigiert relativ zu `show.id`, also nach `/shows/:showId`.
|
|
- Neue Veranstaltung anlegen: nur über den Button in `Meine Veranstaltungen`.
|
|
- Filter ändern: Zeitraum, Ersteller, Veranstaltungstyp und Archiv-Anzeige werden direkt im `FilterStoreService` aktualisiert.
|
|
- Filter zurücksetzen: stellt den Standardfilter wieder her.
|
|
|
|
## Statuslogik
|
|
|
|
Der Standardfilter ist:
|
|
|
|
- Zeitraum: letzter Monat
|
|
- Ersteller: alle
|
|
- Veranstaltungstyp: alle
|
|
- Archiviert: aus
|
|
|
|
Öffentliche Veranstaltungen werden absteigend nach Datum sortiert und zusätzlich nach Ersteller und Veranstaltungstyp gefiltert. Der Zeitraum wird in 30-Tage-Monaten berechnet; `alle` nutzt den Wert `99999`.
|
|
|
|
Eigene Veranstaltungen erscheinen in `Meine Veranstaltungen`, wenn sie dem aktuellen Benutzer gehören und eine der folgenden Bedingungen erfüllen:
|
|
|
|
- nicht veröffentlicht
|
|
- `reportedType === 'pending'`
|
|
- archiviert und der Archiv-Filter ist aktiv
|
|
|
|
Status-Badges in `Meine Veranstaltungen`:
|
|
|
|
- `archiviert`, wenn `show.archived` gesetzt ist
|
|
- `nicht gemeldet`, wenn die Show veröffentlicht ist
|
|
- `unveröffentlicht`, wenn die Show nicht veröffentlicht ist
|
|
|
|
## Berechtigungen
|
|
|
|
- Die Route selbst hat im Shows-Routing keinen eigenen Guard.
|
|
- Sidebar und Filter sind nur sichtbar, wenn die Rolle `admin` oder `leader` enthält.
|
|
- Der Button `Neue Veranstaltung anlegen` ist per `RoleDirective` auf `leader` beschränkt.
|
|
- Benutzer ohne Sidebar-Zugriff sehen nur die veröffentlichten Veranstaltungen ohne Filterbereich.
|
|
|
|
## Technische Hinweise
|
|
|
|
- `ShowService.list$()` filtert archivierte Shows grundsaetzlich aus, lässt eigene archivierte Shows aber zu, wenn `includeOwnArchived` aktiv ist.
|
|
- `ShowDataService.listPublicSince$()` verwendet Firestore-Constraints `published == true`, optional `date >= startTimestamp` und `orderBy('date', 'desc')`; archivierte Shows werden danach clientseitig entfernt.
|
|
- Die Seite nutzt `combineLatest`, `switchMap`, `map` und `shareReplay`-basierte Streams; die Darstellung erfolgt komplett reaktiv über `AsyncPipe`.
|
|
- Filterwerte bleiben über `FilterStoreService` erhalten und werden sowohl in der Sidebar als auch für die Listenberechnung verwendet.
|