@mui/x-data-grid-pro 5.15.3 → 5.17.1

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 (92) hide show
  1. package/CHANGELOG.md +150 -1
  2. package/DataGridPro/DataGridPro.js +19 -0
  3. package/DataGridPro/useDataGridProComponent.js +8 -1
  4. package/DataGridPro/useDataGridProProps.js +2 -1
  5. package/components/DataGridProColumnHeaders.js +25 -13
  6. package/components/DataGridProVirtualScroller.js +18 -15
  7. package/components/GridDetailPanelToggleCell.js +2 -1
  8. package/components/GridTreeDataGroupingCell.js +2 -1
  9. package/hooks/features/columnReorder/useGridColumnReorder.js +95 -3
  10. package/hooks/features/columnResize/useGridColumnResize.js +10 -7
  11. package/hooks/features/detailPanel/useGridDetailPanelPreProcessors.js +15 -0
  12. package/hooks/features/infiniteLoader/useGridInfiniteLoader.d.ts +1 -1
  13. package/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -4
  14. package/hooks/features/lazyLoader/useGridLazyLoader.d.ts +10 -0
  15. package/hooks/features/lazyLoader/useGridLazyLoader.js +178 -0
  16. package/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.d.ts +5 -0
  17. package/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +32 -0
  18. package/hooks/features/rowPinning/useGridRowPinningPreProcessors.d.ts +4 -4
  19. package/hooks/features/treeData/gridTreeDataUtils.d.ts +3 -1
  20. package/hooks/features/treeData/gridTreeDataUtils.js +1 -1
  21. package/hooks/features/treeData/useGridTreeDataPreProcessors.js +2 -1
  22. package/index.js +1 -1
  23. package/legacy/DataGridPro/DataGridPro.js +19 -0
  24. package/legacy/DataGridPro/useDataGridProComponent.js +8 -1
  25. package/legacy/DataGridPro/useDataGridProProps.js +2 -1
  26. package/legacy/components/DataGridProColumnHeaders.js +25 -13
  27. package/legacy/components/DataGridProVirtualScroller.js +18 -15
  28. package/legacy/components/GridDetailPanelToggleCell.js +2 -1
  29. package/legacy/components/GridTreeDataGroupingCell.js +2 -1
  30. package/legacy/hooks/features/columnReorder/useGridColumnReorder.js +99 -3
  31. package/legacy/hooks/features/columnResize/useGridColumnResize.js +11 -7
  32. package/legacy/hooks/features/detailPanel/useGridDetailPanelPreProcessors.js +15 -0
  33. package/legacy/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -4
  34. package/legacy/hooks/features/lazyLoader/useGridLazyLoader.js +185 -0
  35. package/legacy/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +35 -0
  36. package/legacy/hooks/features/treeData/gridTreeDataUtils.js +1 -1
  37. package/legacy/hooks/features/treeData/useGridTreeDataPreProcessors.js +2 -1
  38. package/legacy/index.js +1 -1
  39. package/legacy/models/gridFetchRowsParams.js +1 -0
  40. package/legacy/models/index.js +2 -1
  41. package/legacy/utils/domUtils.js +5 -0
  42. package/legacy/utils/releaseInfo.js +1 -1
  43. package/models/dataGridProProps.d.ts +22 -1
  44. package/models/gridFetchRowsParams.d.ts +22 -0
  45. package/models/gridFetchRowsParams.js +1 -0
  46. package/models/index.d.ts +1 -0
  47. package/models/index.js +2 -1
  48. package/modern/DataGridPro/DataGridPro.js +19 -0
  49. package/modern/DataGridPro/useDataGridProComponent.js +8 -1
  50. package/modern/DataGridPro/useDataGridProProps.js +2 -1
  51. package/modern/components/DataGridProColumnHeaders.js +25 -13
  52. package/modern/components/DataGridProVirtualScroller.js +18 -15
  53. package/modern/components/GridDetailPanelToggleCell.js +2 -1
  54. package/modern/components/GridTreeDataGroupingCell.js +2 -1
  55. package/modern/hooks/features/columnReorder/useGridColumnReorder.js +83 -3
  56. package/modern/hooks/features/columnResize/useGridColumnResize.js +5 -2
  57. package/modern/hooks/features/detailPanel/useGridDetailPanelPreProcessors.js +15 -0
  58. package/modern/hooks/features/infiniteLoader/useGridInfiniteLoader.js +4 -4
  59. package/modern/hooks/features/lazyLoader/useGridLazyLoader.js +176 -0
  60. package/modern/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +30 -0
  61. package/modern/hooks/features/treeData/gridTreeDataUtils.js +1 -1
  62. package/modern/hooks/features/treeData/useGridTreeDataPreProcessors.js +2 -1
  63. package/modern/index.js +1 -1
  64. package/modern/models/gridFetchRowsParams.js +1 -0
  65. package/modern/models/index.js +2 -1
  66. package/modern/utils/domUtils.js +3 -0
  67. package/modern/utils/releaseInfo.js +1 -1
  68. package/node/DataGridPro/DataGridPro.js +19 -0
  69. package/node/DataGridPro/useDataGridProComponent.js +9 -0
  70. package/node/DataGridPro/useDataGridProProps.js +1 -0
  71. package/node/components/DataGridProColumnHeaders.js +25 -12
  72. package/node/components/DataGridProVirtualScroller.js +18 -15
  73. package/node/components/GridDetailPanelToggleCell.js +2 -1
  74. package/node/components/GridTreeDataGroupingCell.js +2 -1
  75. package/node/hooks/features/columnReorder/useGridColumnReorder.js +95 -3
  76. package/node/hooks/features/columnResize/useGridColumnResize.js +9 -6
  77. package/node/hooks/features/detailPanel/useGridDetailPanelPreProcessors.js +16 -0
  78. package/node/hooks/features/infiniteLoader/useGridInfiniteLoader.js +3 -3
  79. package/node/hooks/features/lazyLoader/useGridLazyLoader.js +193 -0
  80. package/node/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +52 -0
  81. package/node/hooks/features/treeData/gridTreeDataUtils.js +1 -1
  82. package/node/hooks/features/treeData/useGridTreeDataPreProcessors.js +2 -1
  83. package/node/index.js +1 -1
  84. package/node/models/gridFetchRowsParams.js +5 -0
  85. package/node/models/index.js +13 -0
  86. package/node/utils/domUtils.js +7 -0
  87. package/node/utils/releaseInfo.js +1 -1
  88. package/package.json +5 -5
  89. package/typeOverloads/modules.d.ts +7 -1
  90. package/utils/domUtils.d.ts +1 -0
  91. package/utils/domUtils.js +5 -0
  92. package/utils/releaseInfo.js +1 -1
@@ -287,17 +287,20 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
287
287
  var detailPanels = getDetailPanels();
288
288
  var topPinnedRows = getRows({
289
289
  renderContext: renderContext,
290
- rows: topPinnedRowsData
290
+ rows: topPinnedRowsData,
291
+ position: 'center'
291
292
  });
292
293
  var pinnedRowsHeight = calculatePinnedRowsHeight(apiRef);
293
294
  var mainRows = getRows({
294
295
  renderContext: renderContext,
295
- rowIndexOffset: topPinnedRowsData.length
296
+ rowIndexOffset: topPinnedRowsData.length,
297
+ position: 'center'
296
298
  });
297
299
  var bottomPinnedRows = getRows({
298
300
  renderContext: renderContext,
299
301
  rows: bottomPinnedRowsData,
300
- rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0)
302
+ rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0),
303
+ position: 'center'
301
304
  });
302
305
  var contentProps = getContentProps();
303
306
  var pinnedColumnsStyle = {
@@ -329,8 +332,8 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
329
332
  minFirstColumn: leftRenderContext.firstColumnIndex,
330
333
  maxLastColumn: leftRenderContext.lastColumnIndex,
331
334
  availableSpace: 0,
332
- ignoreAutoHeight: true,
333
- rows: topPinnedRowsData
335
+ rows: topPinnedRowsData,
336
+ position: 'left'
334
337
  })
335
338
  }), /*#__PURE__*/_jsx(VirtualScrollerPinnedRowsRenderZone, {
336
339
  className: classes.pinnedRowsRenderZone,
@@ -346,9 +349,9 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
346
349
  renderContext: rightRenderContext,
347
350
  minFirstColumn: rightRenderContext.firstColumnIndex,
348
351
  maxLastColumn: rightRenderContext.lastColumnIndex,
349
- ignoreAutoHeight: true,
350
352
  availableSpace: 0,
351
- rows: topPinnedRowsData
353
+ rows: topPinnedRowsData,
354
+ position: 'right'
352
355
  })
353
356
  })]
354
357
  }) : null, /*#__PURE__*/_jsxs(GridVirtualScrollerContent, _extends({}, contentProps, {
@@ -364,8 +367,8 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
364
367
  minFirstColumn: leftRenderContext.firstColumnIndex,
365
368
  maxLastColumn: leftRenderContext.lastColumnIndex,
366
369
  availableSpace: 0,
367
- ignoreAutoHeight: true,
368
- rowIndexOffset: topPinnedRowsData.length
370
+ rowIndexOffset: topPinnedRowsData.length,
371
+ position: 'left'
369
372
  })
370
373
  }), /*#__PURE__*/_jsx(GridVirtualScrollerRenderZone, _extends({}, getRenderZoneProps(), {
371
374
  children: mainRows
@@ -381,8 +384,8 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
381
384
  minFirstColumn: rightRenderContext.firstColumnIndex,
382
385
  maxLastColumn: rightRenderContext.lastColumnIndex,
383
386
  availableSpace: 0,
384
- ignoreAutoHeight: true,
385
- rowIndexOffset: topPinnedRowsData.length
387
+ rowIndexOffset: topPinnedRowsData.length,
388
+ position: 'right'
386
389
  })
387
390
  }), detailPanels.length > 0 && /*#__PURE__*/_jsx(VirtualScrollerDetailPanels, {
388
391
  className: classes.detailPanels,
@@ -408,9 +411,9 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
408
411
  minFirstColumn: leftRenderContext.firstColumnIndex,
409
412
  maxLastColumn: leftRenderContext.lastColumnIndex,
410
413
  availableSpace: 0,
411
- ignoreAutoHeight: true,
412
414
  rows: bottomPinnedRowsData,
413
- rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0)
415
+ rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0),
416
+ position: 'left'
414
417
  })
415
418
  }), /*#__PURE__*/_jsx(VirtualScrollerPinnedRowsRenderZone, {
416
419
  className: classes.pinnedRowsRenderZone,
@@ -427,9 +430,9 @@ var DataGridProVirtualScroller = /*#__PURE__*/React.forwardRef(function DataGrid
427
430
  minFirstColumn: rightRenderContext.firstColumnIndex,
428
431
  maxLastColumn: rightRenderContext.lastColumnIndex,
429
432
  availableSpace: 0,
430
- ignoreAutoHeight: true,
431
433
  rows: bottomPinnedRowsData,
432
- rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0)
434
+ rowIndexOffset: topPinnedRowsData.length + (mainRows ? mainRows.length : 0),
435
+ position: 'right'
433
436
  })
434
437
  })]
435
438
  }) : null]
@@ -125,7 +125,8 @@ process.env.NODE_ENV !== "production" ? GridDetailPanelToggleCell.propTypes = {
125
125
  tabIndex: PropTypes.oneOf([-1, 0]).isRequired,
126
126
 
127
127
  /**
128
- * The cell value, but if the column has valueGetter, use getValue.
128
+ * The cell value.
129
+ * If the column has `valueGetter`, use `params.row` to directly access the fields.
129
130
  */
130
131
  value: PropTypes.any
131
132
  } : void 0;
@@ -160,7 +160,8 @@ process.env.NODE_ENV !== "production" ? GridTreeDataGroupingCell.propTypes = {
160
160
  tabIndex: PropTypes.oneOf([-1, 0]).isRequired,
161
161
 
162
162
  /**
163
- * The cell value, but if the column has valueGetter, use getValue.
163
+ * The cell value.
164
+ * If the column has `valueGetter`, use `params.row` to directly access the fields.
164
165
  */
165
166
  value: PropTypes.any
166
167
  } : void 0;
@@ -41,6 +41,7 @@ export var useGridColumnReorder = function useGridColumnReorder(apiRef, props) {
41
41
  y: 0
42
42
  });
43
43
  var originColumnIndex = React.useRef(null);
44
+ var forbiddenIndexes = React.useRef({});
44
45
  var removeDnDStylesTimeout = React.useRef();
45
46
  var ownerState = {
46
47
  classes: props.classes
@@ -74,6 +75,73 @@ export var useGridColumnReorder = function useGridColumnReorder(apiRef, props) {
74
75
  dragColNode.current.classList.remove(classes.columnHeaderDragging);
75
76
  });
76
77
  originColumnIndex.current = apiRef.current.getColumnIndex(params.field, false);
78
+ var draggingColumnGroupPath = apiRef.current.unstable_getColumnGroupPath(params.field);
79
+ var columnIndex = originColumnIndex.current;
80
+ var allColumns = apiRef.current.getAllColumns();
81
+ var groupsLookup = apiRef.current.unstable_getAllGroupDetails(); // The limitingGroupId is the id of the group from which the dragged column should not escape
82
+
83
+ var limitingGroupId = null;
84
+ draggingColumnGroupPath.forEach(function (groupId) {
85
+ var _groupsLookup$groupId;
86
+
87
+ if (!((_groupsLookup$groupId = groupsLookup[groupId]) != null && _groupsLookup$groupId.freeReordering)) {
88
+ var _allColumns$groupPath, _allColumns$groupPath2;
89
+
90
+ // Only consider group that are made of more than one column
91
+ if (columnIndex > 0 && (_allColumns$groupPath = allColumns[columnIndex - 1].groupPath) != null && _allColumns$groupPath.includes(groupId)) {
92
+ limitingGroupId = groupId;
93
+ } else if (columnIndex + 1 < allColumns.length && (_allColumns$groupPath2 = allColumns[columnIndex + 1].groupPath) != null && _allColumns$groupPath2.includes(groupId)) {
94
+ limitingGroupId = groupId;
95
+ }
96
+ }
97
+ });
98
+ forbiddenIndexes.current = {};
99
+
100
+ var _loop = function _loop(indexToForbid) {
101
+ var leftIndex = indexToForbid <= columnIndex ? indexToForbid - 1 : indexToForbid;
102
+ var rightIndex = indexToForbid < columnIndex ? indexToForbid : indexToForbid + 1;
103
+
104
+ if (limitingGroupId !== null) {
105
+ var _allColumns$leftIndex, _allColumns$rightInde;
106
+
107
+ // verify this indexToForbid will be linked to the limiting group. Otherwise forbid it
108
+ var allowIndex = false;
109
+
110
+ if (leftIndex >= 0 && (_allColumns$leftIndex = allColumns[leftIndex].groupPath) != null && _allColumns$leftIndex.includes(limitingGroupId)) {
111
+ allowIndex = true;
112
+ } else if (rightIndex < allColumns.length && (_allColumns$rightInde = allColumns[rightIndex].groupPath) != null && _allColumns$rightInde.includes(limitingGroupId)) {
113
+ allowIndex = true;
114
+ }
115
+
116
+ if (!allowIndex) {
117
+ forbiddenIndexes.current[indexToForbid] = true;
118
+ }
119
+ } // Verify we are not splitting another group
120
+
121
+
122
+ if (leftIndex >= 0 && rightIndex < allColumns.length) {
123
+ var _allColumns$rightInde2, _allColumns$rightInde3;
124
+
125
+ (_allColumns$rightInde2 = allColumns[rightIndex]) == null ? void 0 : (_allColumns$rightInde3 = _allColumns$rightInde2.groupPath) == null ? void 0 : _allColumns$rightInde3.forEach(function (groupId) {
126
+ var _allColumns$leftIndex2;
127
+
128
+ if ((_allColumns$leftIndex2 = allColumns[leftIndex].groupPath) != null && _allColumns$leftIndex2.includes(groupId)) {
129
+ if (!draggingColumnGroupPath.includes(groupId)) {
130
+ var _groupsLookup$groupId2;
131
+
132
+ // moving here split the group groupId in two distincts chunks
133
+ if (!((_groupsLookup$groupId2 = groupsLookup[groupId]) != null && _groupsLookup$groupId2.freeReordering)) {
134
+ forbiddenIndexes.current[indexToForbid] = true;
135
+ }
136
+ }
137
+ }
138
+ });
139
+ }
140
+ };
141
+
142
+ for (var indexToForbid = 0; indexToForbid < allColumns.length; indexToForbid += 1) {
143
+ _loop(indexToForbid);
144
+ }
77
145
  }, [props.disableColumnReorder, classes.columnHeaderDragging, logger, apiRef]);
78
146
  var handleDragEnter = React.useCallback(function (params, event) {
79
147
  event.preventDefault(); // Prevent drag events propagation.
@@ -104,19 +172,47 @@ export var useGridColumnReorder = function useGridColumnReorder(apiRef, props) {
104
172
  var targetCol = apiRef.current.getColumn(params.field);
105
173
  var dragColIndex = apiRef.current.getColumnIndex(dragColField, false);
106
174
  var visibleColumns = apiRef.current.getVisibleColumns();
175
+ var allColumns = apiRef.current.getAllColumns();
107
176
  var cursorMoveDirectionX = getCursorMoveDirectionX(cursorPosition.current, coordinates);
108
177
  var hasMovedLeft = cursorMoveDirectionX === CURSOR_MOVE_DIRECTION_LEFT && targetColIndex < dragColIndex;
109
178
  var hasMovedRight = cursorMoveDirectionX === CURSOR_MOVE_DIRECTION_RIGHT && dragColIndex < targetColIndex;
110
179
 
111
180
  if (hasMovedLeft || hasMovedRight) {
112
181
  var canBeReordered;
182
+ var indexOffsetInHiddenColumns = 0;
113
183
 
114
184
  if (!targetCol.disableReorder) {
115
185
  canBeReordered = true;
116
186
  } else if (hasMovedLeft) {
117
- canBeReordered = targetColIndex > 0 && !visibleColumns[targetColIndex - 1].disableReorder;
187
+ canBeReordered = targetColVisibleIndex > 0 && !visibleColumns[targetColVisibleIndex - 1].disableReorder;
118
188
  } else {
119
- canBeReordered = targetColIndex < visibleColumns.length - 1 && !visibleColumns[targetColIndex + 1].disableReorder;
189
+ canBeReordered = targetColVisibleIndex < visibleColumns.length - 1 && !visibleColumns[targetColVisibleIndex + 1].disableReorder;
190
+ }
191
+
192
+ if (forbiddenIndexes.current[targetColIndex]) {
193
+ var nextVisibleColumnField;
194
+ var indexWithOffset = targetColIndex + indexOffsetInHiddenColumns;
195
+
196
+ if (hasMovedLeft) {
197
+ nextVisibleColumnField = targetColVisibleIndex > 0 ? visibleColumns[targetColVisibleIndex - 1].field : null;
198
+
199
+ while (indexWithOffset > 0 && allColumns[indexWithOffset].field !== nextVisibleColumnField && forbiddenIndexes.current[indexWithOffset]) {
200
+ indexOffsetInHiddenColumns -= 1;
201
+ indexWithOffset = targetColIndex + indexOffsetInHiddenColumns;
202
+ }
203
+ } else {
204
+ nextVisibleColumnField = targetColVisibleIndex + 1 < visibleColumns.length ? visibleColumns[targetColVisibleIndex + 1].field : null;
205
+
206
+ while (indexWithOffset < allColumns.length - 1 && allColumns[indexWithOffset].field !== nextVisibleColumnField && forbiddenIndexes.current[indexWithOffset]) {
207
+ indexOffsetInHiddenColumns += 1;
208
+ indexWithOffset = targetColIndex + indexOffsetInHiddenColumns;
209
+ }
210
+ }
211
+
212
+ if (forbiddenIndexes.current[indexWithOffset] || allColumns[indexWithOffset].field === nextVisibleColumnField) {
213
+ // If we ended up on a visible column, or a forbidden one, we can not do the reorder
214
+ canBeReordered = false;
215
+ }
120
216
  }
121
217
 
122
218
  var canBeReorderedProcessed = apiRef.current.unstable_applyPipeProcessors('canBeReordered', canBeReordered, {
@@ -124,7 +220,7 @@ export var useGridColumnReorder = function useGridColumnReorder(apiRef, props) {
124
220
  });
125
221
 
126
222
  if (canBeReorderedProcessed) {
127
- apiRef.current.setColumnIndex(dragColField, targetColIndex);
223
+ apiRef.current.setColumnIndex(dragColField, targetColIndex + indexOffsetInHiddenColumns);
128
224
  }
129
225
  }
130
226
 
@@ -1,10 +1,11 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
2
  import _extends from "@babel/runtime/helpers/esm/extends";
2
3
  import * as React from 'react';
3
4
  import { ownerDocument, useEventCallback } from '@mui/material/utils';
4
5
  import { gridClasses, useGridApiEventHandler, useGridApiOptionHandler, useGridNativeEventListener, useGridLogger } from '@mui/x-data-grid';
5
6
  import { clamp, findParentElementFromClassName } from '@mui/x-data-grid/internals';
6
7
  import { useTheme } from '@mui/material/styles';
7
- import { findGridCellElementsFromCol, getFieldFromHeaderElem, findHeaderElementFromField } from '../../../utils/domUtils';
8
+ import { findGridCellElementsFromCol, getFieldFromHeaderElem, findHeaderElementFromField, findGroupHeaderElementsFromField } from '../../../utils/domUtils';
8
9
  // TODO: remove support for Safari < 13.
9
10
  // https://caniuse.com/#search=touch-action
10
11
  //
@@ -106,6 +107,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
106
107
  var logger = useGridLogger(apiRef, 'useGridColumnResize');
107
108
  var colDefRef = React.useRef();
108
109
  var colElementRef = React.useRef();
110
+ var colGroupingElementRef = React.useRef();
109
111
  var colCellElementsRef = React.useRef();
110
112
  var theme = useTheme(); // To improve accessibility, the separator has padding on both sides.
111
113
  // Clicking inside the padding area should be treated as a click in the separator.
@@ -126,7 +128,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
126
128
  colElementRef.current.style.width = "".concat(newWidth, "px");
127
129
  colElementRef.current.style.minWidth = "".concat(newWidth, "px");
128
130
  colElementRef.current.style.maxWidth = "".concat(newWidth, "px");
129
- colCellElementsRef.current.forEach(function (element) {
131
+ [].concat(_toConsumableArray(colCellElementsRef.current), _toConsumableArray(colGroupingElementRef.current)).forEach(function (element) {
130
132
  var div = element;
131
133
  var finalWidth;
132
134
 
@@ -182,7 +184,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
182
184
  apiRef.current.publishEvent('columnResize', params, nativeEvent);
183
185
  });
184
186
  var handleColumnResizeMouseDown = useEventCallback(function (_ref, event) {
185
- var _apiRef$current$colum;
187
+ var _apiRef$current$colum, _apiRef$current$colum2;
186
188
 
187
189
  var colDef = _ref.colDef;
188
190
 
@@ -204,6 +206,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
204
206
  }, event);
205
207
  colDefRef.current = colDef;
206
208
  colElementRef.current = (_apiRef$current$colum = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum.current.querySelector("[data-field=\"".concat(colDef.field, "\"]"));
209
+ colGroupingElementRef.current = findGroupHeaderElementsFromField((_apiRef$current$colum2 = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum2.current, colDef.field);
207
210
  colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
208
211
  var doc = ownerDocument(apiRef.current.rootElementRef.current);
209
212
  doc.body.style.cursor = 'col-resize';
@@ -252,7 +255,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
252
255
  apiRef.current.publishEvent('columnResize', params, nativeEvent);
253
256
  });
254
257
  var handleTouchStart = useEventCallback(function (event) {
255
- var _apiRef$current$colum2;
258
+ var _apiRef$current$colum3, _apiRef$current$colum4;
256
259
 
257
260
  var cellSeparator = findParentElementFromClassName(event.target, gridClasses['columnSeparator--resizable']); // Let the event bubble if the target is not a col separator
258
261
 
@@ -275,12 +278,13 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
275
278
  colElementRef.current = findParentElementFromClassName(event.target, gridClasses.columnHeader);
276
279
  var field = getFieldFromHeaderElem(colElementRef.current);
277
280
  var colDef = apiRef.current.getColumn(field);
281
+ colGroupingElementRef.current = findGroupHeaderElementsFromField((_apiRef$current$colum3 = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum3.current, field);
278
282
  logger.debug("Start Resize on col ".concat(colDef.field));
279
283
  apiRef.current.publishEvent('columnResizeStart', {
280
284
  field: field
281
285
  }, event);
282
286
  colDefRef.current = colDef;
283
- colElementRef.current = findHeaderElementFromField((_apiRef$current$colum2 = apiRef.current.columnHeadersElementRef) == null ? void 0 : _apiRef$current$colum2.current, colDef.field);
287
+ colElementRef.current = findHeaderElementFromField((_apiRef$current$colum4 = apiRef.current.columnHeadersElementRef) == null ? void 0 : _apiRef$current$colum4.current, colDef.field);
284
288
  colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
285
289
  resizeDirection.current = getResizeDirection(event.target, theme.direction);
286
290
  initialOffsetToSeparator.current = computeOffsetToSeparator(touch.clientX, colElementRef.current.getBoundingClientRect(), resizeDirection.current);
@@ -324,9 +328,9 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
324
328
  };
325
329
  }, [apiRef, handleTouchStart, stopListening]);
326
330
  useGridNativeEventListener(apiRef, function () {
327
- var _apiRef$current$colum3;
331
+ var _apiRef$current$colum5;
328
332
 
329
- return (_apiRef$current$colum3 = apiRef.current.columnHeadersElementRef) == null ? void 0 : _apiRef$current$colum3.current;
333
+ return (_apiRef$current$colum5 = apiRef.current.columnHeadersElementRef) == null ? void 0 : _apiRef$current$colum5.current;
330
334
  }, 'touchstart', handleTouchStart, {
331
335
  passive: doesSupportTouchActionNone()
332
336
  });
@@ -3,6 +3,7 @@ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
3
  import * as React from 'react';
4
4
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
5
5
  import { GRID_DETAIL_PANEL_TOGGLE_FIELD, GRID_DETAIL_PANEL_TOGGLE_COL_DEF } from './gridDetailPanelToggleColDef';
6
+ import { gridDetailPanelExpandedRowIdsSelector } from './gridDetailPanelSelector';
6
7
  export var useGridDetailPanelPreProcessors = function useGridDetailPanelPreProcessors(apiRef, props) {
7
8
  var addToggleColumn = React.useCallback(function (columnsState) {
8
9
  if (props.getDetailPanelContent == null) {
@@ -30,5 +31,19 @@ export var useGridDetailPanelPreProcessors = function useGridDetailPanelPreProce
30
31
  });
31
32
  return columnsState;
32
33
  }, [apiRef, props.getDetailPanelContent]);
34
+ var addExpandedClassToRow = React.useCallback(function (classes, id) {
35
+ if (props.getDetailPanelContent == null) {
36
+ return classes;
37
+ }
38
+
39
+ var expandedRowIds = gridDetailPanelExpandedRowIdsSelector(apiRef.current.state);
40
+
41
+ if (!expandedRowIds.includes(id)) {
42
+ return classes;
43
+ }
44
+
45
+ return [].concat(_toConsumableArray(classes), ['MuiDataGrid-row--detailPanelExpanded']);
46
+ }, [apiRef, props.getDetailPanelContent]);
33
47
  useGridRegisterPipeProcessor(apiRef, 'hydrateColumns', addToggleColumn);
48
+ useGridRegisterPipeProcessor(apiRef, 'rowClassName', addExpandedClassToRow);
34
49
  };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { useGridSelector, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector } from '@mui/x-data-grid';
2
+ import { useGridSelector, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector, GridFeatureModeConstant } from '@mui/x-data-grid';
3
3
  import { useGridVisibleRows } from '@mui/x-data-grid/internals';
4
4
 
5
5
  /**
@@ -14,9 +14,9 @@ export var useGridInfiniteLoader = function useGridInfiniteLoader(apiRef, props)
14
14
  var contentHeight = Math.max(rowsMeta.currentPageTotalHeight, 1);
15
15
  var isInScrollBottomArea = React.useRef(false);
16
16
  var handleRowsScrollEnd = React.useCallback(function (scrollPosition) {
17
- var dimensions = apiRef.current.getRootDimensions();
17
+ var dimensions = apiRef.current.getRootDimensions(); // Prevent the infite loading working in combination with lazy loading
18
18
 
19
- if (!dimensions) {
19
+ if (!dimensions || props.rowsLoadingMode !== GridFeatureModeConstant.client) {
20
20
  return;
21
21
  }
22
22
 
@@ -36,7 +36,7 @@ export var useGridInfiniteLoader = function useGridInfiniteLoader(apiRef, props)
36
36
  apiRef.current.publishEvent('rowsScrollEnd', rowScrollEndParam);
37
37
  isInScrollBottomArea.current = true;
38
38
  }
39
- }, [contentHeight, props.scrollEndThreshold, visibleColumns, apiRef, currentPage.rows.length]);
39
+ }, [contentHeight, props.scrollEndThreshold, props.rowsLoadingMode, visibleColumns, apiRef, currentPage.rows.length]);
40
40
  var handleGridScroll = React.useCallback(function (_ref) {
41
41
  var left = _ref.left,
42
42
  top = _ref.top;
@@ -0,0 +1,185 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import * as React from 'react';
3
+ import { useGridApiEventHandler, GridFeatureModeConstant, useGridSelector, gridSortModelSelector, gridFilterModelSelector, useGridApiOptionHandler } from '@mui/x-data-grid';
4
+ import { useGridVisibleRows, getRenderableIndexes } from '@mui/x-data-grid/internals';
5
+
6
+ function findSkeletonRowsSection(visibleRows, range) {
7
+ var firstRowIndex = range.firstRowIndex,
8
+ lastRowIndex = range.lastRowIndex;
9
+ var visibleRowsSection = visibleRows.slice(range.firstRowIndex, range.lastRowIndex);
10
+ var startIndex = 0;
11
+ var endIndex = visibleRowsSection.length - 1;
12
+ var isSkeletonSectionFound = false;
13
+
14
+ while (!isSkeletonSectionFound && firstRowIndex < lastRowIndex) {
15
+ if (!visibleRowsSection[startIndex].model && !visibleRowsSection[endIndex].model) {
16
+ isSkeletonSectionFound = true;
17
+ }
18
+
19
+ if (visibleRowsSection[startIndex].model) {
20
+ startIndex += 1;
21
+ firstRowIndex += 1;
22
+ }
23
+
24
+ if (visibleRowsSection[endIndex].model) {
25
+ endIndex -= 1;
26
+ lastRowIndex -= 1;
27
+ }
28
+ }
29
+
30
+ return isSkeletonSectionFound ? {
31
+ firstRowIndex: firstRowIndex,
32
+ lastRowIndex: lastRowIndex
33
+ } : undefined;
34
+ }
35
+
36
+ function isLazyLoadingDisabled(_ref) {
37
+ var lazyLoadingFeatureFlag = _ref.lazyLoadingFeatureFlag,
38
+ rowsLoadingMode = _ref.rowsLoadingMode,
39
+ gridDimensions = _ref.gridDimensions;
40
+
41
+ if (!lazyLoadingFeatureFlag || !gridDimensions) {
42
+ return true;
43
+ }
44
+
45
+ if (rowsLoadingMode !== GridFeatureModeConstant.server) {
46
+ return true;
47
+ }
48
+
49
+ return false;
50
+ }
51
+ /**
52
+ * @requires useGridRows (state)
53
+ * @requires useGridPagination (state)
54
+ * @requires useGridDimensions (method) - can be after
55
+ * @requires useGridScroll (method
56
+ */
57
+
58
+
59
+ export var useGridLazyLoader = function useGridLazyLoader(apiRef, props) {
60
+ var _props$experimentalFe;
61
+
62
+ var visibleRows = useGridVisibleRows(apiRef, props);
63
+ var sortModel = useGridSelector(apiRef, gridSortModelSelector);
64
+ var filterModel = useGridSelector(apiRef, gridFilterModelSelector);
65
+ var renderedRowsIntervalCache = React.useRef({
66
+ firstRowToRender: 0,
67
+ lastRowToRender: 0
68
+ });
69
+
70
+ var _ref2 = (_props$experimentalFe = props.experimentalFeatures) != null ? _props$experimentalFe : {},
71
+ lazyLoading = _ref2.lazyLoading;
72
+
73
+ var getCurrentIntervalToRender = React.useCallback(function () {
74
+ var currentRenderContext = apiRef.current.unstable_getRenderContext();
75
+
76
+ var _getRenderableIndexes = getRenderableIndexes({
77
+ firstIndex: currentRenderContext.firstRowIndex,
78
+ lastIndex: currentRenderContext.lastRowIndex,
79
+ minFirstIndex: 0,
80
+ maxLastIndex: visibleRows.rows.length,
81
+ buffer: props.rowBuffer
82
+ }),
83
+ _getRenderableIndexes2 = _slicedToArray(_getRenderableIndexes, 2),
84
+ firstRowToRender = _getRenderableIndexes2[0],
85
+ lastRowToRender = _getRenderableIndexes2[1];
86
+
87
+ return {
88
+ firstRowToRender: firstRowToRender,
89
+ lastRowToRender: lastRowToRender
90
+ };
91
+ }, [apiRef, props.rowBuffer, visibleRows.rows.length]);
92
+ var handleRenderedRowsIntervalChange = React.useCallback(function (params) {
93
+ var dimensions = apiRef.current.getRootDimensions();
94
+
95
+ if (isLazyLoadingDisabled({
96
+ lazyLoadingFeatureFlag: lazyLoading,
97
+ rowsLoadingMode: props.rowsLoadingMode,
98
+ gridDimensions: dimensions
99
+ })) {
100
+ return;
101
+ }
102
+
103
+ var fetchRowsParams = {
104
+ firstRowToRender: params.firstRowToRender,
105
+ lastRowToRender: params.lastRowToRender,
106
+ sortModel: sortModel,
107
+ filterModel: filterModel
108
+ };
109
+
110
+ if (renderedRowsIntervalCache.current.firstRowToRender === params.firstRowToRender && renderedRowsIntervalCache.current.lastRowToRender === params.lastRowToRender) {
111
+ return;
112
+ }
113
+
114
+ if (sortModel.length === 0 && filterModel.items.length === 0) {
115
+ var skeletonRowsSection = findSkeletonRowsSection(visibleRows.rows, {
116
+ firstRowIndex: params.firstRowToRender,
117
+ lastRowIndex: params.lastRowToRender
118
+ });
119
+
120
+ if (!skeletonRowsSection) {
121
+ return;
122
+ }
123
+
124
+ fetchRowsParams.firstRowToRender = skeletonRowsSection.firstRowIndex;
125
+ fetchRowsParams.lastRowToRender = skeletonRowsSection.lastRowIndex;
126
+ }
127
+
128
+ renderedRowsIntervalCache.current = params;
129
+ apiRef.current.publishEvent('fetchRows', fetchRowsParams);
130
+ }, [apiRef, props.rowsLoadingMode, sortModel, filterModel, visibleRows.rows, lazyLoading]);
131
+ var handleGridSortModelChange = React.useCallback(function (newSortModel) {
132
+ var dimensions = apiRef.current.getRootDimensions();
133
+
134
+ if (isLazyLoadingDisabled({
135
+ lazyLoadingFeatureFlag: lazyLoading,
136
+ rowsLoadingMode: props.rowsLoadingMode,
137
+ gridDimensions: dimensions
138
+ })) {
139
+ return;
140
+ }
141
+
142
+ apiRef.current.unstable_requestPipeProcessorsApplication('hydrateRows');
143
+
144
+ var _getCurrentIntervalTo = getCurrentIntervalToRender(),
145
+ firstRowToRender = _getCurrentIntervalTo.firstRowToRender,
146
+ lastRowToRender = _getCurrentIntervalTo.lastRowToRender;
147
+
148
+ var fetchRowsParams = {
149
+ firstRowToRender: firstRowToRender,
150
+ lastRowToRender: lastRowToRender,
151
+ sortModel: newSortModel,
152
+ filterModel: filterModel
153
+ };
154
+ apiRef.current.publishEvent('fetchRows', fetchRowsParams);
155
+ }, [apiRef, props.rowsLoadingMode, filterModel, lazyLoading, getCurrentIntervalToRender]);
156
+ var handleGridFilterModelChange = React.useCallback(function (newFilterModel) {
157
+ var dimensions = apiRef.current.getRootDimensions();
158
+
159
+ if (isLazyLoadingDisabled({
160
+ lazyLoadingFeatureFlag: lazyLoading,
161
+ rowsLoadingMode: props.rowsLoadingMode,
162
+ gridDimensions: dimensions
163
+ })) {
164
+ return;
165
+ }
166
+
167
+ apiRef.current.unstable_requestPipeProcessorsApplication('hydrateRows');
168
+
169
+ var _getCurrentIntervalTo2 = getCurrentIntervalToRender(),
170
+ firstRowToRender = _getCurrentIntervalTo2.firstRowToRender,
171
+ lastRowToRender = _getCurrentIntervalTo2.lastRowToRender;
172
+
173
+ var fetchRowsParams = {
174
+ firstRowToRender: firstRowToRender,
175
+ lastRowToRender: lastRowToRender,
176
+ sortModel: sortModel,
177
+ filterModel: newFilterModel
178
+ };
179
+ apiRef.current.publishEvent('fetchRows', fetchRowsParams);
180
+ }, [apiRef, props.rowsLoadingMode, sortModel, lazyLoading, getCurrentIntervalToRender]);
181
+ useGridApiEventHandler(apiRef, 'renderedRowsIntervalChange', handleRenderedRowsIntervalChange);
182
+ useGridApiEventHandler(apiRef, 'sortModelChange', handleGridSortModelChange);
183
+ useGridApiEventHandler(apiRef, 'filterModelChange', handleGridFilterModelChange);
184
+ useGridApiOptionHandler(apiRef, 'fetchRows', props.onFetchRows);
185
+ };
@@ -0,0 +1,35 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import * as React from 'react';
4
+ import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
5
+ import { GridFeatureModeConstant } from '@mui/x-data-grid';
6
+ export var GRID_SKELETON_ROW_ROOT_ID = 'auto-generated-skeleton-row-root';
7
+
8
+ var getSkeletonRowId = function getSkeletonRowId(index) {
9
+ return "".concat(GRID_SKELETON_ROW_ROOT_ID, "-").concat(index);
10
+ };
11
+
12
+ export var useGridLazyLoaderPreProcessors = function useGridLazyLoaderPreProcessors(apiRef, props) {
13
+ var _props$experimentalFe;
14
+
15
+ var _ref = (_props$experimentalFe = props.experimentalFeatures) != null ? _props$experimentalFe : {},
16
+ lazyLoading = _ref.lazyLoading;
17
+
18
+ var addSkeletonRows = React.useCallback(function (groupingParams) {
19
+ if (!lazyLoading || props.rowsLoadingMode !== GridFeatureModeConstant.server || !props.rowCount || groupingParams.ids.length >= props.rowCount) {
20
+ return groupingParams;
21
+ }
22
+
23
+ var newRowsIds = _toConsumableArray(groupingParams.ids);
24
+
25
+ for (var i = 0; i < props.rowCount - groupingParams.ids.length; i += 1) {
26
+ var skeletonId = getSkeletonRowId(i);
27
+ newRowsIds.push(skeletonId);
28
+ }
29
+
30
+ return _extends({}, groupingParams, {
31
+ ids: newRowsIds
32
+ });
33
+ }, [props.rowCount, props.rowsLoadingMode, lazyLoading]);
34
+ useGridRegisterPipeProcessor(apiRef, 'hydrateRows', addSkeletonRows);
35
+ };
@@ -29,7 +29,7 @@ export var filterRowTreeFromTreeData = function filterRowTreeFromTreeData(params
29
29
  passingFilterItems = _isRowMatchingFilters.passingFilterItems,
30
30
  passingQuickFilterValues = _isRowMatchingFilters.passingQuickFilterValues;
31
31
 
32
- isMatchingFilters = passFilterLogic([passingFilterItems], [passingQuickFilterValues], params.filterModel);
32
+ isMatchingFilters = passFilterLogic([passingFilterItems], [passingQuickFilterValues], params.filterModel, params.apiRef);
33
33
  }
34
34
 
35
35
  var filteredDescendantCount = 0;
@@ -115,7 +115,8 @@ export var useGridTreeDataPreProcessors = function useGridTreeDataPreProcessors(
115
115
  rowTree: rowTree,
116
116
  isRowMatchingFilters: params.isRowMatchingFilters,
117
117
  disableChildrenFiltering: props.disableChildrenFiltering,
118
- filterModel: params.filterModel
118
+ filterModel: params.filterModel,
119
+ apiRef: apiRef
119
120
  });
120
121
  }, [apiRef, props.disableChildrenFiltering]);
121
122
  var sortRows = React.useCallback(function (params) {
package/legacy/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license MUI v5.15.3
1
+ /** @license MUI v5.17.1
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,4 @@
1
1
  export * from './gridGroupingColDefOverride';
2
2
  export * from './gridRowScrollEndParams';
3
- export * from './gridRowOrderChangeParams';
3
+ export * from './gridRowOrderChangeParams';
4
+ export * from './gridFetchRowsParams';
@@ -6,6 +6,11 @@ export function getFieldFromHeaderElem(colCellEl) {
6
6
  export function findHeaderElementFromField(elem, field) {
7
7
  return elem.querySelector("[data-field=\"".concat(field, "\"]"));
8
8
  }
9
+ export function findGroupHeaderElementsFromField(elem, field) {
10
+ var _elem$querySelectorAl;
11
+
12
+ return Array.from((_elem$querySelectorAl = elem.querySelectorAll("[data-fields*=\"|-".concat(field, "-|\"]"))) != null ? _elem$querySelectorAl : []);
13
+ }
9
14
  export function findGridCellElementsFromCol(col, api) {
10
15
  var root = findParentElementFromClassName(col, 'MuiDataGrid-root');
11
16