Files
vtuber-awards/docs/dashboard-plan.md
T
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

9.9 KiB
Raw Blame History

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 /dashboardimmer IsCurrent-Saison Nein
Top-Kategorien, Aktivitäten store.admin (gleiche Quelle) Nein
Jahreszahlen, Checks, Priority, Toolbar-Stats store.adminSeasonDetailausgewä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.