@mui/x-data-grid 6.7.0 → 6.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 (153) hide show
  1. package/CHANGELOG.md +77 -15
  2. package/components/GridColumnHeaders.d.ts +2 -2
  3. package/components/GridColumnHeaders.js +3 -1
  4. package/components/GridRow.d.ts +2 -2
  5. package/components/GridRow.js +23 -69
  6. package/components/cell/GridCell.d.ts +24 -15
  7. package/components/cell/GridCell.js +422 -45
  8. package/components/cell/index.d.ts +2 -1
  9. package/components/cell/index.js +1 -1
  10. package/components/containers/GridRootStyles.js +30 -16
  11. package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  12. package/components/toolbar/GridToolbar.js +2 -2
  13. package/components/virtualization/GridVirtualScroller.js +4 -9
  14. package/components/virtualization/GridVirtualScrollerContent.js +11 -20
  15. package/constants/defaultGridSlotsComponents.js +6 -2
  16. package/hooks/core/useGridApiInitialization.js +4 -1
  17. package/hooks/core/useGridStateInitialization.js +2 -9
  18. package/hooks/features/clipboard/useGridClipboard.js +1 -4
  19. package/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  20. package/hooks/features/editing/useGridCellEditing.js +5 -3
  21. package/hooks/features/editing/useGridRowEditing.js +14 -6
  22. package/hooks/features/filter/gridFilterUtils.d.ts +4 -1
  23. package/hooks/features/filter/gridFilterUtils.js +19 -13
  24. package/hooks/features/filter/useGridFilter.js +2 -1
  25. package/hooks/features/focus/useGridFocus.js +9 -4
  26. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  27. package/hooks/features/rows/useGridParamsApi.d.ts +2 -0
  28. package/hooks/features/rows/useGridParamsApi.js +7 -15
  29. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +8 -816
  30. package/hooks/features/virtualization/useGridVirtualScroller.js +40 -38
  31. package/hooks/utils/index.d.ts +1 -1
  32. package/hooks/utils/index.js +1 -1
  33. package/hooks/utils/useGridSelector.d.ts +3 -1
  34. package/hooks/utils/useGridSelector.js +37 -6
  35. package/hooks/utils/useLazyRef.d.ts +2 -0
  36. package/hooks/utils/useLazyRef.js +9 -0
  37. package/hooks/utils/useOnMount.d.ts +2 -0
  38. package/hooks/utils/useOnMount.js +7 -0
  39. package/index.js +1 -1
  40. package/legacy/components/GridColumnHeaders.js +3 -1
  41. package/legacy/components/GridRow.js +25 -69
  42. package/legacy/components/cell/GridCell.js +425 -46
  43. package/legacy/components/cell/index.js +1 -1
  44. package/legacy/components/containers/GridRootStyles.js +20 -17
  45. package/legacy/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  46. package/legacy/components/toolbar/GridToolbar.js +2 -2
  47. package/legacy/components/virtualization/GridVirtualScroller.js +4 -7
  48. package/legacy/components/virtualization/GridVirtualScrollerContent.js +10 -17
  49. package/legacy/constants/defaultGridSlotsComponents.js +6 -2
  50. package/legacy/hooks/core/useGridApiInitialization.js +4 -1
  51. package/legacy/hooks/core/useGridStateInitialization.js +2 -7
  52. package/legacy/hooks/features/clipboard/useGridClipboard.js +1 -4
  53. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  54. package/legacy/hooks/features/editing/useGridCellEditing.js +5 -3
  55. package/legacy/hooks/features/editing/useGridRowEditing.js +15 -7
  56. package/legacy/hooks/features/filter/gridFilterUtils.js +23 -19
  57. package/legacy/hooks/features/filter/useGridFilter.js +2 -1
  58. package/legacy/hooks/features/focus/useGridFocus.js +9 -4
  59. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  60. package/legacy/hooks/features/rows/useGridParamsApi.js +23 -15
  61. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +38 -34
  62. package/legacy/hooks/utils/index.js +1 -1
  63. package/legacy/hooks/utils/useGridSelector.js +43 -5
  64. package/legacy/hooks/utils/useLazyRef.js +9 -0
  65. package/legacy/hooks/utils/useOnMount.js +7 -0
  66. package/legacy/index.js +1 -1
  67. package/legacy/locales/elGR.js +70 -79
  68. package/legacy/utils/Store.js +34 -0
  69. package/legacy/utils/doesSupportPreventScroll.js +13 -0
  70. package/legacy/utils/fastMemo.js +5 -0
  71. package/legacy/utils/fastObjectShallowCompare.js +32 -0
  72. package/legacy/utils/keyboardUtils.js +4 -2
  73. package/locales/elGR.js +66 -79
  74. package/models/api/gridCoreApi.d.ts +6 -0
  75. package/models/colDef/gridColDef.d.ts +4 -3
  76. package/models/colDef/gridColType.d.ts +3 -1
  77. package/models/events/gridEventLookup.d.ts +3 -3
  78. package/modern/components/GridColumnHeaders.js +3 -1
  79. package/modern/components/GridRow.js +22 -69
  80. package/modern/components/cell/GridCell.js +421 -45
  81. package/modern/components/cell/index.js +1 -1
  82. package/modern/components/containers/GridRootStyles.js +30 -16
  83. package/modern/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  84. package/modern/components/toolbar/GridToolbar.js +2 -2
  85. package/modern/components/virtualization/GridVirtualScroller.js +4 -9
  86. package/modern/components/virtualization/GridVirtualScrollerContent.js +10 -20
  87. package/modern/constants/defaultGridSlotsComponents.js +6 -2
  88. package/modern/hooks/core/useGridApiInitialization.js +4 -1
  89. package/modern/hooks/core/useGridStateInitialization.js +2 -9
  90. package/modern/hooks/features/clipboard/useGridClipboard.js +1 -4
  91. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  92. package/modern/hooks/features/editing/useGridCellEditing.js +5 -3
  93. package/modern/hooks/features/editing/useGridRowEditing.js +14 -6
  94. package/modern/hooks/features/filter/gridFilterUtils.js +17 -12
  95. package/modern/hooks/features/filter/useGridFilter.js +2 -1
  96. package/modern/hooks/features/focus/useGridFocus.js +8 -4
  97. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  98. package/modern/hooks/features/rows/useGridParamsApi.js +7 -15
  99. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +40 -38
  100. package/modern/hooks/utils/index.js +1 -1
  101. package/modern/hooks/utils/useGridSelector.js +37 -6
  102. package/modern/hooks/utils/useLazyRef.js +9 -0
  103. package/modern/hooks/utils/useOnMount.js +7 -0
  104. package/modern/index.js +1 -1
  105. package/modern/locales/elGR.js +66 -79
  106. package/modern/utils/Store.js +24 -0
  107. package/modern/utils/doesSupportPreventScroll.js +13 -0
  108. package/modern/utils/fastMemo.js +5 -0
  109. package/modern/utils/fastObjectShallowCompare.js +32 -0
  110. package/modern/utils/keyboardUtils.js +4 -2
  111. package/node/components/GridColumnHeaders.js +4 -2
  112. package/node/components/GridRow.js +22 -69
  113. package/node/components/cell/GridCell.js +424 -47
  114. package/node/components/cell/index.js +17 -10
  115. package/node/components/containers/GridRootStyles.js +30 -16
  116. package/node/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  117. package/node/components/toolbar/GridToolbar.js +2 -2
  118. package/node/components/virtualization/GridVirtualScroller.js +4 -9
  119. package/node/components/virtualization/GridVirtualScrollerContent.js +10 -20
  120. package/node/constants/defaultGridSlotsComponents.js +4 -1
  121. package/node/hooks/core/useGridApiInitialization.js +4 -1
  122. package/node/hooks/core/useGridStateInitialization.js +2 -9
  123. package/node/hooks/features/clipboard/useGridClipboard.js +1 -4
  124. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +8 -2
  125. package/node/hooks/features/editing/useGridCellEditing.js +5 -3
  126. package/node/hooks/features/editing/useGridRowEditing.js +14 -6
  127. package/node/hooks/features/filter/gridFilterUtils.js +17 -12
  128. package/node/hooks/features/filter/useGridFilter.js +2 -1
  129. package/node/hooks/features/focus/useGridFocus.js +8 -4
  130. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  131. package/node/hooks/features/rows/useGridParamsApi.js +9 -15
  132. package/node/hooks/features/virtualization/useGridVirtualScroller.js +40 -36
  133. package/node/hooks/utils/index.js +14 -10
  134. package/node/hooks/utils/useGridSelector.js +41 -7
  135. package/node/hooks/utils/useLazyRef.js +17 -0
  136. package/node/hooks/utils/useOnMount.js +15 -0
  137. package/node/index.js +1 -1
  138. package/node/locales/elGR.js +66 -79
  139. package/node/utils/Store.js +31 -0
  140. package/node/utils/doesSupportPreventScroll.js +19 -0
  141. package/node/utils/fastMemo.js +13 -0
  142. package/node/utils/fastObjectShallowCompare.js +38 -0
  143. package/node/utils/keyboardUtils.js +4 -2
  144. package/package.json +1 -1
  145. package/utils/Store.d.ts +11 -0
  146. package/utils/Store.js +24 -0
  147. package/utils/doesSupportPreventScroll.d.ts +1 -0
  148. package/utils/doesSupportPreventScroll.js +13 -0
  149. package/utils/fastMemo.d.ts +1 -0
  150. package/utils/fastMemo.js +5 -0
  151. package/utils/fastObjectShallowCompare.d.ts +1 -0
  152. package/utils/fastObjectShallowCompare.js +32 -0
  153. package/utils/keyboardUtils.js +4 -2
@@ -1,30 +1,48 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["align", "children", "colIndex", "colDef", "cellMode", "field", "formattedValue", "hasFocus", "height", "isEditable", "isSelected", "rowId", "tabIndex", "value", "width", "className", "showRightBorder", "extendRowFullWidth", "row", "colSpan", "disableDragEvents", "onClick", "onDoubleClick", "onMouseDown", "onMouseUp", "onMouseOver", "onKeyDown", "onKeyUp", "onDragEnter", "onDragOver"];
3
+ const _excluded = ["changeReason", "unstable_updateValueOnRender"],
4
+ _excluded2 = ["align", "children", "colIndex", "column", "cellMode", "field", "formattedValue", "hasFocus", "height", "isEditable", "isSelected", "rowId", "tabIndex", "value", "width", "className", "showRightBorder", "extendRowFullWidth", "row", "colSpan", "disableDragEvents", "onClick", "onDoubleClick", "onMouseDown", "onMouseUp", "onMouseOver", "onKeyDown", "onKeyUp", "onDragEnter", "onDragOver"],
5
+ _excluded3 = ["column", "rowId", "editCellState", "align", "children", "colIndex", "height", "width", "className", "showRightBorder", "extendRowFullWidth", "row", "colSpan", "disableDragEvents", "onClick", "onDoubleClick", "onMouseDown", "onMouseUp", "onMouseOver", "onKeyDown", "onKeyUp", "onDragEnter", "onDragOver"],
6
+ _excluded4 = ["changeReason", "unstable_updateValueOnRender"];
4
7
  /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
5
8
  import * as React from 'react';
6
9
  import PropTypes from 'prop-types';
7
10
  import clsx from 'clsx';
8
11
  import { unstable_useForkRef as useForkRef, unstable_composeClasses as composeClasses, unstable_ownerDocument as ownerDocument, unstable_capitalize as capitalize } from '@mui/utils';
9
- import { getDataGridUtilityClass } from '../../constants/gridClasses';
12
+ import { fastMemo } from '../../utils/fastMemo';
13
+ import { doesSupportPreventScroll } from '../../utils/doesSupportPreventScroll';
14
+ import { getDataGridUtilityClass, gridClasses } from '../../constants/gridClasses';
10
15
  import { GridCellModes } from '../../models';
16
+ import { useGridSelector, objectShallowCompare } from '../../hooks/utils/useGridSelector';
11
17
  import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
12
18
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
13
19
  import { gridFocusCellSelector } from '../../hooks/features/focus/gridFocusStateSelector';
20
+ import { MissingRowIdError } from '../../hooks/features/rows/useGridParamsApi';
14
21
  import { jsx as _jsx } from "react/jsx-runtime";
15
- // Based on https://stackoverflow.com/a/59518678
16
- let cachedSupportsPreventScroll;
17
- function doesSupportPreventScroll() {
18
- if (cachedSupportsPreventScroll === undefined) {
19
- document.createElement('div').focus({
20
- get preventScroll() {
21
- cachedSupportsPreventScroll = true;
22
- return false;
23
- }
24
- });
25
- }
26
- return cachedSupportsPreventScroll;
27
- }
22
+ const EMPTY_CELL_PARAMS = {
23
+ id: -1,
24
+ field: '__unset__',
25
+ row: {},
26
+ rowNode: {
27
+ id: -1,
28
+ depth: 0,
29
+ type: 'leaf',
30
+ parent: -1,
31
+ groupingKey: null
32
+ },
33
+ colDef: {
34
+ type: 'string',
35
+ field: '__unset__',
36
+ computedWidth: 0
37
+ },
38
+ cellMode: GridCellModes.View,
39
+ hasFocus: false,
40
+ tabIndex: -1,
41
+ value: null,
42
+ formattedValue: '__unset__',
43
+ isEditable: false,
44
+ api: {}
45
+ };
28
46
  const useUtilityClasses = ownerState => {
29
47
  const {
30
48
  align,
@@ -40,12 +58,110 @@ const useUtilityClasses = ownerState => {
40
58
  return composeClasses(slots, getDataGridUtilityClass, classes);
41
59
  };
42
60
  let warnedOnce = false;
61
+
62
+ // GridCellWrapper is a compatibility layer for the V6 cell slot. If we can use the more efficient
63
+ // `GridCellV7`, we should. That component is a merge of `GridCellWrapper` and `GridCell`.
64
+ // TODO(v7): Remove the wrapper & cellV6 and use the cellV7 exclusively.
65
+ // TODO(v7): Removing the wrapper will break the docs performance visualization demo.
66
+ const GridCellWrapper = /*#__PURE__*/React.forwardRef((props, ref) => {
67
+ const {
68
+ column,
69
+ rowId,
70
+ editCellState
71
+ } = props;
72
+ const apiRef = useGridApiContext();
73
+ const rootProps = useGridRootProps();
74
+ const field = column.field;
75
+ const cellParamsWithAPI = useGridSelector(apiRef, () => {
76
+ // This is required because `.getCellParams` tries to get the `state.rows.tree` entry
77
+ // associated with `rowId`/`fieldId`, but this selector runs after the state has been
78
+ // updated, while `rowId`/`fieldId` reference an entry in the old state.
79
+ try {
80
+ const cellParams = apiRef.current.getCellParams(rowId, field);
81
+ const result = cellParams;
82
+ result.api = apiRef.current;
83
+ return result;
84
+ } catch (e) {
85
+ if (e instanceof MissingRowIdError) {
86
+ return EMPTY_CELL_PARAMS;
87
+ }
88
+ throw e;
89
+ }
90
+ }, objectShallowCompare);
91
+ const isSelected = useGridSelector(apiRef, () => apiRef.current.unstable_applyPipeProcessors('isCellSelected', false, {
92
+ id: rowId,
93
+ field
94
+ }));
95
+ if (cellParamsWithAPI === EMPTY_CELL_PARAMS) {
96
+ return null;
97
+ }
98
+ const {
99
+ cellMode,
100
+ hasFocus,
101
+ isEditable,
102
+ value,
103
+ formattedValue
104
+ } = cellParamsWithAPI;
105
+ const managesOwnFocus = column.type === 'actions';
106
+ const tabIndex = (cellMode === 'view' || !isEditable) && !managesOwnFocus ? cellParamsWithAPI.tabIndex : -1;
107
+ const {
108
+ classes: rootClasses,
109
+ getCellClassName
110
+ } = rootProps;
111
+ const classNames = apiRef.current.unstable_applyPipeProcessors('cellClassName', [], {
112
+ id: rowId,
113
+ field
114
+ });
115
+ if (column.cellClassName) {
116
+ classNames.push(typeof column.cellClassName === 'function' ? column.cellClassName(cellParamsWithAPI) : column.cellClassName);
117
+ }
118
+ if (getCellClassName) {
119
+ classNames.push(getCellClassName(cellParamsWithAPI));
120
+ }
121
+ let children;
122
+ if (editCellState == null && column.renderCell) {
123
+ children = column.renderCell(cellParamsWithAPI);
124
+ classNames.push(gridClasses['cell--withRenderer']);
125
+ classNames.push(rootClasses == null ? void 0 : rootClasses['cell--withRenderer']);
126
+ }
127
+ if (editCellState != null && column.renderEditCell) {
128
+ const updatedRow = apiRef.current.getRowWithUpdatedValues(rowId, column.field);
129
+
130
+ // eslint-disable-next-line @typescript-eslint/naming-convention
131
+ const editCellStateRest = _objectWithoutPropertiesLoose(editCellState, _excluded);
132
+ const params = _extends({}, cellParamsWithAPI, {
133
+ row: updatedRow
134
+ }, editCellStateRest);
135
+ children = column.renderEditCell(params);
136
+ classNames.push(gridClasses['cell--editing']);
137
+ classNames.push(rootClasses == null ? void 0 : rootClasses['cell--editing']);
138
+ }
139
+ const {
140
+ slots
141
+ } = rootProps;
142
+ const CellComponent = slots.cell;
143
+ const cellProps = _extends({}, props, {
144
+ ref,
145
+ field,
146
+ formattedValue,
147
+ hasFocus,
148
+ isEditable,
149
+ isSelected,
150
+ value,
151
+ cellMode,
152
+ children,
153
+ tabIndex,
154
+ className: clsx(classNames)
155
+ });
156
+ return /*#__PURE__*/React.createElement(CellComponent, cellProps);
157
+ });
43
158
  const GridCell = /*#__PURE__*/React.forwardRef((props, ref) => {
44
159
  var _rootProps$experiment;
45
160
  const {
46
161
  align,
47
- children,
162
+ children: childrenProp,
48
163
  colIndex,
164
+ column,
49
165
  cellMode,
50
166
  field,
51
167
  formattedValue,
@@ -71,7 +187,7 @@ const GridCell = /*#__PURE__*/React.forwardRef((props, ref) => {
71
187
  onDragEnter,
72
188
  onDragOver
73
189
  } = props,
74
- other = _objectWithoutPropertiesLoose(props, _excluded);
190
+ other = _objectWithoutPropertiesLoose(props, _excluded2);
75
191
  const valueToRender = formattedValue == null ? value : formattedValue;
76
192
  const cellRef = React.useRef(null);
77
193
  const handleRef = useForkRef(ref, cellRef);
@@ -153,24 +269,21 @@ const GridCell = /*#__PURE__*/React.forwardRef((props, ref) => {
153
269
  }
154
270
  };
155
271
  }
156
- const column = apiRef.current.getColumn(field);
157
272
  const managesOwnFocus = column.type === 'actions';
158
- const renderChildren = () => {
159
- if (children === undefined) {
160
- const valueString = valueToRender == null ? void 0 : valueToRender.toString();
161
- return /*#__PURE__*/_jsx("div", {
162
- className: classes.content,
163
- title: valueString,
164
- children: valueString
165
- });
166
- }
167
- if ( /*#__PURE__*/React.isValidElement(children) && managesOwnFocus) {
168
- return /*#__PURE__*/React.cloneElement(children, {
169
- focusElementRef
170
- });
171
- }
172
- return children;
173
- };
273
+ let children = childrenProp;
274
+ if (children === undefined) {
275
+ const valueString = valueToRender == null ? void 0 : valueToRender.toString();
276
+ children = /*#__PURE__*/_jsx("div", {
277
+ className: classes.content,
278
+ title: valueString,
279
+ children: valueString
280
+ });
281
+ }
282
+ if ( /*#__PURE__*/React.isValidElement(children) && managesOwnFocus) {
283
+ children = /*#__PURE__*/React.cloneElement(children, {
284
+ focusElementRef
285
+ });
286
+ }
174
287
  const draggableEventHandlers = disableDragEvents ? null : {
175
288
  onDragEnter: publish('cellDragEnter', onDragEnter),
176
289
  onDragOver: publish('cellDragOver', onDragOver)
@@ -184,7 +297,7 @@ const GridCell = /*#__PURE__*/React.forwardRef((props, ref) => {
184
297
  "aria-colindex": colIndex + 1,
185
298
  "aria-colspan": colSpan,
186
299
  style: style,
187
- tabIndex: (cellMode === 'view' || !isEditable) && !managesOwnFocus ? tabIndex : -1,
300
+ tabIndex: tabIndex,
188
301
  onClick: publish('cellClick', onClick),
189
302
  onDoubleClick: publish('cellDoubleClick', onDoubleClick),
190
303
  onMouseOver: publish('cellMouseOver', onMouseOver),
@@ -194,10 +307,33 @@ const GridCell = /*#__PURE__*/React.forwardRef((props, ref) => {
194
307
  onKeyUp: publish('cellKeyUp', onKeyUp)
195
308
  }, draggableEventHandlers, other, {
196
309
  onFocus: handleFocus,
197
- children: renderChildren()
310
+ children: children
198
311
  }));
199
312
  });
200
- const MemoizedCell = /*#__PURE__*/React.memo(GridCell);
313
+ const MemoizedCellWrapper = fastMemo(GridCellWrapper);
314
+ process.env.NODE_ENV !== "production" ? GridCellWrapper.propTypes = {
315
+ // ----------------------------- Warning --------------------------------
316
+ // | These PropTypes are generated from the TypeScript type definitions |
317
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
318
+ // ----------------------------------------------------------------------
319
+ align: PropTypes.oneOf(['center', 'left', 'right']),
320
+ className: PropTypes.string,
321
+ colIndex: PropTypes.number,
322
+ colSpan: PropTypes.number,
323
+ column: PropTypes.object,
324
+ disableDragEvents: PropTypes.bool,
325
+ height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
326
+ onClick: PropTypes.func,
327
+ onDoubleClick: PropTypes.func,
328
+ onDragEnter: PropTypes.func,
329
+ onDragOver: PropTypes.func,
330
+ onKeyDown: PropTypes.func,
331
+ onMouseDown: PropTypes.func,
332
+ onMouseUp: PropTypes.func,
333
+ rowId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
334
+ showRightBorder: PropTypes.bool,
335
+ width: PropTypes.number
336
+ } : void 0;
201
337
  process.env.NODE_ENV !== "production" ? GridCell.propTypes = {
202
338
  // ----------------------------- Warning --------------------------------
203
339
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -209,13 +345,255 @@ process.env.NODE_ENV !== "production" ? GridCell.propTypes = {
209
345
  className: PropTypes.string,
210
346
  colIndex: PropTypes.number,
211
347
  colSpan: PropTypes.number,
348
+ column: PropTypes.object,
349
+ disableDragEvents: PropTypes.bool,
350
+ editCellState: PropTypes.shape({
351
+ changeReason: PropTypes.oneOf(['debouncedSetEditCellValue', 'setEditCellValue']),
352
+ isProcessingProps: PropTypes.bool,
353
+ isValidating: PropTypes.bool,
354
+ value: PropTypes.any
355
+ }),
356
+ height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
357
+ onClick: PropTypes.func,
358
+ onDoubleClick: PropTypes.func,
359
+ onDragEnter: PropTypes.func,
360
+ onDragOver: PropTypes.func,
361
+ onKeyDown: PropTypes.func,
362
+ onMouseDown: PropTypes.func,
363
+ onMouseUp: PropTypes.func,
364
+ rowId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
365
+ showRightBorder: PropTypes.bool,
366
+ width: PropTypes.number
367
+ } : void 0;
368
+ export { MemoizedCellWrapper as GridCellWrapper, GridCell };
369
+ const GridCellV7 = /*#__PURE__*/React.forwardRef((props, ref) => {
370
+ var _rootProps$experiment2;
371
+ const {
372
+ column,
373
+ rowId,
374
+ editCellState,
375
+ align,
376
+ colIndex,
377
+ height,
378
+ width,
379
+ className,
380
+ showRightBorder,
381
+ colSpan,
382
+ disableDragEvents,
383
+ onClick,
384
+ onDoubleClick,
385
+ onMouseDown,
386
+ onMouseUp,
387
+ onMouseOver,
388
+ onKeyDown,
389
+ onKeyUp,
390
+ onDragEnter,
391
+ onDragOver
392
+ } = props,
393
+ other = _objectWithoutPropertiesLoose(props, _excluded3);
394
+ const apiRef = useGridApiContext();
395
+ const rootProps = useGridRootProps();
396
+ const field = column.field;
397
+ const cellParamsWithAPI = useGridSelector(apiRef, () => {
398
+ // This is required because `.getCellParams` tries to get the `state.rows.tree` entry
399
+ // associated with `rowId`/`fieldId`, but this selector runs after the state has been
400
+ // updated, while `rowId`/`fieldId` reference an entry in the old state.
401
+ try {
402
+ const cellParams = apiRef.current.getCellParams(rowId, field);
403
+ const result = cellParams;
404
+ result.api = apiRef.current;
405
+ return result;
406
+ } catch (e) {
407
+ if (e instanceof MissingRowIdError) {
408
+ return EMPTY_CELL_PARAMS;
409
+ }
410
+ throw e;
411
+ }
412
+ }, objectShallowCompare);
413
+ const isSelected = useGridSelector(apiRef, () => apiRef.current.unstable_applyPipeProcessors('isCellSelected', false, {
414
+ id: rowId,
415
+ field
416
+ }));
417
+ const {
418
+ cellMode,
419
+ hasFocus,
420
+ isEditable,
421
+ value,
422
+ formattedValue
423
+ } = cellParamsWithAPI;
424
+ const managesOwnFocus = column.type === 'actions';
425
+ const tabIndex = (cellMode === 'view' || !isEditable) && !managesOwnFocus ? cellParamsWithAPI.tabIndex : -1;
426
+ const {
427
+ classes: rootClasses,
428
+ getCellClassName
429
+ } = rootProps;
430
+ const classNames = apiRef.current.unstable_applyPipeProcessors('cellClassName', [], {
431
+ id: rowId,
432
+ field
433
+ });
434
+ if (column.cellClassName) {
435
+ classNames.push(typeof column.cellClassName === 'function' ? column.cellClassName(cellParamsWithAPI) : column.cellClassName);
436
+ }
437
+ if (getCellClassName) {
438
+ classNames.push(getCellClassName(cellParamsWithAPI));
439
+ }
440
+ const valueToRender = formattedValue == null ? value : formattedValue;
441
+ const cellRef = React.useRef(null);
442
+ const handleRef = useForkRef(ref, cellRef);
443
+ const focusElementRef = React.useRef(null);
444
+ const ownerState = {
445
+ align,
446
+ showRightBorder,
447
+ isEditable,
448
+ classes: rootProps.classes,
449
+ isSelected
450
+ };
451
+ const classes = useUtilityClasses(ownerState);
452
+ const publishMouseUp = React.useCallback(eventName => event => {
453
+ const params = apiRef.current.getCellParams(rowId, field || '');
454
+ apiRef.current.publishEvent(eventName, params, event);
455
+ if (onMouseUp) {
456
+ onMouseUp(event);
457
+ }
458
+ }, [apiRef, field, onMouseUp, rowId]);
459
+ const publishMouseDown = React.useCallback(eventName => event => {
460
+ const params = apiRef.current.getCellParams(rowId, field || '');
461
+ apiRef.current.publishEvent(eventName, params, event);
462
+ if (onMouseDown) {
463
+ onMouseDown(event);
464
+ }
465
+ }, [apiRef, field, onMouseDown, rowId]);
466
+ const publish = React.useCallback((eventName, propHandler) => event => {
467
+ // The row might have been deleted during the click
468
+ if (!apiRef.current.getRow(rowId)) {
469
+ return;
470
+ }
471
+ const params = apiRef.current.getCellParams(rowId, field || '');
472
+ apiRef.current.publishEvent(eventName, params, event);
473
+ if (propHandler) {
474
+ propHandler(event);
475
+ }
476
+ }, [apiRef, field, rowId]);
477
+ const style = {
478
+ minWidth: width,
479
+ maxWidth: width,
480
+ minHeight: height,
481
+ maxHeight: height === 'auto' ? 'none' : height // max-height doesn't support "auto"
482
+ };
483
+
484
+ React.useEffect(() => {
485
+ if (!hasFocus || cellMode === GridCellModes.Edit) {
486
+ return;
487
+ }
488
+ const doc = ownerDocument(apiRef.current.rootElementRef.current);
489
+ if (cellRef.current && !cellRef.current.contains(doc.activeElement)) {
490
+ const focusableElement = cellRef.current.querySelector('[tabindex="0"]');
491
+ const elementToFocus = focusElementRef.current || focusableElement || cellRef.current;
492
+ if (doesSupportPreventScroll()) {
493
+ elementToFocus.focus({
494
+ preventScroll: true
495
+ });
496
+ } else {
497
+ const scrollPosition = apiRef.current.getScrollPosition();
498
+ elementToFocus.focus();
499
+ apiRef.current.scroll(scrollPosition);
500
+ }
501
+ }
502
+ }, [hasFocus, cellMode, apiRef]);
503
+ if (cellParamsWithAPI === EMPTY_CELL_PARAMS) {
504
+ return null;
505
+ }
506
+ let handleFocus = other.onFocus;
507
+ if (process.env.NODE_ENV === 'test' && (_rootProps$experiment2 = rootProps.experimentalFeatures) != null && _rootProps$experiment2.warnIfFocusStateIsNotSynced) {
508
+ handleFocus = event => {
509
+ const focusedCell = gridFocusCellSelector(apiRef);
510
+ if ((focusedCell == null ? void 0 : focusedCell.id) === rowId && focusedCell.field === field) {
511
+ if (typeof other.onFocus === 'function') {
512
+ other.onFocus(event);
513
+ }
514
+ return;
515
+ }
516
+ if (!warnedOnce) {
517
+ console.warn([`MUI: The cell with id=${rowId} and field=${field} received focus.`, `According to the state, the focus should be at id=${focusedCell == null ? void 0 : focusedCell.id}, field=${focusedCell == null ? void 0 : focusedCell.field}.`, "Not syncing the state may cause unwanted behaviors since the `cellFocusIn` event won't be fired.", 'Call `fireEvent.mouseUp` before the `fireEvent.click` to sync the focus with the state.'].join('\n'));
518
+ warnedOnce = true;
519
+ }
520
+ };
521
+ }
522
+ let children;
523
+ if (editCellState == null && column.renderCell) {
524
+ children = column.renderCell(cellParamsWithAPI);
525
+ classNames.push(gridClasses['cell--withRenderer']);
526
+ classNames.push(rootClasses == null ? void 0 : rootClasses['cell--withRenderer']);
527
+ }
528
+ if (editCellState != null && column.renderEditCell) {
529
+ const updatedRow = apiRef.current.getRowWithUpdatedValues(rowId, column.field);
530
+
531
+ // eslint-disable-next-line @typescript-eslint/naming-convention
532
+ const editCellStateRest = _objectWithoutPropertiesLoose(editCellState, _excluded4);
533
+ const params = _extends({}, cellParamsWithAPI, {
534
+ row: updatedRow
535
+ }, editCellStateRest);
536
+ children = column.renderEditCell(params);
537
+ classNames.push(gridClasses['cell--editing']);
538
+ classNames.push(rootClasses == null ? void 0 : rootClasses['cell--editing']);
539
+ }
540
+ if (children === undefined) {
541
+ const valueString = valueToRender == null ? void 0 : valueToRender.toString();
542
+ children = /*#__PURE__*/_jsx("div", {
543
+ className: classes.content,
544
+ title: valueString,
545
+ children: valueString
546
+ });
547
+ }
548
+ if ( /*#__PURE__*/React.isValidElement(children) && managesOwnFocus) {
549
+ children = /*#__PURE__*/React.cloneElement(children, {
550
+ focusElementRef
551
+ });
552
+ }
553
+ const draggableEventHandlers = disableDragEvents ? null : {
554
+ onDragEnter: publish('cellDragEnter', onDragEnter),
555
+ onDragOver: publish('cellDragOver', onDragOver)
556
+ };
557
+ return /*#__PURE__*/_jsx("div", _extends({
558
+ ref: handleRef,
559
+ className: clsx(className, classNames, classes.root),
560
+ role: "cell",
561
+ "data-field": field,
562
+ "data-colindex": colIndex,
563
+ "aria-colindex": colIndex + 1,
564
+ "aria-colspan": colSpan,
565
+ style: style,
566
+ tabIndex: tabIndex,
567
+ onClick: publish('cellClick', onClick),
568
+ onDoubleClick: publish('cellDoubleClick', onDoubleClick),
569
+ onMouseOver: publish('cellMouseOver', onMouseOver),
570
+ onMouseDown: publishMouseDown('cellMouseDown'),
571
+ onMouseUp: publishMouseUp('cellMouseUp'),
572
+ onKeyDown: publish('cellKeyDown', onKeyDown),
573
+ onKeyUp: publish('cellKeyUp', onKeyUp)
574
+ }, draggableEventHandlers, other, {
575
+ onFocus: handleFocus,
576
+ children: children
577
+ }));
578
+ });
579
+ process.env.NODE_ENV !== "production" ? GridCellV7.propTypes = {
580
+ // ----------------------------- Warning --------------------------------
581
+ // | These PropTypes are generated from the TypeScript type definitions |
582
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
583
+ // ----------------------------------------------------------------------
584
+ align: PropTypes.oneOf(['center', 'left', 'right']),
585
+ className: PropTypes.string,
586
+ colIndex: PropTypes.number,
587
+ colSpan: PropTypes.number,
588
+ column: PropTypes.object,
212
589
  disableDragEvents: PropTypes.bool,
213
- field: PropTypes.string,
214
- formattedValue: PropTypes.any,
215
- hasFocus: PropTypes.bool,
590
+ editCellState: PropTypes.shape({
591
+ changeReason: PropTypes.oneOf(['debouncedSetEditCellValue', 'setEditCellValue']),
592
+ isProcessingProps: PropTypes.bool,
593
+ isValidating: PropTypes.bool,
594
+ value: PropTypes.any
595
+ }),
216
596
  height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
217
- isEditable: PropTypes.bool,
218
- isSelected: PropTypes.bool,
219
597
  onClick: PropTypes.func,
220
598
  onDoubleClick: PropTypes.func,
221
599
  onDragEnter: PropTypes.func,
@@ -225,8 +603,7 @@ process.env.NODE_ENV !== "production" ? GridCell.propTypes = {
225
603
  onMouseUp: PropTypes.func,
226
604
  rowId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
227
605
  showRightBorder: PropTypes.bool,
228
- tabIndex: PropTypes.oneOf([-1, 0]),
229
- value: PropTypes.any,
230
606
  width: PropTypes.number
231
607
  } : void 0;
232
- export { MemoizedCell as GridCell };
608
+ const MemoizedGridCellV7 = fastMemo(GridCellV7);
609
+ export { MemoizedGridCellV7 as GridCellV7 };
@@ -1,4 +1,5 @@
1
- export * from './GridCell';
1
+ export { GridCell } from './GridCell';
2
+ export type { GridCellProps } from './GridCell';
2
3
  export * from './GridBooleanCell';
3
4
  export * from './GridEditBooleanCell';
4
5
  export * from './GridEditDateCell';
@@ -1,4 +1,4 @@
1
- export * from './GridCell';
1
+ export { GridCell } from './GridCell';
2
2
  export * from './GridBooleanCell';
3
3
  export * from './GridEditBooleanCell';
4
4
  export * from './GridEditDateCell';
@@ -10,6 +10,22 @@ function getBorderColor(theme) {
10
10
  }
11
11
  return darken(alpha(theme.palette.divider, 1), 0.68);
12
12
  }
13
+ const columnHeadersStyles = {
14
+ [`.${gridClasses.columnSeparator}, .${gridClasses['columnSeparator--resizing']}`]: {
15
+ visibility: 'visible',
16
+ width: 'auto'
17
+ }
18
+ };
19
+ const columnHeaderStyles = {
20
+ [`& .${gridClasses.iconButtonContainer}`]: {
21
+ visibility: 'visible',
22
+ width: 'auto'
23
+ },
24
+ [`& .${gridClasses.menuIcon}`]: {
25
+ width: 'auto',
26
+ visibility: 'visible'
27
+ }
28
+ };
13
29
  export const GridRootStyles = styled('div', {
14
30
  name: 'MuiDataGrid',
15
31
  slot: 'Root',
@@ -51,6 +67,8 @@ export const GridRootStyles = styled('div', {
51
67
  [`& .${gridClasses['cell--rangeLeft']}`]: styles['cell--rangeLeft']
52
68
  }, {
53
69
  [`& .${gridClasses['cell--rangeRight']}`]: styles['cell--rangeRight']
70
+ }, {
71
+ [`& .${gridClasses['cell--withRightBorder']}`]: styles['cell--withRightBorder']
54
72
  }, {
55
73
  [`& .${gridClasses.cellContent}`]: styles.cellContent
56
74
  }, {
@@ -75,6 +93,8 @@ export const GridRootStyles = styled('div', {
75
93
  [`& .${gridClasses['columnHeader--sortable']}`]: styles['columnHeader--sortable']
76
94
  }, {
77
95
  [`& .${gridClasses['columnHeader--sorted']}`]: styles['columnHeader--sorted']
96
+ }, {
97
+ [`& .${gridClasses['columnHeader--withRightBorder']}`]: styles['columnHeader--withRightBorder']
78
98
  }, {
79
99
  [`& .${gridClasses.columnHeader}`]: styles.columnHeader
80
100
  }, {
@@ -200,9 +220,6 @@ export const GridRootStyles = styled('div', {
200
220
  duration: theme.transitions.duration.shorter
201
221
  })
202
222
  },
203
- [`& .${gridClasses.columnHeader}:not(.${gridClasses['columnHeader--sorted']}):hover .${gridClasses.sortIcon}`]: {
204
- opacity: 0.5
205
- },
206
223
  [`& .${gridClasses.columnHeaderTitleContainer}`]: {
207
224
  display: 'flex',
208
225
  alignItems: 'center',
@@ -266,9 +283,16 @@ export const GridRootStyles = styled('div', {
266
283
  justifyContent: 'center',
267
284
  color: borderColor
268
285
  },
269
- [`& .${gridClasses.columnHeaders}:hover .${gridClasses.columnSeparator}, .${gridClasses['columnSeparator--resizing']}`]: {
270
- visibility: 'visible',
271
- width: 'auto'
286
+ '@media (hover: hover)': {
287
+ [`& .${gridClasses.columnHeaders}:hover`]: columnHeadersStyles,
288
+ [`& .${gridClasses.columnHeader}:hover`]: columnHeaderStyles,
289
+ [`& .${gridClasses.columnHeader}:not(.${gridClasses['columnHeader--sorted']}):hover .${gridClasses.sortIcon}`]: {
290
+ opacity: 0.5
291
+ }
292
+ },
293
+ '@media (hover: none)': {
294
+ [`& .${gridClasses.columnHeaders}`]: columnHeadersStyles,
295
+ [`& .${gridClasses.columnHeader}`]: columnHeaderStyles
272
296
  },
273
297
  [`& .${gridClasses['columnSeparator--sideLeft']}`]: {
274
298
  left: -12
@@ -304,16 +328,6 @@ export const GridRootStyles = styled('div', {
304
328
  display: 'flex',
305
329
  alignItems: 'center'
306
330
  },
307
- [`& .${gridClasses.columnHeader}:hover`]: {
308
- [`& .${gridClasses.iconButtonContainer}`]: {
309
- visibility: 'visible',
310
- width: 'auto'
311
- },
312
- [`& .${gridClasses.menuIcon}`]: {
313
- width: 'auto',
314
- visibility: 'visible'
315
- }
316
- },
317
331
  [`.${gridClasses.menuOpen}`]: {
318
332
  visibility: 'visible',
319
333
  width: 'auto'
@@ -24,7 +24,7 @@ function GridColumnHeaderMenu({
24
24
  apiRef.current.hideColumnMenu();
25
25
  }
26
26
  }, [apiRef, target]);
27
- if (!target) {
27
+ if (!target || !colDef) {
28
28
  return null;
29
29
  }
30
30
  return /*#__PURE__*/_jsx(GridMenu, {
@@ -14,8 +14,8 @@ import { GridToolbarQuickFilter } from './GridToolbarQuickFilter';
14
14
  import { jsx as _jsx } from "react/jsx-runtime";
15
15
  import { jsxs as _jsxs } from "react/jsx-runtime";
16
16
  const GridToolbar = /*#__PURE__*/React.forwardRef(function GridToolbar(props, ref) {
17
- // TODO v6: think about where export option should be passed.
18
- // from componentProps={{ toolbarExport: { ...exportOption} }} seems to be more appropriate
17
+ // TODO v7: think about where export option should be passed.
18
+ // from slotProps={{ toolbarExport: { ...exportOption } }} seems to be more appropriate
19
19
  const {
20
20
  csvOptions,
21
21
  printOptions,