.. _changelog: Änderungsprotokoll ================== 0.5.34 (2026-10-04) ------------------- Added ~~~~~ * **Proben-Statistiken**: Im Bereich **Proben** gibt es jetzt einen eigenen Tab **Statistiken** mit Kennzahlen zu Gesamtzahl, Songs, Dauer und jährlichem Durchschnitt. * **Trend-Visualisierung**: Die Rehearsal-Statistiken zeigen jetzt Monats-/Jahres-Trends für die Anzahl der Proben und die durchschnittliche Songs-pro-Probe-Rate mit direkter Vergleichsangabe zum vorherigen Zeitraum. * **Top-Songs-Paginierung**: Die Häufigkeitsliste der häufigsten Songs wird bei vielen Einträgen nun sauber paginiert und kann durchsteuert werden. Changed ~~~~~~~ * **Proben-Statistiken UX**: Die Diagramme lassen sich zwischen Monats- und Jahresansicht umschalten, sodass die Entwicklung kompakt und vergleichbar dargestellt wird. * **Statistik-Layout**: Die beiden Diagramme sind als übereinander gestapelte Subplots angeordnet und bleiben damit auch auf kleineren Displays gut lesbar. Fixed ~~~~~ * **Top-Songs-Steuerung sichtbar gemacht**: Die Seitenschaltflächen für die Top-Songs-Liste waren im UI nicht klar erkennbar; sie wurden damit nun als explizite Steuerung ergänzt. * Chore: Projektversion auf ``0.5.34`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``, ``frontend/package-lock.json`` und ``README.md`` Badge). * Manual: Benutzerhandbuch **Proben** und Changelog für Release ``0.5.34`` ergänzt. 0.5.33 (2026-08-21) ------------------- Added ~~~~~ * **Repertoire-Listen (gig-unabhängig)**: Im Bereich **Songs** gibt es einen zusätzlichen Tab **Repertoire-Listen**. Dort können eigene Listen aus dem Repertoire angelegt, geöffnet und gelöscht werden. * **Eigentümer- und Sichtbarkeitsmodell**: Jede Repertoire-Liste ist einem Benutzer zugeordnet. Beim Anlegen kann der User festlegen, ob die Liste **öffentlich** oder **privat** ist. Öffentliche Listen sind für alle sichtbar und bearbeitbar, private Listen nur für den Eigentümer bzw. Admins. * **Nachträgliche Metadatenpflege**: Name und Sichtbarkeit einer Repertoire- Liste können nach dem Anlegen jederzeit angepasst werden. * **Setlist-Editor für Repertoire-Listen**: Der bestehende Setlist-Editor kann nun neben Gig-Setlisten auch Repertoire-Listen direkt bearbeiten. * **Repertoire-Listen Export**: Für Repertoire-Listen stehen jetzt Exporte als **PDF** und **CSV** zur Verfügung. * **Songtabelle CSV-Export (aktueller Stand)**: Der CSV-Export der Songtabelle übernimmt den aktuell sichtbaren Zustand inklusive Filter, Sortierung und sichtbarer Spalten. Changed ~~~~~~~ * **Repertoire-Listen-UX**: Beim Anlegen und Bearbeiten wurde die Freigabe- und Namenslogik ergänzt, damit der Benutzer die Visibilität und den Namen seiner Liste auch im Nachhinein gezielt steuern kann. * **Repertoire-PDF im Setlisten-Template**: Der PDF-Export für Repertoire- Listen nutzt jetzt dasselbe Template wie reguläre Setlisten. * **Repertoire-PDF ohne Timing**: Repertoire-Listen werden im PDF bewusst ohne Timing-/Startzeitberechnung ausgegeben. * **PDF-Metadaten verbessert**: Setlisten-PDFs setzen jetzt einen sauberen Dokumenttitel (Title), sodass Browser/Viewer nicht mehr „Unbekannt“ anzeigen. Fixed ~~~~~ * **Songs-Frontend**: Ein Laufzeitfehler ``ReferenceError: createRepertoireList is not defined`` wurde behoben. * Chore: Projektversion auf ``0.5.33`` erhöht (``version.json``, ``pyproject.toml``, ``uv.lock``, ``frontend/package.json``, ``frontend/package-lock.json`` und ``README.md`` Badge). * Manual: Benutzerhandbuch (**Songs**, **Setlist-Editor**) und Changelog für Release ``0.5.33`` ergänzt. 0.5.32 (2026-08-14) ------------------- Added ~~~~~ * **Proben-Historie – API für vergangene Proben**: Neuer Endpoint ``GET /reh/past`` mit ``q``, ``skip`` und ``limit``. Die Antwort enthält ``items``, ``total`` und ``has_more`` für paginierte Historienansichten. Changed ~~~~~~~ * **Vergangene Proben vollständig durchsuchbar**: Die Suche im Tab **Vergangene Proben** läuft jetzt serverseitig und durchsucht die komplette Historie (u. a. Probenkommentar, Songtitel, Interpret sowie Proben-/Todo- Kommentare) statt nur lokal geladener Einträge. * **Pagination für Protokoll-Historie**: Im Proben-Frontend werden vergangene Proben seitenweise geladen (Button **Mehr laden**), damit auch große Historien performant bedienbar bleiben. * **Proben-Stammdaten editierbar für Bearbeiter/Admins**: In der Proben-Detailansicht können Nutzer mit Rolle **editor** oder **admin** nun **Beginn** und **Ende** einer Probe direkt im Bereich **Stammdaten** bearbeiten. * **Demo-Daten für Historientests erweitert**: ``init_demo_db.py`` erzeugt nun 24 Proben (davon >20 vergangen) mit zusätzlichen Protokoll- und Todo-Daten, sodass Suche und Pagination realistisch getestet werden können. Fixed ~~~~~ * Chore: Projektversion auf ``0.5.32`` erhöht (``version.json``, ``pyproject.toml``, ``uv.lock``, ``frontend/package.json`` und ``README.md`` Badge). * Manual: Benutzerhandbuch **Proben** und Changelog für Release ``0.5.32`` ergänzt. 0.5.31 (2026-08-07) ------------------- Added ~~~~~ * **Neuer Gig - Stammdatenvorlage**: Im ``NewGigForm`` kann jetzt ein bestehender Gig als Vorlage gewählt werden. Per Dropdown + Button **"Übernehmen"** werden Stammdaten in das Formular kopiert; ``Name`` und ``Datum`` bleiben dabei bewusst unberührt. Changed ~~~~~~~ * **Vorlagenauswahl erweitert**: Die Vorlagenliste im ``NewGigForm`` ist nicht mehr auf vergangene Gigs beschränkt, sondern zeigt alle Gigs. * **New-Gig-Modal UX**: Das Modal besitzt nun ein ``✕`` oben rechts im Header für ein schnelles Schließen. * **Vorlagenbereich einklappbar**: Die Übernahme von Stammdaten ist in einen aufklappbaren Bereich ausgelagert, um das Formular kompakter zu halten. Fixed ~~~~~ * **Checklisten-Detail im Gig-Details-Modal**: Beim Bearbeiten eines Checklisten-Items führt der Header-Button jetzt korrekt als ``←`` zurück in die Checklisten-Übersicht statt das komplette Modal zu schließen. * **Verschachtelte Modals**: ``modalState`` unterstützt nun einen Stack, sodass Unter-Modals sauber zum übergeordneten Modal zurückkehren. * Chore: Projektversion auf ``0.5.31`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``, ``frontend/package-lock.json``, ``README.md`` Badge). * Manual: Changelog für Release ``0.5.31`` ergänzt. 0.5.30 (2026-07-31) ------------------- Added ~~~~~ * **Setlisten-Export (alle Gigs) als JSON**: Neue Export-Funktion über ``GET /gigs/export/setlists``. Im Frontend kann die vollständige Setlisten- Historie nun als Datei heruntergeladen werden (Dateiname aus ``Content-Disposition`` mit Fallback). * **Live-Mode – Sets verschieben**: Neuer Endpoint ``POST /gigs_lm/{gig_id}/move-set`` inkl. Frontend-Integration, um Sets im laufenden Live-Mode gezielt nach oben/unten zu verschieben. * **Touch-Unterstützung für Setlist-Drag&Drop**: ``SetList`` und ``SongList`` unterstützen Touch-Geräte jetzt robuster (u. a. Handle-basiertes Dragging), damit die Reihenfolge auch mobil zuverlässig angepasst werden kann. Changed ~~~~~~~ * **Sängerfarben bereits vor Setlist-Befüllung verfügbar**: ``GET /gigs/{gig_id}/singer_colors`` liefert die Farbzuordnung jetzt auf Basis des gesamten Song-Repertoires statt nur der aktuell befüllten Gig-Setliste. Dadurch sind Farben im Setlist-Editor sofort konsistent verfügbar. * **Session-Limit erhöht**: ``MAX_ACTIVE_SESSIONS`` wurde von 5 auf **10** angehoben. * **Set-Import aus vergangenen Gigs verbessert**: Filterlogik und Beschriftungen im Setlist-Editor wurden für den Import aus vergangenen Gigs präzisiert. * **README-Kontaktdaten aktualisiert**. Fixed ~~~~~ * **New Song Modal (Svelte 5 Bindings)**: Beim Öffnen von ``NewSongModal`` konnte ein ``props_invalid_value`` auftreten, wenn ``multi_select``-Felder initial ``undefined`` waren. Die Initialisierung erfolgt nun bereits vor dem ersten Render als Array, sodass ``bind:selected`` stabil funktioniert. * Chore: Projektversion auf ``0.5.30`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``, ``README.md`` Badge). * Manual: Changelog für Release ``0.5.30`` ergänzt. 0.5.29 (2026-07-17) ------------------- Fixed ~~~~~ * **Gespielte Songs – Übersprungene Songs werden abgezogen**: Die Statistik- Kachel „Gespielte Songs" im Dashboard und im Saison-Statistik-Modal zeigte bisher alle Song-Einträge in Setlisten – unabhängig davon, ob ein Song tatsächlich gespielt oder übersprungen wurde. Ab sofort wird ``played_songs = total_songs − skipped_count`` berechnet und angezeigt. Das Feld ``played_songs`` wurde dem Schema ``SeasonStatistics`` hinzugefügt; ``total_songs`` (Gesamtzahl inkl. übersprungener Songs) bleibt weiterhin intern vorhanden. Changed ~~~~~~~ * **Setlist-Editor – Sänger-Farbgebung überarbeitet**: Die farbigen Hintergrundgradienten der Song-Kacheln im Setlist-Editor und in der Song-Liste wurden durch eine subtilere Variante ersetzt. Die Sängerfarbe wird nun ausschließlich als Textfarbe des Songtitels angezeigt; die Kacheln selbst bleiben einfarbig im Surface-Ton der jeweiligen Theme- Variante. Dadurch ist der Editor bei dunklem Theme besser lesbar und wirkt insgesamt ruhiger. * **Setlist-Editor – Sänger-Farben werden dynamisch vom Backend geladen**: Statt die Farben ausschließlich clientseitig zu berechnen, lädt der Setlist-Editor die Sänger-Farb-Zuordnung jetzt über den Endpoint ``GET /gigs/{gig_id}/singer_colors``. Die Farben werden bei jeder Änderung der Setlist-Version (``setlist_version``-Reaktivität) automatisch neu abgerufen, sodass externe Änderungen (z. B. durch andere Tabs oder Nutzer) sofort berücksichtigt werden. Removed ~~~~~~~ * **Playlist- und Streaming-Funktionalität entfernt**: Die kurzzeitig implementierte Playlist-Verwaltung (inkl. Streaming-Zugangsdaten- Administration) wurde vollständig aus dem Projekt entfernt. Betroffen sind der Backend-Router ``playlist.py``, der ``playlist_service.py``, die zugehörigen Datenbankmodelle und Alembic-Migrationen sowie die Frontend-Seiten ``/playlist`` und ``/admin/streaming``. * Chore: Projektversion auf ``0.5.29`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``). * Manual: Changelog für Release ``0.5.29`` ergänzt. 0.5.28 (2026-07-16) ------------------- Added ~~~~~ * **Session-Limit pro Benutzer**: Jeder Benutzer darf maximal **5 gleichzeitig aktive Sessions** haben. Beim Login oder Token-Refresh wird geprüft, ob bereits 5 nicht-widerrufene, nicht abgelaufene Refresh-Tokens existieren. Ist die Grenze erreicht, wird die **älteste aktive Session automatisch widerrufen**, bevor die neue angelegt wird. Die Konstante ``MAX_ACTIVE_SESSIONS = 5`` in ``auth.py`` steuert den Schwellwert zentral. * **Cross-Tab-Koordination für Token-Refresh (Frontend)**: Mehrere Browser- Tabs derselben App koordinieren sich nun über ``BroadcastChannel`` und ``localStorage``, damit nur ein Tab gleichzeitig einen ``/refresh``-Request stellt. Bisher konnten zwei Tabs denselben Refresh-Token gleichzeitig verwenden, was die Replay-Detection triggerte und alle Sessions sperrte. * ``BroadcastChannel('libre_stage_auth')`` informiert andere Tabs nach erfolgreichem Refresh (``token_refreshed``) und nach Logout (``auth_logout``). * ``localStorage['libre_stage_last_token_refresh']`` speichert den Zeitstempel des letzten Refreshes. Innerhalb von 8 Sekunden starten andere Tabs keinen eigenen Refresh-Request (``anotherTabRefreshedRecently()``). * **iCal-Token: Ablaufdatum** (``exp``-Claim): iCal-Tokens haben nun eine Laufzeit von **365 Tagen** (``ICAL_TOKEN_EXPIRE_DAYS = 365``). Ablauf wird standardmäßig durch die JWT-Library beim Decode geprüft – kein manueller Timestamp-Vergleich mehr. Changed ~~~~~~~ * **Refresh-Token-Laufzeit verlängert**: ``REFRESH_TOKEN_EXPIRE_DAYS`` von 30 auf **90 Tage** erhöht. Benutzer müssen sich damit nur noch ca. alle 3 Monate neu einloggen, sofern sie die App regelmäßig nutzen. * **Password-Reset-Token: Standard-``exp``-Claim**: ``create_password_reset_token`` setzt nun einen echten JWT-``exp``-Claim statt des bisherigen manuellen ``ts``-Timestamps. ``verify_password_reset_token`` entfernt die redundante Ablaufprüfung – die JWT-Library wirft automatisch eine ``ExpiredSignatureError`` bei abgelaufenen Tokens. * **Legacy-SHA1-Passwort-Hash-Unterstützung entfernt**: Die ``LEGACY_HASH_DEADLINE`` (2026-04-30) ist abgelaufen. Der gesamte SHA-1- Pfad in ``verify_password`` sowie der Auto-Upgrade-Code in ``authenticate_user`` wurden entfernt. ``verify_password`` prüft ausschließlich bcrypt-Hashes (``$2b$``, ``$2a$``, ``$2y$``). Der nicht mehr benötigte ``import base64`` wurde ebenfalls entfernt. * **iCal-Token-Verifikation bereinigt**: ``verify_ical_token`` nutzt nun den Standard-``exp``-Claim statt manuellem ``ts``-Check. Ein Format-String-Bug (``"iCal token verified!".format(...)`` ohne Platzhalter) wurde behoben (``logger.info("...", user.user_name)``). Fixed ~~~~~ * **Parallele Sessions**: Ein neuer Login von einem Gerät/Tab entzieht anderen aktiven Sessions nicht mehr die Authentifizierung. Jede Session hält einen eigenen Refresh-Token; die Cross-Tab-Koordination verhindert race-condition- bedingte Logout-Kaskaden. * Chore: Projektversion auf ``0.5.28`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``). * Manual: Changelog für Release ``0.5.28`` ergänzt. 0.5.27 (2026-07-09) ------------------- Added ~~~~~ * **Kanban-Ansicht für die Gig-Checkliste**: Die Checkliste im Tab **✅ Checkliste** des Gig-Detaildialogs bietet nun wahlweise eine **Kanban-Board-Ansicht** neben der bestehenden Listenansicht. Ein Toggle-Schalter (☰ Liste / ⬛ Kanban) im Header wechselt zwischen beiden Modi. Das Board zeigt zwei Spalten – **Offen** (gelb) und **Erledigt** (grün) – mit kompakten Karten pro Aufgabe (Titel, Kategorie- Badge, Fälligkeit, Zuständiger, Kommentar). Editors können Aufgaben direkt per Schaltfläche zwischen den Spalten verschieben. * **Vergangenheitssperre – Gig-Checkliste (Frontend)**: Für vergangene Gigs wird der **+ Eintrag**-Button ausgeblendet und durch einen 🔒-Hinweis ersetzt. Das Formular lässt sich auch programmatisch nicht mehr öffnen. * **Vergangenheitssperre – Gig-Checkliste (Backend)**: Der Endpoint ``POST /gigs/{gig_id}/checklist`` lehnt neue Einträge für vergangene Gigs mit **HTTP 403** ab (*„Für vergangene Gigs können keine neuen Checklisten-Einträge angelegt werden."*). * **Vergangenheitssperre – Verfügbarkeit (Frontend)**: Das ``AvailabilityWidget`` erhält einen neuen Prop ``readonly``. Bei vergangenen Gigs werden die Statusbuttons (Dabei / Vielleicht / Nicht dabei) sowie das Aushilfe-Formular und das Kommentarfeld ausgeblendet; stattdessen erscheint der Hinweis *„🔒 Vergangenes Event – keine Rückmeldung mehr möglich."* Die bereits abgegebene eigene Rückmeldung bleibt als Badge sichtbar; die Gesamtübersicht aller Rückmeldungen ist weiterhin lesbar. Der ``GigDetailsModal`` berechnet ``gigIsPast`` und übergibt es als ``readonly`` an das Widget. * **Vergangenheitssperre – Verfügbarkeit (Backend)**: Die Endpoints ``PUT /availability/gig/{id}`` und ``DELETE /availability/gig/{id}`` lehnen Schreibzugriffe auf vergangene Gigs mit **HTTP 403** ab. Proben (``event_type=rehearsal``) sind nicht betroffen. Lesezugriffe (``GET``) bleiben für alle Events uneingeschränkt. * **Tests – Verfügbarkeit (vergangene Gigs)**: Fünf neue Tests in ``test_availability.py`` decken die Vergangenheitssperre ab: PUT → 403, DELETE → 403, Fehlermeldung enthält „vergangen", Proben nicht betroffen, GET weiterhin lesbar. * **Tests – Gig-Checkliste** (neue Datei ``test_gig_checklist.py``): 12 Tests für GET (leer, 404, Lesezugriff auf vergangene Gigs) und POST (Erfolgsfall, vollständige Rückgabe, 404, fehlende Berechtigung, vergangener Gig → 403 mit Fehlermeldung, kein DB-Eintrag nach Ablehnung). Changed ~~~~~~~ * **+ Eintrag-Button**: Verwendet nun ``variant-filled-primary`` (ohne ``border``) – konsistent mit anderen Hinzufügen-Buttons (z. B. im Ablaufplan). * Chore: Projektversion auf ``0.5.27`` erhöht (``version.json``, ``pyproject.toml``, ``frontend/package.json``). * Manual: Changelog für Release ``0.5.27`` ergänzt. 0.5.26 (2026-07-07) ------------------- Added ~~~~~ * **Kommentarfeld in der Gig-Checkliste**: Jede Aufgabe erhält ein optionales Feld **Kommentar / Ergebnis**, um das Ergebnis oder Rückstände zu protokollieren. Vorhandene Kommentare werden in der Listenansicht mit 💬-Symbol angezeigt. * Datenbank: neue Spalte ``comment TEXT`` in ``gig_checklist_items`` via Alembic-Migration ``c3d4e5f6a1b2_add_comment_to_checklist_items``. * Schema: ``GigChecklistItemIn`` / ``GigChecklistItemOut`` um ``comment`` ergänzt. * **Checklisten-Detailmodal**: Klick auf eine Aufgabe in der Checkliste öffnet ein Modal mit allen Details (Titel, Status, Gig, Kategorie, Zuständiger, Fälligkeit, Kommentar). Admins und Editors können darin die Aufgabe direkt erledigen oder über ein Inline-Formular bearbeiten. Das Modal ist sowohl in der Gig-Checkliste als auch im Dashboard erreichbar. * **Dashboard – Tab „✅ Checkliste"**: Zeigt offene Gig-Checklisten-Aufgaben, die dem eingeloggten Mitglied zugewiesen sind. Klick auf einen Eintrag öffnet das Detailmodal; Admins/Editors können Aufgaben direkt als erledigt markieren. * **Dashboard – Tab „👥 Gig-Rückmeldungen"**: Zeigt bevorstehende Gigs, für die noch keine Verfügbarkeitsrückmeldung abgegeben wurde. Link führt zur Gig-Übersicht. * **Dashboard – Todos aus ``GET /user_todos``**: Der bestehende Backend-Endpunkt liefert nun zwei zusätzliche Felder: * ``gig_checklist_todos`` – offene, dem User zugewiesene Checklisten-Aufgaben * ``pending_gigs`` – Gigs ohne Verfügbarkeitseintrag des Users Beide Felder werden in einem einzigen API-Call mitgeliefert; kein separater Request mehr nötig. * Zusätzlicher Backend-Endpunkt ``GET /availability/pending_gigs`` bleibt weiterhin verfügbar (für externe Nutzung). Changed ~~~~~~~ * Dashboard-Hilfetext aktualisiert: beschreibt jetzt alle sechs Todo-Tabs. * :ref:`checkliste`: Neue Abschnitte *Kommentarfeld*, *Aufgaben-Detailansicht* und *Dashboard-Integration*. * :ref:`dashboard`: vollständig überarbeitet; beschreibt alle sechs Tabs, Nächste Termine, Saison-Statistiken und Kalender-Abo. * Chore: Projektversion auf ``0.5.26`` erhöht. 0.5.25 (2026-07-07) ------------------- Added ~~~~~ * **Gig-Checkliste**: Jeder Gig erhält einen neuen Tab **✅ Checkliste** (Tab 6) mit einer strukturierten Aufgabenliste für die Gig-Vorbereitung. Aufgaben besitzen Titel, Kategorie, optional einen Verantwortlichen (Mitglied oder Freitext) sowie ein optionales Fälligkeitsdatum. Admins und Editors können Aufgaben anlegen, bearbeiten, löschen und als erledigt markieren; normale Mitglieder sehen die Liste in Lese-Ansicht. * Gig-Details / Tab **Übersicht**: Neue Karte **✅ Checkliste** zeigt sofort einen Fortschrittsbalken (erledigte / offene Punkte) sowie bis zu vier offene Aufgaben als Schnellvorschau. Der Link **Details →** wechselt direkt in den Checklisten-Tab. * Backend: Neuer Router ``/gigs/{gig_id}/checklist`` mit Endpunkten ``GET``, ``POST``, ``PUT /{item_id}``, ``PATCH /{item_id}/done``, ``DELETE /{item_id}``. Das Abhaken (``PATCH done``) setzt ``check_editor`` voraus. * Datenbank: Neue Tabelle ``gig_checklist_items`` über Alembic-Migration ``f1a2b3c4d5e6_add_gig_checklist_items``; ``upgrade``/``downgrade`` vollständig implementiert. * Frontend-API: Neue Hilfsfunktionen ``getGigChecklist``, ``createChecklistItem``, ``updateChecklistItem``, ``toggleChecklistItemDone``, ``deleteChecklistItem`` in ``api.js``. * Manual: Neues Kapitel :ref:`checkliste` im Benutzerhandbuch; Querverweise in :ref:`gigs` ergänzt. * **Setlisten-Sperre**: Setliste und Ablaufplan eines Gigs sind nach mehr als sieben Tagen seit dem Gig-Datum für Editors gesperrt. Admins können weiterhin Änderungen vornehmen. * Backend: Hilfsfunktion ``_is_setlist_locked`` prüft das Gig-Datum; alle schreibenden Endpunkte (``PUT /update_setlist/``, ``POST/PUT/DELETE /schedule/``) geben bei überschrittener Frist und fehlendem Admin-Recht ``403 SETLIST_LOCKED`` zurück. * Frontend: Berechneter Zustand ``setlistLocked`` und ``canEditSetlist``; Button **Setliste bearbeiten** wird deaktiviert (🔒-Präfix, Tooltip). Im Ablaufplan-Tab erhalten Admins einen gelben Hinweis. * **Mobiles Tab-Layout**: Im Gig-Detail-Dialog werden die sieben Tabs auf kleinen Bildschirmen (< ``sm``) durch ein natives ``