@mui/x-data-grid 5.11.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 (331) hide show
  1. package/CHANGELOG.md +199 -20
  2. package/DataGrid/DataGrid.js +26 -1
  3. package/README.md +2 -2
  4. package/colDef/gridCheckboxSelectionColDef.d.ts +1 -0
  5. package/colDef/gridCheckboxSelectionColDef.js +2 -1
  6. package/colDef/gridDateOperators.d.ts +1 -1
  7. package/colDef/gridNumericColDef.js +1 -1
  8. package/components/GridRow.d.ts +1 -1
  9. package/components/GridRow.js +51 -12
  10. package/components/cell/GridActionsCellItem.d.ts +1 -1
  11. package/components/cell/GridCell.d.ts +2 -1
  12. package/components/cell/GridCell.js +12 -7
  13. package/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  14. package/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  15. package/components/columnSelection/GridHeaderCheckbox.js +0 -1
  16. package/components/containers/GridRootStyles.js +8 -3
  17. package/components/menu/GridMenu.js +9 -2
  18. package/components/panel/GridColumnsPanel.js +12 -7
  19. package/components/panel/GridPanelWrapper.d.ts +1 -1
  20. package/components/panel/GridPanelWrapper.js +3 -3
  21. package/components/panel/filterPanel/GridFilterForm.d.ts +61 -4
  22. package/components/panel/filterPanel/GridFilterForm.js +88 -8
  23. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  24. package/components/panel/filterPanel/GridFilterPanel.d.ts +8 -5
  25. package/components/panel/filterPanel/GridFilterPanel.js +26 -11
  26. package/components/toolbar/GridToolbarColumnsButton.js +0 -1
  27. package/components/toolbar/GridToolbarDensitySelector.js +0 -1
  28. package/components/toolbar/GridToolbarExportContainer.js +0 -1
  29. package/components/toolbar/GridToolbarFilterButton.d.ts +1 -1
  30. package/components/toolbar/GridToolbarFilterButton.js +0 -1
  31. package/components/toolbar/GridToolbarQuickFilter.d.ts +7 -0
  32. package/components/toolbar/GridToolbarQuickFilter.js +57 -4
  33. package/constants/defaultGridSlotsComponents.js +2 -1
  34. package/constants/gridClasses.d.ts +4 -0
  35. package/constants/gridClasses.js +1 -1
  36. package/constants/localeTextConstants.js +1 -0
  37. package/hooks/core/useGridStateInitialization.js +19 -6
  38. package/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  39. package/hooks/features/columns/gridColumnsInterfaces.d.ts +3 -0
  40. package/hooks/features/columns/useGridColumnSpanning.d.ts +1 -1
  41. package/hooks/features/columns/useGridColumnSpanning.js +1 -1
  42. package/hooks/features/columns/useGridColumns.d.ts +1 -1
  43. package/hooks/features/columns/useGridColumns.js +13 -15
  44. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
  45. package/hooks/features/dimensions/useGridDimensions.js +9 -8
  46. package/hooks/features/editRows/useGridCellEditing.new.js +11 -4
  47. package/hooks/features/editRows/useGridEditing.old.js +1 -1
  48. package/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  49. package/hooks/features/events/useGridEvents.d.ts +1 -1
  50. package/hooks/features/events/useGridEvents.js +2 -0
  51. package/hooks/features/filter/gridFilterSelector.d.ts +5 -0
  52. package/hooks/features/filter/gridFilterSelector.js +6 -0
  53. package/hooks/features/filter/gridFilterState.d.ts +1 -1
  54. package/hooks/features/filter/gridFilterUtils.d.ts +10 -2
  55. package/hooks/features/filter/gridFilterUtils.js +3 -6
  56. package/hooks/features/filter/useGridFilter.d.ts +1 -1
  57. package/hooks/features/filter/useGridFilter.js +29 -12
  58. package/hooks/features/pagination/useGridPage.js +1 -1
  59. package/hooks/features/pagination/useGridPageSize.js +1 -1
  60. package/hooks/features/rows/useGridRowsMeta.d.ts +1 -1
  61. package/hooks/features/rows/useGridRowsMeta.js +133 -67
  62. package/hooks/features/selection/useGridSelection.js +1 -1
  63. package/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  64. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  65. package/hooks/features/sorting/useGridSorting.js +1 -1
  66. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +2 -1
  67. package/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
  68. package/index.js +1 -1
  69. package/internals/index.d.ts +1 -0
  70. package/legacy/DataGrid/DataGrid.js +26 -1
  71. package/legacy/colDef/gridCheckboxSelectionColDef.js +2 -1
  72. package/legacy/colDef/gridNumericColDef.js +1 -1
  73. package/legacy/components/GridRow.js +56 -12
  74. package/legacy/components/cell/GridCell.js +12 -7
  75. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +11 -6
  76. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  77. package/legacy/components/columnSelection/GridHeaderCheckbox.js +0 -1
  78. package/legacy/components/containers/GridRootStyles.js +10 -7
  79. package/legacy/components/menu/GridMenu.js +9 -2
  80. package/legacy/components/panel/GridColumnsPanel.js +14 -7
  81. package/legacy/components/panel/GridPanelWrapper.js +3 -3
  82. package/legacy/components/panel/filterPanel/GridFilterForm.js +89 -8
  83. package/legacy/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  84. package/legacy/components/panel/filterPanel/GridFilterPanel.js +28 -12
  85. package/legacy/components/toolbar/GridToolbarColumnsButton.js +0 -1
  86. package/legacy/components/toolbar/GridToolbarDensitySelector.js +0 -1
  87. package/legacy/components/toolbar/GridToolbarExportContainer.js +0 -1
  88. package/legacy/components/toolbar/GridToolbarFilterButton.js +0 -1
  89. package/legacy/components/toolbar/GridToolbarQuickFilter.js +67 -6
  90. package/legacy/constants/defaultGridSlotsComponents.js +2 -1
  91. package/legacy/constants/gridClasses.js +1 -1
  92. package/legacy/constants/localeTextConstants.js +1 -0
  93. package/legacy/hooks/core/useGridStateInitialization.js +18 -6
  94. package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  95. package/legacy/hooks/features/columns/useGridColumnSpanning.js +1 -1
  96. package/legacy/hooks/features/columns/useGridColumns.js +13 -15
  97. package/legacy/hooks/features/dimensions/useGridDimensions.js +9 -8
  98. package/legacy/hooks/features/editRows/useGridCellEditing.new.js +14 -7
  99. package/legacy/hooks/features/editRows/useGridEditing.old.js +1 -1
  100. package/legacy/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  101. package/legacy/hooks/features/events/useGridEvents.js +2 -0
  102. package/legacy/hooks/features/filter/gridFilterSelector.js +8 -0
  103. package/legacy/hooks/features/filter/gridFilterUtils.js +4 -7
  104. package/legacy/hooks/features/filter/useGridFilter.js +33 -12
  105. package/legacy/hooks/features/pagination/useGridPage.js +1 -1
  106. package/legacy/hooks/features/pagination/useGridPageSize.js +1 -1
  107. package/legacy/hooks/features/rows/useGridRowsMeta.js +133 -66
  108. package/legacy/hooks/features/selection/useGridSelection.js +1 -1
  109. package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  110. package/legacy/hooks/features/sorting/useGridSorting.js +1 -1
  111. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +84 -26
  112. package/legacy/index.js +1 -1
  113. package/legacy/locales/arSD.js +1 -0
  114. package/legacy/locales/bgBG.js +1 -0
  115. package/legacy/locales/csCZ.js +1 -0
  116. package/legacy/locales/daDK.js +1 -0
  117. package/legacy/locales/deDE.js +1 -0
  118. package/legacy/locales/elGR.js +1 -0
  119. package/legacy/locales/esES.js +1 -0
  120. package/legacy/locales/faIR.js +1 -0
  121. package/legacy/locales/fiFI.js +1 -0
  122. package/legacy/locales/frFR.js +1 -0
  123. package/legacy/locales/heIL.js +10 -9
  124. package/legacy/locales/huHU.js +1 -0
  125. package/legacy/locales/itIT.js +1 -0
  126. package/legacy/locales/jaJP.js +29 -24
  127. package/legacy/locales/koKR.js +1 -0
  128. package/legacy/locales/nbNO.js +128 -0
  129. package/legacy/locales/nlNL.js +1 -0
  130. package/legacy/locales/plPL.js +1 -0
  131. package/legacy/locales/ptBR.js +1 -0
  132. package/legacy/locales/ruRU.js +7 -6
  133. package/legacy/locales/skSK.js +1 -0
  134. package/legacy/locales/trTR.js +8 -7
  135. package/legacy/locales/ukUA.js +1 -0
  136. package/legacy/locales/viVN.js +1 -0
  137. package/legacy/locales/zhCN.js +1 -0
  138. package/legacy/models/events/gridEvents.js +2 -0
  139. package/legacy/models/gridApiCaches.js +1 -0
  140. package/legacy/models/params/gridMenuParams.js +1 -0
  141. package/legacy/models/params/index.js +2 -1
  142. package/locales/arSD.js +1 -0
  143. package/locales/bgBG.js +1 -0
  144. package/locales/csCZ.js +1 -0
  145. package/locales/daDK.js +1 -0
  146. package/locales/deDE.js +1 -0
  147. package/locales/elGR.js +1 -0
  148. package/locales/esES.js +1 -0
  149. package/locales/faIR.js +1 -0
  150. package/locales/fiFI.js +1 -0
  151. package/locales/frFR.js +1 -0
  152. package/locales/heIL.js +10 -9
  153. package/locales/huHU.js +1 -0
  154. package/locales/itIT.js +1 -0
  155. package/locales/jaJP.js +25 -24
  156. package/locales/koKR.js +1 -0
  157. package/locales/nbNO.d.ts +2 -0
  158. package/locales/nbNO.js +116 -0
  159. package/locales/nlNL.js +1 -0
  160. package/locales/plPL.js +1 -0
  161. package/locales/ptBR.js +1 -0
  162. package/locales/ruRU.js +7 -6
  163. package/locales/skSK.js +1 -0
  164. package/locales/trTR.js +8 -7
  165. package/locales/ukUA.js +1 -0
  166. package/locales/viVN.js +1 -0
  167. package/locales/zhCN.js +1 -0
  168. package/models/api/gridCallbackDetails.d.ts +6 -1
  169. package/models/api/gridCoreApi.d.ts +2 -6
  170. package/models/api/gridFilterApi.d.ts +8 -1
  171. package/models/api/gridLocaleTextApi.d.ts +1 -0
  172. package/models/api/gridRowsMetaApi.d.ts +24 -0
  173. package/models/api/gridStateApi.d.ts +14 -3
  174. package/models/colDef/gridColDef.d.ts +4 -4
  175. package/models/events/gridEventLookup.d.ts +16 -1
  176. package/models/events/gridEvents.d.ts +3 -1
  177. package/models/events/gridEvents.js +2 -0
  178. package/models/gridApiCaches.d.ts +6 -0
  179. package/models/gridApiCaches.js +1 -0
  180. package/models/gridIconSlotsComponent.d.ts +5 -0
  181. package/models/params/gridMenuParams.d.ts +7 -0
  182. package/models/params/gridMenuParams.js +1 -0
  183. package/models/params/gridRowParams.d.ts +1 -1
  184. package/models/params/index.d.ts +1 -0
  185. package/models/params/index.js +2 -1
  186. package/models/props/DataGridProps.d.ts +24 -2
  187. package/modern/DataGrid/DataGrid.js +26 -1
  188. package/modern/colDef/gridCheckboxSelectionColDef.js +2 -1
  189. package/modern/colDef/gridNumericColDef.js +1 -1
  190. package/modern/components/GridRow.js +51 -12
  191. package/modern/components/cell/GridCell.js +12 -7
  192. package/modern/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  193. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  194. package/modern/components/columnSelection/GridHeaderCheckbox.js +0 -1
  195. package/modern/components/containers/GridRootStyles.js +8 -3
  196. package/modern/components/menu/GridMenu.js +9 -2
  197. package/modern/components/panel/GridColumnsPanel.js +12 -7
  198. package/modern/components/panel/GridPanelWrapper.js +3 -3
  199. package/modern/components/panel/filterPanel/GridFilterForm.js +88 -8
  200. package/modern/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  201. package/modern/components/panel/filterPanel/GridFilterPanel.js +26 -11
  202. package/modern/components/toolbar/GridToolbarColumnsButton.js +0 -1
  203. package/modern/components/toolbar/GridToolbarDensitySelector.js +0 -1
  204. package/modern/components/toolbar/GridToolbarExportContainer.js +0 -1
  205. package/modern/components/toolbar/GridToolbarFilterButton.js +0 -1
  206. package/modern/components/toolbar/GridToolbarQuickFilter.js +57 -4
  207. package/modern/constants/defaultGridSlotsComponents.js +2 -1
  208. package/modern/constants/gridClasses.js +1 -1
  209. package/modern/constants/localeTextConstants.js +1 -0
  210. package/modern/hooks/core/useGridStateInitialization.js +19 -6
  211. package/modern/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  212. package/modern/hooks/features/columns/useGridColumnSpanning.js +1 -1
  213. package/modern/hooks/features/columns/useGridColumns.js +12 -14
  214. package/modern/hooks/features/dimensions/useGridDimensions.js +9 -8
  215. package/modern/hooks/features/editRows/useGridCellEditing.new.js +10 -3
  216. package/modern/hooks/features/editRows/useGridEditing.old.js +1 -1
  217. package/modern/hooks/features/editRows/useGridRowEditing.new.js +9 -3
  218. package/modern/hooks/features/events/useGridEvents.js +2 -0
  219. package/modern/hooks/features/filter/gridFilterSelector.js +6 -0
  220. package/modern/hooks/features/filter/gridFilterUtils.js +3 -6
  221. package/modern/hooks/features/filter/useGridFilter.js +29 -12
  222. package/modern/hooks/features/pagination/useGridPage.js +1 -1
  223. package/modern/hooks/features/pagination/useGridPageSize.js +1 -1
  224. package/modern/hooks/features/rows/useGridRowsMeta.js +129 -59
  225. package/modern/hooks/features/selection/useGridSelection.js +1 -1
  226. package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  227. package/modern/hooks/features/sorting/useGridSorting.js +1 -1
  228. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
  229. package/modern/index.js +1 -1
  230. package/modern/locales/arSD.js +1 -0
  231. package/modern/locales/bgBG.js +1 -0
  232. package/modern/locales/csCZ.js +1 -0
  233. package/modern/locales/daDK.js +1 -0
  234. package/modern/locales/deDE.js +1 -0
  235. package/modern/locales/elGR.js +1 -0
  236. package/modern/locales/esES.js +1 -0
  237. package/modern/locales/faIR.js +1 -0
  238. package/modern/locales/fiFI.js +1 -0
  239. package/modern/locales/frFR.js +1 -0
  240. package/modern/locales/heIL.js +10 -9
  241. package/modern/locales/huHU.js +1 -0
  242. package/modern/locales/itIT.js +1 -0
  243. package/modern/locales/jaJP.js +25 -24
  244. package/modern/locales/koKR.js +1 -0
  245. package/modern/locales/nbNO.js +116 -0
  246. package/modern/locales/nlNL.js +1 -0
  247. package/modern/locales/plPL.js +1 -0
  248. package/modern/locales/ptBR.js +1 -0
  249. package/modern/locales/ruRU.js +7 -6
  250. package/modern/locales/skSK.js +1 -0
  251. package/modern/locales/trTR.js +8 -7
  252. package/modern/locales/ukUA.js +1 -0
  253. package/modern/locales/viVN.js +1 -0
  254. package/modern/locales/zhCN.js +1 -0
  255. package/modern/models/events/gridEvents.js +2 -0
  256. package/modern/models/gridApiCaches.js +1 -0
  257. package/modern/models/params/gridMenuParams.js +1 -0
  258. package/modern/models/params/index.js +2 -1
  259. package/node/DataGrid/DataGrid.js +26 -1
  260. package/node/colDef/gridCheckboxSelectionColDef.js +4 -2
  261. package/node/colDef/gridNumericColDef.js +1 -1
  262. package/node/components/GridRow.js +53 -12
  263. package/node/components/cell/GridCell.js +12 -7
  264. package/node/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  265. package/node/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  266. package/node/components/columnSelection/GridHeaderCheckbox.js +0 -1
  267. package/node/components/containers/GridRootStyles.js +8 -3
  268. package/node/components/menu/GridMenu.js +10 -2
  269. package/node/components/panel/GridColumnsPanel.js +12 -7
  270. package/node/components/panel/GridPanelWrapper.js +5 -3
  271. package/node/components/panel/filterPanel/GridFilterForm.js +91 -9
  272. package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  273. package/node/components/panel/filterPanel/GridFilterPanel.js +28 -11
  274. package/node/components/toolbar/GridToolbarColumnsButton.js +0 -1
  275. package/node/components/toolbar/GridToolbarDensitySelector.js +0 -1
  276. package/node/components/toolbar/GridToolbarExportContainer.js +0 -1
  277. package/node/components/toolbar/GridToolbarFilterButton.js +0 -1
  278. package/node/components/toolbar/GridToolbarQuickFilter.js +61 -4
  279. package/node/constants/defaultGridSlotsComponents.js +2 -1
  280. package/node/constants/gridClasses.js +1 -1
  281. package/node/constants/localeTextConstants.js +1 -0
  282. package/node/hooks/core/useGridStateInitialization.js +19 -6
  283. package/node/hooks/features/columnMenu/useGridColumnMenu.js +23 -0
  284. package/node/hooks/features/columns/useGridColumnSpanning.js +11 -16
  285. package/node/hooks/features/columns/useGridColumns.js +13 -15
  286. package/node/hooks/features/dimensions/useGridDimensions.js +9 -8
  287. package/node/hooks/features/editRows/useGridCellEditing.new.js +11 -4
  288. package/node/hooks/features/editRows/useGridEditing.old.js +1 -1
  289. package/node/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  290. package/node/hooks/features/events/useGridEvents.js +2 -0
  291. package/node/hooks/features/filter/gridFilterSelector.js +9 -2
  292. package/node/hooks/features/filter/gridFilterUtils.js +4 -5
  293. package/node/hooks/features/filter/useGridFilter.js +28 -11
  294. package/node/hooks/features/pagination/useGridPage.js +1 -1
  295. package/node/hooks/features/pagination/useGridPageSize.js +1 -1
  296. package/node/hooks/features/rows/useGridRowsMeta.js +136 -69
  297. package/node/hooks/features/selection/useGridSelection.js +1 -1
  298. package/node/hooks/features/selection/useGridSelectionPreProcessors.js +7 -5
  299. package/node/hooks/features/sorting/useGridSorting.js +1 -1
  300. package/node/hooks/features/virtualization/useGridVirtualScroller.js +65 -12
  301. package/node/index.js +1 -1
  302. package/node/locales/arSD.js +1 -0
  303. package/node/locales/bgBG.js +1 -0
  304. package/node/locales/csCZ.js +1 -0
  305. package/node/locales/daDK.js +1 -0
  306. package/node/locales/deDE.js +1 -0
  307. package/node/locales/elGR.js +1 -0
  308. package/node/locales/esES.js +1 -0
  309. package/node/locales/faIR.js +1 -0
  310. package/node/locales/fiFI.js +1 -0
  311. package/node/locales/frFR.js +1 -0
  312. package/node/locales/heIL.js +10 -9
  313. package/node/locales/huHU.js +1 -0
  314. package/node/locales/itIT.js +1 -0
  315. package/node/locales/jaJP.js +25 -24
  316. package/node/locales/koKR.js +1 -0
  317. package/node/locales/nbNO.js +126 -0
  318. package/node/locales/nlNL.js +1 -0
  319. package/node/locales/plPL.js +1 -0
  320. package/node/locales/ptBR.js +1 -0
  321. package/node/locales/ruRU.js +7 -6
  322. package/node/locales/skSK.js +1 -0
  323. package/node/locales/trTR.js +8 -7
  324. package/node/locales/ukUA.js +1 -0
  325. package/node/locales/viVN.js +1 -0
  326. package/node/locales/zhCN.js +1 -0
  327. package/node/models/events/gridEvents.js +2 -0
  328. package/node/models/gridApiCaches.js +5 -0
  329. package/node/models/params/gridMenuParams.js +5 -0
  330. package/node/models/params/index.js +13 -0
  331. package/package.json +6 -5
@@ -37,7 +37,7 @@ const hasScroll = ({
37
37
 
38
38
  export function useGridDimensions(apiRef, props) {
39
39
  const logger = useGridLogger(apiRef, 'useResizeContainer');
40
- const warningShown = React.useRef(false);
40
+ const errorShown = React.useRef(false);
41
41
  const rootDimensionsRef = React.useRef(null);
42
42
  const fullDimensionsRef = React.useRef(null);
43
43
  const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
@@ -92,7 +92,8 @@ export function useGridDimensions(apiRef, props) {
92
92
  viewportOuterSize,
93
93
  viewportInnerSize,
94
94
  hasScrollX,
95
- hasScrollY
95
+ hasScrollY,
96
+ scrollBarSize
96
97
  };
97
98
  const prevDimensions = fullDimensionsRef.current;
98
99
  fullDimensionsRef.current = newFullDimensions;
@@ -142,14 +143,14 @@ export function useGridDimensions(apiRef, props) {
142
143
 
143
144
  const isJSDOM = /jsdom/.test(window.navigator.userAgent);
144
145
 
145
- if (size.height === 0 && !warningShown.current && !props.autoHeight && !isJSDOM) {
146
- 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'));
147
- warningShown.current = true;
146
+ if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
147
+ 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'));
148
+ errorShown.current = true;
148
149
  }
149
150
 
150
- if (size.width === 0 && !warningShown.current && !isJSDOM) {
151
- 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'));
152
- warningShown.current = true;
151
+ if (size.width === 0 && !errorShown.current && !isJSDOM) {
152
+ 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'));
153
+ errorShown.current = true;
153
154
  }
154
155
 
155
156
  if (isTestEnvironment) {
@@ -303,6 +303,9 @@ export const useGridCellEditing = (apiRef, props) => {
303
303
  } = editingState[id][field];
304
304
 
305
305
  if (error || isProcessingProps) {
306
+ // Attempt to change cell mode to "view" was not successful
307
+ // Update previous mode to allow another attempt
308
+ prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
306
309
  return;
307
310
  }
308
311
 
@@ -310,6 +313,8 @@ export const useGridCellEditing = (apiRef, props) => {
310
313
 
311
314
  if (processRowUpdate) {
312
315
  const handleError = errorThrown => {
316
+ prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
317
+
313
318
  if (onProcessRowUpdateError) {
314
319
  onProcessRowUpdateError(errorThrown);
315
320
  } else {
@@ -413,10 +418,13 @@ export const useGridCellEditing = (apiRef, props) => {
413
418
  }
414
419
  }, [cellModesModelProp, updateCellModesModel]);
415
420
  React.useEffect(() => {
416
- const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
421
+ const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopCellEditMode may change it later
422
+
423
+ const copyOfPrevCellModes = prevCellModesModel.current;
424
+ prevCellModesModel.current = cellModesModel;
417
425
  Object.entries(cellModesModel).forEach(([id, fields]) => {
418
426
  Object.entries(fields).forEach(([field, params]) => {
419
- const prevMode = prevCellModesModel.current[id]?.[field]?.mode || GridCellModes.View;
427
+ const prevMode = copyOfPrevCellModes[id]?.[field]?.mode || GridCellModes.View;
420
428
  const originalId = idToIdLookup[id] ?? id;
421
429
 
422
430
  if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) {
@@ -432,6 +440,5 @@ export const useGridCellEditing = (apiRef, props) => {
432
440
  }
433
441
  });
434
442
  });
435
- prevCellModesModel.current = cellModesModel;
436
443
  }, [apiRef, cellModesModel, updateStateToStartCellEditMode, updateStateToStopCellEditMode]);
437
444
  };
@@ -21,7 +21,7 @@ export function useGridEditing(apiRef, props) {
21
21
  useCellEditing(apiRef, props);
22
22
  useGridRowEditing(apiRef, props);
23
23
  const debounceMap = React.useRef({});
24
- apiRef.current.unstable_updateControlState({
24
+ apiRef.current.unstable_registerControlState({
25
25
  stateId: 'editRows',
26
26
  propModel: props.editRowsModel,
27
27
  propOnChange: props.onEditRowsModelChange,
@@ -382,12 +382,14 @@ export const useGridRowEditing = (apiRef, props) => {
382
382
  const isSomeFieldProcessingProps = Object.values(editingState[id]).some(fieldProps => fieldProps.isProcessingProps);
383
383
 
384
384
  if (isSomeFieldProcessingProps) {
385
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
385
386
  return;
386
387
  }
387
388
 
388
389
  const hasSomeFieldWithError = Object.values(editingState[id]).some(fieldProps => fieldProps.error);
389
390
 
390
391
  if (hasSomeFieldWithError) {
392
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
391
393
  return;
392
394
  }
393
395
 
@@ -395,6 +397,8 @@ export const useGridRowEditing = (apiRef, props) => {
395
397
 
396
398
  if (processRowUpdate) {
397
399
  const handleError = errorThrown => {
400
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
401
+
398
402
  if (onProcessRowUpdateError) {
399
403
  onProcessRowUpdateError(errorThrown);
400
404
  } else {
@@ -565,9 +569,12 @@ export const useGridRowEditing = (apiRef, props) => {
565
569
  }
566
570
  }, [rowModesModelProp, updateRowModesModel]);
567
571
  React.useEffect(() => {
568
- const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
572
+ const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopRowEditMode may change it later
573
+
574
+ const copyOfPrevRowModesModel = prevRowModesModel.current;
575
+ prevRowModesModel.current = rowModesModel;
569
576
  Object.entries(rowModesModel).forEach(([id, params]) => {
570
- const prevMode = prevRowModesModel.current[id]?.mode || GridRowModes.View;
577
+ const prevMode = copyOfPrevRowModesModel[id]?.mode || GridRowModes.View;
571
578
  const originalId = idToIdLookup[id] ?? id;
572
579
 
573
580
  if (params.mode === GridRowModes.Edit && prevMode === GridRowModes.View) {
@@ -580,6 +587,5 @@ export const useGridRowEditing = (apiRef, props) => {
580
587
  }, params));
581
588
  }
582
589
  });
583
- prevRowModesModel.current = rowModesModel;
584
590
  }, [apiRef, rowModesModel, updateStateToStartRowEditMode, updateStateToStopRowEditMode]);
585
591
  };
@@ -18,6 +18,8 @@ export function useGridEvents(apiRef, props) {
18
18
  useGridApiOptionHandler(apiRef, 'cellFocusOut', props.onCellFocusOut);
19
19
  useGridApiOptionHandler(apiRef, 'preferencePanelClose', props.onPreferencePanelClose);
20
20
  useGridApiOptionHandler(apiRef, 'preferencePanelOpen', props.onPreferencePanelOpen);
21
+ useGridApiOptionHandler(apiRef, 'menuOpen', props.onMenuOpen);
22
+ useGridApiOptionHandler(apiRef, 'menuClose', props.onMenuClose);
21
23
  useGridApiOptionHandler(apiRef, 'rowDoubleClick', props.onRowDoubleClick);
22
24
  useGridApiOptionHandler(apiRef, 'rowClick', props.onRowClick);
23
25
  useGridApiOptionHandler(apiRef, 'componentError', props.onError);
@@ -13,6 +13,12 @@ export const gridFilterStateSelector = state => state.filter;
13
13
  */
14
14
 
15
15
  export const gridFilterModelSelector = createSelector(gridFilterStateSelector, filterState => filterState.filterModel);
16
+ /**
17
+ * Get the current quick filter values.
18
+ * @category Filtering
19
+ */
20
+
21
+ export const gridQuickFilterValuesSelector = createSelector(gridFilterModelSelector, filterModel => filterModel.quickFilterValues);
16
22
  /**
17
23
  * @category Filtering
18
24
  * @ignore - do not document.
@@ -10,7 +10,7 @@ import { gridColumnFieldsSelector } from '../columns';
10
10
  * @return {GridFilterItem} The clean filter item with an uniq ID and an always-defined operatorValue.
11
11
  * TODO: Make the typing reflect the different between GridFilterInputItem and GridFilterItem.
12
12
  */
13
- const cleanFilterItem = (item, apiRef) => {
13
+ export const cleanFilterItem = (item, apiRef) => {
14
14
  const cleanItem = _extends({}, item);
15
15
 
16
16
  if (cleanItem.id == null) {
@@ -25,7 +25,6 @@ const cleanFilterItem = (item, apiRef) => {
25
25
 
26
26
  return cleanItem;
27
27
  };
28
-
29
28
  const filterModelDisableMultiColumnsFilteringWarning = buildWarning(['MUI: The `filterModel` can only contain a single item when the `disableMultipleColumnsFiltering` prop is set to `true`.', 'If you are using the community version of the `DataGrid`, this prop is always `true`.'], 'error');
30
29
  const filterModelMissingItemIdWarning = buildWarning("MUI: The 'id' field is required on `filterModel.items` when you use multiple filters.", 'error');
31
30
  const filterModelMissingItemOperatorWarning = buildWarning(['MUI: One of your filtering item have no `operatorValue` provided.', 'This property will become required on `@mui/x-data-grid@6.X`.']);
@@ -65,10 +64,8 @@ export const sanitizeFilterModel = (model, disableMultipleColumnsFiltering, apiR
65
64
 
66
65
  return model;
67
66
  };
68
- export const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) => state => _extends({}, state, {
69
- filter: _extends({}, state.filter, {
70
- filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
71
- })
67
+ export const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) => filteringState => _extends({}, filteringState, {
68
+ filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
72
69
  });
73
70
  /**
74
71
  * Generates a method to easily check if a row is matching the current filter model.
@@ -12,7 +12,7 @@ import { useFirstRender } from '../../utils/useFirstRender';
12
12
  import { gridRowIdsSelector } from '../rows';
13
13
  import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
14
14
  import { GRID_DEFAULT_STRATEGY, useGridRegisterStrategyProcessor } from '../../core/strategyProcessing';
15
- import { buildAggregatedFilterApplier, sanitizeFilterModel, mergeStateWithFilterModel } from './gridFilterUtils';
15
+ import { buildAggregatedFilterApplier, sanitizeFilterModel, mergeStateWithFilterModel, cleanFilterItem } from './gridFilterUtils';
16
16
  import { isDeepEqual } from '../../../utils/utils';
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
  export const filterStateInitializer = (state, props, apiRef) => {
@@ -33,7 +33,7 @@ export const filterStateInitializer = (state, props, apiRef) => {
33
33
 
34
34
  export const useGridFilter = (apiRef, props) => {
35
35
  const logger = useGridLogger(apiRef, 'useGridFilter');
36
- apiRef.current.unstable_updateControlState({
36
+ apiRef.current.unstable_registerControlState({
37
37
  stateId: 'filter',
38
38
  propModel: props.filterModel,
39
39
  propOnChange: props.onFilterModelChange,
@@ -74,7 +74,23 @@ export const useGridFilter = (apiRef, props) => {
74
74
 
75
75
  apiRef.current.setFilterModel(_extends({}, filterModel, {
76
76
  items
77
- }));
77
+ }), 'upsertFilterItem');
78
+ }, [apiRef]);
79
+ const upsertFilterItems = React.useCallback(items => {
80
+ const filterModel = gridFilterModelSelector(apiRef);
81
+ const existingItems = [...filterModel.items];
82
+ items.forEach(item => {
83
+ const itemIndex = items.findIndex(filterItem => filterItem.id === item.id);
84
+
85
+ if (itemIndex === -1) {
86
+ existingItems.push(item);
87
+ } else {
88
+ existingItems[itemIndex] = item;
89
+ }
90
+ });
91
+ apiRef.current.setFilterModel(_extends({}, filterModel, {
92
+ items
93
+ }), 'upsertFilterItems');
78
94
  }, [apiRef]);
79
95
  const deleteFilterItem = React.useCallback(itemToDelete => {
80
96
  const filterModel = gridFilterModelSelector(apiRef);
@@ -86,7 +102,7 @@ export const useGridFilter = (apiRef, props) => {
86
102
 
87
103
  apiRef.current.setFilterModel(_extends({}, filterModel, {
88
104
  items
89
- }));
105
+ }), 'deleteFilterItem');
90
106
  }, [apiRef]);
91
107
  const showFilterPanel = React.useCallback(targetColumnField => {
92
108
  logger.debug('Displaying filter panel');
@@ -100,13 +116,13 @@ export const useGridFilter = (apiRef, props) => {
100
116
  if (filterItemOnTarget) {
101
117
  newFilterItems = filterItemsWithValue;
102
118
  } else if (props.disableMultipleColumnsFiltering) {
103
- newFilterItems = [{
119
+ newFilterItems = [cleanFilterItem({
104
120
  columnField: targetColumnField
105
- }];
121
+ }, apiRef)];
106
122
  } else {
107
- newFilterItems = [...filterItemsWithValue, {
123
+ newFilterItems = [...filterItemsWithValue, cleanFilterItem({
108
124
  columnField: targetColumnField
109
- }];
125
+ }, apiRef)];
110
126
  }
111
127
 
112
128
  apiRef.current.setFilterModel(_extends({}, filterModel, {
@@ -129,7 +145,7 @@ export const useGridFilter = (apiRef, props) => {
129
145
 
130
146
  apiRef.current.setFilterModel(_extends({}, filterModel, {
131
147
  linkOperator
132
- }));
148
+ }), 'changeLogicOperator');
133
149
  }, [apiRef]);
134
150
  const setQuickFilterValues = React.useCallback(values => {
135
151
  const filterModel = gridFilterModelSelector(apiRef);
@@ -142,12 +158,12 @@ export const useGridFilter = (apiRef, props) => {
142
158
  quickFilterValues: [...values]
143
159
  }));
144
160
  }, [apiRef]);
145
- const setFilterModel = React.useCallback(model => {
161
+ const setFilterModel = React.useCallback((model, reason) => {
146
162
  const currentModel = gridFilterModelSelector(apiRef);
147
163
 
148
164
  if (currentModel !== model) {
149
165
  logger.debug('Setting filter model');
150
- apiRef.current.setState(mergeStateWithFilterModel(model, props.disableMultipleColumnsFiltering, apiRef));
166
+ apiRef.current.unstable_updateControlState('filter', mergeStateWithFilterModel(model, props.disableMultipleColumnsFiltering, apiRef), reason);
151
167
  apiRef.current.unstable_applyFilters();
152
168
  }
153
169
  }, [apiRef, logger, props.disableMultipleColumnsFiltering]);
@@ -160,6 +176,7 @@ export const useGridFilter = (apiRef, props) => {
160
176
  unstable_applyFilters: applyFilters,
161
177
  deleteFilterItem,
162
178
  upsertFilterItem,
179
+ upsertFilterItems,
163
180
  setFilterModel,
164
181
  showFilterPanel,
165
182
  hideFilterPanel,
@@ -191,7 +208,7 @@ export const useGridFilter = (apiRef, props) => {
191
208
  return params;
192
209
  }
193
210
 
194
- apiRef.current.setState(mergeStateWithFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef));
211
+ apiRef.current.unstable_updateControlState('filter', mergeStateWithFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef), 'restoreState');
195
212
  return _extends({}, params, {
196
213
  callbacks: [...params.callbacks, apiRef.current.unstable_applyFilters]
197
214
  });
@@ -37,7 +37,7 @@ const noRowCountInServerMode = buildWarning(["MUI: the 'rowCount' prop is undefi
37
37
  export const useGridPage = (apiRef, props) => {
38
38
  const logger = useGridLogger(apiRef, 'useGridPage');
39
39
  const visibleTopLevelRowCount = useGridSelector(apiRef, gridVisibleTopLevelRowCountSelector);
40
- apiRef.current.unstable_updateControlState({
40
+ apiRef.current.unstable_registerControlState({
41
41
  stateId: 'page',
42
42
  propModel: props.page,
43
43
  propOnChange: props.onPageChange,
@@ -19,7 +19,7 @@ const mergeStateWithPageSize = pageSize => state => _extends({}, state, {
19
19
  export const useGridPageSize = (apiRef, props) => {
20
20
  const logger = useGridLogger(apiRef, 'useGridPageSize');
21
21
  const rowHeight = useGridSelector(apiRef, gridDensityRowHeightSelector);
22
- apiRef.current.unstable_updateControlState({
22
+ apiRef.current.unstable_registerControlState({
23
23
  stateId: 'pageSize',
24
24
  propModel: props.pageSize,
25
25
  propOnChange: props.onPageSizeChange,
@@ -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';
@@ -21,64 +22,99 @@ export const rowsMetaStateInitializer = state => _extends({}, state, {
21
22
 
22
23
  export const useGridRowsMeta = (apiRef, props) => {
23
24
  const {
24
- getRowHeight,
25
- getRowSpacing
25
+ getRowHeight: getRowHeightProp,
26
+ getRowSpacing,
27
+ getEstimatedRowHeight
26
28
  } = props;
27
- const rowsHeightLookup = React.useRef({});
28
- const rowHeight = useGridSelector(apiRef, gridDensityRowHeightSelector);
29
+ const rowsHeightLookup = React.useRef({}); // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
30
+
31
+ const lastMeasuredRowIndex = React.useRef(-1);
32
+ const hasRowWithAutoHeight = React.useRef(false);
33
+ const rowHeightFromDensity = useGridSelector(apiRef, gridDensityRowHeightSelector);
29
34
  const filterState = useGridSelector(apiRef, gridFilterStateSelector);
30
35
  const paginationState = useGridSelector(apiRef, gridPaginationSelector);
31
36
  const sortingState = useGridSelector(apiRef, gridSortingStateSelector);
32
37
  const currentPage = useGridVisibleRows(apiRef, props);
33
38
  const hydrateRowsMeta = React.useCallback(() => {
34
- apiRef.current.setState(state => {
35
- const positions = [];
36
- const densityFactor = gridDensityFactorSelector(state, apiRef.current.instanceId);
37
- const currentRowHeight = gridDensityRowHeightSelector(state, apiRef.current.instanceId);
38
- const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
39
- positions.push(acc);
40
- let baseRowHeight;
41
- const isResized = rowsHeightLookup.current[row.id] && rowsHeightLookup.current[row.id].isResized || false;
42
-
43
- if (isResized) {
44
- // do not recalculate resized row height and use the value from the lookup
45
- baseRowHeight = rowsHeightLookup.current[row.id].value;
46
- } else {
47
- baseRowHeight = currentRowHeight;
39
+ hasRowWithAutoHeight.current = false;
40
+ const densityFactor = gridDensityFactorSelector(apiRef.current.state, apiRef.current.instanceId);
41
+ const positions = [];
42
+ const currentPageTotalHeight = currentPage.rows.reduce((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
+ }
56
+
57
+ const {
58
+ isResized,
59
+ needsFirstMeasurement,
60
+ sizes
61
+ } = rowsHeightLookup.current[row.id];
62
+ let baseRowHeight = rowHeightFromDensity;
63
+ const existingBaseRowHeight = sizes.base;
64
+
65
+ if (isResized) {
66
+ // Do not recalculate resized row height and use the value from the lookup
67
+ baseRowHeight = existingBaseRowHeight;
68
+ } else if (getRowHeightProp) {
69
+ const rowHeightFromUser = getRowHeightProp(_extends({}, row, {
70
+ densityFactor
71
+ }));
48
72
 
49
- if (getRowHeight) {
50
- // Default back to base rowHeight if getRowHeight returns null or undefined.
51
- baseRowHeight = getRowHeight(_extends({}, row, {
73
+ if (rowHeightFromUser === 'auto') {
74
+ if (needsFirstMeasurement) {
75
+ const estimatedRowHeight = getEstimatedRowHeight ? getEstimatedRowHeight(_extends({}, row, {
52
76
  densityFactor
53
- })) ?? currentRowHeight;
77
+ })) : rowHeightFromDensity; // If the row was not measured yet use the estimated row height
78
+
79
+ baseRowHeight = estimatedRowHeight ?? rowHeightFromDensity;
80
+ } else {
81
+ baseRowHeight = existingBaseRowHeight;
54
82
  }
55
- } // We use an object to make simple to check if a height is already added or not
83
+
84
+ hasRowWithAutoHeight.current = true;
85
+ rowsHeightLookup.current[row.id].autoHeight = true;
86
+ } else {
87
+ // Default back to base rowHeight if getRowHeight returns null or undefined.
88
+ baseRowHeight = rowHeightFromUser ?? rowHeightFromDensity;
89
+ rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
90
+ rowsHeightLookup.current[row.id].autoHeight = false;
91
+ }
92
+ } else {
93
+ rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
94
+ } // We use an object to make simple to check if a height is already added or not
56
95
 
57
96
 
58
- const initialHeights = {
59
- base: baseRowHeight
60
- };
97
+ const initialHeights = {
98
+ base: baseRowHeight
99
+ };
61
100
 
62
- if (getRowSpacing) {
63
- const indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
64
- const spacing = getRowSpacing(_extends({}, row, {
65
- isFirstVisible: indexRelativeToCurrentPage === 0,
66
- isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
67
- indexRelativeToCurrentPage
68
- }));
69
- initialHeights.spacingTop = spacing.top ?? 0;
70
- initialHeights.spacingBottom = spacing.bottom ?? 0;
71
- }
101
+ if (getRowSpacing) {
102
+ const indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
103
+ const spacing = getRowSpacing(_extends({}, row, {
104
+ isFirstVisible: indexRelativeToCurrentPage === 0,
105
+ isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
106
+ indexRelativeToCurrentPage
107
+ }));
108
+ initialHeights.spacingTop = spacing.top ?? 0;
109
+ initialHeights.spacingBottom = spacing.bottom ?? 0;
110
+ }
72
111
 
73
- const sizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
74
- const finalRowHeight = Object.values(sizes).reduce((acc2, value) => acc2 + value, 0);
75
- rowsHeightLookup.current[row.id] = {
76
- value: baseRowHeight,
77
- sizes,
78
- isResized
79
- };
80
- return acc + finalRowHeight;
81
- }, 0);
112
+ const processedSizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
113
+ rowsHeightLookup.current[row.id].sizes = processedSizes;
114
+ const finalRowHeight = Object.values(processedSizes).reduce((acc2, value) => acc2 + value, 0);
115
+ return acc + finalRowHeight;
116
+ }, 0);
117
+ apiRef.current.setState(state => {
82
118
  return _extends({}, state, {
83
119
  rowsMeta: {
84
120
  currentPageTotalHeight,
@@ -86,33 +122,67 @@ export const useGridRowsMeta = (apiRef, props) => {
86
122
  }
87
123
  });
88
124
  });
89
- apiRef.current.forceUpdate();
90
- }, [apiRef, currentPage.rows, getRowSpacing, getRowHeight]);
91
125
 
92
- const getTargetRowHeight = rowId => rowsHeightLookup.current[rowId]?.value || rowHeight;
126
+ if (!hasRowWithAutoHeight.current) {
127
+ // No row has height=auto, so all rows are already measured
128
+ lastMeasuredRowIndex.current = Infinity;
129
+ }
130
+
131
+ apiRef.current.forceUpdate();
132
+ }, [apiRef, currentPage.rows, rowHeightFromDensity, getRowHeightProp, getRowSpacing, getEstimatedRowHeight]);
133
+ const getRowHeight = React.useCallback(rowId => {
134
+ const height = rowsHeightLookup.current[rowId];
135
+ return height ? height.sizes.base : rowHeightFromDensity;
136
+ }, [rowHeightFromDensity]);
93
137
 
94
138
  const getRowInternalSizes = rowId => rowsHeightLookup.current[rowId]?.sizes;
95
139
 
96
140
  const setRowHeight = React.useCallback((id, height) => {
97
- rowsHeightLookup.current[id] = {
98
- value: height,
99
- isResized: true,
100
- sizes: _extends({}, rowsHeightLookup.current[id].sizes, {
101
- base: height
102
- })
103
- };
141
+ rowsHeightLookup.current[id].sizes.base = height;
142
+ rowsHeightLookup.current[id].isResized = true;
143
+ rowsHeightLookup.current[id].needsFirstMeasurement = false;
104
144
  hydrateRowsMeta();
105
- }, [hydrateRowsMeta]); // The effect is used to build the rows meta data - currentPageTotalHeight and positions.
145
+ }, [hydrateRowsMeta]);
146
+ const debouncedHydrateRowsMeta = React.useMemo(() => debounce(hydrateRowsMeta), [hydrateRowsMeta]);
147
+ const storeMeasuredRowHeight = React.useCallback((id, height) => {
148
+ if (!rowsHeightLookup.current[id] || !rowsHeightLookup.current[id].autoHeight) {
149
+ return;
150
+ } // Only trigger hydration if the value is different, otherwise we trigger a loop
151
+
152
+
153
+ const needsHydration = rowsHeightLookup.current[id].sizes.base !== height;
154
+ rowsHeightLookup.current[id].needsFirstMeasurement = false;
155
+ rowsHeightLookup.current[id].sizes.base = height;
156
+
157
+ if (needsHydration) {
158
+ debouncedHydrateRowsMeta();
159
+ }
160
+ }, [debouncedHydrateRowsMeta]);
161
+ const rowHasAutoHeight = React.useCallback(id => {
162
+ return rowsHeightLookup.current[id]?.autoHeight || false;
163
+ }, []);
164
+ const getLastMeasuredRowIndex = React.useCallback(() => {
165
+ return lastMeasuredRowIndex.current;
166
+ }, []);
167
+ const setLastMeasuredRowIndex = React.useCallback(index => {
168
+ if (hasRowWithAutoHeight.current && index > lastMeasuredRowIndex.current) {
169
+ lastMeasuredRowIndex.current = index;
170
+ }
171
+ }, []); // The effect is used to build the rows meta data - currentPageTotalHeight and positions.
106
172
  // Because of variable row height this is needed for the virtualization
107
173
 
108
174
  React.useEffect(() => {
109
175
  hydrateRowsMeta();
110
- }, [rowHeight, filterState, paginationState, sortingState, hydrateRowsMeta]);
176
+ }, [rowHeightFromDensity, filterState, paginationState, sortingState, hydrateRowsMeta]);
111
177
  useGridRegisterPipeApplier(apiRef, 'rowHeight', hydrateRowsMeta);
112
178
  const rowsMetaApi = {
113
- unstable_getRowHeight: getTargetRowHeight,
179
+ unstable_getLastMeasuredRowIndex: getLastMeasuredRowIndex,
180
+ unstable_setLastMeasuredRowIndex: setLastMeasuredRowIndex,
181
+ unstable_rowHasAutoHeight: rowHasAutoHeight,
182
+ unstable_getRowHeight: getRowHeight,
114
183
  unstable_getRowInternalSizes: getRowInternalSizes,
115
- unstable_setRowHeight: setRowHeight
184
+ unstable_setRowHeight: setRowHeight,
185
+ unstable_storeRowHeightMeasurement: storeMeasuredRowHeight
116
186
  };
117
187
  useGridApiMethod(apiRef, rowsMetaApi, 'GridRowsMetaApi');
118
188
  };
@@ -46,7 +46,7 @@ export const useGridSelection = (apiRef, props) => {
46
46
  return getSelectionModelPropValue(props.selectionModel, gridSelectionStateSelector(apiRef.current.state));
47
47
  }, [apiRef, props.selectionModel]);
48
48
  const lastRowToggled = React.useRef(null);
49
- apiRef.current.unstable_updateControlState({
49
+ apiRef.current.unstable_registerControlState({
50
50
  stateId: 'selection',
51
51
  propModel: propSelectionModel,
52
52
  propOnChange: props.onSelectionModelChange,
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { unstable_composeClasses as composeClasses } from '@mui/material';
4
4
  import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
5
5
  import { getDataGridUtilityClass } from '../../../constants';
6
- import { GRID_CHECKBOX_SELECTION_COL_DEF } from '../../../colDef';
6
+ import { GRID_CHECKBOX_SELECTION_COL_DEF, GRID_CHECKBOX_SELECTION_FIELD } from '../../../colDef';
7
7
 
8
8
  const useUtilityClasses = ownerState => {
9
9
  const {
@@ -31,14 +31,16 @@ export const useGridSelectionPreProcessors = (apiRef, props) => {
31
31
  });
32
32
 
33
33
  const shouldHaveSelectionColumn = props.checkboxSelection;
34
- const haveSelectionColumn = columnsState.lookup[selectionColumn.field] != null;
34
+ const haveSelectionColumn = columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] != null;
35
35
 
36
36
  if (shouldHaveSelectionColumn && !haveSelectionColumn) {
37
- columnsState.lookup[selectionColumn.field] = selectionColumn;
38
- columnsState.all = [selectionColumn.field, ...columnsState.all];
37
+ columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = selectionColumn;
38
+ columnsState.all = [GRID_CHECKBOX_SELECTION_FIELD, ...columnsState.all];
39
39
  } else if (!shouldHaveSelectionColumn && haveSelectionColumn) {
40
- delete columnsState.lookup[selectionColumn.field];
41
- columnsState.all = columnsState.all.filter(field => field !== selectionColumn.field);
40
+ delete columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD];
41
+ columnsState.all = columnsState.all.filter(field => field !== GRID_CHECKBOX_SELECTION_FIELD);
42
+ } else if (shouldHaveSelectionColumn && haveSelectionColumn) {
43
+ columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = _extends({}, selectionColumn, columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD]);
42
44
  }
43
45
 
44
46
  return columnsState;
@@ -28,7 +28,7 @@ export const sortingStateInitializer = (state, props) => {
28
28
 
29
29
  export const useGridSorting = (apiRef, props) => {
30
30
  const logger = useGridLogger(apiRef, 'useGridSorting');
31
- apiRef.current.unstable_updateControlState({
31
+ apiRef.current.unstable_registerControlState({
32
32
  stateId: 'sortModel',
33
33
  propModel: props.sortModel,
34
34
  propOnChange: props.onSortModelChange,