import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { apiRequest } from "../api/client"; interface ObjektMangel { objekt_id: number; code: string; name: string; gruende: string[]; } interface Einsatzbereitschaft { einsatzbereit: number; eingeschraenkt_einsatzbereit: number; nicht_einsatzbereit: number; gesamt: number; details: ObjektMangel[]; } interface Prueftermineintrag { typ: string; objekt_id: number; bezeichnung: string; faelligkeitsdatum: string; verbleibende_tage: number; status: string; } interface Ablaufdatumeintrag { objekt_id: number; material_id: number; ablaufdatum: string; verbleibende_tage: number; status: string; } const GRUND_TEXT: Record = { fehlbestand_offen: "Offener Fehlbestand", ablaufdatum_abgelaufen: "Ablaufdatum überschritten", pruefung_ueberfaellig: "Geräteprüfung überfällig", kontrolle_laeuft: "Kontrolle läuft (gesperrt)", mangel_kritisch_offen: "Kritischer Mangel offen", in_wartung: "In Wartung", hu_uvv_ueberfaellig: "HU/UVV überfällig", mindermenge_genehmigt: "Mindermenge genehmigt", }; // Leitungs-Dashboard (Karte-Nachtrag): zwei neue Kacheln (Einsatzbereitschaft, // Prüftermine) plus die bestehende Ablaufdaten-Kachel, alle drei eigenständig - // widersprechen sich nicht, da überfällige Prüfung/Ablauf beide zusätzlich als // Grund in die Einsatzbereitschaft einfließen. export function DashboardPage() { const [bereitschaft, setBereitschaft] = useState(null); const [prueftermine, setPrueftermine] = useState([]); const [ablaufdaten, setAblaufdaten] = useState([]); const [laedt, setLaedt] = useState(true); const [fehler, setFehler] = useState(null); const [detailsOffen, setDetailsOffen] = useState(false); useEffect(() => { Promise.all([ apiRequest("/dashboard/einsatzbereitschaft"), apiRequest("/dashboard/prueftermine"), apiRequest("/dashboard/ablaufdaten"), ]) .then(([b, p, a]) => { setBereitschaft(b); setPrueftermine(p); setAblaufdaten(a); }) .catch(() => setFehler("Dashboard-Daten konnten nicht geladen werden.")) .finally(() => setLaedt(false)); }, []); return (

Dashboard

{fehler &&
{fehler}
} {laedt &&

Lade…

} {!laedt && bereitschaft && (

Einsatzbereites Material

{bereitschaft.einsatzbereit} von {bereitschaft.gesamt} Objekten einsatzbereit

{bereitschaft.eingeschraenkt_einsatzbereit > 0 && (

{bereitschaft.eingeschraenkt_einsatzbereit} eingeschränkt einsatzbereit (aktive Mindermengen-Genehmigung)

)} {bereitschaft.nicht_einsatzbereit > 0 && (

{bereitschaft.nicht_einsatzbereit} nicht einsatzbereit

)} {bereitschaft.details.length > 0 && ( <> {detailsOffen && (
    {bereitschaft.details.map((d) => (
  • {d.name} ({d.code}) {d.gruende.map((g) => GRUND_TEXT[g] ?? g).join(", ")}
  • ))}
)} )}

Nächste Prüftermine

{prueftermine.length === 0 ? (

Keine anstehenden oder überfälligen Geräteprüfungen.

) : (
    {prueftermine.map((p, i) => (
  • {p.bezeichnung} {p.faelligkeitsdatum} ({p.verbleibende_tage} Tage)
  • ))}
)}

Bevorstehende Ablaufdaten

{ablaufdaten.length === 0 ? (

Keine bald ablaufenden Chargen.

) : (
    {ablaufdaten.map((a) => (
  • Objekt #{a.objekt_id} – Material #{a.material_id} {a.ablaufdatum} ({a.verbleibende_tage} Tage)
  • ))}
)}
)}
); }