feat(dashboard): Dashboard-Start für Verantwortliche, Kachel-Anpassung, Status-Monitor
CI / backend-tests (push) Failing after 2m5s
CI / frontend-build (push) Successful in 19s

Dashboard immer Startseite für Verantwortliche (Mitarbeiter -> Objekte), kaputte Startseiten-Auswahl entfernt. Neu gemeldete Mängel als eigener Hinweis. Kacheln per Anpassen-Modus verschieb-/ausblendbar (localStorage), Status-Monitor-Modus mit Vollbild und Auto-Refresh (60s). DashboardPage dabei in kleine Dateien pro Kachel gesplittet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
2026-09-07 12:02:47 +02:00
co-authored by Claude Sonnet 5
parent 9b2701e220
commit 5fc8079df6
21 changed files with 3020 additions and 415 deletions
+55
View File
@@ -0,0 +1,55 @@
export type DashboardTileId =
| "aufgaben"
| "einsatzbereitschaft"
| "prueftermine"
| "ablaufdaten"
| "kennzahlen"
| "maengel"
| "qualifikation"
| "aktivitaet";
export const STANDARD_REIHENFOLGE: DashboardTileId[] = [
"aufgaben",
"einsatzbereitschaft",
"prueftermine",
"ablaufdaten",
"kennzahlen",
"maengel",
"qualifikation",
"aktivitaet",
];
export interface DashboardLayout {
reihenfolge: DashboardTileId[];
ausgeblendet: DashboardTileId[];
}
const SPEICHER_KEY = "mabea-dashboard-layout";
function istGueltigeId(wert: unknown): wert is DashboardTileId {
return typeof wert === "string" && (STANDARD_REIHENFOLGE as string[]).includes(wert);
}
export function layoutLaden(): DashboardLayout {
try {
const roh = localStorage.getItem(SPEICHER_KEY);
if (!roh) return { reihenfolge: STANDARD_REIHENFOLGE, ausgeblendet: [] };
const geparst = JSON.parse(roh);
const gespeicherteReihenfolge = Array.isArray(geparst.reihenfolge)
? geparst.reihenfolge.filter(istGueltigeId)
: [];
const fehlende = STANDARD_REIHENFOLGE.filter((id) => !gespeicherteReihenfolge.includes(id));
const ausgeblendet = Array.isArray(geparst.ausgeblendet) ? geparst.ausgeblendet.filter(istGueltigeId) : [];
return { reihenfolge: [...gespeicherteReihenfolge, ...fehlende], ausgeblendet };
} catch {
return { reihenfolge: STANDARD_REIHENFOLGE, ausgeblendet: [] };
}
}
export function layoutSpeichern(layout: DashboardLayout): void {
try {
localStorage.setItem(SPEICHER_KEY, JSON.stringify(layout));
} catch {
// Speichern optional - Layout fällt auf Standard zurück
}
}