Files
wgenerator/docs/pages/show-new.md
T
2026-05-15 11:03:02 +02:00

60 lines
2.4 KiB
Markdown

# Seite: Veranstaltung anlegen
## Route
`/shows/new`
Die Route ist im Shows-Routing mit `RoleGuard` geschuetzt und verlangt die Rolle `leader`.
## Zweck
Die Seite erstellt den Kopf einer neuen Veranstaltung. Nach der Anlage wird direkt zur Detailseite navigiert, wo Lieder hinzugefügt und der weitere Ablauf gepflegt werden.
## Datenquellen
- `ShowService.SHOW_TYPE_PUBLIC` und `ShowService.SHOW_TYPE_PRIVATE` liefern die auswählbaren Veranstaltungstypen.
- `ShowService.new$(data)` erstellt das Show-Dokument.
- `UserService.user$` wird innerhalb von `ShowService.new$()` verwendet, um den Besitzer zu setzen.
- `ShowDataService.add()` schreibt die neue Show in die Firestore-Collection `shows`.
`NewComponent` haelt außerdem `ShowDataService.list$` als `shows$`, nutzt diesen Stream in der aktuellen Vorlage aber nicht sichtbar.
## Wichtige UI-Elemente
- `app-page-frame` mit Titel `Veranstaltungen`.
- Karte `Neue Veranstaltung` mit Rücksprung nach `/shows`.
- Formularfeld `Art der Veranstaltung` als gruppierte Auswahl.
- Formularfeld `Datum` mit Material-Datepicker.
- Button `Anlegen`.
## Aktionen
- Formular ausfuellen: Typ und Datum sind Pflichtfelder.
- Anlegen: markiert alle Felder als berührt, prüft die Formularvaliditaet und ruft `ShowService.new$()` auf.
- Nach erfolgreicher Anlage: Navigation zu `/shows/{id}`.
## Statuslogik
Beim Initialisieren wird das Formular zurückgesetzt. Das Speichern bricht ab, wenn Pflichtfelder fehlen oder kein Benutzer ermittelt werden kann.
`ShowService.new$()` ergänzt die eingegebenen Daten um:
- `owner`: ID des aktuellen Benutzers
- `order: []`
- `songIds: []`
- `public`: abgeleitet daraus, ob `showType` in `SHOW_TYPE_PUBLIC` enthalten ist
Veröffentlichungs-, Melde- und Archivstatus werden auf dieser Seite nicht direkt gesetzt.
## Berechtigungen
- Zugriff auf die Route erfordert `leader`.
- Die Seite selbst enthält keine zusätzliche Owner-Prüfung, da die Show erst beim Speichern für den aktuellen Benutzer erzeugt wird.
## Technische Hinweise
- Das Formular ist ein typisiertes Reactive Form mit `FormControl<Date | null>` und `FormControl<string | null>`.
- Die Auswahl trennt öffentliche und private Veranstaltungstypen in `mat-optgroup`.
- Die Anzeige der Typen erfolgt über `ShowTypePipe`.
- `ShowService.new$()` gibt `null` zurück, wenn kein `showType` oder kein Benutzer vorhanden ist; die Navigation nutzt dann defensiv einen leeren String.