diff --git a/src/app/(app)/collection-pool/page.tsx b/src/app/(app)/collection-pool/page.tsx index b0e4dfa..5463908 100644 --- a/src/app/(app)/collection-pool/page.tsx +++ b/src/app/(app)/collection-pool/page.tsx @@ -26,7 +26,9 @@ import { getAssignmentBadge, buildProximityMarkerMap, buildVisibleRows, + type CollectionPoolGroup, type CollectionPoolSortMode, + type CollectionPoolViewRow, getAssignmentState, getPoolAgeLabel, } from "./view-model"; @@ -718,3 +720,149 @@ function PoolRow({ ); } + +function SupplierGroup({ + group, + busy, + todayYmd, + selectedIds, + collapsed, + onToggleRowSelected, + onToggleSectionSelected, + onToggleCollapsed, + onOpenAssign, + onOpenBulkAssign, + onToggleReady, +}: { + group: Omit & { rows: CollectionPoolVisibleRow[] }; + busy: boolean; + todayYmd: string; + selectedIds: Set; + collapsed: boolean; + onToggleRowSelected: (rowId: string) => void; + onToggleSectionSelected: (rowIds: string[]) => void; + onToggleCollapsed: (supplierId: string) => void; + onOpenAssign: (row: CollectionPoolVisibleRow) => void; + onOpenBulkAssign: (supplierId: string, supplierName: string, rowIds: string[]) => void; + onToggleReady: (row: CollectionPoolVisibleRow, ready: boolean) => void; +}) { + const rowIds = group.rows.map((r) => r.id); + const selectedCount = rowIds.filter((id) => selectedIds.has(id)).length; + const allSelected = selectedCount === rowIds.length && rowIds.length > 0; + const someSelected = selectedCount > 0 && !allSelected; + const allAssigned = group.rows.every( + (r) => getAssignmentState(r, todayYmd) !== "unassigned", + ); + + const eyebrowText = (() => { + if (group.topPoNumbers.length === 0) return null; + const head = group.topPoNumbers.map((p) => `PO ${p}`).join(", "); + return group.remainingPoCount > 0 + ? `${head} (+${group.remainingPoCount} more)` + : head; + })(); + + const assignLabel = allSelected + ? `Assign all ${rowIds.length} ${rowIds.length === 1 ? "stop" : "stops"}` + : selectedCount > 0 + ? `Assign ${selectedCount} selected` + : `Assign all ${rowIds.length} ${rowIds.length === 1 ? "stop" : "stops"}`; + + return ( +
+
+ +
+

+ {group.supplierName || "Unknown supplier"} +

+ · + + {rowIds.length} {rowIds.length === 1 ? "stop" : "stops"} + + {eyebrowText && ( + <> + · + {eyebrowText} + + )} +
+
+ {rowIds.length > 0 && ( + { + if (el) el.indeterminate = someSelected; + }} + onChange={() => onToggleSectionSelected(rowIds)} + disabled={busy} + aria-label={`Select all stops at ${group.supplierName || "unknown supplier"}`} + className="size-4 shrink-0 cursor-pointer accent-primary disabled:cursor-not-allowed" + /> + )} + + +
+
+
+
    + {group.rows.map((row) => ( + + ))} +
+
+
+ ); +}