import { useEffect, useState } from "react"; import { apiRequest } from "../../api/client"; import type { Benutzer, Objekt, Standort, Zustaendigkeit } from "../../api/types"; interface Props { standorte: Standort[]; objekte: Objekt[]; benutzer: Benutzer[]; onFehler: (text: string) => void; } /** Karte 04: Standort-Zuordnung vererbt sich auf alle Objekte am Standort, * Objekt-Zuordnung ist feinere Ergänzung obendrauf (Vereinigung, kein Ersatz - * siehe backend/app/services/zustaendigkeit.py). Kein starres zentral/dezentral, * Administrator teilt frei zu. */ export function ZustaendigkeitSection({ standorte, objekte, benutzer, onFehler }: Props) { const [eintraege, setEintraege] = useState([]); const [laedt, setLaedt] = useState(true); const [benutzerId, setBenutzerId] = useState(""); const [zuordnungsart, setZuordnungsart] = useState<"standort" | "objekt">("standort"); const [standortId, setStandortId] = useState(""); const [objektId, setObjektId] = useState(""); const [wirdAngelegt, setWirdAngelegt] = useState(false); const [suche, setSuche] = useState(""); async function laden() { setLaedt(true); try { const daten = await apiRequest("/zustaendigkeiten"); setEintraege(daten); } catch { onFehler("Zuständigkeiten konnten nicht geladen werden."); } finally { setLaedt(false); } } useEffect(() => { laden(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function anlegen() { if (benutzerId === "") { onFehler("Benutzer auswählen."); return; } setWirdAngelegt(true); try { await apiRequest("/zustaendigkeiten", { method: "POST", body: { benutzer_id: benutzerId, standort_id: zuordnungsart === "standort" ? standortId || null : null, objekt_id: zuordnungsart === "objekt" ? objektId || null : null, }, }); setStandortId(""); setObjektId(""); await laden(); } catch { onFehler("Zuständigkeit konnte nicht angelegt werden."); } finally { setWirdAngelegt(false); } } async function loeschen(id: string) { try { await apiRequest(`/zustaendigkeiten/${id}`, { method: "DELETE" }); await laden(); } catch { onFehler("Zuständigkeit konnte nicht gelöscht werden."); } } function benutzerName(id: number): string { return benutzer.find((b) => b.id === id)?.name ?? `Benutzer ${id}`; } function zielLabel(e: Zustaendigkeit): string { if (e.standort_id !== null) { const s = standorte.find((x) => x.id === e.standort_id); return `Standort: ${s?.name ?? e.standort_id}`; } const o = objekte.find((x) => x.id === e.objekt_id); return `Objekt: ${o ? `${o.name} (${o.code})` : e.objekt_id}`; } const kannAnlegen = benutzerId !== "" && ((zuordnungsart === "standort" && standortId !== "") || (zuordnungsart === "objekt" && objektId !== "")); const sucheNormalisiert = suche.trim().toLowerCase(); const gefiltert = sucheNormalisiert ? eintraege.filter( (e) => benutzerName(e.benutzer_id).toLowerCase().includes(sucheNormalisiert) || zielLabel(e).toLowerCase().includes(sucheNormalisiert) ) : eintraege; return (

Zuständigkeit

Wer ist materialverantwortlich für welchen Standort/welches Objekt. Standort-Zuordnung gilt für alle Objekte dort, Objekt-Zuordnung ist eine zusätzliche, feinere Ergänzung.

{zuordnungsart === "standort" ? (
) : (
)}
setSuche(e.target.value)} /> {laedt &&

Lade…

} {!laedt && gefiltert.length === 0 &&

Keine Treffer.

} {!laedt && gefiltert.length > 0 && (
    {gefiltert.map((e) => (
  • {benutzerName(e.benutzer_id)} {zielLabel(e)}
  • ))}
)}
); }