From 244cc56bdef6326a229508f1a1a62f26d94a09e0 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Thu, 9 Apr 2026 20:32:37 +0200 Subject: [PATCH] Sidebar: Refresh-Status direkt im HTML gerendert statt dynamisch renderIncidentItem() baut den Refresh-Status (Gold-Rand, Spinner, Statustext, Warteschlange-Position) direkt ins HTML ein. Ueberlebt jetzt renderSidebar()-Aufrufe bei Lagenwechsel und Aktualisierungen. Sidebar wird nach jedem WebSocket-Status-Update neu gerendert, damit der Status fuer ALLE Lagen immer sichtbar bleibt. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/static/js/app.js | 2 ++ src/static/js/components.js | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/static/js/app.js b/src/static/js/app.js index 277f3de..7dace8b 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -2043,6 +2043,8 @@ async handleRefresh() { const isFirst = inc && !inc.summary; // Always update sidebar status (visible for all incidents) UI._updateSidebarRefreshStatus(msg.incident_id, status, msg.data); + // Re-render sidebar so status is baked into HTML (survives future re-renders) + this.renderSidebar(); if (msg.incident_id === this.currentIncidentId) { UI.showProgress(status, msg.data, msg.incident_id, isFirst); this._updateRefreshButton(status !== 'idle'); diff --git a/src/static/js/components.js b/src/static/js/components.js index 49fdf9d..00f7696 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -40,12 +40,32 @@ const UI = { const activeClass = isActive ? 'active' : ''; const creator = (incident.created_by_username || '').split('@')[0]; + // Determine refresh status for sidebar display + let refreshClass = ''; + let refreshStatusHtml = ''; + if (isRefreshing) { + const state = this._progressState[incident.id]; + const step = state ? state.step : 'researching'; + const isQueued = (step === 'queued'); + + if (isQueued) { + refreshClass = ' queued-item'; + const pos = state && state._queuePos ? ' (#' + state._queuePos + ')' : ''; + refreshStatusHtml = ''; + } else { + refreshClass = ' refreshing-item'; + const label = this._getStepLabel(step); + refreshStatusHtml = ''; + } + } + return ` -
+
${this.escape(incident.title)}
${incident.article_count} Artikel · ${this.escape(creator)}
+ ${refreshStatusHtml}
${incident.visibility === 'private' ? 'PRIVAT' : ''} ${incident.refresh_mode === 'auto' ? '' : ''} @@ -606,6 +626,9 @@ const UI = { if (isQueued) { const pos = (extra && extra.queue_position) ? extra.queue_position : ''; + // Store queue position in state for renderIncidentItem + const pState = this._progressState[incidentId]; + if (pState && pos) pState._queuePos = pos; statusEl.className = 'incident-refresh-status queued-status'; statusEl.innerHTML = 'Warteschlange' + (pos ? ' (#' + pos + ')' : '') + ''; } else {