From 45e481d586948e52b47e66d4a191860f67892290 Mon Sep 17 00:00:00 2001 From: Lazizbek Ergashev Date: Tue, 11 Aug 2026 05:29:04 +0500 Subject: [PATCH] fix(table-core): skip onColumnVisibilityChange for a redundant toggle-all --- .changeset/toggle-all-columns-visible-noop.md | 5 +++ .../functions/table_getIsAllColumnsVisible.md | 2 +- .../table_getIsSomeColumnsVisible.md | 2 +- ...le_getToggleAllColumnsVisibilityHandler.md | 2 +- .../table_toggleAllColumnsVisible.md | 5 ++- .../columnVisibilityFeature.utils.ts | 13 ++++++ .../columnVisibilityFeature.utils.test.ts | 40 +++++++++++++++++++ 7 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 .changeset/toggle-all-columns-visible-noop.md diff --git a/.changeset/toggle-all-columns-visible-noop.md b/.changeset/toggle-all-columns-visible-noop.md new file mode 100644 index 0000000000..bf727c170f --- /dev/null +++ b/.changeset/toggle-all-columns-visible-noop.md @@ -0,0 +1,5 @@ +--- +'@tanstack/table-core': patch +--- + +Skip `onColumnVisibilityChange` when `table.toggleAllColumnsVisible()` is called with the visibility state every leaf column is already in. This matches the no-op guards `table.toggleAllRowsExpanded()` already has. diff --git a/docs/reference/static-functions/functions/table_getIsAllColumnsVisible.md b/docs/reference/static-functions/functions/table_getIsAllColumnsVisible.md index 6888ca8113..e41c159b2f 100644 --- a/docs/reference/static-functions/functions/table_getIsAllColumnsVisible.md +++ b/docs/reference/static-functions/functions/table_getIsAllColumnsVisible.md @@ -9,7 +9,7 @@ title: table_getIsAllColumnsVisible function table_getIsAllColumnsVisible(table): boolean; ``` -Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:360](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L360) +Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:373](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L373) Checks whether every leaf column is currently visible. diff --git a/docs/reference/static-functions/functions/table_getIsSomeColumnsVisible.md b/docs/reference/static-functions/functions/table_getIsSomeColumnsVisible.md index 4133f8338b..71aa2529d9 100644 --- a/docs/reference/static-functions/functions/table_getIsSomeColumnsVisible.md +++ b/docs/reference/static-functions/functions/table_getIsSomeColumnsVisible.md @@ -9,7 +9,7 @@ title: table_getIsSomeColumnsVisible function table_getIsSomeColumnsVisible(table): boolean; ``` -Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:382](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L382) +Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:395](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L395) Checks whether at least one leaf column is currently visible. diff --git a/docs/reference/static-functions/functions/table_getToggleAllColumnsVisibilityHandler.md b/docs/reference/static-functions/functions/table_getToggleAllColumnsVisibilityHandler.md index 143e06a1dd..a41a4a99b3 100644 --- a/docs/reference/static-functions/functions/table_getToggleAllColumnsVisibilityHandler.md +++ b/docs/reference/static-functions/functions/table_getToggleAllColumnsVisibilityHandler.md @@ -9,7 +9,7 @@ title: table_getToggleAllColumnsVisibilityHandler function table_getToggleAllColumnsVisibilityHandler(table): (e) => void; ``` -Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:404](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L404) +Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:417](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L417) Creates a checkbox-style handler that shows or hides all columns. diff --git a/docs/reference/static-functions/functions/table_toggleAllColumnsVisible.md b/docs/reference/static-functions/functions/table_toggleAllColumnsVisible.md index b335bd69b6..80c09ee81a 100644 --- a/docs/reference/static-functions/functions/table_toggleAllColumnsVisible.md +++ b/docs/reference/static-functions/functions/table_toggleAllColumnsVisible.md @@ -9,12 +9,15 @@ title: table_toggleAllColumnsVisible function table_toggleAllColumnsVisible(table, value?): void; ``` -Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:333](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L333) +Defined in: [features/column-visibility/columnVisibilityFeature.utils.ts:336](https://github.com/TanStack/table/blob/main/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts#L336) Shows or hides every hideable leaf column. Columns that cannot hide stay visible when toggling all columns off. +The call is a no-op (no `onColumnVisibilityChange`) when every leaf column is +already in the requested visibility state. + ## Type Parameters ### TFeatures diff --git a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts index f7fb7916d4..e2dc712271 100644 --- a/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts +++ b/packages/table-core/src/features/column-visibility/columnVisibilityFeature.utils.ts @@ -325,6 +325,9 @@ export function table_resetColumnVisibility< * * Columns that cannot hide stay visible when toggling all columns off. * + * The call is a no-op (no `onColumnVisibilityChange`) when every leaf column is + * already in the requested visibility state. + * * @example * ```ts * table_toggleAllColumnsVisible(table) @@ -343,6 +346,16 @@ export function table_toggleAllColumnsVisible< visibility[column.id] = !value ? !column_getCanHide(column) : value } + if ( + leafColumns.every( + (column) => + visibility[column.id] === + callMemoOrStaticFn(column, 'getIsVisible', column_getIsVisible), + ) + ) { + return + } + table_setColumnVisibility(table, visibility) } diff --git a/packages/table-core/tests/unit/features/column-visibility/columnVisibilityFeature.utils.test.ts b/packages/table-core/tests/unit/features/column-visibility/columnVisibilityFeature.utils.test.ts index 8ca1c31c40..8259d8fbb9 100644 --- a/packages/table-core/tests/unit/features/column-visibility/columnVisibilityFeature.utils.test.ts +++ b/packages/table-core/tests/unit/features/column-visibility/columnVisibilityFeature.utils.test.ts @@ -362,6 +362,11 @@ describe('columnVisibilityFeature.utils', () => { const onColumnVisibilityChange = vi.fn() const table = makeTable(1, { onColumnVisibilityChange, + initialState: { + columnVisibility: { + firstName: false, + }, + }, }) table_toggleAllColumnsVisible(table, true) @@ -389,6 +394,36 @@ describe('columnVisibilityFeature.utils', () => { allColumnIds.map((id) => [id, false]), ) }) + + it('should be a no-op when all columns are already visible', () => { + const onColumnVisibilityChange = vi.fn() + const table = makeTable(1, { + onColumnVisibilityChange, + }) + + table_toggleAllColumnsVisible(table, true) + + expect(onColumnVisibilityChange).not.toHaveBeenCalled() + }) + + it('should be a no-op when all hideable columns are already hidden', () => { + const onColumnVisibilityChange = vi.fn() + const allColumnIds = makeTable(1) + .getAllLeafColumns() + .map((col) => col.id) + const table = makeTable(1, { + onColumnVisibilityChange, + initialState: { + columnVisibility: Object.fromEntries( + allColumnIds.map((id) => [id, false]), + ), + }, + }) + + table_toggleAllColumnsVisible(table, false) + + expect(onColumnVisibilityChange).not.toHaveBeenCalled() + }) }) describe('table_getIsAllColumnsVisible', () => { @@ -454,6 +489,11 @@ describe('columnVisibilityFeature.utils', () => { const onColumnVisibilityChange = vi.fn() const table = makeTable(1, { onColumnVisibilityChange, + initialState: { + columnVisibility: { + firstName: false, + }, + }, }) const handler = table_getToggleAllColumnsVisibilityHandler(table)