material-react-table 0.3.1 → 0.3.2

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 (42) hide show
  1. package/README.md +32 -162
  2. package/dist/MaterialReactTable.d.ts +3 -1
  3. package/dist/body/MRT_TableBodyRow.d.ts +16 -1
  4. package/dist/head/MRT_TableHeadCell.d.ts +4 -1
  5. package/dist/inputs/MRT_EditCellTextfield.d.ts +7 -0
  6. package/dist/material-react-table.cjs.development.js +286 -157
  7. package/dist/material-react-table.cjs.development.js.map +1 -1
  8. package/dist/material-react-table.cjs.production.min.js +1 -1
  9. package/dist/material-react-table.cjs.production.min.js.map +1 -1
  10. package/dist/material-react-table.esm.js +292 -163
  11. package/dist/material-react-table.esm.js.map +1 -1
  12. package/dist/useMaterialReactTable.d.ts +3 -3
  13. package/dist/utils/localization.d.ts +4 -3
  14. package/package.json +15 -14
  15. package/src/@types/faker.d.ts +4 -0
  16. package/src/@types/react-table-config.d.ts +153 -0
  17. package/src/MaterialReactTable.tsx +10 -4
  18. package/src/body/MRT_TableBody.tsx +2 -23
  19. package/src/body/MRT_TableBodyCell.tsx +27 -6
  20. package/src/body/MRT_TableBodyRow.tsx +15 -5
  21. package/src/body/MRT_TableDetailPanel.tsx +17 -6
  22. package/src/buttons/MRT_EditActionButtons.tsx +9 -5
  23. package/src/buttons/MRT_ExpandAllButton.tsx +12 -10
  24. package/src/buttons/MRT_ExpandButton.tsx +27 -24
  25. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +2 -2
  26. package/src/footer/MRT_TableFooter.tsx +2 -2
  27. package/src/footer/MRT_TableFooterCell.tsx +22 -6
  28. package/src/footer/MRT_TableFooterRow.tsx +2 -2
  29. package/src/head/MRT_TableHead.tsx +2 -2
  30. package/src/head/MRT_TableHeadCell.tsx +24 -7
  31. package/src/head/MRT_TableHeadRow.tsx +3 -2
  32. package/src/inputs/MRT_EditCellTextfield.tsx +57 -0
  33. package/src/inputs/MRT_FilterTextField.tsx +0 -1
  34. package/src/inputs/MRT_SelectAllCheckbox.tsx +11 -11
  35. package/src/inputs/MRT_SelectCheckbox.tsx +9 -8
  36. package/src/menus/MRT_RowActionMenu.tsx +2 -2
  37. package/src/table/MRT_TableContainer.tsx +31 -3
  38. package/src/table/MRT_TableSpacerCell.tsx +3 -3
  39. package/src/toolbar/MRT_ToolbarBottom.tsx +2 -17
  40. package/src/toolbar/MRT_ToolbarTop.tsx +4 -17
  41. package/src/useMaterialReactTable.tsx +6 -7
  42. package/src/utils/localization.ts +8 -6
@@ -1,11 +1,11 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
- import { TableInstance } from 'react-table';
2
+ import { Row, TableInstance } from 'react-table';
3
3
  import { MaterialReactTableProps } from './MaterialReactTable';
4
4
  import { UseMRTCalcs } from './utils/useMRTCalcs';
5
5
  export interface UseMaterialReactTable<D extends {}> extends MaterialReactTableProps<D>, UseMRTCalcs {
6
- currentEditingRowId: string | null;
6
+ currentEditingRow: Row<D> | null;
7
7
  densePadding: boolean;
8
- setCurrentEditingRowId: (currentRowEditingId: string | null) => void;
8
+ setCurrentEditingRow: (currentRowEditingId: Row<D> | null) => void;
9
9
  setDensePadding: (densePadding: boolean) => void;
10
10
  setShowFilters: (showFilters: boolean) => void;
11
11
  showFilters: boolean;
@@ -11,13 +11,14 @@ export interface MRT_Localization {
11
11
  expandButtonTitle: string;
12
12
  filterTextFieldClearButtonTitle: string;
13
13
  filterTextFieldPlaceholder: string;
14
- rowActionMenuButtonTitle: string;
15
- rowActionsColumnTitle: string;
16
- rowActionButtonSave: string;
17
14
  rowActionButtonCancel: string;
15
+ rowActionButtonSave: string;
16
+ rowActionMenuButtonTitle: string;
18
17
  rowActionMenuItemEdit: string;
18
+ rowActionsColumnTitle: string;
19
19
  searchTextFieldClearButtonTitle: string;
20
20
  searchTextFieldPlaceholder: string;
21
+ selectAllCheckboxTitle: string;
21
22
  showHideColumnsButtonTitle: string;
22
23
  toggleDensePaddingSwitchTitle: string;
23
24
  toggleFilterButtonTitle: string;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.3.1",
2
+ "version": "0.3.2",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
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.",
@@ -13,7 +13,7 @@
13
13
  "type": "git",
14
14
  "url": "https://github.com/KevinVandy/material-react-table"
15
15
  },
16
- "homepage": "https://github.com/KevinVandy/material-react-table#readme",
16
+ "homepage": "https://www.material-react-table.com/",
17
17
  "bugs": {
18
18
  "url": "https://github.com/KevinVandy/material-react-table/issues"
19
19
  },
@@ -24,7 +24,7 @@
24
24
  "src"
25
25
  ],
26
26
  "engines": {
27
- "node": ">=14"
27
+ "node": ">=12"
28
28
  },
29
29
  "scripts": {
30
30
  "start": "tsdx watch",
@@ -55,24 +55,25 @@
55
55
  }
56
56
  ],
57
57
  "devDependencies": {
58
- "@babel/core": "^7.16.12",
58
+ "@babel/core": "^7.17.0",
59
59
  "@emotion/react": "^11.7.1",
60
60
  "@emotion/styled": "^11.6.0",
61
+ "@etchteam/storybook-addon-status": "^4.2.0",
61
62
  "@faker-js/faker": "^6.0.0-alpha.5",
62
63
  "@mui/icons-material": "^5.3.1",
63
- "@mui/material": "^5.3.1",
64
+ "@mui/material": "^5.4.0",
64
65
  "@size-limit/preset-small-lib": "^7.0.5",
65
- "@storybook/addon-a11y": "^6.4.16",
66
- "@storybook/addon-actions": "^6.4.16",
66
+ "@storybook/addon-a11y": "^6.4.18",
67
+ "@storybook/addon-actions": "^6.4.18",
67
68
  "@storybook/addon-console": "^1.2.3",
68
- "@storybook/addon-essentials": "^6.4.16",
69
+ "@storybook/addon-essentials": "^6.4.18",
69
70
  "@storybook/addon-info": "^5.3.21",
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",
71
+ "@storybook/addon-links": "^6.4.18",
72
+ "@storybook/addon-storysource": "^6.4.18",
73
+ "@storybook/addons": "^6.4.18",
74
+ "@storybook/react": "^6.4.18",
74
75
  "@types/faker": "^6.6.8",
75
- "@types/react": "^17.0.38",
76
+ "@types/react": "^17.0.39",
76
77
  "@types/react-dom": "^17.0.11",
77
78
  "@types/react-table": "^7.7.9",
78
79
  "babel-loader": "^8.2.3",
@@ -93,7 +94,7 @@
93
94
  "@emotion/react": ">=11",
94
95
  "@mui/icons-material": ">=5",
95
96
  "@mui/material": ">=5",
96
- "react": ">=17",
97
+ "react": ">=16.8",
97
98
  "react-table": ">=7"
98
99
  }
99
100
  }
@@ -0,0 +1,4 @@
1
+ declare module '@faker-js/faker' {
2
+ import faker from 'faker';
3
+ export default faker;
4
+ }
@@ -0,0 +1,153 @@
1
+ import { TableCellProps, TextFieldProps } from '@mui/material';
2
+ import { ReactNode } from 'react';
3
+ import {
4
+ UseColumnOrderInstanceProps,
5
+ UseColumnOrderState,
6
+ UseExpandedHooks,
7
+ UseExpandedInstanceProps,
8
+ UseExpandedOptions,
9
+ UseExpandedRowProps,
10
+ UseExpandedState,
11
+ UseFiltersColumnOptions,
12
+ UseFiltersColumnProps,
13
+ UseFiltersInstanceProps,
14
+ UseFiltersOptions,
15
+ UseFiltersState,
16
+ UseGlobalFiltersColumnOptions,
17
+ UseGlobalFiltersInstanceProps,
18
+ UseGlobalFiltersOptions,
19
+ UseGlobalFiltersState,
20
+ UseGroupByCellProps,
21
+ UseGroupByColumnOptions,
22
+ UseGroupByColumnProps,
23
+ UseGroupByHooks,
24
+ UseGroupByInstanceProps,
25
+ UseGroupByOptions,
26
+ UseGroupByRowProps,
27
+ UseGroupByState,
28
+ UsePaginationInstanceProps,
29
+ UsePaginationOptions,
30
+ UsePaginationState,
31
+ UseResizeColumnsColumnOptions,
32
+ UseResizeColumnsColumnProps,
33
+ UseResizeColumnsOptions,
34
+ UseResizeColumnsState,
35
+ UseRowSelectHooks,
36
+ UseRowSelectInstanceProps,
37
+ UseRowSelectOptions,
38
+ UseRowSelectRowProps,
39
+ UseRowSelectState,
40
+ UseRowStateCellProps,
41
+ UseRowStateInstanceProps,
42
+ UseRowStateOptions,
43
+ UseRowStateRowProps,
44
+ UseRowStateState,
45
+ UseSortByColumnOptions,
46
+ UseSortByColumnProps,
47
+ UseSortByHooks,
48
+ UseSortByInstanceProps,
49
+ UseSortByOptions,
50
+ UseSortByState,
51
+ } from 'react-table';
52
+
53
+ declare module 'react-table' {
54
+ export interface TableOptions<D extends Record<string, unknown>>
55
+ extends UseExpandedOptions<D>,
56
+ UseFiltersOptions<D>,
57
+ UseGlobalFiltersOptions<D>,
58
+ UseGroupByOptions<D>,
59
+ UsePaginationOptions<D>,
60
+ UseResizeColumnsOptions<D>,
61
+ UseRowSelectOptions<D>,
62
+ UseRowStateOptions<D>,
63
+ UseSortByOptions<D>,
64
+ Record<string, any> {}
65
+
66
+ export interface Hooks<
67
+ D extends Record<string, unknown> = Record<string, unknown>,
68
+ > extends UseExpandedHooks<D>,
69
+ UseGroupByHooks<D>,
70
+ UseRowSelectHooks<D>,
71
+ UseSortByHooks<D> {}
72
+
73
+ export interface TableInstance<
74
+ D extends Record<string, unknown> = Record<string, unknown>,
75
+ > extends UseColumnOrderInstanceProps<D>,
76
+ UseExpandedInstanceProps<D>,
77
+ UseFiltersInstanceProps<D>,
78
+ UseGlobalFiltersInstanceProps<D>,
79
+ UseGroupByInstanceProps<D>,
80
+ UsePaginationInstanceProps<D>,
81
+ UseRowSelectInstanceProps<D>,
82
+ UseRowStateInstanceProps<D>,
83
+ UseSortByInstanceProps<D> {}
84
+
85
+ export interface TableState<
86
+ D extends Record<string, unknown> = Record<string, unknown>,
87
+ > extends UseColumnOrderState<D>,
88
+ UseExpandedState<D>,
89
+ UseFiltersState<D>,
90
+ UseGlobalFiltersState<D>,
91
+ UseGroupByState<D>,
92
+ UsePaginationState<D>,
93
+ UseResizeColumnsState<D>,
94
+ UseRowSelectState<D>,
95
+ UseRowStateState<D>,
96
+ UseSortByState<D> {}
97
+
98
+ export interface ColumnInterface<
99
+ D extends Record<string, unknown> = Record<string, unknown>,
100
+ > extends UseFiltersColumnOptions<D>,
101
+ UseGlobalFiltersColumnOptions<D>,
102
+ UseGroupByColumnOptions<D>,
103
+ UseResizeColumnsColumnOptions<D>,
104
+ UseSortByColumnOptions<D> {
105
+ disableFilters?: boolean;
106
+ Filter?: ({ column }: { column: HeaderGroup<D> }) => ReactNode;
107
+ editable?: boolean;
108
+ Edit?: ({
109
+ cell,
110
+ onChange,
111
+ }: {
112
+ cell: Cell<D>;
113
+ onChange: (event: ChangeEvent<HTMLInputElement>) => void;
114
+ }) => ReactNode;
115
+ muiTableBodyCellProps?:
116
+ | TableCellProps
117
+ | ((cell?: Cell<D>) => TableCellProps);
118
+ muiTableHeadCellProps?:
119
+ | TableCellProps
120
+ | ((column: Column<D>) => TableCellProps);
121
+ muiTableFooterCellProps?:
122
+ | TableCellProps
123
+ | ((column: Column<D>) => TableCellProps);
124
+ muiTableBodyCellEditTextFieldProps?:
125
+ | TextFieldProps
126
+ | ((cell?: Cell<D>) => TextFieldProps);
127
+ muiTableHeadCellFilterTextFieldProps?:
128
+ | TextFieldProps
129
+ | ((column: Column<D>) => TextFieldProps);
130
+ }
131
+
132
+ export interface ColumnInstance<
133
+ D extends Record<string, unknown> = Record<string, unknown>,
134
+ > extends UseFiltersColumnProps<D>,
135
+ UseGroupByColumnProps<D>,
136
+ UseResizeColumnsColumnProps<D>,
137
+ UseSortByColumnProps<D> {}
138
+
139
+ export interface Cell<
140
+ D extends Record<string, unknown> = Record<string, unknown>,
141
+ V = any,
142
+ > extends UseGroupByCellProps<D>,
143
+ UseRowStateCellProps<D> {}
144
+
145
+ export interface Row<
146
+ D extends Record<string, unknown> = Record<string, unknown>,
147
+ > extends UseExpandedRowProps<D>,
148
+ UseGroupByRowProps<D>,
149
+ UseRowSelectRowProps<D>,
150
+ UseRowStateRowProps<D> {}
151
+ }
152
+
153
+ export module 'react-table';
@@ -65,6 +65,9 @@ export type MaterialReactTableProps<D extends {} = {}> = TableOptions<D> &
65
65
  isLoading?: boolean;
66
66
  localization?: Partial<MRT_Localization>;
67
67
  muiSearchTextFieldProps?: TextFieldProps;
68
+ muiTableBodyCellEditTextFieldProps?:
69
+ | TextFieldProps
70
+ | ((cell?: Cell<D>) => TextFieldProps);
68
71
  muiTableBodyCellProps?:
69
72
  | TableCellProps
70
73
  | ((cell?: Cell<D>) => TableCellProps);
@@ -81,6 +84,9 @@ export type MaterialReactTableProps<D extends {} = {}> = TableOptions<D> &
81
84
  muiTableFooterRowProps?:
82
85
  | TableRowProps
83
86
  | ((footerGroup: HeaderGroup<D>) => TableRowProps);
87
+ muiTableHeadCellFilterTextFieldProps?:
88
+ | TextFieldProps
89
+ | ((column: Column<D>) => TextFieldProps);
84
90
  muiTableHeadCellProps?:
85
91
  | TableCellProps
86
92
  | ((column: Column<D>) => TableCellProps);
@@ -122,16 +128,16 @@ export type MaterialReactTableProps<D extends {} = {}> = TableOptions<D> &
122
128
  positionActionsColumn?: 'first' | 'last';
123
129
  positionPagination?: 'bottom' | 'top' | 'both';
124
130
  positionToolbarActions?: 'bottom' | 'top';
125
- renderRowActions?: (
126
- row: Row<D>,
127
- tableInstance: TableInstance<D>,
128
- ) => ReactNode;
129
131
  renderDetailPanel?: (row: Row<D>) => ReactNode;
130
132
  renderRowActionMenuItems?: (
131
133
  rowData: Row<D>,
132
134
  tableInstance: TableInstance<D>,
133
135
  closeMenu: () => void,
134
136
  ) => ReactNode[];
137
+ renderRowActions?: (
138
+ row: Row<D>,
139
+ tableInstance: TableInstance<D>,
140
+ ) => ReactNode;
135
141
  title?: string | ReactNode;
136
142
  };
137
143
 
@@ -1,10 +1,5 @@
1
1
  import React, { FC } from 'react';
2
- import {
3
- alpha,
4
- CircularProgress,
5
- styled,
6
- TableBody as MuiTableBody,
7
- } from '@mui/material';
2
+ import { styled, TableBody as MuiTableBody } from '@mui/material';
8
3
  import { MRT_TableBodyRow } from './MRT_TableBodyRow';
9
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
10
5
 
@@ -12,21 +7,10 @@ const TableBody = styled(MuiTableBody)({
12
7
  overflowY: 'hidden',
13
8
  });
14
9
 
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
10
  interface Props {}
27
11
 
28
12
  export const MRT_TableBody: FC<Props> = () => {
29
- const { tableInstance, muiTableBodyProps, isLoading, manualPagination } =
13
+ const { tableInstance, muiTableBodyProps, manualPagination } =
30
14
  useMaterialReactTable();
31
15
 
32
16
  const rows = manualPagination ? tableInstance.rows : tableInstance.page;
@@ -42,11 +26,6 @@ export const MRT_TableBody: FC<Props> = () => {
42
26
 
43
27
  return (
44
28
  <TableBody {...tableBodyProps}>
45
- {isLoading && (
46
- <CircularProgressWrapper>
47
- <CircularProgress />
48
- </CircularProgressWrapper>
49
- )}
50
29
  {rows.map((row) => {
51
30
  tableInstance.prepareRow(row);
52
31
  return <MRT_TableBodyRow key={row.getRowProps().key} row={row} />;
@@ -1,40 +1,60 @@
1
1
  import React, { FC, MouseEvent } from 'react';
2
- import { TableCell } from '@mui/material';
2
+ import { styled, TableCell as MuiTableCell } from '@mui/material';
3
3
  import { Cell } from 'react-table';
4
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
+ import { MRT_EditCellTextfield } from '../inputs/MRT_EditCellTextfield';
6
+
7
+ const TableCell = styled(MuiTableCell, {
8
+ shouldForwardProp: (prop) => prop !== 'densePadding',
9
+ })<{ densePadding?: boolean }>(({ densePadding }) => ({
10
+ padding: densePadding ? '0.5rem' : '1rem',
11
+ transition: 'all 0.2s ease-in-out',
12
+ }));
5
13
 
6
14
  interface Props {
7
15
  cell: Cell;
8
16
  }
9
17
 
10
18
  export const MRT_TableBodyCell: FC<Props> = ({ cell }) => {
11
- const { onCellClick, muiTableBodyCellProps, densePadding } =
12
- useMaterialReactTable();
19
+ const {
20
+ onCellClick,
21
+ muiTableBodyCellProps,
22
+ densePadding,
23
+ currentEditingRow,
24
+ } = useMaterialReactTable();
13
25
 
14
26
  const mTableCellBodyProps =
15
27
  muiTableBodyCellProps instanceof Function
16
28
  ? muiTableBodyCellProps(cell)
17
29
  : muiTableBodyCellProps;
18
30
 
31
+ const mcTableCellBodyProps =
32
+ cell.column.muiTableBodyCellProps instanceof Function
33
+ ? cell.column.muiTableBodyCellProps(cell)
34
+ : cell.column.muiTableBodyCellProps;
35
+
19
36
  const tableCellProps = {
20
37
  ...mTableCellBodyProps,
38
+ ...mcTableCellBodyProps,
21
39
  ...cell.getCellProps(),
22
40
  style: {
23
- padding: densePadding ? '0.5rem' : '1rem',
24
- transition: 'all 0.2s ease-in-out',
25
41
  ...cell.getCellProps().style,
26
42
  ...(mTableCellBodyProps?.style ?? {}),
43
+ ...(mcTableCellBodyProps?.style ?? {}),
27
44
  },
28
45
  };
29
46
 
30
47
  return (
31
48
  <TableCell
49
+ densePadding={densePadding}
32
50
  onClick={(event: MouseEvent<HTMLTableCellElement>) =>
33
51
  onCellClick?.(event, cell)
34
52
  }
35
53
  {...tableCellProps}
36
54
  >
37
- {cell.isPlaceholder ? null : cell.isAggregated ? (
55
+ {currentEditingRow?.id === cell.row.id ? (
56
+ <MRT_EditCellTextfield cell={cell} />
57
+ ) : cell.isPlaceholder ? null : cell.isAggregated ? (
38
58
  cell.render('Aggregated')
39
59
  ) : cell.isGrouped ? (
40
60
  <span>
@@ -43,6 +63,7 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell }) => {
43
63
  ) : (
44
64
  cell.render('Cell')
45
65
  )}
66
+ {}
46
67
  </TableCell>
47
68
  );
48
69
  };
@@ -1,5 +1,10 @@
1
1
  import React, { FC, MouseEvent } from 'react';
2
- import { alpha, TableCell, TableRow, useTheme } from '@mui/material';
2
+ import {
3
+ alpha,
4
+ styled,
5
+ TableCell,
6
+ TableRow as MuiTableRow,
7
+ } from '@mui/material';
3
8
  import { Row } from 'react-table';
4
9
  import { MRT_TableBodyCell } from './MRT_TableBodyCell';
5
10
  import { useMaterialReactTable } from '../useMaterialReactTable';
@@ -8,6 +13,14 @@ import { MRT_ExpandButton } from '../buttons/MRT_ExpandButton';
8
13
  import { MRT_SelectCheckbox } from '../inputs/MRT_SelectCheckbox';
9
14
  import { MRT_ToggleRowActionMenuButton } from '../buttons/MRT_ToggleRowActionMenuButton';
10
15
 
16
+ export const TableRow = styled(MuiTableRow, {
17
+ shouldForwardProp: (prop) => prop !== 'isSelected',
18
+ })<{ isSelected?: boolean }>(({ isSelected, theme }) => ({
19
+ backgroundColor: isSelected
20
+ ? alpha(theme.palette.primary.light, 0.1)
21
+ : 'transparent',
22
+ }));
23
+
11
24
  interface Props {
12
25
  row: Row;
13
26
  }
@@ -22,7 +35,6 @@ export const MRT_TableBodyRow: FC<Props> = ({ row }) => {
22
35
  positionActionsColumn,
23
36
  renderDetailPanel,
24
37
  } = useMaterialReactTable();
25
- const theme = useTheme();
26
38
 
27
39
  const mTableBodyRowProps =
28
40
  muiTableBodyRowProps instanceof Function
@@ -33,9 +45,6 @@ export const MRT_TableBodyRow: FC<Props> = ({ row }) => {
33
45
  ...mTableBodyRowProps,
34
46
  ...row.getRowProps(),
35
47
  style: {
36
- backgroundColor: row.isSelected
37
- ? alpha(theme.palette.primary.light, 0.1)
38
- : 'transparent',
39
48
  ...row.getRowProps().style,
40
49
  ...(mTableBodyRowProps?.style ?? {}),
41
50
  },
@@ -44,6 +53,7 @@ export const MRT_TableBodyRow: FC<Props> = ({ row }) => {
44
53
  return (
45
54
  <>
46
55
  <TableRow
56
+ isSelected={row.isSelected}
47
57
  hover
48
58
  onClick={(event: MouseEvent<HTMLTableRowElement>) =>
49
59
  onRowClick?.(event, row)
@@ -1,8 +1,22 @@
1
1
  import React, { FC, MouseEvent } from 'react';
2
- import { Collapse, TableCell, TableRow } from '@mui/material';
2
+ import {
3
+ Collapse,
4
+ styled,
5
+ TableCell as MuiTableCell,
6
+ TableRow,
7
+ } from '@mui/material';
3
8
  import { Row } from 'react-table';
4
9
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
10
 
11
+ const TableCell = styled(MuiTableCell, {
12
+ shouldForwardProp: (prop) => prop !== 'isExpanded',
13
+ })<{ isExpanded?: boolean }>(({ isExpanded }) => ({
14
+ borderBottom: !isExpanded ? 'none' : undefined,
15
+ paddingBottom: isExpanded ? '1rem' : 0,
16
+ paddingTop: isExpanded ? '1rem' : 0,
17
+ transition: 'all 0.2s ease-in-out',
18
+ }));
19
+
6
20
  interface Props {
7
21
  row: Row;
8
22
  }
@@ -38,11 +52,7 @@ export const MRT_TableDetailPanel: FC<Props> = ({ row }) => {
38
52
  const tableCellProps = {
39
53
  ...mTableDetailPanelProps,
40
54
  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 || {}),
55
+ ...(mTableDetailPanelProps?.style ?? {}),
46
56
  },
47
57
  };
48
58
 
@@ -50,6 +60,7 @@ export const MRT_TableDetailPanel: FC<Props> = ({ row }) => {
50
60
  <TableRow hover {...tableRowProps}>
51
61
  <TableCell
52
62
  colSpan={tableInstance.visibleColumns.length + 10}
63
+ isExpanded={row.isExpanded}
53
64
  onClick={(event: MouseEvent<HTMLTableCellElement>) =>
54
65
  onDetailPanelClick?.(event, row)
55
66
  }
@@ -15,16 +15,20 @@ interface Props {
15
15
  }
16
16
 
17
17
  export const MRT_EditActionButtons: FC<Props> = ({ row }) => {
18
- const { localization, setCurrentEditingRowId, onRowEditSubmit } =
19
- useMaterialReactTable();
18
+ const {
19
+ localization,
20
+ setCurrentEditingRow,
21
+ onRowEditSubmit,
22
+ currentEditingRow,
23
+ } = useMaterialReactTable();
20
24
 
21
25
  const handleCancel = () => {
22
- setCurrentEditingRowId(null);
26
+ setCurrentEditingRow(null);
23
27
  };
24
28
 
25
29
  const handleSave = async () => {
26
- setCurrentEditingRowId(null);
27
- await onRowEditSubmit?.(row);
30
+ await onRowEditSubmit?.(currentEditingRow ?? row);
31
+ setCurrentEditingRow(null);
28
32
  };
29
33
 
30
34
  return (
@@ -1,8 +1,15 @@
1
1
  import React, { FC } from 'react';
2
- import { IconButton, TableCell } from '@mui/material';
3
- import ArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowDown';
2
+ import { IconButton, styled, TableCell } from '@mui/material';
3
+ import MuiArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowDown';
4
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
5
 
6
+ const ArrowRightIcon = styled(MuiArrowRightIcon, {
7
+ shouldForwardProp: (prop) => prop !== 'rotation',
8
+ })<{ rotation?: number }>(({ rotation }) => ({
9
+ transform: `rotate(${rotation}deg)`,
10
+ transition: 'transform 0.2s',
11
+ }));
12
+
6
13
  interface Props {}
7
14
 
8
15
  export const MRT_ExpandAllButton: FC<Props> = () => {
@@ -30,14 +37,9 @@ export const MRT_ExpandAllButton: FC<Props> = () => {
30
37
  >
31
38
  <ArrowRightIcon
32
39
  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
- }}
40
+ rotation={
41
+ tableInstance.isAllRowsExpanded ? -180 : anyRowsExpanded ? -90 : 0
42
+ }
41
43
  />
42
44
  </IconButton>
43
45
  </TableCell>
@@ -1,46 +1,49 @@
1
1
  import React, { FC } from 'react';
2
- import { IconButton, TableCell } from '@mui/material';
2
+ import { IconButton, styled, TableCell as MuiTableCell } from '@mui/material';
3
3
  import { Row } from 'react-table';
4
- import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
4
+ import MuiExpandMoreIcon from '@mui/icons-material/ExpandMore';
5
5
  import { useMaterialReactTable } from '../useMaterialReactTable';
6
6
 
7
+ const TableCell = styled(MuiTableCell, {
8
+ shouldForwardProp: (prop) => prop !== 'densePadding' && prop !== 'depth',
9
+ })<{ densePadding?: boolean; depth: number }>(({ densePadding, depth }) => ({
10
+ padding: densePadding ? '0' : '0.6rem',
11
+ paddingLeft: `${depth + 0.5}rem`,
12
+ transition: 'all 0.2s ease-in-out',
13
+ }));
14
+
15
+ const ExpandMoreIcon = styled(MuiExpandMoreIcon, {
16
+ shouldForwardProp: (prop) => prop !== 'rotation',
17
+ })<{ rotation?: number }>(({ rotation }) => ({
18
+ transform: `rotate(${rotation}deg)`,
19
+ transition: 'transform 0.2s',
20
+ }));
21
+
7
22
  interface Props {
8
23
  row: Row;
9
24
  }
10
25
 
11
26
  export const MRT_ExpandButton: FC<Props> = ({ row }) => {
12
- const { localization, tableInstance, densePadding, renderDetailPanel } =
27
+ const { localization, densePadding, renderDetailPanel } =
13
28
  useMaterialReactTable();
14
29
 
15
30
  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
- >
31
+ <TableCell size="small" densePadding={densePadding} depth={row.depth}>
27
32
  <IconButton
28
- disabled={!row.canExpand && !renderDetailPanel}
29
33
  aria-label={localization?.expandButtonTitle}
34
+ disabled={!row.canExpand && !renderDetailPanel}
30
35
  title={localization?.expandButtonTitle}
31
36
  {...row.getToggleRowExpandedProps()}
32
37
  >
33
38
  <ExpandMoreIcon
34
39
  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
- }}
40
+ rotation={
41
+ !row.canExpand && !renderDetailPanel
42
+ ? -90
43
+ : row.isExpanded
44
+ ? -180
45
+ : 0
46
+ }
44
47
  />
45
48
  </IconButton>
46
49
  </TableCell>
@@ -24,7 +24,7 @@ interface Props {
24
24
  export const MRT_ToggleRowActionMenuButton: FC<Props> = ({ row }) => {
25
25
  const {
26
26
  localization,
27
- currentEditingRowId,
27
+ currentEditingRow,
28
28
  renderRowActions,
29
29
  tableInstance,
30
30
  } = useMaterialReactTable();
@@ -41,7 +41,7 @@ export const MRT_ToggleRowActionMenuButton: FC<Props> = ({ row }) => {
41
41
  return <>{renderRowActions(row, tableInstance)}</>;
42
42
  }
43
43
 
44
- if (row.id === currentEditingRowId) {
44
+ if (row.id === currentEditingRow?.id) {
45
45
  return <MRT_EditActionButtons row={row} />;
46
46
  }
47
47