@mui/x-data-grid 7.2.0 → 7.3.1

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 (315) hide show
  1. package/CHANGELOG.md +204 -2
  2. package/DataGrid/DataGrid.js +20 -2
  3. package/colDef/gridDateOperators.js +7 -0
  4. package/components/GridFooter.js +1 -2
  5. package/components/GridHeader.js +1 -2
  6. package/components/GridHeaders.js +3 -2
  7. package/components/GridPagination.d.ts +4 -1
  8. package/components/GridPagination.js +60 -9
  9. package/components/GridRow.js +2 -2
  10. package/components/GridScrollArea.js +1 -1
  11. package/components/cell/GridActionsCell.js +1 -2
  12. package/components/cell/GridActionsCellItem.js +1 -2
  13. package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +1 -2
  14. package/components/columnHeaders/GridColumnHeaderItem.d.ts +1 -0
  15. package/components/columnHeaders/GridColumnHeaderItem.js +6 -4
  16. package/components/columnHeaders/GridColumnHeaderSeparator.js +1 -1
  17. package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
  18. package/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -2
  19. package/components/columnsManagement/GridColumnsManagement.js +1 -2
  20. package/components/containers/GridRoot.js +1 -2
  21. package/components/containers/GridRootStyles.js +3 -1
  22. package/components/index.d.ts +1 -1
  23. package/components/index.js +1 -1
  24. package/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.js +1 -2
  25. package/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.js +1 -2
  26. package/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.js +1 -2
  27. package/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.js +1 -2
  28. package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -2
  29. package/components/panel/GridPanel.d.ts +1 -1
  30. package/components/panel/GridPanel.js +3 -1
  31. package/components/panel/filterPanel/GridFilterForm.js +1 -2
  32. package/components/panel/filterPanel/GridFilterInputBoolean.js +1 -2
  33. package/components/panel/filterPanel/GridFilterInputDate.js +4 -4
  34. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -2
  35. package/components/panel/filterPanel/GridFilterPanel.js +1 -2
  36. package/components/toolbar/GridToolbar.js +1 -2
  37. package/components/toolbar/GridToolbarDensitySelector.js +1 -2
  38. package/components/toolbar/GridToolbarExportContainer.js +1 -2
  39. package/components/toolbar/GridToolbarFilterButton.js +1 -2
  40. package/components/virtualization/GridVirtualScroller.js +1 -2
  41. package/components/virtualization/GridVirtualScrollerFiller.js +1 -2
  42. package/constants/gridClasses.d.ts +6 -2
  43. package/constants/gridClasses.js +1 -1
  44. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +1 -1
  45. package/hooks/features/columnHeaders/useGridColumnHeaders.js +3 -4
  46. package/hooks/features/columnResize/useGridColumnResize.js +91 -62
  47. package/hooks/features/columns/gridColumnsUtils.d.ts +5 -3
  48. package/hooks/features/columns/gridColumnsUtils.js +9 -7
  49. package/hooks/features/columns/useGridColumns.js +5 -4
  50. package/hooks/features/density/useGridDensity.d.ts +1 -1
  51. package/hooks/features/density/useGridDensity.js +30 -4
  52. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -1
  53. package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
  54. package/hooks/features/dimensions/useGridDimensions.js +5 -2
  55. package/hooks/features/editing/useGridCellEditing.js +14 -1
  56. package/hooks/features/export/useGridPrintExport.d.ts +1 -1
  57. package/hooks/features/export/useGridPrintExport.js +2 -2
  58. package/hooks/features/headerFiltering/useGridHeaderFiltering.d.ts +2 -2
  59. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.d.ts +2 -2
  60. package/hooks/features/pagination/gridPaginationInterfaces.d.ts +14 -2
  61. package/hooks/features/pagination/gridPaginationSelector.d.ts +5 -0
  62. package/hooks/features/pagination/gridPaginationSelector.js +7 -1
  63. package/hooks/features/pagination/gridPaginationUtils.d.ts +1 -2
  64. package/hooks/features/pagination/gridPaginationUtils.js +5 -3
  65. package/hooks/features/pagination/useGridPagination.d.ts +1 -1
  66. package/hooks/features/pagination/useGridPagination.js +5 -1
  67. package/hooks/features/pagination/useGridPaginationMeta.d.ts +4 -0
  68. package/hooks/features/pagination/useGridPaginationMeta.js +77 -0
  69. package/hooks/features/pagination/useGridPaginationModel.js +2 -1
  70. package/hooks/features/pagination/useGridRowCount.d.ts +0 -4
  71. package/hooks/features/pagination/useGridRowCount.js +32 -18
  72. package/hooks/features/rows/gridRowsUtils.d.ts +1 -1
  73. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +3 -3
  74. package/hooks/utils/useGridApiEventHandler.d.ts +2 -2
  75. package/hooks/utils/useGridNativeEventListener.d.ts +1 -1
  76. package/hooks/utils/useGridSelector.d.ts +2 -2
  77. package/index.js +1 -1
  78. package/internals/index.d.ts +1 -1
  79. package/internals/utils/propValidation.js +1 -1
  80. package/joy/icons.js +1 -2
  81. package/joy/joySlots.js +1 -2
  82. package/locales/daDK.js +3 -4
  83. package/models/api/gridApiCommon.d.ts +1 -1
  84. package/models/api/gridLocaleTextApi.d.ts +7 -3
  85. package/models/api/index.d.ts +1 -1
  86. package/models/api/index.js +0 -1
  87. package/models/events/gridEventLookup.d.ts +7 -1
  88. package/models/gridPaginationProps.d.ts +3 -0
  89. package/models/props/DataGridProps.d.ts +26 -8
  90. package/modern/DataGrid/DataGrid.js +20 -2
  91. package/modern/colDef/gridDateOperators.js +7 -0
  92. package/modern/components/GridFooter.js +1 -2
  93. package/modern/components/GridHeader.js +1 -2
  94. package/modern/components/GridHeaders.js +3 -2
  95. package/modern/components/GridPagination.js +60 -9
  96. package/modern/components/GridRow.js +2 -2
  97. package/modern/components/GridScrollArea.js +1 -1
  98. package/modern/components/cell/GridActionsCell.js +1 -2
  99. package/modern/components/cell/GridActionsCellItem.js +1 -2
  100. package/modern/components/columnHeaders/GridColumnHeaderFilterIconButton.js +1 -2
  101. package/modern/components/columnHeaders/GridColumnHeaderItem.js +6 -4
  102. package/modern/components/columnHeaders/GridColumnHeaderSeparator.js +1 -1
  103. package/modern/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
  104. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -2
  105. package/modern/components/columnsManagement/GridColumnsManagement.js +1 -2
  106. package/modern/components/containers/GridRoot.js +1 -2
  107. package/modern/components/containers/GridRootStyles.js +3 -1
  108. package/modern/components/index.js +1 -1
  109. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.js +1 -2
  110. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.js +1 -2
  111. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.js +1 -2
  112. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.js +1 -2
  113. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -2
  114. package/modern/components/panel/GridPanel.js +3 -1
  115. package/modern/components/panel/filterPanel/GridFilterForm.js +1 -2
  116. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -2
  117. package/modern/components/panel/filterPanel/GridFilterInputDate.js +4 -4
  118. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -2
  119. package/modern/components/panel/filterPanel/GridFilterPanel.js +1 -2
  120. package/modern/components/toolbar/GridToolbar.js +1 -2
  121. package/modern/components/toolbar/GridToolbarDensitySelector.js +1 -2
  122. package/modern/components/toolbar/GridToolbarExportContainer.js +1 -2
  123. package/modern/components/toolbar/GridToolbarFilterButton.js +1 -2
  124. package/modern/components/virtualization/GridVirtualScroller.js +1 -2
  125. package/modern/components/virtualization/GridVirtualScrollerFiller.js +1 -2
  126. package/modern/constants/gridClasses.js +1 -1
  127. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +3 -4
  128. package/modern/hooks/features/columnResize/useGridColumnResize.js +91 -62
  129. package/modern/hooks/features/columns/gridColumnsUtils.js +9 -7
  130. package/modern/hooks/features/columns/useGridColumns.js +5 -4
  131. package/modern/hooks/features/density/useGridDensity.js +30 -4
  132. package/modern/hooks/features/dimensions/useGridDimensions.js +5 -2
  133. package/modern/hooks/features/editing/useGridCellEditing.js +14 -1
  134. package/modern/hooks/features/export/useGridPrintExport.js +2 -2
  135. package/modern/hooks/features/pagination/gridPaginationSelector.js +7 -1
  136. package/modern/hooks/features/pagination/gridPaginationUtils.js +5 -3
  137. package/modern/hooks/features/pagination/useGridPagination.js +5 -1
  138. package/modern/hooks/features/pagination/useGridPaginationMeta.js +77 -0
  139. package/modern/hooks/features/pagination/useGridPaginationModel.js +2 -1
  140. package/modern/hooks/features/pagination/useGridRowCount.js +32 -18
  141. package/modern/index.js +1 -1
  142. package/modern/internals/utils/propValidation.js +1 -1
  143. package/modern/joy/icons.js +1 -2
  144. package/modern/joy/joySlots.js +1 -2
  145. package/modern/locales/daDK.js +3 -4
  146. package/modern/models/api/index.js +0 -1
  147. package/modern/utils/domUtils.js +4 -0
  148. package/node/DataGrid/DataGrid.js +20 -1
  149. package/node/DataGrid/useDataGridProps.js +1 -1
  150. package/node/colDef/gridCheckboxSelectionColDef.js +1 -1
  151. package/node/colDef/gridDateOperators.js +7 -0
  152. package/node/components/GridApiContext.js +1 -1
  153. package/node/components/GridColumnHeaders.js +1 -1
  154. package/node/components/GridFooter.js +1 -1
  155. package/node/components/GridHeader.js +1 -1
  156. package/node/components/GridHeaders.js +5 -3
  157. package/node/components/GridLoadingOverlay.js +1 -1
  158. package/node/components/GridNoResultsOverlay.js +1 -1
  159. package/node/components/GridNoRowsOverlay.js +1 -1
  160. package/node/components/GridPagination.js +60 -9
  161. package/node/components/GridRow.js +2 -1
  162. package/node/components/GridRowCount.js +1 -1
  163. package/node/components/GridScrollArea.js +2 -2
  164. package/node/components/GridScrollbarFillerCell.js +1 -1
  165. package/node/components/GridSelectedRowCount.js +1 -1
  166. package/node/components/base/GridFooterPlaceholder.js +1 -1
  167. package/node/components/base/GridOverlays.js +1 -1
  168. package/node/components/cell/GridActionsCell.js +1 -1
  169. package/node/components/cell/GridActionsCellItem.js +1 -1
  170. package/node/components/cell/GridBooleanCell.js +1 -1
  171. package/node/components/cell/GridCell.js +1 -1
  172. package/node/components/cell/GridEditBooleanCell.js +1 -1
  173. package/node/components/cell/GridEditDateCell.js +1 -1
  174. package/node/components/cell/GridEditInputCell.js +1 -1
  175. package/node/components/cell/GridEditSingleSelectCell.js +1 -1
  176. package/node/components/cell/GridSkeletonCell.js +1 -1
  177. package/node/components/columnHeaders/ColumnHeaderMenuIcon.js +1 -1
  178. package/node/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
  179. package/node/components/columnHeaders/GridColumnGroupHeader.js +1 -1
  180. package/node/components/columnHeaders/GridColumnHeaderFilterIconButton.js +1 -1
  181. package/node/components/columnHeaders/GridColumnHeaderItem.js +5 -2
  182. package/node/components/columnHeaders/GridColumnHeaderSeparator.js +2 -2
  183. package/node/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -1
  184. package/node/components/columnHeaders/GridColumnHeaderTitle.js +1 -1
  185. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -1
  186. package/node/components/columnHeaders/GridIconButtonContainer.js +1 -1
  187. package/node/components/columnSelection/GridCellCheckboxRenderer.js +1 -1
  188. package/node/components/columnSelection/GridHeaderCheckbox.js +1 -1
  189. package/node/components/columnsManagement/GridColumnsManagement.js +1 -1
  190. package/node/components/containers/GridFooterContainer.js +1 -1
  191. package/node/components/containers/GridOverlay.js +1 -1
  192. package/node/components/containers/GridRoot.js +1 -1
  193. package/node/components/containers/GridRootStyles.js +3 -1
  194. package/node/components/containers/GridToolbarContainer.js +1 -1
  195. package/node/components/index.js +27 -10
  196. package/node/components/menu/GridMenu.js +1 -1
  197. package/node/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  198. package/node/components/menu/columnMenu/GridColumnMenu.js +1 -1
  199. package/node/components/menu/columnMenu/GridColumnMenuContainer.js +1 -1
  200. package/node/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.js +1 -1
  201. package/node/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.js +1 -1
  202. package/node/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.js +1 -1
  203. package/node/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.js +1 -1
  204. package/node/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -1
  205. package/node/components/panel/GridColumnsPanel.js +1 -1
  206. package/node/components/panel/GridPanel.js +4 -2
  207. package/node/components/panel/GridPanelContent.js +1 -1
  208. package/node/components/panel/GridPanelFooter.js +1 -1
  209. package/node/components/panel/GridPanelHeader.js +1 -1
  210. package/node/components/panel/GridPanelWrapper.js +1 -1
  211. package/node/components/panel/GridPreferencesPanel.js +1 -1
  212. package/node/components/panel/filterPanel/GridFilterForm.js +1 -1
  213. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  214. package/node/components/panel/filterPanel/GridFilterInputDate.js +5 -5
  215. package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +1 -1
  216. package/node/components/panel/filterPanel/GridFilterInputMultipleValue.js +1 -1
  217. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  218. package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  219. package/node/components/panel/filterPanel/GridFilterPanel.js +1 -1
  220. package/node/components/toolbar/GridToolbar.js +1 -1
  221. package/node/components/toolbar/GridToolbarColumnsButton.js +1 -1
  222. package/node/components/toolbar/GridToolbarDensitySelector.js +1 -1
  223. package/node/components/toolbar/GridToolbarExport.js +1 -1
  224. package/node/components/toolbar/GridToolbarExportContainer.js +1 -1
  225. package/node/components/toolbar/GridToolbarFilterButton.js +1 -1
  226. package/node/components/toolbar/GridToolbarQuickFilter.js +1 -1
  227. package/node/components/virtualization/GridBottomContainer.js +1 -1
  228. package/node/components/virtualization/GridMainContainer.js +1 -1
  229. package/node/components/virtualization/GridTopContainer.js +1 -1
  230. package/node/components/virtualization/GridVirtualScrollbar.js +1 -1
  231. package/node/components/virtualization/GridVirtualScroller.js +1 -1
  232. package/node/components/virtualization/GridVirtualScrollerContent.js +1 -1
  233. package/node/components/virtualization/GridVirtualScrollerFiller.js +1 -1
  234. package/node/components/virtualization/GridVirtualScrollerRenderZone.js +1 -1
  235. package/node/constants/gridClasses.js +1 -1
  236. package/node/context/GridContextProvider.js +1 -1
  237. package/node/context/GridRootPropsContext.js +1 -1
  238. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +1 -1
  239. package/node/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +1 -1
  240. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +1 -1
  241. package/node/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.js +1 -1
  242. package/node/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -1
  243. package/node/hooks/core/useGridApiInitialization.js +1 -1
  244. package/node/hooks/core/useGridLocaleText.js +1 -1
  245. package/node/hooks/core/useGridLoggerFactory.js +1 -1
  246. package/node/hooks/core/useGridRefs.js +1 -1
  247. package/node/hooks/core/useGridStateInitialization.js +1 -1
  248. package/node/hooks/core/useGridTheme.js +1 -1
  249. package/node/hooks/features/clipboard/useGridClipboard.js +1 -1
  250. package/node/hooks/features/columnGrouping/useGridColumnGrouping.js +1 -1
  251. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +3 -3
  252. package/node/hooks/features/columnMenu/useGridColumnMenu.js +1 -1
  253. package/node/hooks/features/columnMenu/useGridColumnMenuSlots.js +1 -1
  254. package/node/hooks/features/columnResize/useGridColumnResize.js +92 -63
  255. package/node/hooks/features/columns/gridColumnsUtils.js +9 -7
  256. package/node/hooks/features/columns/useGridColumnSpanning.js +1 -1
  257. package/node/hooks/features/columns/useGridColumns.js +6 -5
  258. package/node/hooks/features/density/useGridDensity.js +31 -5
  259. package/node/hooks/features/dimensions/useGridDimensions.js +6 -3
  260. package/node/hooks/features/editing/useGridCellEditing.js +15 -2
  261. package/node/hooks/features/editing/useGridEditing.js +1 -1
  262. package/node/hooks/features/editing/useGridRowEditing.js +1 -1
  263. package/node/hooks/features/export/useGridCsvExport.js +1 -1
  264. package/node/hooks/features/export/useGridPrintExport.js +3 -3
  265. package/node/hooks/features/filter/useGridFilter.js +1 -1
  266. package/node/hooks/features/focus/useGridFocus.js +1 -1
  267. package/node/hooks/features/headerFiltering/useGridHeaderFiltering.js +1 -1
  268. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -1
  269. package/node/hooks/features/pagination/gridPaginationSelector.js +8 -2
  270. package/node/hooks/features/pagination/gridPaginationUtils.js +6 -4
  271. package/node/hooks/features/pagination/useGridPagination.js +5 -1
  272. package/node/hooks/features/pagination/useGridPaginationMeta.js +87 -0
  273. package/node/hooks/features/pagination/useGridPaginationModel.js +3 -2
  274. package/node/hooks/features/pagination/useGridRowCount.js +31 -16
  275. package/node/hooks/features/preferencesPanel/useGridPreferencesPanel.js +1 -1
  276. package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  277. package/node/hooks/features/rowSelection/useGridRowSelectionPreProcessors.js +1 -1
  278. package/node/hooks/features/rows/useGridParamsApi.js +1 -1
  279. package/node/hooks/features/rows/useGridRows.js +1 -1
  280. package/node/hooks/features/rows/useGridRowsMeta.js +1 -1
  281. package/node/hooks/features/scroll/useGridScroll.js +1 -1
  282. package/node/hooks/features/sorting/useGridSorting.js +1 -1
  283. package/node/hooks/features/statePersistence/useGridStatePersistence.js +1 -1
  284. package/node/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  285. package/node/hooks/features/virtualization/useGridVirtualization.js +1 -1
  286. package/node/hooks/utils/useFirstRender.js +1 -1
  287. package/node/hooks/utils/useGridApiContext.js +1 -1
  288. package/node/hooks/utils/useGridApiEventHandler.js +1 -1
  289. package/node/hooks/utils/useGridApiMethod.js +1 -1
  290. package/node/hooks/utils/useGridApiRef.js +1 -1
  291. package/node/hooks/utils/useGridInitializeState.js +1 -1
  292. package/node/hooks/utils/useGridLogger.js +1 -1
  293. package/node/hooks/utils/useGridNativeEventListener.js +1 -1
  294. package/node/hooks/utils/useGridPrivateApiContext.js +1 -1
  295. package/node/hooks/utils/useGridRootProps.js +1 -1
  296. package/node/hooks/utils/useGridSelector.js +1 -1
  297. package/node/hooks/utils/useGridVisibleRows.js +1 -1
  298. package/node/hooks/utils/useResizeObserver.js +1 -1
  299. package/node/hooks/utils/useRunOnce.js +1 -1
  300. package/node/index.js +1 -1
  301. package/node/internals/utils/propValidation.js +1 -1
  302. package/node/internals/utils/useProps.js +1 -1
  303. package/node/joy/icons.js +1 -1
  304. package/node/joy/joySlots.js +1 -1
  305. package/node/locales/daDK.js +3 -4
  306. package/node/material/components/MUISelectOption.js +1 -1
  307. package/node/material/icons/GridColumnUnsortedIcon.js +1 -1
  308. package/node/material/icons/index.js +1 -1
  309. package/node/models/api/index.js +0 -11
  310. package/node/utils/domUtils.js +5 -0
  311. package/node/utils/fastMemo.js +1 -1
  312. package/package.json +3 -5
  313. package/utils/domUtils.d.ts +1 -0
  314. package/utils/domUtils.js +4 -0
  315. package/utils/getGridLocalization.d.ts +1 -1
@@ -2,4 +2,4 @@ import { unstable_generateUtilityClasses as generateUtilityClasses, unstable_gen
2
2
  export function getDataGridUtilityClass(slot) {
3
3
  return generateUtilityClass('MuiDataGrid', slot);
4
4
  }
5
- export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
5
+ export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
@@ -16,15 +16,13 @@ import { GridScrollbarFillerCell as ScrollbarFiller } from '../../../components/
16
16
  import { getPinnedCellOffset } from '../../../internals/utils/getPinnedCellOffset';
17
17
  import { GridColumnHeaderSeparatorSides } from '../../../components/columnHeaders/GridColumnHeaderSeparator';
18
18
  import { gridClasses } from '../../../constants/gridClasses';
19
- import { jsx as _jsx } from "react/jsx-runtime";
20
- import { jsxs as _jsxs } from "react/jsx-runtime";
19
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
20
  export const GridColumnHeaderRow = styled('div', {
22
21
  name: 'MuiDataGrid',
23
22
  slot: 'ColumnHeaderRow',
24
23
  overridesResolver: (_, styles) => styles.columnHeaderRow
25
24
  })({
26
- display: 'flex',
27
- height: 'var(--DataGrid-headerHeight)'
25
+ display: 'flex'
28
26
  });
29
27
  export const useGridColumnHeaders = props => {
30
28
  const {
@@ -162,6 +160,7 @@ export const useGridColumnHeaders = props => {
162
160
  colDef: colDef,
163
161
  colIndex: columnIndex,
164
162
  isResizing: resizeCol === colDef.field,
163
+ isLast: columnIndex === columnPositions.length - 1,
165
164
  hasFocus: hasFocus,
166
165
  tabIndex: tabIndex,
167
166
  pinnedPosition: pinnedPosition,
@@ -1,8 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { unstable_ownerDocument as ownerDocument, unstable_useEventCallback as useEventCallback } from '@mui/utils';
4
+ import useLazyRef from '@mui/utils/useLazyRef';
4
5
  import { useTheme } from '@mui/material/styles';
5
- import { findGridCellElementsFromCol, findGridElement, findLeftPinnedCellsAfterCol, findRightPinnedCellsBeforeCol, getFieldFromHeaderElem, findHeaderElementFromField, findGroupHeaderElementsFromField, findGridHeader, findGridCells, findParentElementFromClassName, findLeftPinnedHeadersAfterCol, findRightPinnedHeadersBeforeCol } from '../../../utils/domUtils';
6
+ import { findGridCellElementsFromCol, findGridElement, findLeftPinnedCellsAfterCol, findRightPinnedCellsBeforeCol, getFieldFromHeaderElem, findHeaderElementFromField, getFieldsFromGroupHeaderElem, findGroupHeaderElementsFromField, findGridHeader, findGridCells, findParentElementFromClassName, findLeftPinnedHeadersAfterCol, findRightPinnedHeadersBeforeCol } from '../../../utils/domUtils';
6
7
  import { DEFAULT_GRID_AUTOSIZE_OPTIONS } from './gridColumnResizeApi';
7
8
  import { gridClasses } from '../../../constants/gridClasses';
8
9
  import { useGridApiEventHandler, useGridApiMethod, useGridApiOptionHandler, useGridLogger, useGridNativeEventListener, useGridSelector, useOnMount } from '../../utils';
@@ -173,6 +174,25 @@ export const columnResizeStateInitializer = state => _extends({}, state, {
173
174
  resizingColumnField: ''
174
175
  }
175
176
  });
177
+ function createResizeRefs() {
178
+ return {
179
+ colDef: undefined,
180
+ initialColWidth: 0,
181
+ initialTotalWidth: 0,
182
+ previousMouseClickEvent: undefined,
183
+ columnHeaderElement: undefined,
184
+ headerFilterElement: undefined,
185
+ groupHeaderElements: [],
186
+ cellElements: [],
187
+ leftPinnedCellsAfter: [],
188
+ rightPinnedCellsBefore: [],
189
+ fillerLeft: undefined,
190
+ fillerRight: undefined,
191
+ leftPinnedHeadersAfter: [],
192
+ rightPinnedHeadersBefore: []
193
+ };
194
+ }
195
+
176
196
  /**
177
197
  * @requires useGridColumns (method, event)
178
198
  * TODO: improve experience for last column
@@ -180,18 +200,7 @@ export const columnResizeStateInitializer = state => _extends({}, state, {
180
200
  export const useGridColumnResize = (apiRef, props) => {
181
201
  const theme = useTheme();
182
202
  const logger = useGridLogger(apiRef, 'useGridColumnResize');
183
- const colDefRef = React.useRef();
184
- const previousMouseClickEvent = React.useRef();
185
- const columnHeaderElementRef = React.useRef();
186
- const headerFilterElementRef = React.useRef();
187
- const groupHeaderElementsRef = React.useRef([]);
188
- const cellElementsRef = React.useRef([]);
189
- const leftPinnedCellsAfterRef = React.useRef([]);
190
- const rightPinnedCellsBeforeRef = React.useRef([]);
191
- const fillerLeftRef = React.useRef();
192
- const fillerRightRef = React.useRef();
193
- const leftPinnedHeadersAfterRef = React.useRef([]);
194
- const rightPinnedHeadersBeforeRef = React.useRef([]);
203
+ const refs = useLazyRef(createResizeRefs).current;
195
204
 
196
205
  // To improve accessibility, the separator has padding on both sides.
197
206
  // Clicking inside the padding area should be treated as a click in the separator.
@@ -201,22 +210,25 @@ export const useGridColumnResize = (apiRef, props) => {
201
210
  const stopResizeEventTimeout = useTimeout();
202
211
  const touchId = React.useRef();
203
212
  const updateWidth = newWidth => {
204
- logger.debug(`Updating width to ${newWidth} for col ${colDefRef.current.field}`);
205
- const prevWidth = columnHeaderElementRef.current.offsetWidth;
213
+ logger.debug(`Updating width to ${newWidth} for col ${refs.colDef.field}`);
214
+ const prevWidth = refs.columnHeaderElement.offsetWidth;
206
215
  const widthDiff = newWidth - prevWidth;
207
- colDefRef.current.computedWidth = newWidth;
208
- colDefRef.current.width = newWidth;
209
- colDefRef.current.flex = 0;
210
- columnHeaderElementRef.current.style.width = `${newWidth}px`;
211
- columnHeaderElementRef.current.style.minWidth = `${newWidth}px`;
212
- columnHeaderElementRef.current.style.maxWidth = `${newWidth}px`;
213
- const headerFilterElement = headerFilterElementRef.current;
216
+ const columnWidthDiff = newWidth - refs.initialColWidth;
217
+ const newTotalWidth = refs.initialTotalWidth + columnWidthDiff;
218
+ apiRef.current.rootElementRef?.current?.style.setProperty('--DataGrid-rowWidth', `${newTotalWidth}px`);
219
+ refs.colDef.computedWidth = newWidth;
220
+ refs.colDef.width = newWidth;
221
+ refs.colDef.flex = 0;
222
+ refs.columnHeaderElement.style.width = `${newWidth}px`;
223
+ refs.columnHeaderElement.style.minWidth = `${newWidth}px`;
224
+ refs.columnHeaderElement.style.maxWidth = `${newWidth}px`;
225
+ const headerFilterElement = refs.headerFilterElement;
214
226
  if (headerFilterElement) {
215
227
  headerFilterElement.style.width = `${newWidth}px`;
216
228
  headerFilterElement.style.minWidth = `${newWidth}px`;
217
229
  headerFilterElement.style.maxWidth = `${newWidth}px`;
218
230
  }
219
- groupHeaderElementsRef.current.forEach(element => {
231
+ refs.groupHeaderElements.forEach(element => {
220
232
  const div = element;
221
233
  let finalWidth;
222
234
  if (div.getAttribute('aria-colspan') === '1') {
@@ -230,7 +242,7 @@ export const useGridColumnResize = (apiRef, props) => {
230
242
  div.style.minWidth = finalWidth;
231
243
  div.style.maxWidth = finalWidth;
232
244
  });
233
- cellElementsRef.current.forEach(element => {
245
+ refs.cellElements.forEach(element => {
234
246
  const div = element;
235
247
  let finalWidth;
236
248
  if (div.getAttribute('aria-colspan') === '1') {
@@ -242,22 +254,22 @@ export const useGridColumnResize = (apiRef, props) => {
242
254
  }
243
255
  div.style.setProperty('--width', finalWidth);
244
256
  });
245
- const pinnedPosition = apiRef.current.unstable_applyPipeProcessors('isColumnPinned', false, colDefRef.current.field);
257
+ const pinnedPosition = apiRef.current.unstable_applyPipeProcessors('isColumnPinned', false, refs.colDef.field);
246
258
  if (pinnedPosition === GridPinnedColumnPosition.LEFT) {
247
- updateProperty(fillerLeftRef.current, 'width', widthDiff);
248
- leftPinnedCellsAfterRef.current.forEach(cell => {
259
+ updateProperty(refs.fillerLeft, 'width', widthDiff);
260
+ refs.leftPinnedCellsAfter.forEach(cell => {
249
261
  updateProperty(cell, 'left', widthDiff);
250
262
  });
251
- leftPinnedHeadersAfterRef.current.forEach(header => {
263
+ refs.leftPinnedHeadersAfter.forEach(header => {
252
264
  updateProperty(header, 'left', widthDiff);
253
265
  });
254
266
  }
255
267
  if (pinnedPosition === GridPinnedColumnPosition.RIGHT) {
256
- updateProperty(fillerRightRef.current, 'width', widthDiff);
257
- rightPinnedCellsBeforeRef.current.forEach(cell => {
268
+ updateProperty(refs.fillerRight, 'width', widthDiff);
269
+ refs.rightPinnedCellsBefore.forEach(cell => {
258
270
  updateProperty(cell, 'right', widthDiff);
259
271
  });
260
- rightPinnedHeadersBeforeRef.current.forEach(header => {
272
+ refs.rightPinnedHeadersBefore.forEach(header => {
261
273
  updateProperty(header, 'right', widthDiff);
262
274
  });
263
275
  }
@@ -267,21 +279,36 @@ export const useGridColumnResize = (apiRef, props) => {
267
279
  stopListening();
268
280
 
269
281
  // Prevent double-clicks from being interpreted as two separate clicks
270
- if (previousMouseClickEvent.current) {
271
- const prevEvent = previousMouseClickEvent.current;
282
+ if (refs.previousMouseClickEvent) {
283
+ const prevEvent = refs.previousMouseClickEvent;
272
284
  const prevTimeStamp = prevEvent.timeStamp;
273
285
  const prevClientX = prevEvent.clientX;
274
286
  const prevClientY = prevEvent.clientY;
275
287
 
276
288
  // Check if the current event is part of a double-click
277
289
  if (nativeEvent.timeStamp - prevTimeStamp < 300 && nativeEvent.clientX === prevClientX && nativeEvent.clientY === prevClientY) {
278
- previousMouseClickEvent.current = undefined;
290
+ refs.previousMouseClickEvent = undefined;
279
291
  return;
280
292
  }
281
293
  }
282
- if (colDefRef.current) {
283
- apiRef.current.setColumnWidth(colDefRef.current.field, colDefRef.current.width);
284
- logger.debug(`Updating col ${colDefRef.current.field} with new width: ${colDefRef.current.width}`);
294
+ if (refs.colDef) {
295
+ apiRef.current.setColumnWidth(refs.colDef.field, refs.colDef.width);
296
+ logger.debug(`Updating col ${refs.colDef.field} with new width: ${refs.colDef.width}`);
297
+ const columnsState = gridColumnsStateSelector(apiRef.current.state);
298
+ refs.groupHeaderElements.forEach(element => {
299
+ const fields = getFieldsFromGroupHeaderElem(element);
300
+ const div = element;
301
+ const newWidth = fields.reduce((acc, field) => {
302
+ if (columnsState.columnVisibilityModel[field] !== false) {
303
+ return acc + columnsState.lookup[field].computedWidth;
304
+ }
305
+ return acc;
306
+ }, 0);
307
+ const finalWidth = `${newWidth}px`;
308
+ div.style.width = finalWidth;
309
+ div.style.minWidth = finalWidth;
310
+ div.style.maxWidth = finalWidth;
311
+ });
285
312
  }
286
313
  stopResizeEventTimeout.start(0, () => {
287
314
  apiRef.current.publishEvent('columnResizeStop', null, nativeEvent);
@@ -289,23 +316,25 @@ export const useGridColumnResize = (apiRef, props) => {
289
316
  };
290
317
  const storeReferences = (colDef, separator, xStart) => {
291
318
  const root = apiRef.current.rootElementRef.current;
292
- colDefRef.current = colDef;
293
- columnHeaderElementRef.current = findHeaderElementFromField(apiRef.current.columnHeadersContainerRef.current, colDef.field);
319
+ refs.initialColWidth = colDef.computedWidth;
320
+ refs.initialTotalWidth = apiRef.current.getRootDimensions().rowWidth;
321
+ refs.colDef = colDef;
322
+ refs.columnHeaderElement = findHeaderElementFromField(apiRef.current.columnHeadersContainerRef.current, colDef.field);
294
323
  const headerFilterElement = root.querySelector(`.${gridClasses.headerFilterRow} [data-field="${colDef.field}"]`);
295
324
  if (headerFilterElement) {
296
- headerFilterElementRef.current = headerFilterElement;
325
+ refs.headerFilterElement = headerFilterElement;
297
326
  }
298
- groupHeaderElementsRef.current = findGroupHeaderElementsFromField(apiRef.current.columnHeadersContainerRef?.current, colDef.field);
299
- cellElementsRef.current = findGridCellElementsFromCol(columnHeaderElementRef.current, apiRef.current);
300
- fillerLeftRef.current = findGridElement(apiRef.current, 'filler--pinnedLeft');
301
- fillerRightRef.current = findGridElement(apiRef.current, 'filler--pinnedRight');
302
- const pinnedPosition = apiRef.current.unstable_applyPipeProcessors('isColumnPinned', false, colDefRef.current.field);
303
- leftPinnedCellsAfterRef.current = pinnedPosition !== GridPinnedColumnPosition.LEFT ? [] : findLeftPinnedCellsAfterCol(apiRef.current, columnHeaderElementRef.current);
304
- rightPinnedCellsBeforeRef.current = pinnedPosition !== GridPinnedColumnPosition.RIGHT ? [] : findRightPinnedCellsBeforeCol(apiRef.current, columnHeaderElementRef.current);
305
- leftPinnedHeadersAfterRef.current = pinnedPosition !== GridPinnedColumnPosition.LEFT ? [] : findLeftPinnedHeadersAfterCol(apiRef.current, columnHeaderElementRef.current);
306
- rightPinnedHeadersBeforeRef.current = pinnedPosition !== GridPinnedColumnPosition.RIGHT ? [] : findRightPinnedHeadersBeforeCol(apiRef.current, columnHeaderElementRef.current);
327
+ refs.groupHeaderElements = findGroupHeaderElementsFromField(apiRef.current.columnHeadersContainerRef?.current, colDef.field);
328
+ refs.cellElements = findGridCellElementsFromCol(refs.columnHeaderElement, apiRef.current);
329
+ refs.fillerLeft = findGridElement(apiRef.current, 'filler--pinnedLeft');
330
+ refs.fillerRight = findGridElement(apiRef.current, 'filler--pinnedRight');
331
+ const pinnedPosition = apiRef.current.unstable_applyPipeProcessors('isColumnPinned', false, refs.colDef.field);
332
+ refs.leftPinnedCellsAfter = pinnedPosition !== GridPinnedColumnPosition.LEFT ? [] : findLeftPinnedCellsAfterCol(apiRef.current, refs.columnHeaderElement);
333
+ refs.rightPinnedCellsBefore = pinnedPosition !== GridPinnedColumnPosition.RIGHT ? [] : findRightPinnedCellsBeforeCol(apiRef.current, refs.columnHeaderElement);
334
+ refs.leftPinnedHeadersAfter = pinnedPosition !== GridPinnedColumnPosition.LEFT ? [] : findLeftPinnedHeadersAfterCol(apiRef.current, refs.columnHeaderElement);
335
+ refs.rightPinnedHeadersBefore = pinnedPosition !== GridPinnedColumnPosition.RIGHT ? [] : findRightPinnedHeadersBeforeCol(apiRef.current, refs.columnHeaderElement);
307
336
  resizeDirection.current = getResizeDirection(separator, theme.direction);
308
- initialOffsetToSeparator.current = computeOffsetToSeparator(xStart, columnHeaderElementRef.current.getBoundingClientRect(), resizeDirection.current);
337
+ initialOffsetToSeparator.current = computeOffsetToSeparator(xStart, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
309
338
  };
310
339
  const handleResizeMouseUp = useEventCallback(finishResize);
311
340
  const handleResizeMouseMove = useEventCallback(nativeEvent => {
@@ -314,12 +343,12 @@ export const useGridColumnResize = (apiRef, props) => {
314
343
  handleResizeMouseUp(nativeEvent);
315
344
  return;
316
345
  }
317
- let newWidth = computeNewWidth(initialOffsetToSeparator.current, nativeEvent.clientX, columnHeaderElementRef.current.getBoundingClientRect(), resizeDirection.current);
318
- newWidth = clamp(newWidth, colDefRef.current.minWidth, colDefRef.current.maxWidth);
346
+ let newWidth = computeNewWidth(initialOffsetToSeparator.current, nativeEvent.clientX, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
347
+ newWidth = clamp(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
319
348
  updateWidth(newWidth);
320
349
  const params = {
321
- element: columnHeaderElementRef.current,
322
- colDef: colDefRef.current,
350
+ element: refs.columnHeaderElement,
351
+ colDef: refs.colDef,
323
352
  width: newWidth
324
353
  };
325
354
  apiRef.current.publishEvent('columnResize', params, nativeEvent);
@@ -342,12 +371,12 @@ export const useGridColumnResize = (apiRef, props) => {
342
371
  handleTouchEnd(nativeEvent);
343
372
  return;
344
373
  }
345
- let newWidth = computeNewWidth(initialOffsetToSeparator.current, finger.x, columnHeaderElementRef.current.getBoundingClientRect(), resizeDirection.current);
346
- newWidth = clamp(newWidth, colDefRef.current.minWidth, colDefRef.current.maxWidth);
374
+ let newWidth = computeNewWidth(initialOffsetToSeparator.current, finger.x, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
375
+ newWidth = clamp(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
347
376
  updateWidth(newWidth);
348
377
  const params = {
349
- element: columnHeaderElementRef.current,
350
- colDef: colDefRef.current,
378
+ element: refs.columnHeaderElement,
379
+ colDef: refs.colDef,
351
380
  width: newWidth
352
381
  };
353
382
  apiRef.current.publishEvent('columnResize', params, nativeEvent);
@@ -391,10 +420,10 @@ export const useGridColumnResize = (apiRef, props) => {
391
420
  setTimeout(() => {
392
421
  doc.removeEventListener('click', preventClick, true);
393
422
  }, 100);
394
- if (columnHeaderElementRef.current) {
395
- columnHeaderElementRef.current.style.pointerEvents = 'unset';
423
+ if (refs.columnHeaderElement) {
424
+ refs.columnHeaderElement.style.pointerEvents = 'unset';
396
425
  }
397
- }, [apiRef, columnHeaderElementRef, handleResizeMouseMove, handleResizeMouseUp, handleTouchMove, handleTouchEnd]);
426
+ }, [apiRef, refs, handleResizeMouseMove, handleResizeMouseUp, handleTouchMove, handleTouchEnd]);
398
427
  const handleResizeStart = React.useCallback(({
399
428
  field
400
429
  }) => {
@@ -435,7 +464,7 @@ export const useGridColumnResize = (apiRef, props) => {
435
464
  storeReferences(colDef, event.currentTarget, event.clientX);
436
465
  const doc = ownerDocument(apiRef.current.rootElementRef.current);
437
466
  doc.body.style.cursor = 'col-resize';
438
- previousMouseClickEvent.current = event.nativeEvent;
467
+ refs.previousMouseClickEvent = event.nativeEvent;
439
468
  doc.addEventListener('mousemove', handleResizeMouseMove);
440
469
  doc.addEventListener('mouseup', handleResizeMouseUp);
441
470
 
@@ -110,7 +110,7 @@ export function computeFlexColumnsWidth({
110
110
  * TODO: Unit test this function in depth and only keep basic cases for the whole grid testing.
111
111
  * TODO: Improve the `GridColDef` typing to reflect the fact that `minWidth` / `maxWidth` and `width` can't be null after the merge with the `type` default values.
112
112
  */
113
- export const hydrateColumnsWidth = (rawState, viewportInnerWidth) => {
113
+ export const hydrateColumnsWidth = (rawState, dimensions) => {
114
114
  const columnsLookup = {};
115
115
  let totalFlexUnits = 0;
116
116
  let widthAllocatedBeforeFlex = 0;
@@ -136,10 +136,11 @@ export const hydrateColumnsWidth = (rawState, viewportInnerWidth) => {
136
136
  }
137
137
  columnsLookup[columnField] = newColumn;
138
138
  });
139
- const initialFreeSpace = Math.max(viewportInnerWidth - widthAllocatedBeforeFlex, 0);
139
+ const availableWidth = dimensions === undefined ? 0 : dimensions.viewportOuterSize.width - (dimensions.hasScrollY ? dimensions.scrollbarSize : 0);
140
+ const initialFreeSpace = Math.max(availableWidth - widthAllocatedBeforeFlex, 0);
140
141
 
141
142
  // Allocate the remaining space to the flex columns
142
- if (totalFlexUnits > 0 && viewportInnerWidth > 0) {
143
+ if (totalFlexUnits > 0 && availableWidth > 0) {
143
144
  const computedColumnWidths = computeFlexColumnsWidth({
144
145
  initialFreeSpace,
145
146
  totalFlexUnits,
@@ -282,7 +283,7 @@ export const createColumnsState = ({
282
283
  }
283
284
  const columnsStateWithPreProcessing = apiRef.current.unstable_applyPipeProcessors('hydrateColumns', columnsState);
284
285
  const columnsStateWithPortableColumns = applyInitialState(columnsStateWithPreProcessing, initialState);
285
- return hydrateColumnsWidth(columnsStateWithPortableColumns, apiRef.current.getRootDimensions?.().viewportInnerSize.width ?? 0);
286
+ return hydrateColumnsWidth(columnsStateWithPortableColumns, apiRef.current.getRootDimensions?.() ?? undefined);
286
287
  };
287
288
  export function getFirstNonSpannedColumnToRender({
288
289
  firstColumnToRender,
@@ -304,10 +305,11 @@ export function getFirstNonSpannedColumnToRender({
304
305
  }
305
306
  return firstNonSpannedColumnToRender;
306
307
  }
307
- export function getTotalHeaderHeight(apiRef, headerHeight) {
308
+ export function getTotalHeaderHeight(apiRef, props) {
308
309
  const densityFactor = gridDensityFactorSelector(apiRef);
309
310
  const maxDepth = gridColumnGroupsHeaderMaxDepthSelector(apiRef);
310
311
  const isHeaderFilteringEnabled = gridHeaderFilteringEnabledSelector(apiRef);
311
- const multiplicationFactor = isHeaderFilteringEnabled ? 2 : 1;
312
- return Math.floor(headerHeight * densityFactor) * ((maxDepth ?? 0) + multiplicationFactor);
312
+ const columnHeadersHeight = Math.floor(props.columnHeaderHeight * densityFactor);
313
+ const filterHeadersHeight = isHeaderFilteringEnabled ? Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * densityFactor) : 0;
314
+ return columnHeadersHeight * (1 + (maxDepth ?? 0)) + filterHeadersHeight;
313
315
  }
@@ -133,7 +133,7 @@ export function useGridColumns(apiRef, props) {
133
133
  lookup: _extends({}, columnsState.lookup, {
134
134
  [field]: newColumn
135
135
  })
136
- }), apiRef.current.getRootDimensions().viewportInnerSize.width));
136
+ }), apiRef.current.getRootDimensions()));
137
137
  apiRef.current.publishEvent('columnWidthChange', {
138
138
  element: apiRef.current.getColumnHeaderElement(field),
139
139
  colDef: newColumn,
@@ -237,14 +237,15 @@ export function useGridColumns(apiRef, props) {
237
237
  useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
238
238
  useGridRegisterPipeProcessor(apiRef, 'preferencePanel', preferencePanelPreProcessing);
239
239
 
240
- /**
240
+ /*
241
241
  * EVENTS
242
242
  */
243
+
243
244
  const prevInnerWidth = React.useRef(null);
244
245
  const handleGridSizeChange = viewportInnerSize => {
245
246
  if (prevInnerWidth.current !== viewportInnerSize.width) {
246
247
  prevInnerWidth.current = viewportInnerSize.width;
247
- setGridColumnsState(hydrateColumnsWidth(gridColumnsStateSelector(apiRef.current.state), viewportInnerSize.width));
248
+ setGridColumnsState(hydrateColumnsWidth(gridColumnsStateSelector(apiRef.current.state), apiRef.current.getRootDimensions()));
248
249
  }
249
250
  };
250
251
  useGridApiEventHandler(apiRef, 'viewportInnerSizeChange', handleGridSizeChange);
@@ -264,7 +265,7 @@ export function useGridColumns(apiRef, props) {
264
265
  }, [apiRef, logger, setGridColumnsState]);
265
266
  useGridRegisterPipeApplier(apiRef, 'hydrateColumns', hydrateColumns);
266
267
 
267
- /**
268
+ /*
268
269
  * EFFECTS
269
270
  */
270
271
  // The effect do not track any value defined synchronously during the 1st render by hooks called after `useGridColumns`
@@ -4,6 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import { useGridLogger } from '../../utils/useGridLogger';
5
5
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
6
6
  import { gridDensitySelector } from './densitySelector';
7
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
7
8
  export const densityStateInitializer = (state, props) => _extends({}, state, {
8
9
  density: props.initialState?.density ?? props.density ?? 'standard'
9
10
  });
@@ -26,13 +27,38 @@ export const useGridDensity = (apiRef, props) => {
26
27
  density: newDensity
27
28
  }));
28
29
  });
30
+ const densityApi = {
31
+ setDensity
32
+ };
33
+ useGridApiMethod(apiRef, densityApi, 'public');
34
+ const stateExportPreProcessing = React.useCallback((prevState, context) => {
35
+ const exportedDensity = gridDensitySelector(apiRef.current.state);
36
+ const shouldExportRowCount =
37
+ // Always export if the `exportOnlyDirtyModels` property is not activated
38
+ !context.exportOnlyDirtyModels ||
39
+ // Always export if the `density` is controlled
40
+ props.density != null ||
41
+ // Always export if the `density` has been initialized
42
+ props.initialState?.density != null;
43
+ if (!shouldExportRowCount) {
44
+ return prevState;
45
+ }
46
+ return _extends({}, prevState, {
47
+ density: exportedDensity
48
+ });
49
+ }, [apiRef, props.density, props.initialState?.density]);
50
+ const stateRestorePreProcessing = React.useCallback((params, context) => {
51
+ const restoredDensity = context.stateToRestore?.density ? context.stateToRestore.density : gridDensitySelector(apiRef.current.state);
52
+ apiRef.current.setState(state => _extends({}, state, {
53
+ density: restoredDensity
54
+ }));
55
+ return params;
56
+ }, [apiRef]);
57
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
58
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
29
59
  React.useEffect(() => {
30
60
  if (props.density) {
31
61
  apiRef.current.setDensity(props.density);
32
62
  }
33
63
  }, [apiRef, props.density]);
34
- const densityApi = {
35
- setDensity
36
- };
37
- useGridApiMethod(apiRef, densityApi, 'public');
38
64
  };
@@ -29,6 +29,7 @@ const EMPTY_DIMENSIONS = {
29
29
  hasScrollY: false,
30
30
  scrollbarSize: 0,
31
31
  headerHeight: 0,
32
+ headerFilterHeight: 0,
32
33
  rowWidth: 0,
33
34
  rowHeight: 0,
34
35
  columnsTotalWidth: 0,
@@ -53,8 +54,9 @@ export function useGridDimensions(apiRef, props) {
53
54
  const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
54
55
  const rowHeight = Math.floor(props.rowHeight * densityFactor);
55
56
  const headerHeight = Math.floor(props.columnHeaderHeight * densityFactor);
57
+ const headerFilterHeight = Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * densityFactor);
56
58
  const columnsTotalWidth = roundToDecimalPlaces(gridColumnsTotalWidthSelector(apiRef), 6);
57
- const headersTotalHeight = getTotalHeaderHeight(apiRef, props.columnHeaderHeight);
59
+ const headersTotalHeight = getTotalHeaderHeight(apiRef, props);
58
60
  const leftPinnedWidth = pinnedColumns.left.reduce((w, col) => w + col.computedWidth, 0);
59
61
  const rightPinnedWidth = pinnedColumns.right.reduce((w, col) => w + col.computedWidth, 0);
60
62
  const [savedSize, setSavedSize] = React.useState();
@@ -176,6 +178,7 @@ export function useGridDimensions(apiRef, props) {
176
178
  hasScrollY,
177
179
  scrollbarSize,
178
180
  headerHeight,
181
+ headerFilterHeight,
179
182
  rowWidth,
180
183
  rowHeight,
181
184
  columnsTotalWidth,
@@ -191,7 +194,7 @@ export function useGridDimensions(apiRef, props) {
191
194
  apiRef.current.publishEvent('viewportInnerSizeChange', newDimensions.viewportInnerSize);
192
195
  }
193
196
  apiRef.current.updateRenderContext?.();
194
- }, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowsMeta.currentPageTotalHeight, rowHeight, headerHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
197
+ }, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowsMeta.currentPageTotalHeight, rowHeight, headerHeight, headerFilterHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
195
198
  const apiPublic = {
196
199
  resize,
197
200
  getRootDimensions
@@ -153,13 +153,26 @@ export const useGridCellEditing = (apiRef, props) => {
153
153
  cellToFocusAfter
154
154
  });
155
155
  }, [apiRef]);
156
+ const runIfNoFieldErrors = callback => async (...args) => {
157
+ if (callback) {
158
+ const {
159
+ id,
160
+ field
161
+ } = args[0];
162
+ const editRowsState = apiRef.current.state.editRows;
163
+ const hasFieldErrors = editRowsState[id][field]?.error;
164
+ if (!hasFieldErrors) {
165
+ callback(...args);
166
+ }
167
+ }
168
+ };
156
169
  useGridApiEventHandler(apiRef, 'cellDoubleClick', runIfEditModeIsCell(handleCellDoubleClick));
157
170
  useGridApiEventHandler(apiRef, 'cellFocusOut', runIfEditModeIsCell(handleCellFocusOut));
158
171
  useGridApiEventHandler(apiRef, 'cellKeyDown', runIfEditModeIsCell(handleCellKeyDown));
159
172
  useGridApiEventHandler(apiRef, 'cellEditStart', runIfEditModeIsCell(handleCellEditStart));
160
173
  useGridApiEventHandler(apiRef, 'cellEditStop', runIfEditModeIsCell(handleCellEditStop));
161
174
  useGridApiOptionHandler(apiRef, 'cellEditStart', props.onCellEditStart);
162
- useGridApiOptionHandler(apiRef, 'cellEditStop', props.onCellEditStop);
175
+ useGridApiOptionHandler(apiRef, 'cellEditStop', runIfNoFieldErrors(props.onCellEditStop));
163
176
  const getCellMode = React.useCallback((id, field) => {
164
177
  const editingState = gridEditRowsStateSelector(apiRef.current.state);
165
178
  const isEditing = editingState[id] && editingState[id][field];
@@ -107,7 +107,7 @@ export const useGridPrintExport = (apiRef, props) => {
107
107
  }
108
108
 
109
109
  // Expand container height to accommodate all rows
110
- const computedTotalHeight = rowsMeta.currentPageTotalHeight + getTotalHeaderHeight(apiRef, props.columnHeaderHeight) + gridToolbarElementHeight + gridFooterElementHeight;
110
+ const computedTotalHeight = rowsMeta.currentPageTotalHeight + getTotalHeaderHeight(apiRef, props) + gridToolbarElementHeight + gridFooterElementHeight;
111
111
  gridClone.style.height = `${computedTotalHeight}px`;
112
112
  // The height above does not include grid border width, so we need to exclude it
113
113
  gridClone.style.boxSizing = 'content-box';
@@ -181,7 +181,7 @@ export const useGridPrintExport = (apiRef, props) => {
181
181
  printWindow.contentWindow.print();
182
182
  });
183
183
  }
184
- }, [apiRef, doc, props.columnHeaderHeight]);
184
+ }, [apiRef, doc, props]);
185
185
  const handlePrintWindowAfterPrint = React.useCallback(printWindow => {
186
186
  // Remove the print iframe
187
187
  doc.current.body.removeChild(printWindow);
@@ -21,6 +21,12 @@ export const gridPaginationModelSelector = createSelector(gridPaginationSelector
21
21
  */
22
22
  export const gridPaginationRowCountSelector = createSelector(gridPaginationSelector, pagination => pagination.rowCount);
23
23
 
24
+ /**
25
+ * Get the pagination meta
26
+ * @category Pagination
27
+ */
28
+ export const gridPaginationMetaSelector = createSelector(gridPaginationSelector, pagination => pagination.meta);
29
+
24
30
  /**
25
31
  * Get the index of the page to render if the pagination is enabled
26
32
  * @category Pagination
@@ -37,7 +43,7 @@ export const gridPageSizeSelector = createSelector(gridPaginationModelSelector,
37
43
  * Get the amount of pages needed to display all the rows if the pagination is enabled
38
44
  * @category Pagination
39
45
  */
40
- export const gridPageCountSelector = createSelector(gridPageSizeSelector, gridPaginationRowCountSelector, (pageSize, rowCount) => getPageCount(rowCount, pageSize));
46
+ export const gridPageCountSelector = createSelector(gridPaginationModelSelector, gridPaginationRowCountSelector, (paginationModel, rowCount) => getPageCount(rowCount, paginationModel.pageSize, paginationModel.page));
41
47
 
42
48
  /**
43
49
  * Get the index of the first and the last row to include in the current page if the pagination is enabled.
@@ -1,14 +1,16 @@
1
- import { buildWarning } from '../../../utils/warning';
2
1
  import { GridSignature } from '../../utils';
3
2
  const MAX_PAGE_SIZE = 100;
4
3
  export const defaultPageSize = autoPageSize => autoPageSize ? 0 : 100;
5
- export const getPageCount = (rowCount, pageSize) => {
4
+ export const getPageCount = (rowCount, pageSize, page) => {
6
5
  if (pageSize > 0 && rowCount > 0) {
7
6
  return Math.ceil(rowCount / pageSize);
8
7
  }
8
+ if (rowCount === -1) {
9
+ // With unknown row-count, we can assume a page after the current one
10
+ return page + 2;
11
+ }
9
12
  return 0;
10
13
  };
11
- export const noRowCountInServerMode = buildWarning(["MUI X: the 'rowCount' prop is undefined while using paginationMode='server'", 'For more detail, see http://mui.com/components/data-grid/pagination/#basic-implementation'], 'error');
12
14
  export const getDefaultGridPaginationModel = autoPageSize => ({
13
15
  page: 0,
14
16
  pageSize: autoPageSize ? 0 : 100
@@ -2,14 +2,17 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import { throwIfPageSizeExceedsTheLimit, getDefaultGridPaginationModel } from './gridPaginationUtils';
3
3
  import { useGridPaginationModel } from './useGridPaginationModel';
4
4
  import { useGridRowCount } from './useGridRowCount';
5
+ import { useGridPaginationMeta } from './useGridPaginationMeta';
5
6
  export const paginationStateInitializer = (state, props) => {
6
7
  const paginationModel = _extends({}, getDefaultGridPaginationModel(props.autoPageSize), props.paginationModel ?? props.initialState?.pagination?.paginationModel);
7
8
  throwIfPageSizeExceedsTheLimit(paginationModel.pageSize, props.signature);
8
9
  const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount;
10
+ const meta = props.paginationMeta ?? props.initialState?.pagination?.meta ?? {};
9
11
  return _extends({}, state, {
10
12
  pagination: {
11
13
  paginationModel,
12
- rowCount
14
+ rowCount,
15
+ meta
13
16
  }
14
17
  });
15
18
  };
@@ -19,6 +22,7 @@ export const paginationStateInitializer = (state, props) => {
19
22
  * @requires useGridDimensions (event) - can be after
20
23
  */
21
24
  export const useGridPagination = (apiRef, props) => {
25
+ useGridPaginationMeta(apiRef, props);
22
26
  useGridPaginationModel(apiRef, props);
23
27
  useGridRowCount(apiRef, props);
24
28
  };