material-react-table 0.2.0 → 0.3.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 (67) hide show
  1. package/README.md +32 -162
  2. package/dist/MaterialReactTable.d.ts +55 -50
  3. package/dist/body/MRT_TableBodyRow.d.ts +16 -1
  4. package/dist/buttons/MRT_EditActionButtons.d.ts +7 -0
  5. package/dist/buttons/MRT_ToggleFiltersButton.d.ts +4 -0
  6. package/dist/buttons/MRT_ToggleRowActionMenuButton.d.ts +7 -0
  7. package/dist/head/MRT_TableHeadCell.d.ts +4 -1
  8. package/dist/index.d.ts +2 -0
  9. package/dist/inputs/MRT_DensePaddingSwitch.d.ts +5 -0
  10. package/dist/inputs/MRT_EditCellTextfield.d.ts +7 -0
  11. package/dist/material-react-table.cjs.development.js +1659 -440
  12. package/dist/material-react-table.cjs.development.js.map +1 -1
  13. package/dist/material-react-table.cjs.production.min.js +1 -1
  14. package/dist/material-react-table.cjs.production.min.js.map +1 -1
  15. package/dist/material-react-table.esm.js +1669 -450
  16. package/dist/material-react-table.esm.js.map +1 -1
  17. package/dist/menus/MRT_RowActionMenu.d.ts +9 -0
  18. package/dist/{footer → toolbar}/MRT_TablePagination.d.ts +0 -0
  19. package/dist/toolbar/MRT_ToolbarBottom.d.ts +5 -0
  20. package/dist/toolbar/MRT_ToolbarButtons.d.ts +5 -0
  21. package/dist/toolbar/{MRT_Toolbar.d.ts → MRT_ToolbarTop.d.ts} +1 -1
  22. package/dist/useMaterialReactTable.d.ts +10 -5
  23. package/dist/utils/localization.d.ts +23 -12
  24. package/package.json +20 -17
  25. package/src/@types/faker.d.ts +4 -0
  26. package/src/@types/react-table-config.d.ts +153 -0
  27. package/src/MaterialReactTable.tsx +125 -97
  28. package/src/body/MRT_TableBody.tsx +18 -40
  29. package/src/body/MRT_TableBodyCell.tsx +53 -9
  30. package/src/body/MRT_TableBodyRow.tsx +49 -21
  31. package/src/body/MRT_TableDetailPanel.tsx +50 -15
  32. package/src/buttons/MRT_EditActionButtons.tsx +55 -0
  33. package/src/buttons/MRT_ExpandAllButton.tsx +22 -15
  34. package/src/buttons/MRT_ExpandButton.tsx +30 -18
  35. package/src/buttons/MRT_ShowHideColumnsButton.tsx +12 -12
  36. package/src/buttons/MRT_ToggleColumnActionMenuButton.tsx +3 -1
  37. package/src/buttons/MRT_ToggleFiltersButton.tsx +23 -0
  38. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +65 -0
  39. package/src/footer/MRT_TableFooter.tsx +4 -19
  40. package/src/footer/MRT_TableFooterCell.tsx +36 -9
  41. package/src/footer/MRT_TableFooterRow.tsx +31 -13
  42. package/src/head/MRT_TableHead.tsx +8 -20
  43. package/src/head/MRT_TableHeadCell.tsx +73 -30
  44. package/src/head/MRT_TableHeadRow.tsx +46 -19
  45. package/src/index.tsx +2 -0
  46. package/src/inputs/MRT_DensePaddingSwitch.tsx +21 -0
  47. package/src/inputs/MRT_EditCellTextfield.tsx +57 -0
  48. package/src/inputs/MRT_FilterTextField.tsx +4 -0
  49. package/src/inputs/MRT_SearchTextField.tsx +17 -8
  50. package/src/inputs/MRT_SelectAllCheckbox.tsx +16 -5
  51. package/src/inputs/MRT_SelectCheckbox.tsx +12 -4
  52. package/src/menus/MRT_ColumnActionMenu.tsx +37 -12
  53. package/src/menus/MRT_RowActionMenu.tsx +52 -0
  54. package/src/menus/MRT_ShowHideColumnsMenu.tsx +2 -2
  55. package/src/table/MRT_Table.tsx +13 -4
  56. package/src/table/MRT_TableContainer.tsx +37 -5
  57. package/src/table/MRT_TableSpacerCell.tsx +17 -1
  58. package/src/toolbar/MRT_TablePagination.tsx +37 -0
  59. package/src/toolbar/MRT_ToolbarBottom.tsx +43 -0
  60. package/src/toolbar/MRT_ToolbarButtons.tsx +27 -0
  61. package/src/toolbar/MRT_ToolbarTop.tsx +68 -0
  62. package/src/useMaterialReactTable.tsx +39 -23
  63. package/src/utils/localization.ts +36 -14
  64. package/dist/utils/overrideWarnings.d.ts +0 -1
  65. package/src/footer/MRT_TablePagination.tsx +0 -39
  66. package/src/toolbar/MRT_Toolbar.tsx +0 -39
  67. package/src/utils/overrideWarnings.ts +0 -41
@@ -3,29 +3,56 @@ import { styled, TableCell as MuiTableCell } from '@mui/material';
3
3
  import { HeaderGroup } from 'react-table';
4
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
5
 
6
- const TableCell = styled(MuiTableCell)({
7
- fontWeight: 'bold',
8
- });
6
+ const TableCell = styled(MuiTableCell, {
7
+ shouldForwardProp: (prop) =>
8
+ prop !== 'densePadding' && prop !== 'enableColumnResizing',
9
+ })<{ densePadding?: boolean; enableColumnResizing?: boolean }>(
10
+ ({ densePadding, enableColumnResizing }) => ({
11
+ fontWeight: 'bold',
12
+ verticalAlign: 'text-top',
13
+ padding: densePadding ? '0.5rem' : '1rem',
14
+ transition: `all ${enableColumnResizing ? '10ms' : '0.2s'} ease-in-out`,
15
+ }),
16
+ );
9
17
 
10
18
  interface Props {
11
19
  column: HeaderGroup;
12
20
  }
13
21
 
14
22
  export const MRT_TableFooterCell: FC<Props> = ({ column }) => {
15
- const { tableInstance, OverrideTableFooterCellComponent } =
23
+ const { muiTableFooterCellProps, densePadding, enableColumnResizing } =
16
24
  useMaterialReactTable();
17
25
 
18
- if (OverrideTableFooterCellComponent) {
19
- return <>{OverrideTableFooterCellComponent(column, tableInstance)}</>;
20
- }
21
-
22
26
  const isParentHeader = (column?.columns?.length ?? 0) > 0;
23
27
 
28
+ const mTableFooterCellProps =
29
+ muiTableFooterCellProps instanceof Function
30
+ ? muiTableFooterCellProps(column)
31
+ : muiTableFooterCellProps;
32
+
33
+ const mcTableFooterCellProps =
34
+ column.muiTableFooterCellProps instanceof Function
35
+ ? column.muiTableFooterCellProps(column)
36
+ : column.muiTableFooterCellProps;
37
+
38
+ const tableCellProps = {
39
+ ...mTableFooterCellProps,
40
+ ...mcTableFooterCellProps,
41
+ ...column.getFooterProps(),
42
+ style: {
43
+ ...column.getFooterProps().style,
44
+ ...(mTableFooterCellProps?.style ?? {}),
45
+ ...(mcTableFooterCellProps?.style ?? {}),
46
+ },
47
+ };
48
+
24
49
  return (
25
50
  <TableCell
26
51
  align={isParentHeader ? 'center' : 'left'}
52
+ densePadding={densePadding}
53
+ enableColumnResizing={enableColumnResizing}
27
54
  variant="head"
28
- {...column.getFooterProps()}
55
+ {...tableCellProps}
29
56
  >
30
57
  {column.render('Footer')}
31
58
  </TableCell>
@@ -1,5 +1,5 @@
1
1
  import React, { FC } from 'react';
2
- import { TableCell, TableRow } from '@mui/material';
2
+ import { TableRow } from '@mui/material';
3
3
  import { HeaderGroup } from 'react-table';
4
4
  import { MRT_TableFooterCell } from './MRT_TableFooterCell';
5
5
  import { MRT_TableSpacerCell } from '../table/MRT_TableSpacerCell';
@@ -14,31 +14,49 @@ export const MRT_TableFooterRow: FC<Props> = ({ footerGroup }) => {
14
14
  renderDetailPanel,
15
15
  columns,
16
16
  anyRowsCanExpand,
17
- enableColumnHiding,
18
17
  enableSelection,
18
+ enableRowActions,
19
+ positionActionsColumn,
19
20
  tableInstance,
20
- OverrideTableFooterRowComponent,
21
+ muiTableFooterRowProps,
21
22
  } = useMaterialReactTable();
22
23
 
23
24
  //if no content in row, skip row
24
- if (!columns.some((c) => c.Footer)) return null;
25
+ if (!columns?.some((c) => c.Footer)) return null;
25
26
 
26
- if (OverrideTableFooterRowComponent) {
27
- return <>{OverrideTableFooterRowComponent(footerGroup, tableInstance)}</>;
28
- }
27
+ const mTableFooterRowProps =
28
+ muiTableFooterRowProps instanceof Function
29
+ ? muiTableFooterRowProps(footerGroup)
30
+ : muiTableFooterRowProps;
31
+
32
+ const tableRowProps = {
33
+ ...mTableFooterRowProps,
34
+ ...footerGroup.getFooterGroupProps(),
35
+ style: {
36
+ ...footerGroup.getFooterGroupProps().style,
37
+ ...(mTableFooterRowProps?.style ?? {}),
38
+ },
39
+ };
29
40
 
30
41
  return (
31
- <TableRow {...footerGroup.getFooterGroupProps()}>
42
+ <TableRow {...tableRowProps}>
43
+ {enableRowActions && positionActionsColumn === 'first' && (
44
+ <MRT_TableSpacerCell />
45
+ )}
32
46
  {(anyRowsCanExpand || renderDetailPanel) && (
33
- <TableCell
34
- style={{ width: `${tableInstance.expandedDepth + 0.5}rem` }}
47
+ <MRT_TableSpacerCell
48
+ width={`${
49
+ renderDetailPanel ? 2 : tableInstance.expandedDepth + 0.5
50
+ }rem`}
35
51
  />
36
52
  )}
37
53
  {enableSelection && <MRT_TableSpacerCell width="1rem" />}
38
- {footerGroup.headers.map((column, index) => (
39
- <MRT_TableFooterCell key={`${index}-${column.id}`} column={column} />
54
+ {footerGroup.headers.map((column,) => (
55
+ <MRT_TableFooterCell key={column.getFooterProps().key} column={column} />
40
56
  ))}
41
- {enableColumnHiding && <MRT_TableSpacerCell />}
57
+ {enableRowActions && positionActionsColumn === 'last' && (
58
+ <MRT_TableSpacerCell />
59
+ )}
42
60
  </TableRow>
43
61
  );
44
62
  };
@@ -1,35 +1,23 @@
1
1
  import React, { FC } from 'react';
2
- import { LinearProgress, TableHead } from '@mui/material';
2
+ import { TableHead } from '@mui/material';
3
3
  import { MRT_TableHeadRow } from './MRT_TableHeadRow';
4
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
- import { MRT_TablePagination } from '../footer/MRT_TablePagination';
6
5
 
7
6
  interface Props {}
8
7
 
9
8
  export const MRT_TableHead: FC<Props> = () => {
10
- const {
11
- OverrideTableHeadComponent,
12
- tableInstance,
13
- tableHeadProps,
14
- enablePagination,
15
- isReloading,
16
- positionPagination,
17
- } = useMaterialReactTable();
9
+ const { tableInstance, muiTableHeadProps } = useMaterialReactTable();
18
10
 
19
- if (OverrideTableHeadComponent) {
20
- return <>{OverrideTableHeadComponent(tableInstance)}</>;
21
- }
11
+ const tableHeadProps =
12
+ muiTableHeadProps instanceof Function
13
+ ? muiTableHeadProps(tableInstance)
14
+ : muiTableHeadProps;
22
15
 
23
16
  return (
24
17
  <TableHead {...tableHeadProps}>
25
- {isReloading && <LinearProgress />}
26
- {enablePagination &&
27
- ['top', 'both'].includes(positionPagination ?? '') && (
28
- <MRT_TablePagination />
29
- )}
30
- {tableInstance.headerGroups.map((headerGroup, index) => (
18
+ {tableInstance.headerGroups.map((headerGroup) => (
31
19
  <MRT_TableHeadRow
32
- key={`${index}-${headerGroup.id}`}
20
+ key={headerGroup.getHeaderGroupProps().key}
33
21
  headerGroup={headerGroup}
34
22
  />
35
23
  ))}
@@ -3,7 +3,7 @@ import {
3
3
  TableCell as MuiTableCell,
4
4
  TableSortLabel,
5
5
  styled,
6
- Divider,
6
+ Divider as MuiDivider,
7
7
  Collapse,
8
8
  } from '@mui/material';
9
9
  import { HeaderGroup } from 'react-table';
@@ -11,9 +11,17 @@ import { useMaterialReactTable } from '../useMaterialReactTable';
11
11
  import { MRT_FilterTextfield } from '../inputs/MRT_FilterTextField';
12
12
  import { MRT_ToggleColumnActionMenuButton } from '../buttons/MRT_ToggleColumnActionMenuButton';
13
13
 
14
- const TableCell = styled(MuiTableCell)({
15
- fontWeight: 'bold',
16
- });
14
+ export const StyledTableHeadCell = styled(MuiTableCell, {
15
+ shouldForwardProp: (prop) =>
16
+ prop !== 'densePadding' && prop !== 'enableColumnResizing',
17
+ })<{ densePadding?: boolean; enableColumnResizing?: boolean }>(
18
+ ({ densePadding, enableColumnResizing }) => ({
19
+ fontWeight: 'bold',
20
+ verticalAlign: 'text-top',
21
+ padding: densePadding ? '0.5rem' : '1rem',
22
+ transition: `all ${enableColumnResizing ? '10ms' : '0.2s'} ease-in-out`,
23
+ }),
24
+ );
17
25
 
18
26
  const TableCellContents = styled('div')({
19
27
  display: 'grid',
@@ -22,73 +30,108 @@ const TableCellContents = styled('div')({
22
30
  const TableCellText = styled('div')({
23
31
  width: '100%',
24
32
  display: 'flex',
25
- alignItems: 'center',
26
33
  justifyContent: 'space-between',
27
34
  });
28
35
 
36
+ const CellFlexItem = styled('span')({
37
+ display: 'flex',
38
+ flexWrap: 'nowrap',
39
+ alignItems: 'center',
40
+ });
41
+
42
+ const Divider = styled(MuiDivider)({
43
+ borderRightWidth: '2px',
44
+ borderRadius: '2px',
45
+ maxHeight: '2rem',
46
+ });
47
+
29
48
  interface Props {
30
49
  column: HeaderGroup;
31
- index: number;
32
50
  }
33
51
 
34
- export const MRT_TableHeadCell: FC<Props> = ({ column, index }) => {
52
+ export const MRT_TableHeadCell: FC<Props> = ({ column }) => {
35
53
  const {
36
- OverrideTableHeadCellComponent,
37
- enableColumnActions,
54
+ densePadding,
55
+ disableColumnActions,
56
+ disableFilters,
38
57
  enableColumnResizing,
39
- enableFiltering,
40
- showFiltersInColumnHead,
58
+ localization,
59
+ muiTableHeadCellProps,
60
+ showFilters,
41
61
  tableInstance,
42
62
  } = useMaterialReactTable();
43
63
 
44
- if (OverrideTableHeadCellComponent) {
45
- return <>{OverrideTableHeadCellComponent(column, tableInstance)}</>;
46
- }
47
-
48
64
  const isParentHeader = (column?.columns?.length ?? 0) > 0;
49
- const isLastColumn =
50
- (!isParentHeader && index === tableInstance.visibleColumns.length - 1) ||
51
- (isParentHeader && index === column.headers.length - 1);
65
+
66
+ const mTableHeadCellProps =
67
+ muiTableHeadCellProps instanceof Function
68
+ ? muiTableHeadCellProps(column)
69
+ : muiTableHeadCellProps;
70
+
71
+ const mcTableHeadCellProps =
72
+ column.muiTableHeadCellProps instanceof Function
73
+ ? column.muiTableHeadCellProps(column)
74
+ : column.muiTableHeadCellProps;
75
+
76
+ const tableCellProps = {
77
+ ...mTableHeadCellProps,
78
+ ...mcTableHeadCellProps,
79
+ ...column.getHeaderProps(),
80
+ style: {
81
+ ...column.getHeaderProps().style,
82
+ ...(mTableHeadCellProps?.style ?? {}),
83
+ ...(mcTableHeadCellProps?.style ?? {}),
84
+ },
85
+ };
52
86
 
53
87
  return (
54
- <TableCell
88
+ <StyledTableHeadCell
55
89
  align={isParentHeader ? 'center' : 'left'}
56
- {...column.getHeaderProps()}
90
+ densePadding={densePadding}
91
+ enableColumnResizing={enableColumnResizing}
92
+ {...tableCellProps}
57
93
  >
58
94
  <TableCellContents>
59
95
  <TableCellText
60
96
  style={{ justifyContent: isParentHeader ? 'center' : undefined }}
61
97
  >
62
- <span {...column.getSortByToggleProps()}>
98
+ <CellFlexItem {...column.getSortByToggleProps()}>
63
99
  {column.render('Header')}
64
100
  {!isParentHeader && column.canSort && (
65
101
  <TableSortLabel
102
+ aria-label={
103
+ column.isSorted
104
+ ? column.sortDescFirst
105
+ ? localization?.columnActionMenuItemClearSort
106
+ : localization?.columnActionMenuItemSortDesc
107
+ : localization?.columnActionMenuItemSortAsc
108
+ }
66
109
  active={column.isSorted}
67
110
  direction={column.isSortedDesc ? 'desc' : 'asc'}
111
+ style={{ margin: 0 }}
68
112
  />
69
113
  )}
70
- </span>
71
- <span style={{ display: 'flex' }}>
72
- {enableColumnActions && !isParentHeader && (
114
+ </CellFlexItem>
115
+ <CellFlexItem>
116
+ {!disableColumnActions && !isParentHeader && (
73
117
  <MRT_ToggleColumnActionMenuButton column={column} />
74
118
  )}
75
- {enableColumnResizing && !isLastColumn && (
119
+ {enableColumnResizing && !isParentHeader && (
76
120
  <Divider
77
121
  flexItem
78
122
  orientation="vertical"
79
- style={{ borderRightWidth: '2px', borderRadius: '2px' }}
80
123
  onDoubleClick={() => tableInstance.resetResizing()}
81
124
  {...column.getResizerProps()}
82
125
  />
83
126
  )}
84
- </span>
127
+ </CellFlexItem>
85
128
  </TableCellText>
86
- {enableFiltering && column.canFilter && (
87
- <Collapse in={showFiltersInColumnHead}>
129
+ {!disableFilters && column.canFilter && (
130
+ <Collapse in={showFilters}>
88
131
  <MRT_FilterTextfield column={column} />
89
132
  </Collapse>
90
133
  )}
91
134
  </TableCellContents>
92
- </TableCell>
135
+ </StyledTableHeadCell>
93
136
  );
94
137
  };
@@ -1,11 +1,10 @@
1
1
  import React, { FC, useMemo } from 'react';
2
2
  import { TableRow } from '@mui/material';
3
3
  import { HeaderGroup } from 'react-table';
4
- import { MRT_TableHeadCell } from './MRT_TableHeadCell';
4
+ import { MRT_TableHeadCell, StyledTableHeadCell } from './MRT_TableHeadCell';
5
5
  import { useMaterialReactTable } from '../useMaterialReactTable';
6
6
  import { MRT_SelectAllCheckbox } from '../inputs/MRT_SelectAllCheckbox';
7
7
  import { MRT_ExpandAllButton } from '../buttons/MRT_ExpandAllButton';
8
- import { MRT_ShowHideColumnsButton } from '../buttons/MRT_ShowHideColumnsButton';
9
8
  import { MRT_TableSpacerCell } from '../table/MRT_TableSpacerCell';
10
9
 
11
10
  interface Props {
@@ -14,32 +13,56 @@ interface Props {
14
13
 
15
14
  export const MRT_TableHeadRow: FC<Props> = ({ headerGroup }) => {
16
15
  const {
17
- OverrideTableHeadRowComponent,
18
16
  anyRowsCanExpand,
19
- enableColumnHiding,
20
- enableExpandAll,
17
+ densePadding,
18
+ disableExpandAll,
19
+ enableRowActions,
21
20
  enableSelection,
21
+ localization,
22
+ muiTableHeadRowProps,
23
+ positionActionsColumn,
22
24
  renderDetailPanel,
23
25
  tableInstance,
24
26
  } = useMaterialReactTable();
25
27
 
26
- if (OverrideTableHeadRowComponent) {
27
- return <>{OverrideTableHeadRowComponent(headerGroup, tableInstance)}</>;
28
- }
29
-
30
28
  const isParentHeader = useMemo(
31
29
  () => headerGroup.headers.some((h) => (h.columns?.length ?? 0) > 0),
32
30
  [headerGroup.headers],
33
31
  );
34
32
 
33
+ const mTableHeadRowProps =
34
+ muiTableHeadRowProps instanceof Function
35
+ ? muiTableHeadRowProps(headerGroup)
36
+ : muiTableHeadRowProps;
37
+
38
+ const tableRowProps = {
39
+ ...mTableHeadRowProps,
40
+ ...headerGroup.getHeaderGroupProps(),
41
+ style: {
42
+ ...headerGroup.getHeaderGroupProps().style,
43
+ ...(mTableHeadRowProps?.style ?? {}),
44
+ },
45
+ };
46
+
35
47
  return (
36
- <TableRow {...headerGroup.getHeaderGroupProps()}>
48
+ <TableRow {...tableRowProps}>
49
+ {enableRowActions &&
50
+ positionActionsColumn === 'first' &&
51
+ (isParentHeader ? (
52
+ <MRT_TableSpacerCell />
53
+ ) : (
54
+ <StyledTableHeadCell>
55
+ {localization?.actionsHeadColumnTitle}
56
+ </StyledTableHeadCell>
57
+ ))}
37
58
  {anyRowsCanExpand || renderDetailPanel ? (
38
- enableExpandAll && !isParentHeader ? (
59
+ !disableExpandAll && !isParentHeader ? (
39
60
  <MRT_ExpandAllButton />
40
61
  ) : (
41
62
  <MRT_TableSpacerCell
42
- width={`${tableInstance.expandedDepth + 0.5}rem`}
63
+ width={`${
64
+ renderDetailPanel ? 2 : tableInstance.expandedDepth + 0.5
65
+ }rem`}
43
66
  />
44
67
  )
45
68
  ) : null}
@@ -50,14 +73,18 @@ export const MRT_TableHeadRow: FC<Props> = ({ headerGroup }) => {
50
73
  <MRT_TableSpacerCell width="1rem" />
51
74
  )
52
75
  ) : null}
53
- {headerGroup.headers.map((column, index) => (
54
- <MRT_TableHeadCell
55
- key={`${index}-${column.id}`}
56
- column={column}
57
- index={index}
58
- />
76
+ {headerGroup.headers.map((column: HeaderGroup) => (
77
+ <MRT_TableHeadCell key={column.getHeaderProps().key} column={column} />
59
78
  ))}
60
- {enableColumnHiding && !isParentHeader && <MRT_ShowHideColumnsButton />}
79
+ {enableRowActions &&
80
+ positionActionsColumn === 'last' &&
81
+ (isParentHeader ? (
82
+ <MRT_TableSpacerCell />
83
+ ) : (
84
+ <StyledTableHeadCell densePadding={densePadding}>
85
+ {localization?.actionsHeadColumnTitle}
86
+ </StyledTableHeadCell>
87
+ ))}
61
88
  </TableRow>
62
89
  );
63
90
  };
package/src/index.tsx CHANGED
@@ -1 +1,3 @@
1
+ import MaterialReactTable from './MaterialReactTable';
2
+ export default MaterialReactTable;
1
3
  export * from './MaterialReactTable';
@@ -0,0 +1,21 @@
1
+ import React, { FC } from 'react';
2
+ import { Switch, Tooltip } from '@mui/material';
3
+ import { useMaterialReactTable } from '../useMaterialReactTable';
4
+
5
+ interface Props {}
6
+
7
+ export const MRT_DensePaddingSwitch: FC<Props> = () => {
8
+ const { densePadding, setDensePadding, localization } =
9
+ useMaterialReactTable();
10
+
11
+ return (
12
+ <Tooltip arrow title={localization?.toggleDensePaddingSwitchTitle ?? ''}>
13
+ <Switch
14
+ color="default"
15
+ checked={densePadding}
16
+ size="small"
17
+ onChange={() => setDensePadding(!densePadding)}
18
+ />
19
+ </Tooltip>
20
+ );
21
+ };
@@ -0,0 +1,57 @@
1
+ import { TextField } from '@mui/material';
2
+ import React, { ChangeEvent, FC } from 'react';
3
+ import { Cell } from 'react-table';
4
+ import { useMaterialReactTable } from '../useMaterialReactTable';
5
+
6
+ interface Props {
7
+ cell: Cell;
8
+ }
9
+
10
+ export const MRT_EditCellTextfield: FC<Props> = ({ cell }) => {
11
+ const {
12
+ localization,
13
+ currentEditingRow,
14
+ setCurrentEditingRow,
15
+ muiTableBodyCellEditTextFieldProps,
16
+ } = useMaterialReactTable();
17
+
18
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
19
+ if (currentEditingRow) {
20
+ setCurrentEditingRow({
21
+ ...currentEditingRow,
22
+ values: { ...cell.row.values, [cell.column.id]: event.target.value },
23
+ });
24
+ }
25
+ };
26
+
27
+ const textFieldProps = {
28
+ ...muiTableBodyCellEditTextFieldProps,
29
+ ...cell.column.muiTableBodyCellEditTextFieldProps,
30
+ style: {
31
+ //@ts-ignore
32
+ ...muiTableBodyCellEditTextFieldProps?.style,
33
+ //@ts-ignore
34
+ ...cell.column.muiTableBodyCellEditTextFieldProps?.style,
35
+ },
36
+ };
37
+
38
+ if (cell.column.editable && cell.column.Edit) {
39
+ return (
40
+ <>
41
+ {cell.column.Edit({ ...textFieldProps, cell, onChange: handleChange })}
42
+ </>
43
+ );
44
+ }
45
+
46
+ return (
47
+ <TextField
48
+ margin="dense"
49
+ placeholder={localization?.filterTextFieldPlaceholder}
50
+ onChange={handleChange}
51
+ onClick={(e) => e.stopPropagation()}
52
+ value={currentEditingRow?.values?.[cell.column.id]}
53
+ variant="standard"
54
+ {...textFieldProps}
55
+ />
56
+ );
57
+ };
@@ -23,6 +23,10 @@ export const MRT_FilterTextfield: FC<Props> = ({ column }) => {
23
23
  column.setFilter(undefined);
24
24
  };
25
25
 
26
+ if (column.Filter) {
27
+ return <>{column.Filter({ column })}</>;
28
+ }
29
+
26
30
  return (
27
31
  <TextField
28
32
  margin="dense"
@@ -17,13 +17,22 @@ const TextField = styled(MuiTextField)({
17
17
  interface Props {}
18
18
 
19
19
  export const MRT_SearchTextField: FC<Props> = () => {
20
- const { tableInstance, tableSearchTextfieldProps, localization } = useMaterialReactTable();
20
+ const {
21
+ tableInstance,
22
+ muiSearchTextFieldProps,
23
+ localization,
24
+ onGlobalFilterChange,
25
+ } = useMaterialReactTable();
21
26
 
22
27
  const [searchValue, setSearchValue] = useState('');
23
28
 
24
- const handleChange = useAsyncDebounce((value) => {
25
- tableInstance.setGlobalFilter(value ?? undefined);
26
- }, 200);
29
+ const handleChange = useAsyncDebounce(
30
+ (event: ChangeEvent<HTMLInputElement>) => {
31
+ tableInstance.setGlobalFilter(event.target.value ?? undefined);
32
+ onGlobalFilterChange?.(event);
33
+ },
34
+ 200,
35
+ );
27
36
 
28
37
  const handleClear = () => {
29
38
  setSearchValue('');
@@ -33,9 +42,9 @@ export const MRT_SearchTextField: FC<Props> = () => {
33
42
  return (
34
43
  <TextField
35
44
  placeholder={localization?.searchTextFieldPlaceholder}
36
- onChange={(e: ChangeEvent<HTMLInputElement>) => {
37
- setSearchValue(e.target.value);
38
- handleChange(e.target.value);
45
+ onChange={(event: ChangeEvent<HTMLInputElement>) => {
46
+ setSearchValue(event.target.value);
47
+ handleChange(event);
39
48
  }}
40
49
  value={searchValue ?? ''}
41
50
  variant="standard"
@@ -59,7 +68,7 @@ export const MRT_SearchTextField: FC<Props> = () => {
59
68
  </InputAdornment>
60
69
  ),
61
70
  }}
62
- {...tableSearchTextfieldProps}
71
+ {...muiSearchTextFieldProps}
63
72
  />
64
73
  );
65
74
  };
@@ -1,14 +1,25 @@
1
1
  import React from 'react';
2
- import { Checkbox, TableCell } from '@mui/material';
2
+ import { Checkbox, TableCell as MuiTableCell, styled } from '@mui/material';
3
3
  import { useMaterialReactTable } from '../useMaterialReactTable';
4
4
 
5
+ const TableCell = styled(MuiTableCell, {
6
+ shouldForwardProp: (prop) => prop !== 'densePadding',
7
+ })<{ densePadding?: boolean }>(({ densePadding }) => ({
8
+ padding: densePadding ? '0' : '0.6rem',
9
+ transition: 'all 0.2s ease-in-out',
10
+ }));
11
+
5
12
  export const MRT_SelectAllCheckbox = () => {
6
- const { tableInstance, enableSelectAll } = useMaterialReactTable();
13
+ const { tableInstance, disableSelectAll, densePadding, localization } =
14
+ useMaterialReactTable();
7
15
 
8
16
  return (
9
- <TableCell style={{ width: '2rem', padding: '0.5rem' }} variant="head">
10
- {enableSelectAll ? (
11
- <Checkbox aria-label='' {...tableInstance.getToggleAllPageRowsSelectedProps()} />
17
+ <TableCell densePadding={densePadding} variant="head">
18
+ {!disableSelectAll ? (
19
+ <Checkbox
20
+ aria-label={localization?.selectAllCheckboxTitle}
21
+ {...tableInstance.getToggleAllPageRowsSelectedProps()}
22
+ />
12
23
  ) : null}
13
24
  </TableCell>
14
25
  );
@@ -1,22 +1,30 @@
1
1
  import React, { ChangeEvent, FC } from 'react';
2
- import { Checkbox, TableCell } from '@mui/material';
2
+ import { Checkbox, TableCell as MuiTableCell, styled } from '@mui/material';
3
3
  import { Row } from 'react-table';
4
4
  import { useMaterialReactTable } from '../useMaterialReactTable';
5
5
 
6
+ const TableCell = styled(MuiTableCell, {
7
+ shouldForwardProp: (prop) => prop !== 'densePadding',
8
+ })<{ densePadding?: boolean }>(({ densePadding }) => ({
9
+ padding: densePadding ? '0' : '0.6rem',
10
+ transition: 'all 0.2s ease-in-out',
11
+ }));
12
+
6
13
  interface Props {
7
14
  row: Row;
8
15
  }
9
16
 
10
17
  export const MRT_SelectCheckbox: FC<Props> = ({ row }) => {
11
- const { tableInstance, onRowSelectChange } = useMaterialReactTable();
18
+ const { tableInstance, onRowSelectChange, densePadding } =
19
+ useMaterialReactTable();
12
20
 
13
21
  const onSelectChange = (event: ChangeEvent) => {
14
22
  row.getToggleRowSelectedProps()?.onChange?.(event);
15
- onRowSelectChange?.(event, row.state, tableInstance.selectedFlatRows);
23
+ onRowSelectChange?.(event, row, tableInstance.selectedFlatRows);
16
24
  };
17
25
 
18
26
  return (
19
- <TableCell style={{ width: '2rem', padding: '0.5rem' }}>
27
+ <TableCell densePadding={densePadding}>
20
28
  <Checkbox
21
29
  {...row.getToggleRowSelectedProps()}
22
30
  onChange={onSelectChange}