Update release notes and deploy workspace
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 59s
CI - Build & Verify / Deploy to award.noveria.net (push) Failing after 53s

This commit is contained in:
AzuTear
2026-06-29 17:49:54 +02:00
parent c466348d18
commit 441ef2b850
196 changed files with 9279 additions and 39292 deletions
+191
View File
@@ -0,0 +1,191 @@
# Dashboard & Admin-Panel — Analyse + Plan
> Status: **Umgesetzt.** Dieses Dokument beschreibt die Analyse, die umgesetzte
> Dashboard-Readiness-Ausrichtung und die noch bewusst zurückgestellte Phase 2.
> Das Dashboard ist saisonbezogen, bleibt read-only und verlinkt in die Fachseiten.
---
## 0. Wichtigster Befund vorweg: gespaltene Datenquelle
Das Dashboard mischt **zwei verschiedene Saison-Quellen**, und das ist die Wurzel der meisten Probleme:
| Sektion | Datenquelle | Reagiert auf Jahr-Wechsel im Toolbar? |
|---|---|---|
| Metric-Cards (Nominierungen, Stimmen…) | `store.admin.metrics` → Backend `/dashboard`**immer `IsCurrent`-Saison** | ❌ Nein |
| Top-Kategorien, Aktivitäten | `store.admin` (gleiche Quelle) | ❌ Nein |
| Jahreszahlen, Checks, Priority, Toolbar-Stats | `store.adminSeasonDetail`**ausgewählte Saison** | ✅ Ja |
Wenn der Host im Toolbar das Jahr wechselt, ändern sich **die Hälfte der Kacheln nicht**.
„Stimmen gesamt" (Hero) und „Stimmen gesamt" (Jahreszahlen) können unterschiedliche Werte
zeigen. Das muss vereinheitlicht werden, **bevor** irgendetwas Neues draufkommt.
**Umgesetzt:** Die ausgewählte Saison (`adminSeasonDetail`) ist die führende
Dashboard-Quelle. `/api/admin/dashboard` akzeptiert optional `seasonId`; ohne
`seasonId` bleibt das alte `IsCurrent`-Verhalten kompatibel.
---
## 1. Ist-Zustand: bestehende Komponenten
**`AdminDashboardView.vue`** — Orchestrator, lädt alles aus `useAdminDashboardOverview()`
und arrangiert 6 Sektionen in Grids. Sauber, dünn, gut.
**`AdminPageHeader`** — nur Eyebrow „Dashboard" + Icon. Keine Begrüßung, kein Kontext.
**`AdminSeasonToolbar`** — Jahr-Auswahl + Phasen-Pill (nur Text) + 3 Mini-Stats
(Kategorien/Kandidaten/Reviews). Zeigt `isCurrent` als „Öffentlich sichtbar".
**Es fehlen alle Datumsangaben** (Nominierungsstart, Voting-Ende, Show-Termin),
obwohl sie in `adminSeasonDetail` vorliegen.
**`AdminDashboardHeroSection`** — „Live-Lage" als generierter Fließband-Satz + Status-Badge
+ Metric-Cards mit `Quelle: VoteEntries-Tabelle`. Die Quell-Labels sind entwicklersprachlich,
nicht host-tauglich.
**`AdminDashboardPrioritySection`** („Was zuerst?") — 4 Quick-Links (Reviews, Risiko,
Kategorien, Kandidaten) mit Permission-Filter. Gut gebaut. Aber statisch: zeigt immer
dieselben 4, unabhängig von der Phase.
**`AdminDashboardChecksSection`** — 3 Betriebs-Checks (Kategorien ohne Kandidaten,
Review-Backlog, Risk Flags) mit Deep-Links und ok/warn/danger. Stärkste Sektion,
weil handlungsorientiert.
**`AdminDashboardYearTotalsSection`** — 6 reine Zahlen. Überschneidet sich inhaltlich
stark mit den Hero-Metric-Cards (Nominierungen, Stimmen, Kategorien, Reviews, Risiko
tauchen doppelt auf).
**`AdminDashboardTopCategoriesSection`** — Top 5 nach Stimmen mit Balken.
**Während der Nominierungsphase nutzlos** (Stimmen = 0).
**`AdminDashboardActivitySection`** — hart auf 3 Audit-Einträge gedeckelt,
**kein Link zum vollen Audit-Log**.
---
## 2. Personas: was Host vs. Admin wirklich brauchen
**Der Host (Jayuhime)** denkt in der **Timeline der Show**, nicht in Tabellen:
- „Wo stehen wir gerade, und wie lange noch?" (Countdown bis Phasen-Ende / Show)
- „Stimmt die gespeicherte Phase mit dem Zeitplan überein?"
- „Ist die öffentliche Seite bereit? Stream-Link gesetzt, keine Wartung an?"
- „Sind wir bereit, Gewinner zu verkünden?"
- „Was zeigt die Community gerade?" (Beteiligung wächst)
**Der Admin / das Team** denkt **operativ**:
- „Was liegt in meiner Queue?" (Reviews, Risk, Clips)
- „Wo klemmt es?" (leere Kategorien, Backlog-Verteilung)
- „Wer hat zuletzt was geändert?" (Audit)
Das aktuelle Dashboard bedient **fast nur die Admin-Sicht**. Die Host-Sicht
(Timeline, Bereitschaft, Public-Health) fehlt fast komplett.
---
## 3. Verbesserungswürdig (bestehende Komponenten)
1. **Datenquelle vereinheitlichen** (siehe §0) — Metrics/Top-Kategorien/Aktivitäten auf
die gewählte Saison umstellen. Empfehlung: gewählte Saison als einzige Quelle.
2. **Quell-Labels host-freundlich machen** — „Quelle: VoteEntries-Tabelle" → weg damit
oder „Aktualisiert aus dem Live-Voting".
3. **Redundanz Hero ↔ Jahreszahlen auflösen** — eine der beiden Zahlen-Wände streichen;
Hero = Live/Aktion, Jahreszahlen = Summen.
4. **Top-Kategorien phasenabhängig** — in Nominierungsphase „Top nach Nominierungen"
statt nach Stimmen zeigen.
5. **Priority-Liste phasenabhängig priorisieren** — in Show-Vorbereitung „Gewinner setzen"
nach oben, in Nominierung „Reviews" nach oben.
6. **Aktivitäten** — auf 56 erhöhen + „Alles ansehen"-Link zum Audit-Log.
---
## 4. Was fehlt — neue Komponenten (mit Aufbau)
### 4.1 `AdminDashboardTimelineStrip.vue` — Phasen-Timeline mit Countdown
- **Wofür:** Die zentrale Host-Frage „Wo stehen wir, wie lange noch?" auf einen Blick.
- **Was es macht:** Zeigt die 4 Phasen (Nominierung → Voting → Aufbereitung → Show) als
horizontalen Strip mit Datumsspannen; die aktive Phase ist hervorgehoben; ein großer
Countdown zeigt „noch X Tage bis Voting-Ende" bzw. „bis zur Show". Warnt sichtbar,
wenn die gespeicherte Phase vom Zeitplan abweicht (die Logik existiert bereits in
`AdminSeasonPhaseSwitcher` als `autoPhase` — wiederverwenden).
- **Aufbau:** Eigene Computed in `useAdminDashboardOverview` (`timelinePhases`,
`activeCountdown`, `phaseMismatch`) gespeist aus
`adminSeasonDetail.*StartsAt/*EndsAt/showDate`; Datums-/Zustandsmapping aus
`Common/SeasonMappings.cs` (`ResolveTimelineState`) spiegeln. Reine Props-Komponente,
`<Card>` mit 4 Phasen-Segmenten (analog zu `HomeTimelineSection` der Landingpage,
gleiche Farb-Token). Optional Deep-Link zu `/admin/years` für Phasenwechsel.
### 4.2 `AdminDashboardReadinessCard.vue` — Show-Bereitschaft
- **Wofür:** „Sind wir bereit, live zu gehen / Gewinner zu verkünden?"
- **Was es macht:** Checkliste aus `votingWorkspace.summary`: votedSubcategories /
readySubcategories / **winnerSetSubcategories** vs. totalSubcategories, plus
„Show-Datum gesetzt", „Stream-URL gesetzt", „alle Gewinner gesetzt". Ein Fortschrittsring
„12 / 14 Unterkategorien gewinnerbereit".
- **Aufbau:** Computed `readinessItems` (Label, erfüllt-bool, Deep-Link). Quelle:
`adminSeasonDetail.votingWorkspace.summary` (bereits vorhanden, heute ungenutzt im
Dashboard!) + `showDate`/Stream-Banner-Link. `<Card>` mit Fortschrittsbalken + Liste mit
Häkchen/Warnungen. Nur sichtbar/relevant ab Voting-Phase.
### 4.3 `AdminDashboardPublicHealthCard.vue` — Öffentliche Seite
- **Wofür:** Der Host muss sehen, was die Community sieht.
- **Was es macht:** Ampel für: Saison öffentlich (`isCurrent`), Wartungsmodus an/aus,
Stream-Link vorhanden, Pflicht-Content (Impressum/Datenschutz) gepflegt. Plus
„Landingpage ansehen"-Button.
- **Aufbau:** Zieht aus `adminOptionalFeatureSettings` / Operational-Settings (Wartung)
+ `adminSiteSettings` (Content-Lücken). `<Card>` mit Status-Zeilen, Deep-Links nach
`/admin/content` und `/admin/settings/access`. Permission-gated auf `content`/`settings`.
### 4.4 `AdminDashboardQueueCard.vue` — vereinte Team-Queue
- **Wofür:** Admins/Reviewer wollen „meine offenen Aufgaben" inkl. **Clips**, die heute
komplett fehlen.
- **Was es macht:** Zählt Reviews offen, Risk offen, **Clips pending** in einer Karte mit
je Deep-Link und Badge. Ersetzt/erweitert die heutige Priority-Sektion um den Clip-Strang.
- **Aufbau:** Computed `queueItems` aus `pendingNominations.length`, `getRiskMetricValue`,
`clipSubmissions.filter(pending)`; jeweils Permission-gated (Clip nur wenn
`clipAdminMenuVisible`). Listen-`<Card>` wie `AdminDashboardPrioritySection`,
wiederverwendbares Item-Markup.
### 4.5 `AdminDashboardParticipationTrend.vue` (Phase 2) — Beteiligungsverlauf
- **Wofür:** „Wächst die Beteiligung?" — Motivation/Story für den Host.
- **Was es macht:** Mini-Sparkline Nominierungen/Stimmen über die letzten Tage.
- **Aufbau:** **Benötigt neues Backend** (Zeitreihe, heute liefert `/dashboard` nur Totals).
Daher klar als Phase-2 markieren, nicht im ersten Wurf.
---
## 5. Was bewusst NICHT ins Dashboard kommt
- **Tiefen-Analytics / Kategorie-Health-Matrix** → bleibt in `/admin/analytics`
(existiert dort bereits vollständig). Dashboard nur verlinken.
- **Voll-Editierbarkeit** (Phasen umschalten, Texte ändern, Gewinner setzen) → bleibt in
den Fachseiten. Dashboard ist **read + deep-link**, kein Editor. Ausnahme: höchstens
ein „Phase aktivieren"-Shortcut.
- **Volles Audit-Log mit Filtern** → bleibt in `/admin/users-logs`. Dashboard zeigt nur
die letzten 5 + Link.
- **Team-/Rollenverwaltung, Tracking-Rules, DB-Checks** → reine Settings, kein Tagesgeschäft.
- **Echtzeit-Sparkline** im ersten Release (Backend fehlt).
---
## 6. Empfohlene Ziel-Struktur (Reihenfolge = Sichtbarkeit)
```
1. PageHeader + Begrüßung („Hi Jayuhime") + Datum
2. SeasonToolbar (+ Datumsspannen ergänzen)
3. TimelineStrip + Countdown ← NEU, Host-Anker
4. [ Hero/Live-Lage | Queue-Card ] ← Queue NEU (inkl. Clips)
5. ChecksSection (beibehalten)
6. [ ReadinessCard | PublicHealthCard ] ← beide NEU
7. [ YearTotals (entschlackt) | TopCategories (phasen-aware) ]
8. ActivitySection (5 Einträge + Link)
```
**Reihenfolge der Umsetzung:**
1. **Datenquelle vereinheitlichen** (§0) — Fundament, blockiert alles andere.
2. **TimelineStrip + Toolbar-Datumsangaben** — größter Host-Mehrwert, Daten schon da.
3. **Queue-Card (mit Clips) + Readiness-Card** — füllt die echten Lücken, Daten schon da.
4. **PublicHealth-Card** — kleiner, aber wertvoll.
5. **Entschlacken** (Redundanz Hero/Jahreszahlen, phasen-aware Top-Kategorien).
6. **Phase 2:** Beteiligungs-Sparkline (braucht Backend-Zeitreihe).
> **Umgesetzt:** TimelineStrip, Readiness und Queue nutzen bestehende
> `adminSeasonDetail`-Daten. Der Dashboard-Endpoint ist zusätzlich saisonfähig,
> damit Metriken und Top-Kategorien beim Jahrwechsel konsistent bleiben.