Skip to content

Commit ada9d16

Browse files
authored
feat(Table): indeterminate state for selectable rows (#647)
1 parent bd91e00 commit ada9d16

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/components/Table/Table.stories.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const rows: TableRowType[] = [
1313
{ label: "Maria Anders" },
1414
{ label: "Germany" },
1515
],
16+
isIndeterminate: true,
1617
},
1718
{
1819
id: "row-2",
@@ -64,20 +65,31 @@ export const Selectable: StoryObj<typeof Table> = {
6465
isSelectable: true,
6566
selectedIds: [],
6667
},
67-
render: ({ selectedIds, ...props }) => {
68+
render: ({ selectedIds, rows: rowsProp, ...props }) => {
69+
const [rows, setRows] = useState(rowsProp);
6870
const [selectedRows, setSelectedRows] = useState(selectedIds);
6971

7072
useEffect(() => {
7173
setSelectedRows(selectedIds);
7274
}, [selectedIds]);
7375

76+
useEffect(() => {
77+
setRows(prevState =>
78+
prevState.map(row => ({
79+
...row,
80+
isIndeterminate: selectedRows?.includes(row.id) ? false : row.isIndeterminate,
81+
}))
82+
);
83+
}, [selectedRows]);
84+
7485
return (
7586
<Table
7687
{...props}
88+
rows={rows}
7789
selectedIds={selectedRows}
78-
onSelect={selectedItems =>
79-
setSelectedRows(selectedItems.map(({ item: { id } }) => id))
80-
}
90+
onSelect={selectedItems => {
91+
setSelectedRows(selectedItems.map(({ item: { id } }) => id));
92+
}}
8193
/>
8294
);
8395
},

src/components/Table/Table.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,8 @@ export interface TableRowType
380380
isDisabled?: boolean;
381381
isDeleted?: boolean;
382382
isActive?: boolean;
383+
/** only works with <Table isSelectable={true} /> */
384+
isIndeterminate?: boolean;
383385
}
384386

385387
interface CommonTableProps
@@ -433,6 +435,7 @@ const TableBodyRow = ({
433435
onSelect,
434436
isSelectable,
435437
isSelected,
438+
isIndeterminate,
436439
onDelete,
437440
onEdit,
438441
isDeleted,
@@ -458,7 +461,7 @@ const TableBodyRow = ({
458461
{isSelectable && (
459462
<SelectData $size={size}>
460463
<Checkbox
461-
checked={isSelected}
464+
checked={isIndeterminate ? "indeterminate" : isSelected}
462465
onCheckedChange={onSelect}
463466
disabled={isDisabled || isDeleted}
464467
/>

0 commit comments

Comments
 (0)