diff --git a/packages/material-react-table/src/components/inputs/MRT_SelectCheckbox.tsx b/packages/material-react-table/src/components/inputs/MRT_SelectCheckbox.tsx index 03c3f53d6..346c14673 100644 --- a/packages/material-react-table/src/components/inputs/MRT_SelectCheckbox.tsx +++ b/packages/material-react-table/src/components/inputs/MRT_SelectCheckbox.tsx @@ -43,10 +43,15 @@ export const MRT_SelectCheckbox = ({ const selectAll = !row; + const getLeafRows = () => ( + selectAllMode === 'page' + ? table.getPaginationRowModel().flatRows + : table.getPrePaginationRowModel().flatRows + ).filter((r) => !r.getIsGrouped()); + + // Fix: getIsAllPageRowsSelected() / getIsAllRowsSelected() include group rows const allRowsSelected = selectAll - ? selectAllMode === 'page' - ? table.getIsAllPageRowsSelected() - : table.getIsAllRowsSelected() + ? getLeafRows().every((r) => r.getIsSelected()) : undefined; const isChecked = selectAll @@ -122,7 +127,8 @@ export const MRT_SelectCheckbox = ({ r.getIsSelected()) : row?.getIsSomeSelected() && row.getCanSelectSubRows() } {...commonProps} diff --git a/packages/material-react-table/src/utils/row.utils.ts b/packages/material-react-table/src/utils/row.utils.ts index 576bc0060..bc17dddea 100644 --- a/packages/material-react-table/src/utils/row.utils.ts +++ b/packages/material-react-table/src/utils/row.utils.ts @@ -175,6 +175,16 @@ export const getMRT_RowSelectionHandler = const wasCurrentRowChecked = getIsRowSelected({ row, table }); + // Fix: toggleSelected() on a group row also writes its own ID into rowSelection + // Removing it, keeping only the leaf row IDs + if (row.getIsGrouped()) { + table.setRowSelection((prev) => { + const next = { ...prev }; + delete next[row.id]; + return next; + }); + } + // toggle selection of this row row.toggleSelected(value ?? !wasCurrentRowChecked); @@ -250,9 +260,17 @@ export const getMRT_SelectAllHandler = refs: { lastSelectedRowId }, } = table; - selectAllMode === 'all' || forceAll - ? table.toggleAllRowsSelected(value ?? (event as any).target.checked) - : table.toggleAllPageRowsSelected(value ?? (event as any).target.checked); + // Fix: replaces toggleAllPageRowsSelected() / toggleAllRowsSelected() which + // include group rows in flatRows, causing group IDs to pollute rowSelection. + const checked = value ?? (event as any).target.checked; + const rows = (selectAllMode === 'all' || forceAll + ? table.getPrePaginationRowModel().flatRows + : table.getPaginationRowModel().flatRows + ).filter((row) => !row.getIsGrouped()); + rows.forEach((row) => { + if (row.getCanSelect()) row.toggleSelected(checked); + }); + if (enableRowPinning && rowPinningDisplayMode?.includes('select')) { table.setRowPinning({ bottom: [], top: [] }); }