@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.
- package/.turbo/turbo-build.log +3 -3
- package/.turbo/turbo-test.log +29 -79
- package/dist/.tsbuildinfo +1 -1
- package/dist/cjs/components/blank-slate/BlankSlate.js.map +1 -1
- package/dist/cjs/components/button/Button.js.map +1 -1
- package/dist/cjs/components/button/ButtonWithDisabledTooltip.js.map +1 -1
- package/dist/cjs/components/code-editor/CodeEditor.js.map +1 -1
- package/dist/cjs/components/code-editor/languages/xml.js.map +1 -1
- package/dist/cjs/components/collection/Collection.js.map +1 -1
- package/dist/cjs/components/collection/Collection.styles.js.map +1 -1
- package/dist/cjs/components/collection/CollectionItem.js.map +1 -1
- package/dist/cjs/components/copyToClipboard/CopyToClipboard.js.map +1 -1
- package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
- package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
- package/dist/cjs/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
- package/dist/cjs/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
- package/dist/cjs/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
- package/dist/cjs/components/header/Header.d.ts.map +1 -1
- package/dist/cjs/components/header/Header.js +3 -0
- package/dist/cjs/components/header/Header.js.map +1 -1
- package/dist/cjs/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
- package/dist/cjs/components/inline-confirm/InlineConfirm.js.map +1 -1
- package/dist/cjs/components/inline-confirm/InlineConfirmButton.js.map +1 -1
- package/dist/cjs/components/inline-confirm/InlineConfirmContext.js.map +1 -1
- package/dist/cjs/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
- package/dist/cjs/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
- package/dist/cjs/components/inline-confirm/useInlineConfirm.js.map +1 -1
- package/dist/cjs/components/menu/Menu.js.map +1 -1
- package/dist/cjs/components/modal-wizard/ModalWizard.js.map +1 -1
- package/dist/cjs/components/modal-wizard/ModalWizardStep.js.map +1 -1
- package/dist/cjs/components/prompt/Prompt.d.ts +6 -1
- package/dist/cjs/components/prompt/Prompt.d.ts.map +1 -1
- package/dist/cjs/components/prompt/Prompt.js +6 -8
- package/dist/cjs/components/prompt/Prompt.js.map +1 -1
- package/dist/cjs/components/prompt/PromptFooter.js.map +1 -1
- package/dist/cjs/components/sticky-footer/StickyFooter.js.map +1 -1
- package/dist/cjs/components/table/Table.d.ts.map +1 -1
- package/dist/cjs/components/table/Table.js +8 -5
- package/dist/cjs/components/table/Table.js.map +1 -1
- package/dist/cjs/components/table/Table.styles.d.ts +1 -0
- package/dist/cjs/components/table/Table.styles.d.ts.map +1 -1
- package/dist/cjs/components/table/Table.styles.js +21 -1
- package/dist/cjs/components/table/Table.styles.js.map +1 -1
- package/dist/cjs/components/table/Table.types.d.ts +12 -2
- package/dist/cjs/components/table/Table.types.d.ts.map +1 -1
- package/dist/cjs/components/table/TableActions.js.map +1 -1
- package/dist/cjs/components/table/TableCollapsibleColumn.js.map +1 -1
- package/dist/cjs/components/table/TableContext.js.map +1 -1
- package/dist/cjs/components/table/TableDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/components/table/TableDateRangePicker.js +8 -8
- package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
- package/dist/cjs/components/table/TableFilter.js.map +1 -1
- package/dist/cjs/components/table/TableFooter.js.map +1 -1
- package/dist/cjs/components/table/TableHeader.d.ts.map +1 -1
- package/dist/cjs/components/table/TableHeader.js +2 -1
- package/dist/cjs/components/table/TableHeader.js.map +1 -1
- package/dist/cjs/components/table/TablePagination.js.map +1 -1
- package/dist/cjs/components/table/TablePerPage.js.map +1 -1
- package/dist/cjs/components/table/TablePredicate.js.map +1 -1
- package/dist/cjs/components/table/TableSelectableColumn.js.map +1 -1
- package/dist/cjs/components/table/Th.d.ts.map +1 -1
- package/dist/cjs/components/table/Th.js +5 -2
- package/dist/cjs/components/table/Th.js.map +1 -1
- package/dist/cjs/components/table/index.js.map +1 -1
- package/dist/cjs/components/table/useRowSelection.js.map +1 -1
- package/dist/cjs/form/FormProvider.js.map +1 -1
- package/dist/cjs/form/useForm.js.map +1 -1
- package/dist/cjs/hooks/useControlledList.js.map +1 -1
- package/dist/cjs/hooks/useParentHeight.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/theme/PlasmaColors.js.map +1 -1
- package/dist/cjs/theme/Plasmantine.js.map +1 -1
- package/dist/cjs/theme/Theme.d.ts +1 -1
- package/dist/cjs/theme/Theme.d.ts.map +1 -1
- package/dist/cjs/theme/Theme.js +93 -11
- package/dist/cjs/theme/Theme.js.map +1 -1
- package/dist/cjs/utils/createPolymorphicComponent.js.map +1 -1
- package/dist/cjs/utils/overrideComponent.js.map +1 -1
- package/dist/esm/components/blank-slate/BlankSlate.js.map +1 -1
- package/dist/esm/components/button/Button.js.map +1 -1
- package/dist/esm/components/button/ButtonWithDisabledTooltip.js.map +1 -1
- package/dist/esm/components/code-editor/CodeEditor.js.map +1 -1
- package/dist/esm/components/code-editor/languages/xml.js.map +1 -1
- package/dist/esm/components/collection/Collection.js.map +1 -1
- package/dist/esm/components/collection/Collection.styles.js.map +1 -1
- package/dist/esm/components/collection/CollectionItem.js.map +1 -1
- package/dist/esm/components/copyToClipboard/CopyToClipboard.js.map +1 -1
- package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js +5 -5
- package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
- package/dist/esm/components/date-range-picker/DateRangePickerPopoverCalendar.js.map +1 -1
- package/dist/esm/components/date-range-picker/DateRangePickerPresetSelect.js.map +1 -1
- package/dist/esm/components/date-range-picker/EditableDateRangePicker.js.map +1 -1
- package/dist/esm/components/header/Header.d.ts.map +1 -1
- package/dist/esm/components/header/Header.js +3 -0
- package/dist/esm/components/header/Header.js.map +1 -1
- package/dist/esm/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
- package/dist/esm/components/inline-confirm/InlineConfirm.js.map +1 -1
- package/dist/esm/components/inline-confirm/InlineConfirmButton.js.map +1 -1
- package/dist/esm/components/inline-confirm/InlineConfirmContext.js.map +1 -1
- package/dist/esm/components/inline-confirm/InlineConfirmMenuItem.js.map +1 -1
- package/dist/esm/components/inline-confirm/InlineConfirmPrompt.js.map +1 -1
- package/dist/esm/components/inline-confirm/useInlineConfirm.js.map +1 -1
- package/dist/esm/components/menu/Menu.js.map +1 -1
- package/dist/esm/components/modal-wizard/ModalWizard.js.map +1 -1
- package/dist/esm/components/modal-wizard/ModalWizardStep.js.map +1 -1
- package/dist/esm/components/prompt/Prompt.d.ts +6 -1
- package/dist/esm/components/prompt/Prompt.d.ts.map +1 -1
- package/dist/esm/components/prompt/Prompt.js +6 -8
- package/dist/esm/components/prompt/Prompt.js.map +1 -1
- package/dist/esm/components/prompt/PromptFooter.js.map +1 -1
- package/dist/esm/components/sticky-footer/StickyFooter.js.map +1 -1
- package/dist/esm/components/table/Table.d.ts.map +1 -1
- package/dist/esm/components/table/Table.js +9 -6
- package/dist/esm/components/table/Table.js.map +1 -1
- package/dist/esm/components/table/Table.styles.d.ts +1 -0
- package/dist/esm/components/table/Table.styles.d.ts.map +1 -1
- package/dist/esm/components/table/Table.styles.js +21 -1
- package/dist/esm/components/table/Table.styles.js.map +1 -1
- package/dist/esm/components/table/Table.types.d.ts +12 -2
- package/dist/esm/components/table/Table.types.d.ts.map +1 -1
- package/dist/esm/components/table/Table.types.js.map +1 -1
- package/dist/esm/components/table/TableActions.js.map +1 -1
- package/dist/esm/components/table/TableCollapsibleColumn.js.map +1 -1
- package/dist/esm/components/table/TableContext.js.map +1 -1
- package/dist/esm/components/table/TableDateRangePicker.d.ts.map +1 -1
- package/dist/esm/components/table/TableDateRangePicker.js +8 -8
- package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
- package/dist/esm/components/table/TableFilter.js.map +1 -1
- package/dist/esm/components/table/TableFooter.js.map +1 -1
- package/dist/esm/components/table/TableHeader.d.ts.map +1 -1
- package/dist/esm/components/table/TableHeader.js +2 -1
- package/dist/esm/components/table/TableHeader.js.map +1 -1
- package/dist/esm/components/table/TablePagination.js.map +1 -1
- package/dist/esm/components/table/TablePerPage.js.map +1 -1
- package/dist/esm/components/table/TablePredicate.js.map +1 -1
- package/dist/esm/components/table/TableSelectableColumn.js.map +1 -1
- package/dist/esm/components/table/Th.d.ts.map +1 -1
- package/dist/esm/components/table/Th.js +5 -2
- package/dist/esm/components/table/Th.js.map +1 -1
- package/dist/esm/components/table/useRowSelection.js.map +1 -1
- package/dist/esm/form/FormProvider.js.map +1 -1
- package/dist/esm/form/useForm.js.map +1 -1
- package/dist/esm/hooks/useControlledList.js.map +1 -1
- package/dist/esm/hooks/useParentHeight.js.map +1 -1
- package/dist/esm/theme/PlasmaColors.js.map +1 -1
- package/dist/esm/theme/Theme.d.ts +1 -1
- package/dist/esm/theme/Theme.d.ts.map +1 -1
- package/dist/esm/theme/Theme.js +94 -12
- package/dist/esm/theme/Theme.js.map +1 -1
- package/dist/esm/utils/overrideComponent.js.map +1 -1
- package/package.json +28 -29
- package/src/__tests__/VitestSetup.ts +7 -5
- package/src/components/date-range-picker/DateRangePickerInlineCalendar.tsx +3 -3
- package/src/components/header/Header.tsx +5 -1
- package/src/components/header/__tests__/Header.spec.tsx +1 -1
- package/src/components/header/__tests__/__snapshots__/Header.spec.tsx.snap +1 -1
- package/src/components/prompt/Prompt.tsx +10 -7
- package/src/components/table/Table.styles.ts +26 -1
- package/src/components/table/Table.tsx +12 -6
- package/src/components/table/Table.types.ts +12 -2
- package/src/components/table/TableDateRangePicker.tsx +9 -8
- package/src/components/table/TableHeader.tsx +8 -2
- package/src/components/table/Th.tsx +7 -4
- package/src/components/table/__tests__/Table.spec.tsx +72 -0
- package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +41 -14
- package/src/theme/Theme.tsx +95 -12
|
@@ -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
|
-
|
|
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
|
|
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:
|
|
57
|
+
close: classes.whiteClose,
|
|
55
58
|
body: classes.body,
|
|
56
|
-
modal:
|
|
59
|
+
modal: classes.modalType,
|
|
57
60
|
title: classes.title,
|
|
58
61
|
};
|
|
59
62
|
|
|
60
63
|
return (
|
|
61
|
-
<Modal padding={0} classNames={classNames} size={
|
|
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,
|
|
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, {
|
|
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
|
|
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,
|
|
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
|
-
|
|
42
|
+
toggleOpened(false);
|
|
42
43
|
};
|
|
43
44
|
const onCancel = () => {
|
|
44
|
-
|
|
45
|
+
toggleOpened(false);
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
const formatDate = (date: Date) => dayjs(date).format('MMM DD, YYYY');
|
|
48
|
-
const
|
|
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>{
|
|
54
|
-
<Popover opened={opened} onChange={
|
|
54
|
+
<Text span>{formattedRange}</Text>
|
|
55
|
+
<Popover opened={opened} onChange={toggleOpened} withinPortal>
|
|
55
56
|
<Popover.Target>
|
|
56
|
-
<Button variant="outline" color="gray" onClick={() =>
|
|
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
|
|
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[
|
|
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"
|
|
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
|
|
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();
|
package/src/theme/Theme.tsx
CHANGED
|
@@ -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 {
|
|
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(
|
|
94
|
-
sm: rem(
|
|
95
|
-
md: rem(
|
|
96
|
-
lg: rem(
|
|
97
|
-
xl: rem('
|
|
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
|
-
|
|
111
|
-
|
|
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
|
};
|