From 6b2cbb0206248efe4416600d5c98fedb9b02cf24 Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 28 May 2026 12:50:48 +0200 Subject: [PATCH] =?UTF-8?q?3D-Dateien=20im=20Archiv=20bearbeitbar=20-=20hi?= =?UTF-8?q?nzuf=C3=BCgen=20und=20l=C3=B6schen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/tools/kalkulator3d.jsx | 108 +++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/frontend/src/tools/kalkulator3d.jsx b/frontend/src/tools/kalkulator3d.jsx index a2f79d6..60c590e 100644 --- a/frontend/src/tools/kalkulator3d.jsx +++ b/frontend/src/tools/kalkulator3d.jsx @@ -140,11 +140,27 @@ export default function Kalkulator3D({ toast, editData, onEditDone, mobile, setA const [bemerkung, setBemerkung] = useState(editData?.bemerkung ?? ''); const [image, setImage] = useState(editData?.image ?? null); const [saving, setSaving] = useState(false); - const [modelFiles, setModelFiles] = useState([]); // Array von File-Objekten - const fileRef = useRef(null); + const [modelFiles, setModelFiles] = useState([]); // neue Dateien zum Hochladen + const [existingFiles, setExistingFiles] = useState([]); // bereits gespeicherte Dateien + const [modelFolderId, setModelFolderId] = useState(null); + const fileRef = useRef(null); const modelFileRef = useRef(null); const sv = (k, v) => setVars(p => ({ ...p, [k]: v })); + // Im Bearbeitungsmodus: existierende Dateien laden + useEffect(() => { + if (!editData?.id || !editData?.name) return; + (async () => { + try { + const base = await api('/tools/dateien/ensure-folder', { body: { name: '3D-Modelle' } }); + const sub = await api('/tools/dateien/ensure-folder', { body: { name: editData.name.trim(), parent_id: base.id } }); + setModelFolderId(sub.id); + const data = await api(`/tools/dateien?folder_id=${sub.id}`); + setExistingFiles(data.own || []); + } catch {} + })(); + }, [editData?.id]); + const calc = useMemo(() => { const f = getFarbFaktor(farben); const matProGramm = vars.materialpreis_pro_rolle / 1000; @@ -184,6 +200,21 @@ export default function Kalkulator3D({ toast, editData, onEditDone, mobile, setA if (editData?.id) { await api(`/tools/kalkulator3d/${editData.id}`, { method:'PUT', body:payload }); + // Neue Dateien hochladen falls vorhanden + if (modelFiles.length > 0 && modelFolderId) { + const form = new FormData(); + form.append('folder_id', modelFolderId); + for (const f of modelFiles) form.append('files', f); + await fetch('/api/tools/dateien/upload-3d', { + method:'POST', + headers:{ Authorization:`Bearer ${localStorage.getItem('sk_token')}` }, + body: form, + }); + setModelFiles([]); + // Dateien neu laden + const data = await api(`/tools/dateien?folder_id=${modelFolderId}`); + setExistingFiles(data.own || []); + } toast('Aktualisiert ✓'); onEditDone?.(); } else { await api('/tools/kalkulator3d', { body:payload }); @@ -368,7 +399,7 @@ export default function Kalkulator3D({ toast, editData, onEditDone, mobile, setA )} - {/* 3D-Modelldateien – nur beim Neuanlegen */} + {/* 3D-Modelldateien – beim Neuanlegen */} {!editData?.id && (
)} + {/* 3D-Modelldateien – beim Bearbeiten */} + {editData?.id && ( +
+ + setModelFiles(Array.from(e.target.files||[]))} + style={{ display:'none' }} /> + + {/* Existierende Dateien */} + {existingFiles.length > 0 && ( +
+ {existingFiles.map((f,i) => ( +
+ 🖨 + + {f.originalname} + + + {(f.size/1024/1024).toFixed(1)} MB + + +
+ ))} +
+ )} + + {/* Neue Dateien zum Hochladen */} + {modelFiles.length > 0 && ( +
+
NEU HINZUFÜGEN
+ {modelFiles.map((f,i) => ( +
+ + {f.name} + + + {(f.size/1024/1024).toFixed(1)} MB + +
+ ))} +
+ )} + +
+ + {modelFiles.length > 0 && ( + + )} +
+
+ )} +