// Dashboard — overview with metrics, recent requests, deadlines function Dashboard({ go }) { const reqs = window.REQUESTS; const overdue = reqs.filter(r => r.status === "overdue").length; const inProgress = reqs.filter(r => ["in-progress","sent","acknowledged"].includes(r.status)).length; const fulfilled = reqs.filter(r => r.status === "fulfilled").length; const drafts = reqs.filter(r => r.status === "draft").length; const Metric = ({ label, value, sub, tone = "neutral" }) => { const c = { neutral: "var(--text)", info: "var(--accent)", danger: "var(--danger-fg)", ok: "var(--ok-fg)" }[tone]; return (
{label}
{value}
{sub}
); }; return (
}>Dashboard
Active requests
{reqs.filter(r => r.status !== "fulfilled" && r.status !== "refused").slice(0, 5).map((r) => { const elapsed = r.workingDaysElapsed; const pct = (elapsed / 20) * 100; const tone = r.status === "overdue" ? "danger" : pct > 70 ? "warn" : "info"; return (
{r.id}
{r.title}
{r.recipientName} Day {elapsed} / 20
); })}
Inbox · LLM-extracted
{window.INBOX.slice(0, 4).map((m) => (
{m.fromName}
{m.receivedAt.slice(5,10)}
{m.extracted.responseClassification}
))}
This week
Working-day countdown · England & Wales
{["Mon 25","Tue 26","Wed 27","Thu 28","Fri 29"].map((d, i) => (
{d}
{["2 due","—","1 due","3 due","1 overdue"][i]}
))}
); } Object.assign(window, { Dashboard });