Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/alpine/expanding/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
<input
type="checkbox"
style="cursor: pointer"
:checked="cell.row.getIsSelected()"
:checked="cell.row.getIsSelected() || (cell.row.getCanSelectSubRows() && cell.row.getIsAllSubRowsSelected())"
x-effect="$el.indeterminate = !cell.row.getIsSelected() && cell.row.getIsSomeSelected()"
@change="cell.row.getToggleSelectedHandler()($event)"
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ export class ExpandableHeaderCell<T extends RowData> {
<input
type="checkbox"
[indeterminate]="row.getIsSomeSelected()"
[checked]="row.getIsSelected()"
[checked]="
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected())
"
(change)="row.getToggleSelectedHandler()($event)"
/>
{{ ' ' }}
Expand Down
4 changes: 3 additions & 1 deletion examples/lit/expanding/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,9 @@ const columns: Array<ColumnDef<typeof features, Person>> = [
cell: ({ row, getValue }) => html`
<div style="padding-left:${row.depth * 2}rem">
${indeterminateCheckbox({
checked: row.getIsSelected(),
checked:
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected()),
indeterminate: row.getIsSomeSelected(),
onChange: row.getToggleSelectedHandler(),
})}
Expand Down
5 changes: 4 additions & 1 deletion examples/preact/expanding/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@ function App() {
>
<div>
<IndeterminateCheckbox
checked={row.getIsSelected()}
checked={
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected())
}
indeterminate={row.getIsSomeSelected()}
onChange={row.getToggleSelectedHandler()}
/>{' '}
Expand Down
8 changes: 6 additions & 2 deletions examples/react/expanding/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ function App() {
>
<div>
<IndeterminateCheckbox
checked={row.getIsSelected()}
checked={
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected())
}
indeterminate={row.getIsSomeSelected()}
onChange={row.getToggleSelectedHandler()}
/>{' '}
Expand Down Expand Up @@ -129,6 +132,7 @@ function App() {
// filterFromLeafRows: true,
// maxLeafRowFilterDepth: 0,
debugTable: true,
debugRows: true,
},
(state) => state, // default selector
)
Expand Down Expand Up @@ -343,7 +347,7 @@ function IndeterminateCheckbox({
if (typeof indeterminate === 'boolean') {
ref.current.indeterminate = !rest.checked && indeterminate
}
}, [ref, indeterminate])
}, [ref, indeterminate, rest.checked])

return (
<input
Expand Down
5 changes: 4 additions & 1 deletion examples/solid/expanding/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ function App() {
<div style={{ 'padding-left': `${row.depth * 2}rem` }}>
<div>
<IndeterminateCheckbox
checked={row.getIsSelected()}
checked={
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected())
}
indeterminate={row.getIsSomeSelected()}
onChange={row.getToggleSelectedHandler()}
/>{' '}
Expand Down
4 changes: 3 additions & 1 deletion examples/svelte/expanding/src/App.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@
<div>
<input
type="checkbox"
checked={row.getIsSelected()}
checked={row.getIsSelected() ||
(row.getCanSelectSubRows() &&
row.getIsAllSubRowsSelected())}
use:setIndeterminate={!row.getIsSelected() && row.getIsSomeSelected()}
onchange={row.getToggleSelectedHandler()}
class="sortable-header"
Expand Down
5 changes: 4 additions & 1 deletion examples/vue/expanding/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,10 @@ export default defineComponent({
<div style={{ paddingLeft: `${row.depth * 2}rem` }}>
<div>
<IndeterminateCheckbox
checked={row.getIsSelected()}
checked={
row.getIsSelected() ||
(row.getCanSelectSubRows() && row.getIsAllSubRowsSelected())
}
indeterminate={row.getIsSomeSelected()}
onChange={row.getToggleSelectedHandler()}
/>{' '}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<true>(), old)

mutateRowIsSelected(
Expand Down Expand Up @@ -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)) {
Expand All @@ -816,8 +814,7 @@ export function isSubRowSelected<
allChildrenSelected = false
}
}
})
}

// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
return allChildrenSelected ? 'all' : someSelected ? 'some' : false
}
4 changes: 1 addition & 3 deletions perf-done.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
8 changes: 3 additions & 5 deletions perf-skipped.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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)**
Expand Down
Loading