From 2af676ede02772229bf54073315c9f1dafb15436 Mon Sep 17 00:00:00 2001 From: Liang Xu Date: Thu, 10 Sep 2026 04:18:09 +0800 Subject: [PATCH] fix(table-core): include defaultColumn in memoDeps for column, header, and sizing computations Co-Authored-By: Claude Code Signed-off-by: Liang Xu --- .changeset/fix-default-column-memo-deps.md | 5 +++++ .../src/core/columns/coreColumnsFeature.ts | 13 +++++++---- .../src/core/headers/coreHeadersFeature.ts | 11 ++++++++-- .../column-sizing/columnSizingFeature.ts | 4 ++++ .../columnVisibilityFeature.ts | 3 +++ .../columns/coreColumnsFeature.utils.test.ts | 22 +++++++++++++++++++ .../headers/coreHeadersFeature.utils.test.ts | 21 ++++++++++++++++++ .../columnSizingFeature.utils.test.ts | 22 +++++++++++++++++++ 8 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 .changeset/fix-default-column-memo-deps.md diff --git a/.changeset/fix-default-column-memo-deps.md b/.changeset/fix-default-column-memo-deps.md new file mode 100644 index 0000000000..7f2fea09b6 --- /dev/null +++ b/.changeset/fix-default-column-memo-deps.md @@ -0,0 +1,5 @@ +--- +'@tanstack/table-core': patch +--- + +fix(table-core): include defaultColumn in memoDeps for column, header, and sizing computations diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.ts b/packages/table-core/src/core/columns/coreColumnsFeature.ts index 2c027ecc5c..c5b312aed3 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.ts @@ -20,7 +20,10 @@ export const coreColumnsFeature: TableFeature = { assignPrototypeAPIs('coreColumnsFeature', prototype, table, { column_getFlatColumns: { fn: (column) => column_getFlatColumns(column), - memoDeps: (column) => [column.table.options.columns], + memoDeps: (column) => [ + column.table.options.columns, + column.table.options.defaultColumn, + ], }, column_getLeafColumns: { fn: (column) => column_getLeafColumns(column), @@ -28,6 +31,7 @@ export const coreColumnsFeature: TableFeature = { column.table.atoms.columnOrder?.get(), column.table.atoms.grouping?.get(), column.table.options.columns, + column.table.options.defaultColumn, column.table.options.groupedColumnMode, ], }, @@ -42,15 +46,15 @@ export const coreColumnsFeature: TableFeature = { }, table_getAllColumns: { fn: () => table_getAllColumns(table), - memoDeps: () => [table.options.columns], + memoDeps: () => [table.options.columns, table.options.defaultColumn], }, table_getAllFlatColumns: { fn: () => table_getAllFlatColumns(table), - memoDeps: () => [table.options.columns], + memoDeps: () => [table.options.columns, table.options.defaultColumn], }, table_getAllFlatColumnsById: { fn: () => table_getAllFlatColumnsById(table), - memoDeps: () => [table.options.columns], + memoDeps: () => [table.options.columns, table.options.defaultColumn], }, table_getAllLeafColumns: { fn: () => table_getAllLeafColumns(table), @@ -58,6 +62,7 @@ export const coreColumnsFeature: TableFeature = { table.atoms.columnOrder?.get(), table.atoms.grouping?.get(), table.options.columns, + table.options.defaultColumn, table.options.groupedColumnMode, ], }, diff --git a/packages/table-core/src/core/headers/coreHeadersFeature.ts b/packages/table-core/src/core/headers/coreHeadersFeature.ts index b8c7a214e4..bac9a76255 100644 --- a/packages/table-core/src/core/headers/coreHeadersFeature.ts +++ b/packages/table-core/src/core/headers/coreHeadersFeature.ts @@ -17,11 +17,17 @@ export const coreHeadersFeature: TableFeature = { assignPrototypeAPIs('coreHeadersFeature', prototype, table, { header_getLeafHeaders: { fn: (header) => header_getLeafHeaders(header), - memoDeps: (header) => [header.column.table.options.columns], + memoDeps: (header) => [ + header.column.table.options.columns, + header.column.table.options.defaultColumn, + ], }, header_getContext: { fn: (header) => header_getContext(header), - memoDeps: (header) => [header.column.table.options.columns], + memoDeps: (header) => [ + header.column.table.options.columns, + header.column.table.options.defaultColumn, + ], }, }) }, @@ -32,6 +38,7 @@ export const coreHeadersFeature: TableFeature = { fn: () => table_getHeaderGroups(table), memoDeps: () => [ table.options.columns, + table.options.defaultColumn, table.atoms.columnOrder?.get(), table.atoms.grouping?.get(), table.atoms.columnPinning?.get(), diff --git a/packages/table-core/src/features/column-sizing/columnSizingFeature.ts b/packages/table-core/src/features/column-sizing/columnSizingFeature.ts index 0e3c743b67..f2881a9576 100644 --- a/packages/table-core/src/features/column-sizing/columnSizingFeature.ts +++ b/packages/table-core/src/features/column-sizing/columnSizingFeature.ts @@ -49,6 +49,7 @@ export const columnSizingFeature: TableFeature = { fn: (column) => column_getSize(column), memoDeps: (column) => [ table.options.columns, + table.options.defaultColumn, table.atoms.columnSizing?.get()?.[column.id], // just this column's size state ], }, @@ -72,6 +73,7 @@ export const columnSizingFeature: TableFeature = { fn: (header) => header_getSize(header), memoDeps: (header) => [ table.options.columns, + table.options.defaultColumn, header.column.columns.length > 0 ? table.atoms.columnSizing?.get() // must be all columns (sum child columns) : table.atoms.columnSizing?.get()?.[header.column.id], // can just check its associated column size state @@ -81,6 +83,7 @@ export const columnSizingFeature: TableFeature = { fn: (header) => header_getStart(header), memoDeps: () => [ table.options.columns, + table.options.defaultColumn, table.atoms.columnSizing?.get(), table.atoms.columnOrder?.get(), table.atoms.columnPinning?.get(), @@ -98,6 +101,7 @@ export const columnSizingFeature: TableFeature = { fn: () => table_getColumnOffsets(table), memoDeps: () => [ table.options.columns, + table.options.defaultColumn, table.atoms.columnSizing?.get(), table.atoms.columnOrder?.get(), table.atoms.columnPinning?.get(), diff --git a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.ts b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.ts index 31b6d81b7e..4b27a795b8 100644 --- a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.ts +++ b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.ts @@ -45,6 +45,7 @@ export const columnVisibilityFeature: TableFeature = { fn: (column) => column_getIsVisible(column), memoDeps: (column) => [ table.options.columns, + table.options.defaultColumn, table.atoms.columnVisibility?.get(), column.columns, ], @@ -90,6 +91,7 @@ export const columnVisibilityFeature: TableFeature = { table.atoms.columnOrder?.get(), table.atoms.grouping?.get(), table.options.columns, + table.options.defaultColumn, table.options.groupedColumnMode, ], }, @@ -100,6 +102,7 @@ export const columnVisibilityFeature: TableFeature = { table.atoms.columnOrder?.get(), table.atoms.grouping?.get(), table.options.columns, + table.options.defaultColumn, table.options.groupedColumnMode, ], }, diff --git a/packages/table-core/tests/unit/core/columns/coreColumnsFeature.utils.test.ts b/packages/table-core/tests/unit/core/columns/coreColumnsFeature.utils.test.ts index 0e807e1575..cc41d515f9 100644 --- a/packages/table-core/tests/unit/core/columns/coreColumnsFeature.utils.test.ts +++ b/packages/table-core/tests/unit/core/columns/coreColumnsFeature.utils.test.ts @@ -225,4 +225,26 @@ describe('table_getDefaultColumnDef', () => { expect(table_getDefaultColumnDef(table).header).toBe('custom header') }) + + it('should update columns and leaf columns when defaultColumn changes via setOptions', () => { + const table = constructTable({ + features, + columns: [{ accessorKey: 'a', id: 'a' }], + data, + defaultColumn: { meta: { tag: 'old' } }, + }) + + const initialColumns = table.getAllColumns() + expect(initialColumns[0]!.columnDef.meta).toEqual({ tag: 'old' }) + expect(table.getAllLeafColumns()[0]!.columnDef.meta).toEqual({ tag: 'old' }) + + table.setOptions((prev) => ({ + ...prev, + defaultColumn: { meta: { tag: 'new' } }, + })) + + const updatedColumns = table.getAllColumns() + expect(updatedColumns[0]!.columnDef.meta).toEqual({ tag: 'new' }) + expect(table.getAllLeafColumns()[0]!.columnDef.meta).toEqual({ tag: 'new' }) + }) }) diff --git a/packages/table-core/tests/unit/core/headers/coreHeadersFeature.utils.test.ts b/packages/table-core/tests/unit/core/headers/coreHeadersFeature.utils.test.ts index 394c0dae1d..1b38d582ea 100644 --- a/packages/table-core/tests/unit/core/headers/coreHeadersFeature.utils.test.ts +++ b/packages/table-core/tests/unit/core/headers/coreHeadersFeature.utils.test.ts @@ -297,6 +297,27 @@ describe('header rowSpan for uneven column trees', () => { ['b', false, 1], ]) }) + + it('should update header columns when defaultColumn changes via setOptions', () => { + const table = makeTable({ + defaultColumn: { meta: { tag: 'old' } }, + }) + + const initialGroups = table.getHeaderGroups() + expect(initialGroups[1]!.headers[0]!.column.columnDef.meta).toEqual({ + tag: 'old', + }) + + table.setOptions((prev) => ({ + ...prev, + defaultColumn: { meta: { tag: 'new' } }, + })) + + const updatedGroups = table.getHeaderGroups() + expect(updatedGroups[1]!.headers[0]!.column.columnDef.meta).toEqual({ + tag: 'new', + }) + }) }) describe('header_getLeafHeaders', () => { diff --git a/packages/table-core/tests/unit/features/column-sizing/columnSizingFeature.utils.test.ts b/packages/table-core/tests/unit/features/column-sizing/columnSizingFeature.utils.test.ts index e3bdf98fcf..900d850dd9 100644 --- a/packages/table-core/tests/unit/features/column-sizing/columnSizingFeature.utils.test.ts +++ b/packages/table-core/tests/unit/features/column-sizing/columnSizingFeature.utils.test.ts @@ -65,6 +65,28 @@ describe('header_getSize', () => { expect(header.getSize()).toBe(200) }) + it('updates size when defaultColumn changes via setOptions', () => { + const table = constructTable({ + features, + columns: [{ id: 'a', accessorKey: 'a' }], + data, + defaultColumn: { size: 100 }, + }) + + const initialHeader = table.getHeaderGroups()[0]!.headers[0]! + expect(initialHeader.getSize()).toBe(100) + expect(table.getAllColumns()[0]!.getSize()).toBe(100) + + table.setOptions((prev) => ({ + ...prev, + defaultColumn: { size: 50 }, + })) + + const updatedHeader = table.getHeaderGroups()[0]!.headers[0]! + expect(updatedHeader.getSize()).toBe(50) + expect(table.getAllColumns()[0]!.getSize()).toBe(50) + }) + it('returns sum of subHeader sizes for a parent header', () => { const table = makeTable({ columns: [