// Case detail view — drill into a real case and see attached alerts. const { useState: useCaseState, useEffect: useCaseEffect } = React; function formatAmount(n, cur) { const sym = { USD: "$", EUR: "€", GBP: "£", MXN: "MX$" }[cur] || ""; return sym + Number(n || 0).toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function formatDate(iso) { if (!iso) return "—"; return new Date(iso).toLocaleString(undefined, { month: "short", day: "numeric", year: "numeric", hour: "2-digit", minute: "2-digit" }); } 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" }, sar_filed: { cls: "pill high", label: "SAR filed" }, }; const m = map[status] || { cls: "pill", label: status }; return {m.label}; } function SeverityDot({ s }) { const cls = s === "high" || s === "critical" ? "dot-high" : s === "med" || s === "medium" ? "dot-med" : "dot-low"; return ; } function AlertNotesPanel({ alert, onOpenAlert }) { const notes = alert._raw?.notes || alert.notes || []; return (
Details
{alert._raw?.description || alert.title || "No description."}
{alert.typology} {alert.rule} risk {alert.risk}
{onOpenAlert && (
{ e.stopPropagation(); onOpenAlert(alert); }}> Open alert page →
)}
Notes
{notes.length === 0 && (
No notes on this alert.
)} {notes.length > 0 && (
{notes.slice().reverse().map((n, i) => (
{n.content}
{n.created_by_name || "Unknown"} · {formatDate(n.created_at)}
))}
)}
); } function CaseDetailPage({ caseItem, onClose, onOpenAlert, data }) { const [alerts, setAlerts] = useCaseState([]); const [loading, setLoading] = useCaseState(false); const [error, setError] = useCaseState(null); const [comment, setComment] = useCaseState(""); const [posting, setPosting] = useCaseState(false); const [message, setMessage] = useCaseState(null); const [expandedAlertId, setExpandedAlertId] = useCaseState(null); const [escalating, setEscalating] = useCaseState(false); const [escalateMessage, setEscalateMessage] = useCaseState(null); const caseId = caseItem._raw?.id || caseItem.id; const loadAlerts = async () => { setLoading(true); setError(null); try { const result = await window.mossadApi.fetchCaseAlerts(caseId); setAlerts(Array.isArray(result) ? result.map(window.mossadApi.mapAlert) : []); } catch (err) { setError("Failed to load alerts: " + err.message); } finally { setLoading(false); } }; useCaseEffect(() => { loadAlerts(); }, [caseId]); const postComment = async () => { if (!comment.trim()) return; setPosting(true); setMessage(null); try { await window.mossadApi.addCaseComment(caseId, comment.trim()); setComment(""); setMessage({ type: "ok", text: "Comment added" }); if (data?.refresh) await data.refresh(); } catch (err) { setMessage({ type: "error", text: "Failed to add comment: " + err.message }); } finally { setPosting(false); } }; const toggleAlert = (id) => { setExpandedAlertId(expanded => expanded === id ? null : id); }; const escalateToSAR = async () => { if (!window.confirm(`Escalate case ${caseItem.external_id || caseItem.id} to SAR review?`)) return; setEscalating(true); setEscalateMessage(null); try { const result = await window.mossadApi.createSAR({ case_id: caseId, suspicious_activity_description: `Escalated from case ${caseItem.external_id || caseItem.id}: ${caseItem.title}`, }); setEscalateMessage({ type: "ok", text: `SAR draft created: ${result.external_id}` }); if (data?.refresh) await data.refresh(); } catch (err) { setEscalateMessage({ type: "error", text: "Failed to escalate to SAR: " + err.message }); } finally { setEscalating(false); } }; return (
· {caseItem.id}

Case overview

{caseItem.title}

{caseItem.priority}
Entity
{caseItem.entity}
Risk score
{caseItem.risk}
Alerts
{caseItem.alerts}
Amount
{formatAmount(caseItem.amount, "USD")}
Assignee
{caseItem.assignee}
Opened
{formatDate(caseItem.opened)}
{escalateMessage && (
{escalateMessage.text}
)}

Add comment

{message && (
{message.text}
)}