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.
Files changed (104) hide show
  1. package/README.md +27 -17
  2. package/dist/MaterialReactTable.d.ts +306 -109
  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 +4 -2
  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 +7 -2
  30. package/dist/material-react-table.cjs.development.js +2209 -2483
  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 +2210 -2484
  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 +28 -29
  53. package/src/MaterialReactTable.tsx +594 -300
  54. package/src/body/MRT_TableBody.tsx +26 -22
  55. package/src/body/MRT_TableBodyCell.tsx +75 -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 +16 -9
  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 +27 -22
  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 +184 -142
  74. package/src/head/MRT_TableHeadRow.tsx +16 -104
  75. package/src/icons.ts +3 -3
  76. package/src/inputs/MRT_EditCellTextField.tsx +23 -24
  77. package/src/inputs/MRT_FilterTextField.tsx +53 -32
  78. package/src/inputs/MRT_SearchTextField.tsx +46 -24
  79. package/src/inputs/MRT_SelectCheckbox.tsx +42 -30
  80. package/src/localization.ts +13 -2
  81. package/src/menus/MRT_ColumnActionMenu.tsx +129 -69
  82. package/src/menus/MRT_FilterTypeMenu.tsx +28 -22
  83. package/src/menus/MRT_RowActionMenu.tsx +21 -14
  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 +236 -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 +34 -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, 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
- 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
+ enableColumnPinning,
40
+ enableStickyHeader,
41
+ idPrefix,
42
+ muiTableContainerProps,
43
+ },
44
+ } = tableInstance;
45
+
46
+ const { isFullScreen, columnPinning } = getState();
18
47
 
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]);
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
- 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
+ {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 { 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"