From 9a32e4a39b6dffc29ba16d158c21e7227b147f85 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 10 May 2026 20:50:40 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Objekt=20inline=20bearbeiten=20in=20Gen?= =?UTF-8?q?erateIt=20(Notizen=20+=20W=C3=B6rter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✏️ Button pro Objekt in der linken Sidebar öffnet Edit-Panel: - Notizen-Textarea bearbeitbar - Wörter: Chips mit × + neues Wort hinzufügen (Enter oder +) - Speichern / Abbrechen Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/pages/GenerateIt.tsx | 98 ++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/GenerateIt.tsx b/frontend/src/pages/GenerateIt.tsx index f479795..3e5e431 100644 --- a/frontend/src/pages/GenerateIt.tsx +++ b/frontend/src/pages/GenerateIt.tsx @@ -7,6 +7,9 @@ import { getDbObjects, getDbObjectPairs, getDbObjectWords, + updateDbObject, + addDbObjectWord, + deleteDbObjectWord, createDbPair, updateDbPair, deleteDbPair, @@ -417,6 +420,11 @@ export default function GenerateIt() { const [pairsLoading, setPairsLoading] = useState(false) // per-object words: objectId → DbWord[] const [objectWords, setObjectWords] = useState>({}) + // inline object edit + const [editingObjId, setEditingObjId] = useState(null) + const [editNotes, setEditNotes] = useState('') + const [editWordInput, setEditWordInput] = useState('') + const [savingObj, setSavingObj] = useState(false) const currentPicture: DbPicture | null = currentIndex >= 0 && currentIndex < pictureList.length ? pictureList[currentIndex] : null @@ -491,6 +499,44 @@ export default function GenerateIt() { .finally(() => setPairsLoading(false)) } + const startEditObj = (obj: DbObject) => { + setEditingObjId(obj.id) + setEditNotes(obj.user_notes ?? '') + setEditWordInput('') + } + + const cancelEditObj = () => { setEditingObjId(null); setEditWordInput('') } + + const saveEditObj = async (objId: string) => { + if (!token) return + setSavingObj(true) + try { + await updateDbObject(objId, { user_notes: editNotes.trim() || null }, token) + setDbObjects(prev => prev.map(o => o.id === objId ? { ...o, user_notes: editNotes.trim() || null } : o)) + setEditingObjId(null) + } finally { + setSavingObj(false) + } + } + + const addWordToObj = async (objId: string) => { + if (!token) return + const titel_de = editWordInput.trim() + if (!titel_de) return + const result = await addDbObjectWord(objId, { titel_de, level: 50 }, token) + if (result.ok) { + const words = await getDbObjectWords(objId, token) + setObjectWords(prev => ({ ...prev, [objId]: words })) + setEditWordInput('') + } + } + + const removeWordFromObj = async (objId: string, junctionId: string | number) => { + if (!token) return + await deleteDbObjectWord(objId, junctionId, token) + setObjectWords(prev => ({ ...prev, [objId]: (prev[objId] || []).filter(w => w.junction_id !== junctionId) })) + } + const imageNav = (
+ - {obj.user_notes && ( + + {obj.user_notes && editingObjId !== obj.id && (
{obj.user_notes}
)} + + {/* Inline edit panel */} + {editingObjId === obj.id && ( +
e.stopPropagation()}> + {/* Notizen */} +