@mui/x-data-grid 5.12.1 → 5.12.2

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 (189) hide show
  1. package/CHANGELOG.md +45 -2
  2. package/colDef/gridCheckboxSelectionColDef.d.ts +1 -0
  3. package/colDef/gridCheckboxSelectionColDef.js +2 -1
  4. package/colDef/gridDateOperators.d.ts +1 -1
  5. package/colDef/gridNumericColDef.js +1 -1
  6. package/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  7. package/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  8. package/components/columnSelection/GridHeaderCheckbox.js +0 -1
  9. package/components/containers/GridRootStyles.js +1 -1
  10. package/components/panel/GridColumnsPanel.js +2 -5
  11. package/components/panel/filterPanel/GridFilterPanel.js +1 -2
  12. package/components/toolbar/GridToolbarColumnsButton.js +0 -1
  13. package/components/toolbar/GridToolbarDensitySelector.js +0 -1
  14. package/components/toolbar/GridToolbarExportContainer.js +0 -1
  15. package/components/toolbar/GridToolbarFilterButton.js +0 -1
  16. package/constants/localeTextConstants.js +1 -0
  17. package/hooks/features/columns/useGridColumnSpanning.d.ts +1 -1
  18. package/hooks/features/columns/useGridColumnSpanning.js +1 -1
  19. package/hooks/features/columns/useGridColumns.d.ts +1 -1
  20. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
  21. package/hooks/features/dimensions/useGridDimensions.js +9 -8
  22. package/hooks/features/filter/gridFilterState.d.ts +1 -1
  23. package/hooks/features/filter/useGridFilter.d.ts +1 -1
  24. package/hooks/features/rows/useGridRowsMeta.js +79 -77
  25. package/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  26. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  27. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  28. package/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  29. package/index.js +1 -1
  30. package/legacy/colDef/gridCheckboxSelectionColDef.js +2 -1
  31. package/legacy/colDef/gridNumericColDef.js +1 -1
  32. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  33. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  34. package/legacy/components/columnSelection/GridHeaderCheckbox.js +0 -1
  35. package/legacy/components/containers/GridRootStyles.js +1 -1
  36. package/legacy/components/panel/GridColumnsPanel.js +2 -5
  37. package/legacy/components/panel/filterPanel/GridFilterPanel.js +1 -2
  38. package/legacy/components/toolbar/GridToolbarColumnsButton.js +0 -1
  39. package/legacy/components/toolbar/GridToolbarDensitySelector.js +0 -1
  40. package/legacy/components/toolbar/GridToolbarExportContainer.js +0 -1
  41. package/legacy/components/toolbar/GridToolbarFilterButton.js +0 -1
  42. package/legacy/constants/localeTextConstants.js +1 -0
  43. package/legacy/hooks/features/columns/useGridColumnSpanning.js +1 -1
  44. package/legacy/hooks/features/dimensions/useGridDimensions.js +9 -8
  45. package/legacy/hooks/features/rows/useGridRowsMeta.js +81 -77
  46. package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  47. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  48. package/legacy/index.js +1 -1
  49. package/legacy/locales/arSD.js +1 -0
  50. package/legacy/locales/bgBG.js +1 -0
  51. package/legacy/locales/csCZ.js +1 -0
  52. package/legacy/locales/daDK.js +1 -0
  53. package/legacy/locales/deDE.js +1 -0
  54. package/legacy/locales/elGR.js +1 -0
  55. package/legacy/locales/esES.js +1 -0
  56. package/legacy/locales/faIR.js +1 -0
  57. package/legacy/locales/fiFI.js +1 -0
  58. package/legacy/locales/frFR.js +1 -0
  59. package/legacy/locales/heIL.js +1 -0
  60. package/legacy/locales/huHU.js +1 -0
  61. package/legacy/locales/itIT.js +1 -0
  62. package/legacy/locales/jaJP.js +1 -0
  63. package/legacy/locales/koKR.js +1 -0
  64. package/legacy/locales/nbNO.js +1 -0
  65. package/legacy/locales/nlNL.js +1 -0
  66. package/legacy/locales/plPL.js +1 -0
  67. package/legacy/locales/ptBR.js +1 -0
  68. package/legacy/locales/ruRU.js +1 -0
  69. package/legacy/locales/skSK.js +1 -0
  70. package/legacy/locales/trTR.js +1 -0
  71. package/legacy/locales/ukUA.js +1 -0
  72. package/legacy/locales/viVN.js +1 -0
  73. package/legacy/locales/zhCN.js +1 -0
  74. package/locales/arSD.js +1 -0
  75. package/locales/bgBG.js +1 -0
  76. package/locales/csCZ.js +1 -0
  77. package/locales/daDK.js +1 -0
  78. package/locales/deDE.js +1 -0
  79. package/locales/elGR.js +1 -0
  80. package/locales/esES.js +1 -0
  81. package/locales/faIR.js +1 -0
  82. package/locales/fiFI.js +1 -0
  83. package/locales/frFR.js +1 -0
  84. package/locales/heIL.js +1 -0
  85. package/locales/huHU.js +1 -0
  86. package/locales/itIT.js +1 -0
  87. package/locales/jaJP.js +1 -0
  88. package/locales/koKR.js +1 -0
  89. package/locales/nbNO.js +1 -0
  90. package/locales/nlNL.js +1 -0
  91. package/locales/plPL.js +1 -0
  92. package/locales/ptBR.js +1 -0
  93. package/locales/ruRU.js +1 -0
  94. package/locales/skSK.js +1 -0
  95. package/locales/trTR.js +1 -0
  96. package/locales/ukUA.js +1 -0
  97. package/locales/viVN.js +1 -0
  98. package/locales/zhCN.js +1 -0
  99. package/models/api/gridLocaleTextApi.d.ts +1 -0
  100. package/models/colDef/gridColDef.d.ts +1 -1
  101. package/modern/colDef/gridCheckboxSelectionColDef.js +2 -1
  102. package/modern/colDef/gridNumericColDef.js +1 -1
  103. package/modern/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  104. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  105. package/modern/components/columnSelection/GridHeaderCheckbox.js +0 -1
  106. package/modern/components/containers/GridRootStyles.js +1 -1
  107. package/modern/components/panel/GridColumnsPanel.js +2 -5
  108. package/modern/components/panel/filterPanel/GridFilterPanel.js +1 -2
  109. package/modern/components/toolbar/GridToolbarColumnsButton.js +0 -1
  110. package/modern/components/toolbar/GridToolbarDensitySelector.js +0 -1
  111. package/modern/components/toolbar/GridToolbarExportContainer.js +0 -1
  112. package/modern/components/toolbar/GridToolbarFilterButton.js +0 -1
  113. package/modern/constants/localeTextConstants.js +1 -0
  114. package/modern/hooks/features/columns/useGridColumnSpanning.js +1 -1
  115. package/modern/hooks/features/dimensions/useGridDimensions.js +9 -8
  116. package/modern/hooks/features/rows/useGridRowsMeta.js +77 -75
  117. package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  118. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  119. package/modern/index.js +1 -1
  120. package/modern/locales/arSD.js +1 -0
  121. package/modern/locales/bgBG.js +1 -0
  122. package/modern/locales/csCZ.js +1 -0
  123. package/modern/locales/daDK.js +1 -0
  124. package/modern/locales/deDE.js +1 -0
  125. package/modern/locales/elGR.js +1 -0
  126. package/modern/locales/esES.js +1 -0
  127. package/modern/locales/faIR.js +1 -0
  128. package/modern/locales/fiFI.js +1 -0
  129. package/modern/locales/frFR.js +1 -0
  130. package/modern/locales/heIL.js +1 -0
  131. package/modern/locales/huHU.js +1 -0
  132. package/modern/locales/itIT.js +1 -0
  133. package/modern/locales/jaJP.js +1 -0
  134. package/modern/locales/koKR.js +1 -0
  135. package/modern/locales/nbNO.js +1 -0
  136. package/modern/locales/nlNL.js +1 -0
  137. package/modern/locales/plPL.js +1 -0
  138. package/modern/locales/ptBR.js +1 -0
  139. package/modern/locales/ruRU.js +1 -0
  140. package/modern/locales/skSK.js +1 -0
  141. package/modern/locales/trTR.js +1 -0
  142. package/modern/locales/ukUA.js +1 -0
  143. package/modern/locales/viVN.js +1 -0
  144. package/modern/locales/zhCN.js +1 -0
  145. package/node/colDef/gridCheckboxSelectionColDef.js +4 -2
  146. package/node/colDef/gridNumericColDef.js +1 -1
  147. package/node/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  148. package/node/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  149. package/node/components/columnSelection/GridHeaderCheckbox.js +0 -1
  150. package/node/components/containers/GridRootStyles.js +1 -1
  151. package/node/components/panel/GridColumnsPanel.js +2 -5
  152. package/node/components/panel/filterPanel/GridFilterPanel.js +1 -2
  153. package/node/components/toolbar/GridToolbarColumnsButton.js +0 -1
  154. package/node/components/toolbar/GridToolbarDensitySelector.js +0 -1
  155. package/node/components/toolbar/GridToolbarExportContainer.js +0 -1
  156. package/node/components/toolbar/GridToolbarFilterButton.js +0 -1
  157. package/node/constants/localeTextConstants.js +1 -0
  158. package/node/hooks/features/columns/useGridColumnSpanning.js +11 -16
  159. package/node/hooks/features/dimensions/useGridDimensions.js +9 -8
  160. package/node/hooks/features/rows/useGridRowsMeta.js +80 -77
  161. package/node/hooks/features/selection/useGridSelectionPreProcessors.js +7 -5
  162. package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -9
  163. package/node/index.js +1 -1
  164. package/node/locales/arSD.js +1 -0
  165. package/node/locales/bgBG.js +1 -0
  166. package/node/locales/csCZ.js +1 -0
  167. package/node/locales/daDK.js +1 -0
  168. package/node/locales/deDE.js +1 -0
  169. package/node/locales/elGR.js +1 -0
  170. package/node/locales/esES.js +1 -0
  171. package/node/locales/faIR.js +1 -0
  172. package/node/locales/fiFI.js +1 -0
  173. package/node/locales/frFR.js +1 -0
  174. package/node/locales/heIL.js +1 -0
  175. package/node/locales/huHU.js +1 -0
  176. package/node/locales/itIT.js +1 -0
  177. package/node/locales/jaJP.js +1 -0
  178. package/node/locales/koKR.js +1 -0
  179. package/node/locales/nbNO.js +1 -0
  180. package/node/locales/nlNL.js +1 -0
  181. package/node/locales/plPL.js +1 -0
  182. package/node/locales/ptBR.js +1 -0
  183. package/node/locales/ruRU.js +1 -0
  184. package/node/locales/skSK.js +1 -0
  185. package/node/locales/trTR.js +1 -0
  186. package/node/locales/ukUA.js +1 -0
  187. package/node/locales/viVN.js +1 -0
  188. package/node/locales/zhCN.js +1 -0
  189. package/package.json +1 -1
@@ -19,7 +19,7 @@ import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
19
19
  import { getFirstNonSpannedColumnToRender } from '../columns/gridColumnsUtils'; // Uses binary search to avoid looping through all possible positions
20
20
 
21
21
  import { jsx as _jsx } from "react/jsx-runtime";
22
- export function getIndexFromScroll(offset, positions, sliceStart = 0, sliceEnd = positions.length) {
22
+ export function binarySearch(offset, positions, sliceStart = 0, sliceEnd = positions.length) {
23
23
  if (positions.length <= 0) {
24
24
  return -1;
25
25
  }
@@ -30,8 +30,20 @@ export function getIndexFromScroll(offset, positions, sliceStart = 0, sliceEnd =
30
30
 
31
31
  const pivot = sliceStart + Math.floor((sliceEnd - sliceStart) / 2);
32
32
  const itemOffset = positions[pivot];
33
- return offset <= itemOffset ? getIndexFromScroll(offset, positions, sliceStart, pivot) : getIndexFromScroll(offset, positions, pivot + 1, sliceEnd);
33
+ return offset <= itemOffset ? binarySearch(offset, positions, sliceStart, pivot) : binarySearch(offset, positions, pivot + 1, sliceEnd);
34
34
  }
35
+
36
+ function exponentialSearch(offset, positions, index) {
37
+ let interval = 1;
38
+
39
+ while (index < positions.length && positions[index] < offset) {
40
+ index += interval;
41
+ interval *= 2;
42
+ }
43
+
44
+ return binarySearch(offset, positions, Math.floor(index / 2), Math.min(index, positions.length));
45
+ }
46
+
35
47
  export const getRenderableIndexes = ({
36
48
  firstIndex,
37
49
  lastIndex,
@@ -73,6 +85,22 @@ export const useGridVirtualScroller = props => {
73
85
  });
74
86
  const [containerWidth, setContainerWidth] = React.useState(null);
75
87
  const prevTotalWidth = React.useRef(columnsTotalWidth);
88
+ const getNearestIndexToRender = React.useCallback(offset => {
89
+ const lastMeasuredIndex = Math.max(0, apiRef.current.unstable_getLastMeasuredRowIndex());
90
+ const allRowsMeasured = lastMeasuredIndex === Infinity;
91
+
92
+ if (allRowsMeasured || rowsMeta.positions[lastMeasuredIndex] >= offset) {
93
+ // If all rows were measured (when no row has "auto" as height) or all rows before the offset
94
+ // were measured, then use a binary search because it's faster.
95
+ return binarySearch(offset, rowsMeta.positions);
96
+ } // Otherwise, use an exponential search.
97
+ // If rows have "auto" as height, their positions will be based on estimated heights.
98
+ // In this case, we can skip several steps until we find a position higher than the offset.
99
+ // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
100
+
101
+
102
+ return exponentialSearch(offset, rowsMeta.positions, lastMeasuredIndex);
103
+ }, [apiRef, rowsMeta.positions]);
76
104
  const computeRenderContext = React.useCallback(() => {
77
105
  if (disableVirtualization) {
78
106
  return {
@@ -86,9 +114,11 @@ export const useGridVirtualScroller = props => {
86
114
  const {
87
115
  top,
88
116
  left
89
- } = scrollPosition.current;
90
- const firstRowIndex = Math.min(Math.max(0, apiRef.current.unstable_getLastMeasuredRowIndex()), getIndexFromScroll(top, rowsMeta.positions));
91
- const lastRowIndex = rootProps.autoHeight ? firstRowIndex + currentPage.rows.length : getIndexFromScroll(top + rootRef.current.clientHeight, rowsMeta.positions);
117
+ } = scrollPosition.current; // Clamp the value because the search may return an index out of bounds.
118
+ // In the last index, this is not needed because Array.slice doesn't include it.
119
+
120
+ const firstRowIndex = Math.min(getNearestIndexToRender(top), rowsMeta.positions.length - 1);
121
+ const lastRowIndex = rootProps.autoHeight ? firstRowIndex + currentPage.rows.length : getNearestIndexToRender(top + rootRef.current.clientHeight);
92
122
  let hasRowWithAutoHeight = false;
93
123
  let firstColumnIndex = 0;
94
124
  let lastColumnIndex = columnPositions.length;
@@ -106,8 +136,8 @@ export const useGridVirtualScroller = props => {
106
136
  }
107
137
 
108
138
  if (!hasRowWithAutoHeight) {
109
- firstColumnIndex = getIndexFromScroll(left, columnPositions);
110
- lastColumnIndex = getIndexFromScroll(left + containerWidth, columnPositions);
139
+ firstColumnIndex = binarySearch(left, columnPositions);
140
+ lastColumnIndex = binarySearch(left + containerWidth, columnPositions);
111
141
  }
112
142
 
113
143
  return {
@@ -116,7 +146,7 @@ export const useGridVirtualScroller = props => {
116
146
  firstColumnIndex,
117
147
  lastColumnIndex
118
148
  };
119
- }, [disableVirtualization, rowsMeta.positions, rootProps.autoHeight, rootProps.rowBuffer, currentPage.rows, columnPositions, visibleColumns.length, apiRef, containerWidth]);
149
+ }, [disableVirtualization, getNearestIndexToRender, rowsMeta.positions.length, rootProps.autoHeight, rootProps.rowBuffer, currentPage.rows, columnPositions, visibleColumns.length, apiRef, containerWidth]);
120
150
  React.useEffect(() => {
121
151
  if (disableVirtualization) {
122
152
  renderZoneRef.current.style.transform = `translate3d(0px, 0px, 0px)`;
@@ -374,6 +404,10 @@ export const useGridVirtualScroller = props => {
374
404
  rootStyle.overflowX = 'hidden';
375
405
  }
376
406
 
407
+ if (rootProps.autoHeight) {
408
+ rootStyle.overflowY = 'hidden';
409
+ }
410
+
377
411
  const getRenderContext = React.useCallback(() => {
378
412
  return prevRenderContext.current;
379
413
  }, []);
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license MUI v5.12.1
1
+ /** @license MUI v5.12.2
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -5,8 +5,9 @@ import { GridHeaderCheckbox } from '../components/columnSelection/GridHeaderChec
5
5
  import { selectedIdsLookupSelector } from '../hooks/features/selection/gridSelectionSelector';
6
6
  import { GRID_BOOLEAN_COL_DEF } from './gridBooleanColDef';
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
8
+ export var GRID_CHECKBOX_SELECTION_FIELD = '__check__';
8
9
  export var GRID_CHECKBOX_SELECTION_COL_DEF = _extends({}, GRID_BOOLEAN_COL_DEF, {
9
- field: '__check__',
10
+ field: GRID_CHECKBOX_SELECTION_FIELD,
10
11
  type: 'checkboxSelection',
11
12
  width: 50,
12
13
  resizable: false,
@@ -13,7 +13,7 @@ export var GRID_NUMERIC_COL_DEF = _extends({}, GRID_STRING_COL_DEF, {
13
13
  },
14
14
  valueFormatter: function valueFormatter(_ref) {
15
15
  var value = _ref.value;
16
- return value && isNumber(value) && value.toLocaleString() || value;
16
+ return isNumber(value) ? value.toLocaleString() : value || '';
17
17
  },
18
18
  filterOperators: getGridNumericOperators(),
19
19
  getApplyQuickFilterFn: getGridNumericQuickFilterFn
@@ -173,6 +173,7 @@ function GridColumnHeaderItem(props) {
173
173
  field: column.field,
174
174
  colDef: column
175
175
  }) : column.headerClassName;
176
+ var label = (_column$headerName = column.headerName) != null ? _column$headerName : column.field;
176
177
  return /*#__PURE__*/_jsxs("div", _extends({
177
178
  ref: headerCellRef,
178
179
  className: clsx(classes.root, headerClassName),
@@ -185,7 +186,8 @@ function GridColumnHeaderItem(props) {
185
186
  role: "columnheader",
186
187
  tabIndex: tabIndex,
187
188
  "aria-colindex": colIndex + 1,
188
- "aria-sort": ariaSort
189
+ "aria-sort": ariaSort,
190
+ "aria-label": column.renderHeader && headerComponent == null ? label : undefined
189
191
  }, mouseEventsHandlers, {
190
192
  children: [/*#__PURE__*/_jsxs("div", _extends({
191
193
  className: classes.draggableContainer,
@@ -195,8 +197,8 @@ function GridColumnHeaderItem(props) {
195
197
  className: classes.titleContainer,
196
198
  children: [/*#__PURE__*/_jsx("div", {
197
199
  className: classes.titleContainerContent,
198
- children: headerComponent || /*#__PURE__*/_jsx(GridColumnHeaderTitle, {
199
- label: (_column$headerName = column.headerName) != null ? _column$headerName : column.field,
200
+ children: column.renderHeader ? headerComponent : /*#__PURE__*/_jsx(GridColumnHeaderTitle, {
201
+ label: label,
200
202
  description: column.description,
201
203
  columnWidth: width
202
204
  })
@@ -89,7 +89,6 @@ var GridCellCheckboxForwardRef = /*#__PURE__*/React.forwardRef(function GridCell
89
89
  checked: isChecked,
90
90
  onChange: handleChange,
91
91
  className: classes.root,
92
- color: "primary",
93
92
  inputProps: {
94
93
  'aria-label': label
95
94
  },
@@ -121,7 +121,6 @@ var GridHeaderCheckbox = /*#__PURE__*/React.forwardRef(function GridHeaderCheckb
121
121
  checked: isChecked,
122
122
  onChange: handleChange,
123
123
  className: classes.root,
124
- color: "primary",
125
124
  inputProps: {
126
125
  'aria-label': label
127
126
  },
@@ -68,7 +68,7 @@ export var GridRootStyles = styled('div', {
68
68
  minWidth: 0,
69
69
  flex: 1,
70
70
  whiteSpace: 'nowrap',
71
- overflow: 'hidden'
71
+ overflowX: 'hidden'
72
72
  }), _defineProperty(_extends2, "& .".concat(gridClasses.columnHeaderTitleContainerContent), {
73
73
  overflow: 'hidden',
74
74
  display: 'flex',
@@ -149,7 +149,6 @@ export function GridColumnsPanel(props) {
149
149
  checked: columnVisibilityModel[column.field] !== false,
150
150
  onClick: toggleColumn,
151
151
  name: column.field,
152
- color: "primary",
153
152
  size: "small"
154
153
  }, (_rootProps$components2 = rootProps.componentsProps) == null ? void 0 : _rootProps$components2.baseSwitch)),
155
154
  label: column.headerName || column.field
@@ -168,15 +167,13 @@ export function GridColumnsPanel(props) {
168
167
  children: [/*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
169
168
  onClick: function onClick() {
170
169
  return toggleAllColumns(false);
171
- },
172
- color: "primary"
170
+ }
173
171
  }, (_rootProps$components3 = rootProps.componentsProps) == null ? void 0 : _rootProps$components3.baseButton, {
174
172
  children: apiRef.current.getLocaleText('columnsPanelHideAllButton')
175
173
  })), /*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
176
174
  onClick: function onClick() {
177
175
  return toggleAllColumns(true);
178
- },
179
- color: "primary"
176
+ }
180
177
  }, (_rootProps$components4 = rootProps.componentsProps) == null ? void 0 : _rootProps$components4.baseButton, {
181
178
  children: apiRef.current.getLocaleText('columnsPanelShowAllButton')
182
179
  }))]
@@ -116,8 +116,7 @@ var GridFilterPanel = /*#__PURE__*/React.forwardRef(function GridFilterPanel(pro
116
116
  }), !rootProps.disableMultipleColumnsFiltering && /*#__PURE__*/_jsx(GridPanelFooter, {
117
117
  children: /*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
118
118
  onClick: addNewFilter,
119
- startIcon: /*#__PURE__*/_jsx(GridAddIcon, {}),
120
- color: "primary"
119
+ startIcon: /*#__PURE__*/_jsx(GridAddIcon, {})
121
120
  }, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseButton, {
122
121
  children: apiRef.current.getLocaleText('filterPanelAddFilter')
123
122
  }))
@@ -39,7 +39,6 @@ export var GridToolbarColumnsButton = /*#__PURE__*/React.forwardRef(function Gri
39
39
  return /*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
40
40
  ref: ref,
41
41
  size: "small",
42
- color: "primary",
43
42
  "aria-label": apiRef.current.getLocaleText('toolbarColumnsLabel'),
44
43
  startIcon: /*#__PURE__*/_jsx(rootProps.components.ColumnSelectorIcon, {})
45
44
  }, other, {
@@ -105,7 +105,6 @@ export var GridToolbarDensitySelector = /*#__PURE__*/React.forwardRef(function G
105
105
  return /*#__PURE__*/_jsxs(React.Fragment, {
106
106
  children: [/*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
107
107
  ref: handleRef,
108
- color: "primary",
109
108
  size: "small",
110
109
  startIcon: startIcon,
111
110
  "aria-label": apiRef.current.getLocaleText('toolbarDensityLabel'),
@@ -58,7 +58,6 @@ export var GridToolbarExportContainer = /*#__PURE__*/React.forwardRef(function G
58
58
  return /*#__PURE__*/_jsxs(React.Fragment, {
59
59
  children: [/*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
60
60
  ref: handleRef,
61
- color: "primary",
62
61
  size: "small",
63
62
  startIcon: /*#__PURE__*/_jsx(rootProps.components.ExportIcon, {}),
64
63
  "aria-expanded": open ? 'true' : undefined,
@@ -110,7 +110,6 @@ var GridToolbarFilterButton = /*#__PURE__*/React.forwardRef(function GridToolbar
110
110
  children: /*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
111
111
  ref: ref,
112
112
  size: "small",
113
- color: "primary",
114
113
  "aria-label": apiRef.current.getLocaleText('toolbarFiltersLabel'),
115
114
  startIcon: /*#__PURE__*/_jsx(Badge, {
116
115
  badgeContent: activeFilters.length,
@@ -117,6 +117,7 @@ export var GRID_DEFAULT_LOCALE_TEXT = {
117
117
  return "Stop grouping by ".concat(name);
118
118
  },
119
119
  // Master/detail
120
+ detailPanelToggle: 'Detail panel toggle',
120
121
  expandDetailPanel: 'Expand',
121
122
  collapseDetailPanel: 'Collapse',
122
123
  // Used core components translation keys
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import * as React from 'react';
2
2
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
3
3
  import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
4
4
 
@@ -36,7 +36,7 @@ var hasScroll = function hasScroll(_ref) {
36
36
 
37
37
  export function useGridDimensions(apiRef, props) {
38
38
  var logger = useGridLogger(apiRef, 'useResizeContainer');
39
- var warningShown = React.useRef(false);
39
+ var errorShown = React.useRef(false);
40
40
  var rootDimensionsRef = React.useRef(null);
41
41
  var fullDimensionsRef = React.useRef(null);
42
42
  var rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
@@ -94,7 +94,8 @@ export function useGridDimensions(apiRef, props) {
94
94
  viewportOuterSize: viewportOuterSize,
95
95
  viewportInnerSize: viewportInnerSize,
96
96
  hasScrollX: hasScrollX,
97
- hasScrollY: hasScrollY
97
+ hasScrollY: hasScrollY,
98
+ scrollBarSize: scrollBarSize
98
99
  };
99
100
  var prevDimensions = fullDimensionsRef.current;
100
101
  fullDimensionsRef.current = newFullDimensions;
@@ -148,14 +149,14 @@ export function useGridDimensions(apiRef, props) {
148
149
 
149
150
  var isJSDOM = /jsdom/.test(window.navigator.userAgent);
150
151
 
151
- if (size.height === 0 && !warningShown.current && !props.autoHeight && !isJSDOM) {
152
- logger.warn(['The parent of the grid has an empty height.', 'You need to make sure the container has an intrinsic height.', 'The grid displays with a height of 0px.', '', 'You can find a solution in the docs:', 'https://mui.com/x/react-data-grid/layout/'].join('\n'));
153
- warningShown.current = true;
152
+ if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
153
+ logger.error(['The parent DOM element of the data grid has an empty height.', 'Please make sure that this element has an intrinsic height.', 'The grid displays with a height of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
154
+ errorShown.current = true;
154
155
  }
155
156
 
156
- if (size.width === 0 && !warningShown.current && !isJSDOM) {
157
- logger.warn(['The parent of the grid has an empty width.', 'You need to make sure the container has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'You can find a solution in the docs:', 'https://mui.com/x/react-data-grid/layout/'].join('\n'));
158
- warningShown.current = true;
157
+ if (size.width === 0 && !errorShown.current && !isJSDOM) {
158
+ logger.error(['The parent DOM element of the data grid has an empty width.', 'Please make sure that this element has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
159
+ errorShown.current = true;
159
160
  }
160
161
 
161
162
  if (isTestEnvironment) {
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
+ import { debounce } from '@mui/material/utils';
3
4
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
4
5
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
5
6
  import { useGridSelector } from '../../utils/useGridSelector';
@@ -36,87 +37,87 @@ export var useGridRowsMeta = function useGridRowsMeta(apiRef, props) {
36
37
  var currentPage = useGridVisibleRows(apiRef, props);
37
38
  var hydrateRowsMeta = React.useCallback(function () {
38
39
  hasRowWithAutoHeight.current = false;
39
- apiRef.current.setState(function (state) {
40
- var densityFactor = gridDensityFactorSelector(state, apiRef.current.instanceId);
41
- var positions = [];
42
- var currentPageTotalHeight = currentPage.rows.reduce(function (acc, row) {
43
- positions.push(acc);
44
-
45
- if (!rowsHeightLookup.current[row.id]) {
46
- rowsHeightLookup.current[row.id] = {
47
- sizes: {
48
- base: rowHeightFromDensity
49
- },
50
- isResized: false,
51
- autoHeight: false,
52
- needsFirstMeasurement: true // Assume all rows will need to be measured by default
53
-
54
- };
55
- }
40
+ var densityFactor = gridDensityFactorSelector(apiRef.current.state, apiRef.current.instanceId);
41
+ var positions = [];
42
+ var currentPageTotalHeight = currentPage.rows.reduce(function (acc, row) {
43
+ positions.push(acc);
44
+
45
+ if (!rowsHeightLookup.current[row.id]) {
46
+ rowsHeightLookup.current[row.id] = {
47
+ sizes: {
48
+ base: rowHeightFromDensity
49
+ },
50
+ isResized: false,
51
+ autoHeight: false,
52
+ needsFirstMeasurement: true // Assume all rows will need to be measured by default
56
53
 
57
- var _rowsHeightLookup$cur = rowsHeightLookup.current[row.id],
58
- isResized = _rowsHeightLookup$cur.isResized,
59
- needsFirstMeasurement = _rowsHeightLookup$cur.needsFirstMeasurement,
60
- sizes = _rowsHeightLookup$cur.sizes;
61
- var baseRowHeight = rowHeightFromDensity;
62
- var existingBaseRowHeight = sizes.base;
63
-
64
- if (isResized) {
65
- // Do not recalculate resized row height and use the value from the lookup
66
- baseRowHeight = existingBaseRowHeight;
67
- } else if (getRowHeightProp) {
68
- var rowHeightFromUser = getRowHeightProp(_extends({}, row, {
69
- densityFactor: densityFactor
70
- }));
71
-
72
- if (rowHeightFromUser === 'auto') {
73
- if (needsFirstMeasurement) {
74
- var estimatedRowHeight = getEstimatedRowHeight ? getEstimatedRowHeight(_extends({}, row, {
75
- densityFactor: densityFactor
76
- })) : rowHeightFromDensity; // If the row was not measured yet use the estimated row height
77
-
78
- baseRowHeight = estimatedRowHeight != null ? estimatedRowHeight : rowHeightFromDensity;
79
- } else {
80
- baseRowHeight = existingBaseRowHeight;
81
- }
82
-
83
- hasRowWithAutoHeight.current = true;
84
- rowsHeightLookup.current[row.id].autoHeight = true;
54
+ };
55
+ }
56
+
57
+ var _rowsHeightLookup$cur = rowsHeightLookup.current[row.id],
58
+ isResized = _rowsHeightLookup$cur.isResized,
59
+ needsFirstMeasurement = _rowsHeightLookup$cur.needsFirstMeasurement,
60
+ sizes = _rowsHeightLookup$cur.sizes;
61
+ var baseRowHeight = rowHeightFromDensity;
62
+ var existingBaseRowHeight = sizes.base;
63
+
64
+ if (isResized) {
65
+ // Do not recalculate resized row height and use the value from the lookup
66
+ baseRowHeight = existingBaseRowHeight;
67
+ } else if (getRowHeightProp) {
68
+ var rowHeightFromUser = getRowHeightProp(_extends({}, row, {
69
+ densityFactor: densityFactor
70
+ }));
71
+
72
+ if (rowHeightFromUser === 'auto') {
73
+ if (needsFirstMeasurement) {
74
+ var estimatedRowHeight = getEstimatedRowHeight ? getEstimatedRowHeight(_extends({}, row, {
75
+ densityFactor: densityFactor
76
+ })) : rowHeightFromDensity; // If the row was not measured yet use the estimated row height
77
+
78
+ baseRowHeight = estimatedRowHeight != null ? estimatedRowHeight : rowHeightFromDensity;
85
79
  } else {
86
- // Default back to base rowHeight if getRowHeight returns null or undefined.
87
- baseRowHeight = rowHeightFromUser != null ? rowHeightFromUser : rowHeightFromDensity;
88
- rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
89
- rowsHeightLookup.current[row.id].autoHeight = false;
80
+ baseRowHeight = existingBaseRowHeight;
90
81
  }
82
+
83
+ hasRowWithAutoHeight.current = true;
84
+ rowsHeightLookup.current[row.id].autoHeight = true;
91
85
  } else {
86
+ // Default back to base rowHeight if getRowHeight returns null or undefined.
87
+ baseRowHeight = rowHeightFromUser != null ? rowHeightFromUser : rowHeightFromDensity;
92
88
  rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
93
- } // We use an object to make simple to check if a height is already added or not
94
-
95
-
96
- var initialHeights = {
97
- base: baseRowHeight
98
- };
99
-
100
- if (getRowSpacing) {
101
- var _spacing$top, _spacing$bottom;
102
-
103
- var indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
104
- var spacing = getRowSpacing(_extends({}, row, {
105
- isFirstVisible: indexRelativeToCurrentPage === 0,
106
- isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
107
- indexRelativeToCurrentPage: indexRelativeToCurrentPage
108
- }));
109
- initialHeights.spacingTop = (_spacing$top = spacing.top) != null ? _spacing$top : 0;
110
- initialHeights.spacingBottom = (_spacing$bottom = spacing.bottom) != null ? _spacing$bottom : 0;
89
+ rowsHeightLookup.current[row.id].autoHeight = false;
111
90
  }
112
-
113
- var processedSizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
114
- rowsHeightLookup.current[row.id].sizes = processedSizes;
115
- var finalRowHeight = Object.values(processedSizes).reduce(function (acc2, value) {
116
- return acc2 + value;
117
- }, 0);
118
- return acc + finalRowHeight;
91
+ } else {
92
+ rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
93
+ } // We use an object to make simple to check if a height is already added or not
94
+
95
+
96
+ var initialHeights = {
97
+ base: baseRowHeight
98
+ };
99
+
100
+ if (getRowSpacing) {
101
+ var _spacing$top, _spacing$bottom;
102
+
103
+ var indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
104
+ var spacing = getRowSpacing(_extends({}, row, {
105
+ isFirstVisible: indexRelativeToCurrentPage === 0,
106
+ isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
107
+ indexRelativeToCurrentPage: indexRelativeToCurrentPage
108
+ }));
109
+ initialHeights.spacingTop = (_spacing$top = spacing.top) != null ? _spacing$top : 0;
110
+ initialHeights.spacingBottom = (_spacing$bottom = spacing.bottom) != null ? _spacing$bottom : 0;
111
+ }
112
+
113
+ var processedSizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
114
+ rowsHeightLookup.current[row.id].sizes = processedSizes;
115
+ var finalRowHeight = Object.values(processedSizes).reduce(function (acc2, value) {
116
+ return acc2 + value;
119
117
  }, 0);
118
+ return acc + finalRowHeight;
119
+ }, 0);
120
+ apiRef.current.setState(function (state) {
120
121
  return _extends({}, state, {
121
122
  rowsMeta: {
122
123
  currentPageTotalHeight: currentPageTotalHeight,
@@ -149,6 +150,9 @@ export var useGridRowsMeta = function useGridRowsMeta(apiRef, props) {
149
150
  rowsHeightLookup.current[id].needsFirstMeasurement = false;
150
151
  hydrateRowsMeta();
151
152
  }, [hydrateRowsMeta]);
153
+ var debouncedHydrateRowsMeta = React.useMemo(function () {
154
+ return debounce(hydrateRowsMeta);
155
+ }, [hydrateRowsMeta]);
152
156
  var storeMeasuredRowHeight = React.useCallback(function (id, height) {
153
157
  if (!rowsHeightLookup.current[id] || !rowsHeightLookup.current[id].autoHeight) {
154
158
  return;
@@ -160,9 +164,9 @@ export var useGridRowsMeta = function useGridRowsMeta(apiRef, props) {
160
164
  rowsHeightLookup.current[id].sizes.base = height;
161
165
 
162
166
  if (needsHydration) {
163
- hydrateRowsMeta();
167
+ debouncedHydrateRowsMeta();
164
168
  }
165
- }, [hydrateRowsMeta]);
169
+ }, [debouncedHydrateRowsMeta]);
166
170
  var rowHasAutoHeight = React.useCallback(function (id) {
167
171
  var _rowsHeightLookup$cur3;
168
172
 
@@ -172,7 +176,7 @@ export var useGridRowsMeta = function useGridRowsMeta(apiRef, props) {
172
176
  return lastMeasuredRowIndex.current;
173
177
  }, []);
174
178
  var setLastMeasuredRowIndex = React.useCallback(function (index) {
175
- if (hasRowWithAutoHeight.current) {
179
+ if (hasRowWithAutoHeight.current && index > lastMeasuredRowIndex.current) {
176
180
  lastMeasuredRowIndex.current = index;
177
181
  }
178
182
  }, []); // The effect is used to build the rows meta data - currentPageTotalHeight and positions.
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { unstable_composeClasses as composeClasses } from '@mui/material';
5
5
  import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
6
6
  import { getDataGridUtilityClass } from '../../../constants';
7
- import { GRID_CHECKBOX_SELECTION_COL_DEF } from '../../../colDef';
7
+ import { GRID_CHECKBOX_SELECTION_COL_DEF, GRID_CHECKBOX_SELECTION_FIELD } from '../../../colDef';
8
8
 
9
9
  var useUtilityClasses = function useUtilityClasses(ownerState) {
10
10
  var classes = ownerState.classes;
@@ -30,16 +30,18 @@ export var useGridSelectionPreProcessors = function useGridSelectionPreProcessor
30
30
  });
31
31
 
32
32
  var shouldHaveSelectionColumn = props.checkboxSelection;
33
- var haveSelectionColumn = columnsState.lookup[selectionColumn.field] != null;
33
+ var haveSelectionColumn = columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] != null;
34
34
 
35
35
  if (shouldHaveSelectionColumn && !haveSelectionColumn) {
36
- columnsState.lookup[selectionColumn.field] = selectionColumn;
37
- columnsState.all = [selectionColumn.field].concat(_toConsumableArray(columnsState.all));
36
+ columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = selectionColumn;
37
+ columnsState.all = [GRID_CHECKBOX_SELECTION_FIELD].concat(_toConsumableArray(columnsState.all));
38
38
  } else if (!shouldHaveSelectionColumn && haveSelectionColumn) {
39
- delete columnsState.lookup[selectionColumn.field];
39
+ delete columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD];
40
40
  columnsState.all = columnsState.all.filter(function (field) {
41
- return field !== selectionColumn.field;
41
+ return field !== GRID_CHECKBOX_SELECTION_FIELD;
42
42
  });
43
+ } else if (shouldHaveSelectionColumn && haveSelectionColumn) {
44
+ columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = _extends({}, selectionColumn, columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD]);
43
45
  }
44
46
 
45
47
  return columnsState;