@mui/x-data-grid 7.25.0 → 7.26.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 (108) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/DataGrid/useDataGridComponent.js +2 -2
  3. package/components/GridRow.js +8 -2
  4. package/components/GridScrollArea.d.ts +5 -2
  5. package/components/GridScrollArea.js +32 -25
  6. package/components/GridSkeletonLoadingOverlay.js +2 -1
  7. package/components/containers/GridRoot.js +11 -9
  8. package/components/containers/GridRootStyles.js +3 -3
  9. package/components/virtualization/GridMainContainer.d.ts +2 -2
  10. package/components/virtualization/GridMainContainer.js +1 -1
  11. package/components/virtualization/GridVirtualScroller.js +21 -14
  12. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +1 -1
  13. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  14. package/hooks/core/useGridStateInitialization.js +3 -2
  15. package/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  16. package/hooks/features/columns/gridColumnsSelector.d.ts +0 -5
  17. package/hooks/features/columns/gridColumnsSelector.js +0 -12
  18. package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +16 -0
  19. package/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  20. package/hooks/features/dimensions/index.d.ts +1 -1
  21. package/hooks/features/dimensions/index.js +1 -2
  22. package/hooks/features/dimensions/useGridDimensions.js +97 -70
  23. package/hooks/features/editing/gridEditingSelectors.d.ts +5 -1
  24. package/hooks/features/editing/gridEditingSelectors.js +6 -1
  25. package/hooks/features/editing/useGridRowEditing.js +4 -4
  26. package/hooks/features/filter/gridFilterState.d.ts +5 -0
  27. package/hooks/features/filter/gridFilterState.js +5 -0
  28. package/hooks/features/filter/useGridFilter.js +6 -13
  29. package/hooks/features/pagination/useGridPagination.js +1 -1
  30. package/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  31. package/hooks/features/rowSelection/utils.js +1 -1
  32. package/hooks/features/rows/gridRowsMetaState.d.ts +8 -0
  33. package/hooks/features/rows/gridRowsUtils.d.ts +0 -4
  34. package/hooks/features/rows/gridRowsUtils.js +0 -16
  35. package/hooks/features/rows/useGridRowsMeta.js +33 -17
  36. package/hooks/features/sorting/gridSortingSelector.js +10 -9
  37. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +6 -0
  38. package/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  39. package/hooks/utils/useGridSelector.d.ts +8 -1
  40. package/hooks/utils/useGridSelector.js +42 -8
  41. package/hooks/utils/useIsSSR.d.ts +1 -0
  42. package/hooks/utils/useIsSSR.js +5 -0
  43. package/index.js +1 -1
  44. package/internals/index.d.ts +2 -1
  45. package/internals/index.js +2 -1
  46. package/models/api/gridStateApi.d.ts +1 -0
  47. package/models/events/gridEventLookup.d.ts +6 -0
  48. package/modern/DataGrid/useDataGridComponent.js +2 -2
  49. package/modern/components/GridRow.js +8 -2
  50. package/modern/components/GridScrollArea.js +32 -25
  51. package/modern/components/GridSkeletonLoadingOverlay.js +2 -1
  52. package/modern/components/containers/GridRoot.js +11 -9
  53. package/modern/components/containers/GridRootStyles.js +3 -3
  54. package/modern/components/virtualization/GridMainContainer.js +1 -1
  55. package/modern/components/virtualization/GridVirtualScroller.js +21 -14
  56. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  57. package/modern/hooks/core/useGridStateInitialization.js +3 -2
  58. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  59. package/modern/hooks/features/columns/gridColumnsSelector.js +0 -12
  60. package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  61. package/modern/hooks/features/dimensions/index.js +1 -2
  62. package/modern/hooks/features/dimensions/useGridDimensions.js +97 -70
  63. package/modern/hooks/features/editing/gridEditingSelectors.js +6 -1
  64. package/modern/hooks/features/editing/useGridRowEditing.js +4 -4
  65. package/modern/hooks/features/filter/gridFilterState.js +5 -0
  66. package/modern/hooks/features/filter/useGridFilter.js +6 -13
  67. package/modern/hooks/features/pagination/useGridPagination.js +1 -1
  68. package/modern/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  69. package/modern/hooks/features/rowSelection/utils.js +1 -1
  70. package/modern/hooks/features/rows/gridRowsUtils.js +0 -16
  71. package/modern/hooks/features/rows/useGridRowsMeta.js +33 -17
  72. package/modern/hooks/features/sorting/gridSortingSelector.js +10 -9
  73. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  74. package/modern/hooks/utils/useGridSelector.js +42 -8
  75. package/modern/hooks/utils/useIsSSR.js +5 -0
  76. package/modern/index.js +1 -1
  77. package/modern/internals/index.js +2 -1
  78. package/node/DataGrid/useDataGridComponent.js +2 -2
  79. package/node/components/GridRow.js +7 -2
  80. package/node/components/GridScrollArea.js +31 -24
  81. package/node/components/GridSkeletonLoadingOverlay.js +2 -1
  82. package/node/components/containers/GridRoot.js +10 -8
  83. package/node/components/containers/GridRootStyles.js +3 -3
  84. package/node/components/virtualization/GridMainContainer.js +1 -1
  85. package/node/components/virtualization/GridVirtualScroller.js +21 -14
  86. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  87. package/node/hooks/core/useGridStateInitialization.js +3 -2
  88. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  89. package/node/hooks/features/columns/gridColumnsSelector.js +1 -13
  90. package/node/hooks/features/dimensions/gridDimensionsSelectors.js +38 -2
  91. package/node/hooks/features/dimensions/index.js +13 -11
  92. package/node/hooks/features/dimensions/useGridDimensions.js +94 -67
  93. package/node/hooks/features/editing/gridEditingSelectors.js +5 -1
  94. package/node/hooks/features/editing/useGridRowEditing.js +4 -4
  95. package/node/hooks/features/filter/gridFilterState.js +6 -1
  96. package/node/hooks/features/filter/useGridFilter.js +5 -12
  97. package/node/hooks/features/pagination/useGridPagination.js +1 -1
  98. package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  99. package/node/hooks/features/rowSelection/utils.js +1 -1
  100. package/node/hooks/features/rows/gridRowsUtils.js +0 -17
  101. package/node/hooks/features/rows/useGridRowsMeta.js +31 -15
  102. package/node/hooks/features/sorting/gridSortingSelector.js +10 -9
  103. package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -26
  104. package/node/hooks/utils/useGridSelector.js +42 -8
  105. package/node/hooks/utils/useIsSSR.js +12 -0
  106. package/node/index.js +1 -1
  107. package/node/internals/index.js +20 -7
  108. package/package.json +3 -2
@@ -13,6 +13,7 @@ var _utils = require("@mui/utils");
13
13
  var _throttle = require("@mui/x-internals/throttle");
14
14
  var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
15
15
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
16
+ var _createSelector = require("../../../utils/createSelector");
16
17
  var _useGridLogger = require("../../utils/useGridLogger");
17
18
  var _columns = require("../columns");
18
19
  var _gridDimensionsSelectors = require("./gridDimensionsSelectors");
@@ -26,6 +27,7 @@ var _gridColumnsUtils = require("../columns/gridColumnsUtils");
26
27
  var _dataGridPropsDefaultValues = require("../../../constants/dataGridPropsDefaultValues");
27
28
  var _roundToDecimalPlaces = require("../../../utils/roundToDecimalPlaces");
28
29
  var _isJSDOM = require("../../../utils/isJSDOM");
30
+ var _utils3 = require("../../../utils/utils");
29
31
  const EMPTY_SIZE = {
30
32
  width: 0,
31
33
  height: 0
@@ -52,40 +54,48 @@ const EMPTY_DIMENSIONS = {
52
54
  topContainerHeight: 0,
53
55
  bottomContainerHeight: 0
54
56
  };
55
- const dimensionsStateInitializer = state => {
57
+ const dimensionsStateInitializer = (state, props, apiRef) => {
56
58
  const dimensions = EMPTY_DIMENSIONS;
59
+ const density = (0, _density.gridDensityFactorSelector)(apiRef);
57
60
  return (0, _extends2.default)({}, state, {
58
- dimensions
61
+ dimensions: (0, _extends2.default)({}, dimensions, getStaticDimensions(props, apiRef, density, (0, _columns.gridVisiblePinnedColumnDefinitionsSelector)(apiRef)))
59
62
  });
60
63
  };
61
64
  exports.dimensionsStateInitializer = dimensionsStateInitializer;
65
+ const columnsTotalWidthSelector = (0, _createSelector.createSelector)(_columns.gridVisibleColumnDefinitionsSelector, _columns.gridColumnPositionsSelector, (visibleColumns, positions) => {
66
+ const colCount = visibleColumns.length;
67
+ if (colCount === 0) {
68
+ return 0;
69
+ }
70
+ return (0, _roundToDecimalPlaces.roundToDecimalPlaces)(positions[colCount - 1] + visibleColumns[colCount - 1].computedWidth, 1);
71
+ });
62
72
  function useGridDimensions(apiRef, props) {
63
73
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useResizeContainer');
64
74
  const errorShown = React.useRef(false);
65
75
  const rootDimensionsRef = React.useRef(EMPTY_SIZE);
66
- const dimensionsState = (0, _utils2.useGridSelector)(apiRef, _gridDimensionsSelectors.gridDimensionsSelector);
67
- const rowsMeta = (0, _utils2.useGridSelector)(apiRef, _gridRowsMetaSelector.gridRowsMetaSelector);
68
76
  const pinnedColumns = (0, _utils2.useGridSelector)(apiRef, _columns.gridVisiblePinnedColumnDefinitionsSelector);
69
77
  const densityFactor = (0, _utils2.useGridSelector)(apiRef, _density.gridDensityFactorSelector);
70
- const validRowHeight = React.useMemo(() => (0, _gridRowsUtils.getValidRowHeight)(props.rowHeight, _dataGridPropsDefaultValues.DATA_GRID_PROPS_DEFAULT_VALUES.rowHeight, _gridRowsUtils.rowHeightWarning), [props.rowHeight]);
71
- const rowHeight = Math.floor(validRowHeight * densityFactor);
72
- const headerHeight = Math.floor(props.columnHeaderHeight * densityFactor);
73
- const groupHeaderHeight = Math.floor((props.columnGroupHeaderHeight ?? props.columnHeaderHeight) * densityFactor);
74
- const headerFilterHeight = Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * densityFactor);
75
- const columnsTotalWidth = (0, _roundToDecimalPlaces.roundToDecimalPlaces)((0, _columns.gridColumnsTotalWidthSelector)(apiRef), 1);
76
- const headersTotalHeight = (0, _gridColumnsUtils.getTotalHeaderHeight)(apiRef, props);
77
- const leftPinnedWidth = pinnedColumns.left.reduce((w, col) => w + col.computedWidth, 0);
78
- const rightPinnedWidth = pinnedColumns.right.reduce((w, col) => w + col.computedWidth, 0);
79
- const [savedSize, setSavedSize] = React.useState();
80
- const debouncedSetSavedSize = React.useMemo(() => (0, _throttle.throttle)(setSavedSize, props.resizeThrottleMs), [props.resizeThrottleMs]);
81
- React.useEffect(() => debouncedSetSavedSize.clear, [debouncedSetSavedSize]);
78
+ const columnsTotalWidth = (0, _utils2.useGridSelector)(apiRef, columnsTotalWidthSelector);
79
+ const isFirstSizing = React.useRef(true);
80
+ const {
81
+ rowHeight,
82
+ headerHeight,
83
+ groupHeaderHeight,
84
+ headerFilterHeight,
85
+ headersTotalHeight,
86
+ leftPinnedWidth,
87
+ rightPinnedWidth
88
+ } = getStaticDimensions(props, apiRef, densityFactor, pinnedColumns);
82
89
  const previousSize = React.useRef(undefined);
83
- const getRootDimensions = () => apiRef.current.state.dimensions;
84
- const setDimensions = (0, _utils.unstable_useEventCallback)(dimensions => {
90
+ const getRootDimensions = React.useCallback(() => (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state), [apiRef]);
91
+ const setDimensions = React.useCallback(dimensions => {
85
92
  apiRef.current.setState(state => (0, _extends2.default)({}, state, {
86
93
  dimensions
87
94
  }));
88
- });
95
+ if (apiRef.current.rootElementRef.current) {
96
+ setCSSVariables(apiRef.current.rootElementRef.current, (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state));
97
+ }
98
+ }, [apiRef]);
89
99
  const resize = React.useCallback(() => {
90
100
  const element = apiRef.current.mainElementRef.current;
91
101
  if (!element) {
@@ -106,10 +116,7 @@ function useGridDimensions(apiRef, props) {
106
116
  if (!dimensions.isReady) {
107
117
  return 0;
108
118
  }
109
- const currentPage = (0, _useGridVisibleRows.getVisibleRows)(apiRef, {
110
- pagination: props.pagination,
111
- paginationMode: props.paginationMode
112
- });
119
+ const currentPage = (0, _useGridVisibleRows.getVisibleRows)(apiRef);
113
120
 
114
121
  // TODO: Use a combination of scrollTop, dimensions.viewportInnerSize.height and rowsMeta.possitions
115
122
  // to find out the maximum number of rows that can fit in the visible part of the grid
@@ -120,16 +127,19 @@ function useGridDimensions(apiRef, props) {
120
127
  }
121
128
  const maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
122
129
  return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
123
- }, [apiRef, props.pagination, props.paginationMode, props.getRowHeight, rowHeight]);
130
+ }, [apiRef, props.getRowHeight, rowHeight]);
124
131
  const updateDimensions = React.useCallback(() => {
132
+ if (isFirstSizing.current) {
133
+ return;
134
+ }
125
135
  // All the floating point dimensions should be rounded to .1 decimal places to avoid subpixel rendering issues
126
136
  // https://github.com/mui/mui-x/issues/9550#issuecomment-1619020477
127
137
  // https://github.com/mui/mui-x/issues/15721
128
138
  const rootElement = apiRef.current.rootElementRef.current;
129
- const pinnedRowsHeight = (0, _gridRowsUtils.calculatePinnedRowsHeight)(apiRef);
130
- const scrollbarSize = measureScrollbarSize(rootElement, columnsTotalWidth, props.scrollbarSize);
131
- const topContainerHeight = headersTotalHeight + pinnedRowsHeight.top;
132
- const bottomContainerHeight = pinnedRowsHeight.bottom;
139
+ const scrollbarSize = measureScrollbarSize(rootElement, props.scrollbarSize);
140
+ const rowsMeta = (0, _gridRowsMetaSelector.gridRowsMetaSelector)(apiRef.current.state);
141
+ const topContainerHeight = headersTotalHeight + rowsMeta.pinnedTopRowsTotalHeight;
142
+ const bottomContainerHeight = rowsMeta.pinnedBottomRowsTotalHeight;
133
143
  const nonPinnedColumnsTotalWidth = columnsTotalWidth - leftPinnedWidth - rightPinnedWidth;
134
144
  const contentSize = {
135
145
  width: nonPinnedColumnsTotalWidth,
@@ -207,12 +217,21 @@ function useGridDimensions(apiRef, props) {
207
217
  bottomContainerHeight
208
218
  };
209
219
  const prevDimensions = apiRef.current.state.dimensions;
220
+ if ((0, _utils3.isDeepEqual)(prevDimensions, newDimensions)) {
221
+ return;
222
+ }
210
223
  setDimensions(newDimensions);
211
224
  if (!areElementSizesEqual(newDimensions.viewportInnerSize, prevDimensions.viewportInnerSize)) {
212
225
  apiRef.current.publishEvent('viewportInnerSizeChange', newDimensions.viewportInnerSize);
213
226
  }
214
227
  apiRef.current.updateRenderContext?.();
215
- }, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowsMeta.currentPageTotalHeight, rowHeight, headerHeight, groupHeaderHeight, headerFilterHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
228
+ }, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowHeight, headerHeight, groupHeaderHeight, headerFilterHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
229
+ const updateDimensionCallback = (0, _utils.unstable_useEventCallback)(updateDimensions);
230
+ const debouncedUpdateDimensions = React.useMemo(() => props.resizeThrottleMs > 0 ? (0, _throttle.throttle)(() => {
231
+ updateDimensionCallback();
232
+ apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
233
+ }, props.resizeThrottleMs) : undefined, [apiRef, props.resizeThrottleMs, updateDimensionCallback]);
234
+ React.useEffect(() => debouncedUpdateDimensions?.clear, [debouncedUpdateDimensions]);
216
235
  const apiPublic = {
217
236
  resize,
218
237
  getRootDimensions
@@ -221,35 +240,12 @@ function useGridDimensions(apiRef, props) {
221
240
  updateDimensions,
222
241
  getViewportPageSize
223
242
  };
243
+ (0, _utils.unstable_useEnhancedEffect)(updateDimensions, [updateDimensions]);
224
244
  (0, _useGridApiMethod.useGridApiMethod)(apiRef, apiPublic, 'public');
225
245
  (0, _useGridApiMethod.useGridApiMethod)(apiRef, apiPrivate, 'private');
226
- (0, _utils.unstable_useEnhancedEffect)(() => {
227
- if (savedSize) {
228
- updateDimensions();
229
- apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
230
- }
231
- }, [apiRef, savedSize, updateDimensions]);
232
- const root = apiRef.current.rootElementRef.current;
233
- (0, _utils.unstable_useEnhancedEffect)(() => {
234
- if (!root) {
235
- return;
236
- }
237
- const set = (k, v) => root.style.setProperty(k, v);
238
- set('--DataGrid-width', `${dimensionsState.viewportOuterSize.width}px`);
239
- set('--DataGrid-hasScrollX', `${Number(dimensionsState.hasScrollX)}`);
240
- set('--DataGrid-hasScrollY', `${Number(dimensionsState.hasScrollY)}`);
241
- set('--DataGrid-scrollbarSize', `${dimensionsState.scrollbarSize}px`);
242
- set('--DataGrid-rowWidth', `${dimensionsState.rowWidth}px`);
243
- set('--DataGrid-columnsTotalWidth', `${dimensionsState.columnsTotalWidth}px`);
244
- set('--DataGrid-leftPinnedWidth', `${dimensionsState.leftPinnedWidth}px`);
245
- set('--DataGrid-rightPinnedWidth', `${dimensionsState.rightPinnedWidth}px`);
246
- set('--DataGrid-headerHeight', `${dimensionsState.headerHeight}px`);
247
- set('--DataGrid-headersTotalHeight', `${dimensionsState.headersTotalHeight}px`);
248
- set('--DataGrid-topContainerHeight', `${dimensionsState.topContainerHeight}px`);
249
- set('--DataGrid-bottomContainerHeight', `${dimensionsState.bottomContainerHeight}px`);
250
- set('--height', `${dimensionsState.rowHeight}px`);
251
- }, [root, dimensionsState]);
252
- const isFirstSizing = React.useRef(true);
246
+ const handleRootMount = React.useCallback(root => {
247
+ setCSSVariables(root, (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state));
248
+ }, [apiRef]);
253
249
  const handleResize = React.useCallback(size => {
254
250
  rootDimensionsRef.current = size;
255
251
  if (size.height === 0 && !errorShown.current && !props.autoHeight && !_isJSDOM.isJSDOM) {
@@ -260,28 +256,58 @@ function useGridDimensions(apiRef, props) {
260
256
  logger.error(['The parent DOM element of the Data Grid has an empty width.', 'Please make sure that this element has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
261
257
  errorShown.current = true;
262
258
  }
263
- if (isFirstSizing.current) {
259
+ if (isFirstSizing.current || !debouncedUpdateDimensions) {
264
260
  // We want to initialize the grid dimensions as soon as possible to avoid flickering
265
- setSavedSize(size);
266
261
  isFirstSizing.current = false;
262
+ updateDimensions();
267
263
  return;
268
264
  }
269
- debouncedSetSavedSize(size);
270
- }, [props.autoHeight, debouncedSetSavedSize, logger]);
271
- (0, _utils.unstable_useEnhancedEffect)(updateDimensions, [updateDimensions]);
272
- (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'sortedRowsSet', updateDimensions);
273
- (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'paginationModelChange', updateDimensions);
274
- (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'columnsChange', updateDimensions);
275
- (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'resize', handleResize);
265
+ debouncedUpdateDimensions();
266
+ }, [updateDimensions, props.autoHeight, debouncedUpdateDimensions, logger]);
267
+ (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'rootMount', handleRootMount);
268
+ (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'resize', handleResize);
276
269
  (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'debouncedResize', props.onResize);
277
270
  }
278
- function measureScrollbarSize(rootElement, columnsTotalWidth, scrollbarSize) {
271
+ function setCSSVariables(root, dimensions) {
272
+ const set = (k, v) => root.style.setProperty(k, v);
273
+ set('--DataGrid-hasScrollX', `${Number(dimensions.hasScrollX)}`);
274
+ set('--DataGrid-hasScrollY', `${Number(dimensions.hasScrollY)}`);
275
+ set('--DataGrid-scrollbarSize', `${dimensions.scrollbarSize}px`);
276
+ set('--DataGrid-rowWidth', `${dimensions.rowWidth}px`);
277
+ set('--DataGrid-columnsTotalWidth', `${dimensions.columnsTotalWidth}px`);
278
+ set('--DataGrid-leftPinnedWidth', `${dimensions.leftPinnedWidth}px`);
279
+ set('--DataGrid-rightPinnedWidth', `${dimensions.rightPinnedWidth}px`);
280
+ set('--DataGrid-headerHeight', `${dimensions.headerHeight}px`);
281
+ set('--DataGrid-headersTotalHeight', `${dimensions.headersTotalHeight}px`);
282
+ set('--DataGrid-topContainerHeight', `${dimensions.topContainerHeight}px`);
283
+ set('--DataGrid-bottomContainerHeight', `${dimensions.bottomContainerHeight}px`);
284
+ set('--height', `${dimensions.rowHeight}px`);
285
+ }
286
+ function getStaticDimensions(props, apiRef, density, pinnedColumnns) {
287
+ const validRowHeight = (0, _gridRowsUtils.getValidRowHeight)(props.rowHeight, _dataGridPropsDefaultValues.DATA_GRID_PROPS_DEFAULT_VALUES.rowHeight, _gridRowsUtils.rowHeightWarning);
288
+ return {
289
+ rowHeight: Math.floor(validRowHeight * density),
290
+ headerHeight: Math.floor(props.columnHeaderHeight * density),
291
+ groupHeaderHeight: Math.floor((props.columnGroupHeaderHeight ?? props.columnHeaderHeight) * density),
292
+ headerFilterHeight: Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * density),
293
+ columnsTotalWidth: columnsTotalWidthSelector(apiRef),
294
+ headersTotalHeight: (0, _gridColumnsUtils.getTotalHeaderHeight)(apiRef, props),
295
+ leftPinnedWidth: pinnedColumnns.left.reduce((w, col) => w + col.computedWidth, 0),
296
+ rightPinnedWidth: pinnedColumnns.right.reduce((w, col) => w + col.computedWidth, 0)
297
+ };
298
+ }
299
+ const scrollbarSizeCache = new WeakMap();
300
+ function measureScrollbarSize(rootElement, scrollbarSize) {
279
301
  if (scrollbarSize !== undefined) {
280
302
  return scrollbarSize;
281
303
  }
282
- if (rootElement === null || columnsTotalWidth === 0) {
304
+ if (rootElement === null) {
283
305
  return 0;
284
306
  }
307
+ const cachedSize = scrollbarSizeCache.get(rootElement);
308
+ if (cachedSize !== undefined) {
309
+ return cachedSize;
310
+ }
285
311
  const doc = (0, _utils.unstable_ownerDocument)(rootElement);
286
312
  const scrollDiv = doc.createElement('div');
287
313
  scrollDiv.style.width = '99px';
@@ -292,6 +318,7 @@ function measureScrollbarSize(rootElement, columnsTotalWidth, scrollbarSize) {
292
318
  rootElement.appendChild(scrollDiv);
293
319
  const size = scrollDiv.offsetWidth - scrollDiv.clientWidth;
294
320
  rootElement.removeChild(scrollDiv);
321
+ scrollbarSizeCache.set(rootElement, size);
295
322
  return size;
296
323
  }
297
324
  function areElementSizesEqual(a, b) {
@@ -5,12 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.gridRowIsEditingSelector = exports.gridEditRowsStateSelector = exports.gridEditCellStateSelector = void 0;
7
7
  var _createSelector = require("../../../utils/createSelector");
8
+ var _gridEditRowModel = require("../../../models/gridEditRowModel");
8
9
  /**
9
10
  * Select the row editing state.
10
11
  */
11
12
  const gridEditRowsStateSelector = state => state.editRows;
12
13
  exports.gridEditRowsStateSelector = gridEditRowsStateSelector;
13
- const gridRowIsEditingSelector = exports.gridRowIsEditingSelector = (0, _createSelector.createSelectorV8)(gridEditRowsStateSelector, (editRows, rowId) => Boolean(editRows[rowId]));
14
+ const gridRowIsEditingSelector = exports.gridRowIsEditingSelector = (0, _createSelector.createSelectorV8)(gridEditRowsStateSelector, (editRows, {
15
+ rowId,
16
+ editMode
17
+ }) => editMode === _gridEditRowModel.GridEditModes.Row && Boolean(editRows[rowId]));
14
18
  const gridEditCellStateSelector = exports.gridEditCellStateSelector = (0, _createSelector.createSelectorV8)(gridEditRowsStateSelector, (editRows, {
15
19
  rowId,
16
20
  field
@@ -240,10 +240,10 @@ const useGridRowEditing = (apiRef, props) => {
240
240
  (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'rowEditStart', props.onRowEditStart);
241
241
  (0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'rowEditStop', props.onRowEditStop);
242
242
  const getRowMode = React.useCallback(id => {
243
- if (props.editMode === _gridEditRowModel.GridEditModes.Cell) {
244
- return _gridEditRowModel.GridRowModes.View;
245
- }
246
- const isEditing = (0, _gridEditingSelectors.gridRowIsEditingSelector)(apiRef, id);
243
+ const isEditing = (0, _gridEditingSelectors.gridRowIsEditingSelector)(apiRef, {
244
+ rowId: id,
245
+ editMode: props.editMode
246
+ });
247
247
  return isEditing ? _gridEditRowModel.GridRowModes.Edit : _gridEditRowModel.GridRowModes.View;
248
248
  }, [apiRef, props.editMode]);
249
249
  const updateRowModesModel = (0, _utils.unstable_useEventCallback)(newModel => {
@@ -3,8 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getDefaultGridFilterModel = void 0;
6
+ exports.getDefaultGridFilterModel = exports.defaultGridFilterLookup = void 0;
7
7
  var _gridFilterItem = require("../../../models/gridFilterItem");
8
+ const defaultGridFilterLookup = exports.defaultGridFilterLookup = {
9
+ filteredRowsLookup: {},
10
+ filteredChildrenCountLookup: {},
11
+ filteredDescendantCountLookup: {}
12
+ };
8
13
  const getDefaultGridFilterModel = () => ({
9
14
  items: [],
10
15
  logicOperator: _gridFilterItem.GridLogicOperator.And,
@@ -28,12 +28,9 @@ var _jsxRuntime = require("react/jsx-runtime");
28
28
  const filterStateInitializer = (state, props, apiRef) => {
29
29
  const filterModel = props.filterModel ?? props.initialState?.filter?.filterModel ?? (0, _gridFilterState.getDefaultGridFilterModel)();
30
30
  return (0, _extends2.default)({}, state, {
31
- filter: {
32
- filterModel: (0, _gridFilterUtils.sanitizeFilterModel)(filterModel, props.disableMultipleColumnsFiltering, apiRef),
33
- filteredRowsLookup: {},
34
- filteredChildrenCountLookup: {},
35
- filteredDescendantCountLookup: {}
36
- },
31
+ filter: (0, _extends2.default)({
32
+ filterModel: (0, _gridFilterUtils.sanitizeFilterModel)(filterModel, props.disableMultipleColumnsFiltering, apiRef)
33
+ }, _gridFilterState.defaultGridFilterLookup),
37
34
  visibleRowsLookup: {}
38
35
  });
39
36
  };
@@ -280,12 +277,8 @@ const useGridFilter = (apiRef, props) => {
280
277
  } = props;
281
278
  const getRowsRef = (0, _useLazyRef.useLazyRef)(createMemoizedValues);
282
279
  const flatFilteringMethod = React.useCallback(params => {
283
- if (props.filterMode !== 'client' || !params.isRowMatchingFilters) {
284
- return {
285
- filteredRowsLookup: {},
286
- filteredChildrenCountLookup: {},
287
- filteredDescendantCountLookup: {}
288
- };
280
+ if (props.filterMode !== 'client' || !params.isRowMatchingFilters || !params.filterModel.items.length && !params.filterModel.quickFilterValues?.length) {
281
+ return _gridFilterState.defaultGridFilterLookup;
289
282
  }
290
283
  const dataRowIdToModelLookup = (0, _rows.gridRowsLookupSelector)(apiRef);
291
284
  const filteredRowsLookup = {};
@@ -13,7 +13,7 @@ var _useGridPaginationMeta = require("./useGridPaginationMeta");
13
13
  const paginationStateInitializer = (state, props) => {
14
14
  const paginationModel = (0, _extends2.default)({}, (0, _gridPaginationUtils.getDefaultGridPaginationModel)(props.autoPageSize), props.paginationModel ?? props.initialState?.pagination?.paginationModel);
15
15
  (0, _gridPaginationUtils.throwIfPageSizeExceedsTheLimit)(paginationModel.pageSize, props.signature);
16
- const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount;
16
+ const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount ?? (props.paginationMode === 'client' ? state.rows?.totalRowCount : undefined);
17
17
  const meta = props.paginationMeta ?? props.initialState?.pagination?.meta ?? {};
18
18
  return (0, _extends2.default)({}, state, {
19
19
  pagination: (0, _extends2.default)({}, state.pagination, {
@@ -267,7 +267,7 @@ const useGridRowSelection = (apiRef, props) => {
267
267
  if (props.filterMode === 'server') {
268
268
  return !rowsLookup[id];
269
269
  }
270
- return filteredRowsLookup[id] !== true;
270
+ return !rowsLookup[id] || filteredRowsLookup[id] === false;
271
271
  };
272
272
  let hasChanged = false;
273
273
  currentSelection.forEach(id => {
@@ -100,7 +100,7 @@ const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
100
100
  return [];
101
101
  }
102
102
  const parentNode = tree[parent];
103
- return parentNode.children.filter(childId => childId !== id && filteredRows[childId]);
103
+ return parentNode.children.filter(childId => childId !== id && filteredRows[childId] !== false);
104
104
  };
105
105
  const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow) => {
106
106
  const filteredRows = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
@@ -5,12 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.buildRootGroup = exports.GRID_ROOT_GROUP_ID = exports.GRID_ID_AUTOGENERATED = void 0;
8
- exports.calculatePinnedRowsHeight = calculatePinnedRowsHeight;
9
8
  exports.checkGridRowIdIsValid = checkGridRowIdIsValid;
10
9
  exports.computeRowsUpdates = computeRowsUpdates;
11
10
  exports.updateCacheWithNewRows = exports.rowHeightWarning = exports.minimalContentHeight = exports.isAutogeneratedRowNode = exports.isAutogeneratedRow = exports.getValidRowHeight = exports.getTreeNodeDescendants = exports.getTopLevelRowCount = exports.getRowsStateFromCache = exports.getRowIdFromRowModel = exports.getRowHeightWarning = exports.createRowsInternalCache = void 0;
12
11
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
- var _gridRowsSelector = require("./gridRowsSelector");
14
12
  const GRID_ROOT_GROUP_ID = exports.GRID_ROOT_GROUP_ID = `auto-generated-group-node-root`;
15
13
  const GRID_ID_AUTOGENERATED = exports.GRID_ID_AUTOGENERATED = Symbol('mui.id_autogenerated');
16
14
  const buildRootGroup = () => ({
@@ -289,21 +287,6 @@ const updateCacheWithNewRows = ({
289
287
  };
290
288
  };
291
289
  exports.updateCacheWithNewRows = updateCacheWithNewRows;
292
- function calculatePinnedRowsHeight(apiRef) {
293
- const pinnedRows = (0, _gridRowsSelector.gridPinnedRowsSelector)(apiRef);
294
- const topPinnedRowsHeight = pinnedRows?.top?.reduce((acc, value) => {
295
- acc += apiRef.current.unstable_getRowHeight(value.id);
296
- return acc;
297
- }, 0) || 0;
298
- const bottomPinnedRowsHeight = pinnedRows?.bottom?.reduce((acc, value) => {
299
- acc += apiRef.current.unstable_getRowHeight(value.id);
300
- return acc;
301
- }, 0) || 0;
302
- return {
303
- top: topPinnedRowsHeight,
304
- bottom: bottomPinnedRowsHeight
305
- };
306
- }
307
290
  const minimalContentHeight = exports.minimalContentHeight = 'var(--DataGrid-overlayHeight, calc(var(--height) * 2))';
308
291
  function computeRowsUpdates(apiRef, updates, getRowId) {
309
292
  const nonPinnedRowsUpdates = [];
@@ -16,9 +16,7 @@ var _utils2 = require("../../../utils/utils");
16
16
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
17
17
  var _useGridSelector = require("../../utils/useGridSelector");
18
18
  var _densitySelector = require("../density/densitySelector");
19
- var _gridFilterSelector = require("../filter/gridFilterSelector");
20
19
  var _gridPaginationSelector = require("../pagination/gridPaginationSelector");
21
- var _gridSortingSelector = require("../sorting/gridSortingSelector");
22
20
  var _pipeProcessing = require("../../core/pipeProcessing");
23
21
  var _gridRowsSelector = require("./gridRowsSelector");
24
22
  var _gridDimensionsSelectors = require("../dimensions/gridDimensionsSelectors");
@@ -29,10 +27,18 @@ const rowsMetaStateInitializer = (state, props, apiRef) => {
29
27
  apiRef.current.caches.rowsMeta = {
30
28
  heights: new Map()
31
29
  };
30
+ const baseRowHeight = (0, _gridDimensionsSelectors.gridRowHeightSelector)(apiRef.current.state);
31
+ const dataRowCount = (0, _gridRowsSelector.gridRowCountSelector)(apiRef);
32
+ const pagination = (0, _gridPaginationSelector.gridPaginationSelector)(apiRef.current.state);
33
+ const rowCount = Math.min(pagination.enabled ? pagination.paginationModel.pageSize : dataRowCount, dataRowCount);
32
34
  return (0, _extends2.default)({}, state, {
33
35
  rowsMeta: {
34
- currentPageTotalHeight: 0,
35
- positions: []
36
+ currentPageTotalHeight: rowCount * baseRowHeight,
37
+ positions: Array.from({
38
+ length: rowCount
39
+ }, (_, i) => i * baseRowHeight),
40
+ pinnedTopRowsTotalHeight: 0,
41
+ pinnedBottomRowsTotalHeight: 0
36
42
  }
37
43
  });
38
44
  };
@@ -53,12 +59,9 @@ const useGridRowsMeta = (apiRef, props) => {
53
59
  const hasRowWithAutoHeight = React.useRef(false);
54
60
  const isHeightMetaValid = React.useRef(false);
55
61
  const densityFactor = (0, _useGridSelector.useGridSelector)(apiRef, _densitySelector.gridDensityFactorSelector);
56
- const filterModel = (0, _useGridSelector.useGridSelector)(apiRef, _gridFilterSelector.gridFilterModelSelector);
57
- const paginationState = (0, _useGridSelector.useGridSelector)(apiRef, _gridPaginationSelector.gridPaginationSelector);
58
- const sortModel = (0, _useGridSelector.useGridSelector)(apiRef, _gridSortingSelector.gridSortModelSelector);
59
62
  const currentPage = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props);
60
63
  const pinnedRows = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridPinnedRowsSelector);
61
- const rowHeight = (0, _useGridSelector.useGridSelector)(apiRef, () => (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state).rowHeight);
64
+ const rowHeight = (0, _useGridSelector.useGridSelector)(apiRef, _gridDimensionsSelectors.gridRowHeightSelector);
62
65
  const getRowHeightEntry = rowId => {
63
66
  let entry = heightCache.get(rowId);
64
67
  if (entry === undefined) {
@@ -123,8 +126,14 @@ const useGridRowsMeta = (apiRef, props) => {
123
126
  }, [apiRef, currentPage.rows, getRowHeightProp, getEstimatedRowHeight, rowHeight, getRowSpacing, densityFactor]);
124
127
  const hydrateRowsMeta = React.useCallback(() => {
125
128
  hasRowWithAutoHeight.current = false;
126
- pinnedRows.top.forEach(processHeightEntry);
127
- pinnedRows.bottom.forEach(processHeightEntry);
129
+ const pinnedTopRowsTotalHeight = pinnedRows.top.reduce((acc, row) => {
130
+ const entry = processHeightEntry(row);
131
+ return acc + entry.content + entry.spacingTop + entry.spacingBottom + entry.detail;
132
+ }, 0);
133
+ const pinnedBottomRowsTotalHeight = pinnedRows.bottom.reduce((acc, row) => {
134
+ const entry = processHeightEntry(row);
135
+ return acc + entry.content + entry.spacingTop + entry.spacingBottom + entry.detail;
136
+ }, 0);
128
137
  const positions = [];
129
138
  const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
130
139
  positions.push(acc);
@@ -136,14 +145,21 @@ const useGridRowsMeta = (apiRef, props) => {
136
145
  // No row has height=auto, so all rows are already measured
137
146
  lastMeasuredRowIndex.current = Infinity;
138
147
  }
148
+ const didHeightsChange = pinnedTopRowsTotalHeight !== apiRef.current.state.rowsMeta.pinnedTopRowsTotalHeight || pinnedBottomRowsTotalHeight !== apiRef.current.state.rowsMeta.pinnedBottomRowsTotalHeight || currentPageTotalHeight !== apiRef.current.state.rowsMeta.currentPageTotalHeight;
149
+ const rowsMeta = {
150
+ currentPageTotalHeight,
151
+ positions,
152
+ pinnedTopRowsTotalHeight,
153
+ pinnedBottomRowsTotalHeight
154
+ };
139
155
  apiRef.current.setState(state => {
140
156
  return (0, _extends2.default)({}, state, {
141
- rowsMeta: {
142
- currentPageTotalHeight,
143
- positions
144
- }
157
+ rowsMeta
145
158
  });
146
159
  });
160
+ if (didHeightsChange) {
161
+ apiRef.current.updateDimensions();
162
+ }
147
163
  isHeightMetaValid.current = true;
148
164
  }, [apiRef, pinnedRows, currentPage.rows, processHeightEntry]);
149
165
  const getRowHeight = rowId => {
@@ -193,7 +209,7 @@ const useGridRowsMeta = (apiRef, props) => {
193
209
  // Because of variable row height this is needed for the virtualization
194
210
  (0, _utils.unstable_useEnhancedEffect)(() => {
195
211
  hydrateRowsMeta();
196
- }, [filterModel, paginationState, sortModel, hydrateRowsMeta]);
212
+ }, [hydrateRowsMeta]);
197
213
  const rowsMetaApi = {
198
214
  unstable_getRowHeight: getRowHeight,
199
215
  unstable_setLastMeasuredRowIndex: setLastMeasuredRowIndex,
@@ -30,15 +30,16 @@ const gridSortedRowEntriesSelector = exports.gridSortedRowEntriesSelector = (0,
30
30
  id,
31
31
  model
32
32
  });
33
- }
34
- const rowNode = rowTree[id];
35
- if (rowNode && (0, _gridRowsUtils.isAutogeneratedRowNode)(rowNode)) {
36
- acc.push({
37
- id,
38
- model: {
39
- [_gridRowsUtils.GRID_ID_AUTOGENERATED]: id
40
- }
41
- });
33
+ } else {
34
+ const rowNode = rowTree[id];
35
+ if (rowNode && (0, _gridRowsUtils.isAutogeneratedRowNode)(rowNode)) {
36
+ acc.push({
37
+ id,
38
+ model: {
39
+ [_gridRowsUtils.GRID_ID_AUTOGENERATED]: id
40
+ }
41
+ });
42
+ }
42
43
  }
43
44
  return acc;
44
45
  }, []));