// ReviewQueue — compact list of staged transactions function ReviewQueue({ entity, transactions, selectedId, onSelect, sort, setSort, filters, setFilters, onOpenPalette }) { const [filterOpen, setFilterOpen] = React.useState(false); // Apply filters const cutoffDays = { today: 0, "7d": 7, "30d": 30, "this-month": 30 }; const filtered = transactions.filter(t => { if (entity !== "all" && t.entity !== entity) return false; // Date if (filters.dateRange !== "all" && filters.dateRange !== "custom") { const days = cutoffDays[filters.dateRange]; const cutoff = new Date("2026-03-08"); // anchor "now" cutoff.setDate(cutoff.getDate() - days); if (new Date(t.date) < cutoff) return false; } else if (filters.dateRange === "custom") { if (filters.dateFrom && t.date < filters.dateFrom) return false; if (filters.dateTo && t.date > filters.dateTo) return false; } // Categories if (filters.categories.size > 0) { const cat = (t.suggestedAccount || "").split(":").slice(2).join(":"); const hit = [...filters.categories].some(c => cat.includes(c)); if (!hit) return false; } // Tiers if (filters.tiers.size > 0 && !filters.tiers.has(t.tier)) return false; // Confidence if ((t.score ?? 0) < filters.confidenceMin) return false; // Currency if (filters.ccy.size > 0 && !filters.ccy.has(t.ccy)) return false; return true; }); const activeCount = (filters.dateRange !== "all" ? 1 : 0) + (filters.categories.size > 0 ? 1 : 0) + (filters.tiers.size > 0 ? 1 : 0) + (filters.ccy.size > 0 ? 1 : 0) + (filters.confidenceMin > 0 ? 1 : 0); const sorted = [...filtered].sort((a, b) => { if (sort === "date-desc") return b.date.localeCompare(a.date); if (sort === "date-asc") return a.date.localeCompare(b.date); if (sort === "conf-asc") return (a.score ?? -1) - (b.score ?? -1); if (sort === "conf-desc") return (b.score ?? -1) - (a.score ?? -1); if (sort === "entity") return a.entity.localeCompare(b.entity); return 0; }); return (