@mui/x-data-grid 7.0.0-beta.7 → 7.0.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 (190) hide show
  1. package/CHANGELOG.md +195 -12
  2. package/DataGrid/DataGrid.js +13 -17
  3. package/DataGrid/useDataGridProps.js +3 -5
  4. package/README.md +1 -1
  5. package/components/GridFooter.js +2 -3
  6. package/components/GridHeader.js +1 -2
  7. package/components/GridPagination.d.ts +6 -5
  8. package/components/GridPagination.js +12 -4
  9. package/components/GridRow.js +13 -17
  10. package/components/base/GridFooterPlaceholder.js +1 -2
  11. package/components/base/GridOverlays.js +3 -6
  12. package/components/cell/GridActionsCell.js +4 -6
  13. package/components/cell/GridActionsCellItem.d.ts +8 -25
  14. package/components/cell/GridActionsCellItem.js +8 -5
  15. package/components/cell/GridBooleanCell.d.ts +1 -0
  16. package/components/cell/GridBooleanCell.js +3 -2
  17. package/components/cell/GridCell.js +7 -8
  18. package/components/cell/GridEditBooleanCell.js +1 -2
  19. package/components/cell/GridEditDateCell.js +2 -3
  20. package/components/cell/GridEditInputCell.js +2 -2
  21. package/components/cell/GridEditSingleSelectCell.js +5 -8
  22. package/components/columnHeaders/ColumnHeaderMenuIcon.js +2 -3
  23. package/components/columnHeaders/GridColumnGroupHeader.js +4 -5
  24. package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +2 -3
  25. package/components/columnHeaders/GridColumnHeaderItem.js +5 -6
  26. package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
  27. package/components/columnHeaders/GridColumnHeaderTitle.js +2 -3
  28. package/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -1
  29. package/components/columnSelection/GridCellCheckboxRenderer.js +3 -5
  30. package/components/columnSelection/GridHeaderCheckbox.js +1 -2
  31. package/components/columnsManagement/GridColumnsManagement.js +17 -21
  32. package/components/containers/GridRoot.js +3 -3
  33. package/components/menu/GridMenu.js +4 -6
  34. package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  35. package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +2 -3
  36. package/components/panel/GridColumnsPanel.js +1 -2
  37. package/components/panel/GridPanel.d.ts +1 -10
  38. package/components/panel/GridPanel.js +1 -2
  39. package/components/panel/GridPreferencesPanel.js +2 -3
  40. package/components/panel/filterPanel/GridFilterForm.js +24 -27
  41. package/components/panel/filterPanel/GridFilterInputBoolean.d.ts +1 -1
  42. package/components/panel/filterPanel/GridFilterInputBoolean.js +6 -7
  43. package/components/panel/filterPanel/GridFilterInputDate.d.ts +1 -1
  44. package/components/panel/filterPanel/GridFilterInputDate.js +3 -4
  45. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +11 -15
  46. package/components/panel/filterPanel/GridFilterInputMultipleValue.js +10 -14
  47. package/components/panel/filterPanel/GridFilterInputSingleSelect.d.ts +1 -1
  48. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +10 -11
  49. package/components/panel/filterPanel/GridFilterInputValue.d.ts +1 -1
  50. package/components/panel/filterPanel/GridFilterInputValue.js +5 -7
  51. package/components/panel/filterPanel/GridFilterPanel.js +5 -9
  52. package/components/panel/filterPanel/filterPanelUtils.js +1 -1
  53. package/components/toolbar/GridToolbarColumnsButton.js +3 -5
  54. package/components/toolbar/GridToolbarDensitySelector.js +8 -10
  55. package/components/toolbar/GridToolbarExport.js +2 -2
  56. package/components/toolbar/GridToolbarExportContainer.js +3 -5
  57. package/components/toolbar/GridToolbarFilterButton.js +3 -5
  58. package/components/toolbar/GridToolbarQuickFilter.js +4 -5
  59. package/components/virtualization/GridVirtualScrollerContent.js +1 -2
  60. package/components/virtualization/GridVirtualScrollerRenderZone.js +1 -2
  61. package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -2
  62. package/hooks/core/useGridApiInitialization.js +4 -6
  63. package/hooks/features/clipboard/useGridClipboard.js +6 -5
  64. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -16
  65. package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +4 -8
  66. package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -23
  67. package/hooks/features/columnHeaders/useGridColumnHeaders.js +6 -8
  68. package/hooks/features/columnMenu/useGridColumnMenuSlots.js +2 -2
  69. package/hooks/features/columnResize/useGridColumnResize.js +9 -19
  70. package/hooks/features/columns/gridColumnsSelector.js +1 -2
  71. package/hooks/features/columns/gridColumnsUtils.d.ts +0 -9
  72. package/hooks/features/columns/gridColumnsUtils.js +2 -22
  73. package/hooks/features/columns/useGridColumnSpanning.js +1 -2
  74. package/hooks/features/columns/useGridColumns.js +11 -19
  75. package/hooks/features/density/densitySelector.d.ts +4 -2
  76. package/hooks/features/density/densitySelector.js +8 -2
  77. package/hooks/features/density/densityState.d.ts +1 -4
  78. package/hooks/features/density/useGridDensity.d.ts +2 -4
  79. package/hooks/features/density/useGridDensity.js +21 -29
  80. package/hooks/features/dimensions/useGridDimensions.js +3 -5
  81. package/hooks/features/editing/useGridCellEditing.js +4 -6
  82. package/hooks/features/editing/useGridEditing.js +1 -2
  83. package/hooks/features/editing/useGridRowEditing.js +4 -6
  84. package/hooks/features/export/serializers/csvSerializer.d.ts +2 -0
  85. package/hooks/features/export/serializers/csvSerializer.js +25 -16
  86. package/hooks/features/export/useGridCsvExport.js +9 -10
  87. package/hooks/features/export/useGridPrintExport.js +9 -15
  88. package/hooks/features/export/utils.js +2 -3
  89. package/hooks/features/filter/gridFilterSelector.js +15 -22
  90. package/hooks/features/filter/gridFilterUtils.js +10 -16
  91. package/hooks/features/filter/useGridFilter.js +9 -15
  92. package/hooks/features/focus/useGridFocus.js +5 -6
  93. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +1 -4
  94. package/hooks/features/headerFiltering/useGridHeaderFiltering.js +12 -17
  95. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -2
  96. package/hooks/features/pagination/gridPaginationSelector.js +1 -2
  97. package/hooks/features/pagination/useGridPagination.js +2 -3
  98. package/hooks/features/pagination/useGridPaginationModel.js +6 -11
  99. package/hooks/features/pagination/useGridRowCount.js +3 -6
  100. package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +7 -12
  101. package/hooks/features/rowSelection/useGridRowSelection.js +11 -16
  102. package/hooks/features/rows/gridRowsSelector.js +11 -19
  103. package/hooks/features/rows/gridRowsUtils.js +7 -9
  104. package/hooks/features/rows/useGridParamsApi.js +1 -1
  105. package/hooks/features/rows/useGridRows.js +4 -13
  106. package/hooks/features/rows/useGridRowsMeta.js +7 -13
  107. package/hooks/features/scroll/useGridScroll.js +2 -3
  108. package/hooks/features/sorting/gridSortingSelector.js +4 -7
  109. package/hooks/features/sorting/useGridSorting.js +8 -14
  110. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  111. package/hooks/features/virtualization/useGridVirtualScroller.js +220 -71
  112. package/hooks/utils/useGridApiEventHandler.js +5 -10
  113. package/hooks/utils/useGridNativeEventListener.js +1 -2
  114. package/index.js +1 -1
  115. package/internals/index.d.ts +2 -0
  116. package/internals/index.js +1 -0
  117. package/internals/utils/useProps.js +1 -2
  118. package/joy/joySlots.js +7 -13
  119. package/models/api/gridRowsMetaApi.d.ts +1 -1
  120. package/models/api/index.d.ts +1 -1
  121. package/models/api/index.js +0 -1
  122. package/models/events/gridEventLookup.d.ts +7 -0
  123. package/models/gridExport.d.ts +6 -0
  124. package/models/gridStateCommunity.d.ts +1 -0
  125. package/models/props/DataGridProps.d.ts +23 -27
  126. package/modern/DataGrid/DataGrid.js +13 -17
  127. package/modern/DataGrid/useDataGridProps.js +3 -5
  128. package/modern/components/GridPagination.js +11 -2
  129. package/modern/components/cell/GridActionsCell.js +1 -1
  130. package/modern/components/cell/GridActionsCellItem.js +4 -0
  131. package/modern/components/cell/GridBooleanCell.js +3 -2
  132. package/modern/components/containers/GridRoot.js +3 -3
  133. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  134. package/modern/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  135. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  136. package/modern/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  137. package/modern/components/toolbar/GridToolbarDensitySelector.js +5 -5
  138. package/modern/hooks/features/clipboard/useGridClipboard.js +4 -2
  139. package/modern/hooks/features/columnResize/useGridColumnResize.js +1 -1
  140. package/modern/hooks/features/columns/gridColumnsUtils.js +0 -19
  141. package/modern/hooks/features/density/densitySelector.js +8 -2
  142. package/modern/hooks/features/density/useGridDensity.js +21 -29
  143. package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
  144. package/modern/hooks/features/editing/useGridRowEditing.js +1 -1
  145. package/modern/hooks/features/export/serializers/csvSerializer.js +23 -12
  146. package/modern/hooks/features/export/useGridCsvExport.js +2 -1
  147. package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
  148. package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -2
  149. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  150. package/modern/index.js +1 -1
  151. package/modern/internals/index.js +1 -0
  152. package/modern/models/api/index.js +0 -1
  153. package/modern/utils/createSelector.js +1 -1
  154. package/modern/utils/domUtils.js +1 -1
  155. package/modern/utils/keyboardUtils.js +1 -1
  156. package/node/DataGrid/DataGrid.js +13 -17
  157. package/node/DataGrid/useDataGridProps.js +3 -5
  158. package/node/components/GridPagination.js +9 -1
  159. package/node/components/cell/GridActionsCell.js +1 -1
  160. package/node/components/cell/GridActionsCellItem.js +4 -0
  161. package/node/components/cell/GridBooleanCell.js +3 -2
  162. package/node/components/containers/GridRoot.js +2 -2
  163. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  164. package/node/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  165. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  166. package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  167. package/node/components/toolbar/GridToolbarDensitySelector.js +4 -4
  168. package/node/hooks/features/clipboard/useGridClipboard.js +4 -2
  169. package/node/hooks/features/columnResize/useGridColumnResize.js +1 -1
  170. package/node/hooks/features/columns/gridColumnsUtils.js +0 -20
  171. package/node/hooks/features/density/densitySelector.js +9 -3
  172. package/node/hooks/features/density/useGridDensity.js +22 -30
  173. package/node/hooks/features/editing/useGridCellEditing.js +1 -1
  174. package/node/hooks/features/editing/useGridRowEditing.js +1 -1
  175. package/node/hooks/features/export/serializers/csvSerializer.js +23 -12
  176. package/node/hooks/features/export/useGridCsvExport.js +2 -1
  177. package/node/hooks/features/filter/gridFilterUtils.js +1 -1
  178. package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -1
  179. package/node/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  180. package/node/index.js +1 -1
  181. package/node/internals/index.js +12 -0
  182. package/node/models/api/index.js +0 -11
  183. package/node/utils/createSelector.js +1 -1
  184. package/node/utils/domUtils.js +1 -1
  185. package/node/utils/keyboardUtils.js +1 -1
  186. package/package.json +4 -4
  187. package/utils/createSelector.js +9 -9
  188. package/utils/domUtils.js +4 -7
  189. package/utils/getGridLocalization.js +9 -12
  190. package/utils/keyboardUtils.js +1 -1
@@ -12,6 +12,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
12
12
  var React = _interopRequireWildcard(require("react"));
13
13
  var ReactDOM = _interopRequireWildcard(require("react-dom"));
14
14
  var _utils = require("@mui/utils");
15
+ var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
16
+ var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
15
17
  var _styles = require("@mui/material/styles");
16
18
  var _useGridPrivateApiContext = require("../../utils/useGridPrivateApiContext");
17
19
  var _useGridRootProps = require("../../utils/useGridRootProps");
@@ -34,13 +36,31 @@ var _useGridVirtualization = require("./useGridVirtualization");
34
36
  var _jsxRuntime = require("react/jsx-runtime");
35
37
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
36
38
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
39
+ const MINIMUM_COLUMN_WIDTH = 50;
40
+ var ScrollDirection = /*#__PURE__*/function (ScrollDirection) {
41
+ ScrollDirection[ScrollDirection["NONE"] = 0] = "NONE";
42
+ ScrollDirection[ScrollDirection["UP"] = 1] = "UP";
43
+ ScrollDirection[ScrollDirection["DOWN"] = 2] = "DOWN";
44
+ ScrollDirection[ScrollDirection["LEFT"] = 3] = "LEFT";
45
+ ScrollDirection[ScrollDirection["RIGHT"] = 4] = "RIGHT";
46
+ return ScrollDirection;
47
+ }(ScrollDirection || {});
48
+ const EMPTY_SCROLL_POSITION = {
49
+ top: 0,
50
+ left: 0
51
+ };
37
52
  const EMPTY_DETAIL_PANELS = exports.EMPTY_DETAIL_PANELS = Object.freeze(new Map());
53
+ const createScrollCache = (rowBufferPx, columnBufferPx, verticalBuffer, horizontalBuffer) => ({
54
+ direction: ScrollDirection.NONE,
55
+ buffer: bufferForDirection(ScrollDirection.NONE, rowBufferPx, columnBufferPx, verticalBuffer, horizontalBuffer)
56
+ });
57
+ const isJSDOM = typeof window !== 'undefined' ? /jsdom/.test(window.navigator.userAgent) : false;
38
58
  const useGridVirtualScroller = () => {
39
59
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
40
60
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
41
61
  const visibleColumns = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector);
42
- const enabled = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridVirtualizationEnabledSelector);
43
- const enabledForColumns = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridVirtualizationColumnEnabledSelector);
62
+ const enabled = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridVirtualizationEnabledSelector) && !isJSDOM;
63
+ const enabledForColumns = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridVirtualizationColumnEnabledSelector) && !isJSDOM;
44
64
  const dimensions = (0, _useGridSelector.useGridSelector)(apiRef, _gridDimensionsSelectors.gridDimensionsSelector);
45
65
  const outerSize = dimensions.viewportOuterSize;
46
66
  const pinnedRows = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridPinnedRowsSelector);
@@ -62,19 +82,34 @@ const useGridVirtualScroller = () => {
62
82
  const columnsTotalWidth = dimensions.columnsTotalWidth;
63
83
  const hasColSpan = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridHasColSpanSelector);
64
84
  (0, _useResizeObserver.useResizeObserver)(mainRef, () => apiRef.current.resize());
65
- const previousContext = React.useRef(_useGridVirtualization.EMPTY_RENDER_CONTEXT);
85
+
86
+ /*
87
+ * Scroll context logic
88
+ * ====================
89
+ * We only render the cells contained in the `renderContext`. However, when the user starts scrolling the grid
90
+ * in a direction, we want to render as many cells as possible in that direction, as to avoid presenting white
91
+ * areas if the user scrolls too fast/far and the viewport ends up in a region we haven't rendered yet. To render
92
+ * more cells, we store some offsets to add to the viewport in `scrollCache.buffer`. Those offsets make the render
93
+ * context wider in the direction the user is going, but also makes the buffer around the viewport `0` for the
94
+ * dimension (horizontal or vertical) in which the user is not scrolling. So if the normal viewport is 8 columns
95
+ * wide, with a 1 column buffer (10 columns total), then we want it to be exactly 8 columns wide during vertical
96
+ * scroll.
97
+ * However, we don't want the rows in the old context to re-render from e.g. 10 columns to 8 columns, because that's
98
+ * work that's not necessary. Thus we store the context at the start of the scroll in `frozenContext`, and the rows
99
+ * that are part of this old context will keep their same render context as to avoid re-rendering.
100
+ */
101
+ const scrollPosition = React.useRef(EMPTY_SCROLL_POSITION);
102
+ const previousContextScrollPosition = React.useRef(EMPTY_SCROLL_POSITION);
66
103
  const previousRowContext = React.useRef(_useGridVirtualization.EMPTY_RENDER_CONTEXT);
67
104
  const renderContext = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridRenderContextSelector);
68
- const scrollPosition = React.useRef({
69
- top: 0,
70
- left: 0
71
- }).current;
72
- const prevTotalWidth = React.useRef(columnsTotalWidth);
105
+ const scrollTimeout = (0, _useTimeout.default)();
106
+ const frozenContext = React.useRef(undefined);
107
+ const scrollCache = (0, _useLazyRef.default)(() => createScrollCache(rootProps.rowBufferPx, rootProps.columnBufferPx, dimensions.rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6)).current;
73
108
  const focusedCell = {
74
109
  rowIndex: React.useMemo(() => cellFocus ? currentPage.rows.findIndex(row => row.id === cellFocus.id) : -1, [cellFocus, currentPage.rows]),
75
110
  columnIndex: React.useMemo(() => cellFocus ? visibleColumns.findIndex(column => column.field === cellFocus.field) : -1, [cellFocus, visibleColumns])
76
111
  };
77
- const updateRenderContext = React.useCallback((nextRenderContext, rawRenderContext) => {
112
+ const updateRenderContext = React.useCallback(nextRenderContext => {
78
113
  if (areRenderContextsEqual(nextRenderContext, apiRef.current.state.virtualization.renderContext)) {
79
114
  return;
80
115
  }
@@ -94,41 +129,67 @@ const useGridVirtualScroller = () => {
94
129
  previousRowContext.current = nextRenderContext;
95
130
  apiRef.current.publishEvent('renderedRowsIntervalChange', nextRenderContext);
96
131
  }
97
- previousContext.current = rawRenderContext;
98
- prevTotalWidth.current = dimensions.columnsTotalWidth;
99
- }, [apiRef, dimensions.isReady, dimensions.columnsTotalWidth]);
132
+ previousContextScrollPosition.current = scrollPosition.current;
133
+ }, [apiRef, dimensions.isReady]);
100
134
  const triggerUpdateRenderContext = () => {
101
- const inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
102
- const [nextRenderContext, rawRenderContext] = computeRenderContext(inputs, scrollPosition);
135
+ const newScroll = {
136
+ top: scrollerRef.current.scrollTop,
137
+ left: scrollerRef.current.scrollLeft
138
+ };
139
+ const dx = newScroll.left - scrollPosition.current.left;
140
+ const dy = newScroll.top - scrollPosition.current.top;
141
+ const isScrolling = dx !== 0 || dy !== 0;
142
+ scrollPosition.current = newScroll;
143
+ const direction = isScrolling ? directionForDelta(dx, dy) : ScrollDirection.NONE;
103
144
 
104
145
  // Since previous render, we have scrolled...
105
- const topRowsScrolled = Math.abs(rawRenderContext.firstRowIndex - previousContext.current.firstRowIndex);
106
- const bottomRowsScrolled = Math.abs(rawRenderContext.lastRowIndex - previousContext.current.lastRowIndex);
107
- const topColumnsScrolled = Math.abs(rawRenderContext.firstColumnIndex - previousContext.current.firstColumnIndex);
108
- const bottomColumnsScrolled = Math.abs(rawRenderContext.lastColumnIndex - previousContext.current.lastColumnIndex);
109
- const shouldUpdate = topRowsScrolled >= rootProps.rowThreshold || bottomRowsScrolled >= rootProps.rowThreshold || topColumnsScrolled >= rootProps.columnThreshold || bottomColumnsScrolled >= rootProps.columnThreshold || prevTotalWidth.current !== dimensions.columnsTotalWidth;
146
+ const rowScroll = Math.abs(scrollPosition.current.top - previousContextScrollPosition.current.top);
147
+ const columnScroll = Math.abs(scrollPosition.current.left - previousContextScrollPosition.current.left);
148
+
149
+ // PERF: use the computed minimum column width instead of a static one
150
+ const didCrossThreshold = rowScroll >= dimensions.rowHeight || columnScroll >= MINIMUM_COLUMN_WIDTH;
151
+ const didChangeDirection = scrollCache.direction !== direction;
152
+ const shouldUpdate = didCrossThreshold || didChangeDirection;
110
153
  if (!shouldUpdate) {
111
- return previousContext.current;
154
+ return renderContext;
112
155
  }
113
156
 
157
+ // Render a new context
158
+
159
+ if (didChangeDirection) {
160
+ switch (direction) {
161
+ case ScrollDirection.NONE:
162
+ case ScrollDirection.LEFT:
163
+ case ScrollDirection.RIGHT:
164
+ frozenContext.current = undefined;
165
+ break;
166
+ default:
167
+ frozenContext.current = renderContext;
168
+ break;
169
+ }
170
+ }
171
+ scrollCache.direction = direction;
172
+ scrollCache.buffer = bufferForDirection(direction, rootProps.rowBufferPx, rootProps.columnBufferPx, dimensions.rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6);
173
+ const inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
174
+ const nextRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
175
+
114
176
  // Prevents batching render context changes
115
177
  ReactDOM.flushSync(() => {
116
- updateRenderContext(nextRenderContext, rawRenderContext);
178
+ updateRenderContext(nextRenderContext);
117
179
  });
180
+ scrollTimeout.start(1000, triggerUpdateRenderContext);
118
181
  return nextRenderContext;
119
182
  };
120
183
  const forceUpdateRenderContext = () => {
121
184
  const inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
122
- const [nextRenderContext, rawRenderContext] = computeRenderContext(inputs, scrollPosition);
123
- updateRenderContext(nextRenderContext, rawRenderContext);
185
+ const nextRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
186
+ updateRenderContext(nextRenderContext);
124
187
  };
125
188
  const handleScroll = (0, _utils.unstable_useEventCallback)(event => {
126
189
  const {
127
190
  scrollTop,
128
191
  scrollLeft
129
192
  } = event.currentTarget;
130
- scrollPosition.top = scrollTop;
131
- scrollPosition.left = scrollLeft;
132
193
 
133
194
  // On iOS and macOS, negative offsets are possible when swiping past the start
134
195
  if (scrollTop < 0) {
@@ -161,8 +222,7 @@ const useGridVirtualScroller = () => {
161
222
  if (!params.rows && !currentPage.range) {
162
223
  return [];
163
224
  }
164
- const columnPositions = (0, _gridColumnsSelector.gridColumnPositionsSelector)(apiRef);
165
- const currentRenderContext = params.renderContext ?? renderContext;
225
+ const baseRenderContext = params.renderContext ?? renderContext;
166
226
  const isLastSection = !hasBottomPinnedRows && params.position === undefined || hasBottomPinnedRows && params.position === 'bottom';
167
227
  const isPinnedSection = params.position !== undefined;
168
228
  let rowIndexOffset;
@@ -180,8 +240,8 @@ const useGridVirtualScroller = () => {
180
240
  break;
181
241
  }
182
242
  const rowModels = params.rows ?? currentPage.rows;
183
- const firstRowToRender = currentRenderContext.firstRowIndex;
184
- const lastRowToRender = Math.min(currentRenderContext.lastRowIndex, rowModels.length);
243
+ const firstRowToRender = baseRenderContext.firstRowIndex;
244
+ const lastRowToRender = Math.min(baseRenderContext.lastRowIndex, rowModels.length);
185
245
  const rowIndexes = params.rows ? (0, _utils3.range)(0, params.rows.length) : (0, _utils3.range)(firstRowToRender, lastRowToRender);
186
246
  let virtualRowIndex = -1;
187
247
  if (!isPinnedSection && focusedCell.rowIndex !== -1) {
@@ -196,6 +256,7 @@ const useGridVirtualScroller = () => {
196
256
  }
197
257
  const rows = [];
198
258
  const rowProps = rootProps.slotProps?.row;
259
+ const columnPositions = (0, _gridColumnsSelector.gridColumnPositionsSelector)(apiRef);
199
260
  rowIndexes.forEach(rowIndexInPage => {
200
261
  const {
201
262
  id,
@@ -260,6 +321,10 @@ const useGridVirtualScroller = () => {
260
321
  const cellParams = apiRef.current.getCellParams(id, cellTabIndex.field);
261
322
  tabbableCell = cellParams.cellMode === 'view' ? cellTabIndex.field : null;
262
323
  }
324
+ let currentRenderContext = baseRenderContext;
325
+ if (!isPinnedSection && frozenContext.current && rowIndexInPage >= frozenContext.current.firstRowIndex && rowIndexInPage < frozenContext.current.lastRowIndex) {
326
+ currentRenderContext = frozenContext.current;
327
+ }
263
328
  const offsetLeft = computeOffsetLeft(columnPositions, currentRenderContext, theme.direction, pinnedColumns.left.length);
264
329
  const rowIndex = (currentPage?.range?.firstRowIndex || 0) + rowIndexOffset + rowIndexInPage;
265
330
  rows.push( /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.row, (0, _extends2.default)({
@@ -331,11 +396,11 @@ const useGridVirtualScroller = () => {
331
396
  }, [enabled, gridRootRef, scrollerRef]);
332
397
  (0, _useRunOnce.useRunOnce)(outerSize.width !== 0, () => {
333
398
  const inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
334
- const [initialRenderContext, rawRenderContext] = computeRenderContext(inputs, scrollPosition);
335
- updateRenderContext(initialRenderContext, rawRenderContext);
399
+ const initialRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
400
+ updateRenderContext(initialRenderContext);
336
401
  apiRef.current.publishEvent('scrollPositionChange', {
337
- top: scrollPosition.top,
338
- left: scrollPosition.left,
402
+ top: scrollPosition.current.top,
403
+ left: scrollPosition.current.left,
339
404
  renderContext: initialRenderContext
340
405
  });
341
406
  });
@@ -382,26 +447,31 @@ exports.useGridVirtualScroller = useGridVirtualScroller;
382
447
  function inputsSelector(apiRef, rootProps, enabled, enabledForColumns) {
383
448
  const dimensions = (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state);
384
449
  const currentPage = (0, _useGridVisibleRows.getVisibleRows)(apiRef, rootProps);
450
+ const visibleColumns = (0, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector)(apiRef);
451
+ const lastRowId = apiRef.current.state.rows.dataRowIds.at(-1);
452
+ const lastColumn = visibleColumns.at(-1);
385
453
  return {
386
454
  enabled,
387
455
  enabledForColumns,
388
456
  apiRef,
389
457
  autoHeight: rootProps.autoHeight,
390
- rowBuffer: rootProps.rowBuffer,
391
- columnBuffer: rootProps.columnBuffer,
458
+ rowBufferPx: rootProps.rowBufferPx,
459
+ columnBufferPx: rootProps.columnBufferPx,
392
460
  leftPinnedWidth: dimensions.leftPinnedWidth,
393
461
  columnsTotalWidth: dimensions.columnsTotalWidth,
394
462
  viewportInnerWidth: dimensions.viewportInnerSize.width,
395
463
  viewportInnerHeight: dimensions.viewportInnerSize.height,
464
+ lastRowHeight: lastRowId !== undefined ? apiRef.current.unstable_getRowHeight(lastRowId) : 0,
465
+ lastColumnWidth: lastColumn?.computedWidth ?? 0,
396
466
  rowsMeta: (0, _gridRowsMetaSelector.gridRowsMetaSelector)(apiRef.current.state),
397
467
  columnPositions: (0, _gridColumnsSelector.gridColumnPositionsSelector)(apiRef),
398
468
  rows: currentPage.rows,
399
469
  range: currentPage.range,
400
470
  pinnedColumns: (0, _gridColumnsSelector.gridVisiblePinnedColumnDefinitionsSelector)(apiRef),
401
- visibleColumns: (0, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector)(apiRef)
471
+ visibleColumns
402
472
  };
403
473
  }
404
- function computeRenderContext(inputs, scrollPosition) {
474
+ function computeRenderContext(inputs, scrollPosition, scrollCache) {
405
475
  let renderContext;
406
476
  if (!inputs.enabled) {
407
477
  renderContext = {
@@ -419,7 +489,10 @@ function computeRenderContext(inputs, scrollPosition) {
419
489
 
420
490
  // Clamp the value because the search may return an index out of bounds.
421
491
  // In the last index, this is not needed because Array.slice doesn't include it.
422
- const firstRowIndex = Math.min(getNearestIndexToRender(inputs, top), inputs.rowsMeta.positions.length - 1);
492
+ const firstRowIndex = Math.min(getNearestIndexToRender(inputs, top, {
493
+ atStart: true,
494
+ lastPosition: inputs.rowsMeta.positions[inputs.rowsMeta.positions.length - 1] + inputs.lastRowHeight
495
+ }), inputs.rowsMeta.positions.length - 1);
423
496
  const lastRowIndex = inputs.autoHeight ? firstRowIndex + inputs.rows.length : getNearestIndexToRender(inputs, top + inputs.viewportInnerHeight);
424
497
  let firstColumnIndex = 0;
425
498
  let lastColumnIndex = inputs.columnPositions.length;
@@ -430,7 +503,10 @@ function computeRenderContext(inputs, scrollPosition) {
430
503
  lastIndex: lastRowIndex,
431
504
  minFirstIndex: 0,
432
505
  maxLastIndex: inputs.rows.length,
433
- buffer: inputs.rowBuffer
506
+ bufferBefore: scrollCache.buffer.rowBefore,
507
+ bufferAfter: scrollCache.buffer.rowAfter,
508
+ positions: inputs.rowsMeta.positions,
509
+ lastSize: inputs.lastRowHeight
434
510
  });
435
511
  for (let i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
436
512
  const row = inputs.rows[i];
@@ -451,10 +527,10 @@ function computeRenderContext(inputs, scrollPosition) {
451
527
  lastColumnIndex
452
528
  };
453
529
  }
454
- const actualRenderContext = deriveRenderContext(inputs.apiRef, inputs.rowBuffer, inputs.columnBuffer, inputs.rows, inputs.pinnedColumns, inputs.visibleColumns, renderContext);
455
- return [actualRenderContext, renderContext];
530
+ const actualRenderContext = deriveRenderContext(inputs, renderContext, scrollCache);
531
+ return actualRenderContext;
456
532
  }
457
- function getNearestIndexToRender(inputs, offset) {
533
+ function getNearestIndexToRender(inputs, offset, options) {
458
534
  const lastMeasuredIndexRelativeToAllRows = inputs.apiRef.current.getLastMeasuredRowIndex();
459
535
  let allRowsMeasured = lastMeasuredIndexRelativeToAllRows === Infinity;
460
536
  if (inputs.range?.lastRowIndex && !allRowsMeasured) {
@@ -465,14 +541,14 @@ function getNearestIndexToRender(inputs, offset) {
465
541
  if (allRowsMeasured || inputs.rowsMeta.positions[lastMeasuredIndexRelativeToCurrentPage] >= offset) {
466
542
  // If all rows were measured (when no row has "auto" as height) or all rows before the offset
467
543
  // were measured, then use a binary search because it's faster.
468
- return binarySearch(offset, inputs.rowsMeta.positions);
544
+ return binarySearch(offset, inputs.rowsMeta.positions, options);
469
545
  }
470
546
 
471
547
  // Otherwise, use an exponential search.
472
548
  // If rows have "auto" as height, their positions will be based on estimated heights.
473
549
  // In this case, we can skip several steps until we find a position higher than the offset.
474
550
  // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
475
- return exponentialSearch(offset, inputs.rowsMeta.positions, lastMeasuredIndexRelativeToCurrentPage);
551
+ return exponentialSearch(offset, inputs.rowsMeta.positions, lastMeasuredIndexRelativeToCurrentPage, options);
476
552
  }
477
553
 
478
554
  /**
@@ -480,27 +556,33 @@ function getNearestIndexToRender(inputs, offset) {
480
556
  * computes the actual render context based on pinned elements, buffer dimensions and
481
557
  * spanning.
482
558
  */
483
- function deriveRenderContext(apiRef, rowBuffer, columnBuffer, rows, pinnedColumns, visibleColumns, nextRenderContext) {
559
+ function deriveRenderContext(inputs, nextRenderContext, scrollCache) {
484
560
  const [firstRowToRender, lastRowToRender] = getIndexesToRender({
485
561
  firstIndex: nextRenderContext.firstRowIndex,
486
562
  lastIndex: nextRenderContext.lastRowIndex,
487
563
  minFirstIndex: 0,
488
- maxLastIndex: rows.length,
489
- buffer: rowBuffer
564
+ maxLastIndex: inputs.rows.length,
565
+ bufferBefore: scrollCache.buffer.rowBefore,
566
+ bufferAfter: scrollCache.buffer.rowAfter,
567
+ positions: inputs.rowsMeta.positions,
568
+ lastSize: inputs.lastRowHeight
490
569
  });
491
570
  const [initialFirstColumnToRender, lastColumnToRender] = getIndexesToRender({
492
571
  firstIndex: nextRenderContext.firstColumnIndex,
493
572
  lastIndex: nextRenderContext.lastColumnIndex,
494
- minFirstIndex: pinnedColumns.left.length,
495
- maxLastIndex: visibleColumns.length - pinnedColumns.right.length,
496
- buffer: columnBuffer
573
+ minFirstIndex: inputs.pinnedColumns.left.length,
574
+ maxLastIndex: inputs.visibleColumns.length - inputs.pinnedColumns.right.length,
575
+ bufferBefore: scrollCache.buffer.columnBefore,
576
+ bufferAfter: scrollCache.buffer.columnAfter,
577
+ positions: inputs.columnPositions,
578
+ lastSize: inputs.lastColumnWidth
497
579
  });
498
580
  const firstColumnToRender = (0, _gridColumnsUtils.getFirstNonSpannedColumnToRender)({
499
581
  firstColumnToRender: initialFirstColumnToRender,
500
- apiRef,
582
+ apiRef: inputs.apiRef,
501
583
  firstRowToRender,
502
584
  lastRowToRender,
503
- visibleRows: rows
585
+ visibleRows: inputs.rows
504
586
  });
505
587
  return {
506
588
  firstRowIndex: firstRowToRender,
@@ -533,22 +615,32 @@ function binarySearch(offset, positions, options = undefined, sliceStart = 0, sl
533
615
  }
534
616
  return isBefore ? binarySearch(offset, positions, options, sliceStart, pivot) : binarySearch(offset, positions, options, pivot + 1, sliceEnd);
535
617
  }
536
- function exponentialSearch(offset, positions, index) {
618
+ function exponentialSearch(offset, positions, index, options = undefined) {
537
619
  let interval = 1;
538
620
  while (index < positions.length && Math.abs(positions[index]) < offset) {
539
621
  index += interval;
540
622
  interval *= 2;
541
623
  }
542
- return binarySearch(offset, positions, undefined, Math.floor(index / 2), Math.min(index, positions.length));
624
+ return binarySearch(offset, positions, options, Math.floor(index / 2), Math.min(index, positions.length));
543
625
  }
544
626
  function getIndexesToRender({
545
627
  firstIndex,
546
628
  lastIndex,
547
- buffer,
629
+ bufferBefore,
630
+ bufferAfter,
548
631
  minFirstIndex,
549
- maxLastIndex
632
+ maxLastIndex,
633
+ positions,
634
+ lastSize
550
635
  }) {
551
- return [(0, _utils3.clamp)(firstIndex - buffer, minFirstIndex, maxLastIndex), (0, _utils3.clamp)(lastIndex + buffer, minFirstIndex, maxLastIndex)];
636
+ const firstPosition = positions[firstIndex] - bufferBefore;
637
+ const lastPosition = positions[lastIndex] + bufferAfter;
638
+ const firstIndexPadded = binarySearch(firstPosition, positions, {
639
+ atStart: true,
640
+ lastPosition: positions[positions.length - 1] + lastSize
641
+ });
642
+ const lastIndexPadded = binarySearch(lastPosition, positions);
643
+ return [(0, _utils3.clamp)(firstIndexPadded, minFirstIndex, maxLastIndex), (0, _utils3.clamp)(lastIndexPadded, minFirstIndex, maxLastIndex)];
552
644
  }
553
645
  function areRenderContextsEqual(context1, context2) {
554
646
  if (context1 === context2) {
@@ -560,4 +652,66 @@ function computeOffsetLeft(columnPositions, renderContext, direction, pinnedLeft
560
652
  const factor = direction === 'ltr' ? 1 : -1;
561
653
  const left = factor * (columnPositions[renderContext.firstColumnIndex] ?? 0) - (columnPositions[pinnedLeftLength] ?? 0);
562
654
  return left;
655
+ }
656
+ function directionForDelta(dx, dy) {
657
+ if (dx === 0 && dy === 0) {
658
+ return ScrollDirection.NONE;
659
+ }
660
+ /* eslint-disable */
661
+ if (Math.abs(dy) >= Math.abs(dx)) {
662
+ if (dy > 0) {
663
+ return ScrollDirection.DOWN;
664
+ } else {
665
+ return ScrollDirection.UP;
666
+ }
667
+ } else {
668
+ if (dx > 0) {
669
+ return ScrollDirection.RIGHT;
670
+ } else {
671
+ return ScrollDirection.LEFT;
672
+ }
673
+ }
674
+ /* eslint-enable */
675
+ }
676
+ function bufferForDirection(direction, rowBufferPx, columnBufferPx, verticalBuffer, horizontalBuffer) {
677
+ switch (direction) {
678
+ case ScrollDirection.NONE:
679
+ return {
680
+ rowAfter: rowBufferPx,
681
+ rowBefore: rowBufferPx,
682
+ columnAfter: columnBufferPx,
683
+ columnBefore: columnBufferPx
684
+ };
685
+ case ScrollDirection.LEFT:
686
+ return {
687
+ rowAfter: 0,
688
+ rowBefore: 0,
689
+ columnAfter: 0,
690
+ columnBefore: horizontalBuffer
691
+ };
692
+ case ScrollDirection.RIGHT:
693
+ return {
694
+ rowAfter: 0,
695
+ rowBefore: 0,
696
+ columnAfter: horizontalBuffer,
697
+ columnBefore: 0
698
+ };
699
+ case ScrollDirection.UP:
700
+ return {
701
+ rowAfter: 0,
702
+ rowBefore: verticalBuffer,
703
+ columnAfter: 0,
704
+ columnBefore: 0
705
+ };
706
+ case ScrollDirection.DOWN:
707
+ return {
708
+ rowAfter: verticalBuffer,
709
+ rowBefore: 0,
710
+ columnAfter: 0,
711
+ columnBefore: 0
712
+ };
713
+ default:
714
+ // eslint unable to figure out enum exhaustiveness
715
+ throw new Error('unreachable');
716
+ }
563
717
  }
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.0.0-beta.7
2
+ * @mui/x-data-grid v7.0.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -757,6 +757,18 @@ Object.keys(_getPublicApiRef).forEach(function (key) {
757
757
  }
758
758
  });
759
759
  });
760
+ var _cellBorderUtils = require("../utils/cellBorderUtils");
761
+ Object.keys(_cellBorderUtils).forEach(function (key) {
762
+ if (key === "default" || key === "__esModule") return;
763
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
764
+ if (key in exports && exports[key] === _cellBorderUtils[key]) return;
765
+ Object.defineProperty(exports, key, {
766
+ enumerable: true,
767
+ get: function () {
768
+ return _cellBorderUtils[key];
769
+ }
770
+ });
771
+ });
760
772
  var _useGridPrivateApiContext = require("../hooks/utils/useGridPrivateApiContext");
761
773
  var _utils3 = require("../hooks/utils");
762
774
  Object.keys(_utils3).forEach(function (key) {
@@ -156,15 +156,4 @@ Object.keys(_gridScrollApi).forEach(function (key) {
156
156
  return _gridScrollApi[key];
157
157
  }
158
158
  });
159
- });
160
- var _gridVirtualizationApi = require("./gridVirtualizationApi");
161
- Object.keys(_gridVirtualizationApi).forEach(function (key) {
162
- if (key === "default" || key === "__esModule") return;
163
- if (key in exports && exports[key] === _gridVirtualizationApi[key]) return;
164
- Object.defineProperty(exports, key, {
165
- enumerable: true,
166
- get: function () {
167
- return _gridVirtualizationApi[key];
168
- }
169
- });
170
159
  });
@@ -7,7 +7,7 @@ exports.createSelectorMemoized = exports.createSelector = void 0;
7
7
  var _reselect = require("reselect");
8
8
  var _warning = require("./warning");
9
9
  const cache = new WeakMap();
10
- const missingInstanceIdWarning = (0, _warning.buildWarning)(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, e.g. `mySelector(apiRef)`, or pass the instance ID explicitly, e.g. `mySelector(state, apiRef.current.instanceId)`.']);
10
+ const missingInstanceIdWarning = (0, _warning.buildWarning)(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, for example `mySelector(apiRef)`, or pass the instance ID explicitly, for example `mySelector(state, apiRef.current.instanceId)`.']);
11
11
  function checkIsAPIRef(value) {
12
12
  return 'current' in value && 'instanceId' in value.current;
13
13
  }
@@ -205,7 +205,7 @@ function findGridCells(api, field) {
205
205
  }
206
206
  function queryRows(api) {
207
207
  return api.virtualScrollerRef.current.querySelectorAll(
208
- // Use > to ignore rows from nested data grids (e.g. in detail panel)
208
+ // Use > to ignore rows from nested data grids (for example in detail panel)
209
209
  `:scope > div > div > .${_gridClasses.gridClasses.row}`);
210
210
  }
211
211
  function parseCellColIndex(col) {
@@ -18,7 +18,7 @@ const isEscapeKey = key => key === 'Escape';
18
18
  exports.isEscapeKey = isEscapeKey;
19
19
  const isTabKey = key => key === 'Tab';
20
20
 
21
- // Non printable keys have a name, e.g. "ArrowRight", see the whole list:
21
+ // Non printable keys have a name, for example "ArrowRight", see the whole list:
22
22
  // https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values
23
23
  // So event.key.length === 1 is often enough.
24
24
  //
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-data-grid",
3
- "version": "7.0.0-beta.7",
3
+ "version": "7.0.0",
4
4
  "description": "The community edition of the data grid component (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -37,14 +37,14 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@babel/runtime": "^7.24.0",
40
- "@mui/system": "^5.15.9",
41
- "@mui/utils": "^5.15.9",
40
+ "@mui/system": "^5.15.14",
41
+ "@mui/utils": "^5.15.14",
42
42
  "clsx": "^2.1.0",
43
43
  "prop-types": "^15.8.1",
44
44
  "reselect": "^4.1.8"
45
45
  },
46
46
  "peerDependencies": {
47
- "@mui/material": "^5.15.0",
47
+ "@mui/material": "^5.15.14",
48
48
  "react": "^17.0.0 || ^18.0.0",
49
49
  "react-dom": "^17.0.0 || ^18.0.0"
50
50
  },
@@ -1,7 +1,7 @@
1
1
  import { createSelector as reselectCreateSelector } from 'reselect';
2
2
  import { buildWarning } from './warning';
3
3
  const cache = new WeakMap();
4
- const missingInstanceIdWarning = buildWarning(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, e.g. `mySelector(apiRef)`, or pass the instance ID explicitly, e.g. `mySelector(state, apiRef.current.instanceId)`.']);
4
+ const missingInstanceIdWarning = buildWarning(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, for example `mySelector(apiRef)`, or pass the instance ID explicitly, for example `mySelector(state, apiRef.current.instanceId)`.']);
5
5
  function checkIsAPIRef(value) {
6
6
  return 'current' in value && 'instanceId' in value.current;
7
7
  }
@@ -16,7 +16,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
16
16
  if (a && b && c && d && e && f) {
17
17
  selector = (stateOrApiRef, instanceIdParam) => {
18
18
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
19
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
19
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
20
20
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
21
21
  const va = a(state, instanceId);
22
22
  const vb = b(state, instanceId);
@@ -28,7 +28,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
28
28
  } else if (a && b && c && d && e) {
29
29
  selector = (stateOrApiRef, instanceIdParam) => {
30
30
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
31
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
31
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
32
32
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
33
33
  const va = a(state, instanceId);
34
34
  const vb = b(state, instanceId);
@@ -39,7 +39,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
39
39
  } else if (a && b && c && d) {
40
40
  selector = (stateOrApiRef, instanceIdParam) => {
41
41
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
42
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
42
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
43
43
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
44
44
  const va = a(state, instanceId);
45
45
  const vb = b(state, instanceId);
@@ -49,7 +49,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
49
49
  } else if (a && b && c) {
50
50
  selector = (stateOrApiRef, instanceIdParam) => {
51
51
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
52
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
52
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
53
53
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
54
54
  const va = a(state, instanceId);
55
55
  const vb = b(state, instanceId);
@@ -58,7 +58,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
58
58
  } else if (a && b) {
59
59
  selector = (stateOrApiRef, instanceIdParam) => {
60
60
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
61
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
61
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
62
62
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
63
63
  const va = a(state, instanceId);
64
64
  return b(va);
@@ -75,7 +75,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
75
75
  export const createSelectorMemoized = (...args) => {
76
76
  const selector = (stateOrApiRef, instanceId) => {
77
77
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
78
- const cacheKey = isAPIRef ? stateOrApiRef.current.instanceId : instanceId != null ? instanceId : DEFAULT_INSTANCE_ID;
78
+ const cacheKey = isAPIRef ? stateOrApiRef.current.instanceId : instanceId ?? DEFAULT_INSTANCE_ID;
79
79
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
80
80
  if (process.env.NODE_ENV !== 'production') {
81
81
  if (cacheKey.id === 'default') {
@@ -83,8 +83,8 @@ export const createSelectorMemoized = (...args) => {
83
83
  }
84
84
  }
85
85
  const cacheArgsInit = cache.get(cacheKey);
86
- const cacheArgs = cacheArgsInit != null ? cacheArgsInit : new Map();
87
- const cacheFn = cacheArgs == null ? void 0 : cacheArgs.get(args);
86
+ const cacheArgs = cacheArgsInit ?? new Map();
87
+ const cacheFn = cacheArgs?.get(args);
88
88
  if (cacheArgs && cacheFn) {
89
89
  // We pass the cache key because the called selector might have as
90
90
  // dependency another selector created with this `createSelector`.