import { useState, type FormEvent } from "react"; import { useTranslation } from "react-i18next"; import type { components } from "../api/schema"; import { useCreateFieldDefinition, useUpdateFieldDefinition, useVocabularies, } from "../api/queries"; import { LabelEditor } from "../components/label-editor"; import { MutationError } from "../components/mutation-error"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; type LabelInput = components["schemas"]["LabelInput"]; type FieldDefinitionView = components["schemas"]["FieldDefinitionView"]; const TYPES = ["text", "localized_text", "integer", "date", "boolean", "term", "authority"] as const; const KINDS = ["person", "organisation", "place"] as const; export function FieldForm({ editing, onDone, }: { editing: FieldDefinitionView | null; onDone: () => void; }) { const { t } = useTranslation(); const create = useCreateFieldDefinition(); const update = useUpdateFieldDefinition(); const { data: vocabularies } = useVocabularies(); const isEdit = editing !== null; const [key, setKey] = useState(editing?.key ?? ""); const [labels, setLabels] = useState((editing?.labels as LabelInput[]) ?? []); const [dataType, setDataType] = useState(editing?.data_type ?? "text"); const [vocabularyId, setVocabularyId] = useState(editing?.vocabulary_id ?? ""); const [authorityKind, setAuthorityKind] = useState(editing?.authority_kind ?? ""); const [group, setGroup] = useState(editing?.group ?? ""); const [required, setRequired] = useState(editing?.required ?? false); const [error, setError] = useState(false); const onSubmit = (event: FormEvent) => { event.preventDefault(); const hasLabel = labels.some((l) => l.label); if (!hasLabel || (!isEdit && !key.trim()) || (!isEdit && dataType === "term" && !vocabularyId)) { setError(true); return; } setError(false); if (isEdit) { update.mutate( { key: editing.key, required, group: group.trim() || null, labels }, { onSuccess: onDone }, ); } else { create.mutate( { key: key.trim(), data_type: dataType, vocabulary_id: dataType === "term" ? vocabularyId : null, authority_kind: dataType === "authority" ? authorityKind || null : null, required, group: group.trim() || null, labels, }, { onSuccess: () => { setKey(""); setLabels([]); setDataType("text"); setVocabularyId(""); setAuthorityKind(""); setGroup(""); setRequired(false); setError(false); onDone(); }, }, ); } }; const pending = isEdit ? update.isPending : create.isPending; return (
{isEdit ? labelTextOrKey(editing) : t("fields.newField")}
{isEdit && ( )}
{isEdit &&

{t("fields.lockedNote")}

}
setKey(e.target.value)} />
{dataType === "term" && (
)} {dataType === "authority" && (
)}
setGroup(e.target.value)} />
{error && (

{t("form.required")}

)} ); } function labelTextOrKey(def: FieldDefinitionView): string { return def.labels[0]?.label ?? def.key; }