# 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, `` 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. `` 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). `` 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-`` 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.