onRowSelectionChange computed the next selection from the render-time `rowSelection` closure, which could be stale by the time a second row was toggled. The updater then produced a selection containing only the latest row, and the persistedMap sync deleted the earlier one — so checking a second part unchecked the first, making multi-select behave as single-select. Track the latest selection in a ref and derive the updater from it, so each toggle builds on the current selection. Fixes adding multiple parts/services/ expense items in invoices, estimates, and job cards. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Next.js template
This is a Next.js template with shadcn/ui.
Adding components
To add components to your app, run the following command:
npx shadcn@latest add button
This will place the ui components in the components directory.
Using components
To use the components in your app, import them as follows:
import { Button } from "@/components/ui/button";