@coveord/plasma-mantine 52.6.0 → 52.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +32 -31
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/table/Table.d.ts.map +1 -1
  5. package/dist/cjs/components/table/Table.js +32 -86
  6. package/dist/cjs/components/table/Table.js.map +1 -1
  7. package/dist/cjs/components/table/Table.styles.d.ts +2 -5
  8. package/dist/cjs/components/table/Table.styles.d.ts.map +1 -1
  9. package/dist/cjs/components/table/Table.styles.js +7 -45
  10. package/dist/cjs/components/table/Table.styles.js.map +1 -1
  11. package/dist/cjs/components/table/Table.types.d.ts +57 -1
  12. package/dist/cjs/components/table/Table.types.d.ts.map +1 -1
  13. package/dist/cjs/components/table/TableActions.d.ts +12 -2
  14. package/dist/cjs/components/table/TableActions.d.ts.map +1 -1
  15. package/dist/cjs/components/table/TableActions.js +29 -7
  16. package/dist/cjs/components/table/TableActions.js.map +1 -1
  17. package/dist/cjs/components/table/TableDateRangePicker.d.ts +12 -1
  18. package/dist/cjs/components/table/TableDateRangePicker.d.ts.map +1 -1
  19. package/dist/cjs/components/table/TableDateRangePicker.js +31 -5
  20. package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
  21. package/dist/cjs/components/table/TableFilter.d.ts +1 -0
  22. package/dist/cjs/components/table/TableFilter.d.ts.map +1 -1
  23. package/dist/cjs/components/table/TableFilter.js +3 -1
  24. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  25. package/dist/cjs/components/table/TableHeader.d.ts.map +1 -1
  26. package/dist/cjs/components/table/TableHeader.js +3 -1
  27. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  28. package/dist/cjs/components/table/TableLayoutControl.d.ts +3 -0
  29. package/dist/cjs/components/table/TableLayoutControl.d.ts.map +1 -0
  30. package/dist/cjs/components/table/TableLayoutControl.js +50 -0
  31. package/dist/cjs/components/table/TableLayoutControl.js.map +1 -0
  32. package/dist/cjs/components/table/TableLoading.d.ts +4 -0
  33. package/dist/cjs/components/table/TableLoading.d.ts.map +1 -0
  34. package/dist/cjs/components/table/TableLoading.js +28 -0
  35. package/dist/cjs/components/table/TableLoading.js.map +1 -0
  36. package/dist/cjs/components/table/TablePredicate.d.ts +12 -2
  37. package/dist/cjs/components/table/TablePredicate.d.ts.map +1 -1
  38. package/dist/cjs/components/table/TablePredicate.js +29 -4
  39. package/dist/cjs/components/table/TablePredicate.js.map +1 -1
  40. package/dist/cjs/components/table/Th.d.ts.map +1 -1
  41. package/dist/cjs/components/table/Th.js +2 -1
  42. package/dist/cjs/components/table/Th.js.map +1 -1
  43. package/dist/cjs/components/table/index.d.ts +2 -1
  44. package/dist/cjs/components/table/index.d.ts.map +1 -1
  45. package/dist/cjs/components/table/index.js +12 -3
  46. package/dist/cjs/components/table/index.js.map +1 -1
  47. package/dist/cjs/components/table/layouts/RowLayout.d.ts +3 -0
  48. package/dist/cjs/components/table/layouts/RowLayout.d.ts.map +1 -0
  49. package/dist/cjs/components/table/layouts/RowLayout.js +156 -0
  50. package/dist/cjs/components/table/layouts/RowLayout.js.map +1 -0
  51. package/dist/cjs/components/table/layouts/TableLayouts.d.ts +4 -0
  52. package/dist/cjs/components/table/layouts/TableLayouts.d.ts.map +1 -0
  53. package/dist/cjs/components/table/layouts/TableLayouts.js +16 -0
  54. package/dist/cjs/components/table/layouts/TableLayouts.js.map +1 -0
  55. package/dist/cjs/theme/Theme.js +7 -5
  56. package/dist/cjs/theme/Theme.js.map +1 -1
  57. package/dist/esm/components/table/Table.d.ts.map +1 -1
  58. package/dist/esm/components/table/Table.js +35 -89
  59. package/dist/esm/components/table/Table.js.map +1 -1
  60. package/dist/esm/components/table/Table.styles.d.ts +2 -5
  61. package/dist/esm/components/table/Table.styles.d.ts.map +1 -1
  62. package/dist/esm/components/table/Table.styles.js +7 -45
  63. package/dist/esm/components/table/Table.styles.js.map +1 -1
  64. package/dist/esm/components/table/Table.types.d.ts +57 -1
  65. package/dist/esm/components/table/Table.types.d.ts.map +1 -1
  66. package/dist/esm/components/table/Table.types.js.map +1 -1
  67. package/dist/esm/components/table/TableActions.d.ts +12 -2
  68. package/dist/esm/components/table/TableActions.d.ts.map +1 -1
  69. package/dist/esm/components/table/TableActions.js +30 -8
  70. package/dist/esm/components/table/TableActions.js.map +1 -1
  71. package/dist/esm/components/table/TableDateRangePicker.d.ts +12 -1
  72. package/dist/esm/components/table/TableDateRangePicker.d.ts.map +1 -1
  73. package/dist/esm/components/table/TableDateRangePicker.js +32 -6
  74. package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
  75. package/dist/esm/components/table/TableFilter.d.ts +1 -0
  76. package/dist/esm/components/table/TableFilter.d.ts.map +1 -1
  77. package/dist/esm/components/table/TableFilter.js +3 -1
  78. package/dist/esm/components/table/TableFilter.js.map +1 -1
  79. package/dist/esm/components/table/TableHeader.d.ts.map +1 -1
  80. package/dist/esm/components/table/TableHeader.js +3 -1
  81. package/dist/esm/components/table/TableHeader.js.map +1 -1
  82. package/dist/esm/components/table/TableLayoutControl.d.ts +3 -0
  83. package/dist/esm/components/table/TableLayoutControl.d.ts.map +1 -0
  84. package/dist/esm/components/table/TableLayoutControl.js +40 -0
  85. package/dist/esm/components/table/TableLayoutControl.js.map +1 -0
  86. package/dist/esm/components/table/TableLoading.d.ts +4 -0
  87. package/dist/esm/components/table/TableLoading.d.ts.map +1 -0
  88. package/dist/esm/components/table/TableLoading.js +18 -0
  89. package/dist/esm/components/table/TableLoading.js.map +1 -0
  90. package/dist/esm/components/table/TablePredicate.d.ts +12 -2
  91. package/dist/esm/components/table/TablePredicate.d.ts.map +1 -1
  92. package/dist/esm/components/table/TablePredicate.js +30 -5
  93. package/dist/esm/components/table/TablePredicate.js.map +1 -1
  94. package/dist/esm/components/table/Th.d.ts.map +1 -1
  95. package/dist/esm/components/table/Th.js +2 -1
  96. package/dist/esm/components/table/Th.js.map +1 -1
  97. package/dist/esm/components/table/index.d.ts +2 -1
  98. package/dist/esm/components/table/index.d.ts.map +1 -1
  99. package/dist/esm/components/table/index.js +1 -0
  100. package/dist/esm/components/table/index.js.map +1 -1
  101. package/dist/esm/components/table/layouts/RowLayout.d.ts +3 -0
  102. package/dist/esm/components/table/layouts/RowLayout.d.ts.map +1 -0
  103. package/dist/esm/components/table/layouts/RowLayout.js +146 -0
  104. package/dist/esm/components/table/layouts/RowLayout.js.map +1 -0
  105. package/dist/esm/components/table/layouts/TableLayouts.d.ts +4 -0
  106. package/dist/esm/components/table/layouts/TableLayouts.d.ts.map +1 -0
  107. package/dist/esm/components/table/layouts/TableLayouts.js +6 -0
  108. package/dist/esm/components/table/layouts/TableLayouts.js.map +1 -0
  109. package/dist/esm/theme/Theme.js +7 -5
  110. package/dist/esm/theme/Theme.js.map +1 -1
  111. package/package.json +6 -6
  112. package/src/components/table/Table.styles.ts +33 -88
  113. package/src/components/table/Table.tsx +39 -86
  114. package/src/components/table/Table.types.ts +59 -0
  115. package/src/components/table/TableActions.tsx +22 -6
  116. package/src/components/table/TableDateRangePicker.tsx +27 -6
  117. package/src/components/table/TableFilter.tsx +4 -3
  118. package/src/components/table/TableHeader.tsx +2 -0
  119. package/src/components/table/TableLayoutControl.tsx +29 -0
  120. package/src/components/table/TableLoading.tsx +8 -0
  121. package/src/components/table/TablePredicate.tsx +24 -7
  122. package/src/components/table/Th.tsx +1 -0
  123. package/src/components/table/__tests__/Table.spec.tsx +121 -369
  124. package/src/components/table/index.ts +9 -1
  125. package/src/components/table/layouts/RowLayout.tsx +150 -0
  126. package/src/components/table/layouts/TableLayouts.tsx +5 -0
  127. package/src/components/table/layouts/__tests__/RowLayout.spec.tsx +296 -0
  128. package/src/theme/Theme.tsx +5 -5
@@ -0,0 +1,150 @@
1
+ import {ListSize16Px} from '@coveord/plasma-react-icons';
2
+ import {Box, Collapse, createStyles} from '@mantine/core';
3
+ import {flexRender} from '@tanstack/react-table';
4
+ import {defaultColumnSizing} from '@tanstack/table-core';
5
+ import {Fragment} from 'react';
6
+ import {TableLayout, TableLayoutProps} from '../Table.types';
7
+ import {TableCollapsibleColumn} from '../TableCollapsibleColumn';
8
+ import {useTable} from '../TableContext';
9
+ import {TableLoading} from '../TableLoading';
10
+ import {Th} from '../Th';
11
+
12
+ interface TableStylesParams {
13
+ multiRowSelectionEnabled: boolean;
14
+ disableRowSelection: boolean;
15
+ }
16
+
17
+ const useStyles = createStyles<string, TableStylesParams>((theme, {multiRowSelectionEnabled, disableRowSelection}) => {
18
+ const rowBackgroundColor =
19
+ theme.colorScheme === 'dark'
20
+ ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)
21
+ : theme.colors[theme.primaryColor][0];
22
+ return {
23
+ headerColumns: {
24
+ '& th:first-of-type > *': {
25
+ paddingLeft: theme.spacing.xl,
26
+ },
27
+
28
+ '& input[type=checkbox]': {
29
+ backgroundColor: disableRowSelection ? `${theme.colors.gray[2]}` : undefined,
30
+ borderColor: disableRowSelection ? `${theme.colors.gray[3]}` : `${theme.colors.gray[4]}`,
31
+ pointerEvents: disableRowSelection ? 'none' : 'auto',
32
+ cursor: disableRowSelection ? 'not-allowed' : 'default',
33
+
34
+ '& + svg': {
35
+ color: disableRowSelection ? `${theme.colors.gray[5]}` : 'inherit',
36
+ },
37
+ },
38
+ },
39
+
40
+ rowSelected: {
41
+ backgroundColor: multiRowSelectionEnabled ? undefined : rowBackgroundColor,
42
+ },
43
+
44
+ rowUnselectable: {
45
+ '& input[type=checkbox]': {
46
+ backgroundColor: `${theme.colors.gray[2]}`,
47
+ borderColor: `${theme.colors.gray[3]}`,
48
+ pointerEvents: 'none',
49
+ cursor: 'not-allowed',
50
+
51
+ '&:checked + svg': {
52
+ color: `${theme.colors.gray[5]}`,
53
+ },
54
+ },
55
+ },
56
+
57
+ rowCollapsibleButtonCell: {
58
+ textAlign: 'right',
59
+ padding: `calc(${theme.spacing.xs}/2) ${theme.spacing.sm} !important`,
60
+ },
61
+
62
+ row: {
63
+ '&:hover': {
64
+ backgroundColor: rowBackgroundColor,
65
+ },
66
+ },
67
+ };
68
+ });
69
+
70
+ const RowLayoutHeader = <T,>({table}: TableLayoutProps<T>) => {
71
+ const {multiRowSelectionEnabled, disableRowSelection} = useTable();
72
+ const {classes} = useStyles({disableRowSelection, multiRowSelectionEnabled});
73
+ const headers = table.getHeaderGroups().map((headerGroup) => (
74
+ <tr key={headerGroup.id} className={classes.headerColumns}>
75
+ {headerGroup.headers.map((columnHeader) => (
76
+ <Th key={columnHeader.id} header={columnHeader} />
77
+ ))}
78
+ </tr>
79
+ ));
80
+ return <>{headers}</>;
81
+ };
82
+
83
+ const RowLayoutBody = <T,>({table, doubleClickAction, getExpandChildren, loading}: TableLayoutProps<T>) => {
84
+ const {multiRowSelectionEnabled, disableRowSelection} = useTable();
85
+ const {classes, cx} = useStyles({disableRowSelection, multiRowSelectionEnabled});
86
+
87
+ const rows = table.getRowModel().rows.map((row) => {
88
+ const rowChildren = getExpandChildren?.(row.original) ?? null;
89
+ const isSelected = !!row.getIsSelected();
90
+
91
+ return (
92
+ <Fragment key={row.id}>
93
+ <tr
94
+ onClick={() => (disableRowSelection ? undefined : row.toggleSelected())}
95
+ onDoubleClick={() => doubleClickAction?.(row.original)}
96
+ className={cx(classes.row, {
97
+ [classes.rowSelected]: isSelected,
98
+ [classes.rowUnselectable]: disableRowSelection,
99
+ })}
100
+ aria-selected={isSelected}
101
+ >
102
+ {row.getVisibleCells().map((cell) => {
103
+ const size = cell.column.getSize();
104
+ const width = size !== defaultColumnSizing.size ? size : undefined;
105
+ return (
106
+ <td
107
+ key={cell.id}
108
+ style={{width}}
109
+ className={cx({
110
+ [classes.rowCollapsibleButtonCell]: cell.column.id === TableCollapsibleColumn.id,
111
+ })}
112
+ >
113
+ <TableLoading visible={loading}>
114
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
115
+ </TableLoading>
116
+ </td>
117
+ );
118
+ })}
119
+ </tr>
120
+ {rowChildren ? (
121
+ <tr>
122
+ <td
123
+ colSpan={table.getAllColumns().length}
124
+ style={{
125
+ padding: 0,
126
+ borderTop: row.getIsExpanded() ? undefined : 'none',
127
+ borderBottom: row.getIsExpanded() ? undefined : 'none',
128
+ }}
129
+ >
130
+ <Collapse in={row.getIsExpanded()}>
131
+ <Box px="sm" py="xs">
132
+ {rowChildren}
133
+ </Box>
134
+ </Collapse>
135
+ </td>
136
+ </tr>
137
+ ) : null}
138
+ </Fragment>
139
+ );
140
+ });
141
+
142
+ return <>{rows}</>;
143
+ };
144
+
145
+ export const RowLayout: TableLayout = {
146
+ name: 'Rows',
147
+ icon: ListSize16Px,
148
+ Header: RowLayoutHeader,
149
+ Body: RowLayoutBody,
150
+ };
@@ -0,0 +1,5 @@
1
+ import {RowLayout} from './RowLayout';
2
+
3
+ export const TableLayouts = {
4
+ Rows: RowLayout,
5
+ };
@@ -0,0 +1,296 @@
1
+ import {ColumnDef, createColumnHelper} from '@tanstack/table-core';
2
+ import {render, screen, userEvent, waitFor, within} from '@test-utils';
3
+ import {FunctionComponent} from 'react';
4
+ import {Table} from '../../Table';
5
+
6
+ describe('RowLayout', () => {
7
+ type RowData = {id: string; firstName: string; lastName?: string};
8
+
9
+ const columnHelper = createColumnHelper<RowData>();
10
+ const columns: Array<ColumnDef<RowData>> = [
11
+ columnHelper.accessor('firstName', {enableSorting: false}),
12
+ columnHelper.accessor('lastName', {enableSorting: false}),
13
+ ];
14
+
15
+ it('renders the data using the RowLayout by default', () => {
16
+ render(
17
+ <Table
18
+ getRowId={({id}) => id}
19
+ data={[{id: '🆔', firstName: 'first', lastName: 'last'}]}
20
+ columns={columns}
21
+ />
22
+ );
23
+
24
+ expect(screen.getByRole('columnheader', {name: 'firstName'})).toBeVisible();
25
+ expect(screen.getByRole('columnheader', {name: 'lastName'})).toBeVisible();
26
+
27
+ expect(
28
+ screen.getByRole('cell', {
29
+ name: /first/i,
30
+ })
31
+ ).toBeVisible();
32
+ expect(
33
+ screen.getByRole('cell', {
34
+ name: /last/i,
35
+ })
36
+ ).toBeVisible();
37
+ });
38
+
39
+ it('formats the data', () => {
40
+ const customColumns: Array<ColumnDef<RowData>> = [
41
+ columnHelper.accessor('firstName', {
42
+ header: () => 'First Name',
43
+ cell: (info) => info.getValue().toUpperCase(),
44
+ enableSorting: false,
45
+ }),
46
+ columnHelper.accessor('lastName', {
47
+ header: () => 'Last Name',
48
+ cell: (info) => info.getValue().toUpperCase(),
49
+ enableSorting: false,
50
+ }),
51
+ ];
52
+ render(<Table data={[{id: '🆔', firstName: 'first', lastName: 'last'}]} columns={customColumns} />);
53
+
54
+ expect(screen.getByRole('columnheader', {name: 'First Name'})).toBeVisible();
55
+ expect(screen.getByRole('columnheader', {name: 'Last Name'})).toBeVisible();
56
+
57
+ expect(screen.getByRole('cell', {name: 'FIRST'})).toBeVisible();
58
+ expect(screen.getByRole('cell', {name: 'LAST'})).toBeVisible();
59
+ });
60
+
61
+ it('opens the collapsible rows when the user click on the toggle', async () => {
62
+ const user = userEvent.setup();
63
+ const Fixture: FunctionComponent<{row: RowData}> = ({row}) => <div>Collapsible content: {row.lastName}</div>;
64
+ const customColumns: Array<ColumnDef<RowData>> = [
65
+ columnHelper.accessor('firstName', {
66
+ enableSorting: false,
67
+ }),
68
+ Table.CollapsibleColumn as ColumnDef<RowData>,
69
+ ];
70
+ render(
71
+ <Table
72
+ getRowId={({id}) => id}
73
+ data={[{id: '🆔', firstName: 'first', lastName: 'last'}]}
74
+ getExpandChildren={(row: RowData) => <Fixture row={row} />}
75
+ columns={customColumns}
76
+ />
77
+ );
78
+
79
+ // wait for the collapsible icon to show
80
+ await screen.findByRole('button', {name: 'arrowHeadDown'});
81
+
82
+ expect(screen.queryByText('Collapsible content: last')).not.toBeVisible();
83
+
84
+ await user.click(screen.getByRole('button', {name: 'arrowHeadDown'}));
85
+ await waitFor(() => {
86
+ expect(screen.queryByText('Collapsible content: last')).toBeVisible();
87
+ });
88
+ });
89
+
90
+ it('renders the collapsible button only for rows that can be expanded', async () => {
91
+ const Fixture: FunctionComponent<{row: RowData}> = ({row}) => (
92
+ <div>
93
+ Collapsible content: {row.firstName} {row.lastName}
94
+ </div>
95
+ );
96
+ const customColumns: Array<ColumnDef<RowData>> = [
97
+ columnHelper.accessor('firstName', {
98
+ enableSorting: false,
99
+ }),
100
+ Table.CollapsibleColumn as ColumnDef<RowData>,
101
+ ];
102
+ render(
103
+ <Table
104
+ getRowId={({id}) => id}
105
+ data={[
106
+ {id: '🆔-1', firstName: 'Luke', lastName: 'Skywalker'},
107
+ {id: '🆔-2', firstName: 'Lea', lastName: 'Skywalker'},
108
+ {id: '🆔-3', firstName: 'Han', lastName: 'Solo'},
109
+ ]}
110
+ getExpandChildren={(row: RowData) => (row.lastName === 'Skywalker' ? <Fixture row={row} /> : null)}
111
+ columns={customColumns}
112
+ />
113
+ );
114
+
115
+ // wait for the collapsible icon to show
116
+ await screen.findAllByRole('button', {name: 'arrowHeadDown'});
117
+
118
+ const allRows = screen.getAllByRole('button', {name: 'arrowHeadDown'});
119
+ expect(allRows).toHaveLength(2);
120
+ });
121
+
122
+ it('closes the opened collapsible when using the accordion column and the user expand a different row', async () => {
123
+ const user = userEvent.setup();
124
+ const Fixture: FunctionComponent<{row: RowData}> = ({row}) => <div>Collapsible content: {row.lastName}</div>;
125
+ const customColumns: Array<ColumnDef<RowData>> = [
126
+ columnHelper.accessor('firstName', {
127
+ enableSorting: false,
128
+ }),
129
+ Table.AccordionColumn as ColumnDef<RowData>,
130
+ ];
131
+ render(
132
+ <Table
133
+ getRowId={({id}) => id}
134
+ data={[
135
+ {id: '🆔-1', firstName: 'Jack', lastName: 'Russel'},
136
+ {id: '🆔-2', firstName: 'Golden', lastName: 'Retriever'},
137
+ ]}
138
+ getExpandChildren={(row: RowData) => <Fixture row={row} />}
139
+ columns={customColumns}
140
+ />
141
+ );
142
+
143
+ // wait for the collapsible icon to show
144
+ await screen.findAllByRole('button', {name: 'arrowHeadDown'});
145
+
146
+ expect(screen.queryByText('Collapsible content: Russel')).not.toBeVisible();
147
+ expect(screen.queryByText('Collapsible content: Retriever')).not.toBeVisible();
148
+
149
+ await user.click(within(screen.getAllByRole('row')[1]).getByRole('button', {name: 'arrowHeadDown'}));
150
+ await waitFor(() => {
151
+ expect(screen.queryByText('Collapsible content: Russel')).toBeVisible();
152
+ });
153
+ expect(screen.queryByText('Collapsible content: Retriever')).not.toBeVisible();
154
+
155
+ await user.click(within(screen.getAllByRole('row')[3]).getByRole('button', {name: 'arrowHeadDown'}));
156
+
157
+ await waitFor(() => {
158
+ expect(screen.queryByText('Collapsible content: Retriever')).toBeVisible();
159
+ });
160
+ expect(screen.queryByText('Collapsible content: Russel')).not.toBeVisible();
161
+ });
162
+
163
+ it('calls an action when user double clicks on a row', async () => {
164
+ const user = userEvent.setup();
165
+ const doubleClickSpy = vi.fn();
166
+ render(
167
+ <Table<RowData>
168
+ getRowId={({id}) => id}
169
+ data={[
170
+ {id: '🆔-1', firstName: 'Mario'},
171
+ {id: '🆔-2', firstName: 'Luigi'},
172
+ ]}
173
+ columns={columns}
174
+ doubleClickAction={doubleClickSpy}
175
+ ></Table>
176
+ );
177
+ await user.dblClick(screen.getByRole('cell', {name: 'Mario'}));
178
+ expect(doubleClickSpy).toHaveBeenCalledTimes(1);
179
+ expect(doubleClickSpy).toHaveBeenCalledWith({id: '🆔-1', firstName: 'Mario'});
180
+ });
181
+
182
+ describe('when multi row selection is enabled', () => {
183
+ it('displays a checkbox as the first cell of each row', () => {
184
+ render(
185
+ <Table
186
+ getRowId={({id}) => id}
187
+ data={[
188
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
189
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
190
+ ]}
191
+ columns={columns}
192
+ multiRowSelectionEnabled
193
+ />
194
+ );
195
+
196
+ expect(screen.getByRole('columnheader', {name: /select all from this page/i})).toBeInTheDocument();
197
+
198
+ const rows = screen.getAllByRole('row');
199
+ rows.forEach((row) => {
200
+ expect(within(row).getByRole('checkbox', {name: /select/i})).toBeInTheDocument();
201
+ });
202
+ });
203
+
204
+ it('selects the rows specified in the initial state on mount', () => {
205
+ render(
206
+ <Table
207
+ getRowId={({id}) => id}
208
+ data={[
209
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
210
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
211
+ ]}
212
+ columns={columns}
213
+ multiRowSelectionEnabled
214
+ initialState={{
215
+ rowSelection: {'🆔-2': {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'}},
216
+ }}
217
+ />
218
+ );
219
+
220
+ expect(screen.getByRole('row', {name: /jane doe/i, selected: true})).toBeInTheDocument();
221
+ });
222
+
223
+ it('selects all rows of the current page when clicking on the checkbox that is in the column header', async () => {
224
+ const user = userEvent.setup();
225
+ render(
226
+ <Table
227
+ getRowId={({id}) => id}
228
+ data={[
229
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
230
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
231
+ ]}
232
+ columns={columns}
233
+ multiRowSelectionEnabled
234
+ />
235
+ );
236
+
237
+ const selectAll = screen.getByRole('checkbox', {name: /select all from this page/i});
238
+ await user.click(selectAll);
239
+
240
+ expect(screen.getAllByRole('row', {selected: true})).toHaveLength(2);
241
+ await user.click(selectAll);
242
+
243
+ expect(screen.queryAllByRole('row', {selected: true})).toEqual([]);
244
+ });
245
+
246
+ it('prevents row selection if disableRowSelection is true', async () => {
247
+ const user = userEvent.setup();
248
+
249
+ render(
250
+ <div>
251
+ <Table
252
+ getRowId={({id}) => id}
253
+ data={[
254
+ {id: '🆔-1', firstName: 'first', lastName: 'last'},
255
+ {id: '🆔-2', firstName: 'patate', lastName: 'king'},
256
+ ]}
257
+ columns={columns}
258
+ multiRowSelectionEnabled
259
+ disableRowSelection
260
+ />
261
+ </div>
262
+ );
263
+
264
+ await user.click(screen.getByRole('row', {name: /patate king/i}));
265
+ expect(screen.getByRole('row', {name: /patate king/i, selected: false})).toBeInTheDocument();
266
+ expect(screen.queryByRole('row', {name: /patate king/i, selected: true})).not.toBeInTheDocument();
267
+
268
+ await user.click(screen.getByRole('row', {name: /first last/i}));
269
+ expect(screen.getByRole('row', {name: /first last/i, selected: false})).toBeInTheDocument();
270
+ expect(screen.queryByRole('row', {name: /first last/i, selected: true})).not.toBeInTheDocument();
271
+ });
272
+
273
+ it('prevents click on checkboxes if disableRowSelection is true', async () => {
274
+ render(
275
+ <Table
276
+ getRowId={({id}) => id}
277
+ data={[
278
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
279
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
280
+ ]}
281
+ columns={columns}
282
+ multiRowSelectionEnabled
283
+ disableRowSelection
284
+ />
285
+ );
286
+
287
+ expect(screen.getByRole('checkbox', {name: /select all/i})).toHaveStyle('pointerEvents: none');
288
+
289
+ const rows = screen.getAllByRole('row');
290
+ rows.forEach(async (row) => {
291
+ const checkbox = within(row).getByRole('checkbox', {name: /select/i});
292
+ expect(checkbox).toHaveStyle('pointerEvents: none');
293
+ });
294
+ });
295
+ });
296
+ });
@@ -276,12 +276,12 @@ export const plasmaTheme: MantineThemeOverride = {
276
276
  },
277
277
  },
278
278
  },
279
- Segmented: {
280
- styles: {
281
- control: {
282
- zIndex: 'unset',
279
+ SegmentedControl: {
280
+ styles: (theme) => ({
281
+ root: {
282
+ backgroundColor: theme.colors.gray[2],
283
283
  },
284
- },
284
+ }),
285
285
  },
286
286
  Stepper: {
287
287
  defaultProps: {