@mui/x-data-grid 6.14.0 → 6.15.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 (134) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/DataGrid/useDataGridComponent.js +43 -40
  3. package/components/DataGridVirtualScroller.d.ts +1 -4
  4. package/components/DataGridVirtualScroller.js +3 -5
  5. package/components/GridRow.js +4 -2
  6. package/components/base/GridBody.d.ts +0 -1
  7. package/components/base/GridBody.js +2 -22
  8. package/components/cell/GridActionsCell.js +2 -2
  9. package/components/cell/GridActionsCellItem.d.ts +6 -0
  10. package/components/cell/GridCell.js +4 -2
  11. package/components/columnHeaders/GridColumnHeaderItem.js +2 -1
  12. package/components/menu/GridMenu.d.ts +1 -2
  13. package/components/menu/GridMenu.js +21 -5
  14. package/components/menu/columnMenu/GridColumnHeaderMenu.js +11 -8
  15. package/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  16. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  17. package/components/toolbar/GridToolbarDensitySelector.js +2 -7
  18. package/components/toolbar/GridToolbarExportContainer.js +1 -9
  19. package/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -2
  20. package/hooks/features/export/useGridPrintExport.js +37 -7
  21. package/hooks/features/filter/gridFilterUtils.js +10 -6
  22. package/hooks/features/focus/useGridFocus.js +0 -1
  23. package/hooks/features/index.d.ts +1 -0
  24. package/hooks/features/index.js +2 -1
  25. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +16 -0
  26. package/hooks/features/virtualization/gridVirtualizationSelectors.js +18 -0
  27. package/hooks/features/virtualization/index.d.ts +2 -0
  28. package/hooks/features/virtualization/index.js +2 -0
  29. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +0 -1
  30. package/hooks/features/virtualization/useGridVirtualScroller.js +53 -36
  31. package/hooks/features/virtualization/useGridVirtualization.d.ts +12 -0
  32. package/hooks/features/virtualization/useGridVirtualization.js +47 -0
  33. package/index.js +1 -1
  34. package/internals/index.d.ts +4 -0
  35. package/internals/index.js +4 -0
  36. package/legacy/DataGrid/useDataGridComponent.js +43 -40
  37. package/legacy/components/DataGridVirtualScroller.js +2 -4
  38. package/legacy/components/GridRow.js +4 -2
  39. package/legacy/components/base/GridBody.js +2 -26
  40. package/legacy/components/cell/GridActionsCell.js +2 -2
  41. package/legacy/components/cell/GridCell.js +4 -2
  42. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +2 -1
  43. package/legacy/components/menu/GridMenu.js +21 -5
  44. package/legacy/components/menu/columnMenu/GridColumnHeaderMenu.js +11 -8
  45. package/legacy/components/panel/filterPanel/GridFilterInputBoolean.js +2 -1
  46. package/legacy/components/panel/filterPanel/GridFilterInputSingleSelect.js +2 -1
  47. package/legacy/components/toolbar/GridToolbarDensitySelector.js +2 -7
  48. package/legacy/components/toolbar/GridToolbarExportContainer.js +1 -9
  49. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -2
  50. package/legacy/hooks/features/export/useGridPrintExport.js +44 -12
  51. package/legacy/hooks/features/filter/gridFilterUtils.js +10 -6
  52. package/legacy/hooks/features/focus/useGridFocus.js +0 -1
  53. package/legacy/hooks/features/index.js +2 -1
  54. package/legacy/hooks/features/virtualization/gridVirtualizationSelectors.js +24 -0
  55. package/legacy/hooks/features/virtualization/index.js +2 -0
  56. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +61 -39
  57. package/legacy/hooks/features/virtualization/useGridVirtualization.js +51 -0
  58. package/legacy/index.js +1 -1
  59. package/legacy/internals/index.js +4 -0
  60. package/legacy/models/api/index.js +1 -2
  61. package/legacy/utils/createControllablePromise.js +11 -0
  62. package/models/api/gridApiCommon.d.ts +3 -4
  63. package/models/api/gridVirtualizationApi.d.ts +20 -0
  64. package/models/api/index.d.ts +1 -2
  65. package/models/api/index.js +1 -2
  66. package/models/events/gridEventLookup.d.ts +8 -0
  67. package/models/gridExport.d.ts +17 -4
  68. package/models/gridStateCommunity.d.ts +2 -1
  69. package/models/index.d.ts +1 -1
  70. package/modern/DataGrid/useDataGridComponent.js +43 -40
  71. package/modern/components/DataGridVirtualScroller.js +3 -5
  72. package/modern/components/GridRow.js +4 -2
  73. package/modern/components/base/GridBody.js +2 -22
  74. package/modern/components/cell/GridActionsCell.js +2 -2
  75. package/modern/components/cell/GridCell.js +4 -2
  76. package/modern/components/columnHeaders/GridColumnHeaderItem.js +2 -1
  77. package/modern/components/menu/GridMenu.js +20 -5
  78. package/modern/components/menu/columnMenu/GridColumnHeaderMenu.js +11 -8
  79. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  80. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  81. package/modern/components/toolbar/GridToolbarDensitySelector.js +2 -7
  82. package/modern/components/toolbar/GridToolbarExportContainer.js +1 -9
  83. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -2
  84. package/modern/hooks/features/export/useGridPrintExport.js +37 -7
  85. package/modern/hooks/features/filter/gridFilterUtils.js +10 -6
  86. package/modern/hooks/features/focus/useGridFocus.js +0 -1
  87. package/modern/hooks/features/index.js +2 -1
  88. package/modern/hooks/features/virtualization/gridVirtualizationSelectors.js +18 -0
  89. package/modern/hooks/features/virtualization/index.js +2 -0
  90. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +52 -36
  91. package/modern/hooks/features/virtualization/useGridVirtualization.js +47 -0
  92. package/modern/index.js +1 -1
  93. package/modern/internals/index.js +4 -0
  94. package/modern/models/api/index.js +1 -2
  95. package/modern/utils/createControllablePromise.js +11 -0
  96. package/node/DataGrid/useDataGridComponent.js +43 -40
  97. package/node/components/DataGridVirtualScroller.js +3 -5
  98. package/node/components/GridRow.js +4 -2
  99. package/node/components/base/GridBody.js +2 -22
  100. package/node/components/cell/GridActionsCell.js +2 -2
  101. package/node/components/cell/GridCell.js +4 -2
  102. package/node/components/columnHeaders/GridColumnHeaderItem.js +2 -1
  103. package/node/components/menu/GridMenu.js +19 -4
  104. package/node/components/menu/columnMenu/GridColumnHeaderMenu.js +10 -7
  105. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  106. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  107. package/node/components/toolbar/GridToolbarDensitySelector.js +2 -7
  108. package/node/components/toolbar/GridToolbarExportContainer.js +1 -9
  109. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -2
  110. package/node/hooks/features/export/useGridPrintExport.js +37 -7
  111. package/node/hooks/features/filter/gridFilterUtils.js +9 -6
  112. package/node/hooks/features/focus/useGridFocus.js +0 -1
  113. package/node/hooks/features/index.js +11 -0
  114. package/node/hooks/features/virtualization/gridVirtualizationSelectors.js +27 -0
  115. package/node/hooks/features/virtualization/index.js +27 -0
  116. package/node/hooks/features/virtualization/useGridVirtualScroller.js +51 -37
  117. package/node/hooks/features/virtualization/useGridVirtualization.js +58 -0
  118. package/node/index.js +1 -1
  119. package/node/internals/index.js +44 -0
  120. package/node/models/api/index.js +4 -15
  121. package/node/utils/createControllablePromise.js +17 -0
  122. package/package.json +1 -1
  123. package/utils/createControllablePromise.d.ts +5 -0
  124. package/utils/createControllablePromise.js +11 -0
  125. package/models/api/gridDisableVirtualizationApi.d.ts +0 -15
  126. package/models/api/gridVirtualScrollerApi.d.ts +0 -8
  127. package/models/api/gridVirtualScrollerApi.js +0 -1
  128. package/modern/models/api/gridDisableVirtualizationApi.js +0 -1
  129. package/modern/models/api/gridVirtualScrollerApi.js +0 -1
  130. package/node/models/api/gridVirtualScrollerApi.js +0 -5
  131. /package/legacy/models/api/{gridDisableVirtualizationApi.js → gridVirtualizationApi.js} +0 -0
  132. /package/{legacy/models/api/gridVirtualScrollerApi.js → models/api/gridVirtualizationApi.js} +0 -0
  133. /package/{models/api/gridDisableVirtualizationApi.js → modern/models/api/gridVirtualizationApi.js} +0 -0
  134. /package/node/models/api/{gridDisableVirtualizationApi.js → gridVirtualizationApi.js} +0 -0
@@ -4,10 +4,13 @@ import { GLOBAL_API_REF, isInternalFilter } from '../../../colDef/utils';
4
4
  import { getDefaultGridFilterModel } from './gridFilterState';
5
5
  import { buildWarning } from '../../../utils/warning';
6
6
  import { gridColumnFieldsSelector, gridColumnLookupSelector, gridVisibleColumnFieldsSelector } from '../columns';
7
+
8
+ // Fixes https://github.com/mui/mui-x/issues/10056
9
+ var global = typeof window === 'undefined' ? globalThis : window;
10
+ var evalCode = global[atob('ZXZhbA==')];
7
11
  var hasEval;
8
12
  try {
9
- // eslint-disable-next-line no-eval
10
- hasEval = eval('true');
13
+ hasEval = evalCode('true');
11
14
  } catch (_) {
12
15
  hasEval = false;
13
16
  }
@@ -174,14 +177,15 @@ export var buildAggregatedFilterItemsApplier = function buildAggregatedFilterIte
174
177
 
175
178
  // We generate a new function with `eval()` to avoid expensive patterns for JS engines
176
179
  // such as a dynamic object assignment, e.g. `{ [dynamicKey]: value }`.
177
- var filterItemTemplate = "(function filterItem$$(row, shouldApplyFilter) {\n ".concat(appliers.map(function (applier, i) {
180
+ var filterItemTemplate = "(function filterItem$$(appliers, row, shouldApplyFilter) {\n ".concat(appliers.map(function (applier, i) {
178
181
  return "const shouldApply".concat(i, " = !shouldApplyFilter || shouldApplyFilter(").concat(JSON.stringify(applier.item.field), ");");
179
182
  }).join('\n'), "\n\n const result$$ = {\n ").concat(appliers.map(function (applier, i) {
180
183
  return "".concat(JSON.stringify(String(applier.item.id)), ":\n !shouldApply").concat(i, " ?\n false :\n ").concat(applier.v7 ? "appliers[".concat(i, "].fn(row)") : "appliers[".concat(i, "].fn(").concat(getRowId ? 'getRowId(row)' : 'row.id', ")"), ",\n ");
181
184
  }).join('\n'), "};\n\n return result$$;\n })");
182
-
183
- // eslint-disable-next-line no-eval
184
- var filterItem = eval(filterItemTemplate.replaceAll('$$', String(filterItemsApplierId)));
185
+ var filterItemCore = evalCode(filterItemTemplate.replaceAll('$$', String(filterItemsApplierId)));
186
+ var filterItem = function filterItem(row, shouldApplyItem) {
187
+ return filterItemCore(appliers, row, shouldApplyItem);
188
+ };
185
189
  filterItemsApplierId += 1;
186
190
  return filterItem;
187
191
  };
@@ -397,7 +397,6 @@ export var useGridFocus = function useGridFocus(apiRef, props) {
397
397
  };
398
398
  }, [apiRef, handleDocumentClick]);
399
399
  useGridApiEventHandler(apiRef, 'columnHeaderBlur', handleBlur);
400
- useGridApiEventHandler(apiRef, 'headerFilterBlur', handleBlur);
401
400
  useGridApiEventHandler(apiRef, 'cellDoubleClick', handleCellDoubleClick);
402
401
  useGridApiEventHandler(apiRef, 'cellMouseDown', handleCellMouseDown);
403
402
  useGridApiEventHandler(apiRef, 'cellKeyDown', handleCellKeyDown);
@@ -12,4 +12,5 @@ export * from './rowSelection';
12
12
  export * from './sorting';
13
13
  export * from './dimensions';
14
14
  export * from './statePersistence';
15
- export * from './headerFiltering';
15
+ export * from './headerFiltering';
16
+ export * from './virtualization';
@@ -0,0 +1,24 @@
1
+ import { createSelector } from '../../../utils/createSelector';
2
+ /**
3
+ * Get the columns state
4
+ * @category Virtualization
5
+ */
6
+ export var gridVirtualizationSelector = function gridVirtualizationSelector(state) {
7
+ return state.virtualization;
8
+ };
9
+
10
+ /**
11
+ * Get the enabled state for virtualization
12
+ * @category Virtualization
13
+ */
14
+ export var gridVirtualizationEnabledSelector = createSelector(gridVirtualizationSelector, function (state) {
15
+ return state.enabled;
16
+ });
17
+
18
+ /**
19
+ * Get the enabled state for virtualization
20
+ * @category Virtualization
21
+ */
22
+ export var gridVirtualizationColumnEnabledSelector = createSelector(gridVirtualizationSelector, function (state) {
23
+ return state.enabledForColumns;
24
+ });
@@ -0,0 +1,2 @@
1
+ export * from './useGridVirtualization';
2
+ export * from './gridVirtualizationSelectors';
@@ -21,8 +21,10 @@ import { selectedIdsLookupSelector } from '../rowSelection/gridRowSelectionSelec
21
21
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
22
22
  import { getFirstNonSpannedColumnToRender } from '../columns/gridColumnsUtils';
23
23
  import { getMinimalContentHeight } from '../rows/gridRowsUtils';
24
- import { jsx as _jsx } from "react/jsx-runtime";
24
+ import { gridVirtualizationEnabledSelector, gridVirtualizationColumnEnabledSelector } from './gridVirtualizationSelectors';
25
+
25
26
  // Uses binary search to avoid looping through all possible positions
27
+ import { jsx as _jsx } from "react/jsx-runtime";
26
28
  export function binarySearch(offset, positions) {
27
29
  var sliceStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
28
30
  var sliceEnd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : positions.length;
@@ -68,8 +70,9 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
68
70
  var apiRef = useGridPrivateApiContext();
69
71
  var rootProps = useGridRootProps();
70
72
  var visibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
73
+ var enabled = useGridSelector(apiRef, gridVirtualizationEnabledSelector);
74
+ var enabledForColumns = useGridSelector(apiRef, gridVirtualizationColumnEnabledSelector);
71
75
  var ref = props.ref,
72
- disableVirtualization = props.disableVirtualization,
73
76
  onRenderZonePositioning = props.onRenderZonePositioning,
74
77
  _props$renderZoneMinC = props.renderZoneMinColumnIndex,
75
78
  renderZoneMinColumnIndex = _props$renderZoneMinC === void 0 ? 0 : _props$renderZoneMinC,
@@ -90,7 +93,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
90
93
  var _React$useState = React.useState(null),
91
94
  _React$useState2 = _slicedToArray(_React$useState, 2),
92
95
  renderContext = _React$useState2[0],
93
- setRenderContext = _React$useState2[1];
96
+ setRenderContextState = _React$useState2[1];
94
97
  var prevRenderContext = React.useRef(renderContext);
95
98
  var scrollPosition = React.useRef({
96
99
  top: 0,
@@ -104,6 +107,15 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
104
107
  containerDimensions = _React$useState4[0],
105
108
  setContainerDimensions = _React$useState4[1];
106
109
  var prevTotalWidth = React.useRef(columnsTotalWidth);
110
+ // Each visible row (not to be confused with a filter result) is composed of a central row element
111
+ // and up to two additional row elements for pinned columns (left and right).
112
+ // When hovering any of these elements, the :hover styles are applied only to the row element that
113
+ // was actually hovered, not its additional siblings. To make it look like a contiguous row,
114
+ // we add/remove the .Mui-hovered class to all of the row elements inside one visible row.
115
+ var _React$useState5 = React.useState(null),
116
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
117
+ hoveredRowId = _React$useState6[0],
118
+ setHoveredRowId = _React$useState6[1];
107
119
  var rowStyleCache = React.useRef(Object.create(null));
108
120
  var prevGetRowProps = React.useRef();
109
121
  var prevRootRowStyle = React.useRef();
@@ -158,7 +170,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
158
170
  return exponentialSearch(offset, rowsMeta.positions, lastMeasuredIndexRelativeToCurrentPage);
159
171
  }, [apiRef, (_currentPage$range3 = currentPage.range) == null ? void 0 : _currentPage$range3.firstRowIndex, (_currentPage$range4 = currentPage.range) == null ? void 0 : _currentPage$range4.lastRowIndex, rowsMeta.positions]);
160
172
  var computeRenderContext = React.useCallback(function () {
161
- if (disableVirtualization) {
173
+ if (!enabled) {
162
174
  return {
163
175
  firstRowIndex: 0,
164
176
  lastRowIndex: currentPage.rows.length,
@@ -174,26 +186,28 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
174
186
  // In the last index, this is not needed because Array.slice doesn't include it.
175
187
  var firstRowIndex = Math.min(getNearestIndexToRender(top), rowsMeta.positions.length - 1);
176
188
  var lastRowIndex = rootProps.autoHeight ? firstRowIndex + currentPage.rows.length : getNearestIndexToRender(top + containerDimensions.height);
177
- var hasRowWithAutoHeight = false;
178
189
  var firstColumnIndex = 0;
179
190
  var lastColumnIndex = columnPositions.length;
180
- var _getRenderableIndexes = getRenderableIndexes({
181
- firstIndex: firstRowIndex,
182
- lastIndex: lastRowIndex,
183
- minFirstIndex: 0,
184
- maxLastIndex: currentPage.rows.length,
185
- buffer: rootProps.rowBuffer
186
- }),
187
- _getRenderableIndexes2 = _slicedToArray(_getRenderableIndexes, 2),
188
- firstRowToRender = _getRenderableIndexes2[0],
189
- lastRowToRender = _getRenderableIndexes2[1];
190
- for (var i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
191
- var row = currentPage.rows[i];
192
- hasRowWithAutoHeight = apiRef.current.rowHasAutoHeight(row.id);
193
- }
194
- if (!hasRowWithAutoHeight) {
195
- firstColumnIndex = binarySearch(Math.abs(left), columnPositions);
196
- lastColumnIndex = binarySearch(Math.abs(left) + containerDimensions.width, columnPositions);
191
+ if (enabledForColumns) {
192
+ var hasRowWithAutoHeight = false;
193
+ var _getRenderableIndexes = getRenderableIndexes({
194
+ firstIndex: firstRowIndex,
195
+ lastIndex: lastRowIndex,
196
+ minFirstIndex: 0,
197
+ maxLastIndex: currentPage.rows.length,
198
+ buffer: rootProps.rowBuffer
199
+ }),
200
+ _getRenderableIndexes2 = _slicedToArray(_getRenderableIndexes, 2),
201
+ firstRowToRender = _getRenderableIndexes2[0],
202
+ lastRowToRender = _getRenderableIndexes2[1];
203
+ for (var i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
204
+ var row = currentPage.rows[i];
205
+ hasRowWithAutoHeight = apiRef.current.rowHasAutoHeight(row.id);
206
+ }
207
+ if (!hasRowWithAutoHeight) {
208
+ firstColumnIndex = binarySearch(Math.abs(left), columnPositions);
209
+ lastColumnIndex = binarySearch(Math.abs(left) + containerDimensions.width, columnPositions);
210
+ }
197
211
  }
198
212
  return {
199
213
  firstRowIndex: firstRowIndex,
@@ -201,16 +215,16 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
201
215
  firstColumnIndex: firstColumnIndex,
202
216
  lastColumnIndex: lastColumnIndex
203
217
  };
204
- }, [disableVirtualization, getNearestIndexToRender, rowsMeta.positions.length, rootProps.autoHeight, rootProps.rowBuffer, currentPage.rows, columnPositions, visibleColumns.length, apiRef, containerDimensions]);
218
+ }, [enabled, enabledForColumns, getNearestIndexToRender, rowsMeta.positions.length, rootProps.autoHeight, rootProps.rowBuffer, currentPage.rows, columnPositions, visibleColumns.length, apiRef, containerDimensions]);
205
219
  useEnhancedEffect(function () {
206
- if (disableVirtualization) {
207
- renderZoneRef.current.style.transform = "translate3d(0px, 0px, 0px)";
208
- } else {
220
+ if (enabled) {
209
221
  // TODO a scroll reset should not be necessary
210
222
  rootRef.current.scrollLeft = 0;
211
223
  rootRef.current.scrollTop = 0;
224
+ } else {
225
+ renderZoneRef.current.style.transform = "translate3d(0px, 0px, 0px)";
212
226
  }
213
- }, [disableVirtualization]);
227
+ }, [enabled]);
214
228
  useEnhancedEffect(function () {
215
229
  setContainerDimensions({
216
230
  width: rootRef.current.clientWidth,
@@ -264,12 +278,15 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
264
278
  });
265
279
  }
266
280
  }, [apiRef, currentPage.rows, onRenderZonePositioning, renderZoneMinColumnIndex, renderZoneMaxColumnIndex, rootProps.columnBuffer, rootProps.rowBuffer, theme.direction]);
267
- var updateRenderContext = React.useCallback(function (nextRenderContext) {
281
+ var getRenderContext = React.useCallback(function () {
282
+ return prevRenderContext.current;
283
+ }, []);
284
+ var setRenderContext = React.useCallback(function (nextRenderContext) {
268
285
  if (prevRenderContext.current && areRenderContextsEqual(nextRenderContext, prevRenderContext.current)) {
269
286
  updateRenderZonePosition(nextRenderContext);
270
287
  return;
271
288
  }
272
- setRenderContext(nextRenderContext);
289
+ setRenderContextState(nextRenderContext);
273
290
  updateRenderZonePosition(nextRenderContext);
274
291
  var _getRenderableIndexes7 = getRenderableIndexes({
275
292
  firstIndex: nextRenderContext.firstRowIndex,
@@ -286,13 +303,13 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
286
303
  lastRowToRender: lastRowToRender
287
304
  });
288
305
  prevRenderContext.current = nextRenderContext;
289
- }, [apiRef, setRenderContext, prevRenderContext, currentPage.rows.length, rootProps.rowBuffer, updateRenderZonePosition]);
306
+ }, [apiRef, setRenderContextState, prevRenderContext, currentPage.rows.length, rootProps.rowBuffer, updateRenderZonePosition]);
290
307
  useEnhancedEffect(function () {
291
308
  if (containerDimensions.width == null) {
292
309
  return;
293
310
  }
294
311
  var initialRenderContext = computeRenderContext();
295
- updateRenderContext(initialRenderContext);
312
+ setRenderContext(initialRenderContext);
296
313
  var _ref3 = scrollPosition.current,
297
314
  top = _ref3.top,
298
315
  left = _ref3.left;
@@ -302,7 +319,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
302
319
  renderContext: initialRenderContext
303
320
  };
304
321
  apiRef.current.publishEvent('scrollPositionChange', params);
305
- }, [apiRef, computeRenderContext, containerDimensions.width, updateRenderContext]);
322
+ }, [apiRef, computeRenderContext, containerDimensions.width, setRenderContext]);
306
323
  var handleScroll = useEventCallback(function (event) {
307
324
  var _event$currentTarget = event.currentTarget,
308
325
  scrollTop = _event$currentTarget.scrollTop,
@@ -326,7 +343,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
326
343
  }
327
344
 
328
345
  // When virtualization is disabled, the context never changes during scroll
329
- var nextRenderContext = disableVirtualization ? prevRenderContext.current : computeRenderContext();
346
+ var nextRenderContext = enabled ? computeRenderContext() : prevRenderContext.current;
330
347
  var topRowsScrolledSincePreviousRender = Math.abs(nextRenderContext.firstRowIndex - prevRenderContext.current.firstRowIndex);
331
348
  var bottomRowsScrolledSincePreviousRender = Math.abs(nextRenderContext.lastRowIndex - prevRenderContext.current.lastRowIndex);
332
349
  var topColumnsScrolledSincePreviousRender = Math.abs(nextRenderContext.firstColumnIndex - prevRenderContext.current.firstColumnIndex);
@@ -340,7 +357,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
340
357
  if (shouldSetState) {
341
358
  // Prevents batching render context changes
342
359
  ReactDOM.flushSync(function () {
343
- updateRenderContext(nextRenderContext);
360
+ setRenderContext(nextRenderContext);
344
361
  });
345
362
  prevTotalWidth.current = columnsTotalWidth;
346
363
  }
@@ -359,6 +376,13 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
359
376
  }
360
377
  return -1;
361
378
  }, [cellFocus, currentPage.rows]);
379
+ useGridApiEventHandler(apiRef, 'rowMouseEnter', function (params) {
380
+ var _params$id;
381
+ setHoveredRowId((_params$id = params.id) != null ? _params$id : null);
382
+ });
383
+ useGridApiEventHandler(apiRef, 'rowMouseLeave', function () {
384
+ setHoveredRowId(null);
385
+ });
362
386
  var getRows = function getRows() {
363
387
  var _rootProps$slotProps;
364
388
  var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
@@ -379,8 +403,8 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
379
403
  if (!nextRenderContext || availableSpace == null) {
380
404
  return null;
381
405
  }
382
- var rowBuffer = !disableVirtualization ? rootProps.rowBuffer : 0;
383
- var columnBuffer = !disableVirtualization ? rootProps.columnBuffer : 0;
406
+ var rowBuffer = enabled ? rootProps.rowBuffer : 0;
407
+ var columnBuffer = enabled ? rootProps.columnBuffer : 0;
384
408
  var _getRenderableIndexes9 = getRenderableIndexes({
385
409
  firstIndex: nextRenderContext.firstRowIndex,
386
410
  lastIndex: nextRenderContext.lastRowIndex,
@@ -521,6 +545,7 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
521
545
  isLastVisible: lastVisibleRowIndex,
522
546
  position: position
523
547
  }, rowProps, rootRowProps, {
548
+ hovered: hoveredRowId === _id,
524
549
  style: rowStyleCache.current[_id]
525
550
  }), _id));
526
551
  }
@@ -562,9 +587,6 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
562
587
  }
563
588
  return style;
564
589
  }, [needsHorizontalScrollbar, rootProps.autoHeight]);
565
- var getRenderContext = React.useCallback(function () {
566
- return prevRenderContext.current;
567
- }, []);
568
590
  apiRef.current.register('private', {
569
591
  getRenderContext: getRenderContext
570
592
  });
@@ -0,0 +1,51 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { useGridApiMethod } from '../../utils/useGridApiMethod';
4
+ export var virtualizationStateInitializer = function virtualizationStateInitializer(state, props) {
5
+ var virtualization = {
6
+ enabled: !props.disableVirtualization,
7
+ enabledForColumns: true
8
+ };
9
+ return _extends({}, state, {
10
+ virtualization: virtualization
11
+ });
12
+ };
13
+ export function useGridVirtualization(apiRef, props) {
14
+ /*
15
+ * API METHODS
16
+ */
17
+
18
+ var setVirtualization = function setVirtualization(enabled) {
19
+ apiRef.current.setState(function (state) {
20
+ return _extends({}, state, {
21
+ virtualization: _extends({}, state.virtualization, {
22
+ enabled: enabled
23
+ })
24
+ });
25
+ });
26
+ };
27
+ var setColumnVirtualization = function setColumnVirtualization(enabled) {
28
+ apiRef.current.setState(function (state) {
29
+ return _extends({}, state, {
30
+ virtualization: _extends({}, state.virtualization, {
31
+ enabledForColumns: enabled
32
+ })
33
+ });
34
+ });
35
+ };
36
+ var api = {
37
+ unstable_setVirtualization: setVirtualization,
38
+ unstable_setColumnVirtualization: setColumnVirtualization
39
+ };
40
+ useGridApiMethod(apiRef, api, 'public');
41
+
42
+ /*
43
+ * EFFECTS
44
+ */
45
+
46
+ /* eslint-disable react-hooks/exhaustive-deps */
47
+ React.useEffect(function () {
48
+ setVirtualization(!props.disableVirtualization);
49
+ }, [props.disableVirtualization]);
50
+ /* eslint-enable react-hooks/exhaustive-deps */
51
+ }
package/legacy/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.14.0
2
+ * @mui/x-data-grid v6.15.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -16,6 +16,7 @@ export { useGridColumnMenu, columnMenuStateInitializer } from '../hooks/features
16
16
  export { useGridColumns, columnsStateInitializer } from '../hooks/features/columns/useGridColumns';
17
17
  export { getTotalHeaderHeight } from '../hooks/features/columns/gridColumnsUtils';
18
18
  export { useGridColumnSpanning } from '../hooks/features/columns/useGridColumnSpanning';
19
+ export { gridColumnsStateSelector } from '../hooks/features/columns/gridColumnsSelector';
19
20
  export { useGridColumnGrouping, columnGroupsStateInitializer } from '../hooks/features/columnGrouping/useGridColumnGrouping';
20
21
  export { useGridDensity, densityStateInitializer } from '../hooks/features/density/useGridDensity';
21
22
  export { useGridCsvExport } from '../hooks/features/export/useGridCsvExport';
@@ -46,10 +47,12 @@ export { useGridEvents } from '../hooks/features/events/useGridEvents';
46
47
  export { useGridDimensions } from '../hooks/features/dimensions/useGridDimensions';
47
48
  export { useGridStatePersistence } from '../hooks/features/statePersistence/useGridStatePersistence';
48
49
  export { useGridVirtualScroller, getRenderableIndexes } from '../hooks/features/virtualization/useGridVirtualScroller';
50
+ export * from '../hooks/features/virtualization';
49
51
  export { useTimeout } from '../hooks/utils/useTimeout';
50
52
  export { useGridVisibleRows, getVisibleRows } from '../hooks/utils/useGridVisibleRows';
51
53
  export { useGridInitializeState } from '../hooks/utils/useGridInitializeState';
52
54
  export { getColumnsToExport, defaultGetRowsToExport } from '../hooks/features/export/utils';
55
+ export * from '../utils/createControllablePromise';
53
56
  export { createSelector, createSelectorMemoized, unstable_resetCreateSelectorCache } from '../utils/createSelector';
54
57
  export { findParentElementFromClassName, getActiveElement } from '../utils/domUtils';
55
58
  export { isNavigationKey } from '../utils/keyboardUtils';
@@ -57,6 +60,7 @@ export { clamp, isDeepEqual, isNumber, isFunction, isObject } from '../utils/uti
57
60
  export { buildWarning } from '../utils/warning';
58
61
  export { exportAs } from '../utils/exportAs';
59
62
  export { useGridPrivateApiContext } from '../hooks/utils/useGridPrivateApiContext';
63
+ export * from '../hooks/utils/useOnMount';
60
64
  export { serializeCellValue } from '../hooks/features/export/serializers/csvSerializer';
61
65
  export * from '../colDef/utils';
62
66
  export * from './utils';
@@ -10,8 +10,7 @@ export * from './gridFilterApi';
10
10
  export * from './gridColumnMenuApi';
11
11
  export * from './gridPreferencesPanelApi';
12
12
  export * from './gridPrintExportApi';
13
- export * from './gridDisableVirtualizationApi';
14
13
  export * from './gridCallbackDetails';
15
14
  export * from './gridScrollApi';
16
- export * from './gridVirtualScrollerApi';
15
+ export * from './gridVirtualizationApi';
17
16
  export {};
@@ -0,0 +1,11 @@
1
+ export function createControllablePromise() {
2
+ var resolve;
3
+ var reject;
4
+ var promise = new Promise(function (_resolve, _reject) {
5
+ resolve = _resolve;
6
+ reject = _reject;
7
+ });
8
+ promise.resolve = resolve;
9
+ promise.reject = reject;
10
+ return promise;
11
+ }
@@ -10,7 +10,6 @@ import { GridLocaleTextApi } from './gridLocaleTextApi';
10
10
  import type { GridParamsApi } from './gridParamsApi';
11
11
  import { GridPreferencesPanelApi } from './gridPreferencesPanelApi';
12
12
  import { GridPrintExportApi } from './gridPrintExportApi';
13
- import { GridDisableVirtualizationApi } from './gridDisableVirtualizationApi';
14
13
  import { GridRowApi } from './gridRowApi';
15
14
  import { GridRowsMetaApi, GridRowsMetaPrivateApi } from './gridRowsMetaApi';
16
15
  import { GridRowSelectionApi } from './gridRowSelectionApi';
@@ -18,7 +17,7 @@ import { GridSortApi } from './gridSortApi';
18
17
  import { GridStateApi, GridStatePrivateApi } from './gridStateApi';
19
18
  import { GridLoggerApi } from './gridLoggerApi';
20
19
  import { GridScrollApi } from './gridScrollApi';
21
- import { GridVirtualScrollerApi } from './gridVirtualScrollerApi';
20
+ import { GridVirtualizationApi, GridVirtualizationPrivateApi } from './gridVirtualizationApi';
22
21
  import type { GridPipeProcessingApi, GridPipeProcessingPrivateApi } from '../../hooks/core/pipeProcessing';
23
22
  import { GridColumnSpanningApi, GridColumnSpanningPrivateApi } from './gridColumnSpanning';
24
23
  import type { GridStrategyProcessingApi } from '../../hooks/core/strategyProcessing';
@@ -28,9 +27,9 @@ import type { GridStatePersistenceApi } from '../../hooks/features/statePersiste
28
27
  import { GridColumnGroupingApi } from './gridColumnGroupingApi';
29
28
  import type { GridInitialStateCommunity, GridStateCommunity } from '../gridStateCommunity';
30
29
  import { GridHeaderFilteringApi, GridHeaderFilteringPrivateApi } from './gridHeaderFilteringApi';
31
- export interface GridApiCommon<GridState extends GridStateCommunity = any, GridInitialState extends GridInitialStateCommunity = any> extends GridCoreApi, GridPipeProcessingApi, GridDensityApi, GridDimensionsApi, GridRowApi, GridRowsMetaApi, GridEditingApi, GridParamsApi, GridColumnApi, GridRowSelectionApi, GridSortApi, GridPaginationApi, GridCsvExportApi, GridFocusApi, GridFilterApi, GridColumnMenuApi, GridPreferencesPanelApi, GridPrintExportApi, GridDisableVirtualizationApi, GridLocaleTextApi, GridScrollApi, GridColumnSpanningApi, GridStateApi<GridState>, GridStatePersistenceApi<GridInitialState>, GridColumnGroupingApi, GridHeaderFilteringApi {
30
+ export interface GridApiCommon<GridState extends GridStateCommunity = any, GridInitialState extends GridInitialStateCommunity = any> extends GridCoreApi, GridPipeProcessingApi, GridDensityApi, GridDimensionsApi, GridRowApi, GridRowsMetaApi, GridEditingApi, GridParamsApi, GridColumnApi, GridRowSelectionApi, GridSortApi, GridPaginationApi, GridCsvExportApi, GridFocusApi, GridFilterApi, GridColumnMenuApi, GridPreferencesPanelApi, GridPrintExportApi, GridVirtualizationApi, GridLocaleTextApi, GridScrollApi, GridColumnSpanningApi, GridStateApi<GridState>, GridStatePersistenceApi<GridInitialState>, GridColumnGroupingApi, GridHeaderFilteringApi {
32
31
  }
33
- export interface GridPrivateOnlyApiCommon<Api extends GridApiCommon, PrivateApi extends GridPrivateApiCommon> extends GridCorePrivateApi<Api, PrivateApi>, GridStatePrivateApi<PrivateApi['state']>, GridPipeProcessingPrivateApi, GridStrategyProcessingApi, GridColumnSpanningPrivateApi, GridRowsMetaPrivateApi, GridDimensionsPrivateApi, GridVirtualScrollerApi, GridEditingPrivateApi, GridLoggerApi, GridFocusPrivateApi, GridHeaderFilteringPrivateApi {
32
+ export interface GridPrivateOnlyApiCommon<Api extends GridApiCommon, PrivateApi extends GridPrivateApiCommon> extends GridCorePrivateApi<Api, PrivateApi>, GridStatePrivateApi<PrivateApi['state']>, GridPipeProcessingPrivateApi, GridStrategyProcessingApi, GridColumnSpanningPrivateApi, GridRowsMetaPrivateApi, GridDimensionsPrivateApi, GridEditingPrivateApi, GridLoggerApi, GridFocusPrivateApi, GridHeaderFilteringPrivateApi, GridVirtualizationPrivateApi {
34
33
  }
35
34
  export interface GridPrivateApiCommon extends GridApiCommon, GridPrivateOnlyApiCommon<GridApiCommon, GridPrivateApiCommon> {
36
35
  }
@@ -0,0 +1,20 @@
1
+ import { GridRenderContext } from '../params';
2
+ export interface GridVirtualizationApi {
3
+ /**
4
+ * Enable/disable virtualization.
5
+ * @param {boolean} enabled The enabled value for virtualization
6
+ */
7
+ unstable_setVirtualization: (enabled: boolean) => void;
8
+ /**
9
+ * Enable/disable column virtualization.
10
+ * @param {boolean} enabled The enabled value for column virtualization
11
+ */
12
+ unstable_setColumnVirtualization: (enabled: boolean) => void;
13
+ }
14
+ export interface GridVirtualizationPrivateApi {
15
+ /**
16
+ * Get the current grid rendering context.
17
+ * @returns {GridRenderContext} The `GridRenderContext`.
18
+ */
19
+ getRenderContext: () => GridRenderContext;
20
+ }
@@ -15,10 +15,9 @@ export * from './gridFilterApi';
15
15
  export * from './gridColumnMenuApi';
16
16
  export * from './gridPreferencesPanelApi';
17
17
  export * from './gridPrintExportApi';
18
- export * from './gridDisableVirtualizationApi';
19
18
  export * from './gridCallbackDetails';
20
19
  export * from './gridScrollApi';
21
- export * from './gridVirtualScrollerApi';
20
+ export * from './gridVirtualizationApi';
22
21
  export type { GridApiCommon } from './gridApiCommon';
23
22
  export type { GridEditingApi, GridCellModesModel, GridRowModesModel } from './gridEditingApi';
24
23
  export type GridEditRowApi = GridEditingApi;
@@ -10,8 +10,7 @@ export * from './gridFilterApi';
10
10
  export * from './gridColumnMenuApi';
11
11
  export * from './gridPreferencesPanelApi';
12
12
  export * from './gridPrintExportApi';
13
- export * from './gridDisableVirtualizationApi';
14
13
  export * from './gridCallbackDetails';
15
14
  export * from './gridScrollApi';
16
- export * from './gridVirtualScrollerApi';
15
+ export * from './gridVirtualizationApi';
17
16
  export {};
@@ -173,6 +173,14 @@ export interface GridColumnHeaderEventLookup {
173
173
  params: GridColumnHeaderParams;
174
174
  event: React.DragEvent<HTMLElement>;
175
175
  };
176
+ /**
177
+ * Fired when a `dblclick` DOM event happens in the column header separator.
178
+ * @ignore - do not document.
179
+ */
180
+ columnSeparatorDoubleClick: {
181
+ params: GridColumnHeaderParams;
182
+ event: React.MouseEvent<HTMLElement>;
183
+ };
176
184
  /**
177
185
  * Fired when a `mousedown` DOM event happens in the column header separator.
178
186
  * @ignore - do not document.
@@ -32,9 +32,9 @@ export interface GridFileExportOptions<Api extends GridApiCommon = GridApiCommun
32
32
  */
33
33
  includeHeaders?: boolean;
34
34
  /**
35
- * Function that returns the id of the rows to export on the order they should be exported.
35
+ * Function that returns the list of row ids to export on the order they should be exported.
36
36
  * @param {GridGetRowsToExportParams} params With all properties from [[GridGetRowsToExportParams]].
37
- * @returns {GridRowId[]} The id of the rows to export.
37
+ * @returns {GridRowId[]} The list of row ids to export.
38
38
  */
39
39
  getRowsToExport?: (params: GridGetRowsToExportParams<Api>) => GridRowId[];
40
40
  }
@@ -46,6 +46,8 @@ export interface GridGetRowsToExportParams<Api extends GridApiCommon = GridApiCo
46
46
  }
47
47
  export interface GridCsvGetRowsToExportParams<Api extends GridApiCommon = GridApiCommunity> extends GridGetRowsToExportParams<Api> {
48
48
  }
49
+ export interface GridPrintGetRowsToExportParams<Api extends GridApiCommon = GridApiCommunity> extends GridGetRowsToExportParams<Api> {
50
+ }
49
51
  /**
50
52
  * The options to apply on the CSV export.
51
53
  * @demos
@@ -81,9 +83,9 @@ export interface GridCsvExportOptions extends GridFileExportOptions {
81
83
  */
82
84
  includeColumnGroupsHeaders?: boolean;
83
85
  /**
84
- * Function that returns the id of the rows to export on the order they should be exported.
86
+ * Function that returns the list of row ids to export on the order they should be exported.
85
87
  * @param {GridCsvGetRowsToExportParams} params With all properties from [[GridCsvGetRowsToExportParams]].
86
- * @returns {GridRowId[]} The id of the rows to export.
88
+ * @returns {GridRowId[]} The list of row ids to export.
87
89
  */
88
90
  getRowsToExport?: (params: GridCsvGetRowsToExportParams) => GridRowId[];
89
91
  }
@@ -108,6 +110,11 @@ export interface GridPrintExportOptions extends GridExportOptions {
108
110
  * @default false
109
111
  */
110
112
  hideFooter?: boolean;
113
+ /**
114
+ * If `true`, the selection checkboxes will be included when printing.
115
+ * @default false
116
+ */
117
+ includeCheckboxes?: boolean;
111
118
  /**
112
119
  * If `false`, all <style> and <link type="stylesheet" /> tags from the <head> will not be copied
113
120
  * to the print window.
@@ -122,6 +129,12 @@ export interface GridPrintExportOptions extends GridExportOptions {
122
129
  * Provide Print specific styles to the print window.
123
130
  */
124
131
  pageStyle?: string | Function;
132
+ /**
133
+ * Function that returns the list of row ids to export in the order they should be exported.
134
+ * @param {GridPrintGetRowsToExportParams} params With all properties from [[GridPrintGetRowsToExportParams]].
135
+ * @returns {GridRowId[]} The list of row ids to export.
136
+ */
137
+ getRowsToExport?: (params: GridPrintGetRowsToExportParams) => GridRowId[];
125
138
  }
126
139
  /**
127
140
  * Available export formats.
@@ -1,4 +1,4 @@
1
- import type { GridColumnMenuState, GridColumnsInitialState, GridColumnsState, GridColumnsGroupingState, GridDensityState, GridFilterInitialState, GridFilterState, GridFocusState, GridPaginationInitialState, GridPaginationState, GridPreferencePanelInitialState, GridPreferencePanelState, GridRowsState, GridSortingInitialState, GridSortingState, GridTabIndexState } from '../hooks';
1
+ import type { GridColumnMenuState, GridColumnsInitialState, GridColumnsState, GridColumnsGroupingState, GridDensityState, GridFilterInitialState, GridFilterState, GridFocusState, GridPaginationInitialState, GridPaginationState, GridPreferencePanelInitialState, GridPreferencePanelState, GridRowsState, GridSortingInitialState, GridSortingState, GridTabIndexState, GridVirtualizationState } from '../hooks';
2
2
  import type { GridRowsMetaState } from '../hooks/features/rows/gridRowsMetaState';
3
3
  import type { GridEditingState } from './gridEditRowModel';
4
4
  import { GridHeaderFilteringState } from './gridHeaderFilteringModel';
@@ -24,6 +24,7 @@ export interface GridStateCommunity {
24
24
  filter: GridFilterState;
25
25
  preferencePanel: GridPreferencePanelState;
26
26
  density: GridDensityState;
27
+ virtualization: GridVirtualizationState;
27
28
  }
28
29
  /**
29
30
  * The initial state of `DataGrid`.
package/models/index.d.ts CHANGED
@@ -24,5 +24,5 @@ export * from './muiEvent';
24
24
  export * from './events';
25
25
  export * from './gridSortModel';
26
26
  export * from './gridColumnGrouping';
27
- export type { GridExportOptions, GridFileExportOptions, GridGetRowsToExportParams, GridCsvGetRowsToExportParams, GridCsvExportOptions, GridPrintExportOptions, } from './gridExport';
27
+ export type { GridExportOptions, GridFileExportOptions, GridGetRowsToExportParams, GridCsvGetRowsToExportParams, GridPrintGetRowsToExportParams, GridCsvExportOptions, GridPrintExportOptions, } from './gridExport';
28
28
  export * from './gridFilterOperator';