From 405e55e8180e621e0660a74a3bf827da0e5d675e Mon Sep 17 00:00:00 2001 From: A0 Orchestrator Date: Wed, 1 Jul 2026 14:23:44 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20drawing=20persistence=20bug=20=E2=80=94?= =?UTF-8?q?=20sync=20activeLayerId=20on=20project=20load=20+=20create=20de?= =?UTF-8?q?fault=20layer=20when=20none=20exist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.tsx | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dedda34..e057106 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -279,12 +279,30 @@ const CADEditor: React.FC = ({ projectId, token, onNavigateBack if (data.elements.length > 0) setElements(data.elements); if (data.layers.length > 0) setLayers(data.layers); if (data.blocks.length > 0) setBlocks(data.blocks); - // Save initial layers to backend if backend has none - if (data.layers.length === 0 && data.drawing) { - for (const layer of initialLayers) { - createLayerTyped(token, data.drawing.id, layer).catch(() => {}); + // Ensure activeLayerId matches a real layer + if (data.layers.length > 0) { + const hasActiveLayer = data.layers.some(l => l.id === 'layer-0'); + if (!hasActiveLayer) { + setActiveLayerId(data.layers[0].id); } } + // Create default layer if backend has none + if (data.layers.length === 0 && data.drawing) { + const defaultLayer: CADLayer = { + id: 'layer-0', + name: 'Layer 0', + visible: true, + locked: false, + color: '#ffffff', + lineType: 'solid', + transparency: 0, + sortOrder: 0, + parentId: null, + }; + createLayerTyped(token, data.drawing.id, defaultLayer).catch(() => {}); + setLayers([defaultLayer]); + setActiveLayerId('layer-0'); + } setSavedStatus('gespeichert'); setDataLoaded(true); // Push initial data to Yjs CRDT after load @@ -356,6 +374,11 @@ const CADEditor: React.FC = ({ projectId, token, onNavigateBack if (mergedLayers.length !== layers.length || mergedLayers.some((ml, i) => ml !== layers[i])) { setLayers(mergedLayers); } + // Ensure activeLayerId matches a real layer after collab merge + const hasActiveInMerged = mergedLayers.some(l => l.id === activeLayerId); + if (!hasActiveInMerged && mergedLayers.length > 0) { + setActiveLayerId(mergedLayers[0].id); + } } // Merge blocks: local-first, update changed from remote, append remote-only