Update release notes and deploy workspace
This commit is contained in:
@@ -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 5–6 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.
|
||||
Reference in New Issue
Block a user