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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.2",
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
- ) : enableEditing &&
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 ? (
@@ -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',
@@ -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}
@@ -14,7 +14,13 @@ import {
14
14
  getCoreRowModelSync,
15
15
  ColumnDef,
16
16
  } from '@tanstack/react-table';
17
- import { MRT_ColumnDef, MRT_FilterType, MRT_Row, MRT_TableInstance } from '..';
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 [currentEditingRow, setCurrentEditingRow] = useState<MRT_Row | null>(
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 || props.enableEditing) &&
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,