From ed14849cdc3d3362b8b1c7435a09fd42d8f54322 Mon Sep 17 00:00:00 2001 From: VC-Semih <55637588+VC-Semih@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:29:22 -0400 Subject: [PATCH 1/2] fix(selection): prevent group row ID from leaking into rowSelection when grouping TanStack's toggleSelected() on a group row correctly propagates to leaf rows but also writes the synthetic group row ID (ex: "city:Paris": true) into rowSelection as a side effect. After the toggle, removing the group row ID from rowSelection via setRowSelection, leaving only the leaf row IDs. Fixes #1226 --- .../src/utils/row.utils.ts | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) 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: [] }); } From 6471515b610cdb0e1c65433ca259daff29dfd248 Mon Sep 17 00:00:00 2001 From: VC-Semih <55637588+VC-Semih@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:32:21 -0400 Subject: [PATCH 2/2] fix(selection): recalculate header checkbox state from leaf rows only when grouping getIsAllPageRowsSelected(), getIsAllRowsSelected(), and getIsSomeRowsSelected() include group rows in their denominator, so the header checkbox checked and indeterminate states couldn't resolve correctly when grouping was active. Replaced all three with a leaf-only helper that filters flatRows with getIsGrouped(). Fixes #1226 --- .../src/components/inputs/MRT_SelectCheckbox.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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}