--- title: Decisions --- ```js const API = "http://127.0.0.1:8000"; const POLL = 15_000; ``` ```js const decState = (async function*() { while (true) { let data = [], ok = false; try { const r = await fetch(`${API}/decisions/?limit=500`); ok = r.ok; data = ok ? await r.json() : []; } catch {} yield {data, ok, ts: new Date()}; await new Promise(res => setTimeout(res, POLL)); } })(); ``` ```js const data = decState.data ?? []; const _ok = decState.ok ?? false; const _ts = decState.ts; const pending = data.filter(d => d.decision_type === "pending"); const made = data.filter(d => d.decision_type === "made"); ``` # Decisions ```js display(html`
`); ``` ```js const tab = view(Inputs.select(["Pending", "Made"], {label: "View"})); ``` ```js const shown = tab === "Pending" ? pending : made; display(Inputs.table(shown.map(d => ({ Title: d.title, Status: d.status + (d.escalation_note ? " ⚠️" : ""), Decided_by: d.decided_by ?? "—", Deadline: d.deadline ? new Date(d.deadline).toLocaleDateString() : "—", Rationale: (d.rationale ?? "").slice(0, 80), Updated: new Date(d.updated_at).toLocaleDateString(), })), {rows: 30})); ``` ```js if (tab === "Pending" && pending.filter(d => d.escalation_note).length > 0) { display(html`No resolved decisions yet.
` : Plot.plot({ title: "Decisions resolved per month", x: {label: "Month", tickRotate: -30}, y: {label: "Count", grid: true}, marks: [ Plot.barY(byMonth, {x: "month", y: "count", fill: "steelblue", tip: true}), Plot.ruleY([0]), ], marginBottom: 60, width: 700, }) ); ```