diff --git a/srv/poe_manager/app.py b/srv/poe_manager/app.py index d08b1b4..f5ff19c 100644 --- a/srv/poe_manager/app.py +++ b/srv/poe_manager/app.py @@ -1264,14 +1264,28 @@ def _restart_check_service(): def run_check_now(): """Manueller 'Jetzt prüfen'-Trigger (Zahnrad-Icon neben dem Prüf-Timer): startet denselben Service neu wie eine Intervalländerung — das erzeugt - sofort ein frisches Logfile mit einem neuen Durchlauf, der Countdown - 'Nächste Prüfung' setzt sich dadurch automatisch auf den manuell - ausgelösten Zeitpunkt zurück.""" + sofort ein frisches Logfile mit einem neuen Durchlauf. Liefert den neuen + Zeitpunkt direkt in der Antwort mit, damit app.js den Topbar-Countdown + auf JEDER Seite zurücksetzen kann (vorher aktualisierte nur die + Dashboard-eigene Live-Aktualisierung die Anzeige — auf allen anderen + Seiten lief der Countdown mit dem alten Zeitpunkt weiter, obwohl im + Hintergrund längst neu geprüft wurde).""" if not current_user.is_admin: return {"success": False, "msg": "Keine Berechtigung."}, 403 _restart_check_service() log_action("check.run_now", "Prüfintervall") - return {"success": True, "msg": "Prüfung gestartet."} + # Kurz warten, bis der frisch gestartete Dienst den ersten Durchlauf ins + # neue Logfile geschrieben hat — dann kann die Antwort den aktuellen + # Zeitpunkt direkt mitliefern, ohne dass das Frontend dafür einen + # zweiten Request/Endpunkt braucht (Flask läuft threaded, blockiert also + # keine anderen Anfragen währenddessen). + time.sleep(1.5) + last_run_at = get_last_run_at() + return { + "success": True, + "msg": "Prüfung gestartet.", + "last_run_epoch_ms": int(last_run_at.timestamp() * 1000) if last_run_at else None, + } # --------------------------------------------------------------------------- diff --git a/srv/poe_manager/static/js/app.js b/srv/poe_manager/static/js/app.js index dfb1128..89f0b9b 100644 --- a/srv/poe_manager/static/js/app.js +++ b/srv/poe_manager/static/js/app.js @@ -297,13 +297,20 @@ return; } window.showToast(data.msg || "Prüfung gestartet.", "success"); - // Der Service braucht einen Moment, um neu zu starten und den - // ersten Durchlauf ins frische Logfile zu schreiben. - setTimeout(() => { - document.dispatchEvent(new CustomEvent("poe:check-triggered")); - btn.disabled = false; - btn.classList.remove("spinning"); - }, 1500); + document.dispatchEvent(new CustomEvent("poe:check-triggered")); + // Topbar-Countdown auf JEDER Seite aktualisieren, nicht nur auf + // dem Dashboard — vorher lief er auf allen anderen Seiten mit dem + // alten Zeitpunkt weiter, obwohl im Hintergrund längst neu geprüft + // wurde (die Prüfung lief trotzdem korrekt, nur sichtbar tat sich + // nichts). Der Server liefert den frischen Zeitpunkt direkt in + // dieser Antwort mit (siehe run_check_now) statt eines zweiten + // Requests dafür. + const pill = document.getElementById("global-timer-pill"); + if (pill && data.last_run_epoch_ms) { + pill.dataset.lastRunMs = data.last_run_epoch_ms; + } + btn.disabled = false; + btn.classList.remove("spinning"); }) .catch(() => { window.showToast("Fehler beim Starten der Prüfung.", "danger");