'use client' import { useMemo, useState, useTransition } from 'react' import { de } from '@/lib/i18n/de' import { isInputField, looksLikeFields, type TemplateField } from '@/lib/templates/fields' import { saveTemplate } from './actions' type Vorlage = { key: string name: string description: string | null version: number numberPrefix: string numberPadding: number fields: unknown } /** * Vorlagen-Editor. * * Die Bausteine werden als JSON bearbeitet. Das ist bewusst: ein * Baukasten-Editor mit Ziehen und Ablegen wäre eine eigene Phase, und die * Vorlagen ändern sich selten. Geprüft wird gegen dasselbe Schema wie * serverseitig, und die Vorschau zeigt sofort, was dabei herauskommt. * * Nicht optimistisch: eine neue Version wirkt auf alle künftigen Akten. */ export function TemplateEditor({ vorlage }: { vorlage: Vorlage }) { const [name, setName] = useState(vorlage.name) const [description, setDescription] = useState(vorlage.description ?? '') const [numberPrefix, setNumberPrefix] = useState(vorlage.numberPrefix) const [numberPadding, setNumberPadding] = useState(vorlage.numberPadding) const [json, setJson] = useState(() => JSON.stringify(vorlage.fields, null, 2)) const [result, setResult] = useState(null) const [error, setError] = useState(null) const [pending, startTransition] = useTransition() const geparst = useMemo(() => { try { const roh = JSON.parse(json) as unknown // Nur eine grobe Formprüfung für die Vorschau. Ob die Vorlage // gespeichert werden darf, entscheidet allein der Server. if (!looksLikeFields(roh)) { return { ok: false as const, fehler: de.templateAdmin.fieldsInvalid } } return { ok: true as const, fields: roh } } catch { return { ok: false as const, fehler: de.templateAdmin.invalid } } }, [json]) function submit() { if (!geparst.ok) return setError(null) setResult(null) startTransition(async () => { const antwort = await saveTemplate({ key: vorlage.key, name, description: description || undefined, numberPrefix, numberPadding, fields: geparst.fields, }) if (antwort.ok) setResult(de.templateAdmin.saved(antwort.version)) else setError(antwort.error) }) } return (

{vorlage.name}

{vorlage.key} {de.templateAdmin.version(vorlage.version)}