material-react-table 0.7.2 → 0.7.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.
- package/dist/MaterialReactTable.d.ts +21 -2
- package/dist/material-react-table.cjs.development.js +88 -37
- package/dist/material-react-table.cjs.development.js.map +1 -1
- package/dist/material-react-table.cjs.production.min.js +1 -1
- package/dist/material-react-table.cjs.production.min.js.map +1 -1
- package/dist/material-react-table.esm.js +88 -37
- package/dist/material-react-table.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/MaterialReactTable.tsx +34 -0
- package/src/body/MRT_TableBodyCell.tsx +36 -5
- package/src/buttons/MRT_CopyButton.tsx +1 -0
- package/src/inputs/MRT_EditCellTextField.tsx +12 -1
- package/src/table/MRT_TableRoot.tsx +20 -4
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.7.
|
|
2
|
+
"version": "0.7.3",
|
|
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.",
|
|
@@ -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;
|
|
@@ -557,6 +562,33 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
|
|
|
557
562
|
tableInstance: MRT_TableInstance<D>;
|
|
558
563
|
event: MouseEvent<HTMLTableCellElement>;
|
|
559
564
|
}) => void;
|
|
565
|
+
onCellEditBlur?: ({
|
|
566
|
+
cell,
|
|
567
|
+
event,
|
|
568
|
+
tableInstance,
|
|
569
|
+
}: {
|
|
570
|
+
event: FocusEvent<HTMLInputElement>;
|
|
571
|
+
cell: MRT_Cell<D>;
|
|
572
|
+
tableInstance: MRT_TableInstance<D>;
|
|
573
|
+
}) => void;
|
|
574
|
+
onCellEditChange?: ({
|
|
575
|
+
cell,
|
|
576
|
+
event,
|
|
577
|
+
tableInstance,
|
|
578
|
+
}: {
|
|
579
|
+
event: ChangeEvent<HTMLInputElement>;
|
|
580
|
+
cell: MRT_Cell<D>;
|
|
581
|
+
tableInstance: MRT_TableInstance<D>;
|
|
582
|
+
}) => void;
|
|
583
|
+
onColumnFilterValueChange?: ({
|
|
584
|
+
column,
|
|
585
|
+
event,
|
|
586
|
+
filterValue,
|
|
587
|
+
}: {
|
|
588
|
+
column: MRT_Column<D>;
|
|
589
|
+
event: ChangeEvent<HTMLInputElement>;
|
|
590
|
+
filterValue: any;
|
|
591
|
+
}) => void;
|
|
560
592
|
onDetailPanelClick?: ({
|
|
561
593
|
event,
|
|
562
594
|
row,
|
|
@@ -724,6 +756,7 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
|
|
|
724
756
|
export default <D extends Record<string, any> = {}>({
|
|
725
757
|
autoResetExpanded = false,
|
|
726
758
|
columnResizeMode = 'onEnd',
|
|
759
|
+
editingMode = 'row',
|
|
727
760
|
enableColumnActions = true,
|
|
728
761
|
enableColumnFilters = true,
|
|
729
762
|
enableColumnResizing = false,
|
|
@@ -754,6 +787,7 @@ export default <D extends Record<string, any> = {}>({
|
|
|
754
787
|
<MRT_TableRoot
|
|
755
788
|
autoResetExpanded={autoResetExpanded}
|
|
756
789
|
columnResizeMode={columnResizeMode}
|
|
790
|
+
editingMode={editingMode}
|
|
757
791
|
enableColumnActions={enableColumnActions}
|
|
758
792
|
enableColumnResizing={enableColumnResizing}
|
|
759
793
|
enableColumnFilters={enableColumnFilters}
|
|
@@ -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,43 @@ 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',
|
|
63
96
|
maxWidth: `min(${column.getWidth()}px, fit-content)`,
|
|
64
97
|
minWidth: `max(${column.getWidth()}px, ${column.minWidth}px)`,
|
|
65
98
|
p: isDensePadding
|
|
@@ -97,9 +130,7 @@ export const MRT_TableBodyCell: FC<Props> = ({ cell, tableInstance }) => {
|
|
|
97
130
|
column.id !==
|
|
98
131
|
row.groupingColumnId) ? null : cell.getIsAggregated() ? (
|
|
99
132
|
cell.renderAggregatedCell()
|
|
100
|
-
) :
|
|
101
|
-
column.enableEditing !== false &&
|
|
102
|
-
currentEditingRow?.id === row.id ? (
|
|
133
|
+
) : isEditing ? (
|
|
103
134
|
<MRT_EditCellTextField cell={cell} tableInstance={tableInstance} />
|
|
104
135
|
) : (enableClickToCopy || column.enableClickToCopy) &&
|
|
105
136
|
column.enableClickToCopy !== false ? (
|
|
@@ -16,7 +16,14 @@ interface Props {
|
|
|
16
16
|
export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
|
|
17
17
|
const {
|
|
18
18
|
getState,
|
|
19
|
-
options: {
|
|
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}
|
|
@@ -14,7 +14,13 @@ import {
|
|
|
14
14
|
getCoreRowModelSync,
|
|
15
15
|
ColumnDef,
|
|
16
16
|
} from '@tanstack/react-table';
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
MRT_Cell,
|
|
19
|
+
MRT_ColumnDef,
|
|
20
|
+
MRT_FilterType,
|
|
21
|
+
MRT_Row,
|
|
22
|
+
MRT_TableInstance,
|
|
23
|
+
} from '..';
|
|
18
24
|
import { MRT_ExpandAllButton } from '../buttons/MRT_ExpandAllButton';
|
|
19
25
|
import { MRT_ExpandButton } from '../buttons/MRT_ExpandButton';
|
|
20
26
|
import { MRT_ToggleRowActionMenuButton } from '../buttons/MRT_ToggleRowActionMenuButton';
|
|
@@ -41,8 +47,12 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
|
41
47
|
[props.idPrefix],
|
|
42
48
|
);
|
|
43
49
|
|
|
44
|
-
const [
|
|
45
|
-
null
|
|
50
|
+
const [currentEditingCell, setCurrentEditingCell] =
|
|
51
|
+
useState<MRT_Cell<D> | null>(
|
|
52
|
+
props.initialState?.currentEditingCell ?? null,
|
|
53
|
+
);
|
|
54
|
+
const [currentEditingRow, setCurrentEditingRow] = useState<MRT_Row<D> | null>(
|
|
55
|
+
props.initialState?.currentEditingRow ?? null,
|
|
46
56
|
);
|
|
47
57
|
const [isDensePadding, setIsDensePadding] = useState(
|
|
48
58
|
props.initialState?.isDensePadding ?? false,
|
|
@@ -87,7 +97,8 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
|
87
97
|
const displayColumns = useMemo(
|
|
88
98
|
() =>
|
|
89
99
|
[
|
|
90
|
-
(props.enableRowActions ||
|
|
100
|
+
(props.enableRowActions ||
|
|
101
|
+
(props.enableEditing && props.editingMode === 'row')) &&
|
|
91
102
|
createDisplayColumn(table, {
|
|
92
103
|
Cell: ({ cell }) => (
|
|
93
104
|
<MRT_ToggleRowActionMenuButton
|
|
@@ -146,6 +157,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
|
146
157
|
}),
|
|
147
158
|
].filter(Boolean),
|
|
148
159
|
[
|
|
160
|
+
props.editingMode,
|
|
149
161
|
props.enableEditing,
|
|
150
162
|
props.enableExpandAll,
|
|
151
163
|
props.enableExpanded,
|
|
@@ -210,6 +222,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
|
210
222
|
columns,
|
|
211
223
|
data,
|
|
212
224
|
state: {
|
|
225
|
+
currentEditingCell,
|
|
213
226
|
currentEditingRow,
|
|
214
227
|
currentFilterTypes,
|
|
215
228
|
currentGlobalFilterType,
|
|
@@ -222,6 +235,9 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
|
|
|
222
235
|
...props.state,
|
|
223
236
|
},
|
|
224
237
|
}),
|
|
238
|
+
//@ts-ignore
|
|
239
|
+
setCurrentEditingCell,
|
|
240
|
+
//@ts-ignore
|
|
225
241
|
setCurrentEditingRow,
|
|
226
242
|
setCurrentFilterTypes,
|
|
227
243
|
setCurrentGlobalFilterType,
|