material-react-table 0.1.0-beta.1 → 0.3.1

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 (96) hide show
  1. package/dist/MaterialReactTable.d.ts +60 -26
  2. package/dist/{MRT_TableBody.d.ts → body/MRT_TableBody.d.ts} +0 -0
  3. package/dist/{MRT_TableBodyCell.d.ts → body/MRT_TableBodyCell.d.ts} +1 -1
  4. package/dist/{MRT_TableBodyRow.d.ts → body/MRT_TableBodyRow.d.ts} +1 -1
  5. package/dist/{MRT_TableDetailPanel.d.ts → body/MRT_TableDetailPanel.d.ts} +1 -1
  6. package/dist/{MRT_TableExpandButton.d.ts → buttons/MRT_EditActionButtons.d.ts} +2 -2
  7. package/dist/buttons/MRT_ExpandAllButton.d.ts +5 -0
  8. package/dist/buttons/MRT_ExpandButton.d.ts +7 -0
  9. package/dist/buttons/MRT_ShowHideColumnsButton.d.ts +5 -0
  10. package/dist/buttons/MRT_ToggleColumnActionMenuButton.d.ts +7 -0
  11. package/dist/buttons/MRT_ToggleFiltersButton.d.ts +4 -0
  12. package/dist/buttons/MRT_ToggleRowActionMenuButton.d.ts +7 -0
  13. package/dist/{MRT_TableFooter.d.ts → footer/MRT_TableFooter.d.ts} +0 -0
  14. package/dist/{MRT_TableFooterCell.d.ts → footer/MRT_TableFooterCell.d.ts} +0 -0
  15. package/dist/{MRT_TableFooterRow.d.ts → footer/MRT_TableFooterRow.d.ts} +1 -1
  16. package/dist/{MRT_TableHead.d.ts → head/MRT_TableHead.d.ts} +0 -0
  17. package/dist/head/MRT_TableHeadCell.d.ts +8 -0
  18. package/dist/{MRT_TableHeadRow.d.ts → head/MRT_TableHeadRow.d.ts} +1 -1
  19. package/dist/index.d.ts +2 -0
  20. package/dist/inputs/MRT_DensePaddingSwitch.d.ts +5 -0
  21. package/dist/{MRT_TableHeadCell.d.ts → inputs/MRT_FilterTextField.d.ts} +1 -1
  22. package/dist/inputs/MRT_SearchTextField.d.ts +5 -0
  23. package/dist/inputs/MRT_SelectAllCheckbox.d.ts +2 -0
  24. package/dist/inputs/MRT_SelectCheckbox.d.ts +7 -0
  25. package/dist/material-react-table.cjs.development.js +1933 -170
  26. package/dist/material-react-table.cjs.development.js.map +1 -1
  27. package/dist/material-react-table.cjs.production.min.js +1 -1
  28. package/dist/material-react-table.cjs.production.min.js.map +1 -1
  29. package/dist/material-react-table.esm.js +1939 -176
  30. package/dist/material-react-table.esm.js.map +1 -1
  31. package/dist/menus/MRT_ColumnActionMenu.d.ts +9 -0
  32. package/dist/menus/MRT_RowActionMenu.d.ts +9 -0
  33. package/dist/menus/MRT_ShowHideColumnsMenu.d.ts +7 -0
  34. package/dist/{MRT_Table.d.ts → table/MRT_Table.d.ts} +0 -0
  35. package/dist/{MRT_TableContainer.d.ts → table/MRT_TableContainer.d.ts} +0 -0
  36. package/dist/table/MRT_TableSpacerCell.d.ts +6 -0
  37. package/dist/{MRT_TablePagination.d.ts → toolbar/MRT_TablePagination.d.ts} +0 -0
  38. package/dist/toolbar/MRT_ToolbarBottom.d.ts +5 -0
  39. package/dist/toolbar/MRT_ToolbarButtons.d.ts +5 -0
  40. package/dist/toolbar/MRT_ToolbarTop.d.ts +5 -0
  41. package/dist/useMaterialReactTable.d.ts +13 -11
  42. package/dist/utils/localization.d.ts +25 -0
  43. package/dist/utils/useMRTCalcs.d.ts +11 -0
  44. package/package.json +21 -17
  45. package/src/MaterialReactTable.tsx +145 -37
  46. package/src/body/MRT_TableBody.tsx +56 -0
  47. package/src/body/MRT_TableBodyCell.tsx +48 -0
  48. package/src/body/MRT_TableBodyRow.tsx +74 -0
  49. package/src/body/MRT_TableDetailPanel.tsx +62 -0
  50. package/src/buttons/MRT_EditActionButtons.tsx +51 -0
  51. package/src/buttons/MRT_ExpandAllButton.tsx +45 -0
  52. package/src/buttons/MRT_ExpandButton.tsx +48 -0
  53. package/src/buttons/MRT_ShowHideColumnsButton.tsx +43 -0
  54. package/src/buttons/MRT_ToggleColumnActionMenuButton.tsx +51 -0
  55. package/src/buttons/MRT_ToggleFiltersButton.tsx +23 -0
  56. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +65 -0
  57. package/src/footer/MRT_TableFooter.tsx +21 -0
  58. package/src/footer/MRT_TableFooterCell.tsx +44 -0
  59. package/src/footer/MRT_TableFooterRow.tsx +62 -0
  60. package/src/{MRT_TableHead.tsx → head/MRT_TableHead.tsx} +7 -6
  61. package/src/head/MRT_TableHeadCell.tsx +120 -0
  62. package/src/head/MRT_TableHeadRow.tsx +89 -0
  63. package/src/index.tsx +2 -0
  64. package/src/inputs/MRT_DensePaddingSwitch.tsx +21 -0
  65. package/src/inputs/MRT_FilterTextField.tsx +64 -0
  66. package/src/inputs/MRT_SearchTextField.tsx +74 -0
  67. package/src/inputs/MRT_SelectAllCheckbox.tsx +26 -0
  68. package/src/inputs/MRT_SelectCheckbox.tsx +33 -0
  69. package/src/menus/MRT_ColumnActionMenu.tsx +107 -0
  70. package/src/menus/MRT_RowActionMenu.tsx +52 -0
  71. package/src/menus/MRT_ShowHideColumnsMenu.tsx +34 -0
  72. package/src/table/MRT_Table.tsx +30 -0
  73. package/src/table/MRT_TableContainer.tsx +22 -0
  74. package/src/table/MRT_TableSpacerCell.tsx +26 -0
  75. package/src/toolbar/MRT_TablePagination.tsx +37 -0
  76. package/src/toolbar/MRT_ToolbarBottom.tsx +58 -0
  77. package/src/toolbar/MRT_ToolbarButtons.tsx +27 -0
  78. package/src/toolbar/MRT_ToolbarTop.tsx +81 -0
  79. package/src/useMaterialReactTable.tsx +71 -32
  80. package/src/utils/localization.ts +49 -0
  81. package/src/utils/useMRTCalcs.tsx +42 -0
  82. package/dist/defaults.d.ts +0 -2
  83. package/src/MRT_Table.tsx +0 -20
  84. package/src/MRT_TableBody.tsx +0 -19
  85. package/src/MRT_TableBodyCell.tsx +0 -15
  86. package/src/MRT_TableBodyRow.tsx +0 -27
  87. package/src/MRT_TableContainer.tsx +0 -16
  88. package/src/MRT_TableDetailPanel.tsx +0 -27
  89. package/src/MRT_TableExpandButton.tsx +0 -25
  90. package/src/MRT_TableFooter.tsx +0 -31
  91. package/src/MRT_TableFooterCell.tsx +0 -25
  92. package/src/MRT_TableFooterRow.tsx +0 -22
  93. package/src/MRT_TableHeadCell.tsx +0 -27
  94. package/src/MRT_TableHeadRow.tsx +0 -22
  95. package/src/MRT_TablePagination.tsx +0 -34
  96. package/src/defaults.ts +0 -11
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "version": "0.1.0-beta.1",
2
+ "version": "0.3.1",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
- "description": "A fully featured Material-UI implementation of react-table, inspired by material-table, written from the ground up in TypeScript.",
5
+ "description": "A fully featured Material-UI implementation of react-table, inspired by material-table and the mui DataGrid, written from the ground up in TypeScript.",
6
6
  "author": "Kevin Vandy",
7
7
  "keywords": [
8
8
  "react-table",
@@ -28,14 +28,15 @@
28
28
  },
29
29
  "scripts": {
30
30
  "start": "tsdx watch",
31
- "build": "tsdx build",
31
+ "build": "tsdx build && size-limit",
32
32
  "test": "tsdx test --passWithNoTests",
33
33
  "lint": "tsdx lint",
34
34
  "prepare": "tsdx build",
35
35
  "size": "size-limit",
36
36
  "analyze": "size-limit --why",
37
37
  "storybook": "start-storybook -p 6006",
38
- "build-storybook": "build-storybook"
38
+ "build-storybook": "build-storybook",
39
+ "upgrade": "ncu -u && npm i"
39
40
  },
40
41
  "husky": {
41
42
  "hooks": {
@@ -54,20 +55,23 @@
54
55
  }
55
56
  ],
56
57
  "devDependencies": {
57
- "@babel/core": "^7.16.7",
58
+ "@babel/core": "^7.16.12",
58
59
  "@emotion/react": "^11.7.1",
59
60
  "@emotion/styled": "^11.6.0",
60
- "@faker-js/faker": "^6.0.0-alpha.2",
61
- "@mui/icons-material": "^5.2.5",
62
- "@mui/material": "^5.2.8",
61
+ "@faker-js/faker": "^6.0.0-alpha.5",
62
+ "@mui/icons-material": "^5.3.1",
63
+ "@mui/material": "^5.3.1",
63
64
  "@size-limit/preset-small-lib": "^7.0.5",
64
- "@storybook/addon-a11y": "^6.4.13",
65
- "@storybook/addon-essentials": "^6.4.13",
65
+ "@storybook/addon-a11y": "^6.4.16",
66
+ "@storybook/addon-actions": "^6.4.16",
67
+ "@storybook/addon-console": "^1.2.3",
68
+ "@storybook/addon-essentials": "^6.4.16",
66
69
  "@storybook/addon-info": "^5.3.21",
67
- "@storybook/addon-links": "^6.4.13",
68
- "@storybook/addons": "^6.4.13",
69
- "@storybook/react": "^6.4.13",
70
- "@types/faker": "^5.5.9",
70
+ "@storybook/addon-links": "^6.4.16",
71
+ "@storybook/addon-storysource": "^6.4.16",
72
+ "@storybook/addons": "^6.4.16",
73
+ "@storybook/react": "^6.4.16",
74
+ "@types/faker": "^6.6.8",
71
75
  "@types/react": "^17.0.38",
72
76
  "@types/react-dom": "^17.0.11",
73
77
  "@types/react-table": "^7.7.9",
@@ -79,14 +83,14 @@
79
83
  "react-is": "^17.0.2",
80
84
  "react-table": "^7.7.0",
81
85
  "size-limit": "^7.0.5",
82
- "storybook-addon-material-ui": "^0.9.0-alpha.24",
86
+ "storybook-addon-performance": "^0.16.1",
87
+ "storybook-dark-mode": "^1.0.8",
83
88
  "tsdx": "^0.14.1",
84
89
  "tslib": "^2.3.1",
85
- "typescript": "^4.5.4"
90
+ "typescript": "^4.5.5"
86
91
  },
87
92
  "peerDependencies": {
88
93
  "@emotion/react": ">=11",
89
- "@emotion/styled": ">=11",
90
94
  "@mui/icons-material": ">=5",
91
95
  "@mui/material": ">=5",
92
96
  "react": ">=17",
@@ -1,48 +1,156 @@
1
- import React, { FC } from 'react';
1
+ import React, { ChangeEvent, MouseEvent, ReactNode } from 'react';
2
2
  import {
3
+ TableBodyProps,
4
+ TableCellProps,
3
5
  TableContainerProps,
4
6
  TableFooterProps,
5
7
  TableHeadProps,
6
8
  TablePaginationProps,
7
9
  TableProps,
10
+ TableRowProps,
11
+ TextFieldProps,
12
+ ToolbarProps,
13
+ TypographyProps,
8
14
  } from '@mui/material';
9
- import { Column } from 'react-table';
15
+ import {
16
+ Cell,
17
+ Column,
18
+ HeaderGroup,
19
+ Row,
20
+ TableInstance,
21
+ TableOptions,
22
+ UseExpandedOptions,
23
+ UseFiltersOptions,
24
+ UseGlobalFiltersOptions,
25
+ UseGroupByOptions,
26
+ UsePaginationOptions,
27
+ UseResizeColumnsOptions,
28
+ UseRowSelectOptions,
29
+ UseRowStateOptions,
30
+ UseSortByOptions,
31
+ } from 'react-table';
10
32
  import { MaterialReactTableProvider } from './useMaterialReactTable';
11
- import { MRT_TableContainer } from './MRT_TableContainer';
12
- import { defaultOptions } from './defaults';
13
-
14
- export interface MaterialReactTableOptions {
15
- enableFilters: boolean;
16
- enablePagination: boolean | 'top' | 'bottom' | 'both' | 'none';
17
- enableSearch: boolean;
18
- enableSorting: boolean;
19
- showFooter: boolean;
20
- showHead: boolean;
21
- showToolbar: boolean;
22
- }
23
-
24
- export interface MaterialReactTableOptionalProps {
25
- options?: Partial<MaterialReactTableOptions>;
26
- tableContainerProps?: TableContainerProps;
27
- tableFooterProps?: TableFooterProps;
28
- tableHeadProps?: TableHeadProps;
29
- tablePaginationProps?: TablePaginationProps;
30
- tableProps?: TableProps;
31
- renderDetailPanel?: (rowData: any) => React.ReactNode;
32
- }
33
+ import { MRT_TableContainer } from './table/MRT_TableContainer';
34
+ import { defaultLocalization, MRT_Localization } from './utils/localization';
33
35
 
34
- export interface MaterialReactTableProps extends MaterialReactTableOptionalProps {
35
- columns: Column[];
36
- data: any[];
37
- }
36
+ export type MaterialReactTableProps<D extends {} = {}> = TableOptions<D> &
37
+ UseExpandedOptions<D> &
38
+ UseFiltersOptions<D> &
39
+ UseGlobalFiltersOptions<D> &
40
+ UseGroupByOptions<D> &
41
+ UsePaginationOptions<D> &
42
+ UseResizeColumnsOptions<D> &
43
+ UseRowSelectOptions<D> &
44
+ UseRowStateOptions<D> &
45
+ UseSortByOptions<D> & {
46
+ defaultDensePadding?: boolean;
47
+ defaultShowFilters?: boolean;
48
+ disableColumnActions?: boolean;
49
+ disableColumnHiding?: boolean;
50
+ disableDensePaddingToggle?: boolean;
51
+ disableExpandAll?: boolean;
52
+ disableSelectAll?: boolean;
53
+ disableSubRowTree?: boolean;
54
+ enableColumnGrouping?: boolean;
55
+ enableColumnResizing?: boolean;
56
+ enableRowActions?: boolean;
57
+ enableRowEditing?: boolean;
58
+ enableSelection?: boolean;
59
+ hideTableFooter?: boolean;
60
+ hideTableHead?: boolean;
61
+ hideToolbarActions?: boolean;
62
+ hideToolbarBottom?: boolean;
63
+ hideToolbarTop?: boolean;
64
+ isFetching?: boolean;
65
+ isLoading?: boolean;
66
+ localization?: Partial<MRT_Localization>;
67
+ muiSearchTextFieldProps?: TextFieldProps;
68
+ muiTableBodyCellProps?:
69
+ | TableCellProps
70
+ | ((cell?: Cell<D>) => TableCellProps);
71
+ muiTableBodyProps?: TableBodyProps;
72
+ muiTableBodyRowProps?: TableRowProps | ((row: Row<D>) => TableRowProps);
73
+ muiTableContainerProps?: TableContainerProps;
74
+ muiTableDetailPanelProps?:
75
+ | TableCellProps
76
+ | ((row: Row<D>) => TableCellProps);
77
+ muiTableFooterCellProps?:
78
+ | TableCellProps
79
+ | ((column: Column<D>) => TableCellProps);
80
+ muiTableFooterProps?: TableFooterProps;
81
+ muiTableFooterRowProps?:
82
+ | TableRowProps
83
+ | ((footerGroup: HeaderGroup<D>) => TableRowProps);
84
+ muiTableHeadCellProps?:
85
+ | TableCellProps
86
+ | ((column: Column<D>) => TableCellProps);
87
+ muiTableHeadProps?: TableHeadProps;
88
+ muiTableHeadRowProps?:
89
+ | TableRowProps
90
+ | ((row: HeaderGroup<D>) => TableRowProps);
91
+ muiTablePaginationProps?:
92
+ | Partial<TablePaginationProps>
93
+ | ((tableInstance: TableInstance<D>) => Partial<TablePaginationProps>);
94
+ muiTableProps?: TableProps;
95
+ muiTableTitleProps?: TypographyProps;
96
+ muiTableToolbarBottomProps?:
97
+ | ToolbarProps
98
+ | ((tableInstance: TableInstance<D>) => ToolbarProps);
99
+ muiTableToolbarTopProps?:
100
+ | ToolbarProps
101
+ | ((tableInstance: TableInstance<D>) => ToolbarProps);
102
+ onCellClick?: (
103
+ event: MouseEvent<HTMLTableCellElement>,
104
+ cell: Cell<D>,
105
+ ) => void;
106
+ onDetailPanelClick?: (
107
+ event: MouseEvent<HTMLTableCellElement>,
108
+ row: Row<D>,
109
+ ) => void;
110
+ onGlobalFilterChange?: (event: ChangeEvent<HTMLInputElement>) => void;
111
+ onRowClick?: (event: MouseEvent<HTMLTableRowElement>, row: Row<D>) => void;
112
+ onRowEditSubmit?: (row: Row<D>) => Promise<void> | void;
113
+ onRowExpandChange?: (
114
+ event: MouseEvent<HTMLButtonElement>,
115
+ row: Row<D>,
116
+ ) => void;
117
+ onRowSelectChange?: (
118
+ event: ChangeEvent,
119
+ row: Row<D>,
120
+ selectedRows: Row<D>[],
121
+ ) => void;
122
+ positionActionsColumn?: 'first' | 'last';
123
+ positionPagination?: 'bottom' | 'top' | 'both';
124
+ positionToolbarActions?: 'bottom' | 'top';
125
+ renderRowActions?: (
126
+ row: Row<D>,
127
+ tableInstance: TableInstance<D>,
128
+ ) => ReactNode;
129
+ renderDetailPanel?: (row: Row<D>) => ReactNode;
130
+ renderRowActionMenuItems?: (
131
+ rowData: Row<D>,
132
+ tableInstance: TableInstance<D>,
133
+ closeMenu: () => void,
134
+ ) => ReactNode[];
135
+ title?: string | ReactNode;
136
+ };
38
137
 
39
- export const MaterialReactTable: FC<MaterialReactTableProps> = ({
40
- options = defaultOptions,
138
+ export default <D extends {}>({
139
+ defaultColumn = { minWidth: 50, maxWidth: 1000 },
140
+ localization = defaultLocalization,
141
+ positionActionsColumn = 'first',
142
+ positionPagination = 'bottom',
143
+ positionToolbarActions = 'top',
41
144
  ...rest
42
- }) => {
43
- return (
44
- <MaterialReactTableProvider options={options} {...rest}>
45
- <MRT_TableContainer />
46
- </MaterialReactTableProvider>
47
- );
48
- };
145
+ }: MaterialReactTableProps<D>) => (
146
+ <MaterialReactTableProvider
147
+ defaultColumn={defaultColumn}
148
+ localization={{ ...defaultLocalization, ...localization }}
149
+ positionPagination={positionPagination}
150
+ positionActionsColumn={positionActionsColumn}
151
+ positionToolbarActions={positionToolbarActions}
152
+ {...rest}
153
+ >
154
+ <MRT_TableContainer />
155
+ </MaterialReactTableProvider>
156
+ );
@@ -0,0 +1,56 @@
1
+ import React, { FC } from 'react';
2
+ import {
3
+ alpha,
4
+ CircularProgress,
5
+ styled,
6
+ TableBody as MuiTableBody,
7
+ } from '@mui/material';
8
+ import { MRT_TableBodyRow } from './MRT_TableBodyRow';
9
+ import { useMaterialReactTable } from '../useMaterialReactTable';
10
+
11
+ const TableBody = styled(MuiTableBody)({
12
+ overflowY: 'hidden',
13
+ });
14
+
15
+ const CircularProgressWrapper = styled('div')(({ theme }) => ({
16
+ backgroundColor: alpha(theme.palette.background.paper, 0.5),
17
+ display: 'grid',
18
+ height: '100%',
19
+ justifyContent: 'center',
20
+ margin: 'auto',
21
+ paddingTop: '5rem',
22
+ position: 'fixed',
23
+ width: 'calc(100% - 2rem)',
24
+ }));
25
+
26
+ interface Props {}
27
+
28
+ export const MRT_TableBody: FC<Props> = () => {
29
+ const { tableInstance, muiTableBodyProps, isLoading, manualPagination } =
30
+ useMaterialReactTable();
31
+
32
+ const rows = manualPagination ? tableInstance.rows : tableInstance.page;
33
+
34
+ const tableBodyProps = {
35
+ ...muiTableBodyProps,
36
+ ...tableInstance.getTableBodyProps(),
37
+ style: {
38
+ ...tableInstance.getTableBodyProps().style,
39
+ ...(muiTableBodyProps?.style ?? {}),
40
+ },
41
+ };
42
+
43
+ return (
44
+ <TableBody {...tableBodyProps}>
45
+ {isLoading && (
46
+ <CircularProgressWrapper>
47
+ <CircularProgress />
48
+ </CircularProgressWrapper>
49
+ )}
50
+ {rows.map((row) => {
51
+ tableInstance.prepareRow(row);
52
+ return <MRT_TableBodyRow key={row.getRowProps().key} row={row} />;
53
+ })}
54
+ </TableBody>
55
+ );
56
+ };
@@ -0,0 +1,48 @@
1
+ import React, { FC, MouseEvent } from 'react';
2
+ import { TableCell } from '@mui/material';
3
+ import { Cell } from 'react-table';
4
+ import { useMaterialReactTable } from '../useMaterialReactTable';
5
+
6
+ interface Props {
7
+ cell: Cell;
8
+ }
9
+
10
+ export const MRT_TableBodyCell: FC<Props> = ({ cell }) => {
11
+ const { onCellClick, muiTableBodyCellProps, densePadding } =
12
+ useMaterialReactTable();
13
+
14
+ const mTableCellBodyProps =
15
+ muiTableBodyCellProps instanceof Function
16
+ ? muiTableBodyCellProps(cell)
17
+ : muiTableBodyCellProps;
18
+
19
+ const tableCellProps = {
20
+ ...mTableCellBodyProps,
21
+ ...cell.getCellProps(),
22
+ style: {
23
+ padding: densePadding ? '0.5rem' : '1rem',
24
+ transition: 'all 0.2s ease-in-out',
25
+ ...cell.getCellProps().style,
26
+ ...(mTableCellBodyProps?.style ?? {}),
27
+ },
28
+ };
29
+
30
+ return (
31
+ <TableCell
32
+ onClick={(event: MouseEvent<HTMLTableCellElement>) =>
33
+ onCellClick?.(event, cell)
34
+ }
35
+ {...tableCellProps}
36
+ >
37
+ {cell.isPlaceholder ? null : cell.isAggregated ? (
38
+ cell.render('Aggregated')
39
+ ) : cell.isGrouped ? (
40
+ <span>
41
+ {cell.render('Cell')} ({cell.row.subRows.length})
42
+ </span>
43
+ ) : (
44
+ cell.render('Cell')
45
+ )}
46
+ </TableCell>
47
+ );
48
+ };
@@ -0,0 +1,74 @@
1
+ import React, { FC, MouseEvent } from 'react';
2
+ import { alpha, TableCell, TableRow, useTheme } from '@mui/material';
3
+ import { Row } from 'react-table';
4
+ import { MRT_TableBodyCell } from './MRT_TableBodyCell';
5
+ import { useMaterialReactTable } from '../useMaterialReactTable';
6
+ import { MRT_TableDetailPanel } from './MRT_TableDetailPanel';
7
+ import { MRT_ExpandButton } from '../buttons/MRT_ExpandButton';
8
+ import { MRT_SelectCheckbox } from '../inputs/MRT_SelectCheckbox';
9
+ import { MRT_ToggleRowActionMenuButton } from '../buttons/MRT_ToggleRowActionMenuButton';
10
+
11
+ interface Props {
12
+ row: Row;
13
+ }
14
+
15
+ export const MRT_TableBodyRow: FC<Props> = ({ row }) => {
16
+ const {
17
+ anyRowsCanExpand,
18
+ enableRowActions,
19
+ enableSelection,
20
+ muiTableBodyRowProps,
21
+ onRowClick,
22
+ positionActionsColumn,
23
+ renderDetailPanel,
24
+ } = useMaterialReactTable();
25
+ const theme = useTheme();
26
+
27
+ const mTableBodyRowProps =
28
+ muiTableBodyRowProps instanceof Function
29
+ ? muiTableBodyRowProps(row)
30
+ : muiTableBodyRowProps;
31
+
32
+ const tableRowProps = {
33
+ ...mTableBodyRowProps,
34
+ ...row.getRowProps(),
35
+ style: {
36
+ backgroundColor: row.isSelected
37
+ ? alpha(theme.palette.primary.light, 0.1)
38
+ : 'transparent',
39
+ ...row.getRowProps().style,
40
+ ...(mTableBodyRowProps?.style ?? {}),
41
+ },
42
+ };
43
+
44
+ return (
45
+ <>
46
+ <TableRow
47
+ hover
48
+ onClick={(event: MouseEvent<HTMLTableRowElement>) =>
49
+ onRowClick?.(event, row)
50
+ }
51
+ {...tableRowProps}
52
+ >
53
+ {enableRowActions && positionActionsColumn === 'first' && (
54
+ <TableCell>
55
+ <MRT_ToggleRowActionMenuButton row={row} />
56
+ </TableCell>
57
+ )}
58
+ {(anyRowsCanExpand || renderDetailPanel) && (
59
+ <MRT_ExpandButton row={row} />
60
+ )}
61
+ {enableSelection && <MRT_SelectCheckbox row={row} />}
62
+ {row.cells.map((cell) => (
63
+ <MRT_TableBodyCell key={cell.getCellProps().key} cell={cell} />
64
+ ))}
65
+ {enableRowActions && positionActionsColumn === 'last' && (
66
+ <TableCell>
67
+ <MRT_ToggleRowActionMenuButton row={row} />
68
+ </TableCell>
69
+ )}
70
+ </TableRow>
71
+ {renderDetailPanel && <MRT_TableDetailPanel row={row} />}
72
+ </>
73
+ );
74
+ };
@@ -0,0 +1,62 @@
1
+ import React, { FC, MouseEvent } from 'react';
2
+ import { Collapse, TableCell, TableRow } from '@mui/material';
3
+ import { Row } from 'react-table';
4
+ import { useMaterialReactTable } from '../useMaterialReactTable';
5
+
6
+ interface Props {
7
+ row: Row;
8
+ }
9
+
10
+ export const MRT_TableDetailPanel: FC<Props> = ({ row }) => {
11
+ const {
12
+ tableInstance,
13
+ renderDetailPanel,
14
+ muiTableDetailPanelProps,
15
+ muiTableBodyRowProps,
16
+ onDetailPanelClick,
17
+ } = useMaterialReactTable();
18
+
19
+ const mTableBodyRowProps =
20
+ muiTableBodyRowProps instanceof Function
21
+ ? muiTableBodyRowProps(row)
22
+ : muiTableBodyRowProps;
23
+
24
+ const tableRowProps = {
25
+ ...mTableBodyRowProps,
26
+ ...row.getToggleRowExpandedProps(),
27
+ style: {
28
+ ...row.getToggleRowExpandedProps().style,
29
+ ...(mTableBodyRowProps?.style ?? {}),
30
+ },
31
+ };
32
+
33
+ const mTableDetailPanelProps =
34
+ muiTableDetailPanelProps instanceof Function
35
+ ? muiTableDetailPanelProps(row)
36
+ : muiTableDetailPanelProps;
37
+
38
+ const tableCellProps = {
39
+ ...mTableDetailPanelProps,
40
+ style: {
41
+ borderBottom: !row.isExpanded ? 'none' : undefined,
42
+ paddingBottom: row.isExpanded ? '1rem' : 0,
43
+ paddingTop: row.isExpanded ? '1rem' : 0,
44
+ transition: 'all 0.2s ease-in-out',
45
+ ...(mTableDetailPanelProps?.style || {}),
46
+ },
47
+ };
48
+
49
+ return (
50
+ <TableRow hover {...tableRowProps}>
51
+ <TableCell
52
+ colSpan={tableInstance.visibleColumns.length + 10}
53
+ onClick={(event: MouseEvent<HTMLTableCellElement>) =>
54
+ onDetailPanelClick?.(event, row)
55
+ }
56
+ {...tableCellProps}
57
+ >
58
+ <Collapse in={row.isExpanded}>{renderDetailPanel?.(row)}</Collapse>
59
+ </TableCell>
60
+ </TableRow>
61
+ );
62
+ };
@@ -0,0 +1,51 @@
1
+ import React, { FC } from 'react';
2
+ import { IconButton, styled, Tooltip } from '@mui/material';
3
+ import SaveIcon from '@mui/icons-material/Save';
4
+ import CancelIcon from '@mui/icons-material/Cancel';
5
+ import { useMaterialReactTable } from '../useMaterialReactTable';
6
+ import { Row } from 'react-table';
7
+
8
+ const EditActionButtonWrappers = styled('div')({
9
+ display: 'flex',
10
+ gap: '0.75rem',
11
+ });
12
+
13
+ interface Props {
14
+ row: Row;
15
+ }
16
+
17
+ export const MRT_EditActionButtons: FC<Props> = ({ row }) => {
18
+ const { localization, setCurrentEditingRowId, onRowEditSubmit } =
19
+ useMaterialReactTable();
20
+
21
+ const handleCancel = () => {
22
+ setCurrentEditingRowId(null);
23
+ };
24
+
25
+ const handleSave = async () => {
26
+ setCurrentEditingRowId(null);
27
+ await onRowEditSubmit?.(row);
28
+ };
29
+
30
+ return (
31
+ <EditActionButtonWrappers>
32
+ <Tooltip arrow title={localization?.rowActionButtonCancel ?? ''}>
33
+ <IconButton
34
+ aria-label={localization?.rowActionButtonCancel}
35
+ onClick={handleCancel}
36
+ >
37
+ <CancelIcon />
38
+ </IconButton>
39
+ </Tooltip>
40
+ <Tooltip arrow title={localization?.rowActionButtonSave ?? ''}>
41
+ <IconButton
42
+ aria-label={localization?.rowActionButtonSave}
43
+ color="info"
44
+ onClick={handleSave}
45
+ >
46
+ <SaveIcon />
47
+ </IconButton>
48
+ </Tooltip>
49
+ </EditActionButtonWrappers>
50
+ );
51
+ };
@@ -0,0 +1,45 @@
1
+ import React, { FC } from 'react';
2
+ import { IconButton, TableCell } from '@mui/material';
3
+ import ArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowDown';
4
+ import { useMaterialReactTable } from '../useMaterialReactTable';
5
+
6
+ interface Props {}
7
+
8
+ export const MRT_ExpandAllButton: FC<Props> = () => {
9
+ const {
10
+ tableInstance,
11
+ localization,
12
+ anyRowsExpanded,
13
+ densePadding,
14
+ renderDetailPanel,
15
+ } = useMaterialReactTable();
16
+
17
+ return (
18
+ <TableCell
19
+ size="small"
20
+ {...tableInstance.getToggleAllRowsExpandedProps()}
21
+ style={{
22
+ padding: densePadding ? '0' : '0.5rem 0.5rem',
23
+ transition: 'all 0.2s ease-in-out',
24
+ width: `${renderDetailPanel ? 2 : tableInstance.expandedDepth + 2}rem`,
25
+ }}
26
+ >
27
+ <IconButton
28
+ aria-label={localization?.expandAllButtonTitle}
29
+ title={localization?.expandAllButtonTitle}
30
+ >
31
+ <ArrowRightIcon
32
+ fontSize="small"
33
+ style={{
34
+ transform: tableInstance.isAllRowsExpanded
35
+ ? 'rotate(-180deg)'
36
+ : anyRowsExpanded
37
+ ? 'rotate(-90deg)'
38
+ : 'rotate(0)',
39
+ transition: 'transform 0.2s',
40
+ }}
41
+ />
42
+ </IconButton>
43
+ </TableCell>
44
+ );
45
+ };
@@ -0,0 +1,48 @@
1
+ import React, { FC } from 'react';
2
+ import { IconButton, TableCell } from '@mui/material';
3
+ import { Row } from 'react-table';
4
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
5
+ import { useMaterialReactTable } from '../useMaterialReactTable';
6
+
7
+ interface Props {
8
+ row: Row;
9
+ }
10
+
11
+ export const MRT_ExpandButton: FC<Props> = ({ row }) => {
12
+ const { localization, tableInstance, densePadding, renderDetailPanel } =
13
+ useMaterialReactTable();
14
+
15
+ return (
16
+ <TableCell
17
+ size="small"
18
+ style={{
19
+ padding: densePadding ? '0' : '0.6rem 0',
20
+ paddingLeft: `${row.depth + 0.5}rem`,
21
+ transition: 'all 0.2s ease-in-out',
22
+ width: `${
23
+ renderDetailPanel ? 2 : tableInstance.expandedDepth - row.depth + 2
24
+ }rem`,
25
+ }}
26
+ >
27
+ <IconButton
28
+ disabled={!row.canExpand && !renderDetailPanel}
29
+ aria-label={localization?.expandButtonTitle}
30
+ title={localization?.expandButtonTitle}
31
+ {...row.getToggleRowExpandedProps()}
32
+ >
33
+ <ExpandMoreIcon
34
+ fontSize={row.canExpand || renderDetailPanel ? 'medium' : 'small'}
35
+ style={{
36
+ transform:
37
+ !row.canExpand && !renderDetailPanel
38
+ ? 'rotate(-90deg)'
39
+ : row.isExpanded
40
+ ? 'rotate(-180deg)'
41
+ : 'rotate(0)',
42
+ transition: 'transform 0.2s',
43
+ }}
44
+ />
45
+ </IconButton>
46
+ </TableCell>
47
+ );
48
+ };