material-react-table 0.7.1 → 0.7.4

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.
package/dist/utils.d.ts CHANGED
@@ -7,6 +7,6 @@ export declare const createGroup: <D extends Record<string, any> = {}>(table: Ta
7
7
  export declare const createDataColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: MRT_ColumnDef<D>, currentFilterTypes: {
8
8
  [key: string]: MRT_FilterType;
9
9
  }) => ColumnDef<D>;
10
- export declare const createDisplayColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: Pick<MRT_ColumnDef<D>, "footer" | "columns" | "id" | "accessorKey" | "accessorFn" | "cell" | "meta" | "enableHiding" | "defaultCanHide" | "defaultIsVisible" | "enablePinning" | "defaultCanPin" | "filterType" | "enableAllFilters" | "enableColumnFilter" | "enableGlobalFilter" | "defaultCanFilter" | "defaultCanColumnFilter" | "defaultCanGlobalFilter" | "sortType" | "sortDescFirst" | "enableSorting" | "enableMultiSort" | "defaultCanSort" | "invertSorting" | "sortUndefined" | "aggregationType" | "aggregateValue" | "aggregatedCell" | "enableGrouping" | "defaultCanGroup" | "enableResizing" | "defaultCanResize" | "width" | "minWidth" | "maxWidth" | "Edit" | "Filter" | "Footer" | "Header" | "Cell" | "enableClickToCopy" | "enableColumnActions" | "enableEditing" | "enabledFilterTypes" | "filter" | "filterSelectOptions" | "muiTableBodyCellCopyButtonProps" | "muiTableBodyCellEditTextFieldProps" | "muiTableBodyCellProps" | "muiTableFooterCellProps" | "muiTableHeadCellColumnActionsButtonProps" | "muiTableHeadCellFilterTextFieldProps" | "muiTableHeadCellProps" | "onCellEditBlur" | "onCellEditChange" | "onColumnFilterValueChange"> & {
10
+ export declare const createDisplayColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: Pick<MRT_ColumnDef<D>, "footer" | "columns" | "id" | "accessorKey" | "accessorFn" | "cell" | "meta" | "enableHiding" | "defaultCanHide" | "defaultIsVisible" | "enablePinning" | "defaultCanPin" | "filterFn" | "enableAllFilters" | "enableColumnFilter" | "enableGlobalFilter" | "defaultCanFilter" | "defaultCanColumnFilter" | "defaultCanGlobalFilter" | "sortingFn" | "sortDescFirst" | "enableSorting" | "enableMultiSort" | "defaultCanSort" | "invertSorting" | "sortUndefined" | "aggregationFn" | "aggregateValue" | "aggregatedCell" | "enableGrouping" | "defaultCanGroup" | "enableResizing" | "defaultCanResize" | "width" | "minWidth" | "maxWidth" | "Edit" | "Filter" | "Footer" | "Header" | "Cell" | "enableClickToCopy" | "enableColumnActions" | "enableEditing" | "enabledColumnFilterTypes" | "filter" | "filterSelectOptions" | "muiTableBodyCellCopyButtonProps" | "muiTableBodyCellEditTextFieldProps" | "muiTableBodyCellProps" | "muiTableFooterCellProps" | "muiTableHeadCellColumnActionsButtonProps" | "muiTableHeadCellFilterTextFieldProps" | "muiTableHeadCellProps" | "onCellEditBlur" | "onCellEditChange" | "onColumnFilterValueChange"> & {
11
11
  header?: string | undefined;
12
12
  }) => ColumnDef<D>;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.1",
2
+ "version": "0.7.4",
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 X DataGrid, written from the ground up in TypeScript.",
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "scripts": {
30
30
  "analyze": "size-limit --why",
31
- "build": "tsdx build && size-limit && rm -rf material-react-table-docs/node_modules/material-react-table/dist && cp -r dist material-react-table-docs/node_modules/material-react-table/ && cp -r src material-react-table-docs/node_modules/material-react-table/ && cp -r package.json material-react-table-docs/node_modules/material-react-table/package.json",
31
+ "build": "tsdx build && size-limit && rm -rf material-react-table-docs/node_modules/material-react-table/dist && cp -r dist material-react-table-docs/node_modules/material-react-table/ && cp -r src material-react-table-docs/node_modules/material-react-table/ && cp -r package.json material-react-table-docs/node_modules/material-react-table/package.json",
32
32
  "build-storybook": "build-storybook",
33
33
  "format": "prettier -w .",
34
34
  "lint": "eslint .",
@@ -59,7 +59,7 @@
59
59
  "@emotion/react": "^11.9.0",
60
60
  "@emotion/styled": "^11.8.1",
61
61
  "@etchteam/storybook-addon-status": "^4.2.1",
62
- "@faker-js/faker": "^6.1.2",
62
+ "@faker-js/faker": "^6.2.0",
63
63
  "@mui/icons-material": "^5.6.2",
64
64
  "@mui/material": "^5.6.2",
65
65
  "@size-limit/preset-small-lib": "^7.0.8",
@@ -75,7 +75,7 @@
75
75
  "@types/react": "^17.0.41",
76
76
  "@types/react-dom": "^17.0.14",
77
77
  "babel-loader": "^8.2.5",
78
- "eslint": "^8.13.0",
78
+ "eslint": "^8.14.0",
79
79
  "eslint-plugin-react-hooks": "^4.4.0",
80
80
  "husky": "^7.0.4",
81
81
  "prettier": "^2.6.2",
@@ -86,7 +86,7 @@
86
86
  "storybook-addon-paddings": "^4.3.0",
87
87
  "storybook-dark-mode": "^1.0.9",
88
88
  "tsdx": "^0.14.1",
89
- "tslib": "^2.3.1",
89
+ "tslib": "^2.4.0",
90
90
  "typescript": "^4.6.3"
91
91
  },
92
92
  "peerDependencies": {
@@ -97,7 +97,7 @@
97
97
  "react": ">=16.8"
98
98
  },
99
99
  "dependencies": {
100
- "@tanstack/react-table": "^8.0.0-alpha.44",
100
+ "@tanstack/react-table": "^8.0.0-alpha.45",
101
101
  "match-sorter": "^6.3.1"
102
102
  }
103
103
  }
@@ -99,6 +99,7 @@ export type MRT_TableInstance<D extends Record<string, any> = {}> = Omit<
99
99
  filterTypes: { [key in MRT_FILTER_TYPE]: any };
100
100
  localization: MRT_Localization;
101
101
  };
102
+ setCurrentEditingCell: Dispatch<SetStateAction<MRT_Cell<D> | null>>;
102
103
  setCurrentEditingRow: Dispatch<SetStateAction<MRT_Row<D> | null>>;
103
104
  setCurrentFilterTypes: Dispatch<
104
105
  SetStateAction<{
@@ -116,6 +117,7 @@ export type MRT_TableState<D extends Record<string, any> = {}> = Omit<
116
117
  TableState,
117
118
  'pagination'
118
119
  > & {
120
+ currentEditingCell: MRT_Cell<D> | null;
119
121
  currentEditingRow: MRT_Row<D> | null;
120
122
  currentFilterTypes: Record<string, string | Function>;
121
123
  currentGlobalFilterType: Record<string, string | Function>;
@@ -261,9 +263,11 @@ export type MRT_ColumnDef<D extends Record<string, any> = {}> = Omit<
261
263
  tableInstance: MRT_TableInstance<D>;
262
264
  }) => void;
263
265
  onColumnFilterValueChange?: ({
266
+ column,
264
267
  event,
265
268
  filterValue,
266
269
  }: {
270
+ column: MRT_Column<D>;
267
271
  event: ChangeEvent<HTMLInputElement>;
268
272
  filterValue: any;
269
273
  }) => void;
@@ -322,6 +326,7 @@ export type MRT_FilterType = MRT_FILTER_TYPE | Function;
322
326
 
323
327
  export type MaterialReactTableProps<D extends Record<string, any> = {}> =
324
328
  MRT_TableOptions<D> & {
329
+ editingMode?: 'table' | 'row' | 'cell';
325
330
  enableClickToCopy?: boolean;
326
331
  enableColumnActions?: boolean;
327
332
  enableDensePaddingToggle?: boolean;
@@ -329,6 +334,7 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
329
334
  enableExpandAll?: boolean;
330
335
  enableFullScreenToggle?: boolean;
331
336
  enablePagination?: boolean;
337
+ enablePersistentState?: boolean;
332
338
  enableRowActions?: boolean;
333
339
  enableRowNumbers?: boolean;
334
340
  enableSelectAll?: boolean;
@@ -557,6 +563,33 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
557
563
  tableInstance: MRT_TableInstance<D>;
558
564
  event: MouseEvent<HTMLTableCellElement>;
559
565
  }) => void;
566
+ onCellEditBlur?: ({
567
+ cell,
568
+ event,
569
+ tableInstance,
570
+ }: {
571
+ event: FocusEvent<HTMLInputElement>;
572
+ cell: MRT_Cell<D>;
573
+ tableInstance: MRT_TableInstance<D>;
574
+ }) => void;
575
+ onCellEditChange?: ({
576
+ cell,
577
+ event,
578
+ tableInstance,
579
+ }: {
580
+ event: ChangeEvent<HTMLInputElement>;
581
+ cell: MRT_Cell<D>;
582
+ tableInstance: MRT_TableInstance<D>;
583
+ }) => void;
584
+ onColumnFilterValueChange?: ({
585
+ column,
586
+ event,
587
+ filterValue,
588
+ }: {
589
+ column: MRT_Column<D>;
590
+ event: ChangeEvent<HTMLInputElement>;
591
+ filterValue: any;
592
+ }) => void;
560
593
  onDetailPanelClick?: ({
561
594
  event,
562
595
  row,
@@ -662,6 +695,7 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
662
695
  showGlobalFilter: boolean;
663
696
  tableInstance: MRT_TableInstance<D>;
664
697
  }) => void;
698
+ persistentStateMode?: 'localStorage' | 'sessionStorage';
665
699
  positionActionsColumn?: 'first' | 'last';
666
700
  positionPagination?: 'bottom' | 'top' | 'both';
667
701
  positionToolbarActions?: 'bottom' | 'top';
@@ -723,8 +757,11 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
723
757
 
724
758
  export default <D extends Record<string, any> = {}>({
725
759
  autoResetExpanded = false,
760
+ columnResizeMode = 'onEnd',
761
+ editingMode = 'row',
726
762
  enableColumnActions = true,
727
763
  enableColumnFilters = true,
764
+ enableColumnResizing = false,
728
765
  enableDensePaddingToggle = true,
729
766
  enableExpandAll = true,
730
767
  enableFilters = true,
@@ -743,6 +780,7 @@ export default <D extends Record<string, any> = {}>({
743
780
  enableToolbarTop = true,
744
781
  icons,
745
782
  localization,
783
+ persistentStateMode = 'sessionStorage',
746
784
  positionActionsColumn = 'first',
747
785
  positionPagination = 'bottom',
748
786
  positionToolbarActions = 'top',
@@ -751,7 +789,10 @@ export default <D extends Record<string, any> = {}>({
751
789
  }: MaterialReactTableProps<D>) => (
752
790
  <MRT_TableRoot
753
791
  autoResetExpanded={autoResetExpanded}
792
+ columnResizeMode={columnResizeMode}
793
+ editingMode={editingMode}
754
794
  enableColumnActions={enableColumnActions}
795
+ enableColumnResizing={enableColumnResizing}
755
796
  enableColumnFilters={enableColumnFilters}
756
797
  enableDensePaddingToggle={enableDensePaddingToggle}
757
798
  enableExpandAll={enableExpandAll}
@@ -771,6 +812,7 @@ export default <D extends Record<string, any> = {}>({
771
812
  enableToolbarTop={enableToolbarTop}
772
813
  icons={{ ...MRT_Default_Icons, ...icons }}
773
814
  localization={{ ...MRT_DefaultLocalization_EN, ...localization }}
815
+ persistentStateMode={persistentStateMode}
774
816
  positionActionsColumn={positionActionsColumn}
775
817
  positionPagination={positionPagination}
776
818
  positionToolbarActions={positionToolbarActions}
@@ -14,17 +14,20 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell, tableInstance }) => {
14
14
  getIsSomeColumnsPinned,
15
15
  getState,
16
16
  options: {
17
+ editingMode,
17
18
  enableClickToCopy,
18
- enablePinning,
19
19
  enableEditing,
20
+ enablePinning,
21
+ idPrefix,
20
22
  isLoading,
21
23
  muiTableBodyCellProps,
22
24
  muiTableBodyCellSkeletonProps,
23
25
  onCellClick,
24
26
  },
27
+ setCurrentEditingCell,
25
28
  } = tableInstance;
26
29
 
27
- const { currentEditingRow, isDensePadding } = getState();
30
+ const { currentEditingCell, currentEditingRow, isDensePadding } = getState();
28
31
 
29
32
  const { column, row } = cell;
30
33
 
@@ -53,13 +56,45 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell, tableInstance }) => {
53
56
  [column.columnDefType, column.getWidth()],
54
57
  );
55
58
 
59
+ const isEditable =
60
+ (enableEditing || column.enableEditing) && column.enableEditing !== false;
61
+
62
+ const isEditing =
63
+ isEditable &&
64
+ (editingMode === 'table' ||
65
+ currentEditingRow?.id === row.id ||
66
+ currentEditingCell?.id === cell.id);
67
+
68
+ const handleDoubleClick = (_event: MouseEvent<HTMLTableCellElement>) => {
69
+ if (
70
+ (enableEditing || column.enableEditing) &&
71
+ column.enableEditing !== false &&
72
+ editingMode === 'cell'
73
+ ) {
74
+ setCurrentEditingCell(cell);
75
+ setTimeout(() => {
76
+ const textField = document.getElementById(
77
+ `mrt-${idPrefix}-edit-cell-text-field-${cell.id}`,
78
+ ) as HTMLInputElement;
79
+ if (textField) {
80
+ textField.focus();
81
+ textField.select();
82
+ }
83
+ }, 200);
84
+ }
85
+ };
86
+
56
87
  return (
57
88
  <TableCell
58
89
  onClick={(event: MouseEvent<HTMLTableCellElement>) =>
59
90
  onCellClick?.({ event, cell, tableInstance })
60
91
  }
92
+ onDoubleClick={handleDoubleClick}
61
93
  {...tableCellProps}
62
94
  sx={{
95
+ cursor: isEditable && editingMode === 'cell' ? 'pointer' : 'text',
96
+ maxWidth: `min(${column.getWidth()}px, fit-content)`,
97
+ minWidth: `max(${column.getWidth()}px, ${column.minWidth}px)`,
63
98
  p: isDensePadding
64
99
  ? column.columnDefType === 'display'
65
100
  ? '0 0.5rem'
@@ -76,6 +111,7 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell, tableInstance }) => {
76
111
  isDensePadding || (enablePinning && getIsSomeColumnsPinned())
77
112
  ? 'nowrap'
78
113
  : 'normal',
114
+ width: column.getWidth(),
79
115
  //@ts-ignore
80
116
  ...tableCellProps?.sx,
81
117
  }}
@@ -94,9 +130,7 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell, tableInstance }) => {
94
130
  column.id !==
95
131
  row.groupingColumnId) ? null : cell.getIsAggregated() ? (
96
132
  cell.renderAggregatedCell()
97
- ) : enableEditing &&
98
- column.enableEditing !== false &&
99
- currentEditingRow?.id === row.id ? (
133
+ ) : isEditing ? (
100
134
  <MRT_EditCellTextField cell={cell} tableInstance={tableInstance} />
101
135
  ) : (enableClickToCopy || column.enableClickToCopy) &&
102
136
  column.enableClickToCopy !== false ? (
@@ -56,6 +56,7 @@ export const MRT_CopyButton: FC<Props> = ({
56
56
  backgroundColor: 'transparent',
57
57
  border: 'none',
58
58
  color: 'inherit',
59
+ cursor: 'copy',
59
60
  fontFamily: 'inherit',
60
61
  fontSize: 'inherit',
61
62
  letterSpacing: 'inherit',
@@ -46,8 +46,11 @@ export const MRT_TableFooterCell: FC<Props> = ({ footer, tableInstance }) => {
46
46
  0.05,
47
47
  )},${alpha(theme.palette.common.white, 0.05)})`,
48
48
  fontWeight: 'bold',
49
+ maxWidth: `min(${column.getWidth()}px, ${column.maxWidth}px)`,
50
+ minWidth: `max(${column.getWidth()}px, ${column.minWidth}px)`,
49
51
  p: isDensePadding ? '0.5rem' : '1rem',
50
52
  transition: `all ${enableColumnResizing ? '10ms' : '0.2s'} ease-in-out`,
53
+ width: column.getWidth(),
51
54
  verticalAlign: 'text-top',
52
55
  //@ts-ignore
53
56
  ...tableCellProps?.sx,
@@ -97,10 +97,10 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
97
97
  theme.palette.common.white,
98
98
  0.05,
99
99
  )},${alpha(theme.palette.common.white, 0.05)})`,
100
- boxShadow: `3px 0 6px ${alpha(theme.palette.common.black, 0.1)}`,
101
100
  fontWeight: 'bold',
102
101
  height: '100%',
103
- minWidth: `max(${header.getWidth()}, 100px)`,
102
+ maxWidth: `min(${column.getWidth()}px, ${column.maxWidth}px)`,
103
+ minWidth: `max(${column.getWidth()}px, ${column.minWidth}px)`,
104
104
  p: isDensePadding
105
105
  ? column.columnDefType === 'display'
106
106
  ? '0 0.5rem'
@@ -115,9 +115,11 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
115
115
  ? '0.75rem'
116
116
  : '1.25rem',
117
117
  pb: column.columnDefType === 'display' ? 0 : undefined,
118
+ overflow: 'visible',
118
119
  transition: `all ${enableColumnResizing ? 0 : '0.2s'} ease-in-out`,
119
120
  verticalAlign: 'text-top',
120
121
  width: header.getWidth(),
122
+ zIndex: column.getIsResizing() ? 2 : 1,
121
123
  //@ts-ignore
122
124
  ...tableCellProps?.sx,
123
125
  })}
@@ -148,7 +150,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
148
150
  }}
149
151
  >
150
152
  {headerElement}
151
- {column.columnDefType !== 'group' && column.getCanSort() && (
153
+ {column.columnDefType === 'data' && column.getCanSort() && (
152
154
  <Tooltip arrow placement="top" title={sortTooltip}>
153
155
  <TableSortLabel
154
156
  aria-label={sortTooltip}
@@ -161,7 +163,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
161
163
  />
162
164
  </Tooltip>
163
165
  )}
164
- {column.columnDefType !== 'group' &&
166
+ {column.columnDefType === 'data' &&
165
167
  enableColumnFilters &&
166
168
  !!column.getCanColumnFilter() && (
167
169
  <Tooltip arrow placement="top" title={filterTooltip}>
@@ -192,59 +194,56 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
192
194
  </Tooltip>
193
195
  )}
194
196
  </Box>
195
- <Box
196
- sx={{ alignItems: 'center', display: 'flex', flexWrap: 'nowrap' }}
197
- >
198
- {(enableColumnActions || column.enableColumnActions) &&
199
- column.enableColumnActions !== false &&
200
- column.columnDefType !== 'group' && (
201
- <MRT_ToggleColumnActionMenuButton
202
- header={header}
203
- tableInstance={tableInstance}
204
- />
205
- )}
206
- {enableColumnResizing && column.columnDefType !== 'group' && (
207
- <Divider
208
- flexItem
209
- orientation="vertical"
210
- onDoubleClick={() => header.resetSize()}
211
- sx={(theme: Theme) => ({
212
- borderRightWidth: '2px',
213
- borderRadius: '2px',
214
- maxHeight: '2rem',
215
- cursor: 'col-resize',
216
- userSelect: 'none',
217
- touchAction: 'none',
218
- '&:active': {
219
- backgroundColor: theme.palette.secondary.dark,
220
- opacity: 1,
221
- },
222
- })}
223
- {...(header.getResizerProps((props: ColumnResizerProps) => ({
224
- ...props,
225
- style: {
226
- transform: column.getIsResizing()
227
- ? `translateX(${
228
- getState().columnSizingInfo.deltaOffset
229
- }px)`
230
- : '',
231
- },
232
- })) as any)}
197
+ {(enableColumnActions || column.enableColumnActions) &&
198
+ column.enableColumnActions !== false &&
199
+ column.columnDefType !== 'group' && (
200
+ <MRT_ToggleColumnActionMenuButton
201
+ header={header}
202
+ tableInstance={tableInstance}
233
203
  />
234
204
  )}
235
- </Box>
205
+ {column.getCanResize() && (
206
+ <Divider
207
+ flexItem
208
+ orientation="vertical"
209
+ onDoubleClick={() => header.resetSize()}
210
+ sx={(theme: Theme) => ({
211
+ borderRadius: '2px',
212
+ borderRightWidth: '2px',
213
+ cursor: 'col-resize',
214
+ height:
215
+ showFilters && column.columnDefType === 'data'
216
+ ? '4rem'
217
+ : '2rem',
218
+ opacity: 0.8,
219
+ position: 'absolute',
220
+ right: '1px',
221
+ touchAction: 'none',
222
+ transition: 'all 0.2s ease-in-out',
223
+ userSelect: 'none',
224
+ zIndex: 2000,
225
+ '&:active': {
226
+ backgroundColor: theme.palette.info.main,
227
+ opacity: 1,
228
+ },
229
+ })}
230
+ {...(header.getResizerProps((props: ColumnResizerProps) => ({
231
+ ...props,
232
+ style: {
233
+ transform: column.getIsResizing()
234
+ ? `translateX(${getState().columnSizingInfo.deltaOffset}px)`
235
+ : '',
236
+ },
237
+ })) as any)}
238
+ />
239
+ )}
236
240
  </Box>
237
241
  )}
238
- {column.columnDefType === 'data' &&
239
- enableColumnFilters &&
240
- column.getCanColumnFilter() && (
241
- <Collapse in={showFilters}>
242
- <MRT_FilterTextField
243
- header={header}
244
- tableInstance={tableInstance}
245
- />
246
- </Collapse>
247
- )}
242
+ {column.columnDefType === 'data' && column.getCanColumnFilter() && (
243
+ <Collapse in={showFilters}>
244
+ <MRT_FilterTextField header={header} tableInstance={tableInstance} />
245
+ </Collapse>
246
+ )}
248
247
  </TableCell>
249
248
  );
250
249
  };
@@ -1,5 +1,5 @@
1
- import React, { FC } from 'react';
2
- import { TableRow } from '@mui/material';
1
+ import React, { CSSProperties, FC } from 'react';
2
+ import { alpha, TableRow } from '@mui/material';
3
3
  import { MRT_TableHeadCell } from './MRT_TableHeadCell';
4
4
  import type { MRT_Header, MRT_HeaderGroup, MRT_TableInstance } from '..';
5
5
 
@@ -24,7 +24,16 @@ export const MRT_TableHeadRow: FC<Props> = ({ headerGroup, tableInstance }) => {
24
24
  };
25
25
 
26
26
  return (
27
- <TableRow {...tableRowProps}>
27
+ <TableRow
28
+ {...tableRowProps}
29
+ sx={(theme) =>
30
+ ({
31
+ boxShadow: `4px 0 8px ${alpha(theme.palette.common.black, 0.1)}`,
32
+ //@ts-ignore
33
+ ...tableRowProps?.sx,
34
+ } as CSSProperties)
35
+ }
36
+ >
28
37
  {headerGroup.headers.map((header: MRT_Header, index) => (
29
38
  <MRT_TableHeadCell
30
39
  header={header}
package/src/icons.ts CHANGED
@@ -19,6 +19,7 @@ import FullscreenIcon from '@mui/icons-material/Fullscreen';
19
19
  import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
20
20
  import MoreVertIcon from '@mui/icons-material/MoreVert';
21
21
  import PushPinIcon from '@mui/icons-material/PushPin';
22
+ import RestartAltIcon from '@mui/icons-material/RestartAlt';
22
23
  import SaveIcon from '@mui/icons-material/Save';
23
24
  import SearchIcon from '@mui/icons-material/Search';
24
25
  import SearchOffIcon from '@mui/icons-material/SearchOff';
@@ -48,6 +49,7 @@ export interface MRT_Icons {
48
49
  MoreHorizIcon: any;
49
50
  MoreVertIcon: any;
50
51
  PushPinIcon: any;
52
+ RestartAltIcon: any;
51
53
  SaveIcon: any;
52
54
  SearchIcon: any;
53
55
  SearchOffIcon: any;
@@ -78,6 +80,7 @@ export const MRT_Default_Icons: MRT_Icons = {
78
80
  MoreHorizIcon,
79
81
  MoreVertIcon,
80
82
  PushPinIcon,
83
+ RestartAltIcon,
81
84
  SaveIcon,
82
85
  SearchIcon,
83
86
  SearchOffIcon,
@@ -16,7 +16,14 @@ interface Props {
16
16
  export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
17
17
  const {
18
18
  getState,
19
- options: { enableEditing, muiTableBodyCellEditTextFieldProps },
19
+ options: {
20
+ idPrefix,
21
+ enableEditing,
22
+ muiTableBodyCellEditTextFieldProps,
23
+ onCellEditBlur,
24
+ onCellEditChange,
25
+ },
26
+ setCurrentEditingCell,
20
27
  setCurrentEditingRow,
21
28
  } = tableInstance;
22
29
 
@@ -27,6 +34,7 @@ export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
27
34
  const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
28
35
  setValue(event.target.value);
29
36
  column.onCellEditChange?.({ event, cell, tableInstance });
37
+ onCellEditChange?.({ event, cell, tableInstance });
30
38
  };
31
39
 
32
40
  const handleBlur = (event: FocusEvent<HTMLInputElement>) => {
@@ -34,7 +42,9 @@ export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
34
42
  row.values[column.id] = value;
35
43
  setCurrentEditingRow({ ...getState().currentEditingRow } as MRT_Row);
36
44
  }
45
+ setCurrentEditingCell(null);
37
46
  column.onCellEditBlur?.({ event, cell, tableInstance });
47
+ onCellEditBlur?.({ event, cell, tableInstance });
38
48
  };
39
49
 
40
50
  const mTableBodyCellEditTextFieldProps =
@@ -58,6 +68,7 @@ export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
58
68
 
59
69
  return (
60
70
  <TextField
71
+ id={`mrt-${idPrefix}-edit-cell-text-field-${cell.id}`}
61
72
  margin="dense"
62
73
  onBlur={handleBlur}
63
74
  onChange={handleChange}
@@ -32,6 +32,7 @@ export interface MRT_Localization {
32
32
  hideColumn: string;
33
33
  pinToLeft: string;
34
34
  pinToRight: string;
35
+ resetColumnSize: string;
35
36
  rowActions: string;
36
37
  rowNumber: string;
37
38
  rowNumbers: string;
@@ -92,6 +93,7 @@ export const MRT_DefaultLocalization_EN: MRT_Localization = {
92
93
  hideColumn: 'Hide {column} column',
93
94
  pinToLeft: 'Pin to left',
94
95
  pinToRight: 'Pin to right',
96
+ resetColumnSize: 'Reset column size',
95
97
  rowActions: 'Row Actions',
96
98
  rowNumber: '#',
97
99
  rowNumbers: 'Row Numbers',
@@ -35,9 +35,10 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
35
35
  setColumnOrder,
36
36
  options: {
37
37
  enableColumnFilters,
38
- enablePinning,
38
+ enableColumnResizing,
39
39
  enableGrouping,
40
40
  enableHiding,
41
+ enablePinning,
41
42
  enableSorting,
42
43
  icons: {
43
44
  ArrowRightIcon,
@@ -48,6 +49,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
48
49
  FilterListOffIcon,
49
50
  PushPinIcon,
50
51
  SortIcon,
52
+ RestartAltIcon,
51
53
  VisibilityOffIcon,
52
54
  },
53
55
  idPrefix,
@@ -58,7 +60,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
58
60
 
59
61
  const { column } = header;
60
62
 
61
- const { isDensePadding, columnVisibility } = getState();
63
+ const { columnSizing, columnVisibility, isDensePadding } = getState();
62
64
 
63
65
  const [filterMenuAnchorEl, setFilterMenuAnchorEl] =
64
66
  useState<null | HTMLElement>(null);
@@ -81,6 +83,11 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
81
83
  setAnchorEl(null);
82
84
  };
83
85
 
86
+ const handleResetColumnSize = () => {
87
+ column.resetSize();
88
+ setAnchorEl(null);
89
+ };
90
+
84
91
  const handleHideColumn = () => {
85
92
  column.toggleVisibility(false);
86
93
  setAnchorEl(null);
@@ -263,7 +270,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
263
270
  {enablePinning &&
264
271
  column.getCanPin() && [
265
272
  <MenuItem
266
- disabled={column.getIsPinned() === 'left'}
273
+ disabled={column.getIsPinned() === 'left' || !column.getCanPin()}
267
274
  key={0}
268
275
  onClick={() => handlePinColumn('left')}
269
276
  sx={commonMenuItemStyles}
@@ -276,7 +283,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
276
283
  </Box>
277
284
  </MenuItem>,
278
285
  <MenuItem
279
- disabled={column.getIsPinned() === 'right'}
286
+ disabled={column.getIsPinned() === 'right' || !column.getCanPin()}
280
287
  key={0}
281
288
  onClick={() => handlePinColumn('right')}
282
289
  sx={commonMenuItemStyles}
@@ -303,6 +310,21 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
303
310
  </Box>
304
311
  </MenuItem>,
305
312
  ]}
313
+ {enableColumnResizing && [
314
+ <MenuItem
315
+ disabled={!column.getCanResize() || !columnSizing[column.id]}
316
+ key={0}
317
+ onClick={handleResetColumnSize}
318
+ sx={commonMenuItemStyles}
319
+ >
320
+ <Box sx={commonListItemStyles}>
321
+ <ListItemIcon>
322
+ <RestartAltIcon />
323
+ </ListItemIcon>
324
+ {localization.resetColumnSize}
325
+ </Box>
326
+ </MenuItem>,
327
+ ]}
306
328
  {enableHiding && [
307
329
  <MenuItem
308
330
  disabled={column.enableHiding === false}
@@ -1,6 +1,5 @@
1
- import React, { FC, useEffect, useState } from 'react';
1
+ import React, { CSSProperties, FC, useEffect, useState } from 'react';
2
2
  import { alpha, Box, TableContainer, Theme } from '@mui/material';
3
- import { SystemStyleObject } from '@mui/material/node_modules/@mui/system';
4
3
  import { MRT_TableInstance } from '..';
5
4
  import { MRT_Table } from './MRT_Table';
6
5
 
@@ -12,10 +11,10 @@ const commonBoxStyles = ({
12
11
  pinned?: 'left' | 'right';
13
12
  theme: Theme;
14
13
  visible?: boolean;
15
- }): SystemStyleObject<Theme> => ({
14
+ }): CSSProperties => ({
16
15
  display: 'grid',
17
16
  minWidth: visible ? '200px' : 0,
18
- overflowX: 'auto',
17
+ overflowX: pinned ? 'scroll' : 'auto',
19
18
  boxShadow:
20
19
  pinned === 'left'
21
20
  ? `0 1px 12px ${alpha(theme.palette.common.black, 0.5)}`