@mui/x-data-grid 6.7.0 → 6.9.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 (205) hide show
  1. package/CHANGELOG.md +145 -5541
  2. package/components/GridColumnHeaders.d.ts +2 -2
  3. package/components/GridColumnHeaders.js +3 -1
  4. package/components/GridPagination.d.ts +2 -2
  5. package/components/GridRow.d.ts +2 -2
  6. package/components/GridRow.js +33 -79
  7. package/components/cell/GridCell.d.ts +24 -15
  8. package/components/cell/GridCell.js +422 -45
  9. package/components/cell/GridEditInputCell.js +9 -9
  10. package/components/cell/index.d.ts +2 -1
  11. package/components/cell/index.js +1 -1
  12. package/components/containers/GridRootStyles.js +30 -16
  13. package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  14. package/components/panel/GridPanel.d.ts +1 -1
  15. package/components/toolbar/GridToolbar.js +2 -2
  16. package/components/virtualization/GridVirtualScroller.js +4 -9
  17. package/components/virtualization/GridVirtualScrollerContent.js +11 -20
  18. package/constants/defaultGridSlotsComponents.js +6 -2
  19. package/hooks/core/useGridApiInitialization.js +4 -1
  20. package/hooks/core/useGridStateInitialization.js +2 -9
  21. package/hooks/features/clipboard/useGridClipboard.js +1 -4
  22. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -4
  23. package/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  24. package/hooks/features/columns/gridColumnsSelector.js +7 -7
  25. package/hooks/features/dimensions/useGridDimensions.js +6 -12
  26. package/hooks/features/editing/useGridCellEditing.js +5 -3
  27. package/hooks/features/editing/useGridRowEditing.js +14 -6
  28. package/hooks/features/filter/gridFilterSelector.js +8 -8
  29. package/hooks/features/filter/gridFilterUtils.d.ts +4 -1
  30. package/hooks/features/filter/gridFilterUtils.js +19 -13
  31. package/hooks/features/filter/useGridFilter.js +2 -1
  32. package/hooks/features/focus/useGridFocus.js +9 -4
  33. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  34. package/hooks/features/pagination/gridPaginationSelector.js +4 -4
  35. package/hooks/features/rowSelection/gridRowSelectionSelector.js +3 -3
  36. package/hooks/features/rows/gridRowsSelector.js +3 -3
  37. package/hooks/features/rows/useGridParamsApi.d.ts +2 -0
  38. package/hooks/features/rows/useGridParamsApi.js +7 -15
  39. package/hooks/features/sorting/gridSortingSelector.js +3 -3
  40. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +8 -816
  41. package/hooks/features/virtualization/useGridVirtualScroller.js +40 -38
  42. package/hooks/utils/index.d.ts +1 -1
  43. package/hooks/utils/index.js +1 -1
  44. package/hooks/utils/useGridSelector.d.ts +3 -1
  45. package/hooks/utils/useGridSelector.js +37 -6
  46. package/hooks/utils/useLazyRef.d.ts +2 -0
  47. package/hooks/utils/useLazyRef.js +9 -0
  48. package/hooks/utils/useOnMount.d.ts +2 -0
  49. package/hooks/utils/useOnMount.js +7 -0
  50. package/index.js +1 -1
  51. package/internals/index.d.ts +1 -1
  52. package/internals/index.js +1 -1
  53. package/legacy/components/GridColumnHeaders.js +3 -1
  54. package/legacy/components/GridRow.js +35 -79
  55. package/legacy/components/cell/GridCell.js +425 -46
  56. package/legacy/components/cell/GridEditInputCell.js +9 -9
  57. package/legacy/components/cell/index.js +1 -1
  58. package/legacy/components/containers/GridRootStyles.js +20 -17
  59. package/legacy/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  60. package/legacy/components/toolbar/GridToolbar.js +2 -2
  61. package/legacy/components/virtualization/GridVirtualScroller.js +4 -7
  62. package/legacy/components/virtualization/GridVirtualScrollerContent.js +10 -17
  63. package/legacy/constants/defaultGridSlotsComponents.js +6 -2
  64. package/legacy/hooks/core/useGridApiInitialization.js +4 -1
  65. package/legacy/hooks/core/useGridStateInitialization.js +2 -7
  66. package/legacy/hooks/features/clipboard/useGridClipboard.js +1 -4
  67. package/legacy/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -4
  68. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  69. package/legacy/hooks/features/columns/gridColumnsSelector.js +7 -7
  70. package/legacy/hooks/features/dimensions/useGridDimensions.js +6 -12
  71. package/legacy/hooks/features/editing/useGridCellEditing.js +5 -3
  72. package/legacy/hooks/features/editing/useGridRowEditing.js +15 -7
  73. package/legacy/hooks/features/filter/gridFilterSelector.js +8 -8
  74. package/legacy/hooks/features/filter/gridFilterUtils.js +23 -19
  75. package/legacy/hooks/features/filter/useGridFilter.js +2 -1
  76. package/legacy/hooks/features/focus/useGridFocus.js +9 -4
  77. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  78. package/legacy/hooks/features/pagination/gridPaginationSelector.js +4 -4
  79. package/legacy/hooks/features/rowSelection/gridRowSelectionSelector.js +3 -3
  80. package/legacy/hooks/features/rows/gridRowsSelector.js +3 -3
  81. package/legacy/hooks/features/rows/useGridParamsApi.js +23 -15
  82. package/legacy/hooks/features/sorting/gridSortingSelector.js +3 -3
  83. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +38 -34
  84. package/legacy/hooks/utils/index.js +1 -1
  85. package/legacy/hooks/utils/useGridSelector.js +43 -5
  86. package/legacy/hooks/utils/useLazyRef.js +9 -0
  87. package/legacy/hooks/utils/useOnMount.js +7 -0
  88. package/legacy/index.js +1 -1
  89. package/legacy/internals/index.js +1 -1
  90. package/legacy/locales/elGR.js +70 -79
  91. package/legacy/locales/ptBR.js +12 -13
  92. package/legacy/utils/Store.js +34 -0
  93. package/legacy/utils/createSelector.js +74 -6
  94. package/legacy/utils/doesSupportPreventScroll.js +13 -0
  95. package/legacy/utils/fastMemo.js +5 -0
  96. package/legacy/utils/fastObjectShallowCompare.js +32 -0
  97. package/legacy/utils/keyboardUtils.js +4 -2
  98. package/locales/elGR.js +66 -79
  99. package/locales/ptBR.js +12 -13
  100. package/models/api/gridCoreApi.d.ts +6 -0
  101. package/models/colDef/gridColDef.d.ts +4 -3
  102. package/models/colDef/gridColType.d.ts +3 -1
  103. package/models/events/gridEventLookup.d.ts +3 -3
  104. package/modern/components/GridColumnHeaders.js +3 -1
  105. package/modern/components/GridRow.js +32 -79
  106. package/modern/components/cell/GridCell.js +421 -45
  107. package/modern/components/cell/GridEditInputCell.js +9 -9
  108. package/modern/components/cell/index.js +1 -1
  109. package/modern/components/containers/GridRootStyles.js +30 -16
  110. package/modern/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  111. package/modern/components/toolbar/GridToolbar.js +2 -2
  112. package/modern/components/virtualization/GridVirtualScroller.js +4 -9
  113. package/modern/components/virtualization/GridVirtualScrollerContent.js +10 -20
  114. package/modern/constants/defaultGridSlotsComponents.js +6 -2
  115. package/modern/hooks/core/useGridApiInitialization.js +4 -1
  116. package/modern/hooks/core/useGridStateInitialization.js +2 -9
  117. package/modern/hooks/features/clipboard/useGridClipboard.js +1 -4
  118. package/modern/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -4
  119. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +9 -3
  120. package/modern/hooks/features/columns/gridColumnsSelector.js +7 -7
  121. package/modern/hooks/features/dimensions/useGridDimensions.js +6 -12
  122. package/modern/hooks/features/editing/useGridCellEditing.js +5 -3
  123. package/modern/hooks/features/editing/useGridRowEditing.js +14 -6
  124. package/modern/hooks/features/filter/gridFilterSelector.js +8 -8
  125. package/modern/hooks/features/filter/gridFilterUtils.js +17 -12
  126. package/modern/hooks/features/filter/useGridFilter.js +2 -1
  127. package/modern/hooks/features/focus/useGridFocus.js +8 -4
  128. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  129. package/modern/hooks/features/pagination/gridPaginationSelector.js +4 -4
  130. package/modern/hooks/features/rowSelection/gridRowSelectionSelector.js +3 -3
  131. package/modern/hooks/features/rows/gridRowsSelector.js +3 -3
  132. package/modern/hooks/features/rows/useGridParamsApi.js +7 -15
  133. package/modern/hooks/features/sorting/gridSortingSelector.js +3 -3
  134. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +40 -38
  135. package/modern/hooks/utils/index.js +1 -1
  136. package/modern/hooks/utils/useGridSelector.js +37 -6
  137. package/modern/hooks/utils/useLazyRef.js +9 -0
  138. package/modern/hooks/utils/useOnMount.js +7 -0
  139. package/modern/index.js +1 -1
  140. package/modern/internals/index.js +1 -1
  141. package/modern/locales/elGR.js +66 -79
  142. package/modern/locales/ptBR.js +12 -13
  143. package/modern/utils/Store.js +24 -0
  144. package/modern/utils/createSelector.js +74 -6
  145. package/modern/utils/doesSupportPreventScroll.js +13 -0
  146. package/modern/utils/fastMemo.js +5 -0
  147. package/modern/utils/fastObjectShallowCompare.js +32 -0
  148. package/modern/utils/keyboardUtils.js +4 -2
  149. package/node/components/GridColumnHeaders.js +4 -2
  150. package/node/components/GridRow.js +32 -79
  151. package/node/components/cell/GridCell.js +424 -47
  152. package/node/components/cell/GridEditInputCell.js +9 -9
  153. package/node/components/cell/index.js +17 -10
  154. package/node/components/containers/GridRootStyles.js +30 -16
  155. package/node/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  156. package/node/components/toolbar/GridToolbar.js +2 -2
  157. package/node/components/virtualization/GridVirtualScroller.js +4 -9
  158. package/node/components/virtualization/GridVirtualScrollerContent.js +10 -20
  159. package/node/constants/defaultGridSlotsComponents.js +4 -1
  160. package/node/hooks/core/useGridApiInitialization.js +4 -1
  161. package/node/hooks/core/useGridStateInitialization.js +2 -9
  162. package/node/hooks/features/clipboard/useGridClipboard.js +1 -4
  163. package/node/hooks/features/columnGrouping/gridColumnGroupsSelector.js +3 -3
  164. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +8 -2
  165. package/node/hooks/features/columns/gridColumnsSelector.js +6 -6
  166. package/node/hooks/features/dimensions/useGridDimensions.js +6 -12
  167. package/node/hooks/features/editing/useGridCellEditing.js +5 -3
  168. package/node/hooks/features/editing/useGridRowEditing.js +14 -6
  169. package/node/hooks/features/filter/gridFilterSelector.js +7 -7
  170. package/node/hooks/features/filter/gridFilterUtils.js +17 -12
  171. package/node/hooks/features/filter/useGridFilter.js +2 -1
  172. package/node/hooks/features/focus/useGridFocus.js +8 -4
  173. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -3
  174. package/node/hooks/features/pagination/gridPaginationSelector.js +3 -3
  175. package/node/hooks/features/rowSelection/gridRowSelectionSelector.js +2 -2
  176. package/node/hooks/features/rows/gridRowsSelector.js +2 -2
  177. package/node/hooks/features/rows/useGridParamsApi.js +9 -15
  178. package/node/hooks/features/sorting/gridSortingSelector.js +2 -2
  179. package/node/hooks/features/virtualization/useGridVirtualScroller.js +40 -36
  180. package/node/hooks/utils/index.js +14 -10
  181. package/node/hooks/utils/useGridSelector.js +41 -7
  182. package/node/hooks/utils/useLazyRef.js +17 -0
  183. package/node/hooks/utils/useOnMount.js +15 -0
  184. package/node/index.js +1 -1
  185. package/node/internals/index.js +7 -0
  186. package/node/locales/elGR.js +66 -79
  187. package/node/locales/ptBR.js +12 -13
  188. package/node/utils/Store.js +31 -0
  189. package/node/utils/createSelector.js +77 -8
  190. package/node/utils/doesSupportPreventScroll.js +19 -0
  191. package/node/utils/fastMemo.js +13 -0
  192. package/node/utils/fastObjectShallowCompare.js +38 -0
  193. package/node/utils/keyboardUtils.js +4 -2
  194. package/package.json +2 -2
  195. package/utils/Store.d.ts +11 -0
  196. package/utils/Store.js +24 -0
  197. package/utils/createSelector.d.ts +1 -0
  198. package/utils/createSelector.js +74 -6
  199. package/utils/doesSupportPreventScroll.d.ts +1 -0
  200. package/utils/doesSupportPreventScroll.js +13 -0
  201. package/utils/fastMemo.d.ts +1 -0
  202. package/utils/fastMemo.js +5 -0
  203. package/utils/fastObjectShallowCompare.d.ts +1 -0
  204. package/utils/fastObjectShallowCompare.js +32 -0
  205. package/utils/keyboardUtils.js +4 -2
@@ -53,7 +53,7 @@ const gridFilteredDescendantCountLookupSelector = (0, _createSelector.createSele
53
53
  * @category Filtering
54
54
  */
55
55
  exports.gridFilteredDescendantCountLookupSelector = gridFilteredDescendantCountLookupSelector;
56
- const gridExpandedSortedRowEntriesSelector = (0, _createSelector.createSelector)(gridVisibleRowsLookupSelector, _gridSortingSelector.gridSortedRowEntriesSelector, (visibleRowsLookup, sortedRows) => sortedRows.filter(row => visibleRowsLookup[row.id] !== false));
56
+ const gridExpandedSortedRowEntriesSelector = (0, _createSelector.createSelectorMemoized)(gridVisibleRowsLookupSelector, _gridSortingSelector.gridSortedRowEntriesSelector, (visibleRowsLookup, sortedRows) => sortedRows.filter(row => visibleRowsLookup[row.id] !== false));
57
57
 
58
58
  /**
59
59
  * Get the id of the rows accessible after the filtering process.
@@ -61,7 +61,7 @@ const gridExpandedSortedRowEntriesSelector = (0, _createSelector.createSelector)
61
61
  * @category Filtering
62
62
  */
63
63
  exports.gridExpandedSortedRowEntriesSelector = gridExpandedSortedRowEntriesSelector;
64
- const gridExpandedSortedRowIdsSelector = (0, _createSelector.createSelector)(gridExpandedSortedRowEntriesSelector, visibleSortedRowEntries => visibleSortedRowEntries.map(row => row.id));
64
+ const gridExpandedSortedRowIdsSelector = (0, _createSelector.createSelectorMemoized)(gridExpandedSortedRowEntriesSelector, visibleSortedRowEntries => visibleSortedRowEntries.map(row => row.id));
65
65
 
66
66
  /**
67
67
  * Get the id and the model of the rows accessible after the filtering process.
@@ -69,7 +69,7 @@ const gridExpandedSortedRowIdsSelector = (0, _createSelector.createSelector)(gri
69
69
  * @category Filtering
70
70
  */
71
71
  exports.gridExpandedSortedRowIdsSelector = gridExpandedSortedRowIdsSelector;
72
- const gridFilteredSortedRowEntriesSelector = (0, _createSelector.createSelector)(gridFilteredRowsLookupSelector, _gridSortingSelector.gridSortedRowEntriesSelector, (filteredRowsLookup, sortedRows) => sortedRows.filter(row => filteredRowsLookup[row.id] !== false));
72
+ const gridFilteredSortedRowEntriesSelector = (0, _createSelector.createSelectorMemoized)(gridFilteredRowsLookupSelector, _gridSortingSelector.gridSortedRowEntriesSelector, (filteredRowsLookup, sortedRows) => sortedRows.filter(row => filteredRowsLookup[row.id] !== false));
73
73
 
74
74
  /**
75
75
  * Get the id of the rows accessible after the filtering process.
@@ -77,14 +77,14 @@ const gridFilteredSortedRowEntriesSelector = (0, _createSelector.createSelector)
77
77
  * @category Filtering
78
78
  */
79
79
  exports.gridFilteredSortedRowEntriesSelector = gridFilteredSortedRowEntriesSelector;
80
- const gridFilteredSortedRowIdsSelector = (0, _createSelector.createSelector)(gridFilteredSortedRowEntriesSelector, filteredSortedRowEntries => filteredSortedRowEntries.map(row => row.id));
80
+ const gridFilteredSortedRowIdsSelector = (0, _createSelector.createSelectorMemoized)(gridFilteredSortedRowEntriesSelector, filteredSortedRowEntries => filteredSortedRowEntries.map(row => row.id));
81
81
 
82
82
  /**
83
83
  * Get the id and the model of the top level rows accessible after the filtering process.
84
84
  * @category Filtering
85
85
  */
86
86
  exports.gridFilteredSortedRowIdsSelector = gridFilteredSortedRowIdsSelector;
87
- const gridFilteredSortedTopLevelRowEntriesSelector = (0, _createSelector.createSelector)(gridExpandedSortedRowEntriesSelector, _gridRowsSelector.gridRowTreeSelector, _gridRowsSelector.gridRowMaximumTreeDepthSelector, (visibleSortedRows, rowTree, rowTreeDepth) => {
87
+ const gridFilteredSortedTopLevelRowEntriesSelector = (0, _createSelector.createSelectorMemoized)(gridExpandedSortedRowEntriesSelector, _gridRowsSelector.gridRowTreeSelector, _gridRowsSelector.gridRowMaximumTreeDepthSelector, (visibleSortedRows, rowTree, rowTreeDepth) => {
88
88
  if (rowTreeDepth < 2) {
89
89
  return visibleSortedRows;
90
90
  }
@@ -110,7 +110,7 @@ const gridFilteredTopLevelRowCountSelector = (0, _createSelector.createSelector)
110
110
  * @ignore - do not document.
111
111
  */
112
112
  exports.gridFilteredTopLevelRowCountSelector = gridFilteredTopLevelRowCountSelector;
113
- const gridFilterActiveItemsSelector = (0, _createSelector.createSelector)(gridFilterModelSelector, _gridColumnsSelector.gridColumnLookupSelector, (filterModel, columnLookup) => filterModel.items?.filter(item => {
113
+ const gridFilterActiveItemsSelector = (0, _createSelector.createSelectorMemoized)(gridFilterModelSelector, _gridColumnsSelector.gridColumnLookupSelector, (filterModel, columnLookup) => filterModel.items?.filter(item => {
114
114
  if (!item.field) {
115
115
  return false;
116
116
  }
@@ -129,7 +129,7 @@ exports.gridFilterActiveItemsSelector = gridFilterActiveItemsSelector;
129
129
  * @category Filtering
130
130
  * @ignore - do not document.
131
131
  */
132
- const gridFilterActiveItemsLookupSelector = (0, _createSelector.createSelector)(gridFilterActiveItemsSelector, activeFilters => {
132
+ const gridFilterActiveItemsLookupSelector = (0, _createSelector.createSelectorMemoized)(gridFilterActiveItemsSelector, activeFilters => {
133
133
  const result = activeFilters.reduce((res, filterItem) => {
134
134
  if (!res[filterItem.field]) {
135
135
  res[filterItem.field] = [filterItem];
@@ -194,21 +194,25 @@ const buildAggregatedFilterApplier = (filterModel, apiRef) => {
194
194
  });
195
195
  };
196
196
  exports.buildAggregatedFilterApplier = buildAggregatedFilterApplier;
197
- const passFilterLogic = (allFilterItemResults, allQuickFilterResults, filterModel, apiRef) => {
198
- const cleanedFilterItems = filterModel.items.filter(item => getFilterCallbackFromItem(item, apiRef) !== null);
199
- const cleanedAllFilterItemResults = allFilterItemResults.filter(result => result != null);
200
- const cleanedAllQuickFilterResults = allQuickFilterResults.filter(result => result != null);
201
-
202
- // Defaultize operators
203
- const quickFilterLogicOperator = filterModel.quickFilterLogicOperator ?? (0, _gridFilterState.getDefaultGridFilterModel)().quickFilterLogicOperator;
204
- const logicOperator = filterModel.logicOperator ?? (0, _gridFilterState.getDefaultGridFilterModel)().logicOperator;
197
+ const isNotNull = result => result != null;
198
+ const filterModelItems = (cache, apiRef, items) => {
199
+ if (!cache.cleanedFilterItems) {
200
+ cache.cleanedFilterItems = items.filter(item => getFilterCallbackFromItem(item, apiRef) !== null);
201
+ }
202
+ return cache.cleanedFilterItems;
203
+ };
204
+ const passFilterLogic = (allFilterItemResults, allQuickFilterResults, filterModel, apiRef, cache) => {
205
+ const cleanedFilterItems = filterModelItems(cache, apiRef, filterModel.items);
206
+ const cleanedFilterItemResults = allFilterItemResults.filter(isNotNull);
207
+ const cleanedQuickFilterResults = allQuickFilterResults.filter(isNotNull);
205
208
 
206
209
  // get result for filter items model
207
- if (cleanedAllFilterItemResults.length > 0) {
210
+ if (cleanedFilterItemResults.length > 0) {
208
211
  // Return true if the item pass with one of the rows
209
212
  const filterItemPredicate = item => {
210
- return cleanedAllFilterItemResults.some(filterItemResult => filterItemResult[item.id]);
213
+ return cleanedFilterItemResults.some(filterItemResult => filterItemResult[item.id]);
211
214
  };
215
+ const logicOperator = filterModel.logicOperator ?? (0, _gridFilterState.getDefaultGridFilterModel)().logicOperator;
212
216
  if (logicOperator === _models.GridLogicOperator.And) {
213
217
  const passesAllFilters = cleanedFilterItems.every(filterItemPredicate);
214
218
  if (!passesAllFilters) {
@@ -223,11 +227,12 @@ const passFilterLogic = (allFilterItemResults, allQuickFilterResults, filterMode
223
227
  }
224
228
 
225
229
  // get result for quick filter model
226
- if (cleanedAllQuickFilterResults.length > 0 && filterModel.quickFilterValues != null) {
230
+ if (cleanedQuickFilterResults.length > 0 && filterModel.quickFilterValues != null) {
227
231
  // Return true if the item pass with one of the rows
228
232
  const quickFilterValuePredicate = value => {
229
- return cleanedAllQuickFilterResults.some(quickFilterValueResult => quickFilterValueResult[value]);
233
+ return cleanedQuickFilterResults.some(quickFilterValueResult => quickFilterValueResult[value]);
230
234
  };
235
+ const quickFilterLogicOperator = filterModel.quickFilterLogicOperator ?? (0, _gridFilterState.getDefaultGridFilterModel)().quickFilterLogicOperator;
231
236
  if (quickFilterLogicOperator === _models.GridLogicOperator.And) {
232
237
  const passesAllQuickFilterValues = filterModel.quickFilterValues.every(quickFilterValuePredicate);
233
238
  if (!passesAllQuickFilterValues) {
@@ -265,6 +265,7 @@ const useGridFilter = (apiRef, props) => {
265
265
  const tree = (0, _rows.gridRowTreeSelector)(apiRef);
266
266
  const rowIds = tree[_rows.GRID_ROOT_GROUP_ID].children;
267
267
  const filteredRowsLookup = {};
268
+ const filterCache = {};
268
269
  for (let i = 0; i < rowIds.length; i += 1) {
269
270
  const rowId = rowIds[i];
270
271
  let isRowPassing;
@@ -275,7 +276,7 @@ const useGridFilter = (apiRef, props) => {
275
276
  passingFilterItems,
276
277
  passingQuickFilterValues
277
278
  } = params.isRowMatchingFilters(rowId);
278
- isRowPassing = (0, _gridFilterUtils.passFilterLogic)([passingFilterItems], [passingQuickFilterValues], params.filterModel, apiRef);
279
+ isRowPassing = (0, _gridFilterUtils.passFilterLogic)([passingFilterItems], [passingQuickFilterValues], params.filterModel, apiRef, filterCache);
279
280
  }
280
281
  filteredRowsLookup[rowId] = isRowPassing;
281
282
  }
@@ -8,6 +8,7 @@ exports.useGridFocus = exports.focusStateInitializer = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _utils = require("@mui/utils");
11
+ var _gridClasses = require("../../../constants/gridClasses");
11
12
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
12
13
  var _useGridLogger = require("../../utils/useGridLogger");
13
14
  var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
@@ -246,7 +247,6 @@ const useGridFocus = (apiRef, props) => {
246
247
  }
247
248
  apiRef.current.setColumnHeaderFocus(field, event);
248
249
  }, [apiRef]);
249
- const focussedColumnGroup = (0, _gridFocusStateSelector.unstable_gridFocusColumnGroupHeaderSelector)(apiRef);
250
250
  const handleColumnGroupHeaderFocus = React.useCallback(({
251
251
  fields,
252
252
  depth
@@ -254,13 +254,17 @@ const useGridFocus = (apiRef, props) => {
254
254
  if (event.target !== event.currentTarget) {
255
255
  return;
256
256
  }
257
- if (focussedColumnGroup !== null && focussedColumnGroup.depth === depth && fields.includes(focussedColumnGroup.field)) {
257
+ const focusedColumnGroup = (0, _gridFocusStateSelector.unstable_gridFocusColumnGroupHeaderSelector)(apiRef);
258
+ if (focusedColumnGroup !== null && focusedColumnGroup.depth === depth && fields.includes(focusedColumnGroup.field)) {
258
259
  // This group cell has already been focused
259
260
  return;
260
261
  }
261
262
  apiRef.current.setColumnGroupHeaderFocus(fields[0], depth, event);
262
- }, [apiRef, focussedColumnGroup]);
263
- const handleBlur = React.useCallback(() => {
263
+ }, [apiRef]);
264
+ const handleBlur = React.useCallback((_, event) => {
265
+ if (event.relatedTarget?.className.includes(_gridClasses.gridClasses.columnHeader)) {
266
+ return;
267
+ }
264
268
  logger.debug(`Clearing focus`);
265
269
  apiRef.current.setState(state => (0, _extends2.default)({}, state, {
266
270
  focus: {
@@ -19,7 +19,6 @@ var _gridDetailPanelToggleField = require("../../../constants/gridDetailPanelTog
19
19
  var _gridRowsSelector = require("../rows/gridRowsSelector");
20
20
  var _focus = require("../focus");
21
21
  var _gridColumnGroupsSelector = require("../columnGrouping/gridColumnGroupsSelector");
22
- var _useGridSelector = require("../../utils/useGridSelector");
23
22
  var _gridHeaderFilteringSelectors = require("../headerFiltering/gridHeaderFilteringSelectors");
24
23
  var _pipeProcessing = require("../../core/pipeProcessing");
25
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -330,12 +329,12 @@ const useGridKeyboardNavigation = (apiRef, props) => {
330
329
  event.preventDefault();
331
330
  }
332
331
  }, [apiRef, currentPageRows.length, goToHeaderFilter, theme.direction, goToHeader, goToCell, getRowIdFromIndex]);
333
- const focusedColumnGroup = (0, _useGridSelector.useGridSelector)(apiRef, _focus.unstable_gridFocusColumnGroupHeaderSelector);
334
332
  const handleColumnGroupHeaderKeyDown = React.useCallback((params, event) => {
335
333
  const dimensions = apiRef.current.getRootDimensions();
336
334
  if (!dimensions) {
337
335
  return;
338
336
  }
337
+ const focusedColumnGroup = (0, _focus.unstable_gridFocusColumnGroupHeaderSelector)(apiRef);
339
338
  if (focusedColumnGroup === null) {
340
339
  return;
341
340
  }
@@ -419,7 +418,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
419
418
  if (shouldPreventDefault) {
420
419
  event.preventDefault();
421
420
  }
422
- }, [apiRef, focusedColumnGroup, currentPageRows.length, goToHeader, goToGroupHeader, goToCell, getRowIdFromIndex]);
421
+ }, [apiRef, currentPageRows.length, goToHeader, goToGroupHeader, goToCell, getRowIdFromIndex]);
423
422
  const handleCellKeyDown = React.useCallback((params, event) => {
424
423
  // Ignore portal
425
424
  if (!event.currentTarget.contains(event.target)) {
@@ -47,7 +47,7 @@ const gridPageCountSelector = (0, _createSelector.createSelector)(gridPagination
47
47
  * @category Pagination
48
48
  */
49
49
  exports.gridPageCountSelector = gridPageCountSelector;
50
- const gridPaginationRowRangeSelector = (0, _createSelector.createSelector)(gridPaginationModelSelector, _gridRowsSelector.gridRowTreeSelector, _gridRowsSelector.gridRowMaximumTreeDepthSelector, _gridFilterSelector.gridExpandedSortedRowEntriesSelector, _gridFilterSelector.gridFilteredSortedTopLevelRowEntriesSelector, (paginationModel, rowTree, rowTreeDepth, visibleSortedRowEntries, visibleSortedTopLevelRowEntries) => {
50
+ const gridPaginationRowRangeSelector = (0, _createSelector.createSelectorMemoized)(gridPaginationModelSelector, _gridRowsSelector.gridRowTreeSelector, _gridRowsSelector.gridRowMaximumTreeDepthSelector, _gridFilterSelector.gridExpandedSortedRowEntriesSelector, _gridFilterSelector.gridFilteredSortedTopLevelRowEntriesSelector, (paginationModel, rowTree, rowTreeDepth, visibleSortedRowEntries, visibleSortedTopLevelRowEntries) => {
51
51
  const visibleTopLevelRowCount = visibleSortedTopLevelRowEntries.length;
52
52
  const topLevelFirstRowIndex = Math.min(paginationModel.pageSize * paginationModel.page, visibleTopLevelRowCount - 1);
53
53
  const topLevelLastRowIndex = Math.min(topLevelFirstRowIndex + paginationModel.pageSize - 1, visibleTopLevelRowCount - 1);
@@ -90,7 +90,7 @@ const gridPaginationRowRangeSelector = (0, _createSelector.createSelector)(gridP
90
90
  * @category Pagination
91
91
  */
92
92
  exports.gridPaginationRowRangeSelector = gridPaginationRowRangeSelector;
93
- const gridPaginatedVisibleSortedGridRowEntriesSelector = (0, _createSelector.createSelector)(_gridFilterSelector.gridExpandedSortedRowEntriesSelector, gridPaginationRowRangeSelector, (visibleSortedRowEntries, paginationRange) => {
93
+ const gridPaginatedVisibleSortedGridRowEntriesSelector = (0, _createSelector.createSelectorMemoized)(_gridFilterSelector.gridExpandedSortedRowEntriesSelector, gridPaginationRowRangeSelector, (visibleSortedRowEntries, paginationRange) => {
94
94
  if (!paginationRange) {
95
95
  return [];
96
96
  }
@@ -102,7 +102,7 @@ const gridPaginatedVisibleSortedGridRowEntriesSelector = (0, _createSelector.cre
102
102
  * @category Pagination
103
103
  */
104
104
  exports.gridPaginatedVisibleSortedGridRowEntriesSelector = gridPaginatedVisibleSortedGridRowEntriesSelector;
105
- const gridPaginatedVisibleSortedGridRowIdsSelector = (0, _createSelector.createSelector)(_gridFilterSelector.gridExpandedSortedRowIdsSelector, gridPaginationRowRangeSelector, (visibleSortedRowIds, paginationRange) => {
105
+ const gridPaginatedVisibleSortedGridRowIdsSelector = (0, _createSelector.createSelectorMemoized)(_gridFilterSelector.gridExpandedSortedRowIdsSelector, gridPaginationRowRangeSelector, (visibleSortedRowIds, paginationRange) => {
106
106
  if (!paginationRange) {
107
107
  return [];
108
108
  }
@@ -10,9 +10,9 @@ const gridRowSelectionStateSelector = state => state.rowSelection;
10
10
  exports.gridRowSelectionStateSelector = gridRowSelectionStateSelector;
11
11
  const selectedGridRowsCountSelector = (0, _createSelector.createSelector)(gridRowSelectionStateSelector, selection => selection.length);
12
12
  exports.selectedGridRowsCountSelector = selectedGridRowsCountSelector;
13
- const selectedGridRowsSelector = (0, _createSelector.createSelector)(gridRowSelectionStateSelector, _gridRowsSelector.gridRowsLookupSelector, (selectedRows, rowsLookup) => new Map(selectedRows.map(id => [id, rowsLookup[id]])));
13
+ const selectedGridRowsSelector = (0, _createSelector.createSelectorMemoized)(gridRowSelectionStateSelector, _gridRowsSelector.gridRowsLookupSelector, (selectedRows, rowsLookup) => new Map(selectedRows.map(id => [id, rowsLookup[id]])));
14
14
  exports.selectedGridRowsSelector = selectedGridRowsSelector;
15
- const selectedIdsLookupSelector = (0, _createSelector.createSelector)(gridRowSelectionStateSelector, selection => selection.reduce((lookup, rowId) => {
15
+ const selectedIdsLookupSelector = (0, _createSelector.createSelectorMemoized)(gridRowSelectionStateSelector, selection => selection.reduce((lookup, rowId) => {
16
16
  lookup[rowId] = rowId;
17
17
  return lookup;
18
18
  }, {}));
@@ -24,7 +24,7 @@ const gridRowGroupingNameSelector = (0, _createSelector.createSelector)(gridRows
24
24
  exports.gridRowGroupingNameSelector = gridRowGroupingNameSelector;
25
25
  const gridRowTreeDepthsSelector = (0, _createSelector.createSelector)(gridRowsStateSelector, rows => rows.treeDepths);
26
26
  exports.gridRowTreeDepthsSelector = gridRowTreeDepthsSelector;
27
- const gridRowMaximumTreeDepthSelector = (0, _createSelector.createSelector)(gridRowsStateSelector, rows => {
27
+ const gridRowMaximumTreeDepthSelector = (0, _createSelector.createSelectorMemoized)(gridRowsStateSelector, rows => {
28
28
  const entries = Object.entries(rows.treeDepths);
29
29
  if (entries.length === 0) {
30
30
  return 1;
@@ -44,7 +44,7 @@ const gridAdditionalRowGroupsSelector = (0, _createSelector.createSelector)(grid
44
44
  * @ignore - do not document.
45
45
  */
46
46
  exports.gridAdditionalRowGroupsSelector = gridAdditionalRowGroupsSelector;
47
- const gridPinnedRowsSelector = (0, _createSelector.createSelector)(gridAdditionalRowGroupsSelector, additionalRowGroups => {
47
+ const gridPinnedRowsSelector = (0, _createSelector.createSelectorMemoized)(gridAdditionalRowGroupsSelector, additionalRowGroups => {
48
48
  const rawPinnedRows = additionalRowGroups?.pinnedRows;
49
49
  return {
50
50
  bottom: rawPinnedRows?.bottom?.map(rowEntry => ({
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.MissingRowIdError = void 0;
6
7
  exports.useGridParamsApi = useGridParamsApi;
7
8
  var React = _interopRequireWildcard(require("react"));
8
9
  var _domUtils = require("../../../utils/domUtils");
@@ -10,11 +11,7 @@ var _useGridApiMethod = require("../../utils/useGridApiMethod");
10
11
  var _gridFocusStateSelector = require("../focus/gridFocusStateSelector");
11
12
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
13
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
- let warnedOnceMissingColumn = false;
14
- function warnMissingColumn(field) {
15
- console.warn([`MUI: You are calling getValue('${field}') but the column \`${field}\` is not defined.`, `Instead, you can access the data from \`params.row.${field}\`.`].join('\n'));
16
- warnedOnceMissingColumn = true;
17
- }
14
+ class MissingRowIdError extends Error {}
18
15
 
19
16
  /**
20
17
  * @requires useGridColumns (method)
@@ -24,6 +21,7 @@ function warnMissingColumn(field) {
24
21
  * TODO: Impossible priority - useGridEditing also needs to be after useGridParamsApi
25
22
  * TODO: Impossible priority - useGridFocus also needs to be after useGridParamsApi
26
23
  */
24
+ exports.MissingRowIdError = MissingRowIdError;
27
25
  function useGridParamsApi(apiRef) {
28
26
  const getColumnHeaderParams = React.useCallback(field => ({
29
27
  field,
@@ -32,7 +30,7 @@ function useGridParamsApi(apiRef) {
32
30
  const getRowParams = React.useCallback(id => {
33
31
  const row = apiRef.current.getRow(id);
34
32
  if (!row) {
35
- throw new Error(`No row with id #${id} found`);
33
+ throw new MissingRowIdError(`No row with id #${id} found`);
36
34
  }
37
35
  const params = {
38
36
  id,
@@ -45,7 +43,7 @@ function useGridParamsApi(apiRef) {
45
43
  const row = apiRef.current.getRow(id);
46
44
  const rowNode = apiRef.current.getRowNode(id);
47
45
  if (!row || !rowNode) {
48
- throw new Error(`No row with id #${id} found`);
46
+ throw new MissingRowIdError(`No row with id #${id} found`);
49
47
  }
50
48
  const cellFocus = (0, _gridFocusStateSelector.gridFocusCellSelector)(apiRef);
51
49
  const cellTabIndex = (0, _gridFocusStateSelector.gridTabIndexCellSelector)(apiRef);
@@ -69,7 +67,7 @@ function useGridParamsApi(apiRef) {
69
67
  const row = apiRef.current.getRow(id);
70
68
  const rowNode = apiRef.current.getRowNode(id);
71
69
  if (!row || !rowNode) {
72
- throw new Error(`No row with id #${id} found`);
70
+ throw new MissingRowIdError(`No row with id #${id} found`);
73
71
  }
74
72
  const cellFocus = (0, _gridFocusStateSelector.gridFocusCellSelector)(apiRef);
75
73
  const cellTabIndex = (0, _gridFocusStateSelector.gridTabIndexCellSelector)(apiRef);
@@ -83,7 +81,8 @@ function useGridParamsApi(apiRef) {
83
81
  hasFocus: cellFocus !== null && cellFocus.field === field && cellFocus.id === id,
84
82
  tabIndex: cellTabIndex && cellTabIndex.field === field && cellTabIndex.id === id ? 0 : -1,
85
83
  value,
86
- formattedValue: value
84
+ formattedValue: value,
85
+ isEditable: false
87
86
  };
88
87
  if (colDef && colDef.valueFormatter) {
89
88
  params.formattedValue = colDef.valueFormatter({
@@ -98,15 +97,10 @@ function useGridParamsApi(apiRef) {
98
97
  }, [apiRef]);
99
98
  const getCellValue = React.useCallback((id, field) => {
100
99
  const colDef = apiRef.current.getColumn(field);
101
- if (process.env.NODE_ENV !== 'production') {
102
- if (!colDef && !warnedOnceMissingColumn) {
103
- warnMissingColumn(field);
104
- }
105
- }
106
100
  if (!colDef || !colDef.valueGetter) {
107
101
  const rowModel = apiRef.current.getRow(id);
108
102
  if (!rowModel) {
109
- throw new Error(`No row with id #${id} found`);
103
+ throw new MissingRowIdError(`No row with id #${id} found`);
110
104
  }
111
105
  return rowModel[field];
112
106
  }
@@ -23,7 +23,7 @@ const gridSortedRowIdsSelector = (0, _createSelector.createSelector)(gridSorting
23
23
  * @category Sorting
24
24
  */
25
25
  exports.gridSortedRowIdsSelector = gridSortedRowIdsSelector;
26
- const gridSortedRowEntriesSelector = (0, _createSelector.createSelector)(gridSortedRowIdsSelector, _gridRowsSelector.gridRowsLookupSelector,
26
+ const gridSortedRowEntriesSelector = (0, _createSelector.createSelectorMemoized)(gridSortedRowIdsSelector, _gridRowsSelector.gridRowsLookupSelector,
27
27
  // TODO rows v6: Is this the best approach ?
28
28
  (sortedIds, idRowsLookup) => sortedIds.map(id => ({
29
29
  id,
@@ -41,7 +41,7 @@ exports.gridSortModelSelector = gridSortModelSelector;
41
41
  * @category Sorting
42
42
  * @ignore - do not document.
43
43
  */
44
- const gridSortColumnLookupSelector = (0, _createSelector.createSelector)(gridSortModelSelector, sortModel => {
44
+ const gridSortColumnLookupSelector = (0, _createSelector.createSelectorMemoized)(gridSortModelSelector, sortModel => {
45
45
  const result = sortModel.reduce((res, sortItem, index) => {
46
46
  res[sortItem.field] = {
47
47
  sortDirection: sortItem.sort,
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.areRenderContextsEqual = void 0;
7
8
  exports.binarySearch = binarySearch;
8
9
  exports.useGridVirtualScroller = exports.getRenderableIndexes = void 0;
9
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
@@ -27,8 +28,7 @@ var _gridColumnsUtils = require("../columns/gridColumnsUtils");
27
28
  var _gridRowsUtils = require("../rows/gridRowsUtils");
28
29
  var _jsxRuntime = require("react/jsx-runtime");
29
30
  const _excluded = ["style"],
30
- _excluded2 = ["style"],
31
- _excluded3 = ["style"];
31
+ _excluded2 = ["style"];
32
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
33
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
34
34
  // Uses binary search to avoid looping through all possible positions
@@ -67,6 +67,12 @@ const areRenderContextsEqual = (context1, context2) => {
67
67
  }
68
68
  return context1.firstRowIndex === context2.firstRowIndex && context1.lastRowIndex === context2.lastRowIndex && context1.firstColumnIndex === context2.firstColumnIndex && context1.lastColumnIndex === context2.lastColumnIndex;
69
69
  };
70
+ exports.areRenderContextsEqual = areRenderContextsEqual;
71
+ // The `maxSize` is 3 so that reselect caches the `renderedColumns` values for the pinned left,
72
+ // unpinned, and pinned right sections.
73
+ const MEMOIZE_OPTIONS = {
74
+ maxSize: 3
75
+ };
70
76
  const useGridVirtualScroller = props => {
71
77
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
72
78
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
@@ -106,7 +112,7 @@ const useGridVirtualScroller = props => {
106
112
  const prevRootRowStyle = React.useRef();
107
113
  const getRenderedColumnsRef = React.useRef((0, _reselect.defaultMemoize)((columns, firstColumnToRender, lastColumnToRender) => {
108
114
  return columns.slice(firstColumnToRender, lastColumnToRender);
109
- }));
115
+ }, MEMOIZE_OPTIONS));
110
116
  const getNearestIndexToRender = React.useCallback(offset => {
111
117
  const lastMeasuredIndexRelativeToAllRows = apiRef.current.getLastMeasuredRowIndex();
112
118
  let allRowsMeasured = lastMeasuredIndexRelativeToAllRows === Infinity;
@@ -264,7 +270,7 @@ const useGridVirtualScroller = props => {
264
270
  };
265
271
  apiRef.current.publishEvent('scrollPositionChange', params);
266
272
  }, [apiRef, computeRenderContext, containerDimensions.width, updateRenderContext]);
267
- const handleScroll = event => {
273
+ const handleScroll = (0, _utils.unstable_useEventCallback)(event => {
268
274
  const {
269
275
  scrollTop,
270
276
  scrollLeft
@@ -306,13 +312,13 @@ const useGridVirtualScroller = props => {
306
312
  });
307
313
  prevTotalWidth.current = columnsTotalWidth;
308
314
  }
309
- };
310
- const handleWheel = event => {
315
+ });
316
+ const handleWheel = (0, _utils.unstable_useEventCallback)(event => {
311
317
  apiRef.current.publishEvent('virtualScrollerWheel', {}, event);
312
- };
313
- const handleTouchMove = event => {
318
+ });
319
+ const handleTouchMove = (0, _utils.unstable_useEventCallback)(event => {
314
320
  apiRef.current.publishEvent('virtualScrollerTouchMove', {}, event);
315
- };
321
+ });
316
322
  const getRows = (params = {
317
323
  renderContext
318
324
  }) => {
@@ -457,22 +463,25 @@ const useGridVirtualScroller = props => {
457
463
  height,
458
464
  minHeight: shouldExtendContent ? '100%' : 'auto'
459
465
  };
466
+ if (rootProps.autoHeight && currentPage.rows.length === 0) {
467
+ size.height = (0, _gridRowsUtils.getMinimalContentHeight)(apiRef, rootProps.rowHeight); // Give room to show the overlay when there no rows.
468
+ }
469
+
460
470
  return size;
461
- }, [rootRef, columnsTotalWidth, rowsMeta.currentPageTotalHeight, needsHorizontalScrollbar]);
471
+ }, [apiRef, rootRef, columnsTotalWidth, rowsMeta.currentPageTotalHeight, needsHorizontalScrollbar, rootProps.autoHeight, rootProps.rowHeight, currentPage.rows.length]);
462
472
  React.useEffect(() => {
463
473
  apiRef.current.publishEvent('virtualScrollerContentSizeChange');
464
474
  }, [apiRef, contentSize]);
465
- if (rootProps.autoHeight && currentPage.rows.length === 0) {
466
- contentSize.height = (0, _gridRowsUtils.getMinimalContentHeight)(apiRef, rootProps.rowHeight); // Give room to show the overlay when there no rows.
467
- }
468
-
469
- const rootStyle = {};
470
- if (!needsHorizontalScrollbar) {
471
- rootStyle.overflowX = 'hidden';
472
- }
473
- if (rootProps.autoHeight) {
474
- rootStyle.overflowY = 'hidden';
475
- }
475
+ const rootStyle = React.useMemo(() => {
476
+ const style = {};
477
+ if (!needsHorizontalScrollbar) {
478
+ style.overflowX = 'hidden';
479
+ }
480
+ if (rootProps.autoHeight) {
481
+ style.overflowY = 'hidden';
482
+ }
483
+ return style;
484
+ }, [needsHorizontalScrollbar, rootProps.autoHeight]);
476
485
  const getRenderContext = React.useCallback(() => {
477
486
  return prevRenderContext.current;
478
487
  }, []);
@@ -483,23 +492,18 @@ const useGridVirtualScroller = props => {
483
492
  renderContext,
484
493
  updateRenderZonePosition,
485
494
  getRows,
486
- getRootProps: (_ref3 = {}) => {
487
- let {
488
- style = {}
489
- } = _ref3,
490
- other = (0, _objectWithoutPropertiesLoose2.default)(_ref3, _excluded3);
491
- return (0, _extends2.default)({
492
- ref: handleRef,
493
- onScroll: handleScroll,
494
- onWheel: handleWheel,
495
- onTouchMove: handleTouchMove,
496
- style: (0, _extends2.default)({}, style, rootStyle)
497
- }, other);
498
- },
495
+ getRootProps: (inputProps = {}) => (0, _extends2.default)({
496
+ ref: handleRef,
497
+ onScroll: handleScroll,
498
+ onWheel: handleWheel,
499
+ onTouchMove: handleTouchMove
500
+ }, inputProps, {
501
+ style: inputProps.style ? (0, _extends2.default)({}, inputProps.style, rootStyle) : rootStyle
502
+ }),
499
503
  getContentProps: ({
500
- style = {}
504
+ style
501
505
  } = {}) => ({
502
- style: (0, _extends2.default)({}, style, contentSize)
506
+ style: style ? (0, _extends2.default)({}, style, contentSize) : contentSize
503
507
  }),
504
508
  getRenderZoneProps: () => ({
505
509
  ref: renderZoneRef
@@ -3,9 +3,19 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ useGridSelector: true
8
+ };
9
+ Object.defineProperty(exports, "useGridSelector", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _useGridSelector.useGridSelector;
13
+ }
14
+ });
6
15
  var _useGridApiEventHandler = require("./useGridApiEventHandler");
7
16
  Object.keys(_useGridApiEventHandler).forEach(function (key) {
8
17
  if (key === "default" || key === "__esModule") return;
18
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
9
19
  if (key in exports && exports[key] === _useGridApiEventHandler[key]) return;
10
20
  Object.defineProperty(exports, key, {
11
21
  enumerable: true,
@@ -17,6 +27,7 @@ Object.keys(_useGridApiEventHandler).forEach(function (key) {
17
27
  var _useGridApiMethod = require("./useGridApiMethod");
18
28
  Object.keys(_useGridApiMethod).forEach(function (key) {
19
29
  if (key === "default" || key === "__esModule") return;
30
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
20
31
  if (key in exports && exports[key] === _useGridApiMethod[key]) return;
21
32
  Object.defineProperty(exports, key, {
22
33
  enumerable: true,
@@ -28,6 +39,7 @@ Object.keys(_useGridApiMethod).forEach(function (key) {
28
39
  var _useGridLogger = require("./useGridLogger");
29
40
  Object.keys(_useGridLogger).forEach(function (key) {
30
41
  if (key === "default" || key === "__esModule") return;
42
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
31
43
  if (key in exports && exports[key] === _useGridLogger[key]) return;
32
44
  Object.defineProperty(exports, key, {
33
45
  enumerable: true,
@@ -37,19 +49,10 @@ Object.keys(_useGridLogger).forEach(function (key) {
37
49
  });
38
50
  });
39
51
  var _useGridSelector = require("./useGridSelector");
40
- Object.keys(_useGridSelector).forEach(function (key) {
41
- if (key === "default" || key === "__esModule") return;
42
- if (key in exports && exports[key] === _useGridSelector[key]) return;
43
- Object.defineProperty(exports, key, {
44
- enumerable: true,
45
- get: function () {
46
- return _useGridSelector[key];
47
- }
48
- });
49
- });
50
52
  var _useGridNativeEventListener = require("./useGridNativeEventListener");
51
53
  Object.keys(_useGridNativeEventListener).forEach(function (key) {
52
54
  if (key === "default" || key === "__esModule") return;
55
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
53
56
  if (key in exports && exports[key] === _useGridNativeEventListener[key]) return;
54
57
  Object.defineProperty(exports, key, {
55
58
  enumerable: true,
@@ -61,6 +64,7 @@ Object.keys(_useGridNativeEventListener).forEach(function (key) {
61
64
  var _useFirstRender = require("./useFirstRender");
62
65
  Object.keys(_useFirstRender).forEach(function (key) {
63
66
  if (key === "default" || key === "__esModule") return;
67
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
64
68
  if (key in exports && exports[key] === _useFirstRender[key]) return;
65
69
  Object.defineProperty(exports, key, {
66
70
  enumerable: true,
@@ -3,21 +3,55 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useGridSelector = void 0;
6
+ exports.useGridSelector = exports.objectShallowCompare = void 0;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _useLazyRef = require("./useLazyRef");
9
+ var _useOnMount = require("./useOnMount");
7
10
  var _warning = require("../../utils/warning");
11
+ var _fastObjectShallowCompare = require("../../utils/fastObjectShallowCompare");
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ const stateNotInitializedWarning = (0, _warning.buildWarning)(['MUI: `useGridSelector` has been called before the initialization of the state.', 'This hook can only be used inside the context of the grid.']);
8
15
  function isOutputSelector(selector) {
9
16
  return selector.acceptsApiRef;
10
17
  }
11
- const stateNotInitializedWarning = (0, _warning.buildWarning)(['MUI: `useGridSelector` has been called before the initialization of the state.', 'This hook can only be used inside the context of the grid.']);
12
- const useGridSelector = (apiRef, selector) => {
18
+ function applySelector(apiRef, selector) {
19
+ if (isOutputSelector(selector)) {
20
+ return selector(apiRef);
21
+ }
22
+ return selector(apiRef.current.state);
23
+ }
24
+ const defaultCompare = Object.is;
25
+ const objectShallowCompare = _fastObjectShallowCompare.fastObjectShallowCompare;
26
+ exports.objectShallowCompare = objectShallowCompare;
27
+ const createRefs = () => ({
28
+ state: null,
29
+ equals: null,
30
+ selector: null
31
+ });
32
+ const useGridSelector = (apiRef, selector, equals = defaultCompare) => {
13
33
  if (process.env.NODE_ENV !== 'production') {
14
34
  if (!apiRef.current.state) {
15
35
  stateNotInitializedWarning();
16
36
  }
17
37
  }
18
- if (isOutputSelector(selector)) {
19
- return selector(apiRef);
20
- }
21
- return selector(apiRef.current.state);
38
+ const refs = (0, _useLazyRef.useLazyRef)(createRefs);
39
+ const didInit = refs.current.selector !== null;
40
+ const [state, setState] = React.useState(
41
+ // We don't use an initialization function to avoid allocations
42
+ didInit ? null : applySelector(apiRef, selector));
43
+ refs.current.state = state;
44
+ refs.current.equals = equals;
45
+ refs.current.selector = selector;
46
+ (0, _useOnMount.useOnMount)(() => {
47
+ return apiRef.current.store.subscribe(() => {
48
+ const newState = applySelector(apiRef, refs.current.selector);
49
+ if (!refs.current.equals(refs.current.state, newState)) {
50
+ refs.current.state = newState;
51
+ setState(newState);
52
+ }
53
+ });
54
+ });
55
+ return state;
22
56
  };
23
57
  exports.useGridSelector = useGridSelector;