4.0 KiB
Lieddetails
Route
/songs/:songId
Die Detailseite ist ein Child-Pfad des Songs-Moduls. Der übergeordnete /songs-Eintrag im App-Router verlangt Authentifizierung und die Rolle user. Die Detailroute selbst definiert keinen zusätzlichen canActivate-Guard.
Zweck
Die Detailseite ist die primäre Leseseite für einen einzelnen Song. Sie zeigt Stammdaten, Liedtext, Akkorddarstellung, Kommentare, Attribute, Anhänge und nutzerbezogene Verwendungsinformationen. Außerdem bietet sie rollenabhängige Aktionen zum Bearbeiten, Löschen und zum Hinzufügen des Songs zu einer eigenen unveröffentlichten Veranstaltung.
Datenquellen
SongService.read$(songId)liest den Song aus der Collectionsongs.FileDataService.read$(songId)liest die Subcollectionsongs/{songId}/files.UserService.user$liefert den angemeldeten Benutzer, dessen bevorzugterchordModefür die Liedtextanzeige genutzt wird.UserService.user$liefert außerdemsongUsage, aus dem die nutzerbezogene Verwendungsanzahl des Songs bestimmt wird.ShowService.list$()liefert Shows, um eigene Shows des Benutzers zu finden und unveröffentlichte Veranstaltungen für die AktionZu Veranstaltung hinzufügenanzubieten.ShowSongService.new$()erstellt beim Hinzufügen zu einer Show den Show-Song-Eintrag.
Wichtige UI-Elemente
Die Seite verwendet app-page-frame ohne Menü. Im Content-Bereich liegt eine Detail-Card mit der Überschrift aus Liednummer und Titel sowie einem Zurück-Link zur Liste.
Für berechtigte Rollen werden Stammdaten angezeigt:
- Typ
- Tonart
- Tempo
- Status
- Rechteinhaber und Rechteinhaber-ID
- CCLI-Link, wenn
legalOwner === 'CCLI'und einelegalOwnerIdvorhanden ist - Künstler
- Verlag
- Quelle
- Verwendungsanzahl mit Tooltip
Der Liedtext wird über app-song-text gerendert. Die Komponente erhält den Songtext, den Chord-Modus des Benutzers und validateChordNotation=true. Wenn showSwitch aktiv ist, kann die Akkordanzeige zwischen Ausblenden, nur erste Strophe und Anzeigen wechseln.
Attribute aus song.flags werden als Chips dargestellt. Der Kommentar wird als eigener Textblock angezeigt. Anhänge erscheinen in einer separaten Card Anhänge; jeder Anhang löst seine Firebase-Storage-Download-URL auf und wird als externer Link geöffnet.
Aktionen
Bearbeiten: navigiert nach/songs/:songId/edit.Löschen: löscht den Song überSongService.delete(songId)und navigiert anschließend zurück nach/songs.Zu Veranstaltung hinzufügen: erstellt einen Show-Song-Eintrag, hängt dessen ID an die Reihenfolge (order) der gewählten Show an und navigiert zur Show unter/shows/:showId.- Akkordschalter im Songtext: wechselt den lokalen Chord-Modus der Anzeige.
Berechtigungen
Der Seitenzugriff erfordert über die Parent-Route die Rolle user. Innerhalb der Seite gelten zusätzliche Rollen:
leaderundcontributor: sehen Metadaten, Attribute, Kommentar und Verwendungsinformationen.contributor: sieht die AktionBearbeiten.leader: siehtZu Veranstaltung hinzufügen, sofern unveröffentlichte Shows vorhanden sind.admin: sieht die AktionLöschen.
Relevante technische Hinweise
Die Song-ID wird aus den Routenparametern gelesen und in mehreren Observables verwendet. song$, files$, songCount$, songUsageShows$ und songUsageTooltip$ reagieren dadurch auf Parameteränderungen.
Die Verwendungsanzeige kombiniert zwei Quellen: den Zähler user.songUsage[song.id] und eine aus Shows berechnete Liste eigener Shows, deren songIds den Song enthalten. Der Tooltip zeigt entweder einen Leerzustand, einen Hinweis auf noch nicht indexierte Show-Zuordnungen oder eine datierte Liste der gefundenen Shows.
Anhänge sind Metadaten in Firestore und Binärdaten in Firebase Storage. Die Detailseite kann Anhänge nur öffnen; Upload und Löschen werden auf der Bearbeitungsseite erledigt.
Das Löschen fragt im aktuellen Komponentenstand keine Bestätigung ab. Dokumentations- und UI-Texte sollten deshalb deutlich machen, dass die Aktion direkt über den Service ausgeführt wird.