@coveord/plasma-mantine 49.3.5 → 49.4.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 -29
- package/dist/.tsbuildinfo +1 -1
- package/dist/cjs/components/table/Table.js +8 -10
- package/dist/cjs/components/table/Table.js.map +1 -1
- package/dist/cjs/components/table/Table.types.js +6 -0
- package/dist/cjs/components/table/Table.types.js.map +1 -0
- package/dist/cjs/components/table/TableActions.js +3 -3
- package/dist/cjs/components/table/TableActions.js.map +1 -1
- package/dist/cjs/components/table/TableContext.js +18 -3
- package/dist/cjs/components/table/TableContext.js.map +1 -1
- package/dist/cjs/components/table/TableDateRangePicker.js +2 -2
- package/dist/cjs/components/table/TableDateRangePicker.js.map +1 -1
- package/dist/cjs/components/table/TableFilter.js +2 -2
- package/dist/cjs/components/table/TableFilter.js.map +1 -1
- package/dist/cjs/components/table/TableHeader.js +2 -2
- package/dist/cjs/components/table/TableHeader.js.map +1 -1
- package/dist/cjs/components/table/TablePagination.js +2 -2
- package/dist/cjs/components/table/TablePagination.js.map +1 -1
- package/dist/cjs/components/table/TablePerPage.js +2 -2
- package/dist/cjs/components/table/TablePerPage.js.map +1 -1
- package/dist/cjs/components/table/TablePredicate.js +2 -2
- package/dist/cjs/components/table/TablePredicate.js.map +1 -1
- package/dist/cjs/components/table/index.js +7 -1
- package/dist/cjs/components/table/index.js.map +1 -1
- package/dist/cjs/components/table/useRowSelection.js +27 -17
- package/dist/cjs/components/table/useRowSelection.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/definitions/components/table/Table.d.ts +1 -98
- package/dist/definitions/components/table/Table.d.ts.map +1 -1
- package/dist/definitions/components/table/Table.types.d.ts +177 -0
- package/dist/definitions/components/table/Table.types.d.ts.map +1 -0
- package/dist/definitions/components/table/TableActions.d.ts.map +1 -1
- package/dist/definitions/components/table/TableContext.d.ts +4 -71
- package/dist/definitions/components/table/TableContext.d.ts.map +1 -1
- package/dist/definitions/components/table/TableFilter.d.ts.map +1 -1
- package/dist/definitions/components/table/TablePagination.d.ts.map +1 -1
- package/dist/definitions/components/table/TablePerPage.d.ts.map +1 -1
- package/dist/definitions/components/table/TablePredicate.d.ts.map +1 -1
- package/dist/definitions/components/table/index.d.ts +2 -2
- package/dist/definitions/components/table/index.d.ts.map +1 -1
- package/dist/definitions/components/table/useRowSelection.d.ts +4 -1
- package/dist/definitions/components/table/useRowSelection.d.ts.map +1 -1
- package/dist/definitions/index.d.ts +1 -1
- package/dist/definitions/index.d.ts.map +1 -1
- package/dist/esm/components/table/Table.js +9 -11
- package/dist/esm/components/table/Table.js.map +1 -1
- package/dist/esm/components/table/Table.types.js +3 -0
- package/dist/esm/components/table/Table.types.js.map +1 -0
- package/dist/esm/components/table/TableActions.js +2 -2
- package/dist/esm/components/table/TableActions.js.map +1 -1
- package/dist/esm/components/table/TableContext.js +8 -1
- package/dist/esm/components/table/TableContext.js.map +1 -1
- package/dist/esm/components/table/TableDateRangePicker.js +1 -1
- package/dist/esm/components/table/TableDateRangePicker.js.map +1 -1
- package/dist/esm/components/table/TableFilter.js +1 -1
- package/dist/esm/components/table/TableFilter.js.map +1 -1
- package/dist/esm/components/table/TableHeader.js +1 -1
- package/dist/esm/components/table/TableHeader.js.map +1 -1
- package/dist/esm/components/table/TablePagination.js +1 -1
- package/dist/esm/components/table/TablePagination.js.map +1 -1
- package/dist/esm/components/table/TablePerPage.js +1 -1
- package/dist/esm/components/table/TablePerPage.js.map +1 -1
- package/dist/esm/components/table/TablePredicate.js +2 -2
- package/dist/esm/components/table/TablePredicate.js.map +1 -1
- package/dist/esm/components/table/index.js +1 -1
- package/dist/esm/components/table/index.js.map +1 -1
- package/dist/esm/components/table/useRowSelection.js +26 -17
- package/dist/esm/components/table/useRowSelection.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +5 -4
- package/src/components/table/Table.tsx +16 -117
- package/src/components/table/Table.types.ts +203 -0
- package/src/components/table/TableActions.tsx +10 -3
- package/src/components/table/TableContext.tsx +9 -70
- package/src/components/table/TableDateRangePicker.tsx +1 -1
- package/src/components/table/TableFilter.tsx +2 -3
- package/src/components/table/TableHeader.tsx +1 -1
- package/src/components/table/TablePagination.tsx +3 -3
- package/src/components/table/TablePerPage.tsx +2 -3
- package/src/components/table/TablePredicate.tsx +3 -2
- package/src/components/table/__tests__/Table.spec.tsx +59 -22
- package/src/components/table/index.ts +2 -2
- package/src/components/table/useRowSelection.ts +36 -21
- package/src/index.ts +2 -0
- package/dist/cjs/components/table/useTable.js +0 -21
- package/dist/cjs/components/table/useTable.js.map +0 -1
- package/dist/definitions/components/table/useTable.d.ts +0 -16
- package/dist/definitions/components/table/useTable.d.ts.map +0 -1
- package/dist/esm/components/table/useTable.js +0 -11
- package/dist/esm/components/table/useTable.js.map +0 -1
- package/src/components/table/useTable.tsx +0 -11
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import {Box, Center, Collapse, Loader, Skeleton, Table as MantineTable} from '@mantine/core';
|
|
2
2
|
import {useForm} from '@mantine/form';
|
|
3
|
-
import {
|
|
3
|
+
import {useDidUpdate} from '@mantine/hooks';
|
|
4
4
|
import {
|
|
5
5
|
ColumnDef,
|
|
6
6
|
defaultColumnSizing,
|
|
7
7
|
flexRender,
|
|
8
8
|
getCoreRowModel,
|
|
9
9
|
Row,
|
|
10
|
-
TableState,
|
|
10
|
+
TableState as TanstackTableState,
|
|
11
11
|
useReactTable,
|
|
12
12
|
} from '@tanstack/react-table';
|
|
13
|
-
import {CoreOptions, InitialTableState, TableOptions} from '@tanstack/table-core';
|
|
14
13
|
import debounce from 'lodash.debounce';
|
|
15
14
|
import defaultsDeep from 'lodash.defaultsdeep';
|
|
16
|
-
import {Children, Fragment, ReactElement,
|
|
15
|
+
import {Children, Dispatch, Fragment, ReactElement, useCallback, useEffect, useState} from 'react';
|
|
17
16
|
|
|
18
17
|
import useStyles from './Table.styles';
|
|
18
|
+
import {TableFormType, TableProps, TableState, TableType} from './Table.types';
|
|
19
19
|
import {TableActions} from './TableActions';
|
|
20
20
|
import {TableAccordionColumn, TableCollapsibleColumn} from './TableCollapsibleColumn';
|
|
21
|
-
import {
|
|
21
|
+
import {TableContext} from './TableContext';
|
|
22
22
|
import {TableDateRangePicker} from './TableDateRangePicker';
|
|
23
23
|
import {TableFilter} from './TableFilter';
|
|
24
24
|
import {TableFooter} from './TableFooter';
|
|
@@ -30,104 +30,6 @@ import {TableSelectableColumn} from './TableSelectableColumn';
|
|
|
30
30
|
import {Th} from './Th';
|
|
31
31
|
import {useRowSelection} from './useRowSelection';
|
|
32
32
|
|
|
33
|
-
export interface TableProps<T> {
|
|
34
|
-
/**
|
|
35
|
-
* Data to display in the table
|
|
36
|
-
*/
|
|
37
|
-
data: T[];
|
|
38
|
-
/**
|
|
39
|
-
* Defines how each row is uniquely identified. It is highly recommended that you specify this prop to an ID that makes sense.
|
|
40
|
-
*/
|
|
41
|
-
getRowId?: CoreOptions<T>['getRowId'];
|
|
42
|
-
/**
|
|
43
|
-
* Columns to display in the table.
|
|
44
|
-
*
|
|
45
|
-
* @see https://tanstack.com/table/v8/docs/guide/column-defs
|
|
46
|
-
*/
|
|
47
|
-
columns: Array<ColumnDef<T>>;
|
|
48
|
-
/**
|
|
49
|
-
* Function called when the table mounts
|
|
50
|
-
*
|
|
51
|
-
* @param state the state of the table
|
|
52
|
-
*/
|
|
53
|
-
onMount?: onTableChangeEvent;
|
|
54
|
-
/**
|
|
55
|
-
* Function called when the table should update
|
|
56
|
-
*
|
|
57
|
-
* @param state the state of the table
|
|
58
|
-
*/
|
|
59
|
-
onChange?: onTableChangeEvent;
|
|
60
|
-
/**
|
|
61
|
-
* Function that generates the expandable content of a row
|
|
62
|
-
* Return null for rows that don't need to be expandable
|
|
63
|
-
*
|
|
64
|
-
* @param datum the row for which the children should be generated.
|
|
65
|
-
*/
|
|
66
|
-
getExpandChildren?: (datum: T) => ReactNode;
|
|
67
|
-
/**
|
|
68
|
-
* React children to show when the table has no rows to show. You can leverage useTable to get the state of the table
|
|
69
|
-
*/
|
|
70
|
-
noDataChildren?: ReactNode;
|
|
71
|
-
/**
|
|
72
|
-
* Whether the table is loading or not
|
|
73
|
-
*
|
|
74
|
-
* @default false
|
|
75
|
-
*/
|
|
76
|
-
loading?: boolean;
|
|
77
|
-
/**
|
|
78
|
-
* Childrens to display in the table. They need to be wrap in either `Table.Header` or `Table.Footer`
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* <Table ...>
|
|
82
|
-
* <Table.Header>
|
|
83
|
-
* <div>Hello</div>
|
|
84
|
-
* </Table.Header>
|
|
85
|
-
* </Table>
|
|
86
|
-
*/
|
|
87
|
-
children?: ReactNode;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Initial state of the table
|
|
91
|
-
*/
|
|
92
|
-
initialState?: InitialTableState & Partial<TableFormType>;
|
|
93
|
-
/**
|
|
94
|
-
* Action passed when user double clicks on a row
|
|
95
|
-
*/
|
|
96
|
-
doubleClickAction?: (datum: T) => void;
|
|
97
|
-
/**
|
|
98
|
-
* Whether the user can select multiple rows in order to perform actions in bulk
|
|
99
|
-
*
|
|
100
|
-
* @default false
|
|
101
|
-
*/
|
|
102
|
-
multiRowSelectionEnabled?: boolean;
|
|
103
|
-
|
|
104
|
-
options?: Omit<
|
|
105
|
-
Partial<TableOptions<T>>,
|
|
106
|
-
| 'initialState'
|
|
107
|
-
| 'data'
|
|
108
|
-
| 'columns'
|
|
109
|
-
| 'manualPagination'
|
|
110
|
-
| 'enableMultiRowSelection'
|
|
111
|
-
| 'getRowId'
|
|
112
|
-
| 'getRowCanExpand'
|
|
113
|
-
| 'enableRowSelection'
|
|
114
|
-
>;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
interface TableType {
|
|
118
|
-
<T>(props: TableProps<T>): ReactElement;
|
|
119
|
-
Actions: typeof TableActions;
|
|
120
|
-
Filter: typeof TableFilter;
|
|
121
|
-
Footer: typeof TableFooter;
|
|
122
|
-
Header: typeof TableHeader;
|
|
123
|
-
Pagination: typeof TablePagination;
|
|
124
|
-
PerPage: typeof TablePerPage;
|
|
125
|
-
Predicate: typeof TablePredicate;
|
|
126
|
-
DateRangePicker: typeof TableDateRangePicker;
|
|
127
|
-
CollapsibleColumn: typeof TableCollapsibleColumn;
|
|
128
|
-
AccordionColumn: typeof TableAccordionColumn;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
33
|
export const Table: TableType = <T,>({
|
|
132
34
|
data,
|
|
133
35
|
getRowId,
|
|
@@ -165,13 +67,15 @@ export const Table: TableType = <T,>({
|
|
|
165
67
|
enableRowSelection: !loading,
|
|
166
68
|
...options,
|
|
167
69
|
});
|
|
168
|
-
const [state, setState] = useState<TableState
|
|
70
|
+
const [state, setState] = useState<TableState<T>>(table.initialState as TableState<T>);
|
|
169
71
|
table.setOptions((prev) => ({
|
|
170
72
|
...prev,
|
|
171
|
-
state,
|
|
172
|
-
onStateChange: setState
|
|
73
|
+
state: state as TanstackTableState,
|
|
74
|
+
onStateChange: setState as Dispatch<React.SetStateAction<TanstackTableState>>,
|
|
173
75
|
}));
|
|
174
|
-
const {clearSelection, getSelectedRow, getSelectedRows} = useRowSelection(table
|
|
76
|
+
const {clearSelection, getSelectedRow, getSelectedRows, outsideClickRef} = useRowSelection(table, {
|
|
77
|
+
multiRowSelectionEnabled,
|
|
78
|
+
});
|
|
175
79
|
const isFiltered =
|
|
176
80
|
!!state.globalFilter ||
|
|
177
81
|
Object.keys(form.values?.predicates ?? {}).some((predicate) => !!form.values.predicates[predicate]) ||
|
|
@@ -199,12 +103,6 @@ export const Table: TableType = <T,>({
|
|
|
199
103
|
setState((prevState) => ({...prevState, globalFilter: ''}));
|
|
200
104
|
}, []);
|
|
201
105
|
|
|
202
|
-
const outsideClickRef = useClickOutside(() => {
|
|
203
|
-
if (!multiRowSelectionEnabled) {
|
|
204
|
-
clearSelection();
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
|
|
208
106
|
if (!data) {
|
|
209
107
|
return (
|
|
210
108
|
<Center sx={{flexGrow: 1}}>
|
|
@@ -215,14 +113,15 @@ export const Table: TableType = <T,>({
|
|
|
215
113
|
|
|
216
114
|
const rows = table.getRowModel().rows.map((row) => {
|
|
217
115
|
const rowChildren = getExpandChildren?.(row.original) ?? null;
|
|
116
|
+
const isSelected = !!row.getIsSelected();
|
|
218
117
|
|
|
219
118
|
return (
|
|
220
119
|
<Fragment key={row.id}>
|
|
221
120
|
<tr
|
|
222
121
|
onClick={() => row.toggleSelected()}
|
|
223
122
|
onDoubleClick={() => doubleClickAction?.(row.original)}
|
|
224
|
-
className={cx(classes.row, {[classes.rowSelected]:
|
|
225
|
-
aria-selected={
|
|
123
|
+
className={cx(classes.row, {[classes.rowSelected]: isSelected})}
|
|
124
|
+
aria-selected={isSelected}
|
|
226
125
|
>
|
|
227
126
|
{row.getVisibleCells().map((cell) => {
|
|
228
127
|
const size = cell.column.getSize();
|
|
@@ -245,7 +144,7 @@ export const Table: TableType = <T,>({
|
|
|
245
144
|
{rowChildren ? (
|
|
246
145
|
<tr>
|
|
247
146
|
<td
|
|
248
|
-
colSpan={
|
|
147
|
+
colSpan={table.getAllColumns().length}
|
|
249
148
|
style={{
|
|
250
149
|
padding: 0,
|
|
251
150
|
borderTop: row.getIsExpanded() ? undefined : 'none',
|
|
@@ -302,7 +201,7 @@ export const Table: TableType = <T,>({
|
|
|
302
201
|
rows
|
|
303
202
|
) : (
|
|
304
203
|
<tr>
|
|
305
|
-
<td colSpan={
|
|
204
|
+
<td colSpan={table.getAllColumns().length}>{noDataChildren}</td>
|
|
306
205
|
</tr>
|
|
307
206
|
)}
|
|
308
207
|
</tbody>
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import {DateRangePickerValue} from '@mantine/dates';
|
|
2
|
+
import {UseFormReturnType} from '@mantine/form';
|
|
3
|
+
import {
|
|
4
|
+
ColumnDef,
|
|
5
|
+
CoreOptions,
|
|
6
|
+
InitialTableState as TanstackInitialTableState,
|
|
7
|
+
TableOptions,
|
|
8
|
+
TableState as TanstackTableState,
|
|
9
|
+
} from '@tanstack/table-core';
|
|
10
|
+
import {Dispatch, ReactElement, ReactNode, RefObject} from 'react';
|
|
11
|
+
|
|
12
|
+
import {TableActions} from './TableActions';
|
|
13
|
+
import {TableAccordionColumn, TableCollapsibleColumn} from './TableCollapsibleColumn';
|
|
14
|
+
import {TableDateRangePicker} from './TableDateRangePicker';
|
|
15
|
+
import {TableFilter} from './TableFilter';
|
|
16
|
+
import {TableFooter} from './TableFooter';
|
|
17
|
+
import {TableHeader} from './TableHeader';
|
|
18
|
+
import {TablePagination} from './TablePagination';
|
|
19
|
+
import {TablePerPage} from './TablePerPage';
|
|
20
|
+
import {TablePredicate} from './TablePredicate';
|
|
21
|
+
|
|
22
|
+
export type RowSelectionWithData<TData> = Record<string, TData>;
|
|
23
|
+
export interface RowSelectionState<TData> {
|
|
24
|
+
rowSelection: RowSelectionWithData<TData>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface TableState<TData> extends Omit<TanstackTableState, 'rowSelection'>, RowSelectionState<TData> {}
|
|
28
|
+
|
|
29
|
+
export interface InitialTableState<TData>
|
|
30
|
+
extends Omit<TanstackInitialTableState, 'rowSelection'>,
|
|
31
|
+
Partial<RowSelectionState<TData>>,
|
|
32
|
+
Partial<TableFormType> {}
|
|
33
|
+
|
|
34
|
+
export type onTableChangeEvent<TData> = (params: TableState<TData> & TableFormType) => void;
|
|
35
|
+
|
|
36
|
+
export type TableFormType = {
|
|
37
|
+
/**
|
|
38
|
+
* Object containing the table predicates and their selected values
|
|
39
|
+
*
|
|
40
|
+
* @example {type: "LONG", origin: "system"}
|
|
41
|
+
*/
|
|
42
|
+
predicates: Record<string, string>;
|
|
43
|
+
/**
|
|
44
|
+
* Selected date range in the table
|
|
45
|
+
*
|
|
46
|
+
* @example [new Date(2022, 0, 1), new Date(2022, 0, 31)]
|
|
47
|
+
*/
|
|
48
|
+
dateRange: DateRangePickerValue;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export type TableContextType<TData> = {
|
|
52
|
+
/**
|
|
53
|
+
* Function to call when the table needs an update
|
|
54
|
+
*/
|
|
55
|
+
onChange: () => void;
|
|
56
|
+
/**
|
|
57
|
+
* Internal state of the table
|
|
58
|
+
*
|
|
59
|
+
* @see https://tanstack.com/table/v8/docs/api/core/table#state
|
|
60
|
+
*/
|
|
61
|
+
state: TableState<TData>;
|
|
62
|
+
/**
|
|
63
|
+
* Function to update the table state
|
|
64
|
+
*/
|
|
65
|
+
setState: Dispatch<(prevState: TableState<TData>) => TableState<TData>>;
|
|
66
|
+
/**
|
|
67
|
+
* Whether the table currently as any kind of filter applied.
|
|
68
|
+
* Useful to determine if the noDataChildren is an empty state or just the result of a filter
|
|
69
|
+
*/
|
|
70
|
+
isFiltered: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Function that clears the filter and predicates
|
|
73
|
+
*/
|
|
74
|
+
clearFilters: () => void;
|
|
75
|
+
/**
|
|
76
|
+
* Function that returns the selected row if any.
|
|
77
|
+
*/
|
|
78
|
+
getSelectedRow: () => TData | null;
|
|
79
|
+
/**
|
|
80
|
+
* Function that returns an array of the selected rows. Most useful when multi row selection is enabled.
|
|
81
|
+
*/
|
|
82
|
+
getSelectedRows: () => TData[];
|
|
83
|
+
/**
|
|
84
|
+
* Function that clear the selected row
|
|
85
|
+
*/
|
|
86
|
+
clearSelection: () => void;
|
|
87
|
+
/**
|
|
88
|
+
* Form used to handle predicates and dateRange
|
|
89
|
+
*/
|
|
90
|
+
form: UseFormReturnType<TableFormType>;
|
|
91
|
+
/**
|
|
92
|
+
* Table container ref
|
|
93
|
+
*/
|
|
94
|
+
containerRef: RefObject<HTMLDivElement>;
|
|
95
|
+
/**
|
|
96
|
+
* Whether multi row selection is activated
|
|
97
|
+
*/
|
|
98
|
+
multiRowSelectionEnabled: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Function that returns the number of pages
|
|
101
|
+
*/
|
|
102
|
+
getPageCount: () => number;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export interface TableProps<T> {
|
|
106
|
+
/**
|
|
107
|
+
* Data to display in the table
|
|
108
|
+
*/
|
|
109
|
+
data: T[];
|
|
110
|
+
/**
|
|
111
|
+
* Defines how each row is uniquely identified. It is highly recommended that you specify this prop to an ID that makes sense.
|
|
112
|
+
*/
|
|
113
|
+
getRowId?: CoreOptions<T>['getRowId'];
|
|
114
|
+
/**
|
|
115
|
+
* Columns to display in the table.
|
|
116
|
+
*
|
|
117
|
+
* @see https://tanstack.com/table/v8/docs/guide/column-defs
|
|
118
|
+
*/
|
|
119
|
+
columns: Array<ColumnDef<T>>;
|
|
120
|
+
/**
|
|
121
|
+
* Function called when the table mounts
|
|
122
|
+
*
|
|
123
|
+
* @param state the state of the table
|
|
124
|
+
*/
|
|
125
|
+
onMount?: onTableChangeEvent<T>;
|
|
126
|
+
/**
|
|
127
|
+
* Function called when the table should update
|
|
128
|
+
*
|
|
129
|
+
* @param state the state of the table
|
|
130
|
+
*/
|
|
131
|
+
onChange?: onTableChangeEvent<T>;
|
|
132
|
+
/**
|
|
133
|
+
* Function that generates the expandable content of a row
|
|
134
|
+
* Return null for rows that don't need to be expandable
|
|
135
|
+
*
|
|
136
|
+
* @param datum the row for which the children should be generated.
|
|
137
|
+
*/
|
|
138
|
+
getExpandChildren?: (datum: T) => ReactNode;
|
|
139
|
+
/**
|
|
140
|
+
* React children to show when the table has no rows to show. You can leverage useTable to get the state of the table
|
|
141
|
+
*/
|
|
142
|
+
noDataChildren?: ReactNode;
|
|
143
|
+
/**
|
|
144
|
+
* Whether the table is loading or not
|
|
145
|
+
*
|
|
146
|
+
* @default false
|
|
147
|
+
*/
|
|
148
|
+
loading?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Childrens to display in the table. They need to be wrap in either `Table.Header` or `Table.Footer`
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* <Table ...>
|
|
154
|
+
* <Table.Header>
|
|
155
|
+
* <div>Hello</div>
|
|
156
|
+
* </Table.Header>
|
|
157
|
+
* </Table>
|
|
158
|
+
*/
|
|
159
|
+
children?: ReactNode;
|
|
160
|
+
/**
|
|
161
|
+
* Initial state of the table
|
|
162
|
+
*/
|
|
163
|
+
initialState?: InitialTableState<T>;
|
|
164
|
+
/**
|
|
165
|
+
* Action passed when user double clicks on a row
|
|
166
|
+
*/
|
|
167
|
+
doubleClickAction?: (datum: T) => void;
|
|
168
|
+
/**
|
|
169
|
+
* Whether the user can select multiple rows in order to perform actions in bulk
|
|
170
|
+
*
|
|
171
|
+
* @default false
|
|
172
|
+
*/
|
|
173
|
+
multiRowSelectionEnabled?: boolean;
|
|
174
|
+
/**
|
|
175
|
+
* Additional options that can be passed to the table
|
|
176
|
+
*/
|
|
177
|
+
options?: Omit<
|
|
178
|
+
Partial<TableOptions<T>>,
|
|
179
|
+
| 'initialState'
|
|
180
|
+
| 'data'
|
|
181
|
+
| 'columns'
|
|
182
|
+
| 'manualPagination'
|
|
183
|
+
| 'enableMultiRowSelection'
|
|
184
|
+
| 'getRowId'
|
|
185
|
+
| 'getRowCanExpand'
|
|
186
|
+
| 'enableRowSelection'
|
|
187
|
+
| 'onRowSelectionChange'
|
|
188
|
+
>;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface TableType {
|
|
192
|
+
<T>(props: TableProps<T>): ReactElement;
|
|
193
|
+
Actions: typeof TableActions;
|
|
194
|
+
Filter: typeof TableFilter;
|
|
195
|
+
Footer: typeof TableFooter;
|
|
196
|
+
Header: typeof TableHeader;
|
|
197
|
+
Pagination: typeof TablePagination;
|
|
198
|
+
PerPage: typeof TablePerPage;
|
|
199
|
+
Predicate: typeof TablePredicate;
|
|
200
|
+
DateRangePicker: typeof TableDateRangePicker;
|
|
201
|
+
CollapsibleColumn: typeof TableCollapsibleColumn;
|
|
202
|
+
AccordionColumn: typeof TableAccordionColumn;
|
|
203
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {Group} from '@mantine/core';
|
|
2
2
|
import {ReactElement, ReactNode} from 'react';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
import {useTable} from './TableContext';
|
|
4
5
|
|
|
5
6
|
interface TableActionsProps<T> {
|
|
6
7
|
/**
|
|
@@ -26,12 +27,18 @@ interface TableActionsProps<T> {
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
export const TableActions = <T,>({children}: TableActionsProps<T>): ReactElement => {
|
|
29
|
-
const {getSelectedRows, multiRowSelectionEnabled} = useTable();
|
|
30
|
+
const {getSelectedRows, multiRowSelectionEnabled} = useTable<T>();
|
|
30
31
|
const selectedRows = getSelectedRows();
|
|
31
32
|
|
|
32
33
|
if (selectedRows.length <= 0) {
|
|
33
34
|
return null;
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
return
|
|
37
|
+
return (
|
|
38
|
+
<Group spacing="xs">
|
|
39
|
+
{multiRowSelectionEnabled
|
|
40
|
+
? (children as (data: T[]) => ReactNode)(selectedRows)
|
|
41
|
+
: (children as (datum: T) => ReactNode)(selectedRows[0])}
|
|
42
|
+
</Group>
|
|
43
|
+
);
|
|
37
44
|
};
|
|
@@ -1,75 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {UseFormReturnType} from '@mantine/form';
|
|
3
|
-
import {TableState} from '@tanstack/react-table';
|
|
4
|
-
import {createContext, Dispatch, RefObject} from 'react';
|
|
1
|
+
import {createContext, useContext} from 'react';
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
import {TableContextType} from './Table.types';
|
|
7
4
|
|
|
8
|
-
export
|
|
9
|
-
/**
|
|
10
|
-
* Object containing the table predicates and their selected values
|
|
11
|
-
*
|
|
12
|
-
* @example {type: "LONG", origin: "system"}
|
|
13
|
-
*/
|
|
14
|
-
predicates: Record<string, string>;
|
|
15
|
-
/**
|
|
16
|
-
* Selected date range in the table
|
|
17
|
-
*
|
|
18
|
-
* @example [new Date(2022, 0, 1), new Date(2022, 0, 31)]
|
|
19
|
-
*/
|
|
20
|
-
dateRange: DateRangePickerValue;
|
|
21
|
-
};
|
|
5
|
+
export const TableContext = createContext<TableContextType<any> | null>(null);
|
|
22
6
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Internal state of the table
|
|
30
|
-
*
|
|
31
|
-
* @see https://tanstack.com/table/v8/docs/api/core/table#state
|
|
32
|
-
*/
|
|
33
|
-
state: TableState;
|
|
34
|
-
/**
|
|
35
|
-
* Function to update the table state
|
|
36
|
-
*/
|
|
37
|
-
setState: Dispatch<(prevState: TableState) => TableState>;
|
|
38
|
-
/**
|
|
39
|
-
* Whether the table currently as any kind of filter applied.
|
|
40
|
-
* Useful to determine if the noDataChildren is an empty state or just the result of a filter
|
|
41
|
-
*/
|
|
42
|
-
isFiltered: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Function that clears the filter and predicates
|
|
45
|
-
*/
|
|
46
|
-
clearFilters: () => void;
|
|
47
|
-
/**
|
|
48
|
-
* Function that returns the selected row if any.
|
|
49
|
-
*/
|
|
50
|
-
getSelectedRow: () => any | null;
|
|
51
|
-
/**
|
|
52
|
-
* Function that returns an array of the selected rows. Most useful when multi row selection is enabled.
|
|
53
|
-
*/
|
|
54
|
-
getSelectedRows: () => any[];
|
|
55
|
-
/**
|
|
56
|
-
* Function that clear the selected row
|
|
57
|
-
*/
|
|
58
|
-
clearSelection: () => void;
|
|
59
|
-
/**
|
|
60
|
-
* Form used to handle predicates and dateRange
|
|
61
|
-
*/
|
|
62
|
-
form: UseFormReturnType<TableFormType>;
|
|
63
|
-
/**
|
|
64
|
-
* Table container ref
|
|
65
|
-
*/
|
|
66
|
-
containerRef: RefObject<HTMLDivElement>;
|
|
67
|
-
multiRowSelectionEnabled: boolean;
|
|
7
|
+
export const useTable = <T,>(): TableContextType<T> => {
|
|
8
|
+
const ctx = useContext(TableContext);
|
|
9
|
+
if (ctx === null) {
|
|
10
|
+
throw new Error('useTable must be used inside of a TableContext.Provider');
|
|
11
|
+
}
|
|
68
12
|
|
|
69
|
-
|
|
70
|
-
* Function that returns the number of pages
|
|
71
|
-
*/
|
|
72
|
-
getPageCount: () => number;
|
|
13
|
+
return ctx;
|
|
73
14
|
};
|
|
74
|
-
|
|
75
|
-
export const TableContext = createContext<TableContextType | null>(null);
|
|
@@ -7,7 +7,7 @@ import {FunctionComponent, useState} from 'react';
|
|
|
7
7
|
import {Button} from '../button';
|
|
8
8
|
import {DateRangePickerInlineCalendar, DateRangePickerInlineCalendarProps} from '../date-range-picker';
|
|
9
9
|
import {DateRangePickerPreset} from '../date-range-picker/DateRangePickerPresetSelect';
|
|
10
|
-
import {useTable} from './
|
|
10
|
+
import {useTable} from './TableContext';
|
|
11
11
|
|
|
12
12
|
interface TableDateRangePickerProps
|
|
13
13
|
extends Pick<DateRangePickerInlineCalendarProps, 'startProps' | 'endProps' | 'rangeCalendarProps'> {
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import {CrossSize16Px, SearchSize16Px} from '@coveord/plasma-react-icons';
|
|
2
2
|
import {ActionIcon, createStyles, DefaultProps, Selectors, TextInput} from '@mantine/core';
|
|
3
|
-
import {TableState} from '@tanstack/react-table';
|
|
4
3
|
import {ChangeEventHandler, FunctionComponent, MouseEventHandler} from 'react';
|
|
5
4
|
|
|
6
|
-
import {useTable} from './
|
|
5
|
+
import {useTable} from './TableContext';
|
|
7
6
|
|
|
8
7
|
const useStyles = createStyles((theme) => ({
|
|
9
8
|
wrapper: {
|
|
@@ -35,7 +34,7 @@ export const TableFilter: FunctionComponent<TableFilterProps> = ({
|
|
|
35
34
|
const {state, setState} = useTable();
|
|
36
35
|
|
|
37
36
|
const changeFilterValue = (value: string) => {
|
|
38
|
-
setState((prevState
|
|
37
|
+
setState((prevState) => ({
|
|
39
38
|
...prevState,
|
|
40
39
|
pagination: prevState.pagination
|
|
41
40
|
? {pageIndex: 0, pageSize: prevState.pagination.pageSize}
|
|
@@ -3,7 +3,7 @@ import {createStyles, DefaultProps, Group, Selectors, Space, Tooltip} from '@man
|
|
|
3
3
|
import {FunctionComponent, ReactNode} from 'react';
|
|
4
4
|
|
|
5
5
|
import {Button} from '../button';
|
|
6
|
-
import {useTable} from './
|
|
6
|
+
import {useTable} from './TableContext';
|
|
7
7
|
|
|
8
8
|
const useStyles = createStyles((theme) => ({
|
|
9
9
|
root: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {Pagination} from '@mantine/core';
|
|
2
|
-
import {TableState} from '@tanstack/react-table';
|
|
3
2
|
import {FunctionComponent} from 'react';
|
|
4
|
-
|
|
3
|
+
|
|
4
|
+
import {useTable} from './TableContext';
|
|
5
5
|
|
|
6
6
|
interface TablePaginationProps {
|
|
7
7
|
/**
|
|
@@ -13,7 +13,7 @@ interface TablePaginationProps {
|
|
|
13
13
|
export const TablePagination: FunctionComponent<TablePaginationProps> = ({totalPages}) => {
|
|
14
14
|
const {state, setState, containerRef, getPageCount} = useTable();
|
|
15
15
|
const updatePage = (newPage: number) => {
|
|
16
|
-
setState((prevState
|
|
16
|
+
setState((prevState) => ({
|
|
17
17
|
...prevState,
|
|
18
18
|
pagination: {...prevState.pagination, pageIndex: newPage - 1},
|
|
19
19
|
}));
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import {Group, SegmentedControl, Text} from '@mantine/core';
|
|
2
|
-
import {TableState} from '@tanstack/react-table';
|
|
3
2
|
import {FunctionComponent} from 'react';
|
|
4
3
|
|
|
5
|
-
import {useTable} from './
|
|
4
|
+
import {useTable} from './TableContext';
|
|
6
5
|
|
|
7
6
|
interface TablePerPageProps {
|
|
8
7
|
/**
|
|
@@ -26,7 +25,7 @@ export const TablePerPage: FunctionComponent<TablePerPageProps> & {DEFAULT_SIZE:
|
|
|
26
25
|
const {state, setState} = useTable();
|
|
27
26
|
|
|
28
27
|
const updatePerPage = (newPerPage: string) => {
|
|
29
|
-
setState((prevState
|
|
28
|
+
setState((prevState) => ({
|
|
30
29
|
...prevState,
|
|
31
30
|
pagination: {pageIndex: 0, pageSize: parseInt(newPerPage, 10)},
|
|
32
31
|
}));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {Select, SelectItem,
|
|
1
|
+
import {Group, Select, SelectItem, Text} from '@mantine/core';
|
|
2
2
|
import {FunctionComponent} from 'react';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
import {useTable} from './TableContext';
|
|
4
5
|
|
|
5
6
|
interface TablePredicateProps {
|
|
6
7
|
/**
|