Skip to content

Commit d2a9fc9

Browse files
add start/completion timestamps and orange running indicator to dashboard
1 parent 61ba35a commit d2a9fc9

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

‎src/dashboard/render.ts‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export function renderDashboardHtml(): string {
5252
.project-nav-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #58a6ff; font-weight: 600; }
5353
.project-nav-item.selected .project-nav-name { color: #79c0ff; }
5454
.project-nav-count { font-size: 0.7rem; padding: 1px 7px; border-radius: 9px; background: #30363d; color: #c9d1d9; }
55-
.project-nav-running { width: 8px; height: 8px; border-radius: 50%; background: #1f6feb; flex: 0 0 8px; }
55+
.project-nav-running { width: 8px; height: 8px; border-radius: 50%; background: #fe7d37; flex: 0 0 8px; box-shadow: 0 0 6px #fe7d3780; }
5656
.project { margin-bottom: 24px; border: 1px solid #30363d; border-radius: 8px; padding: 12px 16px; background: #161b22; }
5757
.project-header { font-weight: 600; font-size: 1.1rem; margin-bottom: 10px; color: #58a6ff; }
5858
.empty-state { padding: 24px; color: #8b949e; font-size: 0.9rem; text-align: center; }
@@ -179,6 +179,20 @@ export function renderDashboardHtml(): string {
179179
});
180180
}
181181
182+
function fmtTime(ts) {
183+
if (!ts || ts === 0) return '';
184+
var d = new Date(ts);
185+
var pad = function(n) { return n < 10 ? '0' + n : String(n); };
186+
var month = pad(d.getMonth() + 1);
187+
var day = pad(d.getDate());
188+
var year = d.getFullYear();
189+
var hours = d.getHours();
190+
var ampm = hours >= 12 ? 'PM' : 'AM';
191+
hours = hours % 12;
192+
if (hours === 0) hours = 12;
193+
return month + '-' + day + '-' + year + ' ' + hours + ':' + pad(d.getMinutes()) + ' ' + ampm;
194+
}
195+
182196
function statusClass(status) {
183197
return 'status-badge status-' + status;
184198
}
@@ -396,12 +410,20 @@ export function renderDashboardHtml(): string {
396410
infoTarget.appendChild(nameStrong);
397411
398412
var infoParts = [
413+
fmtTime(lp.startedAt),
399414
'phase: ' + lp.phase,
400415
'iteration ' + lp.iteration + '/' + lp.maxIterations,
401416
'section ' + lp.currentSectionIndex + '/' + lp.totalSections,
402417
];
403418
if (dashLoop.duration) infoParts.push(dashLoop.duration);
404419
infoTarget.appendChild(document.createTextNode(' — ' + infoParts.join(', ')));
420+
if (lp.status !== 'running' && lp.completedAt) {
421+
infoTarget.appendChild(document.createTextNode(' — '));
422+
var doneSpan = document.createElement('span');
423+
doneSpan.className = 'dim';
424+
doneSpan.textContent = 'done: ' + fmtTime(lp.completedAt);
425+
infoTarget.appendChild(doneSpan);
426+
}
405427
406428
if (lp.terminationReason) {
407429
infoTarget.appendChild(document.createTextNode(' — '));

0 commit comments

Comments
 (0)