feat: show next continuous run on dashboard
ci / lint (push) Successful in 15s
ci / validate (push) Successful in 6s
ci / publish (push) Failing after 2s

This commit is contained in:
2026-06-28 00:38:18 +02:00
parent 24d4898865
commit d3beeb6b2d
2 changed files with 15 additions and 0 deletions
+14
View File
@@ -524,6 +524,7 @@ function renderContinuous(accountId, data) {
panel.querySelector('.continuous-last-iteration').textContent = status.last_iteration_at panel.querySelector('.continuous-last-iteration').textContent = status.last_iteration_at
? `${relativeTime(status.last_iteration_at)} (${displayTime(status.last_iteration_at)})` ? `${relativeTime(status.last_iteration_at)} (${displayTime(status.last_iteration_at)})`
: '-'; : '-';
panel.querySelector('.continuous-next-run').textContent = nextContinuousRunLabel(config, status);
panel.querySelector('.continuous-last-error').textContent = status.last_error || '-'; panel.querySelector('.continuous-last-error').textContent = status.last_error || '-';
// Logs // Logs
@@ -596,6 +597,19 @@ function normalizeLogEntry(entry) {
}; };
} }
function nextContinuousRunLabel(config, status) {
if (!config.enabled) return '-';
if (status.running) return 'running now';
const baseValue = status.last_iteration_at || status.last_finished_at || status.last_started_at;
if (!baseValue) return 'pending';
const baseDate = new Date(baseValue);
if (Number.isNaN(baseDate.getTime())) return 'pending';
const intervalMs = Math.max(1, Number(config.interval_minutes || 1)) * 60 * 1000;
const nextDate = new Date(baseDate.getTime() + intervalMs);
if (nextDate.getTime() <= Date.now()) return 'due now';
return displayTime(nextDate.toISOString());
}
function renderSummary(accountId, data) { function renderSummary(accountId, data) {
const panel = document.getElementById(`panel-${accountId}`); const panel = document.getElementById(`panel-${accountId}`);
if (!panel) return; if (!panel) return;
+1
View File
@@ -259,6 +259,7 @@
<div class="continuous-meta"> <div class="continuous-meta">
<div>Status: <span class="continuous-status">-</span></div> <div>Status: <span class="continuous-status">-</span></div>
<div>Last run: <span class="continuous-last-iteration">-</span></div> <div>Last run: <span class="continuous-last-iteration">-</span></div>
<div>Next run: <span class="continuous-next-run">-</span></div>
<div>Last error: <span class="continuous-last-error">-</span></div> <div>Last error: <span class="continuous-last-error">-</span></div>
</div> </div>