diff --git a/examples/alpine/expanding/index.html b/examples/alpine/expanding/index.html index a5af369b53..5ba78f4f55 100644 --- a/examples/alpine/expanding/index.html +++ b/examples/alpine/expanding/index.html @@ -97,7 +97,7 @@ diff --git a/examples/angular/expanding/src/app/expandable-cell/expandable-cell.ts b/examples/angular/expanding/src/app/expandable-cell/expandable-cell.ts index a4960814c8..7667296c2d 100644 --- a/examples/angular/expanding/src/app/expandable-cell/expandable-cell.ts +++ b/examples/angular/expanding/src/app/expandable-cell/expandable-cell.ts @@ -43,7 +43,10 @@ export class ExpandableHeaderCell { {{ ' ' }} diff --git a/examples/lit/expanding/src/main.ts b/examples/lit/expanding/src/main.ts index 7d50aadc70..9bc373bdb7 100644 --- a/examples/lit/expanding/src/main.ts +++ b/examples/lit/expanding/src/main.ts @@ -123,7 +123,9 @@ const columns: Array> = [ cell: ({ row, getValue }) => html`
${indeterminateCheckbox({ - checked: row.getIsSelected(), + checked: + row.getIsSelected() || + (row.getCanSelectSubRows() && row.getIsAllSubRowsSelected()), indeterminate: row.getIsSomeSelected(), onChange: row.getToggleSelectedHandler(), })} diff --git a/examples/preact/expanding/src/main.tsx b/examples/preact/expanding/src/main.tsx index bd060448b0..36d3c4f36a 100644 --- a/examples/preact/expanding/src/main.tsx +++ b/examples/preact/expanding/src/main.tsx @@ -68,7 +68,10 @@ function App() { >
{' '} diff --git a/examples/react/expanding/src/main.tsx b/examples/react/expanding/src/main.tsx index 65f3a7b222..67a60bbe01 100644 --- a/examples/react/expanding/src/main.tsx +++ b/examples/react/expanding/src/main.tsx @@ -69,7 +69,10 @@ function App() { >
{' '} @@ -129,6 +132,7 @@ function App() { // filterFromLeafRows: true, // maxLeafRowFilterDepth: 0, debugTable: true, + debugRows: true, }, (state) => state, // default selector ) @@ -343,7 +347,7 @@ function IndeterminateCheckbox({ if (typeof indeterminate === 'boolean') { ref.current.indeterminate = !rest.checked && indeterminate } - }, [ref, indeterminate]) + }, [ref, indeterminate, rest.checked]) return (
{' '} diff --git a/examples/svelte/expanding/src/App.svelte b/examples/svelte/expanding/src/App.svelte index 70dee579cd..a9c81c7da6 100644 --- a/examples/svelte/expanding/src/App.svelte +++ b/examples/svelte/expanding/src/App.svelte @@ -156,7 +156,9 @@
{' '} diff --git a/packages/table-core/src/features/row-selection/rowSelectionFeature.ts b/packages/table-core/src/features/row-selection/rowSelectionFeature.ts index 8e2fc95bf7..96206df649 100644 --- a/packages/table-core/src/features/row-selection/rowSelectionFeature.ts +++ b/packages/table-core/src/features/row-selection/rowSelectionFeature.ts @@ -61,9 +61,19 @@ export const rowSelectionFeature: TableFeature = { }, row_getIsSomeSelected: { fn: (row) => row_getIsSomeSelected(row), + memoDeps: (row) => [ + row.subRows, + row.table.atoms.rowSelection?.get(), + row.table.options.enableRowSelection, + ], }, row_getIsAllSubRowsSelected: { fn: (row) => row_getIsAllSubRowsSelected(row), + memoDeps: (row) => [ + row.subRows, + row.table.atoms.rowSelection?.get(), + row.table.options.enableRowSelection, + ], }, row_getCanSelect: { fn: (row) => row_getCanSelect(row), diff --git a/packages/table-core/src/features/row-selection/rowSelectionFeature.utils.ts b/packages/table-core/src/features/row-selection/rowSelectionFeature.utils.ts index f5ecfd2a79..8cd38146d2 100644 --- a/packages/table-core/src/features/row-selection/rowSelectionFeature.utils.ts +++ b/packages/table-core/src/features/row-selection/rowSelectionFeature.utils.ts @@ -497,10 +497,6 @@ export function row_toggleSelected< table_setRowSelection(row.table, (old) => { value = typeof value !== 'undefined' ? value : !isSelected - if (row_getCanSelect(row) && isSelected === value) { - return old - } - const rowSelection = Object.assign(makeObjectMap(), old) mutateRowIsSelected( @@ -787,13 +783,15 @@ export function isSubRowSelected< const rowSelection = row.table.atoms.rowSelection?.get() ?? {} - let allChildrenSelected = true let someSelected = false + let allChildrenSelected = true + + for (let i = 0; i < row.subRows.length; i++) { + const subRow = row.subRows[i]! - row.subRows.forEach((subRow) => { // Bail out early if we know both of these if (someSelected && !allChildrenSelected) { - return + break } if (row_getCanSelect(subRow)) { @@ -816,8 +814,7 @@ export function isSubRowSelected< allChildrenSelected = false } } - }) + } - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition return allChildrenSelected ? 'all' : someSelected ? 'some' : false } diff --git a/perf-done.md b/perf-done.md index 647deea8db..46287b14c2 100644 --- a/perf-done.md +++ b/perf-done.md @@ -525,9 +525,7 @@ const results: Array<{ colSpan: number; rowSpan: number }> = [] for (let i = 0; i < headers.length; i++) { const header = headers[i]! - if ( - !callMemoOrStaticFn(header.column, 'getIsVisible', column_getIsVisible) - ) { + if (!callMemoOrStaticFn(header.column, 'getIsVisible', column_getIsVisible)) { continue } diff --git a/perf-skipped.md b/perf-skipped.md index ea384b89b7..ec4b712a7a 100644 --- a/perf-skipped.md +++ b/perf-skipped.md @@ -36,8 +36,7 @@ if (existingGrouping.includes(colId)) { } if (groupedRows[0]) { - row._valuesCache[colId] = - groupedRows[0].getValue(colId) ?? undefined + row._valuesCache[colId] = groupedRows[0].getValue(colId) ?? undefined } return row._valuesCache[colId] @@ -134,9 +133,8 @@ Each call walks the `columnFilters` array. When a filter UI re-renders columns, **Before** ```ts -return column.table.atoms.columnFilters - ?.get() - ?.find((d) => d.id === column.id)?.value +return column.table.atoms.columnFilters?.get()?.find((d) => d.id === column.id) + ?.value ``` **After (new memoized table API)**