Fix: previewFallback blendet kaputte Bilder aus statt Fragezeichen, SW by-v1110

User-Report: nach Sprint-Migration auf _preview.webp tauchen
Fragezeichen-Icons auf — wenn weder Preview noch Original verfügbar.

Probleme im vorigen Fix:
- UI.escape() ist HTML-Escape, kein JS-String-Escape → URL mit
  ?param=value wurde &-encoded und damit kaputt
- 'opacity:0.3' lässt das Browser-Default-Broken-Image-Icon
  durchscheinen (Fragezeichen sichtbar)
- Kein Loop-Schutz beim onerror

Fixes:
- String-Escape via .replace(/'/g, \"\\'\") statt UI.escape()
- display:none + .img-broken-Klasse bei finalem Fehler
- dataset.fb='1' verhindert Endlos-Loop wenn Original-URL auch 404
- Wenn URL nicht mit /media/ startet: direkt ausblenden (keine
  Preview-Variante zu probieren)
This commit is contained in:
rene 2026-05-27 09:20:10 +02:00
parent 2f37e0ed16
commit 8e75e2b1a7
6 changed files with 24 additions and 19 deletions

View file

@ -295,10 +295,15 @@ const UI = (() => {
if (!url || !url.startsWith('/media/')) return url || '';
return url.replace(/\.(jpe?g|png|gif|webp)$/i, '_preview.webp');
}
// onerror-Handler: bei 404 vom _preview die Original-URL nachladen
// onerror-Handler: bei 404 vom _preview die Original-URL nachladen,
// bei zweitem Fehler das Image komplett ausblenden (kein Browser-Fragezeichen).
// Setzt eine Klasse 'img-broken' damit Container ggf. einen Fallback zeigen können.
function previewFallback(originalUrl) {
if (!originalUrl || !originalUrl.startsWith('/media/')) return '';
return `if(this.src.includes('_preview')){this.src='${escape(originalUrl)}'}else{this.style.opacity='0.3'}`;
if (!originalUrl || !originalUrl.startsWith('/media/')) {
return `this.style.display='none';this.classList.add('img-broken')`;
}
const safe = String(originalUrl).replace(/'/g, "\\'");
return `if(this.src.includes('_preview')&&!this.dataset.fb){this.dataset.fb='1';this.src='${safe}'}else{this.style.display='none';this.classList.add('img-broken')}`;
}
function emptyState({ icon, title, text, action } = {}) {