@coveord/plasma-mantine 52.4.3 → 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 (166) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +29 -79
  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.d.ts +6 -1
  32. package/dist/cjs/components/prompt/Prompt.d.ts.map +1 -1
  33. package/dist/cjs/components/prompt/Prompt.js +6 -8
  34. package/dist/cjs/components/prompt/Prompt.js.map +1 -1
  35. package/dist/cjs/components/prompt/PromptFooter.js.map +1 -1
  36. package/dist/cjs/components/sticky-footer/StickyFooter.js.map +1 -1
  37. package/dist/cjs/components/table/Table.d.ts.map +1 -1
  38. package/dist/cjs/components/table/Table.js +8 -5
  39. package/dist/cjs/components/table/Table.js.map +1 -1
  40. package/dist/cjs/components/table/Table.styles.d.ts +1 -0
  41. package/dist/cjs/components/table/Table.styles.d.ts.map +1 -1
  42. package/dist/cjs/components/table/Table.styles.js +21 -1
  43. package/dist/cjs/components/table/Table.styles.js.map +1 -1
  44. package/dist/cjs/components/table/Table.types.d.ts +12 -2
  45. package/dist/cjs/components/table/Table.types.d.ts.map +1 -1
  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.map +1 -1
  50. package/dist/cjs/components/table/TableDateRangePicker.js +8 -8
  51. package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
  52. package/dist/cjs/components/table/TableFilter.js.map +1 -1
  53. package/dist/cjs/components/table/TableFooter.js.map +1 -1
  54. package/dist/cjs/components/table/TableHeader.d.ts.map +1 -1
  55. package/dist/cjs/components/table/TableHeader.js +2 -1
  56. package/dist/cjs/components/table/TableHeader.js.map +1 -1
  57. package/dist/cjs/components/table/TablePagination.js.map +1 -1
  58. package/dist/cjs/components/table/TablePerPage.js.map +1 -1
  59. package/dist/cjs/components/table/TablePredicate.js.map +1 -1
  60. package/dist/cjs/components/table/TableSelectableColumn.js.map +1 -1
  61. package/dist/cjs/components/table/Th.d.ts.map +1 -1
  62. package/dist/cjs/components/table/Th.js +5 -2
  63. package/dist/cjs/components/table/Th.js.map +1 -1
  64. package/dist/cjs/components/table/index.js.map +1 -1
  65. package/dist/cjs/components/table/useRowSelection.js.map +1 -1
  66. package/dist/cjs/form/FormProvider.js.map +1 -1
  67. package/dist/cjs/form/useForm.js.map +1 -1
  68. package/dist/cjs/hooks/useControlledList.js.map +1 -1
  69. package/dist/cjs/hooks/useParentHeight.js.map +1 -1
  70. package/dist/cjs/index.js.map +1 -1
  71. package/dist/cjs/theme/PlasmaColors.js.map +1 -1
  72. package/dist/cjs/theme/Plasmantine.js.map +1 -1
  73. package/dist/cjs/theme/Theme.d.ts +1 -1
  74. package/dist/cjs/theme/Theme.d.ts.map +1 -1
  75. package/dist/cjs/theme/Theme.js +93 -11
  76. package/dist/cjs/theme/Theme.js.map +1 -1
  77. package/dist/cjs/utils/createPolymorphicComponent.js.map +1 -1
  78. package/dist/cjs/utils/overrideComponent.js.map +1 -1
  79. package/dist/esm/components/blank-slate/BlankSlate.js.map +1 -1
  80. package/dist/esm/components/button/Button.js.map +1 -1
  81. package/dist/esm/components/button/ButtonWithDisabledTooltip.js.map +1 -1
  82. package/dist/esm/components/code-editor/CodeEditor.js.map +1 -1
  83. package/dist/esm/components/code-editor/languages/xml.js.map +1 -1
  84. package/dist/esm/components/collection/Collection.js.map +1 -1
  85. package/dist/esm/components/collection/Collection.styles.js.map +1 -1
  86. package/dist/esm/components/collection/CollectionItem.js.map +1 -1
  87. package/dist/esm/components/copyToClipboard/CopyToClipboard.js.map +1 -1
  88. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
  89. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  90. package/dist/esm/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
  91. package/dist/esm/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
  92. package/dist/esm/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
  93. package/dist/esm/components/header/Header.d.ts.map +1 -1
  94. package/dist/esm/components/header/Header.js +3 -0
  95. package/dist/esm/components/header/Header.js.map +1 -1
  96. package/dist/esm/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  97. package/dist/esm/components/inline-confirm/InlineConfirm.js.map +1 -1
  98. package/dist/esm/components/inline-confirm/InlineConfirmButton.js.map +1 -1
  99. package/dist/esm/components/inline-confirm/InlineConfirmContext.js.map +1 -1
  100. package/dist/esm/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
  101. package/dist/esm/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
  102. package/dist/esm/components/inline-confirm/useInlineConfirm.js.map +1 -1
  103. package/dist/esm/components/menu/Menu.js.map +1 -1
  104. package/dist/esm/components/modal-wizard/ModalWizard.js.map +1 -1
  105. package/dist/esm/components/modal-wizard/ModalWizardStep.js.map +1 -1
  106. package/dist/esm/components/prompt/Prompt.d.ts +6 -1
  107. package/dist/esm/components/prompt/Prompt.d.ts.map +1 -1
  108. package/dist/esm/components/prompt/Prompt.js +6 -8
  109. package/dist/esm/components/prompt/Prompt.js.map +1 -1
  110. package/dist/esm/components/prompt/PromptFooter.js.map +1 -1
  111. package/dist/esm/components/sticky-footer/StickyFooter.js.map +1 -1
  112. package/dist/esm/components/table/Table.d.ts.map +1 -1
  113. package/dist/esm/components/table/Table.js +9 -6
  114. package/dist/esm/components/table/Table.js.map +1 -1
  115. package/dist/esm/components/table/Table.styles.d.ts +1 -0
  116. package/dist/esm/components/table/Table.styles.d.ts.map +1 -1
  117. package/dist/esm/components/table/Table.styles.js +21 -1
  118. package/dist/esm/components/table/Table.styles.js.map +1 -1
  119. package/dist/esm/components/table/Table.types.d.ts +12 -2
  120. package/dist/esm/components/table/Table.types.d.ts.map +1 -1
  121. package/dist/esm/components/table/Table.types.js.map +1 -1
  122. package/dist/esm/components/table/TableActions.js.map +1 -1
  123. package/dist/esm/components/table/TableCollapsibleColumn.js.map +1 -1
  124. package/dist/esm/components/table/TableContext.js.map +1 -1
  125. package/dist/esm/components/table/TableDateRangePicker.d.ts.map +1 -1
  126. package/dist/esm/components/table/TableDateRangePicker.js +8 -8
  127. package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
  128. package/dist/esm/components/table/TableFilter.js.map +1 -1
  129. package/dist/esm/components/table/TableFooter.js.map +1 -1
  130. package/dist/esm/components/table/TableHeader.d.ts.map +1 -1
  131. package/dist/esm/components/table/TableHeader.js +2 -1
  132. package/dist/esm/components/table/TableHeader.js.map +1 -1
  133. package/dist/esm/components/table/TablePagination.js.map +1 -1
  134. package/dist/esm/components/table/TablePerPage.js.map +1 -1
  135. package/dist/esm/components/table/TablePredicate.js.map +1 -1
  136. package/dist/esm/components/table/TableSelectableColumn.js.map +1 -1
  137. package/dist/esm/components/table/Th.d.ts.map +1 -1
  138. package/dist/esm/components/table/Th.js +5 -2
  139. package/dist/esm/components/table/Th.js.map +1 -1
  140. package/dist/esm/components/table/useRowSelection.js.map +1 -1
  141. package/dist/esm/form/FormProvider.js.map +1 -1
  142. package/dist/esm/form/useForm.js.map +1 -1
  143. package/dist/esm/hooks/useControlledList.js.map +1 -1
  144. package/dist/esm/hooks/useParentHeight.js.map +1 -1
  145. package/dist/esm/theme/PlasmaColors.js.map +1 -1
  146. package/dist/esm/theme/Theme.d.ts +1 -1
  147. package/dist/esm/theme/Theme.d.ts.map +1 -1
  148. package/dist/esm/theme/Theme.js +94 -12
  149. package/dist/esm/theme/Theme.js.map +1 -1
  150. package/dist/esm/utils/overrideComponent.js.map +1 -1
  151. package/package.json +28 -29
  152. package/src/__tests__/VitestSetup.ts +7 -5
  153. package/src/components/date-range-picker/DateRangePickerInlineCalendar.tsx +3 -3
  154. package/src/components/header/Header.tsx +5 -1
  155. package/src/components/header/__tests__/Header.spec.tsx +1 -1
  156. package/src/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
  157. package/src/components/prompt/Prompt.tsx +10 -7
  158. package/src/components/table/Table.styles.ts +26 -1
  159. package/src/components/table/Table.tsx +12 -6
  160. package/src/components/table/Table.types.ts +12 -2
  161. package/src/components/table/TableDateRangePicker.tsx +9 -8
  162. package/src/components/table/TableHeader.tsx +8 -2
  163. package/src/components/table/Th.tsx +7 -4
  164. package/src/components/table/__tests__/Table.spec.tsx +72 -0
  165. package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +41 -14
  166. package/src/theme/Theme.tsx +95 -12
@@ -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>
@@ -18,7 +18,6 @@ const useStyles = createStyles((theme) => ({
18
18
  fontSize: theme.headings.sizes.h3.fontSize,
19
19
  lineHeight: theme.headings.sizes.h3.lineHeight,
20
20
  },
21
- default: {},
22
21
  success: {backgroundColor: theme.colors.lime[6], color: color.primary.pureWhite},
23
22
  warning: {backgroundColor: theme.colors.yellow[5], color: color.primary.pureWhite},
24
23
  critical: {
@@ -33,7 +32,12 @@ const useStyles = createStyles((theme) => ({
33
32
  }));
34
33
 
35
34
  export interface PromptProps extends ModalProps {
36
- variant: 'default' | 'success' | 'warning' | 'critical' | 'info';
35
+ /**
36
+ * Controls prompt appearance
37
+ *
38
+ * @default "info"
39
+ */
40
+ variant?: 'success' | 'warning' | 'critical' | 'info';
37
41
  children: ReactNode;
38
42
  }
39
43
  interface PromptType {
@@ -41,9 +45,8 @@ interface PromptType {
41
45
  Footer: typeof PromptFooter;
42
46
  }
43
47
 
44
- export const Prompt: PromptType = ({children, variant, size, ...otherProps}) => {
48
+ export const Prompt: PromptType = ({children, variant = 'info', ...otherProps}) => {
45
49
  const {classes, cx} = useStyles();
46
- const defaultVariant = variant === 'default';
47
50
  const convertedChildren = Children.toArray(children) as ReactElement[];
48
51
 
49
52
  const otherChildren = convertedChildren.filter((child) => child.type !== PromptFooter);
@@ -51,14 +54,14 @@ export const Prompt: PromptType = ({children, variant, size, ...otherProps}) =>
51
54
 
52
55
  const classNames = {
53
56
  header: cx(classes.header, classes[variant]),
54
- close: !defaultVariant && classes.whiteClose,
57
+ close: classes.whiteClose,
55
58
  body: classes.body,
56
- modal: !defaultVariant && classes.modalType,
59
+ modal: classes.modalType,
57
60
  title: classes.title,
58
61
  };
59
62
 
60
63
  return (
61
- <Modal padding={0} classNames={classNames} size={defaultVariant ? size : 'sm'} {...otherProps}>
64
+ <Modal variant="prompt" padding={0} classNames={classNames} size={'sm'} {...otherProps}>
62
65
  <div className={classes.innerBody}>{otherChildren}</div>
63
66
  {footer}
64
67
  </Modal>
@@ -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>
@@ -6,7 +6,6 @@ const useStyles = createStyles((theme) => ({
6
6
  th: {
7
7
  fontWeight: '400 !important' as any,
8
8
  padding: '0 !important',
9
- color: theme.black + '!important',
10
9
  verticalAlign: 'middle',
11
10
  },
12
11
 
@@ -14,9 +13,11 @@ const useStyles = createStyles((theme) => ({
14
13
  width: '100%',
15
14
  padding: `${theme.spacing.xs} ${theme.spacing.sm}`,
16
15
  whiteSpace: 'nowrap',
16
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[8] : theme.colors.gray[0],
17
+ color: theme.colors.gray[6],
17
18
 
18
19
  '&:hover': {
19
- backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[6] : theme.colors.gray[2],
20
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[7] : theme.colors.gray[1],
20
21
  },
21
22
  },
22
23
  }));
@@ -49,7 +50,7 @@ export const Th = <T,>({header}: ThProps<T>) => {
49
50
  if (!header.column.getCanSort()) {
50
51
  return (
51
52
  <th className={classes.th} style={{width}}>
52
- <Text size="xs" py="xs" px="sm">
53
+ <Text size="xs" py="xs" px="sm" fw={500}>
53
54
  {flexRender(header.column.columnDef.header, header.getContext())}
54
55
  </Text>
55
56
  </th>
@@ -64,7 +65,9 @@ export const Th = <T,>({header}: ThProps<T>) => {
64
65
  <th className={classes.th} style={{width}} aria-sort={SortingLabels[sortingOrder]}>
65
66
  <UnstyledButton onClick={onSort} className={classes.control}>
66
67
  <Group position="apart" noWrap>
67
- <Text size="xs">{flexRender(header.column.columnDef.header, header.getContext())}</Text>
68
+ <Text size="xs" fw={500}>
69
+ {flexRender(header.column.columnDef.header, header.getContext())}
70
+ </Text>
68
71
  <Center>
69
72
  <Icon height={14} />
70
73
  </Center>
@@ -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();
@@ -1,6 +1,13 @@
1
- import {InfoSize24Px} from '@coveord/plasma-react-icons';
1
+ import {CheckSize16Px, InfoSize24Px} from '@coveord/plasma-react-icons';
2
2
  import {color} from '@coveord/plasma-tokens';
3
- import {getSize, MantineThemeOverride, NotificationProps, rem} from '@mantine/core';
3
+ import {
4
+ getSize,
5
+ rem,
6
+ type MantineThemeOverride,
7
+ type NotificationProps,
8
+ type StepperStylesParams,
9
+ type TabsStylesParams,
10
+ } from '@mantine/core';
4
11
 
5
12
  import {PlasmaColors} from './PlasmaColors';
6
13
 
@@ -83,18 +90,18 @@ export const plasmaTheme: MantineThemeOverride = {
83
90
  },
84
91
  },
85
92
  Modal: {
86
- styles: (theme, {fullScreen}, {size}) => ({
93
+ styles: (theme, {fullScreen, padding}, {size, variant}) => ({
87
94
  content: {
88
95
  flex: fullScreen
89
96
  ? '0 0 100%'
90
97
  : `0 0 ${getSize({
91
98
  size,
92
99
  sizes: {
93
- xs: rem(440),
94
- sm: rem(550),
95
- md: rem(800),
96
- lg: rem(1334),
97
- xl: rem('85%'),
100
+ xs: rem(432),
101
+ sm: rem(664),
102
+ md: rem(896),
103
+ lg: rem(1120),
104
+ xl: rem('88%'),
98
105
  },
99
106
  })}`,
100
107
  overflow: 'auto',
@@ -105,12 +112,20 @@ export const plasmaTheme: MantineThemeOverride = {
105
112
  lineHeight: theme.headings.sizes.h3.lineHeight,
106
113
  fontWeight: 500,
107
114
  },
115
+ header: {
116
+ borderBottom: variant !== 'prompt' ? `1px solid ${color.primary.gray[3]}` : null,
117
+ },
118
+ body: {
119
+ '&:not(:only-child)': {
120
+ paddingTop: variant === 'prompt' ? 0 : getSize({size: padding, sizes: plasmaTheme.spacing}),
121
+ },
122
+ },
108
123
  }),
124
+ },
125
+ ModalOverlay: {
109
126
  defaultProps: {
110
- overlayProps: {
111
- color: color.primary.navy[9],
112
- opacity: 0.9,
113
- },
127
+ color: color.primary.navy[9],
128
+ opacity: 0.9,
114
129
  },
115
130
  },
116
131
  InputWrapper: {
@@ -268,5 +283,73 @@ export const plasmaTheme: MantineThemeOverride = {
268
283
  },
269
284
  },
270
285
  },
286
+ Stepper: {
287
+ defaultProps: {
288
+ size: 'xs',
289
+ completedIcon: <CheckSize16Px />,
290
+ },
291
+ styles: (theme, {}: StepperStylesParams, {size}) => ({
292
+ step: {
293
+ '&[disabled]': {
294
+ color: theme.colors.gray[5],
295
+ '& .mantine-Stepper-stepDescription': {
296
+ color: theme.colors.gray[5],
297
+ },
298
+ '& .mantine-Stepper-stepIcon': {
299
+ borderColor: theme.colors.gray[1],
300
+ },
301
+ },
302
+ },
303
+ stepIcon: {
304
+ fontWeight: 500,
305
+ backgroundColor: theme.colors.gray[1],
306
+ color: 'inherit',
307
+ border: `${rem(1)} solid ${theme.colors.gray[3]}`,
308
+ '&[data-progress]': {
309
+ backgroundColor: theme.white,
310
+ },
311
+
312
+ '&[data-completed]': {
313
+ backgroundColor: theme.white,
314
+ borderColor: theme.colors.lime[6],
315
+ color: theme.colors.lime[6],
316
+ },
317
+ },
318
+ stepCompletedIcon: {
319
+ color: theme.colors.lime[6],
320
+ fontSize: rem(16),
321
+ },
322
+ stepDescription: {
323
+ color: theme.colors.gray[7],
324
+ fontSize: getSize({size, sizes: theme.fontSizes}),
325
+ },
326
+ separator: {
327
+ height: rem(1),
328
+ backgroundColor: theme.colors.gray[3],
329
+ },
330
+ separatorActive: {
331
+ backgroundColor: theme.colors.gray[3],
332
+ },
333
+ verticalSeparator: {
334
+ borderLeft: `${rem(1)} solid ${theme.colors.gray[3]}`,
335
+ },
336
+ verticalSeparatorActive: {
337
+ borderColor: theme.colors.gray[3],
338
+ },
339
+ }),
340
+ },
341
+ Tabs: {
342
+ styles: (theme, {orientation}: TabsStylesParams) => ({
343
+ tabsList: {
344
+ [orientation === 'horizontal' ? 'borderBottom' : 'borderRight']: `${rem(1)} solid ${
345
+ theme.colors.gray[3]
346
+ }`,
347
+ },
348
+ tab: {
349
+ [orientation === 'horizontal' ? 'borderBottom' : 'borderRight']: `${rem(1)} solid transparent`,
350
+ [orientation === 'horizontal' ? 'marginBottom' : 'marginRight']: rem(-1),
351
+ },
352
+ }),
353
+ },
271
354
  },
272
355
  };