Fix: weiße Seiten nach Reload — bgImage nicht mehr als blob-URL serialisieren [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 1s

Die fabric.Image der Quell-Bilder wurde mit toJSON([bgImage]) inkl. ihrer
blob:-URL gespeichert. Nach Reload ist die Blob-URL ungültig, fabric kann
das Bild nicht holen → weißer Canvas.

Fix: bgImage-Objekte beim Speichern aus dem JSON rausfiltern. Beim Laden
immer rerenderCurrent() aufrufen (frisches Quellbild aus page_image.php),
dann nur die Overlay-Shapes via enlivenObjects restoren.
This commit is contained in:
Eduard Wisch 2026-04-09 15:28:45 +02:00
parent 021ef1cbb2
commit 36aad9539a

View file

@ -195,32 +195,34 @@
pctx.fillRect(0, 0, pdfCanvas.width, pdfCanvas.height); pctx.fillRect(0, 0, pdfCanvas.width, pdfCanvas.height);
resizeFabricToCanvas(); resizeFabricToCanvas();
let jsonHasObjects = false; // Quellbild IMMER frisch laden — gespeicherte bgImage-Objekte haben eine
let jsonHasBgImage = false; // blob:-URL, die nach Reload ungültig ist.
await rerenderCurrent();
// Overlay-Shapes (Pfeile, Text, Rechtecke, …) aus JSON wiederherstellen,
// aber ohne bgImage/type=image-Einträge (Legacy-Cleanup).
if (loadedFabricJson) { if (loadedFabricJson) {
try { try {
const parsed = (typeof loadedFabricJson === 'string') ? JSON.parse(loadedFabricJson) : loadedFabricJson; const parsed = (typeof loadedFabricJson === 'string') ? JSON.parse(loadedFabricJson) : loadedFabricJson;
jsonHasObjects = parsed && Array.isArray(parsed.objects) && parsed.objects.length > 0; if (parsed && Array.isArray(parsed.objects) && parsed.objects.length > 0) {
jsonHasBgImage = jsonHasObjects && parsed.objects.some(o => o.bgImage === true || (o.type === 'image')); const bg = fabricCanvas.getObjects().find(o => o.bgImage === true);
if (jsonHasObjects) { const overlays = parsed.objects.filter(o => !o.bgImage && o.type !== 'image');
if (overlays.length > 0) {
await new Promise((res) => { await new Promise((res) => {
fabricCanvas.loadFromJSON(parsed, () => { fabric.util.enlivenObjects(overlays, (objs) => {
fabricCanvas.renderAll(); objs.forEach(o => fabricCanvas.add(o));
if (bg) bg.sendToBack();
fabricCanvas.requestRenderAll();
res(); res();
}); });
}); });
applyTool(); applyTool();
} }
}
} catch (e) { } catch (e) {
console.warn('Fabric-JSON restore fehlgeschlagen:', e); console.warn('Fabric-JSON restore fehlgeschlagen:', e);
} }
} }
// Wenn kein Bild im JSON (alter Bericht vor Phase 6) ODER nie gespeichert:
// Quellbild frisch als Fabric-Image laden und hinter die existierenden Shapes legen
if (!jsonHasBgImage) {
await rerenderCurrent();
}
} }
/** /**
@ -767,7 +769,14 @@
const fd = new FormData(); const fd = new FormData();
fd.append('token', cfg.token); fd.append('token', cfg.token);
fd.append('pageid', currentPageId); fd.append('pageid', currentPageId);
fd.append('fabric_json', JSON.stringify(fabricCanvas.toJSON(['bgImage']))); // WICHTIG: bgImage-Objekte nicht serialisieren — ihre src ist eine
// blob:-URL, die nach Reload ungültig ist und zum weißen Canvas führt.
// Das Quellbild wird beim Laden frisch aus page_image.php geholt.
const jsonOut = fabricCanvas.toJSON(['bgImage']);
if (jsonOut && Array.isArray(jsonOut.objects)) {
jsonOut.objects = jsonOut.objects.filter(o => !o.bgImage);
}
fd.append('fabric_json', JSON.stringify(jsonOut));
fd.append('note', getNoteValue() || ''); fd.append('note', getNoteValue() || '');
fd.append('rotation', currentPageRotation); fd.append('rotation', currentPageRotation);