@mui/x-data-grid 7.25.0 → 7.27.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 (132) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/DataGrid/DataGrid.js +6 -0
  3. package/DataGrid/useDataGridComponent.js +3 -3
  4. package/components/GridRow.js +8 -2
  5. package/components/GridScrollArea.d.ts +5 -2
  6. package/components/GridScrollArea.js +32 -25
  7. package/components/GridSkeletonLoadingOverlay.js +2 -1
  8. package/components/containers/GridRoot.js +11 -9
  9. package/components/containers/GridRootStyles.js +3 -3
  10. package/components/virtualization/GridMainContainer.d.ts +2 -2
  11. package/components/virtualization/GridMainContainer.js +1 -1
  12. package/components/virtualization/GridVirtualScroller.js +21 -14
  13. package/constants/dataGridPropsDefaultValues.js +1 -0
  14. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +1 -1
  15. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  16. package/hooks/core/useGridStateInitialization.js +3 -2
  17. package/hooks/features/clipboard/useGridClipboard.js +1 -1
  18. package/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  19. package/hooks/features/columns/gridColumnsSelector.d.ts +0 -5
  20. package/hooks/features/columns/gridColumnsSelector.js +0 -12
  21. package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +16 -0
  22. package/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  23. package/hooks/features/dimensions/index.d.ts +1 -1
  24. package/hooks/features/dimensions/index.js +1 -2
  25. package/hooks/features/dimensions/useGridDimensions.js +97 -70
  26. package/hooks/features/editing/gridEditingSelectors.d.ts +5 -1
  27. package/hooks/features/editing/gridEditingSelectors.js +6 -1
  28. package/hooks/features/editing/useGridRowEditing.js +4 -4
  29. package/hooks/features/filter/gridFilterState.d.ts +5 -0
  30. package/hooks/features/filter/gridFilterState.js +5 -0
  31. package/hooks/features/filter/useGridFilter.js +6 -13
  32. package/hooks/features/pagination/useGridPagination.js +1 -1
  33. package/hooks/features/pagination/useGridPaginationModel.d.ts +1 -1
  34. package/hooks/features/pagination/useGridPaginationModel.js +44 -0
  35. package/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  36. package/hooks/features/rowSelection/utils.js +1 -1
  37. package/hooks/features/rows/gridRowsMetaState.d.ts +8 -0
  38. package/hooks/features/rows/gridRowsUtils.d.ts +0 -4
  39. package/hooks/features/rows/gridRowsUtils.js +0 -16
  40. package/hooks/features/rows/useGridRowsMeta.js +33 -17
  41. package/hooks/features/sorting/gridSortingSelector.js +10 -9
  42. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +6 -0
  43. package/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  44. package/hooks/utils/useGridNativeEventListener.d.ts +0 -1
  45. package/hooks/utils/useGridNativeEventListener.js +12 -22
  46. package/hooks/utils/useGridSelector.d.ts +8 -1
  47. package/hooks/utils/useGridSelector.js +42 -8
  48. package/hooks/utils/useIsSSR.d.ts +1 -0
  49. package/hooks/utils/useIsSSR.js +5 -0
  50. package/index.js +1 -1
  51. package/internals/index.d.ts +2 -1
  52. package/internals/index.js +2 -1
  53. package/locales/plPL.js +31 -35
  54. package/locales/ukUA.js +9 -10
  55. package/models/api/gridStateApi.d.ts +1 -0
  56. package/models/events/gridEventLookup.d.ts +6 -0
  57. package/models/props/DataGridProps.d.ts +6 -0
  58. package/modern/DataGrid/DataGrid.js +6 -0
  59. package/modern/DataGrid/useDataGridComponent.js +3 -3
  60. package/modern/components/GridRow.js +8 -2
  61. package/modern/components/GridScrollArea.js +32 -25
  62. package/modern/components/GridSkeletonLoadingOverlay.js +2 -1
  63. package/modern/components/containers/GridRoot.js +11 -9
  64. package/modern/components/containers/GridRootStyles.js +3 -3
  65. package/modern/components/virtualization/GridMainContainer.js +1 -1
  66. package/modern/components/virtualization/GridVirtualScroller.js +21 -14
  67. package/modern/constants/dataGridPropsDefaultValues.js +1 -0
  68. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  69. package/modern/hooks/core/useGridStateInitialization.js +3 -2
  70. package/modern/hooks/features/clipboard/useGridClipboard.js +1 -1
  71. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  72. package/modern/hooks/features/columns/gridColumnsSelector.js +0 -12
  73. package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  74. package/modern/hooks/features/dimensions/index.js +1 -2
  75. package/modern/hooks/features/dimensions/useGridDimensions.js +97 -70
  76. package/modern/hooks/features/editing/gridEditingSelectors.js +6 -1
  77. package/modern/hooks/features/editing/useGridRowEditing.js +4 -4
  78. package/modern/hooks/features/filter/gridFilterState.js +5 -0
  79. package/modern/hooks/features/filter/useGridFilter.js +6 -13
  80. package/modern/hooks/features/pagination/useGridPagination.js +1 -1
  81. package/modern/hooks/features/pagination/useGridPaginationModel.js +44 -0
  82. package/modern/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  83. package/modern/hooks/features/rowSelection/utils.js +1 -1
  84. package/modern/hooks/features/rows/gridRowsUtils.js +0 -16
  85. package/modern/hooks/features/rows/useGridRowsMeta.js +33 -17
  86. package/modern/hooks/features/sorting/gridSortingSelector.js +10 -9
  87. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  88. package/modern/hooks/utils/useGridNativeEventListener.js +12 -22
  89. package/modern/hooks/utils/useGridSelector.js +42 -8
  90. package/modern/hooks/utils/useIsSSR.js +5 -0
  91. package/modern/index.js +1 -1
  92. package/modern/internals/index.js +2 -1
  93. package/modern/locales/plPL.js +31 -35
  94. package/modern/locales/ukUA.js +9 -10
  95. package/node/DataGrid/DataGrid.js +6 -0
  96. package/node/DataGrid/useDataGridComponent.js +3 -3
  97. package/node/components/GridRow.js +7 -2
  98. package/node/components/GridScrollArea.js +31 -24
  99. package/node/components/GridSkeletonLoadingOverlay.js +2 -1
  100. package/node/components/containers/GridRoot.js +10 -8
  101. package/node/components/containers/GridRootStyles.js +3 -3
  102. package/node/components/virtualization/GridMainContainer.js +1 -1
  103. package/node/components/virtualization/GridVirtualScroller.js +21 -14
  104. package/node/constants/dataGridPropsDefaultValues.js +1 -0
  105. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  106. package/node/hooks/core/useGridStateInitialization.js +3 -2
  107. package/node/hooks/features/clipboard/useGridClipboard.js +1 -1
  108. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  109. package/node/hooks/features/columns/gridColumnsSelector.js +1 -13
  110. package/node/hooks/features/dimensions/gridDimensionsSelectors.js +38 -2
  111. package/node/hooks/features/dimensions/index.js +13 -11
  112. package/node/hooks/features/dimensions/useGridDimensions.js +94 -67
  113. package/node/hooks/features/editing/gridEditingSelectors.js +5 -1
  114. package/node/hooks/features/editing/useGridRowEditing.js +4 -4
  115. package/node/hooks/features/filter/gridFilterState.js +6 -1
  116. package/node/hooks/features/filter/useGridFilter.js +5 -12
  117. package/node/hooks/features/pagination/useGridPagination.js +1 -1
  118. package/node/hooks/features/pagination/useGridPaginationModel.js +44 -0
  119. package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  120. package/node/hooks/features/rowSelection/utils.js +1 -1
  121. package/node/hooks/features/rows/gridRowsUtils.js +0 -17
  122. package/node/hooks/features/rows/useGridRowsMeta.js +31 -15
  123. package/node/hooks/features/sorting/gridSortingSelector.js +10 -9
  124. package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -26
  125. package/node/hooks/utils/useGridNativeEventListener.js +12 -23
  126. package/node/hooks/utils/useGridSelector.js +42 -8
  127. package/node/hooks/utils/useIsSSR.js +12 -0
  128. package/node/index.js +1 -1
  129. package/node/internals/index.js +20 -7
  130. package/node/locales/plPL.js +31 -35
  131. package/node/locales/ukUA.js +9 -10
  132. package/package.json +3 -2
@@ -3,6 +3,42 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridDimensionsSelector = void 0;
6
+ exports.gridVerticalScrollbarWidthSelector = exports.gridRowHeightSelector = exports.gridHorizontalScrollbarHeightSelector = exports.gridHeaderHeightSelector = exports.gridHeaderFilterHeightSelector = exports.gridHasScrollYSelector = exports.gridHasScrollXSelector = exports.gridHasFillerSelector = exports.gridHasBottomFillerSelector = exports.gridGroupHeaderHeightSelector = exports.gridDimensionsSelector = exports.gridContentHeightSelector = exports.gridColumnsTotalWidthSelector = void 0;
7
+ var _createSelector = require("../../../utils/createSelector");
7
8
  const gridDimensionsSelector = state => state.dimensions;
8
- exports.gridDimensionsSelector = gridDimensionsSelector;
9
+
10
+ /**
11
+ * Get the summed width of all the visible columns.
12
+ * @category Visible Columns
13
+ */
14
+ exports.gridDimensionsSelector = gridDimensionsSelector;
15
+ const gridColumnsTotalWidthSelector = exports.gridColumnsTotalWidthSelector = (0, _createSelector.createSelector)(gridDimensionsSelector, dimensions => dimensions.columnsTotalWidth);
16
+ const gridRowHeightSelector = state => state.dimensions.rowHeight;
17
+ exports.gridRowHeightSelector = gridRowHeightSelector;
18
+ const gridContentHeightSelector = state => state.dimensions.contentSize.height;
19
+ exports.gridContentHeightSelector = gridContentHeightSelector;
20
+ const gridHasScrollXSelector = state => state.dimensions.hasScrollX;
21
+ exports.gridHasScrollXSelector = gridHasScrollXSelector;
22
+ const gridHasScrollYSelector = state => state.dimensions.hasScrollY;
23
+ exports.gridHasScrollYSelector = gridHasScrollYSelector;
24
+ const gridHasFillerSelector = state => state.dimensions.columnsTotalWidth < state.dimensions.viewportOuterSize.width;
25
+ exports.gridHasFillerSelector = gridHasFillerSelector;
26
+ const gridHeaderHeightSelector = state => state.dimensions.headerHeight;
27
+ exports.gridHeaderHeightSelector = gridHeaderHeightSelector;
28
+ const gridGroupHeaderHeightSelector = state => state.dimensions.groupHeaderHeight;
29
+ exports.gridGroupHeaderHeightSelector = gridGroupHeaderHeightSelector;
30
+ const gridHeaderFilterHeightSelector = state => state.dimensions.headerFilterHeight;
31
+ exports.gridHeaderFilterHeightSelector = gridHeaderFilterHeightSelector;
32
+ const gridVerticalScrollbarWidthSelector = state => state.dimensions.hasScrollY ? state.dimensions.scrollbarSize : 0;
33
+ exports.gridVerticalScrollbarWidthSelector = gridVerticalScrollbarWidthSelector;
34
+ const gridHorizontalScrollbarHeightSelector = state => state.dimensions.hasScrollX ? state.dimensions.scrollbarSize : 0;
35
+ exports.gridHorizontalScrollbarHeightSelector = gridHorizontalScrollbarHeightSelector;
36
+ const gridHasBottomFillerSelector = state => {
37
+ const height = state.dimensions.hasScrollX ? state.dimensions.scrollbarSize : 0;
38
+ const needsLastRowBorder = state.dimensions.viewportOuterSize.height - state.dimensions.minimumSize.height > 0;
39
+ if (height === 0 && !needsLastRowBorder) {
40
+ return false;
41
+ }
42
+ return true;
43
+ };
44
+ exports.gridHasBottomFillerSelector = gridHasBottomFillerSelector;
@@ -3,14 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _gridDimensionsSelectors = require("./gridDimensionsSelectors");
7
- Object.keys(_gridDimensionsSelectors).forEach(function (key) {
8
- if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _gridDimensionsSelectors[key]) return;
10
- Object.defineProperty(exports, key, {
11
- enumerable: true,
12
- get: function () {
13
- return _gridDimensionsSelectors[key];
14
- }
15
- });
16
- });
6
+ Object.defineProperty(exports, "gridColumnsTotalWidthSelector", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _gridDimensionsSelectors.gridColumnsTotalWidthSelector;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "gridDimensionsSelector", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _gridDimensionsSelectors.gridDimensionsSelector;
16
+ }
17
+ });
18
+ var _gridDimensionsSelectors = require("./gridDimensionsSelectors");
@@ -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, {
@@ -8,8 +8,10 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.useGridPaginationModel = exports.getDerivedPaginationModel = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
+ var _gridFilterSelector = require("../filter/gridFilterSelector");
11
12
  var _density = require("../density");
12
13
  var _utils = require("../../utils");
14
+ var _utils2 = require("../../../utils/utils");
13
15
  var _pipeProcessing = require("../../core/pipeProcessing");
14
16
  var _gridPaginationSelector = require("./gridPaginationSelector");
15
17
  var _gridPaginationUtils = require("./gridPaginationUtils");
@@ -40,6 +42,7 @@ exports.getDerivedPaginationModel = getDerivedPaginationModel;
40
42
  const useGridPaginationModel = (apiRef, props) => {
41
43
  const logger = (0, _utils.useGridLogger)(apiRef, 'useGridPaginationModel');
42
44
  const densityFactor = (0, _utils.useGridSelector)(apiRef, _density.gridDensityFactorSelector);
45
+ const previousFilterModel = React.useRef((0, _gridFilterSelector.gridFilterModelSelector)(apiRef));
43
46
  const rowHeight = Math.floor(props.rowHeight * densityFactor);
44
47
  apiRef.current.registerControlState({
45
48
  stateId: 'paginationModel',
@@ -152,14 +155,55 @@ const useGridPaginationModel = (apiRef, props) => {
152
155
  return;
153
156
  }
154
157
  const paginationModel = (0, _gridPaginationSelector.gridPaginationModelSelector)(apiRef);
158
+ if (paginationModel.page === 0) {
159
+ return;
160
+ }
155
161
  const pageCount = (0, _gridPaginationSelector.gridPageCountSelector)(apiRef);
156
162
  if (paginationModel.page > pageCount - 1) {
157
163
  apiRef.current.setPage(Math.max(0, pageCount - 1));
158
164
  }
159
165
  }, [apiRef]);
166
+
167
+ /**
168
+ * Goes to the first row of the grid
169
+ */
170
+ const navigateToStart = React.useCallback(() => {
171
+ const paginationModel = (0, _gridPaginationSelector.gridPaginationModelSelector)(apiRef);
172
+ if (paginationModel.page !== 0) {
173
+ apiRef.current.setPage(0);
174
+ }
175
+
176
+ // If the page was not changed it might be needed to scroll to the top
177
+ const scrollPosition = apiRef.current.getScrollPosition();
178
+ if (scrollPosition.top !== 0) {
179
+ apiRef.current.scroll({
180
+ top: 0
181
+ });
182
+ }
183
+ }, [apiRef]);
184
+
185
+ /**
186
+ * Resets the page only if the active items or quick filter has changed from the last time.
187
+ * This is to avoid resetting the page when the filter model is changed
188
+ * because of and update of the operator from an item that does not have the value
189
+ * or reseting when the filter panel is just opened
190
+ */
191
+ const handleFilterModelChange = React.useCallback(filterModel => {
192
+ const currentActiveFilters = (0, _extends2.default)({}, filterModel, {
193
+ // replace items with the active items
194
+ items: (0, _gridFilterSelector.gridFilterActiveItemsSelector)(apiRef)
195
+ });
196
+ if ((0, _utils2.isDeepEqual)(currentActiveFilters, previousFilterModel.current)) {
197
+ return;
198
+ }
199
+ previousFilterModel.current = currentActiveFilters;
200
+ navigateToStart();
201
+ }, [apiRef, navigateToStart]);
160
202
  (0, _utils.useGridApiEventHandler)(apiRef, 'viewportInnerSizeChange', handleUpdateAutoPageSize);
161
203
  (0, _utils.useGridApiEventHandler)(apiRef, 'paginationModelChange', handlePaginationModelChange);
162
204
  (0, _utils.useGridApiEventHandler)(apiRef, 'rowCountChange', handleRowCountChange);
205
+ (0, _utils.useGridApiEventHandler)(apiRef, 'sortModelChange', (0, _utils2.runIf)(props.resetPageOnSortFilter, navigateToStart));
206
+ (0, _utils.useGridApiEventHandler)(apiRef, 'filterModelChange', (0, _utils2.runIf)(props.resetPageOnSortFilter, handleFilterModelChange));
163
207
 
164
208
  /**
165
209
  * EFFECTS
@@ -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 = [];