fix: Bericht öffnen — Canvas war weiß obwohl Seiten Bilder hatten
All checks were successful
Deploy bericht / deploy (push) Successful in 1s

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) <noreply@anthropic.com>
[deploy]
This commit is contained in:
Eduard Wisch 2026-04-09 14:39:56 +02:00
parent 9e96063bbc
commit e0ae936811

View file

@ -161,29 +161,42 @@
await loadPageMeta(); // setzt currentPageRotation + ggf. loadedFabricJson 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) { if (loadedFabricJson) {
// Existierender State wird geladen — enthält bereits Bild, Shapes, Text etc.
try { try {
const parsed = (typeof loadedFabricJson === 'string') ? JSON.parse(loadedFabricJson) : loadedFabricJson; const parsed = (typeof loadedFabricJson === 'string') ? JSON.parse(loadedFabricJson) : loadedFabricJson;
// Canvas-Dimensionen aus dem geladenen JSON übernehmen und skalieren jsonHasObjects = parsed && Array.isArray(parsed.objects) && parsed.objects.length > 0;
const target = getTargetCanvasWidth(); if (jsonHasObjects) {
const pageAspect = 1 / 1.414; // WICHTIG: loadFromJSON ist für fabric.Image async — Bilder kommen erst
const isLandscape = currentPageRotation === 90 || currentPageRotation === 270; // im Callback ins Canvas. Wir warten auf den Callback.
pdfCanvas.width = target; await new Promise((res) => {
pdfCanvas.height = isLandscape ? Math.round(target * pageAspect) : Math.round(target / pageAspect); fabricCanvas.loadFromJSON(parsed, () => {
const ctx = pdfCanvas.getContext('2d'); fabricCanvas.renderAll();
ctx.fillStyle = '#ffffff'; res();
ctx.fillRect(0, 0, pdfCanvas.width, pdfCanvas.height); });
resizeFabricToCanvas(); });
await new Promise(res => { // Re-apply tool state: wenn aktuelles Tool nicht select ist, Objekte sperren
fabricCanvas.loadFromJSON(parsed, () => { fabricCanvas.renderAll(); res(); }); applyTool();
}); }
} catch (e) { } catch (e) {
console.warn('Fabric-JSON restore fehlgeschlagen, fallback auf Neu-Render:', e); console.warn('Fabric-JSON restore fehlgeschlagen:', e);
await rerenderCurrent(); 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(); await rerenderCurrent();
} }
} }