Files
AzuTear 441ef2b850
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 59s
CI - Build & Verify / Deploy to award.noveria.net (push) Failing after 53s
Update release notes and deploy workspace
2026-06-29 17:49:54 +02:00

192 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.