@coveord/plasma-mantine 52.5.0 → 52.6.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 (150) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +26 -26
  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 +8 -5
  36. package/dist/cjs/components/table/Table.js.map +1 -1
  37. package/dist/cjs/components/table/Table.styles.d.ts +1 -0
  38. package/dist/cjs/components/table/Table.styles.d.ts.map +1 -1
  39. package/dist/cjs/components/table/Table.styles.js +21 -1
  40. package/dist/cjs/components/table/Table.styles.js.map +1 -1
  41. package/dist/cjs/components/table/Table.types.d.ts +12 -2
  42. package/dist/cjs/components/table/Table.types.d.ts.map +1 -1
  43. package/dist/cjs/components/table/TableActions.js.map +1 -1
  44. package/dist/cjs/components/table/TableCollapsibleColumn.js.map +1 -1
  45. package/dist/cjs/components/table/TableContext.js.map +1 -1
  46. package/dist/cjs/components/table/TableDateRangePicker.d.ts.map +1 -1
  47. package/dist/cjs/components/table/TableDateRangePicker.js +8 -8
  48. package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
  49. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  50. package/dist/cjs/components/table/TableFooter.js.map +1 -1
  51. package/dist/cjs/components/table/TableHeader.d.ts.map +1 -1
  52. package/dist/cjs/components/table/TableHeader.js +2 -1
  53. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  54. package/dist/cjs/components/table/TablePagination.js.map +1 -1
  55. package/dist/cjs/components/table/TablePerPage.js.map +1 -1
  56. package/dist/cjs/components/table/TablePredicate.js.map +1 -1
  57. package/dist/cjs/components/table/TableSelectableColumn.js.map +1 -1
  58. package/dist/cjs/components/table/Th.js.map +1 -1
  59. package/dist/cjs/components/table/index.js.map +1 -1
  60. package/dist/cjs/components/table/useRowSelection.js.map +1 -1
  61. package/dist/cjs/form/FormProvider.js.map +1 -1
  62. package/dist/cjs/form/useForm.js.map +1 -1
  63. package/dist/cjs/hooks/useControlledList.js.map +1 -1
  64. package/dist/cjs/hooks/useParentHeight.js.map +1 -1
  65. package/dist/cjs/index.js.map +1 -1
  66. package/dist/cjs/theme/PlasmaColors.js.map +1 -1
  67. package/dist/cjs/theme/Plasmantine.js.map +1 -1
  68. package/dist/cjs/theme/Theme.js +5 -5
  69. package/dist/cjs/theme/Theme.js.map +1 -1
  70. package/dist/cjs/utils/createPolymorphicComponent.js.map +1 -1
  71. package/dist/cjs/utils/overrideComponent.js.map +1 -1
  72. package/dist/esm/components/blank-slate/BlankSlate.js.map +1 -1
  73. package/dist/esm/components/button/Button.js.map +1 -1
  74. package/dist/esm/components/button/ButtonWithDisabledTooltip.js.map +1 -1
  75. package/dist/esm/components/code-editor/CodeEditor.js.map +1 -1
  76. package/dist/esm/components/code-editor/languages/xml.js.map +1 -1
  77. package/dist/esm/components/collection/Collection.js.map +1 -1
  78. package/dist/esm/components/collection/Collection.styles.js.map +1 -1
  79. package/dist/esm/components/collection/CollectionItem.js.map +1 -1
  80. package/dist/esm/components/copyToClipboard/CopyToClipboard.js.map +1 -1
  81. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
  82. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  83. package/dist/esm/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
  84. package/dist/esm/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
  85. package/dist/esm/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
  86. package/dist/esm/components/header/Header.d.ts.map +1 -1
  87. package/dist/esm/components/header/Header.js +3 -0
  88. package/dist/esm/components/header/Header.js.map +1 -1
  89. package/dist/esm/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  90. package/dist/esm/components/inline-confirm/InlineConfirm.js.map +1 -1
  91. package/dist/esm/components/inline-confirm/InlineConfirmButton.js.map +1 -1
  92. package/dist/esm/components/inline-confirm/InlineConfirmContext.js.map +1 -1
  93. package/dist/esm/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
  94. package/dist/esm/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
  95. package/dist/esm/components/inline-confirm/useInlineConfirm.js.map +1 -1
  96. package/dist/esm/components/menu/Menu.js.map +1 -1
  97. package/dist/esm/components/modal-wizard/ModalWizard.js.map +1 -1
  98. package/dist/esm/components/modal-wizard/ModalWizardStep.js.map +1 -1
  99. package/dist/esm/components/prompt/Prompt.js.map +1 -1
  100. package/dist/esm/components/prompt/PromptFooter.js.map +1 -1
  101. package/dist/esm/components/sticky-footer/StickyFooter.js.map +1 -1
  102. package/dist/esm/components/table/Table.d.ts.map +1 -1
  103. package/dist/esm/components/table/Table.js +9 -6
  104. package/dist/esm/components/table/Table.js.map +1 -1
  105. package/dist/esm/components/table/Table.styles.d.ts +1 -0
  106. package/dist/esm/components/table/Table.styles.d.ts.map +1 -1
  107. package/dist/esm/components/table/Table.styles.js +21 -1
  108. package/dist/esm/components/table/Table.styles.js.map +1 -1
  109. package/dist/esm/components/table/Table.types.d.ts +12 -2
  110. package/dist/esm/components/table/Table.types.d.ts.map +1 -1
  111. package/dist/esm/components/table/Table.types.js.map +1 -1
  112. package/dist/esm/components/table/TableActions.js.map +1 -1
  113. package/dist/esm/components/table/TableCollapsibleColumn.js.map +1 -1
  114. package/dist/esm/components/table/TableContext.js.map +1 -1
  115. package/dist/esm/components/table/TableDateRangePicker.d.ts.map +1 -1
  116. package/dist/esm/components/table/TableDateRangePicker.js +8 -8
  117. package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
  118. package/dist/esm/components/table/TableFilter.js.map +1 -1
  119. package/dist/esm/components/table/TableFooter.js.map +1 -1
  120. package/dist/esm/components/table/TableHeader.d.ts.map +1 -1
  121. package/dist/esm/components/table/TableHeader.js +2 -1
  122. package/dist/esm/components/table/TableHeader.js.map +1 -1
  123. package/dist/esm/components/table/TablePagination.js.map +1 -1
  124. package/dist/esm/components/table/TablePerPage.js.map +1 -1
  125. package/dist/esm/components/table/TablePredicate.js.map +1 -1
  126. package/dist/esm/components/table/TableSelectableColumn.js.map +1 -1
  127. package/dist/esm/components/table/Th.js.map +1 -1
  128. package/dist/esm/components/table/useRowSelection.js.map +1 -1
  129. package/dist/esm/form/FormProvider.js.map +1 -1
  130. package/dist/esm/form/useForm.js.map +1 -1
  131. package/dist/esm/hooks/useControlledList.js.map +1 -1
  132. package/dist/esm/hooks/useParentHeight.js.map +1 -1
  133. package/dist/esm/theme/PlasmaColors.js.map +1 -1
  134. package/dist/esm/theme/Theme.js +5 -5
  135. package/dist/esm/theme/Theme.js.map +1 -1
  136. package/dist/esm/utils/overrideComponent.js.map +1 -1
  137. package/package.json +8 -8
  138. package/src/__tests__/VitestSetup.ts +7 -5
  139. package/src/components/date-range-picker/DateRangePickerInlineCalendar.tsx +3 -3
  140. package/src/components/header/Header.tsx +5 -1
  141. package/src/components/header/__tests__/Header.spec.tsx +1 -1
  142. package/src/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  143. package/src/components/table/Table.styles.ts +26 -1
  144. package/src/components/table/Table.tsx +12 -6
  145. package/src/components/table/Table.types.ts +12 -2
  146. package/src/components/table/TableDateRangePicker.tsx +9 -8
  147. package/src/components/table/TableHeader.tsx +8 -2
  148. package/src/components/table/__tests__/Table.spec.tsx +72 -0
  149. package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +41 -14
  150. package/src/theme/Theme.tsx +5 -5
@@ -1,12 +1,14 @@
1
- import matchers, {TestingLibraryMatchers} from '@testing-library/jest-dom/matchers';
1
+ import type {TestingLibraryMatchers} from '@testing-library/jest-dom/matchers';
2
+ import matchers from '@testing-library/jest-dom/matchers';
2
3
  import {cleanup} from '@testing-library/react';
4
+ import {expect} from 'vitest';
3
5
 
4
- declare global {
5
- namespace Vi {
6
- interface JestAssertion<T = any> extends jest.Matchers<void, T>, TestingLibraryMatchers<T, void> {}
7
- }
6
+ declare module 'vitest' {
7
+ interface Assertion<T = any> extends jest.Matchers<void, T>, TestingLibraryMatchers<T, void> {}
8
8
  }
9
+
9
10
  expect.extend(matchers);
11
+
10
12
  Object.defineProperty(window, 'matchMedia', {
11
13
  writable: true,
12
14
  value: vi.fn().mockImplementation((query) => ({
@@ -108,12 +108,12 @@ export const DateRangePickerInlineCalendar = ({
108
108
  borderTop: `1px solid ${theme.colors.gray[2]}`,
109
109
  })}
110
110
  >
111
- <Button size="xs" onClick={onCalendarApply}>
112
- Apply
113
- </Button>
114
111
  <Button variant="outline" size="xs" onClick={onCancel}>
115
112
  Cancel
116
113
  </Button>
114
+ <Button size="xs" onClick={onCalendarApply}>
115
+ Apply
116
+ </Button>
117
117
  </Group>
118
118
  </>
119
119
  );
@@ -48,7 +48,11 @@ export const Header: HeaderType = ({description, borderBottom, children, variant
48
48
  >
49
49
  <Stack spacing={0}>
50
50
  {breadcrumbs}
51
- <Title order={variant === 'page' ? 1 : 3} color={variant === 'page' ? 'gray.5' : undefined}>
51
+ <Title
52
+ order={variant === 'page' ? 1 : 3}
53
+ color={variant === 'page' ? 'gray.5' : undefined}
54
+ sx={{wordBreak: 'break-word'}}
55
+ >
52
56
  {otherChildren}
53
57
  {docAnchor}
54
58
  </Title>
@@ -10,7 +10,7 @@ describe('Header', () => {
10
10
  const header = screen.getByRole('heading');
11
11
  expect(header).toMatchInlineSnapshot(`
12
12
  <h1
13
- class="mantine-Text-root mantine-Title-root mantine-d1yoif"
13
+ class="mantine-Text-root mantine-Title-root mantine-m67b81"
14
14
  >
15
15
  child
16
16
  </h1>
@@ -38,7 +38,7 @@ exports[`Header > renders the specified breadcrumbs above the title 1`] = `
38
38
  </a>
39
39
  </div>
40
40
  <h1
41
- class="mantine-Text-root mantine-Title-root mantine-d1yoif"
41
+ class="mantine-Text-root mantine-Title-root mantine-m67b81"
42
42
  >
43
43
  Title
44
44
  </h1>
@@ -2,9 +2,10 @@ import {createStyles} from '@mantine/core';
2
2
 
3
3
  interface TableStylesParams {
4
4
  multiRowSelectionEnabled: boolean;
5
+ disableRowSelection: boolean;
5
6
  }
6
7
 
7
- const useStyles = createStyles<string, TableStylesParams>((theme, {multiRowSelectionEnabled}) => {
8
+ const useStyles = createStyles<string, TableStylesParams>((theme, {multiRowSelectionEnabled, disableRowSelection}) => {
8
9
  const rowBackgroundColor =
9
10
  theme.colorScheme === 'dark'
10
11
  ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)
@@ -44,12 +45,36 @@ const useStyles = createStyles<string, TableStylesParams>((theme, {multiRowSelec
44
45
  '& th:first-of-type > *': {
45
46
  paddingLeft: theme.spacing.xl,
46
47
  },
48
+
49
+ '& input[type=checkbox]': {
50
+ backgroundColor: disableRowSelection ? `${theme.colors.gray[2]}` : undefined,
51
+ borderColor: disableRowSelection ? `${theme.colors.gray[3]}` : `${theme.colors.gray[4]}`,
52
+ pointerEvents: disableRowSelection ? 'none' : 'auto',
53
+ cursor: disableRowSelection ? 'not-allowed' : 'default',
54
+
55
+ '& + svg': {
56
+ color: disableRowSelection ? `${theme.colors.gray[5]}` : 'inherit',
57
+ },
58
+ },
47
59
  },
48
60
 
49
61
  rowSelected: {
50
62
  backgroundColor: multiRowSelectionEnabled ? undefined : rowBackgroundColor,
51
63
  },
52
64
 
65
+ rowUnselectable: {
66
+ '& input[type=checkbox]': {
67
+ backgroundColor: `${theme.colors.gray[2]}`,
68
+ borderColor: `${theme.colors.gray[3]}`,
69
+ pointerEvents: 'none',
70
+ cursor: 'not-allowed',
71
+
72
+ '&:checked + svg': {
73
+ color: `${theme.colors.gray[5]}`,
74
+ },
75
+ },
76
+ },
77
+
53
78
  rowCollapsibleButtonCell: {
54
79
  textAlign: 'right',
55
80
  padding: `calc(${theme.spacing.xs}/2) ${theme.spacing.sm} !important`,
@@ -1,13 +1,13 @@
1
- import {Box, Center, Collapse, Loader, Skeleton, SkeletonProps, Table as MantineTable} from '@mantine/core';
1
+ import {Box, Center, Collapse, Loader, Table as MantineTable, Skeleton, SkeletonProps} from '@mantine/core';
2
2
  import {useForm} from '@mantine/form';
3
3
  import {useDidUpdate} from '@mantine/hooks';
4
4
  import {
5
5
  ColumnDef,
6
+ Row,
7
+ TableState as TanstackTableState,
6
8
  defaultColumnSizing,
7
9
  flexRender,
8
10
  getCoreRowModel,
9
- Row,
10
- TableState as TanstackTableState,
11
11
  useReactTable,
12
12
  } from '@tanstack/react-table';
13
13
  import debounce from 'lodash.debounce';
@@ -50,6 +50,7 @@ export const Table: TableType = <T,>({
50
50
  loading = false,
51
51
  doubleClickAction,
52
52
  multiRowSelectionEnabled,
53
+ disableRowSelection,
53
54
  onRowSelectionChange,
54
55
  options = {},
55
56
  }: TableProps<T>) => {
@@ -62,7 +63,7 @@ export const Table: TableType = <T,>({
62
63
  const form = useForm<TableFormType>({
63
64
  initialValues: {predicates: initialState?.predicates ?? {}, dateRange: initialState?.dateRange ?? [null, null]},
64
65
  });
65
- const {cx, classes} = useStyles({multiRowSelectionEnabled});
66
+ const {cx, classes} = useStyles({multiRowSelectionEnabled, disableRowSelection});
66
67
 
67
68
  const table = useReactTable({
68
69
  initialState: defaultsDeep(initialStateWithoutForm, {pagination: {pageSize: TablePerPage.DEFAULT_SIZE}}),
@@ -76,6 +77,7 @@ export const Table: TableType = <T,>({
76
77
  enableRowSelection: !loading,
77
78
  ...options,
78
79
  });
80
+
79
81
  const [state, setState] = useState<TableState<T>>(table.initialState as TableState<T>);
80
82
  table.setOptions((prev) => ({
81
83
  ...prev,
@@ -128,9 +130,12 @@ export const Table: TableType = <T,>({
128
130
  return (
129
131
  <Fragment key={row.id}>
130
132
  <tr
131
- onClick={() => row.toggleSelected()}
133
+ onClick={() => (disableRowSelection ? undefined : row.toggleSelected())}
132
134
  onDoubleClick={() => doubleClickAction?.(row.original)}
133
- className={cx(classes.row, {[classes.rowSelected]: isSelected})}
135
+ className={cx(classes.row, {
136
+ [classes.rowSelected]: isSelected,
137
+ [classes.rowUnselectable]: disableRowSelection,
138
+ })}
134
139
  aria-selected={isSelected}
135
140
  >
136
141
  {row.getVisibleCells().map((cell) => {
@@ -189,6 +194,7 @@ export const Table: TableType = <T,>({
189
194
  containerRef: outsideClickRef,
190
195
  multiRowSelectionEnabled,
191
196
  getPageCount: table.getPageCount,
197
+ disableRowSelection,
192
198
  }}
193
199
  >
194
200
  {consumer}
@@ -2,8 +2,8 @@ import {UseFormReturnType} from '@mantine/form';
2
2
  import {
3
3
  ColumnDef,
4
4
  CoreOptions,
5
- InitialTableState as TanstackInitialTableState,
6
5
  TableOptions,
6
+ InitialTableState as TanstackInitialTableState,
7
7
  TableState as TanstackTableState,
8
8
  } from '@tanstack/table-core';
9
9
  import {Dispatch, ReactElement, ReactNode, RefObject} from 'react';
@@ -11,6 +11,7 @@ import {Dispatch, ReactElement, ReactNode, RefObject} from 'react';
11
11
  import {DateRangePickerValue} from '../date-range-picker/DateRangePickerInlineCalendar';
12
12
  import {TableActions} from './TableActions';
13
13
  import {TableAccordionColumn, TableCollapsibleColumn} from './TableCollapsibleColumn';
14
+ import {TableConsumer} from './TableConsumer';
14
15
  import {TableDateRangePicker} from './TableDateRangePicker';
15
16
  import {TableFilter} from './TableFilter';
16
17
  import {TableFooter} from './TableFooter';
@@ -18,7 +19,6 @@ import {TableHeader} from './TableHeader';
18
19
  import {TablePagination} from './TablePagination';
19
20
  import {TablePerPage} from './TablePerPage';
20
21
  import {TablePredicate} from './TablePredicate';
21
- import {TableConsumer} from './TableConsumer';
22
22
 
23
23
  export type RowSelectionWithData<TData> = Record<string, TData>;
24
24
  export interface RowSelectionState<TData> {
@@ -97,6 +97,10 @@ export type TableContextType<TData> = {
97
97
  * Whether multi row selection is activated
98
98
  */
99
99
  multiRowSelectionEnabled: boolean;
100
+ /**
101
+ * Whether row selection is enabled or not
102
+ */
103
+ disableRowSelection: boolean;
100
104
  /**
101
105
  * Function that returns the number of pages
102
106
  */
@@ -178,6 +182,12 @@ export interface TableProps<T> {
178
182
  * @default false
179
183
  */
180
184
  multiRowSelectionEnabled?: boolean;
185
+ /**
186
+ * Whether row selection is enabled or not
187
+ *
188
+ * @default false
189
+ */
190
+ disableRowSelection?: boolean;
181
191
  /**
182
192
  * Additional options that can be passed to the table
183
193
  */
@@ -1,8 +1,9 @@
1
1
  import {CalendarSize24Px} from '@coveord/plasma-react-icons';
2
2
  import {Grid, Group, Popover, Text} from '@mantine/core';
3
3
  import dayjs from 'dayjs';
4
- import {FunctionComponent, useState} from 'react';
4
+ import {FunctionComponent} from 'react';
5
5
 
6
+ import {useToggle} from '@mantine/hooks';
6
7
  import {Button} from '../button';
7
8
  import {
8
9
  DateRangePickerInlineCalendar,
@@ -33,27 +34,27 @@ export const TableDateRangePicker: FunctionComponent<TableDateRangePickerProps>
33
34
  presets = {},
34
35
  rangeCalendarProps,
35
36
  }) => {
36
- const [opened, setOpened] = useState(false);
37
+ const [opened, toggleOpened] = useToggle();
37
38
  const {form} = useTable();
38
39
 
39
40
  const onApply = (dates: DateRangePickerValue) => {
40
41
  form.setFieldValue('dateRange', dates);
41
- setOpened(false);
42
+ toggleOpened(false);
42
43
  };
43
44
  const onCancel = () => {
44
- setOpened(false);
45
+ toggleOpened(false);
45
46
  };
46
47
 
47
48
  const formatDate = (date: Date) => dayjs(date).format('MMM DD, YYYY');
48
- const formatedRange = `${formatDate(form.values.dateRange[0])} - ${formatDate(form.values.dateRange[1])}`;
49
+ const formattedRange = `${formatDate(form.values.dateRange[0])} - ${formatDate(form.values.dateRange[1])}`;
49
50
 
50
51
  return (
51
52
  <Grid.Col span="content" order={TableComponentsOrder.DateRangePicker} py="sm">
52
53
  <Group spacing="xs">
53
- <Text span>{formatedRange}</Text>
54
- <Popover opened={opened} onChange={setOpened} withinPortal>
54
+ <Text span>{formattedRange}</Text>
55
+ <Popover opened={opened} onChange={toggleOpened} withinPortal>
55
56
  <Popover.Target>
56
- <Button variant="outline" color="gray" onClick={() => setOpened(true)} px="xs">
57
+ <Button variant="outline" color="gray" onClick={() => toggleOpened()} px="xs">
57
58
  <CalendarSize24Px width={24} height={24} />
58
59
  </Button>
59
60
  </Popover.Target>
@@ -30,9 +30,10 @@ export const TableHeader: FunctionComponent<TableHeaderProps> = ({
30
30
  children,
31
31
  ...others
32
32
  }) => {
33
- const {getSelectedRows, multiRowSelectionEnabled, clearSelection} = useTable();
33
+ const {getSelectedRows, multiRowSelectionEnabled, clearSelection, disableRowSelection} = useTable();
34
34
  const {classes} = useStyles(null, {name: 'TableHeader', classNames, styles, unstyled});
35
35
  const selectedRows = getSelectedRows();
36
+
36
37
  return (
37
38
  <Grid
38
39
  justify="flex-start"
@@ -53,7 +54,12 @@ export const TableHeader: FunctionComponent<TableHeaderProps> = ({
53
54
  order={TableComponentsOrder.MultiSelectInfo}
54
55
  >
55
56
  <Tooltip label="Unselect all">
56
- <Button onClick={clearSelection} variant="subtle" leftIcon={<CrossSize16Px height={16} />}>
57
+ <Button
58
+ onClick={clearSelection}
59
+ variant="subtle"
60
+ disabled={disableRowSelection}
61
+ leftIcon={<CrossSize16Px height={16} />}
62
+ >
57
63
  {selectedRows.length} selected
58
64
  </Button>
59
65
  </Tooltip>
@@ -508,5 +508,77 @@ describe('Table', () => {
508
508
  await user.click(screen.getByRole('button', {name: /2 selected/i}));
509
509
  expect(screen.queryAllByRole('row', {selected: true})).toEqual([]);
510
510
  });
511
+
512
+ it('prevents row selection if disableRowSelection is true', async () => {
513
+ const user = userEvent.setup({delay: null});
514
+
515
+ render(
516
+ <div>
517
+ <Table
518
+ getRowId={({id}) => id}
519
+ data={[
520
+ {id: '🆔-1', firstName: 'first', lastName: 'last'},
521
+ {id: '🆔-2', firstName: 'patate', lastName: 'king'},
522
+ ]}
523
+ columns={columns}
524
+ multiRowSelectionEnabled
525
+ disableRowSelection
526
+ />
527
+ </div>
528
+ );
529
+
530
+ await user.click(screen.getByRole('row', {name: /patate king/i}));
531
+ expect(screen.getByRole('row', {name: /patate king/i, selected: false})).toBeInTheDocument();
532
+ expect(screen.queryByRole('row', {name: /patate king/i, selected: true})).not.toBeInTheDocument();
533
+
534
+ await user.click(screen.getByRole('row', {name: /first last/i}));
535
+ expect(screen.getByRole('row', {name: /first last/i, selected: false})).toBeInTheDocument();
536
+ expect(screen.queryByRole('row', {name: /first last/i, selected: true})).not.toBeInTheDocument();
537
+ });
538
+
539
+ it('prevents click on checkboxes if disableRowSelection is true', async () => {
540
+ const user = userEvent.setup({delay: null});
541
+
542
+ render(
543
+ <Table
544
+ getRowId={({id}) => id}
545
+ data={[
546
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
547
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
548
+ ]}
549
+ columns={columns}
550
+ multiRowSelectionEnabled
551
+ disableRowSelection
552
+ />
553
+ );
554
+
555
+ expect(screen.getByRole('checkbox', {name: /select all/i})).toHaveStyle('pointerEvents: none');
556
+
557
+ const rows = screen.getAllByRole('row');
558
+ rows.forEach(async (row) => {
559
+ const checkbox = within(row).getByRole('checkbox', {name: /select/i});
560
+ expect(checkbox).toHaveStyle('pointerEvents: none');
561
+ });
562
+ });
563
+
564
+ it('does not display number of selected rows if disableRowSelection is true', async () => {
565
+ render(
566
+ <Table
567
+ getRowId={({id}) => id}
568
+ data={[
569
+ {id: '🆔-1', firstName: 'John', lastName: 'Smith'},
570
+ {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'},
571
+ ]}
572
+ columns={columns}
573
+ multiRowSelectionEnabled
574
+ initialState={{
575
+ rowSelection: {'🆔-2': {id: '🆔-2', firstName: 'Jane', lastName: 'Doe'}},
576
+ }}
577
+ />
578
+ );
579
+
580
+ expect(screen.getByRole('row', {name: /jane doe/i, selected: true})).toBeInTheDocument();
581
+ expect(screen.queryByRole('button', {name: /1 selected/i})).not.toBeInTheDocument();
582
+ });
511
583
  });
512
584
  });
@@ -1,5 +1,6 @@
1
1
  import {ColumnDef, createColumnHelper} from '@tanstack/table-core';
2
2
  import {render, screen, userEvent, waitFor} from '@test-utils';
3
+ import {act} from 'react-dom/test-utils';
3
4
 
4
5
  import {Table} from '../Table';
5
6
 
@@ -7,6 +8,17 @@ type RowData = {name: string};
7
8
 
8
9
  const columnHelper = createColumnHelper<RowData>();
9
10
  const columns: Array<ColumnDef<RowData>> = [columnHelper.accessor('name', {enableSorting: false})];
11
+ const basicTableWithDateRangePicker = (
12
+ <Table
13
+ data={[{name: 'fruit'}, {name: 'vegetable'}]}
14
+ columns={columns}
15
+ initialState={{dateRange: [new Date(2022, 0, 1), new Date(2022, 0, 7)]}}
16
+ >
17
+ <Table.Header>
18
+ <Table.DateRangePicker />
19
+ </Table.Header>
20
+ </Table>
21
+ );
10
22
 
11
23
  // Since we're mocking the date and the animations are timer based we're mocking useReduceMotion to disable all the animations
12
24
  // I tried wrapping the components in <MantineProvider theme={{components: {Transition: {defaultProps: {duration: 0}}}}}>
@@ -20,8 +32,6 @@ vi.mock('@mantine/hooks', async () => {
20
32
  });
21
33
 
22
34
  describe('Table.DateRangePicker', () => {
23
- // vi.setTimeout(15000);
24
-
25
35
  beforeEach(() => {
26
36
  vi.useFakeTimers().setSystemTime(new Date(2022, 0, 15));
27
37
  });
@@ -30,24 +40,41 @@ describe('Table.DateRangePicker', () => {
30
40
  vi.useRealTimers();
31
41
  });
32
42
 
33
- it('displays the intial dates', async () => {
34
- render(
35
- <Table
36
- data={[{name: 'fruit'}, {name: 'vegetable'}]}
37
- columns={columns}
38
- initialState={{dateRange: [new Date(2022, 0, 1), new Date(2022, 0, 7)]}}
39
- >
40
- <Table.Header>
41
- <Table.DateRangePicker />
42
- </Table.Header>
43
- </Table>
44
- );
43
+ it('displays the initial dates', async () => {
44
+ render(basicTableWithDateRangePicker);
45
45
 
46
46
  await waitFor(() => {
47
47
  expect(screen.getByText('Jan 01, 2022 - Jan 07, 2022')).toBeVisible();
48
48
  });
49
49
  });
50
50
 
51
+ it('opens the dialog when clicking on the calendar button', async () => {
52
+ // Otherwise, css transition is not triggered in Mantine component
53
+ vi.useRealTimers();
54
+ const user = userEvent.setup({delay: null});
55
+ render(basicTableWithDateRangePicker);
56
+
57
+ await screen.findByRole('button', {name: 'calendar'});
58
+ await act(async () => {
59
+ await user.click(screen.getByRole('button', {name: 'calendar'}));
60
+ });
61
+ expect(screen.queryByRole('dialog')).toBeVisible();
62
+ });
63
+
64
+ it('closes the dialog when clicking back on the calendar button', async () => {
65
+ // Otherwise, css transition is not triggered in Mantine component
66
+ vi.useRealTimers();
67
+ const user = userEvent.setup({delay: null});
68
+ render(basicTableWithDateRangePicker);
69
+
70
+ await screen.findByRole('button', {name: 'calendar'});
71
+ await act(async () => {
72
+ await user.click(screen.getByRole('button', {name: 'calendar'}));
73
+ await user.click(screen.getByRole('button', {name: 'calendar'}));
74
+ });
75
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
76
+ });
77
+
51
78
  it('displays the selected date range in the table', async () => {
52
79
  const user = userEvent.setup({delay: null});
53
80
  const onChange = vi.fn();
@@ -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',