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 = `
No active task
`; return; } const parentTrail = await buildParentTrail(task); const breadcrumbHtml = parentTrail.length > 0 ? `` : ''; const elapsed = task.startedAt ? formatElapsed(new Date(task.startedAt)) : ''; container.innerHTML = `
${esc(task.title)}
${breadcrumbHtml} ${task.description ? `
${esc(task.description)}
` : ''} ${task.category ? `
Category: ${esc(task.category)}
` : ''} ${elapsed ? `
Active for ${elapsed}
` : ''}
`; 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]) => `
${count}
${status}
`).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; }