From e0ae93681191d4b0aa75e6dada68b13aa944b9e1 Mon Sep 17 00:00:00 2001 From: Eduard Wisch Date: Thu, 9 Apr 2026 14:39:56 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Bericht=20=C3=B6ffnen=20=E2=80=94=20Canv?= =?UTF-8?q?as=20war=20wei=C3=9F=20obwohl=20Seiten=20Bilder=20hatten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei Probleme behoben: 1. Wenn fabric_json existierte aber leer oder ohne Objekte war, wurde rerenderCurrent() NICHT aufgerufen und das Canvas blieb leer. 2. Canvas-Dimensionen wurden nur im fabric_json-Zweig gesetzt — bei altem Berichten ohne JSON fehlte der Init und das Canvas war 1x1. 3. loadFromJSON-Callback hat zwar das Promise resolved, aber die nachfolgende applyTool() für Tool-Locking fehlte, dadurch waren die geladenen Bilder nach Reload immer ziehbar. Fix: - Canvas-Dimensionen IMMER zuerst auf A4 setzen - Nur laden wenn fabric_json tatsächlich Objekte enthält - Sonst (oder bei Parse-Fehler) Fallback auf rerenderCurrent() das das Quell-Bild frisch als fabric.Image lädt - applyTool() nach loadFromJSON damit Tool-Lock-Status korrekt ist Co-Authored-By: Claude Opus 4.6 (1M context) [deploy] --- js/editor.js | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/js/editor.js b/js/editor.js index ce58b27..99cc1be 100644 --- a/js/editor.js +++ b/js/editor.js @@ -161,29 +161,42 @@ await loadPageMeta(); // setzt currentPageRotation + ggf. loadedFabricJson + // Canvas-Dimensionen IMMER auf A4 setzen + const target = getTargetCanvasWidth(); + const pageAspect = 1 / 1.414; + const isLandscape = currentPageRotation === 90 || currentPageRotation === 270; + pdfCanvas.width = target; + pdfCanvas.height = isLandscape ? Math.round(target * pageAspect) : Math.round(target / pageAspect); + const pctx = pdfCanvas.getContext('2d'); + pctx.fillStyle = '#ffffff'; + pctx.fillRect(0, 0, pdfCanvas.width, pdfCanvas.height); + resizeFabricToCanvas(); + + let jsonHasObjects = false; if (loadedFabricJson) { - // Existierender State wird geladen — enthält bereits Bild, Shapes, Text etc. try { const parsed = (typeof loadedFabricJson === 'string') ? JSON.parse(loadedFabricJson) : loadedFabricJson; - // Canvas-Dimensionen aus dem geladenen JSON übernehmen und skalieren - const target = getTargetCanvasWidth(); - const pageAspect = 1 / 1.414; - const isLandscape = currentPageRotation === 90 || currentPageRotation === 270; - pdfCanvas.width = target; - pdfCanvas.height = isLandscape ? Math.round(target * pageAspect) : Math.round(target / pageAspect); - const ctx = pdfCanvas.getContext('2d'); - ctx.fillStyle = '#ffffff'; - ctx.fillRect(0, 0, pdfCanvas.width, pdfCanvas.height); - resizeFabricToCanvas(); - await new Promise(res => { - fabricCanvas.loadFromJSON(parsed, () => { fabricCanvas.renderAll(); res(); }); - }); + jsonHasObjects = parsed && Array.isArray(parsed.objects) && parsed.objects.length > 0; + if (jsonHasObjects) { + // WICHTIG: loadFromJSON ist für fabric.Image async — Bilder kommen erst + // im Callback ins Canvas. Wir warten auf den Callback. + await new Promise((res) => { + fabricCanvas.loadFromJSON(parsed, () => { + fabricCanvas.renderAll(); + res(); + }); + }); + // Re-apply tool state: wenn aktuelles Tool nicht select ist, Objekte sperren + applyTool(); + } } catch (e) { - console.warn('Fabric-JSON restore fehlgeschlagen, fallback auf Neu-Render:', e); - await rerenderCurrent(); + console.warn('Fabric-JSON restore fehlgeschlagen:', e); + jsonHasObjects = false; } - } else { - // Erster Besuch der Seite: Quellbild frisch als Fabric-Image laden + } + + if (!jsonHasObjects) { + // Kein gespeicherter State → Quellbild frisch als Fabric-Image laden await rerenderCurrent(); } }