From 272609e70aeeeed999eec9ffd84f863769aca0d6 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 26 Jul 2026 13:11:29 +0200 Subject: [PATCH] =?UTF-8?q?Web:=20eigene=20Felder=20nachtr=C3=A4glich=20be?= =?UTF-8?q?arbeiten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend und API-Client konnten Felddefinitionen laengst aendern (PATCH), nur die Oberflaeche bot bisher nur Anlegen und Loeschen. In der Felder-Verwaltung einer Kategorie gibt es jetzt je Feld einen Bearbeiten-Knopf: er laedt Name, Typ, Einheit, Auswahlmoeglichkeiten und Pflicht ins Formular; Speichern aktualisiert das Feld (oder Abbrechen). Geerbte und eingebaute Felder bleiben unveraendert. Co-Authored-By: Claude Opus 4.8 --- web/src/pages/Categories.jsx | 80 ++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/web/src/pages/Categories.jsx b/web/src/pages/Categories.jsx index 5018532..0e820c6 100644 --- a/web/src/pages/Categories.jsx +++ b/web/src/pages/Categories.jsx @@ -287,6 +287,7 @@ function CategoryFields({ category, isAdmin, onClose }) { const confirm = useConfirm(); const [fields, setFields] = useState([]); const [form, setForm] = useState(EMPTY_FIELD); + const [editId, setEditId] = useState(null); // null = neues Feld, sonst bearbeiten const [error, setError] = useState(null); async function load() { @@ -298,21 +299,45 @@ function CategoryFields({ category, isAdmin, onClose }) { } useEffect(() => { load(); }, [category.id]); - async function add(e) { + // Ein bestehendes Feld in das Formular laden (mehrfach getrennte Optionen + // wieder als Komma-Liste). + function startEdit(f) { + setEditId(f.id); + setForm({ + label: f.label, + field_type: f.field_type, + unit: f.unit || "", + options: (f.options || []).join(", "), + required: f.required, + }); + setError(null); + } + + function cancelEdit() { + setEditId(null); + setForm(EMPTY_FIELD); + } + + async function submit(e) { e.preventDefault(); setError(null); + const body = { + label: form.label, + field_type: form.field_type, + unit: form.field_type === "number" ? (form.unit || null) : null, + options: form.field_type === "select" + ? form.options.split(",").map((o) => o.trim()).filter(Boolean) + : null, + required: form.required, + }; try { - await api.createFieldDefinition({ - category_id: category.id, - label: form.label, - field_type: form.field_type, - unit: form.field_type === "number" ? (form.unit || null) : null, - options: form.field_type === "select" - ? form.options.split(",").map((o) => o.trim()).filter(Boolean) - : null, - required: form.required, - }); + if (editId) { + await api.updateFieldDefinition(editId, body); + } else { + await api.createFieldDefinition({ category_id: category.id, ...body }); + } setForm(EMPTY_FIELD); + setEditId(null); load(); } catch (err) { setError(err.message); @@ -351,7 +376,7 @@ function CategoryFields({ category, isAdmin, onClose }) { ) : (