Files
2026-05-15 11:03:02 +02:00

4.1 KiB

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.