9.9 KiB
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)
- Datenquelle vereinheitlichen (siehe §0) — Metrics/Top-Kategorien/Aktivitäten auf die gewählte Saison umstellen. Empfehlung: gewählte Saison als einzige Quelle.
- Quell-Labels host-freundlich machen — „Quelle: VoteEntries-Tabelle" → weg damit oder „Aktualisiert aus dem Live-Voting".
- Redundanz Hero ↔ Jahreszahlen auflösen — eine der beiden Zahlen-Wände streichen; Hero = Live/Aktion, Jahreszahlen = Summen.
- Top-Kategorien phasenabhängig — in Nominierungsphase „Top nach Nominierungen" statt nach Stimmen zeigen.
- Priority-Liste phasenabhängig priorisieren — in Show-Vorbereitung „Gewinner setzen" nach oben, in Nominierung „Reviews" nach oben.
- 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
AdminSeasonPhaseSwitcheralsautoPhase— wiederverwenden). - Aufbau: Eigene Computed in
useAdminDashboardOverview(timelinePhases,activeCountdown,phaseMismatch) gespeist ausadminSeasonDetail.*StartsAt/*EndsAt/showDate; Datums-/Zustandsmapping ausCommon/SeasonMappings.cs(ResolveTimelineState) spiegeln. Reine Props-Komponente,<Card>mit 4 Phasen-Segmenten (analog zuHomeTimelineSectionder Landingpage, gleiche Farb-Token). Optional Deep-Link zu/admin/yearsfü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/contentund/admin/settings/access. Permission-gated aufcontent/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
queueItemsauspendingNominations.length,getRiskMetricValue,clipSubmissions.filter(pending); jeweils Permission-gated (Clip nur wennclipAdminMenuVisible). Listen-<Card>wieAdminDashboardPrioritySection, 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
/dashboardnur 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:
- Datenquelle vereinheitlichen (§0) — Fundament, blockiert alles andere.
- TimelineStrip + Toolbar-Datumsangaben — größter Host-Mehrwert, Daten schon da.
- Queue-Card (mit Clips) + Readiness-Card — füllt die echten Lücken, Daten schon da.
- PublicHealth-Card — kleiner, aber wertvoll.
- Entschlacken (Redundanz Hero/Jahreszahlen, phasen-aware Top-Kategorien).
- 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.