From a93c9406809000fdef4b338ccf313c1336f731eb Mon Sep 17 00:00:00 2001 From: fds2610-bot Date: Wed, 23 Sep 2026 08:48:58 +0200 Subject: [PATCH] Buero-Visualisierung: Render-Fehler nach erfolgreichem Live-Fetch nicht mehr als "API nicht erreichbar" melden refresh() zeigte den roten Banner bisher fuer jeden Fehler im gesamten try-Block, auch wenn loadLiveData() laengst erfolgreich war und erst das anschliessende Verarbeiten/Zeichnen der Live-Daten scheiterte (Issue #94: Produktion meldete "API nicht erreichbar", obwohl ein direkter curl-Aufruf die API nachweislich erreichte). Jetzt entscheidet ausschliesslich der Erfolg von loadLiveData() ueber Banner/Demo-Fallback; ein spaeterer Fehler beim Verarbeiten wird nur noch geloggt, ohne die Erreichbarkeit faelschlich zu verneinen. Getestet: composer test (262 Tests) und npm test/frontend (98 Tests) in Docker, beide gruen. Co-Authored-By: Claude Sonnet 5 --- html/js/office-render.js | 46 ++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/html/js/office-render.js b/html/js/office-render.js index 7b672aa..19ac2e5 100644 --- a/html/js/office-render.js +++ b/html/js/office-render.js @@ -2626,9 +2626,34 @@ async function boot() { } async function refresh() { + // Issue #94, zweiter Anlauf: der erste Fix (siehe Kommentar unten bei renderOfficeScene()) + // sorgte zwar dafuer, dass der Banner ueberhaupt erscheint, hat aber "API nicht erreichbar" + // faelschlich auch dann gezeigt, wenn loadLiveData() laengst erfolgreich war und erst das + // anschliessende Verarbeiten/Zeichnen der Live-Daten scheiterte - Produktion meldete dann + // trotz per curl nachweislich erreichbarer API weiterhin Unerreichbarkeit. Deshalb jetzt + // zwei getrennte try-Bloecke: nur ein Fehlschlag von loadLiveData() selbst ist ein + // Erreichbarkeitsproblem und darf den Demo-Fallback samt Banner ausloesen. + let data; + try { + data = await loadLiveData(); + } catch (err) { + console.warn("[office] Live-API nicht erreichbar, zeige Demo-Daten.", err); + // setApiBanner() steht in einem eigenen finally: renderOfficeScene() zeichnet bei jedem + // Refresh die komplette Szene neu und kann durch einen Fehler in noch unbekannten + // Datenkombinationen scheitern (siehe Issue #94 - Produktion zeigte trotz nicht + // erreichbarer API keinen Banner). Ohne das finally wuerde ein solcher Fehler die + // wichtigere Meldung "API nicht erreichbar" mit sich reissen, statt sie anzuzeigen. + try { + renderOfficeScene(container); + } finally { + setApiBanner(true); + } + return; + } + + setApiBanner(false); + lastLiveData = data; try { - const data = await loadLiveData(); - lastLiveData = data; if (previousTickets) { const previousById = new Map(previousTickets.map((ticket) => [ticket.id, ticket])); @@ -2684,19 +2709,12 @@ async function boot() { resolvePendingAgentTicketMoves(data.agents); previousTickets = data.tickets; renderLiveScene(data); - setApiBanner(false); } catch (err) { - console.warn("[office] Live-API nicht erreichbar, zeige Demo-Daten.", err); - // setApiBanner() steht in einem eigenen finally: renderOfficeScene() zeichnet bei jedem - // Refresh die komplette Szene neu und kann durch einen Fehler in noch unbekannten - // Datenkombinationen scheitern (siehe Issue #94 - Produktion zeigte trotz nicht - // erreichbarer API keinen Banner). Ohne das finally wuerde ein solcher Fehler die - // wichtigere Meldung "API nicht erreichbar" mit sich reissen, statt sie anzuzeigen. - try { - renderOfficeScene(container); - } finally { - setApiBanner(true); - } + // Die API war erreichbar (loadLiveData() oben ist bereits durchgelaufen) - ein Fehler + // hier ist ein Render-/Verarbeitungsbug, kein Erreichbarkeitsproblem. Der Banner bleibt + // deshalb aus (siehe setApiBanner(false) oben); der naechste Poll-Zyklus versucht es + // erneut, sobald startRealtimeUpdates() ihn ausloest. + console.error("[office] Fehler beim Verarbeiten/Zeichnen der Live-Daten.", err); } }