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.
- package/README.md +5 -13
- package/dist/cjs/index.js +79 -37
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/MaterialReactTable.d.ts +16 -8
- package/dist/cjs/types/body/MRT_TableBody.d.ts +3 -4
- package/dist/cjs/types/body/MRT_TableBodyCell.d.ts +2 -3
- package/dist/cjs/types/body/MRT_TableBodyRow.d.ts +4 -5
- package/dist/cjs/types/body/MRT_TableDetailPanel.d.ts +2 -3
- package/dist/cjs/types/footer/MRT_TableFooter.d.ts +2 -3
- package/dist/cjs/types/footer/MRT_TableFooterRow.d.ts +2 -3
- package/dist/cjs/types/head/MRT_TableHead.d.ts +2 -3
- package/dist/cjs/types/head/MRT_TableHeadRow.d.ts +2 -3
- package/dist/cjs/types/table/MRT_TableRoot.d.ts +1 -272
- package/dist/esm/material-react-table.esm.js +77 -38
- package/dist/esm/material-react-table.esm.js.map +1 -1
- package/dist/esm/types/MaterialReactTable.d.ts +16 -8
- package/dist/esm/types/body/MRT_TableBody.d.ts +3 -4
- package/dist/esm/types/body/MRT_TableBodyCell.d.ts +2 -3
- package/dist/esm/types/body/MRT_TableBodyRow.d.ts +4 -5
- package/dist/esm/types/body/MRT_TableDetailPanel.d.ts +2 -3
- package/dist/esm/types/footer/MRT_TableFooter.d.ts +2 -3
- package/dist/esm/types/footer/MRT_TableFooterRow.d.ts +2 -3
- package/dist/esm/types/head/MRT_TableHead.d.ts +2 -3
- package/dist/esm/types/head/MRT_TableHeadRow.d.ts +2 -3
- package/dist/esm/types/table/MRT_TableRoot.d.ts +1 -272
- package/dist/index.d.ts +16 -7
- package/package.json +2 -2
- package/src/MaterialReactTable.tsx +44 -7
- package/src/body/MRT_TableBody.tsx +11 -10
- package/src/body/MRT_TableBodyCell.tsx +8 -12
- package/src/body/MRT_TableBodyCellValue.tsx +1 -0
- package/src/body/MRT_TableBodyRow.tsx +14 -7
- package/src/body/MRT_TableDetailPanel.tsx +2 -3
- package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +4 -1
- package/src/column.utils.ts +6 -1
- package/src/footer/MRT_TableFooter.tsx +2 -3
- package/src/footer/MRT_TableFooterRow.tsx +7 -3
- package/src/head/MRT_TableHead.tsx +2 -3
- package/src/head/MRT_TableHeadRow.tsx +7 -3
- package/src/inputs/MRT_EditCellTextField.tsx +38 -2
- package/src/menus/MRT_FilterOptionMenu.tsx +14 -5
- package/src/menus/MRT_RowActionMenu.tsx +12 -10
- package/src/table/MRT_Table.tsx +2 -3
- 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 {
|
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
|
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<
|
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:
|
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<
|
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 {
|
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?:
|
15
|
+
columnVirtualizer?: MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>;
|
15
16
|
table: MRT_TableInstance;
|
16
|
-
virtualColumns?:
|
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
|
-
|
|
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
|
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 {
|
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?:
|
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
|
157
|
-
columnDef.enableEditing
|
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
|
-
|
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 {
|
7
|
-
|
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?:
|
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?:
|
21
|
+
virtualColumns?: MRT_VirtualItem[];
|
17
22
|
virtualPaddingLeft?: number;
|
18
23
|
virtualPaddingRight?: number;
|
19
|
-
virtualRow?:
|
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()[
|
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
|
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 {
|
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?:
|
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 &&
|
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}
|
package/src/column.utils.ts
CHANGED
@@ -340,4 +340,9 @@ export const MRT_DefaultDisplayColumn = {
|
|
340
340
|
} as const;
|
341
341
|
|
342
342
|
export const parseCSSVarId = (id: string) =>
|
343
|
-
id
|
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 {
|
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?:
|
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 {
|
6
|
-
|
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?:
|
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 {
|
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?:
|
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 {
|
6
|
-
|
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?:
|
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={
|
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
|
-
|
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
|
-
|
166
|
-
|
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
|
-
|
177
|
-
|
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
|
-
|
49
|
-
|
50
|
-
<
|
51
|
-
<
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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,
|
package/src/table/MRT_Table.tsx
CHANGED
@@ -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
|
-
|
|
97
|
+
| MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>
|
99
98
|
| undefined = enableColumnVirtualization
|
100
99
|
? useVirtualizer({
|
101
100
|
count: table.getVisibleLeafColumns().length,
|