diff --git a/src/app/(app)/collection-pool/page.tsx b/src/app/(app)/collection-pool/page.tsx index b1828b1..b0e4dfa 100644 --- a/src/app/(app)/collection-pool/page.tsx +++ b/src/app/(app)/collection-pool/page.tsx @@ -114,6 +114,29 @@ export default function CollectionPoolPage() { const [assignDialog, setAssignDialog] = useState(null); const [readyDialogRow, setReadyDialogRow] = useState(null); const [readyDialogError, setReadyDialogError] = useState(null); + const [selectedIds, setSelectedIds] = useState>(new Set()); + + const toggleRowSelected = useCallback((rowId: string) => { + setSelectedIds((prev) => { + const next = new Set(prev); + if (next.has(rowId)) next.delete(rowId); + else next.add(rowId); + return next; + }); + }, []); + + const toggleSectionSelected = useCallback((rowIds: string[]) => { + setSelectedIds((prev) => { + const allSelected = rowIds.every((id) => prev.has(id)); + const next = new Set(prev); + if (allSelected) { + for (const id of rowIds) next.delete(id); + } else { + for (const id of rowIds) next.add(id); + } + return next; + }); + }, []); const closeAssignDialog = useCallback(() => setAssignDialog(null), []); @@ -493,6 +516,8 @@ export default function CollectionPoolPage() { busy={busyId === row.id} markerToken={supplierMarkerMap.get(row.supplierId)} todayYmd={todayYmd} + selected={selectedIds.has(row.id)} + onToggleSelected={toggleRowSelected} onOpenAssign={openAssignForRow} onToggleReady={handleToggleReady} /> @@ -553,6 +578,8 @@ function PoolRow({ busy, markerToken, todayYmd, + selected, + onToggleSelected, onOpenAssign, onToggleReady, }: { @@ -560,6 +587,8 @@ function PoolRow({ busy: boolean; markerToken?: string; todayYmd: string; + selected: boolean; + onToggleSelected: (rowId: string) => void; onOpenAssign: (row: CollectionPoolVisibleRow) => void; onToggleReady: (row: CollectionPoolVisibleRow, ready: boolean) => void; }) { @@ -576,24 +605,40 @@ function PoolRow({ : null; return ( -
  • +
  • -
    -

    {row.supplierName}

    -

    {row.description || "(no description)"}

    -
    - {row.customerName || "No customer"} - / - {row.companyName || "No company"} -
    - {!row.purchase_order && ( -
    - - This row has no purchase order link. The PO may have been deleted. +
    + onToggleSelected(row.id)} + disabled={busy} + aria-label={`Select ${row.description ?? "item"} at ${row.supplierName ?? "unknown supplier"}`} + className="mt-1 size-4 shrink-0 cursor-pointer accent-primary disabled:cursor-not-allowed" + /> +
    +

    {row.supplierName}

    +

    {row.description || "(no description)"}

    +
    + {row.customerName || "No customer"} + / + {row.companyName || "No company"}
    - )} + {!row.purchase_order && ( +
    + + This row has no purchase order link. The PO may have been deleted. +
    + )} +