@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.
- package/.turbo/turbo-build.log +3 -3
- package/.turbo/turbo-test.log +26 -26
- 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.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.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.js +5 -5
- 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.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.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.js +5 -5
- package/dist/esm/theme/Theme.js.map +1 -1
- package/dist/esm/utils/overrideComponent.js.map +1 -1
- package/package.json +8 -8
- 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/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/__tests__/Table.spec.tsx +72 -0
- package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +41 -14
- package/src/theme/Theme.tsx +5 -5
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import
|
|
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
|
|
5
|
-
|
|
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
|
|
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-
|
|
13
|
+
class="mantine-Text-root mantine-Title-root mantine-m67b81"
|
|
14
14
|
>
|
|
15
15
|
child
|
|
16
16
|
</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,
|
|
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>
|
|
@@ -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
|
@@ -97,11 +97,11 @@ export const plasmaTheme: MantineThemeOverride = {
|
|
|
97
97
|
: `0 0 ${getSize({
|
|
98
98
|
size,
|
|
99
99
|
sizes: {
|
|
100
|
-
xs: rem(
|
|
101
|
-
sm: rem(
|
|
102
|
-
md: rem(
|
|
103
|
-
lg: rem(
|
|
104
|
-
xl: rem('
|
|
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',
|