@coveord/plasma-mantine 52.5.0 → 52.7.0

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 (223) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +31 -30
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/blank-slate/BlankSlate.js.map +1 -1
  5. package/dist/cjs/components/button/Button.js.map +1 -1
  6. package/dist/cjs/components/button/ButtonWithDisabledTooltip.js.map +1 -1
  7. package/dist/cjs/components/code-editor/CodeEditor.js.map +1 -1
  8. package/dist/cjs/components/code-editor/languages/xml.js.map +1 -1
  9. package/dist/cjs/components/collection/Collection.js.map +1 -1
  10. package/dist/cjs/components/collection/Collection.styles.js.map +1 -1
  11. package/dist/cjs/components/collection/CollectionItem.js.map +1 -1
  12. package/dist/cjs/components/copyToClipboard/CopyToClipboard.js.map +1 -1
  13. package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
  14. package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  15. package/dist/cjs/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
  16. package/dist/cjs/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
  17. package/dist/cjs/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
  18. package/dist/cjs/components/header/Header.d.ts.map +1 -1
  19. package/dist/cjs/components/header/Header.js +3 -0
  20. package/dist/cjs/components/header/Header.js.map +1 -1
  21. package/dist/cjs/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  22. package/dist/cjs/components/inline-confirm/InlineConfirm.js.map +1 -1
  23. package/dist/cjs/components/inline-confirm/InlineConfirmButton.js.map +1 -1
  24. package/dist/cjs/components/inline-confirm/InlineConfirmContext.js.map +1 -1
  25. package/dist/cjs/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
  26. package/dist/cjs/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
  27. package/dist/cjs/components/inline-confirm/useInlineConfirm.js.map +1 -1
  28. package/dist/cjs/components/menu/Menu.js.map +1 -1
  29. package/dist/cjs/components/modal-wizard/ModalWizard.js.map +1 -1
  30. package/dist/cjs/components/modal-wizard/ModalWizardStep.js.map +1 -1
  31. package/dist/cjs/components/prompt/Prompt.js.map +1 -1
  32. package/dist/cjs/components/prompt/PromptFooter.js.map +1 -1
  33. package/dist/cjs/components/sticky-footer/StickyFooter.js.map +1 -1
  34. package/dist/cjs/components/table/Table.d.ts.map +1 -1
  35. package/dist/cjs/components/table/Table.js +33 -84
  36. package/dist/cjs/components/table/Table.js.map +1 -1
  37. package/dist/cjs/components/table/Table.styles.d.ts +2 -4
  38. package/dist/cjs/components/table/Table.styles.d.ts.map +1 -1
  39. package/dist/cjs/components/table/Table.styles.js +7 -25
  40. package/dist/cjs/components/table/Table.styles.js.map +1 -1
  41. package/dist/cjs/components/table/Table.types.d.ts +68 -2
  42. package/dist/cjs/components/table/Table.types.d.ts.map +1 -1
  43. package/dist/cjs/components/table/TableActions.d.ts +12 -2
  44. package/dist/cjs/components/table/TableActions.d.ts.map +1 -1
  45. package/dist/cjs/components/table/TableActions.js +29 -7
  46. package/dist/cjs/components/table/TableActions.js.map +1 -1
  47. package/dist/cjs/components/table/TableCollapsibleColumn.js.map +1 -1
  48. package/dist/cjs/components/table/TableContext.js.map +1 -1
  49. package/dist/cjs/components/table/TableDateRangePicker.d.ts +12 -1
  50. package/dist/cjs/components/table/TableDateRangePicker.d.ts.map +1 -1
  51. package/dist/cjs/components/table/TableDateRangePicker.js +38 -12
  52. package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
  53. package/dist/cjs/components/table/TableFilter.d.ts +1 -0
  54. package/dist/cjs/components/table/TableFilter.d.ts.map +1 -1
  55. package/dist/cjs/components/table/TableFilter.js +3 -1
  56. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  57. package/dist/cjs/components/table/TableFooter.js.map +1 -1
  58. package/dist/cjs/components/table/TableHeader.d.ts.map +1 -1
  59. package/dist/cjs/components/table/TableHeader.js +5 -2
  60. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  61. package/dist/cjs/components/table/TableLayoutControl.d.ts +3 -0
  62. package/dist/cjs/components/table/TableLayoutControl.d.ts.map +1 -0
  63. package/dist/cjs/components/table/TableLayoutControl.js +50 -0
  64. package/dist/cjs/components/table/TableLayoutControl.js.map +1 -0
  65. package/dist/cjs/components/table/TableLoading.d.ts +4 -0
  66. package/dist/cjs/components/table/TableLoading.d.ts.map +1 -0
  67. package/dist/cjs/components/table/TableLoading.js +28 -0
  68. package/dist/cjs/components/table/TableLoading.js.map +1 -0
  69. package/dist/cjs/components/table/TablePagination.js.map +1 -1
  70. package/dist/cjs/components/table/TablePerPage.js.map +1 -1
  71. package/dist/cjs/components/table/TablePredicate.d.ts +12 -2
  72. package/dist/cjs/components/table/TablePredicate.d.ts.map +1 -1
  73. package/dist/cjs/components/table/TablePredicate.js +29 -4
  74. package/dist/cjs/components/table/TablePredicate.js.map +1 -1
  75. package/dist/cjs/components/table/TableSelectableColumn.js.map +1 -1
  76. package/dist/cjs/components/table/Th.d.ts.map +1 -1
  77. package/dist/cjs/components/table/Th.js +2 -1
  78. package/dist/cjs/components/table/Th.js.map +1 -1
  79. package/dist/cjs/components/table/index.d.ts +1 -0
  80. package/dist/cjs/components/table/index.d.ts.map +1 -1
  81. package/dist/cjs/components/table/index.js +12 -3
  82. package/dist/cjs/components/table/index.js.map +1 -1
  83. package/dist/cjs/components/table/layouts/RowLayout.d.ts +3 -0
  84. package/dist/cjs/components/table/layouts/RowLayout.d.ts.map +1 -0
  85. package/dist/cjs/components/table/layouts/RowLayout.js +156 -0
  86. package/dist/cjs/components/table/layouts/RowLayout.js.map +1 -0
  87. package/dist/cjs/components/table/layouts/TableLayouts.d.ts +4 -0
  88. package/dist/cjs/components/table/layouts/TableLayouts.d.ts.map +1 -0
  89. package/dist/cjs/components/table/layouts/TableLayouts.js +16 -0
  90. package/dist/cjs/components/table/layouts/TableLayouts.js.map +1 -0
  91. package/dist/cjs/components/table/useRowSelection.js.map +1 -1
  92. package/dist/cjs/form/FormProvider.js.map +1 -1
  93. package/dist/cjs/form/useForm.js.map +1 -1
  94. package/dist/cjs/hooks/useControlledList.js.map +1 -1
  95. package/dist/cjs/hooks/useParentHeight.js.map +1 -1
  96. package/dist/cjs/index.js.map +1 -1
  97. package/dist/cjs/theme/PlasmaColors.js.map +1 -1
  98. package/dist/cjs/theme/Plasmantine.js.map +1 -1
  99. package/dist/cjs/theme/Theme.js +12 -10
  100. package/dist/cjs/theme/Theme.js.map +1 -1
  101. package/dist/cjs/utils/createPolymorphicComponent.js.map +1 -1
  102. package/dist/cjs/utils/overrideComponent.js.map +1 -1
  103. package/dist/esm/components/blank-slate/BlankSlate.js.map +1 -1
  104. package/dist/esm/components/button/Button.js.map +1 -1
  105. package/dist/esm/components/button/ButtonWithDisabledTooltip.js.map +1 -1
  106. package/dist/esm/components/code-editor/CodeEditor.js.map +1 -1
  107. package/dist/esm/components/code-editor/languages/xml.js.map +1 -1
  108. package/dist/esm/components/collection/Collection.js.map +1 -1
  109. package/dist/esm/components/collection/Collection.styles.js.map +1 -1
  110. package/dist/esm/components/collection/CollectionItem.js.map +1 -1
  111. package/dist/esm/components/copyToClipboard/CopyToClipboard.js.map +1 -1
  112. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
  113. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  114. package/dist/esm/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
  115. package/dist/esm/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
  116. package/dist/esm/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
  117. package/dist/esm/components/header/Header.d.ts.map +1 -1
  118. package/dist/esm/components/header/Header.js +3 -0
  119. package/dist/esm/components/header/Header.js.map +1 -1
  120. package/dist/esm/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  121. package/dist/esm/components/inline-confirm/InlineConfirm.js.map +1 -1
  122. package/dist/esm/components/inline-confirm/InlineConfirmButton.js.map +1 -1
  123. package/dist/esm/components/inline-confirm/InlineConfirmContext.js.map +1 -1
  124. package/dist/esm/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
  125. package/dist/esm/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
  126. package/dist/esm/components/inline-confirm/useInlineConfirm.js.map +1 -1
  127. package/dist/esm/components/menu/Menu.js.map +1 -1
  128. package/dist/esm/components/modal-wizard/ModalWizard.js.map +1 -1
  129. package/dist/esm/components/modal-wizard/ModalWizardStep.js.map +1 -1
  130. package/dist/esm/components/prompt/Prompt.js.map +1 -1
  131. package/dist/esm/components/prompt/PromptFooter.js.map +1 -1
  132. package/dist/esm/components/sticky-footer/StickyFooter.js.map +1 -1
  133. package/dist/esm/components/table/Table.d.ts.map +1 -1
  134. package/dist/esm/components/table/Table.js +36 -87
  135. package/dist/esm/components/table/Table.js.map +1 -1
  136. package/dist/esm/components/table/Table.styles.d.ts +2 -4
  137. package/dist/esm/components/table/Table.styles.d.ts.map +1 -1
  138. package/dist/esm/components/table/Table.styles.js +7 -25
  139. package/dist/esm/components/table/Table.styles.js.map +1 -1
  140. package/dist/esm/components/table/Table.types.d.ts +68 -2
  141. package/dist/esm/components/table/Table.types.d.ts.map +1 -1
  142. package/dist/esm/components/table/Table.types.js.map +1 -1
  143. package/dist/esm/components/table/TableActions.d.ts +12 -2
  144. package/dist/esm/components/table/TableActions.d.ts.map +1 -1
  145. package/dist/esm/components/table/TableActions.js +30 -8
  146. package/dist/esm/components/table/TableActions.js.map +1 -1
  147. package/dist/esm/components/table/TableCollapsibleColumn.js.map +1 -1
  148. package/dist/esm/components/table/TableContext.js.map +1 -1
  149. package/dist/esm/components/table/TableDateRangePicker.d.ts +12 -1
  150. package/dist/esm/components/table/TableDateRangePicker.d.ts.map +1 -1
  151. package/dist/esm/components/table/TableDateRangePicker.js +39 -13
  152. package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
  153. package/dist/esm/components/table/TableFilter.d.ts +1 -0
  154. package/dist/esm/components/table/TableFilter.d.ts.map +1 -1
  155. package/dist/esm/components/table/TableFilter.js +3 -1
  156. package/dist/esm/components/table/TableFilter.js.map +1 -1
  157. package/dist/esm/components/table/TableFooter.js.map +1 -1
  158. package/dist/esm/components/table/TableHeader.d.ts.map +1 -1
  159. package/dist/esm/components/table/TableHeader.js +5 -2
  160. package/dist/esm/components/table/TableHeader.js.map +1 -1
  161. package/dist/esm/components/table/TableLayoutControl.d.ts +3 -0
  162. package/dist/esm/components/table/TableLayoutControl.d.ts.map +1 -0
  163. package/dist/esm/components/table/TableLayoutControl.js +40 -0
  164. package/dist/esm/components/table/TableLayoutControl.js.map +1 -0
  165. package/dist/esm/components/table/TableLoading.d.ts +4 -0
  166. package/dist/esm/components/table/TableLoading.d.ts.map +1 -0
  167. package/dist/esm/components/table/TableLoading.js +18 -0
  168. package/dist/esm/components/table/TableLoading.js.map +1 -0
  169. package/dist/esm/components/table/TablePagination.js.map +1 -1
  170. package/dist/esm/components/table/TablePerPage.js.map +1 -1
  171. package/dist/esm/components/table/TablePredicate.d.ts +12 -2
  172. package/dist/esm/components/table/TablePredicate.d.ts.map +1 -1
  173. package/dist/esm/components/table/TablePredicate.js +30 -5
  174. package/dist/esm/components/table/TablePredicate.js.map +1 -1
  175. package/dist/esm/components/table/TableSelectableColumn.js.map +1 -1
  176. package/dist/esm/components/table/Th.d.ts.map +1 -1
  177. package/dist/esm/components/table/Th.js +2 -1
  178. package/dist/esm/components/table/Th.js.map +1 -1
  179. package/dist/esm/components/table/index.d.ts +1 -0
  180. package/dist/esm/components/table/index.d.ts.map +1 -1
  181. package/dist/esm/components/table/index.js +1 -0
  182. package/dist/esm/components/table/index.js.map +1 -1
  183. package/dist/esm/components/table/layouts/RowLayout.d.ts +3 -0
  184. package/dist/esm/components/table/layouts/RowLayout.d.ts.map +1 -0
  185. package/dist/esm/components/table/layouts/RowLayout.js +146 -0
  186. package/dist/esm/components/table/layouts/RowLayout.js.map +1 -0
  187. package/dist/esm/components/table/layouts/TableLayouts.d.ts +4 -0
  188. package/dist/esm/components/table/layouts/TableLayouts.d.ts.map +1 -0
  189. package/dist/esm/components/table/layouts/TableLayouts.js +6 -0
  190. package/dist/esm/components/table/layouts/TableLayouts.js.map +1 -0
  191. package/dist/esm/components/table/useRowSelection.js.map +1 -1
  192. package/dist/esm/form/FormProvider.js.map +1 -1
  193. package/dist/esm/form/useForm.js.map +1 -1
  194. package/dist/esm/hooks/useControlledList.js.map +1 -1
  195. package/dist/esm/hooks/useParentHeight.js.map +1 -1
  196. package/dist/esm/theme/PlasmaColors.js.map +1 -1
  197. package/dist/esm/theme/Theme.js +12 -10
  198. package/dist/esm/theme/Theme.js.map +1 -1
  199. package/dist/esm/utils/overrideComponent.js.map +1 -1
  200. package/package.json +10 -10
  201. package/src/__tests__/VitestSetup.ts +7 -5
  202. package/src/components/date-range-picker/DateRangePickerInlineCalendar.tsx +3 -3
  203. package/src/components/header/Header.tsx +5 -1
  204. package/src/components/header/__tests__/Header.spec.tsx +1 -1
  205. package/src/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  206. package/src/components/table/Table.styles.ts +33 -63
  207. package/src/components/table/Table.tsx +42 -83
  208. package/src/components/table/Table.types.ts +71 -2
  209. package/src/components/table/TableActions.tsx +22 -6
  210. package/src/components/table/TableDateRangePicker.tsx +34 -12
  211. package/src/components/table/TableFilter.tsx +4 -3
  212. package/src/components/table/TableHeader.tsx +10 -2
  213. package/src/components/table/TableLayoutControl.tsx +29 -0
  214. package/src/components/table/TableLoading.tsx +8 -0
  215. package/src/components/table/TablePredicate.tsx +24 -7
  216. package/src/components/table/Th.tsx +1 -0
  217. package/src/components/table/__tests__/Table.spec.tsx +140 -316
  218. package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +41 -14
  219. package/src/components/table/index.ts +1 -0
  220. package/src/components/table/layouts/RowLayout.tsx +150 -0
  221. package/src/components/table/layouts/TableLayouts.tsx +5 -0
  222. package/src/components/table/layouts/__tests__/RowLayout.spec.tsx +296 -0
  223. package/src/theme/Theme.tsx +10 -10
@@ -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
+ });
@@ -97,11 +97,11 @@ export const plasmaTheme: MantineThemeOverride = {
97
97
  : `0 0 ${getSize({
98
98
  size,
99
99
  sizes: {
100
- xs: rem(440),
101
- sm: rem(550),
102
- md: rem(800),
103
- lg: rem(1334),
104
- xl: rem('85%'),
100
+ xs: rem(432),
101
+ sm: rem(664),
102
+ md: rem(896),
103
+ lg: rem(1120),
104
+ xl: rem('88%'),
105
105
  },
106
106
  })}`,
107
107
  overflow: 'auto',
@@ -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: {