/* Inbox / cases dashboard */ const InboxView = ({ data, onOpen, onNew }) => { const [filter, setFilter] = React.useState("all"); const [query, setQuery] = React.useState(""); const [selected, setSelected] = React.useState(new Set()); const counts = React.useMemo(() => { const c = { all: data.cases.length, processing: 0, review: 0, approved: 0, error: 0 }; data.cases.forEach((x) => (c[x.status] = (c[x.status] || 0) + 1)); return c; }, [data]); const rows = data.cases.filter( (c) => (filter === "all" || c.status === filter) && (query === "" || c.ref.toLowerCase().includes(query.toLowerCase()) || c.sender.toLowerCase().includes(query.toLowerCase()) || c.consignee.toLowerCase().includes(query.toLowerCase())) ); const toggle = (id) => { const n = new Set(selected); n.has(id) ? n.delete(id) : n.add(id); setSelected(n); }; return (

Boîte de réception

{data.cases.length} expéditions · {counts.review} à vérifier
{[ ["all","Tous"], ["processing","En traitement"], ["review","À vérifier"], ["approved","Validés"], ["error","Erreur"], ].map(([k,l]) => ( ))}
setQuery(e.target.value)}/> ⌘ K
{selected.size > 0 && (
{selected.size} sélectionné{selected.size>1?"s":""}
)}
{rows.map((c) => ( onOpen(c.id)} style={{cursor:"pointer"}}> ))}
0} onChange={() => setSelected(selected.size===rows.length?new Set():new Set(rows.map(r=>r.id)))} /> Référence Expéditeur → Destinataire Itinéraire Source Statut À vérifier Reçu
{e.stopPropagation(); toggle(c.id);}}>
{c.ref}
{c.weight} · {c.value}
{c.sender}
→ {c.consignee}
{c.route.split(" → ").map((p, i, a) => ( {p} {i < a.length - 1 && } ))}
{c.status === "review" ? ( {c.needsReview} champ{c.needsReview>1?"s":""} ) : c.status === "error" ? ( {c.errorMsg} ) : c.status === "processing" ? ( ) : ( )} {c.received}
Affichage 1–{rows.length} sur {data.cases.length}
); }; window.InboxView = InboxView;