From b35ea68e8c6791b5f04958b4ce1cb47371384390 Mon Sep 17 00:00:00 2001 From: travor20814 Date: Fri, 12 Apr 2024 12:32:37 +0800 Subject: [PATCH 1/3] feat(core/table): add disabledRowKeys typing for rowSelection --- packages/core/src/table/table.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/table/table.ts b/packages/core/src/table/table.ts index 9916ea14..c92aec33 100644 --- a/packages/core/src/table/table.ts +++ b/packages/core/src/table/table.ts @@ -144,6 +144,7 @@ export interface TableRowSelection { selectedRowKey?: string[]; onChange?(keys: string[]): void; actions?: TableRowAction[]; + disabledRowKeys?: string[]; } /** === Feature draggable */ From f00560eb1bbfc42f8a98cff6ca30e66018e9b289 Mon Sep 17 00:00:00 2001 From: travor20814 Date: Fri, 12 Apr 2024 12:34:10 +0800 Subject: [PATCH 2/3] feat(react/table): implement rowSelection.disabledRowKeys for table --- packages/react/src/Table/Table.stories.tsx | 5 +++++ packages/react/src/Table/Table.tsx | 2 ++ packages/react/src/Table/TableContext.ts | 1 + .../src/Table/rowSelection/TableRowSelection.tsx | 15 ++++++++++++--- .../Table/rowSelection/useTableRowSelection.ts | 7 +++++-- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/react/src/Table/Table.stories.tsx b/packages/react/src/Table/Table.stories.tsx index 4b04049c..ecc5d3f9 100644 --- a/packages/react/src/Table/Table.stories.tsx +++ b/packages/react/src/Table/Table.stories.tsx @@ -376,6 +376,11 @@ export const Selections = () => { rowSelection={{ selectedRowKey: selectedRowKeys, onChange: (keys) => setSelectedRowKeys(keys), + disabledRowKeys: dataSource.map((d) => { + if (d.age >= 25) return d.key; + + return null; + }).filter((k) => k), }} /> diff --git a/packages/react/src/Table/Table.tsx b/packages/react/src/Table/Table.tsx index e2a93833..95dd526f 100644 --- a/packages/react/src/Table/Table.tsx +++ b/packages/react/src/Table/Table.tsx @@ -182,12 +182,14 @@ const Table = forwardRef>>( selectedRowKey: rowSelectionProp?.selectedRowKey, onChange: rowSelectionProp?.onChange, dataSource: dataSourceProp, + disabledRowKeys: rowSelectionProp?.disabledRowKeys, }); const rowSelection = useMemo(() => (rowSelectionProp ? { selectedRowKeys, onChange: setSelectedRowKey, actions: rowSelectionProp.actions, + disabledRowKeys: rowSelectionProp.disabledRowKeys, } : undefined), [ rowSelectionProp, selectedRowKeys, diff --git a/packages/react/src/Table/TableContext.ts b/packages/react/src/Table/TableContext.ts index 2f9a7e8a..799a0a63 100644 --- a/packages/react/src/Table/TableContext.ts +++ b/packages/react/src/Table/TableContext.ts @@ -16,6 +16,7 @@ import { EmptyProps } from '../Empty'; export interface RowSelectionContext extends Pick { selectedRowKeys: string[]; onChange(v: string): void; + disabledRowKeys?: string[]; } /** typeof sorting */ diff --git a/packages/react/src/Table/rowSelection/TableRowSelection.tsx b/packages/react/src/Table/rowSelection/TableRowSelection.tsx index 0ef973dd..2f5d88d4 100644 --- a/packages/react/src/Table/rowSelection/TableRowSelection.tsx +++ b/packages/react/src/Table/rowSelection/TableRowSelection.tsx @@ -11,6 +11,7 @@ import { tableClasses as classes, TableRowAction, } from '@mezzanine-ui/core/table'; +import xor from 'lodash/xor'; import { MoreVerticalIcon } from '@mezzanine-ui/icons'; import { TableContext, TableDataContext, RowSelectionContext } from '../TableContext'; import { NativeElementPropsWithoutKeyAndRef } from '../../utils/jsx-types'; @@ -64,10 +65,16 @@ const TableRowSelection = forwardRef( const selectedRowKeys = rowSelection?.selectedRowKeys ?? []; if (!selectedRowKeys.length) return 'none'; - if (selectedRowKeys.length === dataSource.length) return 'all'; + + const validDataSource = xor( + rowSelection?.disabledRowKeys ?? [], + dataSource.map((d) => (d.id || d.key) as string), + ); + + if (selectedRowKeys.length === validDataSource.length) return 'all'; return 'indeterminate'; - }, [rowSelection?.selectedRowKeys, dataSource.length]); + }, [rowSelection?.selectedRowKeys, rowSelection?.disabledRowKeys, dataSource]); const selfChecked = useMemo(() => ( (rowSelection?.selectedRowKeys ?? []).some((key) => key === rowKey) @@ -138,7 +145,9 @@ const TableRowSelection = forwardRef( > (source.key || source.id) as string); + const validSourceKeys = xor(disabledRowKeys, allSourceKeys); let nextSelectedRowKey = selectedRowKey; if (rowKey === SELECTED_ALL_KEY) { - if (equalityFn(selectedRowKey, allSourceKeys)) { + if (equalityFn(selectedRowKey, validSourceKeys)) { nextSelectedRowKey = []; } else { - nextSelectedRowKey = allSourceKeys; + nextSelectedRowKey = validSourceKeys; } } else { const existedRowKeyIdx = selectedRowKey.findIndex((key) => key === rowKey); From b09ae735243ce073e0af68277ce976d8736feff1 Mon Sep 17 00:00:00 2001 From: travor20814 Date: Fri, 12 Apr 2024 12:45:37 +0800 Subject: [PATCH 3/3] feat(react/table): export useTableRowSelection & SELECTED_ALL_KEY --- packages/react/src/Table/index.ts | 4 ++++ packages/react/src/index.ts | 2 ++ 2 files changed, 6 insertions(+) diff --git a/packages/react/src/Table/index.ts b/packages/react/src/Table/index.ts index 6377e646..28733883 100644 --- a/packages/react/src/Table/index.ts +++ b/packages/react/src/Table/index.ts @@ -16,6 +16,10 @@ export { export { useTableDraggable, } from './draggable/useTableDraggable'; +export { + useTableRowSelection, + SELECTED_ALL_KEY, +} from './rowSelection/useTableRowSelection'; export { default as useTableScroll, } from './useTableScroll'; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 198a00ad..c6a099ef 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -165,6 +165,8 @@ export { TableRefresh, useTableDraggable, useTableScroll, + useTableRowSelection, + SELECTED_ALL_KEY, default as Table, } from './Table'; export {