material-react-table 0.6.10 → 0.7.0-alpha.3
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/README.md +27 -17
- package/dist/MaterialReactTable.d.ts +306 -109
- package/dist/body/MRT_TableBody.d.ts +3 -0
- package/dist/body/MRT_TableBodyCell.d.ts +2 -11
- package/dist/body/MRT_TableBodyRow.d.ts +3 -1
- package/dist/body/MRT_TableDetailPanel.d.ts +2 -1
- package/dist/buttons/MRT_CopyButton.d.ts +4 -2
- package/dist/buttons/MRT_EditActionButtons.d.ts +2 -1
- package/dist/buttons/MRT_ExpandAllButton.d.ts +2 -0
- package/dist/buttons/MRT_ExpandButton.d.ts +2 -1
- package/dist/buttons/MRT_FullScreenToggleButton.d.ts +2 -0
- package/dist/buttons/MRT_ShowHideColumnsButton.d.ts +2 -0
- package/dist/buttons/MRT_ToggleColumnActionMenuButton.d.ts +3 -2
- package/dist/buttons/MRT_ToggleDensePaddingButton.d.ts +2 -0
- package/dist/buttons/MRT_ToggleFiltersButton.d.ts +2 -0
- package/dist/buttons/MRT_ToggleRowActionMenuButton.d.ts +2 -1
- package/dist/buttons/MRT_ToggleSearchButton.d.ts +2 -0
- package/dist/footer/MRT_TableFooter.d.ts +3 -0
- package/dist/footer/MRT_TableFooterCell.d.ts +3 -2
- package/dist/footer/MRT_TableFooterRow.d.ts +2 -1
- package/dist/head/MRT_TableHead.d.ts +3 -0
- package/dist/head/MRT_TableHeadCell.d.ts +4 -18
- package/dist/head/MRT_TableHeadRow.d.ts +2 -1
- package/dist/icons.d.ts +1 -1
- package/dist/inputs/MRT_EditCellTextField.d.ts +2 -1
- package/dist/inputs/MRT_FilterTextField.d.ts +3 -2
- package/dist/inputs/MRT_SearchTextField.d.ts +2 -0
- package/dist/inputs/MRT_SelectCheckbox.d.ts +2 -1
- package/dist/localization.d.ts +7 -2
- package/dist/material-react-table.cjs.development.js +2209 -2483
- package/dist/material-react-table.cjs.development.js.map +1 -1
- package/dist/material-react-table.cjs.production.min.js +1 -1
- package/dist/material-react-table.cjs.production.min.js.map +1 -1
- package/dist/material-react-table.esm.js +2210 -2484
- package/dist/material-react-table.esm.js.map +1 -1
- package/dist/menus/MRT_ColumnActionMenu.d.ts +3 -2
- package/dist/menus/MRT_FilterTypeMenu.d.ts +4 -3
- package/dist/menus/MRT_RowActionMenu.d.ts +3 -2
- package/dist/menus/MRT_ShowHideColumnsMenu.d.ts +2 -0
- package/dist/menus/MRT_ShowHideColumnsMenuItems.d.ts +2 -1
- package/dist/table/MRT_Table.d.ts +3 -0
- package/dist/table/MRT_TableContainer.d.ts +2 -0
- package/dist/table/MRT_TablePaper.d.ts +7 -0
- package/dist/table/MRT_TableRoot.d.ts +3 -0
- package/dist/toolbar/MRT_LinearProgressBar.d.ts +2 -0
- package/dist/toolbar/MRT_TablePagination.d.ts +2 -0
- package/dist/toolbar/MRT_ToolbarAlertBanner.d.ts +2 -0
- package/dist/toolbar/MRT_ToolbarBottom.d.ts +2 -0
- package/dist/toolbar/MRT_ToolbarInternalButtons.d.ts +2 -0
- package/dist/toolbar/MRT_ToolbarTop.d.ts +4 -2
- package/dist/utils.d.ts +12 -2
- package/package.json +28 -29
- package/src/MaterialReactTable.tsx +594 -300
- package/src/body/MRT_TableBody.tsx +26 -22
- package/src/body/MRT_TableBodyCell.tsx +75 -60
- package/src/body/MRT_TableBodyRow.tsx +37 -76
- package/src/body/MRT_TableDetailPanel.tsx +21 -17
- package/src/buttons/MRT_CopyButton.tsx +16 -9
- package/src/buttons/MRT_EditActionButtons.tsx +16 -13
- package/src/buttons/MRT_ExpandAllButton.tsx +24 -9
- package/src/buttons/MRT_ExpandButton.tsx +22 -15
- package/src/buttons/MRT_FullScreenToggleButton.tsx +18 -11
- package/src/buttons/MRT_ShowHideColumnsButton.tsx +18 -7
- package/src/buttons/MRT_ToggleColumnActionMenuButton.tsx +22 -11
- package/src/buttons/MRT_ToggleDensePaddingButton.tsx +18 -11
- package/src/buttons/MRT_ToggleFiltersButton.tsx +16 -9
- package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +27 -22
- package/src/buttons/MRT_ToggleSearchButton.tsx +24 -12
- package/src/footer/MRT_TableFooter.tsx +24 -8
- package/src/footer/MRT_TableFooterCell.tsx +34 -26
- package/src/footer/MRT_TableFooterRow.tsx +21 -39
- package/src/head/MRT_TableHead.tsx +24 -8
- package/src/head/MRT_TableHeadCell.tsx +184 -142
- package/src/head/MRT_TableHeadRow.tsx +16 -104
- package/src/icons.ts +3 -3
- package/src/inputs/MRT_EditCellTextField.tsx +23 -24
- package/src/inputs/MRT_FilterTextField.tsx +53 -32
- package/src/inputs/MRT_SearchTextField.tsx +46 -24
- package/src/inputs/MRT_SelectCheckbox.tsx +42 -30
- package/src/localization.ts +13 -2
- package/src/menus/MRT_ColumnActionMenu.tsx +129 -69
- package/src/menus/MRT_FilterTypeMenu.tsx +28 -22
- package/src/menus/MRT_RowActionMenu.tsx +21 -14
- package/src/menus/MRT_ShowHideColumnsMenu.tsx +52 -20
- package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +27 -17
- package/src/table/MRT_Table.tsx +25 -15
- package/src/table/MRT_TableContainer.tsx +106 -45
- package/src/table/MRT_TablePaper.tsx +65 -0
- package/src/table/MRT_TableRoot.tsx +236 -0
- package/src/toolbar/MRT_LinearProgressBar.tsx +10 -7
- package/src/toolbar/MRT_TablePagination.tsx +33 -19
- package/src/toolbar/MRT_ToolbarAlertBanner.tsx +33 -20
- package/src/toolbar/MRT_ToolbarBottom.tsx +32 -21
- package/src/toolbar/MRT_ToolbarInternalButtons.tsx +34 -20
- package/src/toolbar/MRT_ToolbarTop.tsx +36 -29
- package/src/utils.ts +37 -8
- package/dist/head/MRT_TableHeadCellActions.d.ts +0 -5
- package/dist/table/MRT_TableSpacerCell.d.ts +0 -6
- package/dist/useMRT.d.ts +0 -28
- package/src/@types/faker.d.ts +0 -4
- package/src/@types/react-table-config.d.ts +0 -53
- package/src/head/MRT_TableHeadCellActions.tsx +0 -29
- package/src/table/MRT_TableSpacerCell.tsx +0 -20
- package/src/useMRT.tsx +0 -226
|
@@ -1,37 +1,44 @@
|
|
|
1
1
|
import React, { FC } from 'react';
|
|
2
2
|
import { FormControlLabel, MenuItem, Switch } from '@mui/material';
|
|
3
|
-
import {
|
|
4
|
-
import type { MRT_ColumnInstance } from '..';
|
|
3
|
+
import type { MRT_ColumnInstance, MRT_TableInstance } from '..';
|
|
5
4
|
import { commonMenuItemStyles } from './MRT_ColumnActionMenu';
|
|
6
|
-
import { useMRT } from '../useMRT';
|
|
7
5
|
|
|
8
6
|
interface Props {
|
|
9
7
|
column: MRT_ColumnInstance;
|
|
10
8
|
isSubMenu?: boolean;
|
|
9
|
+
tableInstance: MRT_TableInstance;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
12
|
export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
|
|
14
13
|
column,
|
|
15
14
|
isSubMenu,
|
|
15
|
+
tableInstance,
|
|
16
16
|
}) => {
|
|
17
|
-
const {
|
|
18
|
-
|
|
17
|
+
const {
|
|
18
|
+
getState,
|
|
19
|
+
options: { onColumnHide },
|
|
20
|
+
} = tableInstance;
|
|
19
21
|
|
|
20
|
-
const
|
|
21
|
-
isParentHeader &&
|
|
22
|
-
!!column.columns?.every((childColumn) => childColumn.isVisible);
|
|
22
|
+
const { columnVisibility } = getState();
|
|
23
23
|
|
|
24
|
-
const switchChecked =
|
|
24
|
+
const switchChecked =
|
|
25
|
+
(column.columnDefType !== 'group' && column.getIsVisible()) ||
|
|
26
|
+
(column.columnDefType === 'group' &&
|
|
27
|
+
column.getLeafColumns().some((col) => col.getIsVisible()));
|
|
25
28
|
|
|
26
|
-
const handleToggleColumnHidden = (column:
|
|
27
|
-
if (
|
|
28
|
-
column?.columns?.forEach?.((childColumn) => {
|
|
29
|
-
childColumn.
|
|
29
|
+
const handleToggleColumnHidden = (column: MRT_ColumnInstance) => {
|
|
30
|
+
if (column.columnDefType === 'group') {
|
|
31
|
+
column?.columns?.forEach?.((childColumn: MRT_ColumnInstance) => {
|
|
32
|
+
childColumn.toggleVisibility(!switchChecked);
|
|
30
33
|
});
|
|
31
34
|
} else {
|
|
32
|
-
column.
|
|
35
|
+
column.toggleVisibility();
|
|
33
36
|
}
|
|
34
|
-
onColumnHide?.(
|
|
37
|
+
onColumnHide?.({
|
|
38
|
+
column,
|
|
39
|
+
columnVisibility,
|
|
40
|
+
tableInstance,
|
|
41
|
+
});
|
|
35
42
|
};
|
|
36
43
|
|
|
37
44
|
return (
|
|
@@ -43,8 +50,10 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
|
|
|
43
50
|
componentsProps={{ typography: { sx: { marginBottom: 0 } } }}
|
|
44
51
|
checked={switchChecked}
|
|
45
52
|
control={<Switch />}
|
|
46
|
-
disabled={
|
|
47
|
-
|
|
53
|
+
disabled={
|
|
54
|
+
(isSubMenu && switchChecked) || column.enableHiding === false
|
|
55
|
+
}
|
|
56
|
+
label={column.header}
|
|
48
57
|
onChange={() => handleToggleColumnHidden(column)}
|
|
49
58
|
/>
|
|
50
59
|
</MenuItem>
|
|
@@ -53,6 +62,7 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
|
|
|
53
62
|
key={`${i}-${c.id}`}
|
|
54
63
|
column={c}
|
|
55
64
|
isSubMenu={isSubMenu}
|
|
65
|
+
tableInstance={tableInstance}
|
|
56
66
|
/>
|
|
57
67
|
))}
|
|
58
68
|
</>
|
package/src/table/MRT_Table.tsx
CHANGED
|
@@ -3,33 +3,43 @@ import { Table } from '@mui/material';
|
|
|
3
3
|
import { MRT_TableHead } from '../head/MRT_TableHead';
|
|
4
4
|
import { MRT_TableBody } from '../body/MRT_TableBody';
|
|
5
5
|
import { MRT_TableFooter } from '../footer/MRT_TableFooter';
|
|
6
|
-
import {
|
|
6
|
+
import { MRT_TableInstance } from '..';
|
|
7
7
|
|
|
8
|
-
interface Props {
|
|
8
|
+
interface Props {
|
|
9
|
+
pinned: 'left' | 'center' | 'right' | 'none';
|
|
10
|
+
tableInstance: MRT_TableInstance;
|
|
11
|
+
}
|
|
9
12
|
|
|
10
|
-
export const MRT_Table: FC<Props> = () => {
|
|
11
|
-
const {
|
|
12
|
-
|
|
13
|
+
export const MRT_Table: FC<Props> = ({ pinned, tableInstance }) => {
|
|
14
|
+
const {
|
|
15
|
+
getTableProps,
|
|
16
|
+
options: {
|
|
17
|
+
enableStickyHeader,
|
|
18
|
+
hideTableFooter,
|
|
19
|
+
hideTableHead,
|
|
20
|
+
muiTableProps,
|
|
21
|
+
},
|
|
22
|
+
} = tableInstance;
|
|
13
23
|
|
|
14
24
|
const mTableProps =
|
|
15
25
|
muiTableProps instanceof Function
|
|
16
|
-
? muiTableProps(tableInstance)
|
|
26
|
+
? muiTableProps({ tableInstance })
|
|
17
27
|
: muiTableProps;
|
|
18
28
|
|
|
19
29
|
const tableProps = {
|
|
30
|
+
...getTableProps(),
|
|
20
31
|
...mTableProps,
|
|
21
|
-
...tableInstance.getTableProps(),
|
|
22
|
-
style: {
|
|
23
|
-
...tableInstance.getTableProps().style,
|
|
24
|
-
...mTableProps?.style,
|
|
25
|
-
},
|
|
26
32
|
};
|
|
27
33
|
|
|
28
34
|
return (
|
|
29
|
-
<Table {...tableProps}>
|
|
30
|
-
{!hideTableHead &&
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
<Table stickyHeader={enableStickyHeader} {...tableProps}>
|
|
36
|
+
{!hideTableHead && (
|
|
37
|
+
<MRT_TableHead pinned={pinned} tableInstance={tableInstance} />
|
|
38
|
+
)}
|
|
39
|
+
<MRT_TableBody pinned={pinned} tableInstance={tableInstance} />
|
|
40
|
+
{!hideTableFooter && (
|
|
41
|
+
<MRT_TableFooter pinned={pinned} tableInstance={tableInstance} />
|
|
42
|
+
)}
|
|
33
43
|
</Table>
|
|
34
44
|
);
|
|
35
45
|
};
|
|
@@ -1,65 +1,126 @@
|
|
|
1
|
-
import React, { FC,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import React, { FC, useLayoutEffect, useState } from 'react';
|
|
2
|
+
import { alpha, Box, TableContainer, Theme } from '@mui/material';
|
|
3
|
+
import { SystemStyleObject } from '@mui/material/node_modules/@mui/system';
|
|
4
|
+
import { MRT_TableInstance } from '..';
|
|
4
5
|
import { MRT_Table } from './MRT_Table';
|
|
5
|
-
import { MRT_ToolbarTop } from '../toolbar/MRT_ToolbarTop';
|
|
6
|
-
import { MRT_ToolbarBottom } from '../toolbar/MRT_ToolbarBottom';
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
const commonBoxStyles = ({
|
|
8
|
+
pinned,
|
|
9
|
+
theme,
|
|
10
|
+
visible,
|
|
11
|
+
}: {
|
|
12
|
+
pinned?: 'left' | 'right';
|
|
13
|
+
theme: Theme;
|
|
14
|
+
visible?: boolean;
|
|
15
|
+
}): SystemStyleObject<Theme> => ({
|
|
16
|
+
display: 'grid',
|
|
17
|
+
minWidth: visible ? '200px' : 0,
|
|
18
|
+
overflowX: 'auto',
|
|
19
|
+
boxShadow:
|
|
20
|
+
pinned === 'left'
|
|
21
|
+
? `0 1px 12px ${alpha(theme.palette.common.black, 0.5)}`
|
|
22
|
+
: pinned === 'right'
|
|
23
|
+
? `0 -1px 12px ${alpha(theme.palette.common.black, 0.5)}`
|
|
24
|
+
: 'none',
|
|
25
|
+
});
|
|
9
26
|
|
|
10
|
-
|
|
27
|
+
interface Props {
|
|
28
|
+
tableInstance: MRT_TableInstance;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const MRT_TableContainer: FC<Props> = ({ tableInstance }) => {
|
|
11
32
|
const {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
33
|
+
getCenterTableWidth,
|
|
34
|
+
getIsSomeColumnsPinned,
|
|
35
|
+
getLeftTableWidth,
|
|
36
|
+
getRightTableWidth,
|
|
37
|
+
getState,
|
|
38
|
+
options: {
|
|
39
|
+
enableColumnPinning,
|
|
40
|
+
enableStickyHeader,
|
|
41
|
+
idPrefix,
|
|
42
|
+
muiTableContainerProps,
|
|
43
|
+
},
|
|
44
|
+
} = tableInstance;
|
|
45
|
+
|
|
46
|
+
const { isFullScreen, columnPinning } = getState();
|
|
18
47
|
|
|
19
|
-
|
|
20
|
-
if (typeof window !== 'undefined') {
|
|
21
|
-
if (fullScreen) {
|
|
22
|
-
document.body.style.overflow = 'hidden';
|
|
23
|
-
} else {
|
|
24
|
-
document.body.style.overflow = 'auto';
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}, [fullScreen]);
|
|
48
|
+
const [totalToolbarHeight, setTotalToolbarHeight] = useState(0);
|
|
28
49
|
|
|
29
50
|
const tableContainerProps =
|
|
30
51
|
muiTableContainerProps instanceof Function
|
|
31
|
-
? muiTableContainerProps(tableInstance)
|
|
52
|
+
? muiTableContainerProps({ tableInstance })
|
|
32
53
|
: muiTableContainerProps;
|
|
33
54
|
|
|
55
|
+
useLayoutEffect(() => {
|
|
56
|
+
const topToolbarHeight =
|
|
57
|
+
typeof document !== 'undefined'
|
|
58
|
+
? document?.getElementById(`mrt-${idPrefix}-toolbar-top`)
|
|
59
|
+
?.offsetHeight ?? 0
|
|
60
|
+
: 0;
|
|
61
|
+
|
|
62
|
+
const bottomToolbarHeight =
|
|
63
|
+
typeof document !== 'undefined'
|
|
64
|
+
? document?.getElementById(`mrt-${idPrefix}-toolbar-bottom`)
|
|
65
|
+
?.offsetHeight ?? 0
|
|
66
|
+
: 0;
|
|
67
|
+
|
|
68
|
+
setTotalToolbarHeight(topToolbarHeight + bottomToolbarHeight);
|
|
69
|
+
});
|
|
70
|
+
|
|
34
71
|
return (
|
|
35
72
|
<TableContainer
|
|
36
|
-
component={Paper}
|
|
37
73
|
{...tableContainerProps}
|
|
38
74
|
sx={{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
position: fullScreen ? 'fixed' : undefined,
|
|
45
|
-
right: fullScreen ? '0' : undefined,
|
|
46
|
-
top: fullScreen ? '0' : undefined,
|
|
47
|
-
transition: 'all 0.2s ease-in-out',
|
|
48
|
-
width: fullScreen ? '100vw' : undefined,
|
|
49
|
-
zIndex: fullScreen ? 1200 : 1,
|
|
75
|
+
maxWidth: '100%',
|
|
76
|
+
maxHeight: enableStickyHeader
|
|
77
|
+
? `clamp(350px, calc(100vh - ${totalToolbarHeight}px), 2000px)`
|
|
78
|
+
: undefined,
|
|
79
|
+
overflow: 'auto',
|
|
50
80
|
...tableContainerProps?.sx,
|
|
51
81
|
}}
|
|
82
|
+
style={{
|
|
83
|
+
maxHeight: isFullScreen
|
|
84
|
+
? `calc(100vh - ${totalToolbarHeight}px)`
|
|
85
|
+
: undefined,
|
|
86
|
+
}}
|
|
52
87
|
>
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
88
|
+
{enableColumnPinning && getIsSomeColumnsPinned() ? (
|
|
89
|
+
<Box
|
|
90
|
+
sx={{
|
|
91
|
+
display: 'grid',
|
|
92
|
+
gridTemplateColumns: `${getLeftTableWidth()}fr ${getCenterTableWidth()}fr ${getRightTableWidth()}fr`,
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
<Box
|
|
96
|
+
sx={(theme: Theme) =>
|
|
97
|
+
commonBoxStyles({
|
|
98
|
+
pinned: 'left',
|
|
99
|
+
theme,
|
|
100
|
+
visible: !!columnPinning.left?.length,
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
>
|
|
104
|
+
<MRT_Table pinned="left" tableInstance={tableInstance} />
|
|
105
|
+
</Box>
|
|
106
|
+
<Box sx={(theme: Theme) => commonBoxStyles({ theme })}>
|
|
107
|
+
<MRT_Table pinned="center" tableInstance={tableInstance} />
|
|
108
|
+
</Box>
|
|
109
|
+
<Box
|
|
110
|
+
sx={(theme: Theme) =>
|
|
111
|
+
commonBoxStyles({
|
|
112
|
+
pinned: 'right',
|
|
113
|
+
theme,
|
|
114
|
+
visible: !!columnPinning.right?.length,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
>
|
|
118
|
+
<MRT_Table pinned="right" tableInstance={tableInstance} />
|
|
119
|
+
</Box>
|
|
120
|
+
</Box>
|
|
121
|
+
) : (
|
|
122
|
+
<MRT_Table pinned="none" tableInstance={tableInstance} />
|
|
123
|
+
)}
|
|
63
124
|
</TableContainer>
|
|
64
125
|
);
|
|
65
126
|
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React, { FC, useEffect } from 'react';
|
|
2
|
+
import { Paper } from '@mui/material';
|
|
3
|
+
import { MRT_ToolbarTop } from '../toolbar/MRT_ToolbarTop';
|
|
4
|
+
import { MRT_ToolbarBottom } from '../toolbar/MRT_ToolbarBottom';
|
|
5
|
+
import { MRT_TableContainer } from './MRT_TableContainer';
|
|
6
|
+
import { MRT_TableInstance } from '..';
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
tableInstance: MRT_TableInstance;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const MRT_TablePaper: FC<Props> = ({ tableInstance }) => {
|
|
13
|
+
const {
|
|
14
|
+
getState,
|
|
15
|
+
options: { hideToolbarBottom, hideToolbarTop, muiTablePaperProps },
|
|
16
|
+
} = tableInstance;
|
|
17
|
+
|
|
18
|
+
const { isFullScreen } = getState();
|
|
19
|
+
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (typeof window !== 'undefined') {
|
|
22
|
+
if (isFullScreen) {
|
|
23
|
+
document.body.style.overflow = 'hidden';
|
|
24
|
+
} else {
|
|
25
|
+
document.body.style.overflow = 'auto';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}, [isFullScreen]);
|
|
29
|
+
|
|
30
|
+
const tablePaperProps =
|
|
31
|
+
muiTablePaperProps instanceof Function
|
|
32
|
+
? muiTablePaperProps({ tableInstance })
|
|
33
|
+
: muiTablePaperProps;
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Paper
|
|
37
|
+
elevation={2}
|
|
38
|
+
{...tablePaperProps}
|
|
39
|
+
sx={{
|
|
40
|
+
transition: 'all 0.2s ease-in-out',
|
|
41
|
+
...tablePaperProps?.sx,
|
|
42
|
+
}}
|
|
43
|
+
style={{
|
|
44
|
+
height: isFullScreen ? '100%' : undefined,
|
|
45
|
+
left: isFullScreen ? '0' : undefined,
|
|
46
|
+
margin: isFullScreen ? '0' : undefined,
|
|
47
|
+
maxHeight: isFullScreen ? '100%' : undefined,
|
|
48
|
+
maxWidth: isFullScreen ? '100%' : undefined,
|
|
49
|
+
overflowY: !isFullScreen ? 'hidden' : undefined,
|
|
50
|
+
position: isFullScreen ? 'fixed' : undefined,
|
|
51
|
+
right: isFullScreen ? '0' : undefined,
|
|
52
|
+
top: isFullScreen ? '0' : undefined,
|
|
53
|
+
width: isFullScreen ? '100vw' : undefined,
|
|
54
|
+
zIndex: isFullScreen ? 1200 : 1,
|
|
55
|
+
bottom: isFullScreen ? '0' : undefined,
|
|
56
|
+
}}
|
|
57
|
+
>
|
|
58
|
+
{!hideToolbarTop && <MRT_ToolbarTop tableInstance={tableInstance} />}
|
|
59
|
+
<MRT_TableContainer tableInstance={tableInstance} />
|
|
60
|
+
{!hideToolbarBottom && (
|
|
61
|
+
<MRT_ToolbarBottom tableInstance={tableInstance} />
|
|
62
|
+
)}
|
|
63
|
+
</Paper>
|
|
64
|
+
);
|
|
65
|
+
};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {
|
|
2
|
+
columnFilterRowsFn,
|
|
3
|
+
createTable,
|
|
4
|
+
expandRowsFn,
|
|
5
|
+
functionalUpdate,
|
|
6
|
+
globalFilterRowsFn,
|
|
7
|
+
groupRowsFn,
|
|
8
|
+
paginateRowsFn,
|
|
9
|
+
PaginationState,
|
|
10
|
+
sortRowsFn,
|
|
11
|
+
Table,
|
|
12
|
+
useTable,
|
|
13
|
+
} from '@tanstack/react-table';
|
|
14
|
+
import React, { useMemo, useState } from 'react';
|
|
15
|
+
import {
|
|
16
|
+
MRT_ColumnInterface,
|
|
17
|
+
MRT_FilterType,
|
|
18
|
+
MRT_Row,
|
|
19
|
+
MRT_TableInstance,
|
|
20
|
+
} from '..';
|
|
21
|
+
import { MRT_ExpandAllButton } from '../buttons/MRT_ExpandAllButton';
|
|
22
|
+
import { MRT_ExpandButton } from '../buttons/MRT_ExpandButton';
|
|
23
|
+
import { MRT_ToggleRowActionMenuButton } from '../buttons/MRT_ToggleRowActionMenuButton';
|
|
24
|
+
import { MRT_SelectCheckbox } from '../inputs/MRT_SelectCheckbox';
|
|
25
|
+
import { MaterialReactTableProps } from '../MaterialReactTable';
|
|
26
|
+
import { MRT_TablePaper } from './MRT_TablePaper';
|
|
27
|
+
import {
|
|
28
|
+
createDataColumn,
|
|
29
|
+
createDisplayColumn,
|
|
30
|
+
createGroup,
|
|
31
|
+
getAllLeafColumnDefs,
|
|
32
|
+
} from '../utils';
|
|
33
|
+
import { defaultFilterFNs } from '../filtersFNs';
|
|
34
|
+
import { MRT_FILTER_TYPE } from '../enums';
|
|
35
|
+
|
|
36
|
+
export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
37
|
+
props: MaterialReactTableProps<D>,
|
|
38
|
+
) => {
|
|
39
|
+
const idPrefix = useMemo(
|
|
40
|
+
() => props.idPrefix ?? Math.random().toString(36).substring(2, 9),
|
|
41
|
+
[props.idPrefix],
|
|
42
|
+
);
|
|
43
|
+
const [currentEditingRow, setCurrentEditingRow] = useState<MRT_Row | null>(
|
|
44
|
+
null,
|
|
45
|
+
);
|
|
46
|
+
const [isDensePadding, setIsDensePadding] = useState(
|
|
47
|
+
props.initialState?.isDensePadding ?? false,
|
|
48
|
+
);
|
|
49
|
+
const [isFullScreen, setIsFullScreen] = useState(
|
|
50
|
+
props.initialState?.isFullScreen ?? false,
|
|
51
|
+
);
|
|
52
|
+
const [showFilters, setShowFilters] = useState(
|
|
53
|
+
props.initialState?.showFilters ?? false,
|
|
54
|
+
);
|
|
55
|
+
const [showSearch, setShowSearch] = useState(
|
|
56
|
+
props.initialState?.showSearch ?? false,
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const [pagination, setPagination] = useState<PaginationState>({
|
|
60
|
+
pageIndex: props.initialState?.pagination?.pageIndex ?? 0,
|
|
61
|
+
pageSize: props.initialState?.pagination?.pageSize ?? 10,
|
|
62
|
+
pageCount: props.initialState?.pagination?.pageCount ?? -1,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const [currentFilterTypes, setCurrentFilterTypes] = useState<{
|
|
66
|
+
[key: string]: MRT_FilterType;
|
|
67
|
+
}>(() =>
|
|
68
|
+
Object.assign(
|
|
69
|
+
{},
|
|
70
|
+
...getAllLeafColumnDefs(props.columns as MRT_ColumnInterface[]).map(
|
|
71
|
+
(c) => ({
|
|
72
|
+
[c.id as string]:
|
|
73
|
+
c.filter ??
|
|
74
|
+
props?.initialState?.columnFilters?.[c.id as any] ??
|
|
75
|
+
(!!c.filterSelectOptions?.length
|
|
76
|
+
? MRT_FILTER_TYPE.EQUALS
|
|
77
|
+
: MRT_FILTER_TYPE.BEST_MATCH),
|
|
78
|
+
}),
|
|
79
|
+
),
|
|
80
|
+
),
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const [currentGlobalFilterType, setCurrentGlobalFilterType] = useState(
|
|
84
|
+
props.globalFilterType ?? MRT_FILTER_TYPE.BEST_MATCH_FIRST,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const table = useMemo(
|
|
88
|
+
() => createTable<{ Row: D }>(),
|
|
89
|
+
[],
|
|
90
|
+
) as unknown as Table<D>;
|
|
91
|
+
|
|
92
|
+
const displayColumns = useMemo(
|
|
93
|
+
() =>
|
|
94
|
+
[
|
|
95
|
+
(props.enableRowActions || props.enableRowEditing) &&
|
|
96
|
+
createDisplayColumn(table, {
|
|
97
|
+
Cell: ({ cell }) => (
|
|
98
|
+
<MRT_ToggleRowActionMenuButton
|
|
99
|
+
row={cell.row as any}
|
|
100
|
+
tableInstance={tableInstance}
|
|
101
|
+
/>
|
|
102
|
+
),
|
|
103
|
+
header: props.localization?.actions,
|
|
104
|
+
id: 'mrt-row-actions',
|
|
105
|
+
maxWidth: 60,
|
|
106
|
+
width: 60,
|
|
107
|
+
}),
|
|
108
|
+
(props.enableExpanded || props.enableGrouping) &&
|
|
109
|
+
createDisplayColumn(table, {
|
|
110
|
+
Cell: ({ cell }) => (
|
|
111
|
+
<MRT_ExpandButton
|
|
112
|
+
row={cell.row as any}
|
|
113
|
+
tableInstance={tableInstance}
|
|
114
|
+
/>
|
|
115
|
+
),
|
|
116
|
+
Header: () =>
|
|
117
|
+
props.enableExpandAll ? (
|
|
118
|
+
<MRT_ExpandAllButton tableInstance={tableInstance} />
|
|
119
|
+
) : null,
|
|
120
|
+
header: props.localization?.expand,
|
|
121
|
+
id: 'mrt-expand',
|
|
122
|
+
maxWidth: 40,
|
|
123
|
+
width: 40,
|
|
124
|
+
}),
|
|
125
|
+
props.enableRowSelection &&
|
|
126
|
+
createDisplayColumn(table, {
|
|
127
|
+
Cell: ({ cell }) => (
|
|
128
|
+
<MRT_SelectCheckbox
|
|
129
|
+
row={cell.row as any}
|
|
130
|
+
tableInstance={tableInstance}
|
|
131
|
+
/>
|
|
132
|
+
),
|
|
133
|
+
Header: () =>
|
|
134
|
+
props.enableSelectAll ? (
|
|
135
|
+
<MRT_SelectCheckbox selectAll tableInstance={tableInstance} />
|
|
136
|
+
) : null,
|
|
137
|
+
header: props.localization?.select,
|
|
138
|
+
id: 'mrt-select',
|
|
139
|
+
maxWidth: 40,
|
|
140
|
+
width: 40,
|
|
141
|
+
}),
|
|
142
|
+
props.enableRowNumbers &&
|
|
143
|
+
createDisplayColumn(table, {
|
|
144
|
+
Cell: ({ cell }) => cell.row.index + 1,
|
|
145
|
+
Header: () => '#',
|
|
146
|
+
header: props.localization?.rowNumbers,
|
|
147
|
+
id: 'mrt-row-numbers',
|
|
148
|
+
maxWidth: 40,
|
|
149
|
+
width: 40,
|
|
150
|
+
minWidth: 40,
|
|
151
|
+
}),
|
|
152
|
+
].filter(Boolean),
|
|
153
|
+
[
|
|
154
|
+
props.enableExpandAll,
|
|
155
|
+
props.enableExpanded,
|
|
156
|
+
props.enableRowActions,
|
|
157
|
+
props.enableRowEditing,
|
|
158
|
+
props.enableRowNumbers,
|
|
159
|
+
props.enableRowSelection,
|
|
160
|
+
props.enableSelectAll,
|
|
161
|
+
props.localization,
|
|
162
|
+
],
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const columns = useMemo(
|
|
166
|
+
() =>
|
|
167
|
+
table.createColumns([
|
|
168
|
+
...displayColumns,
|
|
169
|
+
...props.columns.map((column) =>
|
|
170
|
+
column.columns
|
|
171
|
+
? createGroup(table, column, currentFilterTypes)
|
|
172
|
+
: createDataColumn(table, column, currentFilterTypes),
|
|
173
|
+
),
|
|
174
|
+
] as any),
|
|
175
|
+
[table, props.columns, currentFilterTypes],
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
const data = useMemo(
|
|
179
|
+
() =>
|
|
180
|
+
props.isLoading && !props.data.length
|
|
181
|
+
? [...Array(10).fill(null)].map((_) =>
|
|
182
|
+
Object.assign(
|
|
183
|
+
{},
|
|
184
|
+
...getAllLeafColumnDefs(
|
|
185
|
+
props.columns as MRT_ColumnInterface[],
|
|
186
|
+
).map((c) => ({
|
|
187
|
+
[c.id]: null,
|
|
188
|
+
})),
|
|
189
|
+
),
|
|
190
|
+
)
|
|
191
|
+
: props.data,
|
|
192
|
+
[props.data, props.isLoading],
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
//@ts-ignore
|
|
196
|
+
const tableInstance: MRT_TableInstance<{}> = useTable(table, {
|
|
197
|
+
...props,
|
|
198
|
+
//@ts-ignore
|
|
199
|
+
filterTypes: defaultFilterFNs,
|
|
200
|
+
globalFilterType: currentGlobalFilterType,
|
|
201
|
+
columnFilterRowsFn: columnFilterRowsFn,
|
|
202
|
+
columns,
|
|
203
|
+
data,
|
|
204
|
+
expandRowsFn: expandRowsFn,
|
|
205
|
+
getSubRows: props.getSubRows ?? ((originalRow: D) => originalRow.subRows),
|
|
206
|
+
globalFilterRowsFn: globalFilterRowsFn,
|
|
207
|
+
groupRowsFn: groupRowsFn,
|
|
208
|
+
idPrefix,
|
|
209
|
+
onPaginationChange: (updater: any) =>
|
|
210
|
+
setPagination((old) => functionalUpdate(updater, old)),
|
|
211
|
+
paginateRowsFn: paginateRowsFn,
|
|
212
|
+
setCurrentEditingRow,
|
|
213
|
+
setCurrentFilterTypes,
|
|
214
|
+
setCurrentGlobalFilterType,
|
|
215
|
+
setIsDensePadding,
|
|
216
|
+
setIsFullScreen,
|
|
217
|
+
setShowFilters,
|
|
218
|
+
setShowSearch,
|
|
219
|
+
sortRowsFn,
|
|
220
|
+
state: {
|
|
221
|
+
...props.initialState,
|
|
222
|
+
currentEditingRow,
|
|
223
|
+
currentFilterTypes,
|
|
224
|
+
currentGlobalFilterType,
|
|
225
|
+
isDensePadding,
|
|
226
|
+
isFullScreen,
|
|
227
|
+
//@ts-ignore
|
|
228
|
+
pagination,
|
|
229
|
+
showFilters,
|
|
230
|
+
showSearch,
|
|
231
|
+
...props.state,
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
return <MRT_TablePaper tableInstance={tableInstance} />;
|
|
236
|
+
};
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import React, { FC } from 'react';
|
|
2
2
|
import { Collapse, LinearProgress } from '@mui/material';
|
|
3
|
-
import {
|
|
3
|
+
import { MRT_TableInstance } from '..';
|
|
4
4
|
|
|
5
|
-
interface Props {
|
|
5
|
+
interface Props {
|
|
6
|
+
tableInstance: MRT_TableInstance;
|
|
7
|
+
}
|
|
6
8
|
|
|
7
|
-
export const MRT_LinearProgressBar: FC<Props> = () => {
|
|
8
|
-
const {
|
|
9
|
-
|
|
9
|
+
export const MRT_LinearProgressBar: FC<Props> = ({ tableInstance }) => {
|
|
10
|
+
const {
|
|
11
|
+
options: { muiLinearProgressProps, isReloading, isLoading },
|
|
12
|
+
} = tableInstance;
|
|
10
13
|
|
|
11
14
|
const linearProgressProps =
|
|
12
15
|
muiLinearProgressProps instanceof Function
|
|
13
|
-
? muiLinearProgressProps(tableInstance)
|
|
16
|
+
? muiLinearProgressProps({ tableInstance })
|
|
14
17
|
: muiLinearProgressProps;
|
|
15
18
|
|
|
16
19
|
return (
|
|
17
|
-
<Collapse in={
|
|
20
|
+
<Collapse in={isReloading || isLoading} unmountOnExit>
|
|
18
21
|
<LinearProgress
|
|
19
22
|
aria-label="Loading"
|
|
20
23
|
aria-busy="true"
|