@mui/x-data-grid-pro 5.8.0 → 5.11.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 (170) hide show
  1. package/CHANGELOG.md +333 -66
  2. package/DataGridPro/DataGridPro.d.ts +1 -1
  3. package/DataGridPro/DataGridPro.js +51 -3
  4. package/DataGridPro/useDataGridProComponent.js +9 -4
  5. package/DataGridPro/useDataGridProProps.js +20 -5
  6. package/LICENSE +12 -0
  7. package/README.md +7 -5
  8. package/components/DataGridProColumnHeaders.js +2 -8
  9. package/components/DataGridProVirtualScroller.js +7 -7
  10. package/components/GridDetailPanelToggleCell.js +13 -2
  11. package/components/GridGroupingCriteriaCell.js +2 -2
  12. package/components/GridRowReorderCell.d.ts +5 -0
  13. package/components/GridRowReorderCell.js +72 -0
  14. package/components/GridTreeDataGroupingCell.js +15 -4
  15. package/hooks/features/columnPinning/useGridColumnPinning.js +4 -4
  16. package/hooks/features/columnReorder/useGridColumnReorder.d.ts +0 -1
  17. package/hooks/features/columnReorder/useGridColumnReorder.js +8 -9
  18. package/hooks/features/columnResize/useGridColumnResize.d.ts +0 -1
  19. package/hooks/features/columnResize/useGridColumnResize.js +31 -20
  20. package/hooks/features/detailPanel/useGridDetailPanel.js +14 -6
  21. package/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  22. package/hooks/features/index.d.ts +1 -1
  23. package/hooks/features/index.js +1 -1
  24. package/hooks/features/infiniteLoader/useGridInfiniteLoader.d.ts +0 -1
  25. package/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -5
  26. package/hooks/features/rowGrouping/createGroupingColDef.d.ts +1 -1
  27. package/hooks/features/rowGrouping/gridRowGroupingInterfaces.d.ts +1 -1
  28. package/hooks/features/rowGrouping/gridRowGroupingUtils.js +4 -4
  29. package/hooks/features/rowGrouping/useGridRowGrouping.d.ts +0 -2
  30. package/hooks/features/rowGrouping/useGridRowGrouping.js +8 -12
  31. package/hooks/features/rowGrouping/useGridRowGroupingPreProcessors.js +2 -2
  32. package/hooks/features/rowReorder/gridRowReorderColDef.d.ts +2 -0
  33. package/hooks/features/rowReorder/gridRowReorderColDef.js +18 -0
  34. package/hooks/features/rowReorder/index.d.ts +1 -0
  35. package/hooks/features/rowReorder/index.js +1 -0
  36. package/hooks/features/rowReorder/useGridRowReorder.d.ts +8 -0
  37. package/hooks/features/rowReorder/useGridRowReorder.js +111 -0
  38. package/hooks/features/rowReorder/useGridRowReorderPreProcessors.d.ts +4 -0
  39. package/hooks/features/rowReorder/useGridRowReorderPreProcessors.js +51 -0
  40. package/hooks/features/treeData/useGridTreeData.d.ts +0 -3
  41. package/hooks/features/treeData/useGridTreeData.js +2 -8
  42. package/index.d.ts +6 -1
  43. package/index.js +7 -3
  44. package/internals/index.d.ts +19 -0
  45. package/internals/index.js +17 -0
  46. package/internals/package.json +6 -0
  47. package/legacy/DataGridPro/DataGridPro.js +51 -3
  48. package/legacy/DataGridPro/useDataGridProComponent.js +9 -4
  49. package/legacy/DataGridPro/useDataGridProProps.js +20 -5
  50. package/legacy/components/DataGridProColumnHeaders.js +2 -8
  51. package/legacy/components/DataGridProVirtualScroller.js +7 -7
  52. package/legacy/components/GridDetailPanelToggleCell.js +13 -2
  53. package/legacy/components/GridGroupingCriteriaCell.js +2 -2
  54. package/legacy/components/GridRowReorderCell.js +74 -0
  55. package/legacy/components/GridTreeDataGroupingCell.js +15 -4
  56. package/legacy/hooks/features/columnPinning/useGridColumnPinning.js +4 -4
  57. package/legacy/hooks/features/columnReorder/useGridColumnReorder.js +8 -9
  58. package/legacy/hooks/features/columnResize/useGridColumnResize.js +31 -20
  59. package/legacy/hooks/features/detailPanel/useGridDetailPanel.js +14 -6
  60. package/legacy/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  61. package/legacy/hooks/features/index.js +1 -1
  62. package/legacy/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -5
  63. package/legacy/hooks/features/rowGrouping/gridRowGroupingUtils.js +5 -5
  64. package/legacy/hooks/features/rowGrouping/useGridRowGrouping.js +8 -12
  65. package/legacy/hooks/features/rowGrouping/useGridRowGroupingPreProcessors.js +2 -2
  66. package/legacy/hooks/features/rowReorder/gridRowReorderColDef.js +20 -0
  67. package/legacy/hooks/features/rowReorder/index.js +1 -0
  68. package/legacy/hooks/features/rowReorder/useGridRowReorder.js +115 -0
  69. package/legacy/hooks/features/rowReorder/useGridRowReorderPreProcessors.js +52 -0
  70. package/legacy/hooks/features/treeData/useGridTreeData.js +2 -8
  71. package/legacy/index.js +7 -3
  72. package/legacy/internals/index.js +17 -0
  73. package/legacy/models/gridRowOrderChangeParams.js +1 -0
  74. package/legacy/models/index.js +1 -2
  75. package/legacy/typeOverloads/index.js +1 -0
  76. package/legacy/utils/domUtils.js +30 -3
  77. package/legacy/utils/index.js +1 -0
  78. package/legacy/utils/releaseInfo.js +1 -1
  79. package/legacy/utils/tree/buildRowTree.js +11 -4
  80. package/legacy/utils/tree/index.js +1 -0
  81. package/models/dataGridProProps.d.ts +36 -24
  82. package/models/gridApiPro.d.ts +3 -2
  83. package/models/gridRowOrderChangeParams.d.ts +18 -0
  84. package/models/gridRowOrderChangeParams.js +1 -0
  85. package/models/gridStatePro.d.ts +4 -3
  86. package/models/index.d.ts +1 -2
  87. package/models/index.js +1 -2
  88. package/modern/DataGridPro/DataGridPro.js +51 -3
  89. package/modern/DataGridPro/useDataGridProComponent.js +9 -4
  90. package/modern/DataGridPro/useDataGridProProps.js +16 -3
  91. package/modern/components/DataGridProColumnHeaders.js +2 -8
  92. package/modern/components/DataGridProVirtualScroller.js +7 -7
  93. package/modern/components/GridDetailPanelToggleCell.js +13 -2
  94. package/modern/components/GridGroupingCriteriaCell.js +2 -2
  95. package/modern/components/GridRowReorderCell.js +72 -0
  96. package/modern/components/GridTreeDataGroupingCell.js +15 -4
  97. package/modern/hooks/features/columnPinning/useGridColumnPinning.js +4 -4
  98. package/modern/hooks/features/columnReorder/useGridColumnReorder.js +8 -9
  99. package/modern/hooks/features/columnResize/useGridColumnResize.js +31 -20
  100. package/modern/hooks/features/detailPanel/useGridDetailPanel.js +14 -6
  101. package/modern/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  102. package/modern/hooks/features/index.js +1 -1
  103. package/modern/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -5
  104. package/modern/hooks/features/rowGrouping/gridRowGroupingUtils.js +4 -4
  105. package/modern/hooks/features/rowGrouping/useGridRowGrouping.js +8 -12
  106. package/modern/hooks/features/rowGrouping/useGridRowGroupingPreProcessors.js +2 -2
  107. package/modern/hooks/features/rowReorder/gridRowReorderColDef.js +18 -0
  108. package/modern/hooks/features/rowReorder/index.js +1 -0
  109. package/modern/hooks/features/rowReorder/useGridRowReorder.js +111 -0
  110. package/modern/hooks/features/rowReorder/useGridRowReorderPreProcessors.js +51 -0
  111. package/modern/hooks/features/treeData/useGridTreeData.js +2 -8
  112. package/modern/index.js +7 -3
  113. package/modern/internals/index.js +17 -0
  114. package/modern/models/gridRowOrderChangeParams.js +1 -0
  115. package/modern/models/index.js +1 -2
  116. package/modern/typeOverloads/index.js +1 -0
  117. package/modern/utils/domUtils.js +30 -3
  118. package/modern/utils/index.js +1 -0
  119. package/modern/utils/releaseInfo.js +1 -1
  120. package/modern/utils/tree/buildRowTree.js +9 -2
  121. package/modern/utils/tree/index.js +1 -0
  122. package/node/DataGridPro/DataGridPro.js +51 -3
  123. package/node/DataGridPro/useDataGridProComponent.js +12 -5
  124. package/node/DataGridPro/useDataGridProProps.js +21 -5
  125. package/node/components/DataGridProColumnHeaders.js +1 -7
  126. package/node/components/DataGridProVirtualScroller.js +6 -6
  127. package/node/components/GridDetailPanelToggleCell.js +13 -2
  128. package/node/components/GridGroupingCriteriaCell.js +1 -1
  129. package/node/components/GridRowReorderCell.js +92 -0
  130. package/node/components/GridTreeDataGroupingCell.js +14 -3
  131. package/node/hooks/features/columnPinning/useGridColumnPinning.js +3 -3
  132. package/node/hooks/features/columnReorder/useGridColumnReorder.js +7 -8
  133. package/node/hooks/features/columnResize/useGridColumnResize.js +30 -19
  134. package/node/hooks/features/detailPanel/useGridDetailPanel.js +13 -5
  135. package/node/hooks/features/detailPanel/useGridDetailPanelCache.js +1 -1
  136. package/node/hooks/features/index.js +4 -4
  137. package/node/hooks/features/infiniteLoader/useGridInfiniteLoader.js +3 -4
  138. package/node/hooks/features/rowGrouping/gridRowGroupingUtils.js +4 -4
  139. package/node/hooks/features/rowGrouping/useGridRowGrouping.js +7 -11
  140. package/node/hooks/features/rowGrouping/useGridRowGroupingPreProcessors.js +4 -4
  141. package/node/hooks/features/rowReorder/gridRowReorderColDef.js +31 -0
  142. package/node/hooks/features/rowReorder/index.js +18 -0
  143. package/node/hooks/features/rowReorder/useGridRowReorder.js +126 -0
  144. package/node/hooks/features/rowReorder/useGridRowReorderPreProcessors.js +70 -0
  145. package/node/hooks/features/treeData/useGridTreeData.js +1 -6
  146. package/node/index.js +45 -3
  147. package/node/internals/index.js +193 -0
  148. package/node/models/gridRowOrderChangeParams.js +5 -0
  149. package/node/models/index.js +4 -4
  150. package/node/typeOverloads/index.js +18 -0
  151. package/node/utils/domUtils.js +30 -3
  152. package/node/utils/index.js +18 -0
  153. package/node/utils/releaseInfo.js +1 -1
  154. package/node/utils/tree/buildRowTree.js +12 -2
  155. package/node/utils/tree/index.js +13 -0
  156. package/package.json +8 -8
  157. package/typeOverloads/index.d.ts +1 -0
  158. package/typeOverloads/index.js +1 -0
  159. package/typeOverloads/modules.d.ts +41 -15
  160. package/typeOverloads/package.json +6 -0
  161. package/utils/domUtils.d.ts +2 -1
  162. package/utils/domUtils.js +30 -3
  163. package/utils/index.d.ts +1 -0
  164. package/utils/index.js +1 -0
  165. package/utils/package.json +6 -0
  166. package/utils/releaseInfo.js +1 -1
  167. package/utils/tree/buildRowTree.d.ts +1 -0
  168. package/utils/tree/buildRowTree.js +9 -2
  169. package/utils/tree/index.d.ts +1 -0
  170. package/utils/tree/index.js +1 -0
@@ -0,0 +1,72 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { unstable_composeClasses as composeClasses } from '@mui/material';
4
+ import { gridRowTreeDepthSelector, gridSortModelSelector, useGridApiContext, useGridSelector, getDataGridUtilityClass, gridEditRowsStateSelector } from '@mui/x-data-grid';
5
+ import { useGridRootProps } from '../hooks/utils/useGridRootProps';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
8
+
9
+ const useUtilityClasses = ownerState => {
10
+ const {
11
+ isDraggable,
12
+ classes
13
+ } = ownerState;
14
+ const slots = {
15
+ root: ['rowReorderCell', isDraggable && 'rowReorderCell--draggable'],
16
+ placeholder: ['rowReorderCellPlaceholder']
17
+ };
18
+ return composeClasses(slots, getDataGridUtilityClass, classes);
19
+ };
20
+
21
+ const GridRowReorderCell = params => {
22
+ const apiRef = useGridApiContext();
23
+ const rootProps = useGridRootProps();
24
+ const sortModel = useGridSelector(apiRef, gridSortModelSelector);
25
+ const treeDepth = useGridSelector(apiRef, gridRowTreeDepthSelector);
26
+ const editRowsState = useGridSelector(apiRef, gridEditRowsStateSelector); // eslint-disable-next-line no-underscore-dangle
27
+
28
+ const cellValue = params.row.__reorder__ || params.id; // TODO: remove sortModel and treeDepth checks once row reorder is compatible
29
+
30
+ const isDraggable = !!rootProps.rowReordering && !sortModel.length && treeDepth === 1 && Object.keys(editRowsState).length === 0;
31
+ const ownerState = {
32
+ isDraggable,
33
+ classes: rootProps.classes
34
+ };
35
+ const classes = useUtilityClasses(ownerState);
36
+ const publish = React.useCallback((eventName, propHandler) => event => {
37
+ // Ignore portal
38
+ // The target is not an element when triggered by a Select inside the cell
39
+ // See https://github.com/mui/material-ui/issues/10534
40
+ if (event.target.nodeType === 1 && !event.currentTarget.contains(event.target)) {
41
+ return;
42
+ } // The row might have been deleted
43
+
44
+
45
+ if (!apiRef.current.getRow(params.row.id)) {
46
+ return;
47
+ }
48
+
49
+ apiRef.current.publishEvent(eventName, apiRef.current.getRowParams(params.row.id), event);
50
+
51
+ if (propHandler) {
52
+ propHandler(event);
53
+ }
54
+ }, [apiRef, params.row.id]);
55
+ const draggableEventHandlers = {
56
+ onDragStart: publish('rowDragStart'),
57
+ onDragOver: publish('rowDragOver'),
58
+ onDragEnd: publish('rowDragEnd')
59
+ };
60
+ return /*#__PURE__*/_jsxs("div", _extends({
61
+ className: classes.root,
62
+ draggable: isDraggable
63
+ }, draggableEventHandlers, {
64
+ children: [/*#__PURE__*/_jsx(rootProps.components.RowReorderIcon, {}), /*#__PURE__*/_jsx("div", {
65
+ className: classes.placeholder,
66
+ children: cellValue
67
+ })]
68
+ }));
69
+ };
70
+
71
+ export { GridRowReorderCell };
72
+ export const renderRowReorderCell = params => /*#__PURE__*/_jsx(GridRowReorderCell, _extends({}, params));
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { unstable_composeClasses as composeClasses } from '@mui/material';
4
4
  import IconButton from '@mui/material/IconButton';
5
5
  import Box from '@mui/material/Box';
6
- import { useGridSelector, gridFilteredDescendantCountLookupSelector, getDataGridUtilityClass, GridEvents } from '@mui/x-data-grid';
6
+ import { useGridSelector, gridFilteredDescendantCountLookupSelector, getDataGridUtilityClass } from '@mui/x-data-grid';
7
7
  import { isNavigationKey } from '@mui/x-data-grid/internals';
8
8
  import { useGridRootProps } from '../hooks/utils/useGridRootProps';
9
9
  import { useGridApiContext } from '../hooks/utils/useGridApiContext';
@@ -45,7 +45,7 @@ const GridTreeDataGroupingCell = props => {
45
45
  }
46
46
 
47
47
  if (isNavigationKey(event.key) && !event.shiftKey) {
48
- apiRef.current.publishEvent(GridEvents.cellNavigationKeyDown, props, event);
48
+ apiRef.current.publishEvent('cellNavigationKeyDown', props, event);
49
49
  }
50
50
  };
51
51
 
@@ -105,10 +105,21 @@ process.env.NODE_ENV !== "production" ? GridTreeDataGroupingCell.propTypes = {
105
105
  */
106
106
  field: PropTypes.string.isRequired,
107
107
 
108
+ /**
109
+ * A ref allowing to set imperative focus.
110
+ * It can be passed to the element that should receive focus.
111
+ * @ignore - do not document.
112
+ */
113
+ focusElementRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
114
+ current: PropTypes.shape({
115
+ focus: PropTypes.func.isRequired
116
+ })
117
+ })]),
118
+
108
119
  /**
109
120
  * The cell value formatted with the column valueFormatter.
110
121
  */
111
- formattedValue: PropTypes.any.isRequired,
122
+ formattedValue: PropTypes.any,
112
123
 
113
124
  /**
114
125
  * Get the cell value of a row and field.
@@ -153,6 +164,6 @@ process.env.NODE_ENV !== "production" ? GridTreeDataGroupingCell.propTypes = {
153
164
  /**
154
165
  * The cell value, but if the column has valueGetter, use getValue.
155
166
  */
156
- value: PropTypes.any.isRequired
167
+ value: PropTypes.any
157
168
  } : void 0;
158
169
  export { GridTreeDataGroupingCell };
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import MuiDivider from '@mui/material/Divider';
4
- import { useGridSelector, gridVisibleColumnDefinitionsSelector, gridColumnsTotalWidthSelector, gridColumnPositionsSelector, gridVisibleColumnFieldsSelector, gridClasses, GridEvents, useGridApiMethod, useGridApiEventHandler } from '@mui/x-data-grid';
4
+ import { useGridSelector, gridVisibleColumnDefinitionsSelector, gridColumnsTotalWidthSelector, gridColumnPositionsSelector, gridVisibleColumnFieldsSelector, gridClasses, useGridApiMethod, useGridApiEventHandler } from '@mui/x-data-grid';
5
5
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
6
6
  import { GridColumnPinningMenuItems } from '../../../components/GridColumnPinningMenuItems';
7
7
  import { GridPinnedPosition } from './gridColumnPinningInterface';
@@ -77,8 +77,8 @@ export const useGridColumnPinning = (apiRef, props) => {
77
77
  const handleMouseLeave = React.useCallback((params, event) => {
78
78
  updateHoveredClassOnSiblingRows(event);
79
79
  }, [updateHoveredClassOnSiblingRows]);
80
- useGridApiEventHandler(apiRef, GridEvents.rowMouseEnter, handleMouseEnter);
81
- useGridApiEventHandler(apiRef, GridEvents.rowMouseLeave, handleMouseLeave);
80
+ useGridApiEventHandler(apiRef, 'rowMouseEnter', handleMouseEnter);
81
+ useGridApiEventHandler(apiRef, 'rowMouseLeave', handleMouseLeave);
82
82
  /**
83
83
  * PRE-PROCESSING
84
84
  */
@@ -185,7 +185,7 @@ export const useGridColumnPinning = (apiRef, props) => {
185
185
  propModel: props.pinnedColumns,
186
186
  propOnChange: props.onPinnedColumnsChange,
187
187
  stateSelector: gridPinnedColumnsSelector,
188
- changeEvent: GridEvents.pinnedColumnsChange
188
+ changeEvent: 'pinnedColumnsChange'
189
189
  });
190
190
  const checkIfEnabled = React.useCallback(methodName => {
191
191
  if (props.disableColumnPinning) {
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { unstable_composeClasses as composeClasses } from '@mui/material';
4
- import { useGridApiEventHandler, getDataGridUtilityClass, GridEvents, useGridLogger } from '@mui/x-data-grid';
4
+ import { useGridApiEventHandler, getDataGridUtilityClass, useGridLogger } from '@mui/x-data-grid';
5
5
  import { gridColumnReorderDragColSelector } from './columnReorderSelector';
6
6
  const CURSOR_MOVE_DIRECTION_LEFT = 'left';
7
7
  const CURSOR_MOVE_DIRECTION_RIGHT = 'right';
@@ -28,7 +28,6 @@ export const columnReorderStateInitializer = state => _extends({}, state, {
28
28
  }
29
29
  });
30
30
  /**
31
- * Only available in DataGridPro
32
31
  * @requires useGridColumns (method)
33
32
  */
34
33
 
@@ -50,7 +49,7 @@ export const useGridColumnReorder = (apiRef, props) => {
50
49
  clearTimeout(removeDnDStylesTimeout.current);
51
50
  };
52
51
  }, []);
53
- const handleColumnHeaderDragStart = React.useCallback((params, event) => {
52
+ const handleDragStart = React.useCallback((params, event) => {
54
53
  if (props.disableColumnReorder || params.colDef.disableReorder) {
55
54
  return;
56
55
  }
@@ -156,10 +155,10 @@ export const useGridColumnReorder = (apiRef, props) => {
156
155
  }));
157
156
  apiRef.current.forceUpdate();
158
157
  }, [props.disableColumnReorder, logger, apiRef]);
159
- useGridApiEventHandler(apiRef, GridEvents.columnHeaderDragStart, handleColumnHeaderDragStart);
160
- useGridApiEventHandler(apiRef, GridEvents.columnHeaderDragEnter, handleDragEnter);
161
- useGridApiEventHandler(apiRef, GridEvents.columnHeaderDragOver, handleDragOver);
162
- useGridApiEventHandler(apiRef, GridEvents.columnHeaderDragEnd, handleDragEnd);
163
- useGridApiEventHandler(apiRef, GridEvents.cellDragEnter, handleDragEnter);
164
- useGridApiEventHandler(apiRef, GridEvents.cellDragOver, handleDragOver);
158
+ useGridApiEventHandler(apiRef, 'columnHeaderDragStart', handleDragStart);
159
+ useGridApiEventHandler(apiRef, 'columnHeaderDragEnter', handleDragEnter);
160
+ useGridApiEventHandler(apiRef, 'columnHeaderDragOver', handleDragOver);
161
+ useGridApiEventHandler(apiRef, 'columnHeaderDragEnd', handleDragEnd);
162
+ useGridApiEventHandler(apiRef, 'cellDragEnter', handleDragEnter);
163
+ useGridApiEventHandler(apiRef, 'cellDragOver', handleDragOver);
165
164
  };
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { ownerDocument, useEventCallback } from '@mui/material/utils';
4
- import { GridEvents, gridClasses, GridColumnHeaderSeparatorSides, useGridApiEventHandler, useGridApiOptionHandler, useGridNativeEventListener, useGridLogger } from '@mui/x-data-grid';
4
+ import { gridClasses, GridColumnHeaderSeparatorSides, useGridApiEventHandler, useGridApiOptionHandler, useGridNativeEventListener, useGridLogger } from '@mui/x-data-grid';
5
5
  import { clamp, findParentElementFromClassName } from '@mui/x-data-grid/internals';
6
6
  import { findGridCellElementsFromCol, getFieldFromHeaderElem, findHeaderElementFromField } from '../../../utils/domUtils';
7
7
  // TODO: remove support for Safari < 13.
@@ -80,7 +80,6 @@ export const columnResizeStateInitializer = state => _extends({}, state, {
80
80
  }
81
81
  });
82
82
  /**
83
- * Only available in DataGridPro
84
83
  * @requires useGridColumns (method, event)
85
84
  * TODO: improve experience for last column
86
85
  */
@@ -100,17 +99,29 @@ export const useGridColumnResize = (apiRef, props) => {
100
99
 
101
100
  const updateWidth = newWidth => {
102
101
  logger.debug(`Updating width to ${newWidth} for col ${colDefRef.current.field}`);
102
+ const prevWidth = colElementRef.current.offsetWidth;
103
+ const widthDiff = newWidth - prevWidth;
103
104
  colDefRef.current.computedWidth = newWidth;
104
105
  colDefRef.current.width = newWidth;
105
- colDefRef.current.flex = undefined;
106
+ colDefRef.current.flex = 0;
106
107
  colElementRef.current.style.width = `${newWidth}px`;
107
108
  colElementRef.current.style.minWidth = `${newWidth}px`;
108
109
  colElementRef.current.style.maxWidth = `${newWidth}px`;
109
110
  colCellElementsRef.current.forEach(element => {
110
111
  const div = element;
111
- div.style.width = `${newWidth}px`;
112
- div.style.minWidth = `${newWidth}px`;
113
- div.style.maxWidth = `${newWidth}px`;
112
+ let finalWidth;
113
+
114
+ if (div.getAttribute('aria-colspan') === '1') {
115
+ finalWidth = `${newWidth}px`;
116
+ } else {
117
+ // Cell with colspan > 1 cannot be just updated width new width.
118
+ // Instead, we add width diff to the current width.
119
+ finalWidth = `${div.offsetWidth + widthDiff}px`;
120
+ }
121
+
122
+ div.style.width = finalWidth;
123
+ div.style.minWidth = finalWidth;
124
+ div.style.maxWidth = finalWidth;
114
125
  });
115
126
  };
116
127
 
@@ -120,10 +131,10 @@ export const useGridColumnResize = (apiRef, props) => {
120
131
  apiRef.current.updateColumn(colDefRef.current);
121
132
  clearTimeout(stopResizeEventTimeout.current);
122
133
  stopResizeEventTimeout.current = setTimeout(() => {
123
- apiRef.current.publishEvent(GridEvents.columnResizeStop, null, nativeEvent);
134
+ apiRef.current.publishEvent('columnResizeStop', null, nativeEvent);
124
135
 
125
136
  if (colDefRef.current) {
126
- apiRef.current.publishEvent(GridEvents.columnWidthChange, {
137
+ apiRef.current.publishEvent('columnWidthChange', {
127
138
  element: colElementRef.current,
128
139
  colDef: colDefRef.current,
129
140
  width: colDefRef.current?.computedWidth
@@ -147,7 +158,7 @@ export const useGridColumnResize = (apiRef, props) => {
147
158
  colDef: colDefRef.current,
148
159
  width: newWidth
149
160
  };
150
- apiRef.current.publishEvent(GridEvents.columnResize, params, nativeEvent);
161
+ apiRef.current.publishEvent('columnResize', params, nativeEvent);
151
162
  });
152
163
  const handleColumnResizeMouseDown = useEventCallback(({
153
164
  colDef
@@ -165,12 +176,12 @@ export const useGridColumnResize = (apiRef, props) => {
165
176
 
166
177
  event.preventDefault();
167
178
  logger.debug(`Start Resize on col ${colDef.field}`);
168
- apiRef.current.publishEvent(GridEvents.columnResizeStart, {
179
+ apiRef.current.publishEvent('columnResizeStart', {
169
180
  field: colDef.field
170
181
  }, event);
171
182
  colDefRef.current = colDef;
172
183
  colElementRef.current = apiRef.current.columnHeadersContainerElementRef?.current.querySelector(`[data-field="${colDef.field}"]`);
173
- colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current);
184
+ colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
174
185
  const doc = ownerDocument(apiRef.current.rootElementRef.current);
175
186
  doc.body.style.cursor = 'col-resize';
176
187
  separatorSide.current = getSeparatorSide(event.currentTarget);
@@ -190,7 +201,7 @@ export const useGridColumnResize = (apiRef, props) => {
190
201
  apiRef.current.updateColumn(colDefRef.current);
191
202
  clearTimeout(stopResizeEventTimeout.current);
192
203
  stopResizeEventTimeout.current = setTimeout(() => {
193
- apiRef.current.publishEvent(GridEvents.columnResizeStop, null, nativeEvent);
204
+ apiRef.current.publishEvent('columnResizeStop', null, nativeEvent);
194
205
  });
195
206
  logger.debug(`Updating col ${colDefRef.current.field} with new width: ${colDefRef.current.width}`);
196
207
  });
@@ -215,7 +226,7 @@ export const useGridColumnResize = (apiRef, props) => {
215
226
  colDef: colDefRef.current,
216
227
  width: newWidth
217
228
  };
218
- apiRef.current.publishEvent(GridEvents.columnResize, params, nativeEvent);
229
+ apiRef.current.publishEvent('columnResize', params, nativeEvent);
219
230
  });
220
231
  const handleTouchStart = useEventCallback(event => {
221
232
  const cellSeparator = findParentElementFromClassName(event.target, gridClasses['columnSeparator--resizable']); // Let the event bubble if the target is not a col separator
@@ -240,12 +251,12 @@ export const useGridColumnResize = (apiRef, props) => {
240
251
  const field = getFieldFromHeaderElem(colElementRef.current);
241
252
  const colDef = apiRef.current.getColumn(field);
242
253
  logger.debug(`Start Resize on col ${colDef.field}`);
243
- apiRef.current.publishEvent(GridEvents.columnResizeStart, {
254
+ apiRef.current.publishEvent('columnResizeStart', {
244
255
  field
245
256
  }, event);
246
257
  colDefRef.current = colDef;
247
258
  colElementRef.current = findHeaderElementFromField(apiRef.current.columnHeadersElementRef?.current, colDef.field);
248
- colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current);
259
+ colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
249
260
  separatorSide.current = getSeparatorSide(event.target);
250
261
  initialOffsetToSeparator.current = computeOffsetToSeparator(touch.clientX, colElementRef.current.getBoundingClientRect(), separatorSide.current);
251
262
  const doc = ownerDocument(event.currentTarget);
@@ -287,9 +298,9 @@ export const useGridColumnResize = (apiRef, props) => {
287
298
  useGridNativeEventListener(apiRef, () => apiRef.current.columnHeadersElementRef?.current, 'touchstart', handleTouchStart, {
288
299
  passive: doesSupportTouchActionNone()
289
300
  });
290
- useGridApiEventHandler(apiRef, GridEvents.columnSeparatorMouseDown, handleColumnResizeMouseDown);
291
- useGridApiEventHandler(apiRef, GridEvents.columnResizeStart, handleResizeStart);
292
- useGridApiEventHandler(apiRef, GridEvents.columnResizeStop, handleResizeStop);
293
- useGridApiOptionHandler(apiRef, GridEvents.columnResize, props.onColumnResize);
294
- useGridApiOptionHandler(apiRef, GridEvents.columnWidthChange, props.onColumnWidthChange);
301
+ useGridApiEventHandler(apiRef, 'columnSeparatorMouseDown', handleColumnResizeMouseDown);
302
+ useGridApiEventHandler(apiRef, 'columnResizeStart', handleResizeStart);
303
+ useGridApiEventHandler(apiRef, 'columnResizeStop', handleResizeStop);
304
+ useGridApiOptionHandler(apiRef, 'columnResize', props.onColumnResize);
305
+ useGridApiOptionHandler(apiRef, 'columnWidthChange', props.onColumnWidthChange);
295
306
  };
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { GridEvents, useGridSelector, useGridApiEventHandler, useGridApiMethod } from '@mui/x-data-grid';
3
+ import { useGridSelector, useGridApiEventHandler, useGridApiMethod } from '@mui/x-data-grid';
4
4
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
5
5
  import { GRID_DETAIL_PANEL_TOGGLE_FIELD } from './gridDetailPanelToggleColDef';
6
6
  import { gridDetailPanelExpandedRowIdsSelector, gridDetailPanelExpandedRowsContentCacheSelector, gridDetailPanelExpandedRowsHeightCacheSelector } from './gridDetailPanelSelector';
@@ -33,14 +33,22 @@ export const useGridDetailPanel = (apiRef, props) => {
33
33
  apiRef.current.toggleDetailPanel(params.id);
34
34
  }, [apiRef, contentCache, props.getDetailPanelContent]);
35
35
  const handleCellKeyDown = React.useCallback((params, event) => {
36
- if (!event.ctrlKey || event.key !== 'Enter' || props.getDetailPanelContent == null) {
36
+ if (props.getDetailPanelContent == null) {
37
37
  return;
38
38
  }
39
39
 
40
- apiRef.current.toggleDetailPanel(params.id);
40
+ if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {
41
+ // TODO v6: only support Space on the detail toggle
42
+ apiRef.current.toggleDetailPanel(params.id);
43
+ return;
44
+ }
45
+
46
+ if (params.field === GRID_DETAIL_PANEL_TOGGLE_FIELD && event.key === ' ') {
47
+ apiRef.current.toggleDetailPanel(params.id);
48
+ }
41
49
  }, [apiRef, props.getDetailPanelContent]);
42
- useGridApiEventHandler(apiRef, GridEvents.cellClick, handleCellClick);
43
- useGridApiEventHandler(apiRef, GridEvents.cellKeyDown, handleCellKeyDown);
50
+ useGridApiEventHandler(apiRef, 'cellClick', handleCellClick);
51
+ useGridApiEventHandler(apiRef, 'cellKeyDown', handleCellKeyDown);
44
52
  const addDetailHeight = React.useCallback((initialValue, row) => {
45
53
  if (expandedRowIds.length === 0 || !expandedRowIds.includes(row.id)) {
46
54
  return _extends({}, initialValue, {
@@ -60,7 +68,7 @@ export const useGridDetailPanel = (apiRef, props) => {
60
68
  propModel: props.detailPanelExpandedRowIds,
61
69
  propOnChange: props.onDetailPanelExpandedRowIdsChange,
62
70
  stateSelector: gridDetailPanelExpandedRowIdsSelector,
63
- changeEvent: GridEvents.detailPanelsExpandedRowIdsChange
71
+ changeEvent: 'detailPanelsExpandedRowIdsChange'
64
72
  });
65
73
  const toggleDetailPanel = React.useCallback(id => {
66
74
  if (props.getDetailPanelContent == null) {
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { useGridApiEventHandler, gridRowIdsSelector, GridEvents } from '@mui/x-data-grid';
3
+ import { useGridApiEventHandler, gridRowIdsSelector } from '@mui/x-data-grid';
4
4
 
5
5
  function cacheContentAndHeight(apiRef, getDetailPanelContent, getDetailPanelHeight) {
6
6
  if (typeof getDetailPanelContent !== 'function') {
@@ -39,7 +39,7 @@ export const useGridDetailPanelCache = (apiRef, props) => {
39
39
  });
40
40
  apiRef.current.forceUpdate();
41
41
  }, [apiRef, props.getDetailPanelContent, props.getDetailPanelHeight]);
42
- useGridApiEventHandler(apiRef, GridEvents.visibleRowsSet, updateCaches);
42
+ useGridApiEventHandler(apiRef, 'sortedRowsSet', updateCaches);
43
43
  const isFirstRender = React.useRef(true);
44
44
 
45
45
  if (isFirstRender.current) {
@@ -2,6 +2,6 @@
2
2
  export * from './columnPinning';
3
3
  export * from './columnReorder';
4
4
  export * from './columnResize';
5
- export * from './rowGrouping';
5
+ export * from './rowReorder';
6
6
  export * from './treeData';
7
7
  export * from './detailPanel';
@@ -1,9 +1,8 @@
1
1
  import * as React from 'react';
2
- import { useGridSelector, GridEvents, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector } from '@mui/x-data-grid';
2
+ import { useGridSelector, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector } from '@mui/x-data-grid';
3
3
  import { useGridVisibleRows } from '@mui/x-data-grid/internals';
4
4
 
5
5
  /**
6
- * Only available in DataGridPro
7
6
  * @requires useGridColumns (state)
8
7
  * @requires useGridDimensions (method) - can be after
9
8
  * @requires useGridScroll (method
@@ -34,7 +33,7 @@ export const useGridInfiniteLoader = (apiRef, props) => {
34
33
  viewportPageSize,
35
34
  virtualRowsCount: currentPage.rows.length
36
35
  };
37
- apiRef.current.publishEvent(GridEvents.rowsScrollEnd, rowScrollEndParam);
36
+ apiRef.current.publishEvent('rowsScrollEnd', rowScrollEndParam);
38
37
  isInScrollBottomArea.current = true;
39
38
  }
40
39
  }, [contentHeight, props.scrollEndThreshold, visibleColumns, apiRef, currentPage.rows.length]);
@@ -47,6 +46,6 @@ export const useGridInfiniteLoader = (apiRef, props) => {
47
46
  top
48
47
  });
49
48
  }, [handleRowsScrollEnd]);
50
- useGridApiEventHandler(apiRef, GridEvents.rowsScroll, handleGridScroll);
51
- useGridApiOptionHandler(apiRef, GridEvents.rowsScrollEnd, props.onRowsScrollEnd);
49
+ useGridApiEventHandler(apiRef, 'rowsScroll', handleGridScroll);
50
+ useGridApiOptionHandler(apiRef, 'rowsScrollEnd', props.onRowsScrollEnd);
52
51
  };
@@ -23,12 +23,12 @@ export const isGroupingColumn = field => field === GRID_ROW_GROUPING_SINGLE_GROU
23
23
  /**
24
24
  * When filtering a group, we only want to filter according to the items related to this grouping column.
25
25
  */
26
- const shouldApplyFilterItemOnGroup = (item, node) => {
27
- if (item.columnField === GRID_ROW_GROUPING_SINGLE_GROUPING_FIELD) {
26
+ const shouldApplyFilterItemOnGroup = (columnField, node) => {
27
+ if (columnField === GRID_ROW_GROUPING_SINGLE_GROUPING_FIELD) {
28
28
  return true;
29
29
  }
30
30
 
31
- const groupingCriteriaField = getRowGroupingCriteriaFromGroupingField(item.columnField);
31
+ const groupingCriteriaField = getRowGroupingCriteriaFromGroupingField(columnField);
32
32
  return groupingCriteriaField === node.groupingField;
33
33
  };
34
34
  /**
@@ -54,7 +54,7 @@ export const filterRowTreeFromGroupingColumns = params => {
54
54
  if (!isRowMatchingFilters) {
55
55
  isMatchingFilters = true;
56
56
  } else {
57
- const shouldApplyItem = node.isAutoGenerated ? item => shouldApplyFilterItemOnGroup(item, node) : undefined;
57
+ const shouldApplyItem = node.isAutoGenerated ? columnField => shouldApplyFilterItemOnGroup(columnField, node) : undefined;
58
58
  isMatchingFilters = isRowMatchingFilters(node.id, shouldApplyItem);
59
59
  }
60
60
 
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import Divider from '@mui/material/Divider';
4
- import { GridEvents, useGridApiEventHandler, useGridApiMethod, gridFilteredDescendantCountLookupSelector } from '@mui/x-data-grid';
4
+ import { useGridApiEventHandler, useGridApiMethod, gridFilteredDescendantCountLookupSelector } from '@mui/x-data-grid';
5
5
  import { useGridRegisterPipeProcessor, isDeepEqual } from '@mui/x-data-grid/internals';
6
6
  import { gridRowGroupingModelSelector, gridRowGroupingSanitizedModelSelector, gridRowGroupingStateSelector } from './gridRowGroupingSelector';
7
7
  import { getRowGroupingFieldFromGroupingCriteria, ROW_GROUPING_STRATEGY, isGroupingColumn, mergeStateWithRowGroupingModel, setStrategyAvailability } from './gridRowGroupingUtils';
@@ -15,11 +15,9 @@ export const rowGroupingStateInitializer = (state, props) => _extends({}, state,
15
15
  }
16
16
  });
17
17
  /**
18
- * Only available in DataGridPro
19
18
  * @requires useGridColumns (state, method) - can be after, async only
20
19
  * @requires useGridRows (state, method) - can be after, async only
21
20
  * @requires useGridParamsApi (method) - can be after, async only
22
- * TODO: Move the the Premium plan once available and remove the `experimentalFeatures.rowGrouping` flag
23
21
  */
24
22
 
25
23
  export const useGridRowGrouping = (apiRef, props) => {
@@ -28,7 +26,7 @@ export const useGridRowGrouping = (apiRef, props) => {
28
26
  propModel: props.rowGroupingModel,
29
27
  propOnChange: props.onRowGroupingModelChange,
30
28
  stateSelector: gridRowGroupingModelSelector,
31
- changeEvent: GridEvents.rowGroupingModelChange
29
+ changeEvent: 'rowGroupingModelChange'
32
30
  });
33
31
  /**
34
32
  * API METHODS
@@ -169,21 +167,19 @@ export const useGridRowGrouping = (apiRef, props) => {
169
167
  rowGrouping: _extends({}, state.rowGrouping, {
170
168
  unstable_sanitizedModelOnLastRowTreeCreation: rowGroupingModel
171
169
  })
172
- })); // Refresh the column pre-processing
173
- // TODO: Add a clean way to re-run a pipe processing without faking a change
174
-
175
- apiRef.current.updateColumns([]);
170
+ }));
171
+ apiRef.current.unstable_requestPipeProcessorsApplication('hydrateColumns');
176
172
  setStrategyAvailability(apiRef, props.disableRowGrouping); // Refresh the row tree creation strategy processing
177
173
  // TODO: Add a clean way to re-run a strategy processing without publishing a private event
178
174
 
179
175
  if (apiRef.current.unstable_getActiveStrategy('rowTree') === ROW_GROUPING_STRATEGY) {
180
- apiRef.current.publishEvent(GridEvents.activeStrategyProcessorChange, 'rowTreeCreation');
176
+ apiRef.current.publishEvent('activeStrategyProcessorChange', 'rowTreeCreation');
181
177
  }
182
178
  }
183
179
  }, [apiRef, props.disableRowGrouping]);
184
- useGridApiEventHandler(apiRef, GridEvents.cellKeyDown, handleCellKeyDown);
185
- useGridApiEventHandler(apiRef, GridEvents.columnsChange, checkGroupingColumnsModelDiff);
186
- useGridApiEventHandler(apiRef, GridEvents.rowGroupingModelChange, checkGroupingColumnsModelDiff);
180
+ useGridApiEventHandler(apiRef, 'cellKeyDown', handleCellKeyDown);
181
+ useGridApiEventHandler(apiRef, 'columnsChange', checkGroupingColumnsModelDiff);
182
+ useGridApiEventHandler(apiRef, 'rowGroupingModelChange', checkGroupingColumnsModelDiff);
187
183
  /**
188
184
  * EFFECTS
189
185
  */
@@ -2,11 +2,11 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { gridColumnLookupSelector, gridRowIdsSelector, gridRowTreeSelector, useFirstRender } from '@mui/x-data-grid';
4
4
  import { useGridRegisterPipeProcessor, useGridRegisterStrategyProcessor } from '@mui/x-data-grid/internals';
5
+ import { sortRowTree } from '../../../utils/tree/sortRowTree';
6
+ import { buildRowTree } from '../../../utils/tree/buildRowTree';
5
7
  import { gridRowGroupingModelSelector, gridRowGroupingSanitizedModelSelector } from './gridRowGroupingSelector';
6
8
  import { createGroupingColDefForAllGroupingCriteria, createGroupingColDefForOneGroupingCriteria } from './createGroupingColDef';
7
9
  import { filterRowTreeFromGroupingColumns, getColDefOverrides, ROW_GROUPING_STRATEGY, isGroupingColumn, setStrategyAvailability } from './gridRowGroupingUtils';
8
- import { buildRowTree } from '../../../utils/tree/buildRowTree';
9
- import { sortRowTree } from '../../../utils/tree/sortRowTree';
10
10
  export const useGridRowGroupingPreProcessors = (apiRef, props) => {
11
11
  const getGroupingColDefs = React.useCallback(columnsState => {
12
12
  if (props.disableRowGrouping) {
@@ -0,0 +1,18 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { GRID_STRING_COL_DEF } from '@mui/x-data-grid';
3
+ import { renderRowReorderCell } from '../../../components/GridRowReorderCell';
4
+ export const GRID_REORDER_COL_DEF = _extends({}, GRID_STRING_COL_DEF, {
5
+ field: '__reorder__',
6
+ type: 'reorder',
7
+ sortable: false,
8
+ filterable: false,
9
+ width: 50,
10
+ align: 'center',
11
+ headerAlign: 'center',
12
+ disableColumnMenu: true,
13
+ disableExport: true,
14
+ disableReorder: true,
15
+ resizable: false,
16
+ renderHeader: () => ' ',
17
+ renderCell: renderRowReorderCell
18
+ });
@@ -0,0 +1 @@
1
+ export * from './gridRowReorderColDef';