material-react-table 1.7.4 → 1.8.0

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 (44) hide show
  1. package/README.md +5 -13
  2. package/dist/cjs/index.js +79 -37
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/types/MaterialReactTable.d.ts +16 -8
  5. package/dist/cjs/types/body/MRT_TableBody.d.ts +3 -4
  6. package/dist/cjs/types/body/MRT_TableBodyCell.d.ts +2 -3
  7. package/dist/cjs/types/body/MRT_TableBodyRow.d.ts +4 -5
  8. package/dist/cjs/types/body/MRT_TableDetailPanel.d.ts +2 -3
  9. package/dist/cjs/types/footer/MRT_TableFooter.d.ts +2 -3
  10. package/dist/cjs/types/footer/MRT_TableFooterRow.d.ts +2 -3
  11. package/dist/cjs/types/head/MRT_TableHead.d.ts +2 -3
  12. package/dist/cjs/types/head/MRT_TableHeadRow.d.ts +2 -3
  13. package/dist/cjs/types/table/MRT_TableRoot.d.ts +1 -272
  14. package/dist/esm/material-react-table.esm.js +77 -38
  15. package/dist/esm/material-react-table.esm.js.map +1 -1
  16. package/dist/esm/types/MaterialReactTable.d.ts +16 -8
  17. package/dist/esm/types/body/MRT_TableBody.d.ts +3 -4
  18. package/dist/esm/types/body/MRT_TableBodyCell.d.ts +2 -3
  19. package/dist/esm/types/body/MRT_TableBodyRow.d.ts +4 -5
  20. package/dist/esm/types/body/MRT_TableDetailPanel.d.ts +2 -3
  21. package/dist/esm/types/footer/MRT_TableFooter.d.ts +2 -3
  22. package/dist/esm/types/footer/MRT_TableFooterRow.d.ts +2 -3
  23. package/dist/esm/types/head/MRT_TableHead.d.ts +2 -3
  24. package/dist/esm/types/head/MRT_TableHeadRow.d.ts +2 -3
  25. package/dist/esm/types/table/MRT_TableRoot.d.ts +1 -272
  26. package/dist/index.d.ts +16 -7
  27. package/package.json +2 -2
  28. package/src/MaterialReactTable.tsx +44 -7
  29. package/src/body/MRT_TableBody.tsx +11 -10
  30. package/src/body/MRT_TableBodyCell.tsx +8 -12
  31. package/src/body/MRT_TableBodyCellValue.tsx +1 -0
  32. package/src/body/MRT_TableBodyRow.tsx +14 -7
  33. package/src/body/MRT_TableDetailPanel.tsx +2 -3
  34. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +4 -1
  35. package/src/column.utils.ts +6 -1
  36. package/src/footer/MRT_TableFooter.tsx +2 -3
  37. package/src/footer/MRT_TableFooterRow.tsx +7 -3
  38. package/src/head/MRT_TableHead.tsx +2 -3
  39. package/src/head/MRT_TableHeadRow.tsx +7 -3
  40. package/src/inputs/MRT_EditCellTextField.tsx +38 -2
  41. package/src/menus/MRT_FilterOptionMenu.tsx +14 -5
  42. package/src/menus/MRT_RowActionMenu.tsx +12 -10
  43. package/src/table/MRT_Table.tsx +2 -3
  44. package/src/table/MRT_TableRoot.tsx +33 -19
@@ -29,18 +29,33 @@ import type {
29
29
  Cell,
30
30
  Column,
31
31
  ColumnDef,
32
+ ColumnFiltersState,
33
+ ColumnOrderState,
34
+ ColumnPinningState,
35
+ ColumnSizingInfoState,
36
+ ColumnSizingState,
32
37
  DeepKeys,
38
+ ExpandedState,
33
39
  FilterFn,
40
+ GroupingState,
34
41
  Header,
35
42
  HeaderGroup,
36
43
  OnChangeFn,
44
+ PaginationState,
37
45
  Row,
46
+ RowSelectionState,
38
47
  SortingFn,
48
+ SortingState,
39
49
  Table,
40
50
  TableOptions,
41
51
  TableState,
52
+ VisibilityState,
42
53
  } from '@tanstack/react-table';
43
- import type { VirtualizerOptions, Virtualizer } from '@tanstack/react-virtual';
54
+ import type {
55
+ VirtualizerOptions,
56
+ Virtualizer,
57
+ VirtualItem,
58
+ } from '@tanstack/react-virtual';
44
59
  import { MRT_AggregationFns } from './aggregationFns';
45
60
  import { MRT_DefaultColumn, MRT_DefaultDisplayColumn } from './column.utils';
46
61
  import { MRT_FilterFns } from './filterFns';
@@ -49,11 +64,30 @@ import { MRT_SortingFns } from './sortingFns';
49
64
  import { MRT_TableRoot } from './table/MRT_TableRoot';
50
65
  import { MRT_Localization_EN } from './_locales/en';
51
66
 
67
+ export { MRT_AggregationFns, MRT_FilterFns, MRT_SortingFns };
68
+
52
69
  /**
53
70
  * Most of this file is just TypeScript types
54
71
  */
55
72
 
56
- export type DensityState = 'comfortable' | 'compact' | 'spacious';
73
+ export type MRT_DensityState = 'comfortable' | 'compact' | 'spacious';
74
+
75
+ export type {
76
+ ColumnFiltersState as MRT_ColumnFiltersState,
77
+ ColumnOrderState as MRT_ColumnOrderState,
78
+ ColumnPinningState as MRT_ColumnPinningState,
79
+ ColumnSizingInfoState as MRT_ColumnSizingInfoState,
80
+ ColumnSizingState as MRT_ColumnSizingState,
81
+ ExpandedState as MRT_ExpandedState,
82
+ GroupingState as MRT_GroupingState,
83
+ PaginationState as MRT_PaginationState,
84
+ RowSelectionState as MRT_RowSelectionState,
85
+ SortingState as MRT_SortingState,
86
+ VirtualItem as MRT_VirtualItem,
87
+ Virtualizer as MRT_Virtualizer,
88
+ VirtualizerOptions as MRT_VirtualizerOptions,
89
+ VisibilityState as MRT_VisibilityState,
90
+ };
57
91
 
58
92
  type LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);
59
93
 
@@ -206,7 +240,7 @@ export type MRT_TableInstance<TData extends Record<string, any> = {}> = Omit<
206
240
  setColumnFilterFns: Dispatch<
207
241
  SetStateAction<{ [key: string]: MRT_FilterOption }>
208
242
  >;
209
- setDensity: Dispatch<SetStateAction<DensityState>>;
243
+ setDensity: Dispatch<SetStateAction<MRT_DensityState>>;
210
244
  setDraggingColumn: Dispatch<SetStateAction<MRT_Column<TData> | null>>;
211
245
  setDraggingRow: Dispatch<SetStateAction<MRT_Row<TData> | null>>;
212
246
  setEditingCell: Dispatch<SetStateAction<MRT_Cell<TData> | null>>;
@@ -228,7 +262,7 @@ export type MRT_TableInstance<TData extends Record<string, any> = {}> = Omit<
228
262
  export type MRT_TableState<TData extends Record<string, any> = {}> =
229
263
  TableState & {
230
264
  columnFilterFns: Record<string, MRT_FilterOption>;
231
- density: DensityState;
265
+ density: MRT_DensityState;
232
266
  draggingColumn: MRT_Column<TData> | null;
233
267
  draggingRow: MRT_Row<TData> | null;
234
268
  editingCell: MRT_Cell<TData> | null;
@@ -340,12 +374,15 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<
340
374
  LiteralUnion<string & MRT_FilterOption>
341
375
  > | null;
342
376
  columns?: MRT_ColumnDef<TData>[];
377
+ editSelectOptions?: (string | { text: string; value: any })[];
378
+ editVariant?: 'text' | 'select';
343
379
  enableClickToCopy?: boolean;
344
380
  enableColumnActions?: boolean;
345
381
  enableColumnDragging?: boolean;
346
382
  enableColumnFilterModes?: boolean;
347
383
  enableColumnOrdering?: boolean;
348
- enableEditing?: boolean;
384
+ enableEditing?: boolean | ((row: MRT_Row<TData>) => boolean);
385
+ enableFilterMatchHighlighting?: boolean;
349
386
  filterFn?: MRT_FilterFn<TData>;
350
387
  filterSelectOptions?: (string | { text: string; value: any })[];
351
388
  filterVariant?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox';
@@ -594,7 +631,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
594
631
  enableColumnOrdering?: boolean;
595
632
  enableColumnVirtualization?: boolean;
596
633
  enableDensityToggle?: boolean;
597
- enableEditing?: boolean;
634
+ enableEditing?: boolean | ((row: MRT_Row<TData>) => boolean);
598
635
  enableExpandAll?: boolean;
599
636
  enableFilterMatchHighlighting?: boolean;
600
637
  enableFullScreenToggle?: boolean;
@@ -804,7 +841,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
804
841
  muiTopToolbarProps?:
805
842
  | ToolbarProps
806
843
  | ((props: { table: MRT_TableInstance<TData> }) => ToolbarProps);
807
- onDensityChange?: OnChangeFn<DensityState>;
844
+ onDensityChange?: OnChangeFn<MRT_DensityState>;
808
845
  onDraggingColumnChange?: OnChangeFn<MRT_Column<TData> | null>;
809
846
  onDraggingRowChange?: OnChangeFn<MRT_Row<TData> | null>;
810
847
  onEditingCellChange?: OnChangeFn<MRT_Cell<TData> | null>;
@@ -1,19 +1,20 @@
1
1
  import React, { memo, useMemo } from 'react';
2
- import {
3
- useVirtualizer,
4
- Virtualizer,
5
- VirtualItem,
6
- } from '@tanstack/react-virtual';
2
+ import { useVirtualizer } from '@tanstack/react-virtual';
7
3
  import TableBody from '@mui/material/TableBody';
8
4
  import Typography from '@mui/material/Typography';
9
5
  import { Memo_MRT_TableBodyRow, MRT_TableBodyRow } from './MRT_TableBodyRow';
10
6
  import { rankGlobalFuzzy } from '../sortingFns';
11
- import type { MRT_Row, MRT_TableInstance } from '..';
7
+ import type {
8
+ MRT_Row,
9
+ MRT_TableInstance,
10
+ MRT_VirtualItem,
11
+ MRT_Virtualizer,
12
+ } from '..';
12
13
 
13
14
  interface Props {
14
- columnVirtualizer?: Virtualizer<HTMLDivElement, HTMLTableCellElement>;
15
+ columnVirtualizer?: MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>;
15
16
  table: MRT_TableInstance;
16
- virtualColumns?: VirtualItem[];
17
+ virtualColumns?: MRT_VirtualItem[];
17
18
  virtualPaddingLeft?: number;
18
19
  virtualPaddingRight?: number;
19
20
  }
@@ -116,7 +117,7 @@ export const MRT_TableBody = ({
116
117
  ]);
117
118
 
118
119
  const rowVirtualizer:
119
- | Virtualizer<HTMLDivElement, HTMLTableRowElement>
120
+ | MRT_Virtualizer<HTMLDivElement, HTMLTableRowElement>
120
121
  | undefined = enableRowVirtualization
121
122
  ? useVirtualizer({
122
123
  count: rows.length,
@@ -201,7 +202,7 @@ export const MRT_TableBody = ({
201
202
  virtualPaddingLeft,
202
203
  virtualPaddingRight,
203
204
  virtualRow: rowVirtualizer
204
- ? (rowOrVirtualRow as VirtualItem)
205
+ ? (rowOrVirtualRow as MRT_VirtualItem)
205
206
  : undefined,
206
207
  };
207
208
  return memoMode === 'rows' ? (
@@ -19,8 +19,7 @@ import {
19
19
  getIsFirstColumn,
20
20
  getIsLastColumn,
21
21
  } from '../column.utils';
22
- import type { VirtualItem } from '@tanstack/react-virtual';
23
- import type { MRT_Cell, MRT_TableInstance } from '..';
22
+ import type { MRT_Cell, MRT_TableInstance, MRT_VirtualItem } from '..';
24
23
 
25
24
  interface Props {
26
25
  cell: MRT_Cell;
@@ -30,7 +29,7 @@ interface Props {
30
29
  rowIndex: number;
31
30
  rowRef: RefObject<HTMLTableRowElement>;
32
31
  table: MRT_TableInstance;
33
- virtualCell?: VirtualItem;
32
+ virtualCell?: MRT_VirtualItem;
34
33
  }
35
34
 
36
35
  export const MRT_TableBodyCell = ({
@@ -153,8 +152,10 @@ export const MRT_TableBodyCell = ({
153
152
  }, [draggingColumn, draggingRow, hoveredColumn, hoveredRow, rowIndex]);
154
153
 
155
154
  const isEditable =
156
- (enableEditing || columnDef.enableEditing) &&
157
- columnDef.enableEditing !== false;
155
+ (enableEditing instanceof Function ? enableEditing(row) : enableEditing) &&
156
+ (columnDef.enableEditing instanceof Function
157
+ ? columnDef.enableEditing(row)
158
+ : columnDef.enableEditing) !== false;
158
159
 
159
160
  const isEditing =
160
161
  isEditable &&
@@ -166,11 +167,7 @@ export const MRT_TableBodyCell = ({
166
167
 
167
168
  const handleDoubleClick = (event: MouseEvent<HTMLTableCellElement>) => {
168
169
  tableCellProps?.onDoubleClick?.(event);
169
- if (
170
- (enableEditing || columnDef.enableEditing) &&
171
- columnDef.enableEditing !== false &&
172
- editingMode === 'cell'
173
- ) {
170
+ if (isEditable && editingMode === 'cell') {
174
171
  setEditingCell(cell);
175
172
  queueMicrotask(() => {
176
173
  const textField = editInputRefs.current[column.id];
@@ -241,8 +238,7 @@ export const MRT_TableBodyCell = ({
241
238
  '&:hover': {
242
239
  backgroundColor:
243
240
  enableHover &&
244
- enableEditing &&
245
- columnDef.enableEditing !== false &&
241
+ isEditable &&
246
242
  ['table', 'cell'].includes(editingMode ?? '')
247
243
  ? theme.palette.mode === 'dark'
248
244
  ? `${lighten(theme.palette.background.default, 0.2)} !important`
@@ -48,6 +48,7 @@ export const MRT_TableBodyCellValue = ({ cell, table }: Props) => {
48
48
 
49
49
  if (
50
50
  enableFilterMatchHighlighting &&
51
+ columnDef.enableFilterMatchHighlighting !== false &&
51
52
  renderedCellValue &&
52
53
  allowedTypes.includes(typeof renderedCellValue) &&
53
54
  ((filterValue &&
@@ -3,20 +3,25 @@ import TableRow from '@mui/material/TableRow';
3
3
  import { darken, lighten } from '@mui/material/styles';
4
4
  import { Memo_MRT_TableBodyCell, MRT_TableBodyCell } from './MRT_TableBodyCell';
5
5
  import { MRT_TableDetailPanel } from './MRT_TableDetailPanel';
6
- import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual';
7
- import type { MRT_Cell, MRT_Row, MRT_TableInstance } from '..';
6
+ import type {
7
+ MRT_Cell,
8
+ MRT_Row,
9
+ MRT_TableInstance,
10
+ MRT_VirtualItem,
11
+ MRT_Virtualizer,
12
+ } from '..';
8
13
 
9
14
  interface Props {
10
- columnVirtualizer?: Virtualizer<HTMLDivElement, HTMLTableCellElement>;
15
+ columnVirtualizer?: MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>;
11
16
  measureElement?: (element: HTMLTableRowElement) => void;
12
17
  numRows: number;
13
18
  row: MRT_Row;
14
19
  rowIndex: number;
15
20
  table: MRT_TableInstance;
16
- virtualColumns?: VirtualItem[];
21
+ virtualColumns?: MRT_VirtualItem[];
17
22
  virtualPaddingLeft?: number;
18
23
  virtualPaddingRight?: number;
19
- virtualRow?: VirtualItem;
24
+ virtualRow?: MRT_VirtualItem;
20
25
  }
21
26
 
22
27
  export const MRT_TableBodyRow = ({
@@ -103,7 +108,9 @@ export const MRT_TableBodyRow = ({
103
108
  ) : null}
104
109
  {(virtualColumns ?? row.getVisibleCells()).map((cellOrVirtualCell) => {
105
110
  const cell = columnVirtualizer
106
- ? row.getVisibleCells()[(cellOrVirtualCell as VirtualItem).index]
111
+ ? row.getVisibleCells()[
112
+ (cellOrVirtualCell as MRT_VirtualItem).index
113
+ ]
107
114
  : (cellOrVirtualCell as MRT_Cell);
108
115
  const props = {
109
116
  cell,
@@ -115,7 +122,7 @@ export const MRT_TableBodyRow = ({
115
122
  rowRef,
116
123
  table,
117
124
  virtualCell: columnVirtualizer
118
- ? (cellOrVirtualCell as VirtualItem)
125
+ ? (cellOrVirtualCell as MRT_VirtualItem)
119
126
  : undefined,
120
127
  };
121
128
  return memoMode === 'cells' &&
@@ -3,14 +3,13 @@ import Collapse from '@mui/material/Collapse';
3
3
  import TableCell from '@mui/material/TableCell';
4
4
  import TableRow from '@mui/material/TableRow';
5
5
  import { lighten } from '@mui/material/styles';
6
- import type { VirtualItem } from '@tanstack/react-virtual';
7
- import type { MRT_Row, MRT_TableInstance } from '..';
6
+ import type { MRT_Row, MRT_TableInstance, MRT_VirtualItem } from '..';
8
7
 
9
8
  interface Props {
10
9
  parentRowRef: React.RefObject<HTMLTableRowElement>;
11
10
  row: MRT_Row;
12
11
  table: MRT_TableInstance;
13
- virtualRow?: VirtualItem;
12
+ virtualRow?: MRT_VirtualItem;
14
13
  }
15
14
 
16
15
  export const MRT_TableDetailPanel = ({
@@ -64,7 +64,10 @@ export const MRT_ToggleRowActionMenuButton = <
64
64
  <>{renderRowActions({ cell, row, table })}</>
65
65
  ) : row.id === editingRow?.id && editingMode === 'row' ? (
66
66
  <MRT_EditActionButtons row={row} table={table} />
67
- ) : !renderRowActionMenuItems && enableEditing ? (
67
+ ) : !renderRowActionMenuItems &&
68
+ (enableEditing instanceof Function
69
+ ? enableEditing(row)
70
+ : enableEditing) ? (
68
71
  <Tooltip placement="right" arrow title={localization.edit}>
69
72
  <IconButton
70
73
  aria-label={localization.edit}
@@ -340,4 +340,9 @@ export const MRT_DefaultDisplayColumn = {
340
340
  } as const;
341
341
 
342
342
  export const parseCSSVarId = (id: string) =>
343
- id.replaceAll('.', '_').replaceAll(' ', '_').replaceAll('+', '_');
343
+ id
344
+ .replaceAll('.', '_')
345
+ .replaceAll(' ', '_')
346
+ .replaceAll('+', '_')
347
+ .replaceAll('(', '_')
348
+ .replaceAll(')', '_');
@@ -1,12 +1,11 @@
1
1
  import React from 'react';
2
2
  import TableFooter from '@mui/material/TableFooter';
3
3
  import { MRT_TableFooterRow } from './MRT_TableFooterRow';
4
- import type { VirtualItem } from '@tanstack/react-virtual';
5
- import type { MRT_TableInstance } from '..';
4
+ import type { MRT_TableInstance, MRT_VirtualItem } from '..';
6
5
 
7
6
  interface Props {
8
7
  table: MRT_TableInstance;
9
- virtualColumns?: VirtualItem[];
8
+ virtualColumns?: MRT_VirtualItem[];
10
9
  virtualPaddingLeft?: number;
11
10
  virtualPaddingRight?: number;
12
11
  }
@@ -2,13 +2,17 @@ import React from 'react';
2
2
  import TableRow from '@mui/material/TableRow';
3
3
  import { lighten } from '@mui/material/styles';
4
4
  import { MRT_TableFooterCell } from './MRT_TableFooterCell';
5
- import { VirtualItem } from '@tanstack/react-virtual';
6
- import type { MRT_Header, MRT_HeaderGroup, MRT_TableInstance } from '..';
5
+ import type {
6
+ MRT_Header,
7
+ MRT_HeaderGroup,
8
+ MRT_TableInstance,
9
+ MRT_VirtualItem,
10
+ } from '..';
7
11
 
8
12
  interface Props {
9
13
  footerGroup: MRT_HeaderGroup;
10
14
  table: MRT_TableInstance;
11
- virtualColumns?: VirtualItem[];
15
+ virtualColumns?: MRT_VirtualItem[];
12
16
  virtualPaddingLeft?: number;
13
17
  virtualPaddingRight?: number;
14
18
  }
@@ -1,12 +1,11 @@
1
1
  import React from 'react';
2
2
  import TableHead from '@mui/material/TableHead';
3
3
  import { MRT_TableHeadRow } from './MRT_TableHeadRow';
4
- import type { VirtualItem } from '@tanstack/react-virtual';
5
- import type { MRT_TableInstance } from '..';
4
+ import type { MRT_TableInstance, MRT_VirtualItem } from '..';
6
5
 
7
6
  interface Props {
8
7
  table: MRT_TableInstance;
9
- virtualColumns?: VirtualItem[];
8
+ virtualColumns?: MRT_VirtualItem[];
10
9
  virtualPaddingLeft?: number;
11
10
  virtualPaddingRight?: number;
12
11
  }
@@ -2,13 +2,17 @@ import React from 'react';
2
2
  import TableRow from '@mui/material/TableRow';
3
3
  import { alpha, lighten } from '@mui/material/styles';
4
4
  import { MRT_TableHeadCell } from './MRT_TableHeadCell';
5
- import type { VirtualItem } from '@tanstack/react-virtual';
6
- import type { MRT_Header, MRT_HeaderGroup, MRT_TableInstance } from '..';
5
+ import type {
6
+ MRT_Header,
7
+ MRT_HeaderGroup,
8
+ MRT_TableInstance,
9
+ MRT_VirtualItem,
10
+ } from '..';
7
11
 
8
12
  interface Props {
9
13
  headerGroup: MRT_HeaderGroup;
10
14
  table: MRT_TableInstance;
11
- virtualColumns?: VirtualItem[];
15
+ virtualColumns?: MRT_VirtualItem[];
12
16
  virtualPaddingLeft?: number;
13
17
  virtualPaddingRight?: number;
14
18
  }
@@ -1,5 +1,6 @@
1
1
  import React, { ChangeEvent, FocusEvent, KeyboardEvent, useState } from 'react';
2
2
  import TextField from '@mui/material/TextField';
3
+ import MenuItem from '@mui/material/MenuItem';
3
4
  import type { TextFieldProps } from '@mui/material/TextField';
4
5
  import type { MRT_Cell, MRT_TableInstance } from '..';
5
6
 
@@ -47,6 +48,8 @@ export const MRT_EditCellTextField = <TData extends Record<string, any> = {}>({
47
48
  ...mcTableBodyCellEditTextFieldProps,
48
49
  };
49
50
 
51
+ const isSelectEdit = columnDef.editVariant === 'select';
52
+
50
53
  const saveRow = (newValue: string) => {
51
54
  if (editingRow) {
52
55
  setEditingRow({
@@ -83,7 +86,11 @@ export const MRT_EditCellTextField = <TData extends Record<string, any> = {}>({
83
86
 
84
87
  return (
85
88
  <TextField
86
- disabled={columnDef.enableEditing === false}
89
+ disabled={
90
+ (columnDef.enableEditing instanceof Function
91
+ ? columnDef.enableEditing(row)
92
+ : columnDef.enableEditing) === false
93
+ }
87
94
  fullWidth
88
95
  inputRef={(inputRef) => {
89
96
  if (inputRef) {
@@ -97,6 +104,7 @@ export const MRT_EditCellTextField = <TData extends Record<string, any> = {}>({
97
104
  margin="none"
98
105
  name={column.id}
99
106
  placeholder={columnDef.header}
107
+ select={isSelectEdit}
100
108
  value={value}
101
109
  variant="standard"
102
110
  {...textFieldProps}
@@ -107,6 +115,34 @@ export const MRT_EditCellTextField = <TData extends Record<string, any> = {}>({
107
115
  onBlur={handleBlur}
108
116
  onChange={handleChange}
109
117
  onKeyDown={handleEnterKeyDown}
110
- />
118
+ >
119
+ {columnDef?.editSelectOptions?.map(
120
+ (option: string | { text: string; value: string }) => {
121
+ let value: string;
122
+ let text: string;
123
+ if (typeof option !== 'object') {
124
+ value = option;
125
+ text = option;
126
+ } else {
127
+ value = option.value;
128
+ text = option.text;
129
+ }
130
+ return (
131
+ <MenuItem
132
+ key={value}
133
+ sx={{
134
+ display: 'flex',
135
+ m: 0,
136
+ alignItems: 'center',
137
+ gap: '0.5rem',
138
+ }}
139
+ value={value}
140
+ >
141
+ {text}
142
+ </MenuItem>
143
+ );
144
+ },
145
+ )}
146
+ </TextField>
111
147
  );
112
148
  };
@@ -131,6 +131,7 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
131
131
  const { globalFilterFn, density } = getState();
132
132
  const { column } = header ?? {};
133
133
  const { columnDef } = column ?? {};
134
+ const currentFilterValue = column?.getFilterValue();
134
135
 
135
136
  const allowedColumnFilterOptions =
136
137
  columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
@@ -155,15 +156,19 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
155
156
  [header.id]: option,
156
157
  }));
157
158
  if (['empty', 'notEmpty'].includes(option as string)) {
158
- column.setFilterValue(' ');
159
+ if (currentFilterValue !== ' ') {
160
+ column.setFilterValue(' ');
161
+ }
159
162
  } else if (
160
163
  columnDef?.filterVariant === 'multi-select' ||
161
164
  ['arrIncludesSome', 'arrIncludesAll', 'arrIncludes'].includes(
162
165
  option as string,
163
166
  )
164
167
  ) {
165
- column.setFilterValue([]);
166
- setFilterValue?.([]);
168
+ if ((currentFilterValue as Array<any>)?.length) {
169
+ column.setFilterValue([]);
170
+ setFilterValue?.([]);
171
+ }
167
172
  } else if (
168
173
  columnDef?.filterVariant === 'range' ||
169
174
  ['between', 'betweenInclusive', 'inNumberRange'].includes(
@@ -173,8 +178,12 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
173
178
  column.setFilterValue(['', '']);
174
179
  setFilterValue?.('');
175
180
  } else {
176
- column.setFilterValue('');
177
- setFilterValue?.('');
181
+ if (
182
+ !['', undefined].includes(currentFilterValue as string | undefined)
183
+ ) {
184
+ column.setFilterValue('');
185
+ setFilterValue?.('');
186
+ }
178
187
  }
179
188
  } else {
180
189
  setGlobalFilterFn(option);
@@ -44,16 +44,18 @@ export const MRT_RowActionMenu = ({
44
44
  dense: density === 'compact',
45
45
  }}
46
46
  >
47
- {enableEditing && (
48
- <MenuItem onClick={handleEdit} sx={commonMenuItemStyles}>
49
- <Box sx={commonListItemStyles}>
50
- <ListItemIcon>
51
- <EditIcon />
52
- </ListItemIcon>
53
- {localization.edit}
54
- </Box>
55
- </MenuItem>
56
- )}
47
+ {enableEditing instanceof Function
48
+ ? enableEditing(row)
49
+ : enableEditing && (
50
+ <MenuItem onClick={handleEdit} sx={commonMenuItemStyles}>
51
+ <Box sx={commonListItemStyles}>
52
+ <ListItemIcon>
53
+ <EditIcon />
54
+ </ListItemIcon>
55
+ {localization.edit}
56
+ </Box>
57
+ </MenuItem>
58
+ )}
57
59
  {renderRowActionMenuItems?.({
58
60
  row,
59
61
  table,
@@ -3,14 +3,13 @@ import {
3
3
  defaultRangeExtractor,
4
4
  Range,
5
5
  useVirtualizer,
6
- Virtualizer,
7
6
  } from '@tanstack/react-virtual';
8
7
  import Table from '@mui/material/Table';
9
8
  import { MRT_TableHead } from '../head/MRT_TableHead';
10
9
  import { Memo_MRT_TableBody, MRT_TableBody } from '../body/MRT_TableBody';
11
10
  import { MRT_TableFooter } from '../footer/MRT_TableFooter';
12
11
  import { parseCSSVarId } from '../column.utils';
13
- import type { MRT_TableInstance } from '..';
12
+ import type { MRT_TableInstance, MRT_Virtualizer } from '..';
14
13
 
15
14
  interface Props {
16
15
  table: MRT_TableInstance;
@@ -95,7 +94,7 @@ export const MRT_Table = ({ table }: Props) => {
95
94
  );
96
95
 
97
96
  const columnVirtualizer:
98
- | Virtualizer<HTMLDivElement, HTMLTableCellElement>
97
+ | MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>
99
98
  | undefined = enableColumnVirtualization
100
99
  ? useVirtualizer({
101
100
  count: table.getVisibleLeafColumns().length,