// 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 });