"use client"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { createOrgUnit } from "@/actions/org"; import { Button } from "@/components/ui/Button"; import { SelectField, TextField } from "@/components/ui/Field"; import { Modal } from "@/components/ui/Modal"; import { useToast } from "@/components/ui/Toast"; import { todayIso } from "@/lib/format"; import { naechsteOrgnummer } from "@/lib/org-nummer"; import type { OrgUnitNode } from "./types"; type Art = "Bereich" | "Abteilung" | "Team"; // „Gesellschaft“ fehlt in der Auswahl mit Absicht: es gibt genau eine, sie ist // die Wurzel, und unter einer anderen Einheit wäre sie ein Etikett, das seiner // Stelle im Baum widerspricht. Die Datenbankfunktion weist es ohnehin ab — die // fehlende Zeile erspart den Weg dorthin. const ARTEN: { value: Art; label: string }[] = [ { value: "Bereich", label: "Bereich" }, { value: "Abteilung", label: "Abteilung" }, { value: "Team", label: "Team" }, ]; /** * Die Art, die unter einer Einheit am wahrscheinlichsten ist: eine Stufe * feiner als die darüber. Nur eine Vorbelegung — die Tiefe des Baums ist frei, * und eine Abteilung unter einer Abteilung ist erlaubt. */ function vorschlagArt(eltern: OrgUnitNode["unit_type"]): Art { if (eltern === "Gesellschaft") return "Bereich"; if (eltern === "Bereich") return "Abteilung"; return "Team"; } export function CreateOrgUnitModal({ parent, units, onClose, }: { parent: OrgUnitNode; units: OrgUnitNode[]; onClose: () => void; }) { const { showToast } = useToast(); const router = useRouter(); const [orgNumber, setOrgNumber] = useState(() => naechsteOrgnummer(units.map((u) => u.org_number)) ?? ""); const [name, setName] = useState(""); const [art, setArt] = useState(() => vorschlagArt(parent.unit_type)); // **Nicht** der Stichtag der Ansicht. Wer sich das Organigramm zum letzten // Jahresende ansieht und hier auf Plus drückt, will in aller Regel eine // Einheit von heute anlegen und keine rückdatierte. Ein stillschweigend // übernommenes Datum aus der Ansicht wäre die Art von Vorbelegung, die // niemand liest und die hinterher niemand erklären kann. const [validFrom, setValidFrom] = useState(todayIso); const [leitung, setLeitung] = useState(""); const [pending, setPending] = useState(false); async function handleSubmit() { if (!orgNumber.trim() || !name.trim() || !validFrom) { showToast("Orgnummer, Bezeichnung und Gültigkeitsbeginn sind Pflicht.", "error"); return; } setPending(true); const result = await createOrgUnit({ parent_id: parent.id, org_number: orgNumber.trim(), name: name.trim(), unit_type: art, valid_from: validFrom, leitung_taetigkeit: leitung.trim() || undefined, }); setPending(false); if (result.success) { showToast(leitung.trim() ? "Einheit samt Leitungsplanstelle angelegt." : "Einheit angelegt."); router.refresh(); onClose(); } else { showToast(result.error ?? "Fehler beim Anlegen.", "error"); } } return ( } >

Unter {parent.org_number} · {parent.name}. Bestehende Einheiten lassen sich nicht hierher verschieben — die neue entsteht leer.

setArt(v as Art)} options={ARTEN} />
); }