// Cases view — real case list, not alerts. const { useState: useCaseState, useMemo: useCaseMemo } = React; function CaseStatusPill({ status }) { const map = { open: { cls: "pill info", label: "Open" }, in_review: { cls: "pill med", label: "In review" }, escalated: { cls: "pill high", label: "Escalated" }, closed: { cls: "pill low", label: "Closed" }, }; const m = map[status] || { cls: "pill", label: status }; return {m.label}; } function CasesView({ data, onOpenCase }) { const cases = data?.cases || window.CASES_API || []; const [statusFilter, setStatusFilter] = useCaseState("all"); const [sortBy, setSortBy] = useCaseState("opened"); const filtered = useCaseMemo(() => { let r = cases; if (statusFilter !== "all") { r = r.filter(c => c.status === statusFilter); } r = [...r].sort((a, b) => { if (sortBy === "risk") return b.risk - a.risk; if (sortBy === "alerts") return b.alerts - a.alerts; return new Date(b.opened) - new Date(a.opened); }); return r; }, [cases, statusFilter, sortBy]); const counts = useCaseMemo(() => ({ all: cases.length, open: cases.filter(c => c.status === "open").length, in_review: cases.filter(c => c.status === "in_review").length, escalated: cases.filter(c => c.status === "escalated").length, closed: cases.filter(c => c.status === "closed").length, }), [cases]); return ( <>
{filtered.map(c => ( onOpenCase?.(c)} style={{ cursor: "pointer" }}> ))}
Case Status Priority Customer Risk Alerts Amount Assignee Opened
{c.id}
{c.title}
{c.priority} {c.customerId || "—"} {c.risk} {c.alerts} {formatAmount(c.amount, "USD")} {c.assignee} {new Date(c.opened).toLocaleString()}
Showing {filtered.length} of {cases.length} cases
); } Object.assign(window, { CasesView });