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 */ 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/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/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); 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 {