Fortschrittsanzeige: Popup mit Checkboxen, Blur, Pro-Lage-Timer
Ladebalken ersetzt durch zentriertes Popup-Fenster mit Checkbox-Checkliste (Warteschlange, Recherche, Analyse, Faktencheck) und Echtzeit-Timer. Erster Durchlauf: Popup nicht wegklickbar, Blur-Effekt auf Kacheln. Aktualisierung: Popup minimierbar zu kompakter Status-Leiste. Timer laeuft pro Lage im Hintergrund weiter bei Lagenwechsel. Gesamtzeit wird am Ende im Abschluss-Popup angezeigt. Sidebar: Animierter Gold-Rand und Fortschrittstext (Recherchiert/ Analysiert/Faktencheck) unter dem Lage-Namen bei laufendem Refresh. Zusaetzlicher Cancel-Checkpoint im Orchestrator nach Uebersetzung. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -699,10 +699,18 @@ const App = {
|
||||
// Refresh-Status fuer diese Lage wiederherstellen
|
||||
const isRefreshing = this._refreshingIncidents.has(id);
|
||||
this._updateRefreshButton(isRefreshing);
|
||||
// Hide any popup from previous incident
|
||||
const prevOverlay = document.getElementById('progress-overlay');
|
||||
if (prevOverlay) prevOverlay.style.display = 'none';
|
||||
const prevMini = document.getElementById('progress-mini');
|
||||
if (prevMini) prevMini.style.display = 'none';
|
||||
const grid = document.querySelector('.grid-stack');
|
||||
if (grid) grid.classList.remove('blurred');
|
||||
if (isRefreshing) {
|
||||
UI.showProgress('researching');
|
||||
} else {
|
||||
UI.hideProgress();
|
||||
const state = UI._progressState[id];
|
||||
const step = state ? state.step : 'researching';
|
||||
const isFirst = state ? state.isFirst : false;
|
||||
UI.showProgress(step, {}, id, isFirst);
|
||||
}
|
||||
|
||||
// Alte Inhalte sofort leeren um Flackern beim Wechsel zu vermeiden
|
||||
@@ -1616,7 +1624,7 @@ const App = {
|
||||
// Sofort ersten Refresh starten
|
||||
this._refreshingIncidents.add(incident.id);
|
||||
this._updateRefreshButton(true);
|
||||
UI.showProgress('queued');
|
||||
// showProgress called via handleStatusUpdate
|
||||
await API.refreshIncident(incident.id);
|
||||
UI.showToast(`Lage "${incident.title}" angelegt. Recherche gestartet.`, 'success');
|
||||
}
|
||||
@@ -1676,12 +1684,14 @@ async handleRefresh() {
|
||||
try {
|
||||
this._refreshingIncidents.add(this.currentIncidentId);
|
||||
this._updateRefreshButton(true);
|
||||
UI.showProgress('queued');
|
||||
// showProgress called via handleStatusUpdate
|
||||
const result = await API.refreshIncident(this.currentIncidentId);
|
||||
if (result && result.status === 'skipped') {
|
||||
UI.showToast('Aktualisierung ist in der Warteschlange und wird ausgefuehrt, sobald die aktuelle Recherche abgeschlossen ist.', 'info');
|
||||
} else {
|
||||
UI.showToast('Aktualisierung gestartet.', 'success');
|
||||
var _inc2 = this.incidents.find(function(i) { return i.id === this.currentIncidentId; }.bind(this));
|
||||
UI.showProgress('queued', {}, this.currentIncidentId, _inc2 && !_inc2.summary);
|
||||
}
|
||||
} catch (err) {
|
||||
this._refreshingIncidents.delete(this.currentIncidentId);
|
||||
@@ -2013,9 +2023,8 @@ async handleRefresh() {
|
||||
handleStatusUpdate(msg) {
|
||||
const status = msg.data.status;
|
||||
if (status === 'retrying') {
|
||||
// Retry-Status → Fehleranzeige mit Retry-Info
|
||||
if (msg.incident_id === this.currentIncidentId) {
|
||||
UI.showProgressError('', true, msg.data.delay || 120);
|
||||
UI.showProgressError('', true, msg.data.delay || 120, msg.incident_id);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -2023,8 +2032,11 @@ async handleRefresh() {
|
||||
this._refreshingIncidents.add(msg.incident_id);
|
||||
}
|
||||
this._updateSidebarDot(msg.incident_id);
|
||||
// Detect first refresh: no summary means first run
|
||||
const inc = this.incidents.find(i => i.id === msg.incident_id);
|
||||
const isFirst = inc && !inc.summary;
|
||||
UI.showProgress(status, msg.data, msg.incident_id, isFirst);
|
||||
if (msg.incident_id === this.currentIncidentId) {
|
||||
UI.showProgress(status, msg.data);
|
||||
this._updateRefreshButton(status !== 'idle');
|
||||
}
|
||||
},
|
||||
@@ -2037,14 +2049,13 @@ async handleRefresh() {
|
||||
this._updateRefreshButton(false);
|
||||
await this.loadIncidentDetail(msg.incident_id);
|
||||
|
||||
// Progress-Bar nicht sofort ausblenden — auf refresh_summary warten
|
||||
// Progress-Popup nicht sofort ausblenden — auf refresh_summary warten
|
||||
this._pendingComplete = msg.incident_id;
|
||||
// Fallback: Wenn nach 5s kein refresh_summary kommt → direkt ausblenden
|
||||
if (this._pendingCompleteTimer) clearTimeout(this._pendingCompleteTimer);
|
||||
this._pendingCompleteTimer = setTimeout(() => {
|
||||
if (this._pendingComplete === msg.incident_id) {
|
||||
this._pendingComplete = null;
|
||||
UI.hideProgress();
|
||||
UI.hideProgress(msg.incident_id);
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
@@ -2065,8 +2076,7 @@ async handleRefresh() {
|
||||
this._pendingCompleteTimer = null;
|
||||
}
|
||||
this._pendingComplete = null;
|
||||
UI.showProgressComplete(d);
|
||||
setTimeout(() => UI.hideProgress(), 4000);
|
||||
UI.showProgressComplete(d, msg.incident_id);
|
||||
}
|
||||
|
||||
// Toast-Text zusammenbauen
|
||||
@@ -2145,7 +2155,7 @@ async handleRefresh() {
|
||||
this._pendingCompleteTimer = null;
|
||||
}
|
||||
this._pendingComplete = null;
|
||||
UI.showProgressError(msg.data.error, false);
|
||||
UI.showProgressError(msg.data.error, false, 0, msg.incident_id);
|
||||
}
|
||||
UI.showToast(`Recherche-Fehler: ${msg.data.error}`, 'error');
|
||||
},
|
||||
@@ -2160,11 +2170,19 @@ async handleRefresh() {
|
||||
this._pendingCompleteTimer = null;
|
||||
}
|
||||
this._pendingComplete = null;
|
||||
UI.hideProgress();
|
||||
UI.hideProgress(msg.incident_id);
|
||||
}
|
||||
UI.showToast('Recherche abgebrochen.', 'info');
|
||||
},
|
||||
|
||||
minimizeProgress() {
|
||||
UI.minimizeProgress(this.currentIncidentId);
|
||||
},
|
||||
|
||||
openProgressPopup() {
|
||||
UI.openProgressPopup(this.currentIncidentId);
|
||||
},
|
||||
|
||||
async cancelRefresh() {
|
||||
if (!this.currentIncidentId) return;
|
||||
const ok = await confirmDialog('Laufende Recherche abbrechen?');
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren