import * as api from '../api.js';
const el = () => document.getElementById('page-dashboard');
export function initDashboard() {
el().innerHTML = `
Dashboard
Task Summary
Recent Activity (8 hours)
`;
}
export async function refreshDashboard() {
try {
const [active, allTasks, summary] = await Promise.all([
api.tasks.active(),
api.tasks.list(null, { includeSubTasks: true }),
api.context.summary(),
]);
await renderActiveTask(active);
renderStats(allTasks);
renderContextSummary(summary);
} catch (e) {
console.error('Dashboard refresh failed:', e);
}
}
async function buildParentTrail(task) {
const trail = [];
let current = task;
while (current.parentTaskId) {
try {
current = await api.tasks.get(current.parentTaskId);
trail.unshift({ id: current.id, title: current.title });
} catch {
break;
}
}
return trail;
}
async function renderActiveTask(task) {
const container = document.getElementById('dash-active-task');
if (!task) {
container.innerHTML = ``;
return;
}
const parentTrail = await buildParentTrail(task);
const breadcrumbHtml = parentTrail.length > 0
? `${parentTrail.map(p => `${esc(p.title)}/`).join('')}${esc(task.title)}
`
: '';
const elapsed = task.startedAt ? formatElapsed(new Date(task.startedAt)) : '';
container.innerHTML = `
`;
container.querySelectorAll('[data-action]').forEach(btn => {
btn.addEventListener('click', async () => {
const action = btn.dataset.action;
const id = btn.dataset.id;
try {
if (action === 'pause') await api.tasks.pause(id);
else if (action === 'complete') await api.tasks.complete(id);
refreshDashboard();
} catch (e) { alert(e.message); }
});
});
}
function renderStats(allTasks) {
const counts = { Pending: 0, Active: 0, Paused: 0, Completed: 0, Abandoned: 0 };
allTasks.forEach(t => counts[t.status] = (counts[t.status] || 0) + 1);
const container = document.getElementById('dash-stats');
container.innerHTML = Object.entries(counts).map(([status, count]) => `
`).join('');
}
function renderContextSummary(summary) {
const container = document.getElementById('dash-context');
if (!summary || summary.length === 0) {
container.innerHTML = `No recent activity
`;
return;
}
container.innerHTML = summary.slice(0, 10).map(item => `
${esc(item.appName)}
${esc(item.category)}
${item.eventCount}
`).join('');
}
function formatElapsed(since) {
const diff = Math.floor((Date.now() - since.getTime()) / 1000);
if (diff < 60) return `${diff}s`;
if (diff < 3600) return `${Math.floor(diff / 60)}m`;
const h = Math.floor(diff / 3600);
const m = Math.floor((diff % 3600) / 60);
return `${h}h ${m}m`;
}
function esc(str) {
if (!str) return '';
const d = document.createElement('div');
d.textContent = str;
return d.innerHTML;
}