material-react-table 0.6.10 → 0.7.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +29 -21
  2. package/dist/MaterialReactTable.d.ts +311 -110
  3. package/dist/body/MRT_TableBody.d.ts +3 -0
  4. package/dist/body/MRT_TableBodyCell.d.ts +2 -11
  5. package/dist/body/MRT_TableBodyRow.d.ts +3 -1
  6. package/dist/body/MRT_TableDetailPanel.d.ts +2 -1
  7. package/dist/buttons/MRT_CopyButton.d.ts +2 -1
  8. package/dist/buttons/MRT_EditActionButtons.d.ts +2 -1
  9. package/dist/buttons/MRT_ExpandAllButton.d.ts +2 -0
  10. package/dist/buttons/MRT_ExpandButton.d.ts +2 -1
  11. package/dist/buttons/MRT_FullScreenToggleButton.d.ts +2 -0
  12. package/dist/buttons/MRT_ShowHideColumnsButton.d.ts +2 -0
  13. package/dist/buttons/MRT_ToggleColumnActionMenuButton.d.ts +3 -2
  14. package/dist/buttons/MRT_ToggleDensePaddingButton.d.ts +2 -0
  15. package/dist/buttons/MRT_ToggleFiltersButton.d.ts +2 -0
  16. package/dist/buttons/MRT_ToggleRowActionMenuButton.d.ts +2 -1
  17. package/dist/buttons/MRT_ToggleSearchButton.d.ts +2 -0
  18. package/dist/footer/MRT_TableFooter.d.ts +3 -0
  19. package/dist/footer/MRT_TableFooterCell.d.ts +3 -2
  20. package/dist/footer/MRT_TableFooterRow.d.ts +2 -1
  21. package/dist/head/MRT_TableHead.d.ts +3 -0
  22. package/dist/head/MRT_TableHeadCell.d.ts +4 -18
  23. package/dist/head/MRT_TableHeadRow.d.ts +2 -1
  24. package/dist/icons.d.ts +1 -1
  25. package/dist/inputs/MRT_EditCellTextField.d.ts +2 -1
  26. package/dist/inputs/MRT_FilterTextField.d.ts +3 -2
  27. package/dist/inputs/MRT_SearchTextField.d.ts +2 -0
  28. package/dist/inputs/MRT_SelectCheckbox.d.ts +2 -1
  29. package/dist/localization.d.ts +8 -2
  30. package/dist/material-react-table.cjs.development.js +2253 -2482
  31. package/dist/material-react-table.cjs.development.js.map +1 -1
  32. package/dist/material-react-table.cjs.production.min.js +1 -1
  33. package/dist/material-react-table.cjs.production.min.js.map +1 -1
  34. package/dist/material-react-table.esm.js +2254 -2483
  35. package/dist/material-react-table.esm.js.map +1 -1
  36. package/dist/menus/MRT_ColumnActionMenu.d.ts +3 -2
  37. package/dist/menus/MRT_FilterTypeMenu.d.ts +4 -3
  38. package/dist/menus/MRT_RowActionMenu.d.ts +3 -2
  39. package/dist/menus/MRT_ShowHideColumnsMenu.d.ts +2 -0
  40. package/dist/menus/MRT_ShowHideColumnsMenuItems.d.ts +2 -1
  41. package/dist/table/MRT_Table.d.ts +3 -0
  42. package/dist/table/MRT_TableContainer.d.ts +2 -0
  43. package/dist/table/MRT_TablePaper.d.ts +7 -0
  44. package/dist/table/MRT_TableRoot.d.ts +3 -0
  45. package/dist/toolbar/MRT_LinearProgressBar.d.ts +2 -0
  46. package/dist/toolbar/MRT_TablePagination.d.ts +2 -0
  47. package/dist/toolbar/MRT_ToolbarAlertBanner.d.ts +2 -0
  48. package/dist/toolbar/MRT_ToolbarBottom.d.ts +2 -0
  49. package/dist/toolbar/MRT_ToolbarInternalButtons.d.ts +2 -0
  50. package/dist/toolbar/MRT_ToolbarTop.d.ts +4 -2
  51. package/dist/utils.d.ts +12 -2
  52. package/package.json +29 -30
  53. package/src/MaterialReactTable.tsx +615 -302
  54. package/src/body/MRT_TableBody.tsx +26 -22
  55. package/src/body/MRT_TableBodyCell.tsx +78 -60
  56. package/src/body/MRT_TableBodyRow.tsx +37 -76
  57. package/src/body/MRT_TableDetailPanel.tsx +21 -17
  58. package/src/buttons/MRT_CopyButton.tsx +14 -8
  59. package/src/buttons/MRT_EditActionButtons.tsx +16 -13
  60. package/src/buttons/MRT_ExpandAllButton.tsx +24 -9
  61. package/src/buttons/MRT_ExpandButton.tsx +22 -15
  62. package/src/buttons/MRT_FullScreenToggleButton.tsx +18 -11
  63. package/src/buttons/MRT_ShowHideColumnsButton.tsx +18 -7
  64. package/src/buttons/MRT_ToggleColumnActionMenuButton.tsx +22 -11
  65. package/src/buttons/MRT_ToggleDensePaddingButton.tsx +18 -11
  66. package/src/buttons/MRT_ToggleFiltersButton.tsx +16 -9
  67. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +30 -25
  68. package/src/buttons/MRT_ToggleSearchButton.tsx +24 -12
  69. package/src/footer/MRT_TableFooter.tsx +24 -8
  70. package/src/footer/MRT_TableFooterCell.tsx +34 -26
  71. package/src/footer/MRT_TableFooterRow.tsx +21 -39
  72. package/src/head/MRT_TableHead.tsx +24 -8
  73. package/src/head/MRT_TableHeadCell.tsx +183 -141
  74. package/src/head/MRT_TableHeadRow.tsx +16 -104
  75. package/src/icons.ts +3 -3
  76. package/src/inputs/MRT_EditCellTextField.tsx +36 -24
  77. package/src/inputs/MRT_FilterTextField.tsx +52 -31
  78. package/src/inputs/MRT_SearchTextField.tsx +46 -24
  79. package/src/inputs/MRT_SelectCheckbox.tsx +42 -30
  80. package/src/localization.ts +14 -2
  81. package/src/menus/MRT_ColumnActionMenu.tsx +128 -68
  82. package/src/menus/MRT_FilterTypeMenu.tsx +23 -20
  83. package/src/menus/MRT_RowActionMenu.tsx +22 -15
  84. package/src/menus/MRT_ShowHideColumnsMenu.tsx +52 -20
  85. package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +27 -17
  86. package/src/table/MRT_Table.tsx +25 -15
  87. package/src/table/MRT_TableContainer.tsx +106 -45
  88. package/src/table/MRT_TablePaper.tsx +65 -0
  89. package/src/table/MRT_TableRoot.tsx +240 -0
  90. package/src/toolbar/MRT_LinearProgressBar.tsx +10 -7
  91. package/src/toolbar/MRT_TablePagination.tsx +33 -19
  92. package/src/toolbar/MRT_ToolbarAlertBanner.tsx +33 -20
  93. package/src/toolbar/MRT_ToolbarBottom.tsx +32 -21
  94. package/src/toolbar/MRT_ToolbarInternalButtons.tsx +35 -20
  95. package/src/toolbar/MRT_ToolbarTop.tsx +36 -29
  96. package/src/utils.ts +37 -8
  97. package/dist/head/MRT_TableHeadCellActions.d.ts +0 -5
  98. package/dist/table/MRT_TableSpacerCell.d.ts +0 -6
  99. package/dist/useMRT.d.ts +0 -28
  100. package/src/@types/faker.d.ts +0 -4
  101. package/src/@types/react-table-config.d.ts +0 -53
  102. package/src/head/MRT_TableHeadCellActions.tsx +0 -29
  103. package/src/table/MRT_TableSpacerCell.tsx +0 -20
  104. 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 { ColumnInstance } from 'react-table';
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 { onColumnHide, tableInstance } = useMRT();
18
- const isParentHeader = !!column?.columns?.length;
17
+ const {
18
+ getState,
19
+ options: { onColumnHide },
20
+ } = tableInstance;
19
21
 
20
- const allChildColumnsVisible =
21
- isParentHeader &&
22
- !!column.columns?.every((childColumn) => childColumn.isVisible);
22
+ const { columnVisibility } = getState();
23
23
 
24
- const switchChecked = column.isVisible ?? allChildColumnsVisible;
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: ColumnInstance) => {
27
- if (isParentHeader) {
28
- column?.columns?.forEach?.((childColumn) => {
29
- childColumn.toggleHidden(switchChecked);
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.toggleHidden();
35
+ column.toggleVisibility();
33
36
  }
34
- onColumnHide?.(column, tableInstance.state.hiddenColumns);
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={(isSubMenu && switchChecked) || column.disableColumnHiding}
47
- label={column.Header as string}
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
  </>
@@ -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 { useMRT } from '../useMRT';
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 { tableInstance, muiTableProps, hideTableHead, hideTableFooter } =
12
- useMRT();
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 && <MRT_TableHead />}
31
- <MRT_TableBody />
32
- {!hideTableFooter && <MRT_TableFooter />}
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, useEffect } from 'react';
2
- import { Paper, TableContainer, Box } from '@mui/material';
3
- import { useMRT } from '../useMRT';
1
+ import React, { FC, useEffect, 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
- interface Props {}
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
- export const MRT_TableContainer: FC<Props> = () => {
27
+ interface Props {
28
+ tableInstance: MRT_TableInstance;
29
+ }
30
+
31
+ export const MRT_TableContainer: FC<Props> = ({ tableInstance }) => {
11
32
  const {
12
- hideToolbarBottom,
13
- hideToolbarTop,
14
- muiTableContainerProps,
15
- tableInstance,
16
- } = useMRT();
17
- const fullScreen = tableInstance.state.fullScreen;
33
+ getCenterTableWidth,
34
+ getIsSomeColumnsPinned,
35
+ getLeftTableWidth,
36
+ getRightTableWidth,
37
+ getState,
38
+ options: {
39
+ enablePinning,
40
+ enableStickyHeader,
41
+ idPrefix,
42
+ muiTableContainerProps,
43
+ },
44
+ } = tableInstance;
18
45
 
19
- useEffect(() => {
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]);
46
+ const { isFullScreen, columnPinning } = getState();
47
+
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
+ useEffect(() => {
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
- bottom: fullScreen ? '0' : undefined,
40
- height: fullScreen ? '100%' : undefined,
41
- left: fullScreen ? '0' : undefined,
42
- m: fullScreen ? '0' : undefined,
43
- overflowY: !fullScreen ? 'hidden' : undefined,
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
- {!hideToolbarTop && <MRT_ToolbarTop />}
54
- <Box
55
- sx={{
56
- maxWidth: '100%',
57
- overflowX: 'auto',
58
- }}
59
- >
60
- <MRT_Table />
61
- </Box>
62
- {!hideToolbarBottom && <MRT_ToolbarBottom />}
88
+ {enablePinning && 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,240 @@
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
+ const [pagination, setPagination] = useState<PaginationState>({
59
+ pageIndex: props.initialState?.pagination?.pageIndex ?? 0,
60
+ pageSize: props.initialState?.pagination?.pageSize ?? 10,
61
+ pageCount: props.initialState?.pagination?.pageCount ?? -1,
62
+ });
63
+
64
+ const [currentFilterTypes, setCurrentFilterTypes] = useState<{
65
+ [key: string]: MRT_FilterType;
66
+ }>(() =>
67
+ Object.assign(
68
+ {},
69
+ ...getAllLeafColumnDefs(props.columns as MRT_ColumnInterface[]).map(
70
+ (c) => ({
71
+ [c.id as string]:
72
+ c.filter ??
73
+ props?.initialState?.columnFilters?.[c.id as any] ??
74
+ (!!c.filterSelectOptions?.length
75
+ ? MRT_FILTER_TYPE.EQUALS
76
+ : MRT_FILTER_TYPE.BEST_MATCH),
77
+ }),
78
+ ),
79
+ ),
80
+ );
81
+
82
+ const [currentGlobalFilterType, setCurrentGlobalFilterType] = useState(
83
+ props.globalFilterType ?? MRT_FILTER_TYPE.BEST_MATCH_FIRST,
84
+ );
85
+
86
+ const table = useMemo(
87
+ () => createTable<{ Row: D }>(),
88
+ [],
89
+ ) as unknown as Table<D>;
90
+
91
+ const displayColumns = useMemo(
92
+ () =>
93
+ [
94
+ (props.enableRowActions || props.enableEditing) &&
95
+ createDisplayColumn(table, {
96
+ Cell: ({ cell }) => (
97
+ <MRT_ToggleRowActionMenuButton
98
+ row={cell.row as any}
99
+ tableInstance={tableInstance}
100
+ />
101
+ ),
102
+ header: props.localization?.actions,
103
+ id: 'mrt-row-actions',
104
+ maxWidth: 60,
105
+ width: 60,
106
+ }),
107
+ (props.enableExpanded || props.enableGrouping) &&
108
+ createDisplayColumn(table, {
109
+ Cell: ({ cell }) => (
110
+ <MRT_ExpandButton
111
+ row={cell.row as any}
112
+ tableInstance={tableInstance}
113
+ />
114
+ ),
115
+ Header: () =>
116
+ props.enableExpandAll ? (
117
+ <MRT_ExpandAllButton tableInstance={tableInstance} />
118
+ ) : null,
119
+ header: props.localization?.expand,
120
+ id: 'mrt-expand',
121
+ maxWidth: 40,
122
+ width: 40,
123
+ }),
124
+ props.enableRowSelection &&
125
+ createDisplayColumn(table, {
126
+ Cell: ({ cell }) => (
127
+ <MRT_SelectCheckbox
128
+ row={cell.row as any}
129
+ tableInstance={tableInstance}
130
+ />
131
+ ),
132
+ Header: () =>
133
+ props.enableSelectAll ? (
134
+ <MRT_SelectCheckbox selectAll tableInstance={tableInstance} />
135
+ ) : null,
136
+ header: props.localization?.select,
137
+ id: 'mrt-select',
138
+ maxWidth: 40,
139
+ width: 40,
140
+ }),
141
+ props.enableRowNumbers &&
142
+ createDisplayColumn(table, {
143
+ Cell: ({ cell }) => cell.row.index + 1,
144
+ Header: () => props.localization?.rowNumber,
145
+ header: props.localization?.rowNumbers,
146
+ id: 'mrt-row-numbers',
147
+ maxWidth: 40,
148
+ width: 40,
149
+ minWidth: 40,
150
+ }),
151
+ ].filter(Boolean),
152
+ [
153
+ props.enableEditing,
154
+ props.enableExpandAll,
155
+ props.enableExpanded,
156
+ props.enableGrouping,
157
+ props.enableRowActions,
158
+ props.enableRowNumbers,
159
+ props.enableRowSelection,
160
+ props.enableSelectAll,
161
+ props.localization,
162
+ table,
163
+ ],
164
+ );
165
+
166
+ const columns = useMemo(
167
+ () =>
168
+ table.createColumns([
169
+ ...displayColumns,
170
+ ...props.columns.map((column) =>
171
+ column.columns
172
+ ? createGroup(table, column, currentFilterTypes)
173
+ : createDataColumn(table, column, currentFilterTypes),
174
+ ),
175
+ ] as any),
176
+ [table, props.columns, currentFilterTypes],
177
+ );
178
+
179
+ const data: D['Row'][] = useMemo(
180
+ () =>
181
+ props.isLoading && !props.data.length
182
+ ? [...Array(10).fill(null)].map(() =>
183
+ Object.assign(
184
+ {},
185
+ ...getAllLeafColumnDefs(
186
+ props.columns as MRT_ColumnInterface[],
187
+ ).map((c) => ({
188
+ [c.id]: null,
189
+ })),
190
+ ),
191
+ )
192
+ : props.data,
193
+ [props.data, props.isLoading],
194
+ );
195
+
196
+ //@ts-ignore
197
+ const tableInstance: MRT_TableInstance<{}> = {
198
+ ...useTable(table, {
199
+ ...props,
200
+ columnFilterRowsFn: columnFilterRowsFn,
201
+ columns,
202
+ data,
203
+ expandRowsFn: expandRowsFn,
204
+ //@ts-ignore
205
+ filterTypes: defaultFilterFNs,
206
+ getSubRows: props.getSubRows ?? ((originalRow: D) => originalRow.subRows),
207
+ globalFilterRowsFn: globalFilterRowsFn,
208
+ globalFilterType: currentGlobalFilterType,
209
+ groupRowsFn: groupRowsFn,
210
+ idPrefix,
211
+ //@ts-ignore
212
+ initialState: props.initialState,
213
+ onPaginationChange: (updater: any) =>
214
+ setPagination((old) => functionalUpdate(updater, old)),
215
+ paginateRowsFn: paginateRowsFn,
216
+ sortRowsFn,
217
+ state: {
218
+ currentEditingRow,
219
+ currentFilterTypes,
220
+ currentGlobalFilterType,
221
+ isDensePadding,
222
+ isFullScreen,
223
+ //@ts-ignore
224
+ pagination,
225
+ showFilters,
226
+ showSearch,
227
+ ...props.state,
228
+ },
229
+ }),
230
+ setCurrentEditingRow,
231
+ setCurrentFilterTypes,
232
+ setCurrentGlobalFilterType,
233
+ setIsDensePadding,
234
+ setIsFullScreen,
235
+ setShowFilters,
236
+ setShowSearch,
237
+ };
238
+
239
+ return <MRT_TablePaper tableInstance={tableInstance} />;
240
+ };
@@ -1,20 +1,23 @@
1
1
  import React, { FC } from 'react';
2
2
  import { Collapse, LinearProgress } from '@mui/material';
3
- import { useMRT } from '../useMRT';
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 { muiLinearProgressProps, isFetching, isLoading, tableInstance } =
9
- useMRT();
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={isFetching || isLoading} unmountOnExit>
20
+ <Collapse in={isReloading || isLoading} unmountOnExit>
18
21
  <LinearProgress
19
22
  aria-label="Loading"
20
23
  aria-busy="true"