From ac86c452ad34ea80202c79820c00dcb4b5cdafa0 Mon Sep 17 00:00:00 2001 From: dexterdai <2577043677@qq.com> Date: Tue, 12 May 2026 23:56:57 +0800 Subject: [PATCH] fix(table): skip checkProps disabled rows on select all --- .../table/__tests__/row.events.test.tsx | 25 +++++++++++++++++++ .../components/table/hooks/useRowSelect.tsx | 9 ++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/components/table/__tests__/row.events.test.tsx b/packages/components/table/__tests__/row.events.test.tsx index 5ce48869e2..c5a111b118 100644 --- a/packages/components/table/__tests__/row.events.test.tsx +++ b/packages/components/table/__tests__/row.events.test.tsx @@ -96,3 +96,28 @@ TABLES.forEach((TTable) => { }); }); }); + +describe('PrimaryTable row selection', () => { + it('select all skips rows disabled by checkProps', () => { + const fn = vi.fn(); + const columns = [ + { + colKey: 'row-select', + type: 'multiple' as const, + checkProps: ({ row }) => ({ disabled: row.index === 101 }), + }, + ...SIMPLE_COLUMNS, + ]; + + const { container } = render( + , + ); + + fireEvent.click(container.querySelector('thead .t-checkbox')); + + expect(fn).toHaveBeenCalledWith( + [100, 102, 103, 104], + expect.objectContaining({ currentRowKey: 'CHECK_ALL_BOX', type: 'check' }), + ); + }); +}); diff --git a/packages/components/table/hooks/useRowSelect.tsx b/packages/components/table/hooks/useRowSelect.tsx index 6519ed34a2..f966233cb7 100644 --- a/packages/components/table/hooks/useRowSelect.tsx +++ b/packages/components/table/hooks/useRowSelect.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useState, MouseEvent, useMemo } from 'react'; import { intersection, get, isFunction } from 'lodash-es'; -import { isRowSelectedDisabled } from '@tdesign/common-js/table/utils'; import log from '@tdesign/common-js/log/index'; import useControlled from '../../hooks/useControlled'; import { @@ -31,7 +30,8 @@ export default function useRowSelect( const [tSelectedRowKeys, setTSelectedRowKeys] = useControlled(props, 'selectedRowKeys', props.onSelectChange, { defaultSelectedRowKeys: props.defaultSelectedRowKeys || [], }); - const selectColumn = columns.find(({ type }) => ['multiple', 'single'].includes(type)); + const selectColumnIndex = columns.findIndex(({ type }) => ['multiple', 'single'].includes(type)); + const selectColumn = columns[selectColumnIndex]; const canSelectedRows = useMemo(() => { const currentData = reserveSelectedRowOnPaginate ? data : currentPaginateData; @@ -78,7 +78,8 @@ export default function useRowSelect( ); function isDisabled(row: Record, rowIndex: number): boolean { - return isRowSelectedDisabled(selectColumn, row, rowIndex); + if (!selectColumn) return false; + return getRowSelectDisabledData({ row, rowIndex, col: selectColumn, colIndex: selectColumnIndex }).disabled; } function getSelectedHeader() { @@ -109,7 +110,7 @@ export default function useRowSelect( const disabled: boolean = typeof col.disabled === 'function' ? col.disabled({ row, rowIndex }) : col.disabled; const checkProps = isFunction(col.checkProps) ? col.checkProps({ row, rowIndex }) : col.checkProps; return { - disabled: disabled || checkProps?.disabled, + disabled: Boolean(disabled || checkProps?.disabled), checkProps, }; }