import { useState } from "react"; import { apiRequest } from "../../api/client"; import type { Beladungsvorlage, Fach, Material, Objekttyp } from "../../api/types"; import { FachAuswahl } from "./FachAuswahl"; interface PositionZeile { materialId: number | ""; fach: string; sollmenge: string; } const LEERE_ZEILE: PositionZeile = { materialId: "", fach: "", sollmenge: "1" }; interface Props { vorlagen: Beladungsvorlage[]; objekttypen: Objekttyp[]; materialien: Material[]; faecher: Fach[]; onGeaendert: () => Promise; onFehler: (text: string) => void; } export function VorlageSection({ vorlagen, objekttypen, materialien, faecher, onGeaendert, onFehler }: Props) { const [name, setName] = useState(""); const [objekttypId, setObjekttypId] = useState(""); const [zeilen, setZeilen] = useState([LEERE_ZEILE]); const [wirdAngelegt, setWirdAngelegt] = useState(false); const [ausgeklapptId, setAusgeklapptId] = useState(null); const [neueVersionZeilen, setNeueVersionZeilen] = useState([]); const [wirdVersioniert, setWirdVersioniert] = useState(false); function versionBearbeiten(v: Beladungsvorlage) { setAusgeklapptId(ausgeklapptId === v.id ? null : v.id); setNeueVersionZeilen( v.positionen.map((p) => ({ materialId: p.material_id, fach: p.fach ?? "", sollmenge: p.sollmenge, })) ); } function neueVersionZeileAendern(index: number, zeile: Partial) { setNeueVersionZeilen((bisherige) => bisherige.map((z, i) => (i === index ? { ...z, ...zeile } : z))); } async function neueVersionSpeichern(vorlageId: number) { const positionen = neueVersionZeilen .filter((z) => z.materialId !== "") .map((z) => ({ material_id: z.materialId, fach: z.fach || null, sollmenge: z.sollmenge })); setWirdVersioniert(true); try { await apiRequest(`/vorlagen/${vorlageId}/neue-version`, { method: "POST", body: { positionen } }); setAusgeklapptId(null); await onGeaendert(); } catch { onFehler("Neue Version konnte nicht angelegt werden."); } finally { setWirdVersioniert(false); } } function zeileAendern(index: number, zeile: Partial) { setZeilen((bisherige) => bisherige.map((z, i) => (i === index ? { ...z, ...zeile } : z))); } async function anlegen() { if (objekttypId === "") { onFehler("Objekttyp auswählen."); return; } const positionen = zeilen .filter((z) => z.materialId !== "") .map((z) => ({ material_id: z.materialId, fach: z.fach || null, sollmenge: z.sollmenge })); setWirdAngelegt(true); try { await apiRequest("/vorlagen", { method: "POST", body: { objekttyp_id: objekttypId, name, positionen }, }); setName(""); setZeilen([LEERE_ZEILE]); await onGeaendert(); } catch { onFehler("Vorlage konnte nicht angelegt werden."); } finally { setWirdAngelegt(false); } } return (

Vorlage anlegen

{objekttypen.length === 0 ? (

Erst einen Objekttyp anlegen.

) : (
setName(e.target.value)} placeholder="Name" />

Positionen (optional, können auch später nachgepflegt werden)

{zeilen.map((zeile, i) => (
f.objekttyp_id === objekttypId)} wert={zeile.fach} onAendern={(wert) => zeileAendern(i, { fach: wert })} /> zeileAendern(i, { sollmenge: e.target.value })} />
))}
)} {vorlagen.length > 0 && (
    {vorlagen.map((v) => (
  • {v.name} v{v.version}
    {ausgeklapptId === v.id && (

    Änderungen erzeugen eine neue Version – die aktuelle v{v.version} bleibt unverändert erhalten.

    {neueVersionZeilen.map((zeile, i) => (
    f.objekttyp_id === v.objekttyp_id)} wert={zeile.fach} onAendern={(wert) => neueVersionZeileAendern(i, { fach: wert })} /> neueVersionZeileAendern(i, { sollmenge: e.target.value })} />
    ))}
    )}
  • ))}
)}
); }