@mui/x-data-grid 5.15.2 → 5.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/CHANGELOG.md +177 -2
  2. package/DataGrid/DataGrid.js +3 -1
  3. package/DataGrid/useDataGridComponent.js +5 -0
  4. package/README.md +2 -1
  5. package/components/DataGridColumnHeaders.js +4 -3
  6. package/components/ErrorBoundary.d.ts +1 -0
  7. package/components/GridAutoSizer.js +7 -0
  8. package/components/GridRow.d.ts +2 -1
  9. package/components/GridRow.js +136 -85
  10. package/components/base/GridBody.js +8 -5
  11. package/components/base/GridOverlays.js +4 -7
  12. package/components/cell/GridActionsCellItem.d.ts +2 -2
  13. package/components/cell/GridBooleanCell.js +2 -1
  14. package/components/cell/GridEditBooleanCell.js +2 -1
  15. package/components/cell/GridEditDateCell.js +3 -2
  16. package/components/cell/GridEditInputCell.js +2 -1
  17. package/components/cell/GridEditSingleSelectCell.js +11 -2
  18. package/components/cell/GridSkeletonCell.d.ts +12 -0
  19. package/components/cell/GridSkeletonCell.js +60 -0
  20. package/components/cell/index.d.ts +1 -0
  21. package/components/cell/index.js +2 -1
  22. package/components/columnHeaders/GridColumnGroupHeader.d.ts +14 -0
  23. package/components/columnHeaders/GridColumnGroupHeader.js +122 -0
  24. package/components/columnHeaders/GridColumnHeaderItem.js +55 -71
  25. package/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  26. package/components/columnHeaders/GridGenericColumnHeaderItem.d.ts +32 -0
  27. package/components/columnHeaders/GridGenericColumnHeaderItem.js +104 -0
  28. package/components/columnSelection/GridCellCheckboxRenderer.js +2 -1
  29. package/components/containers/GridOverlay.js +7 -1
  30. package/components/containers/GridRoot.js +3 -3
  31. package/components/containers/GridRootStyles.js +16 -2
  32. package/components/menu/GridMenu.d.ts +3 -2
  33. package/components/menu/GridMenu.js +1 -0
  34. package/components/menu/columnMenu/GridColumnHeaderMenu.d.ts +1 -1
  35. package/components/panel/GridColumnsPanel.d.ts +6 -1
  36. package/components/panel/GridColumnsPanel.js +38 -6
  37. package/components/panel/GridPanel.d.ts +1 -1
  38. package/components/panel/GridPanel.js +1 -0
  39. package/components/panel/filterPanel/GridFilterForm.d.ts +4 -0
  40. package/components/panel/filterPanel/GridFilterForm.js +5 -0
  41. package/components/panel/filterPanel/GridFilterInputMultipleValue.d.ts +1 -1
  42. package/components/panel/filterPanel/GridFilterPanel.d.ts +4 -0
  43. package/components/panel/filterPanel/GridFilterPanel.js +5 -0
  44. package/components/toolbar/GridToolbarColumnsButton.d.ts +1 -1
  45. package/components/toolbar/GridToolbarDensitySelector.d.ts +1 -1
  46. package/components/toolbar/GridToolbarExportContainer.d.ts +1 -1
  47. package/constants/defaultGridSlotsComponents.js +2 -1
  48. package/constants/gridClasses.d.ts +24 -0
  49. package/constants/gridClasses.js +1 -1
  50. package/hooks/core/pipeProcessing/gridPipeProcessingApi.d.ts +5 -1
  51. package/hooks/features/columnGrouping/gridColumnGroupsInterfaces.d.ts +7 -0
  52. package/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  53. package/hooks/features/columnGrouping/gridColumnGroupsSelector.d.ts +7 -0
  54. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +8 -0
  55. package/hooks/features/columnGrouping/index.d.ts +2 -0
  56. package/hooks/features/columnGrouping/index.js +2 -0
  57. package/hooks/features/columnGrouping/useGridColumnGrouping.d.ts +24 -0
  58. package/hooks/features/columnGrouping/useGridColumnGrouping.js +153 -0
  59. package/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.d.ts +4 -0
  60. package/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +35 -0
  61. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +7 -6
  62. package/hooks/features/columnHeaders/useGridColumnHeaders.js +204 -9
  63. package/hooks/features/density/densitySelector.d.ts +2 -0
  64. package/hooks/features/density/densitySelector.js +3 -1
  65. package/hooks/features/density/densityState.d.ts +1 -0
  66. package/hooks/features/density/useGridDensity.d.ts +1 -1
  67. package/hooks/features/density/useGridDensity.js +45 -9
  68. package/hooks/features/dimensions/useGridDimensions.js +4 -4
  69. package/hooks/features/export/useGridPrintExport.js +3 -3
  70. package/hooks/features/filter/gridFilterSelector.d.ts +3 -3
  71. package/hooks/features/filter/gridFilterUtils.d.ts +1 -1
  72. package/hooks/features/filter/gridFilterUtils.js +55 -54
  73. package/hooks/features/filter/useGridFilter.js +1 -1
  74. package/hooks/features/index.d.ts +1 -0
  75. package/hooks/features/index.js +1 -0
  76. package/hooks/features/pagination/gridPaginationSelector.d.ts +1 -1
  77. package/hooks/features/rows/gridRowsSelector.d.ts +1 -1
  78. package/hooks/features/rows/useGridParamsApi.js +1 -1
  79. package/hooks/features/rows/useGridRows.js +65 -8
  80. package/hooks/features/rows/useGridRowsMeta.js +36 -16
  81. package/hooks/features/selection/gridSelectionSelector.d.ts +1 -1
  82. package/hooks/features/sorting/gridSortingSelector.d.ts +1 -1
  83. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +2 -2
  84. package/hooks/features/virtualization/useGridVirtualScroller.js +17 -5
  85. package/hooks/utils/useGridNativeEventListener.d.ts +1 -1
  86. package/hooks/utils/useGridNativeEventListener.js +2 -2
  87. package/hooks/utils/useGridVisibleRows.d.ts +2 -2
  88. package/index.js +1 -1
  89. package/internals/index.d.ts +2 -0
  90. package/internals/index.js +2 -0
  91. package/legacy/DataGrid/DataGrid.js +3 -1
  92. package/legacy/DataGrid/useDataGridComponent.js +5 -0
  93. package/legacy/components/DataGridColumnHeaders.js +4 -3
  94. package/legacy/components/GridAutoSizer.js +7 -0
  95. package/legacy/components/GridRow.js +138 -85
  96. package/legacy/components/base/GridBody.js +8 -5
  97. package/legacy/components/base/GridOverlays.js +4 -7
  98. package/legacy/components/cell/GridBooleanCell.js +2 -1
  99. package/legacy/components/cell/GridEditBooleanCell.js +2 -1
  100. package/legacy/components/cell/GridEditDateCell.js +3 -2
  101. package/legacy/components/cell/GridEditInputCell.js +2 -1
  102. package/legacy/components/cell/GridEditSingleSelectCell.js +11 -2
  103. package/legacy/components/cell/GridSkeletonCell.js +57 -0
  104. package/legacy/components/cell/index.js +2 -1
  105. package/legacy/components/columnHeaders/GridColumnGroupHeader.js +120 -0
  106. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +78 -88
  107. package/legacy/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  108. package/legacy/components/columnHeaders/GridGenericColumnHeaderItem.js +112 -0
  109. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +2 -1
  110. package/legacy/components/containers/GridOverlay.js +7 -1
  111. package/legacy/components/containers/GridRoot.js +3 -3
  112. package/legacy/components/containers/GridRootStyles.js +14 -5
  113. package/legacy/components/menu/GridMenu.js +1 -0
  114. package/legacy/components/panel/GridColumnsPanel.js +41 -6
  115. package/legacy/components/panel/GridPanel.js +1 -0
  116. package/legacy/components/panel/filterPanel/GridFilterForm.js +5 -0
  117. package/legacy/components/panel/filterPanel/GridFilterPanel.js +5 -0
  118. package/legacy/constants/defaultGridSlotsComponents.js +2 -1
  119. package/legacy/constants/gridClasses.js +1 -1
  120. package/legacy/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  121. package/legacy/hooks/features/columnGrouping/gridColumnGroupsSelector.js +12 -0
  122. package/legacy/hooks/features/columnGrouping/index.js +2 -0
  123. package/legacy/hooks/features/columnGrouping/useGridColumnGrouping.js +151 -0
  124. package/legacy/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +35 -0
  125. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +213 -12
  126. package/legacy/hooks/features/density/densitySelector.js +6 -0
  127. package/legacy/hooks/features/density/useGridDensity.js +44 -6
  128. package/legacy/hooks/features/dimensions/useGridDimensions.js +4 -4
  129. package/legacy/hooks/features/export/useGridPrintExport.js +3 -3
  130. package/legacy/hooks/features/filter/gridFilterUtils.js +61 -56
  131. package/legacy/hooks/features/filter/useGridFilter.js +1 -1
  132. package/legacy/hooks/features/index.js +1 -0
  133. package/legacy/hooks/features/rows/useGridParamsApi.js +1 -1
  134. package/legacy/hooks/features/rows/useGridRows.js +73 -8
  135. package/legacy/hooks/features/rows/useGridRowsMeta.js +45 -18
  136. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +31 -13
  137. package/legacy/hooks/utils/useGridNativeEventListener.js +2 -2
  138. package/legacy/index.js +1 -1
  139. package/legacy/internals/index.js +2 -0
  140. package/legacy/models/api/gridColumnGroupingApi.js +1 -0
  141. package/legacy/models/events/gridEvents.js +2 -0
  142. package/legacy/models/gridColumnGrouping.js +6 -0
  143. package/legacy/models/index.js +2 -1
  144. package/legacy/models/params/gridRenderedRowsIntervalChangeParams.js +1 -0
  145. package/legacy/models/params/index.js +2 -1
  146. package/legacy/utils/utils.js +18 -0
  147. package/models/api/gridApiCommon.d.ts +2 -1
  148. package/models/api/gridColumnGroupingApi.d.ts +19 -0
  149. package/models/api/gridColumnGroupingApi.js +1 -0
  150. package/models/api/gridDensityApi.d.ts +2 -1
  151. package/models/api/gridParamsApi.d.ts +1 -1
  152. package/models/api/gridRowApi.d.ts +6 -0
  153. package/models/api/gridRowsMetaApi.d.ts +6 -1
  154. package/models/colDef/gridColDef.d.ts +15 -1
  155. package/models/events/gridEventLookup.d.ts +7 -1
  156. package/models/events/gridEvents.d.ts +3 -1
  157. package/models/events/gridEvents.js +2 -0
  158. package/models/gridColumnGrouping.d.ts +67 -0
  159. package/models/gridColumnGrouping.js +6 -0
  160. package/models/gridRows.d.ts +5 -5
  161. package/models/gridSlotsComponent.d.ts +5 -0
  162. package/models/gridStateCommunity.d.ts +2 -1
  163. package/models/index.d.ts +1 -0
  164. package/models/index.js +2 -1
  165. package/models/params/gridCellParams.d.ts +7 -2
  166. package/models/params/gridMenuParams.d.ts +1 -2
  167. package/models/params/gridRenderedRowsIntervalChangeParams.d.ts +10 -0
  168. package/models/params/gridRenderedRowsIntervalChangeParams.js +1 -0
  169. package/models/params/index.d.ts +1 -0
  170. package/models/params/index.js +2 -1
  171. package/models/props/DataGridProps.d.ts +7 -1
  172. package/modern/DataGrid/DataGrid.js +3 -1
  173. package/modern/DataGrid/useDataGridComponent.js +5 -0
  174. package/modern/components/DataGridColumnHeaders.js +4 -3
  175. package/modern/components/GridAutoSizer.js +7 -0
  176. package/modern/components/GridRow.js +133 -84
  177. package/modern/components/base/GridBody.js +8 -5
  178. package/modern/components/base/GridOverlays.js +4 -7
  179. package/modern/components/cell/GridBooleanCell.js +2 -1
  180. package/modern/components/cell/GridEditBooleanCell.js +2 -1
  181. package/modern/components/cell/GridEditDateCell.js +3 -2
  182. package/modern/components/cell/GridEditInputCell.js +2 -1
  183. package/modern/components/cell/GridEditSingleSelectCell.js +11 -2
  184. package/modern/components/cell/GridSkeletonCell.js +60 -0
  185. package/modern/components/cell/index.js +2 -1
  186. package/modern/components/columnHeaders/GridColumnGroupHeader.js +120 -0
  187. package/modern/components/columnHeaders/GridColumnHeaderItem.js +53 -69
  188. package/modern/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  189. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +104 -0
  190. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +2 -1
  191. package/modern/components/containers/GridOverlay.js +7 -1
  192. package/modern/components/containers/GridRoot.js +3 -3
  193. package/modern/components/containers/GridRootStyles.js +16 -2
  194. package/modern/components/menu/GridMenu.js +1 -0
  195. package/modern/components/panel/GridColumnsPanel.js +38 -6
  196. package/modern/components/panel/GridPanel.js +1 -0
  197. package/modern/components/panel/filterPanel/GridFilterForm.js +5 -0
  198. package/modern/components/panel/filterPanel/GridFilterPanel.js +5 -0
  199. package/modern/constants/defaultGridSlotsComponents.js +2 -1
  200. package/modern/constants/gridClasses.js +1 -1
  201. package/modern/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  202. package/modern/hooks/features/columnGrouping/gridColumnGroupsSelector.js +8 -0
  203. package/modern/hooks/features/columnGrouping/index.js +2 -0
  204. package/modern/hooks/features/columnGrouping/useGridColumnGrouping.js +145 -0
  205. package/modern/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +29 -0
  206. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +186 -9
  207. package/modern/hooks/features/density/densitySelector.js +3 -1
  208. package/modern/hooks/features/density/useGridDensity.js +37 -9
  209. package/modern/hooks/features/dimensions/useGridDimensions.js +4 -4
  210. package/modern/hooks/features/export/useGridPrintExport.js +3 -3
  211. package/modern/hooks/features/filter/gridFilterUtils.js +54 -53
  212. package/modern/hooks/features/filter/useGridFilter.js +1 -1
  213. package/modern/hooks/features/index.js +1 -0
  214. package/modern/hooks/features/rows/useGridParamsApi.js +1 -1
  215. package/modern/hooks/features/rows/useGridRows.js +65 -8
  216. package/modern/hooks/features/rows/useGridRowsMeta.js +36 -16
  217. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +17 -5
  218. package/modern/hooks/utils/useGridNativeEventListener.js +2 -2
  219. package/modern/index.js +1 -1
  220. package/modern/internals/index.js +2 -0
  221. package/modern/models/api/gridColumnGroupingApi.js +1 -0
  222. package/modern/models/events/gridEvents.js +2 -0
  223. package/modern/models/gridColumnGrouping.js +6 -0
  224. package/modern/models/index.js +2 -1
  225. package/modern/models/params/gridRenderedRowsIntervalChangeParams.js +1 -0
  226. package/modern/models/params/index.js +2 -1
  227. package/modern/utils/utils.js +16 -0
  228. package/node/DataGrid/DataGrid.js +3 -1
  229. package/node/DataGrid/useDataGridComponent.js +7 -0
  230. package/node/components/DataGridColumnHeaders.js +4 -3
  231. package/node/components/GridAutoSizer.js +7 -0
  232. package/node/components/GridRow.js +136 -77
  233. package/node/components/base/GridBody.js +7 -4
  234. package/node/components/base/GridOverlays.js +3 -6
  235. package/node/components/cell/GridBooleanCell.js +2 -1
  236. package/node/components/cell/GridEditBooleanCell.js +2 -1
  237. package/node/components/cell/GridEditDateCell.js +3 -2
  238. package/node/components/cell/GridEditInputCell.js +2 -1
  239. package/node/components/cell/GridEditSingleSelectCell.js +11 -2
  240. package/node/components/cell/GridSkeletonCell.js +81 -0
  241. package/node/components/cell/index.js +13 -0
  242. package/node/components/columnHeaders/GridColumnGroupHeader.js +141 -0
  243. package/node/components/columnHeaders/GridColumnHeaderItem.js +53 -72
  244. package/node/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  245. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +126 -0
  246. package/node/components/columnSelection/GridCellCheckboxRenderer.js +2 -1
  247. package/node/components/containers/GridOverlay.js +7 -1
  248. package/node/components/containers/GridRoot.js +4 -4
  249. package/node/components/containers/GridRootStyles.js +16 -2
  250. package/node/components/menu/GridMenu.js +1 -0
  251. package/node/components/panel/GridColumnsPanel.js +36 -5
  252. package/node/components/panel/GridPanel.js +1 -0
  253. package/node/components/panel/filterPanel/GridFilterForm.js +5 -0
  254. package/node/components/panel/filterPanel/GridFilterPanel.js +5 -0
  255. package/node/constants/defaultGridSlotsComponents.js +1 -0
  256. package/node/constants/gridClasses.js +1 -1
  257. package/node/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +5 -0
  258. package/node/hooks/features/columnGrouping/gridColumnGroupsSelector.js +18 -0
  259. package/node/hooks/features/columnGrouping/index.js +18 -0
  260. package/node/hooks/features/columnGrouping/useGridColumnGrouping.js +182 -0
  261. package/node/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +55 -0
  262. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +207 -8
  263. package/node/hooks/features/density/densitySelector.js +6 -2
  264. package/node/hooks/features/density/useGridDensity.js +48 -9
  265. package/node/hooks/features/dimensions/useGridDimensions.js +3 -3
  266. package/node/hooks/features/export/useGridPrintExport.js +2 -2
  267. package/node/hooks/features/filter/gridFilterUtils.js +55 -55
  268. package/node/hooks/features/filter/useGridFilter.js +1 -1
  269. package/node/hooks/features/index.js +13 -0
  270. package/node/hooks/features/rows/useGridParamsApi.js +1 -1
  271. package/node/hooks/features/rows/useGridRows.js +60 -7
  272. package/node/hooks/features/rows/useGridRowsMeta.js +35 -15
  273. package/node/hooks/features/virtualization/useGridVirtualScroller.js +17 -5
  274. package/node/hooks/utils/useGridNativeEventListener.js +2 -2
  275. package/node/index.js +1 -1
  276. package/node/internals/index.js +22 -0
  277. package/node/models/api/gridColumnGroupingApi.js +5 -0
  278. package/node/models/events/gridEvents.js +2 -0
  279. package/node/models/gridColumnGrouping.js +13 -0
  280. package/node/models/index.js +13 -0
  281. package/node/models/params/gridRenderedRowsIntervalChangeParams.js +5 -0
  282. package/node/models/params/index.js +13 -0
  283. package/node/utils/utils.js +18 -0
  284. package/package.json +3 -3
  285. package/utils/utils.d.ts +1 -0
  286. package/utils/utils.js +16 -0
@@ -1,7 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
4
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
5
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
6
+ var _excluded = ["sort"];
4
7
  import * as React from 'react';
8
+ import PropTypes from 'prop-types';
5
9
  import { unstable_composeClasses as composeClasses } from '@mui/material';
6
10
  import IconButton from '@mui/material/IconButton';
7
11
  import { switchClasses } from '@mui/material/Switch';
@@ -60,7 +64,9 @@ var GridColumnsPanelRowRoot = styled('div', {
60
64
  var GridIconButtonRoot = styled(IconButton)({
61
65
  justifyContent: 'flex-end'
62
66
  });
63
- export function GridColumnsPanel(props) {
67
+ var collator = new Intl.Collator();
68
+
69
+ function GridColumnsPanel(props) {
64
70
  var _rootProps$components, _rootProps$components3, _rootProps$components4;
65
71
 
66
72
  var apiRef = useGridApiContext();
@@ -79,6 +85,26 @@ export function GridColumnsPanel(props) {
79
85
  };
80
86
  var classes = useUtilityClasses(ownerState);
81
87
 
88
+ var sort = props.sort,
89
+ other = _objectWithoutProperties(props, _excluded);
90
+
91
+ var sortedColumns = React.useMemo(function () {
92
+ switch (sort) {
93
+ case 'asc':
94
+ return _toConsumableArray(columns).sort(function (a, b) {
95
+ return collator.compare(a.headerName || a.field, b.headerName || b.field);
96
+ });
97
+
98
+ case 'desc':
99
+ return _toConsumableArray(columns).sort(function (a, b) {
100
+ return -collator.compare(a.headerName || a.field, b.headerName || b.field);
101
+ });
102
+
103
+ default:
104
+ return columns;
105
+ }
106
+ }, [columns, sort]);
107
+
82
108
  var toggleColumn = function toggleColumn(event) {
83
109
  var _ref3 = event.target,
84
110
  field = _ref3.name;
@@ -115,18 +141,18 @@ export function GridColumnsPanel(props) {
115
141
  }, []);
116
142
  var currentColumns = React.useMemo(function () {
117
143
  if (!searchValue) {
118
- return columns;
144
+ return sortedColumns;
119
145
  }
120
146
 
121
147
  var searchValueToCheck = searchValue.toLowerCase();
122
- return columns.filter(function (column) {
148
+ return sortedColumns.filter(function (column) {
123
149
  return (column.headerName || column.field).toLowerCase().indexOf(searchValueToCheck) > -1;
124
150
  });
125
- }, [columns, searchValue]);
151
+ }, [sortedColumns, searchValue]);
126
152
  React.useEffect(function () {
127
153
  searchInputRef.current.focus();
128
154
  }, []);
129
- return /*#__PURE__*/_jsxs(GridPanelWrapper, _extends({}, props, {
155
+ return /*#__PURE__*/_jsxs(GridPanelWrapper, _extends({}, other, {
130
156
  children: [/*#__PURE__*/_jsx(GridPanelHeader, {
131
157
  children: /*#__PURE__*/_jsx(rootProps.components.BaseTextField, _extends({
132
158
  label: apiRef.current.getLocaleText('columnsPanelTextFieldLabel'),
@@ -181,4 +207,13 @@ export function GridColumnsPanel(props) {
181
207
  }))]
182
208
  })]
183
209
  }));
184
- }
210
+ }
211
+
212
+ process.env.NODE_ENV !== "production" ? GridColumnsPanel.propTypes = {
213
+ // ----------------------------- Warning --------------------------------
214
+ // | These PropTypes are generated from the TypeScript type definitions |
215
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
216
+ // ----------------------------------------------------------------------
217
+ sort: PropTypes.oneOf(['asc', 'desc'])
218
+ } : void 0;
219
+ export { GridColumnsPanel };
@@ -113,6 +113,7 @@ process.env.NODE_ENV !== "production" ? GridPanel.propTypes = {
113
113
  // | These PropTypes are generated from the TypeScript type definitions |
114
114
  // | To update them edit the TypeScript types and run "yarn proptypes" |
115
115
  // ----------------------------------------------------------------------
116
+ children: PropTypes.node,
116
117
 
117
118
  /**
118
119
  * Override or extend the styles applied to the component.
@@ -386,6 +386,11 @@ process.env.NODE_ENV !== "production" ? GridFilterForm.propTypes = {
386
386
  */
387
387
  applyMultiFilterOperatorChanges: PropTypes.func.isRequired,
388
388
 
389
+ /**
390
+ * @ignore - do not document.
391
+ */
392
+ children: PropTypes.node,
393
+
389
394
  /**
390
395
  * Props passed to the column input component.
391
396
  * @default {}
@@ -129,6 +129,11 @@ process.env.NODE_ENV !== "production" ? GridFilterPanel.propTypes = {
129
129
  // | To update them edit the TypeScript types and run "yarn proptypes" |
130
130
  // ----------------------------------------------------------------------
131
131
 
132
+ /**
133
+ * @ignore - do not document.
134
+ */
135
+ children: PropTypes.node,
136
+
132
137
  /**
133
138
  * Changes how the options in the columns selector should be ordered.
134
139
  * If not specified, the order is derived from the `columns` prop.
@@ -7,7 +7,7 @@ import MUISwitch from '@mui/material/Switch';
7
7
  import MUIButton from '@mui/material/Button';
8
8
  import MUITooltip from '@mui/material/Tooltip';
9
9
  import MUIPopper from '@mui/material/Popper';
10
- import { GridArrowDownwardIcon, GridArrowUpwardIcon, GridCell, GridCheckIcon, GridCloseIcon, GridColumnIcon, GridColumnMenu, GridColumnsPanel, GridFilterAltIcon, GridFilterListIcon, GridFilterPanel, GridFooter, GridHeader, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridPreferencesPanel, GridRow, GridSaveAltIcon, GridSeparatorIcon, GridTableRowsIcon, GridTripleDotsVerticalIcon, GridViewHeadlineIcon, GridViewStreamIcon, GridMoreVertIcon, GridExpandMoreIcon, GridKeyboardArrowRight, GridAddIcon, GridRemoveIcon, GridDragIcon, GridColumnHeaderFilterIconButton, GridSearchIcon } from '../components';
10
+ import { GridArrowDownwardIcon, GridArrowUpwardIcon, GridCell, GridSkeletonCell, GridCheckIcon, GridCloseIcon, GridColumnIcon, GridColumnMenu, GridColumnsPanel, GridFilterAltIcon, GridFilterListIcon, GridFilterPanel, GridFooter, GridHeader, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridPreferencesPanel, GridRow, GridSaveAltIcon, GridSeparatorIcon, GridTableRowsIcon, GridTripleDotsVerticalIcon, GridViewHeadlineIcon, GridViewStreamIcon, GridMoreVertIcon, GridExpandMoreIcon, GridKeyboardArrowRight, GridAddIcon, GridRemoveIcon, GridDragIcon, GridColumnHeaderFilterIconButton, GridSearchIcon } from '../components';
11
11
  import { GridColumnUnsortedIcon } from '../components/columnHeaders/GridColumnUnsortedIcon';
12
12
  import { ErrorOverlay } from '../components/ErrorOverlay';
13
13
  import { GridNoResultsOverlay } from '../components/GridNoResultsOverlay';
@@ -52,6 +52,7 @@ export var DATA_GRID_DEFAULT_SLOTS_COMPONENTS = _extends({}, DEFAULT_GRID_ICON_S
52
52
  BaseTooltip: MUITooltip,
53
53
  BasePopper: MUIPopper,
54
54
  Cell: GridCell,
55
+ SkeletonCell: GridSkeletonCell,
55
56
  ColumnHeaderFilterIconButton: GridColumnHeaderFilterIconButton,
56
57
  ColumnMenu: GridColumnMenu,
57
58
  ErrorOverlay: ErrorOverlay,
@@ -2,4 +2,4 @@ import { generateUtilityClasses, generateUtilityClass } from '@mui/material';
2
2
  export function getDataGridUtilityClass(slot) {
3
3
  return generateUtilityClass('MuiDataGrid', slot);
4
4
  }
5
- export var gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'autoHeight', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell', 'cellContent', 'cellCheckbox', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLinkOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
5
+ export var gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'autoHeight', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell', 'cellContent', 'cellCheckbox', 'cellSkeleton', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLinkOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
@@ -0,0 +1,12 @@
1
+ import { createSelector } from '../../../utils/createSelector';
2
+
3
+ /**
4
+ * @category ColumnGrouping
5
+ * @ignore - do not document.
6
+ */
7
+ export var gridColumnGroupingSelector = function gridColumnGroupingSelector(state) {
8
+ return state.columnGrouping;
9
+ };
10
+ export var gridColumnGroupsLookupSelector = createSelector(gridColumnGroupingSelector, function (columnGrouping) {
11
+ return columnGrouping.lookup;
12
+ });
@@ -0,0 +1,2 @@
1
+ export * from './gridColumnGroupsSelector';
2
+ export {};
@@ -0,0 +1,151 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
5
+ var _excluded = ["groupId", "children"];
6
+ import * as React from 'react';
7
+ import { isLeaf } from '../../../models/gridColumnGrouping';
8
+ import { gridColumnGroupsLookupSelector } from './gridColumnGroupsSelector';
9
+ import { gridColumnLookupSelector } from '../columns/gridColumnsSelector';
10
+ import { useGridApiMethod } from '../../utils/useGridApiMethod';
11
+ export function hasGroupPath(lookupElement) {
12
+ return lookupElement.groupPath !== undefined;
13
+ }
14
+
15
+ // This is the recurrence function that help writing `unwrapGroupingColumnModel()`
16
+ var recurrentUnwrapGroupingColumnModel = function recurrentUnwrapGroupingColumnModel(columnGroupNode, parents, unwrappedGroupingModelToComplet) {
17
+ if (isLeaf(columnGroupNode)) {
18
+ if (unwrappedGroupingModelToComplet[columnGroupNode.field] !== undefined) {
19
+ throw new Error(["MUI: columnGroupingModel contains duplicated field", "column field ".concat(columnGroupNode.field, " occurrs two times in the grouping model:"), "- ".concat(unwrappedGroupingModelToComplet[columnGroupNode.field].join(' > ')), "- ".concat(parents.join(' > '))].join('\n'));
20
+ }
21
+
22
+ unwrappedGroupingModelToComplet[columnGroupNode.field] = parents;
23
+ return;
24
+ }
25
+
26
+ var groupId = columnGroupNode.groupId,
27
+ children = columnGroupNode.children;
28
+ children.forEach(function (child) {
29
+ recurrentUnwrapGroupingColumnModel(child, [].concat(_toConsumableArray(parents), [groupId]), unwrappedGroupingModelToComplet);
30
+ });
31
+ };
32
+ /**
33
+ * This is a function that provide for each column the array of its parents.
34
+ * Parents are ordered from the root to the leaf.
35
+ * @param columnGroupingModel The model such as provided in DataGrid props
36
+ * @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
37
+ */
38
+
39
+
40
+ export var unwrapGroupingColumnModel = function unwrapGroupingColumnModel(columnGroupingModel) {
41
+ if (!columnGroupingModel) {
42
+ return {};
43
+ }
44
+
45
+ var unwrappedSubTree = {};
46
+ columnGroupingModel.forEach(function (columnGroupNode) {
47
+ recurrentUnwrapGroupingColumnModel(columnGroupNode, [], unwrappedSubTree);
48
+ });
49
+ return unwrappedSubTree;
50
+ };
51
+
52
+ var createGroupLookup = function createGroupLookup(columnGroupingModel) {
53
+ var groupLookup = {};
54
+ columnGroupingModel.forEach(function (node) {
55
+ if (isLeaf(node)) {
56
+ return;
57
+ }
58
+
59
+ var groupId = node.groupId,
60
+ children = node.children,
61
+ other = _objectWithoutProperties(node, _excluded);
62
+
63
+ if (!groupId) {
64
+ throw new Error('MUI: An element of the columnGroupingModel does not have either `field` or `groupId`.');
65
+ }
66
+
67
+ if (!children) {
68
+ console.warn("MUI: group groupId=".concat(groupId, " has no children."));
69
+ }
70
+
71
+ var groupParam = _extends({}, other, {
72
+ groupId: groupId
73
+ });
74
+
75
+ var subTreeLookup = createGroupLookup(children);
76
+
77
+ if (subTreeLookup[groupId] !== undefined || groupLookup[groupId] !== undefined) {
78
+ throw new Error("MUI: The groupId ".concat(groupId, " is used multiple times in the columnGroupingModel."));
79
+ }
80
+
81
+ groupLookup = _extends({}, groupLookup, subTreeLookup, _defineProperty({}, groupId, groupParam));
82
+ });
83
+ return _extends({}, groupLookup);
84
+ };
85
+
86
+ export var columnGroupsStateInitializer = function columnGroupsStateInitializer(state, props) {
87
+ var _props$columnGrouping;
88
+
89
+ var groupLookup = createGroupLookup((_props$columnGrouping = props.columnGroupingModel) != null ? _props$columnGrouping : []);
90
+ return _extends({}, state, {
91
+ columnGrouping: {
92
+ lookup: groupLookup,
93
+ groupCollapsedModel: {}
94
+ }
95
+ });
96
+ };
97
+ /**
98
+ * @requires useGridColumns (method, event)
99
+ * @requires useGridParamsApi (method)
100
+ */
101
+
102
+ export var useGridColumnGrouping = function useGridColumnGrouping(apiRef, props) {
103
+ var _props$experimentalFe2;
104
+
105
+ /**
106
+ * API METHODS
107
+ */
108
+ var getColumnGroupPath = React.useCallback(function (field) {
109
+ var _columnLookup$field$g, _columnLookup$field;
110
+
111
+ var columnLookup = gridColumnLookupSelector(apiRef);
112
+ return (_columnLookup$field$g = (_columnLookup$field = columnLookup[field]) == null ? void 0 : _columnLookup$field.groupPath) != null ? _columnLookup$field$g : [];
113
+ }, [apiRef]);
114
+ var getAllGroupDetails = React.useCallback(function () {
115
+ var columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
116
+ return columnGroupLookup;
117
+ }, [apiRef]);
118
+ var columnGroupingApi = {
119
+ unstable_getColumnGroupPath: getColumnGroupPath,
120
+ unstable_getAllGroupDetails: getAllGroupDetails
121
+ };
122
+ useGridApiMethod(apiRef, columnGroupingApi, 'GridColumnGroupingApi');
123
+ /**
124
+ * EFFECTS
125
+ */
126
+ // The effect does not track any value defined synchronously during the 1st render by hooks called after `useGridColumns`
127
+ // As a consequence, the state generated by the 1st run of this useEffect will always be equal to the initialization one
128
+
129
+ var isFirstRender = React.useRef(true);
130
+ React.useEffect(function () {
131
+ var _props$experimentalFe, _props$columnGrouping2;
132
+
133
+ if (isFirstRender.current) {
134
+ isFirstRender.current = false;
135
+ return;
136
+ }
137
+
138
+ if (!((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.columnGrouping)) {
139
+ return;
140
+ }
141
+
142
+ var groupLookup = createGroupLookup((_props$columnGrouping2 = props.columnGroupingModel) != null ? _props$columnGrouping2 : []);
143
+ apiRef.current.setState(function (state) {
144
+ return _extends({}, state, {
145
+ columnGrouping: _extends({}, state.columnGrouping, {
146
+ lookup: groupLookup
147
+ })
148
+ });
149
+ });
150
+ }, [apiRef, props.columnGroupingModel, (_props$experimentalFe2 = props.experimentalFeatures) == null ? void 0 : _props$experimentalFe2.columnGrouping]);
151
+ };
@@ -0,0 +1,35 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
4
+ import { isDeepEqual } from '../../../utils/utils';
5
+ import { unwrapGroupingColumnModel, hasGroupPath } from './useGridColumnGrouping';
6
+ export var useGridColumnGroupingPreProcessors = function useGridColumnGroupingPreProcessors(apiRef, props) {
7
+ var _props$experimentalFe2;
8
+
9
+ var addHeaderGroups = React.useCallback(function (columnsState) {
10
+ var _props$experimentalFe;
11
+
12
+ if (!((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.columnGrouping)) {
13
+ return columnsState;
14
+ }
15
+
16
+ var unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel);
17
+ columnsState.all.forEach(function (field) {
18
+ var _unwrappedGroupingMod, _unwrappedGroupingMod2;
19
+
20
+ var newGroupPath = (_unwrappedGroupingMod = unwrappedGroupingModel[field]) != null ? _unwrappedGroupingMod : [];
21
+ var lookupElement = columnsState.lookup[field];
22
+
23
+ if (hasGroupPath(lookupElement) && isDeepEqual(newGroupPath, lookupElement == null ? void 0 : lookupElement.groupPath)) {
24
+ // Avoid modifying the pointer to allow shadow comparison in https://github.com/mui/mui-x/blob/f90afbf10a1264ee8b453d7549dd7cdd6110a4ed/packages/grid/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts#L446:L453
25
+ return;
26
+ }
27
+
28
+ columnsState.lookup[field] = _extends({}, columnsState.lookup[field], {
29
+ groupPath: (_unwrappedGroupingMod2 = unwrappedGroupingModel[field]) != null ? _unwrappedGroupingMod2 : []
30
+ });
31
+ });
32
+ return columnsState;
33
+ }, [props.columnGroupingModel, (_props$experimentalFe2 = props.experimentalFeatures) == null ? void 0 : _props$experimentalFe2.columnGrouping]);
34
+ useGridRegisterPipeProcessor(apiRef, 'hydrateColumns', addHeaderGroups);
35
+ };
@@ -1,14 +1,16 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
2
  import _extends from "@babel/runtime/helpers/esm/extends";
2
3
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
4
  import * as React from 'react';
4
5
  import * as ReactDOM from 'react-dom';
5
6
  import { useForkRef } from '@mui/material/utils';
7
+ import { styled } from '@mui/material/styles';
6
8
  import { defaultMemoize } from 'reselect';
7
9
  import { useGridApiContext } from '../../utils/useGridApiContext';
8
10
  import { useGridSelector } from '../../utils/useGridSelector';
9
11
  import { gridVisibleColumnDefinitionsSelector, gridColumnPositionsSelector } from '../columns/gridColumnsSelector';
10
12
  import { gridTabIndexColumnHeaderSelector, gridTabIndexCellSelector, gridFocusColumnHeaderSelector } from '../focus/gridFocusStateSelector';
11
- import { gridDensityHeaderHeightSelector } from '../density/densitySelector';
13
+ import { gridDensityHeaderHeightSelector, gridDensityHeaderGroupingMaxDepthSelector, gridDensityTotalHeaderHeightSelector } from '../density/densitySelector';
12
14
  import { gridFilterActiveItemsLookupSelector } from '../filter/gridFilterSelector';
13
15
  import { gridSortColumnLookupSelector } from '../sorting/gridSortingSelector';
14
16
  import { gridColumnMenuSelector } from '../columnMenu/columnMenuSelector';
@@ -18,7 +20,22 @@ import { GridColumnHeaderItem } from '../../../components/columnHeaders/GridColu
18
20
  import { getFirstColumnIndexToRender } from '../columns/gridColumnsUtils';
19
21
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
20
22
  import { getRenderableIndexes } from '../virtualization/useGridVirtualScroller';
23
+ import { GridColumnGroupHeader } from '../../../components/columnHeaders/GridColumnGroupHeader';
24
+ import { isDeepEqual } from '../../../utils/utils'; // TODO: add the possibility to switch this value if needed for customization
25
+
21
26
  import { jsx as _jsx } from "react/jsx-runtime";
27
+ var MERGE_EMPTY_CELLS = true;
28
+ var GridColumnHeaderRow = styled('div', {
29
+ name: 'MuiDataGrid',
30
+ slot: 'ColumnHeaderRow',
31
+ overridesResolver: function overridesResolver(props, styles) {
32
+ return styles.columnHeaderRow;
33
+ }
34
+ })(function () {
35
+ return {
36
+ display: 'flex'
37
+ };
38
+ });
22
39
 
23
40
  function isUIEvent(event) {
24
41
  return !!event.target;
@@ -46,6 +63,8 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
46
63
  var cellTabIndexState = useGridSelector(apiRef, gridTabIndexCellSelector);
47
64
  var columnHeaderFocus = useGridSelector(apiRef, gridFocusColumnHeaderSelector);
48
65
  var headerHeight = useGridSelector(apiRef, gridDensityHeaderHeightSelector);
66
+ var headerGroupingMaxDepth = useGridSelector(apiRef, gridDensityHeaderGroupingMaxDepthSelector);
67
+ var totalHeaderHeight = useGridSelector(apiRef, gridDensityTotalHeaderHeightSelector);
49
68
  var filterColumnLookup = useGridSelector(apiRef, gridFilterActiveItemsLookupSelector);
50
69
  var sortColumnLookup = useGridSelector(apiRef, gridSortColumnLookupSelector);
51
70
  var columnMenuState = useGridSelector(apiRef, gridColumnMenuSelector);
@@ -163,11 +182,9 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
163
182
  useGridApiEventHandler(apiRef, 'columnResizeStop', handleColumnResizeStop);
164
183
  useGridApiEventHandler(apiRef, 'columnHeaderDragStart', handleColumnReorderStart);
165
184
  useGridApiEventHandler(apiRef, 'columnHeaderDragEnd', handleColumnReorderStop);
166
- useGridApiEventHandler(apiRef, 'rowsScroll', handleScroll);
167
-
168
- var getColumns = function getColumns(params) {
169
- var other = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
185
+ useGridApiEventHandler(apiRef, 'rowsScroll', handleScroll); // Helper for computation common between getColumnHeaders and getColumnGroupHeaders
170
186
 
187
+ var getColumnsToRender = function getColumnsToRender(params) {
171
188
  var _ref2 = params || {},
172
189
  _ref2$renderContext = _ref2.renderContext,
173
190
  nextRenderContext = _ref2$renderContext === void 0 ? renderContext : _ref2$renderContext,
@@ -180,8 +197,6 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
180
197
  return null;
181
198
  }
182
199
 
183
- var columns = [];
184
-
185
200
  var _getRenderableIndexes3 = getRenderableIndexes({
186
201
  firstIndex: nextRenderContext.firstRowIndex,
187
202
  lastIndex: nextRenderContext.lastRowIndex,
@@ -204,6 +219,26 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
204
219
  });
205
220
  var lastColumnToRender = Math.min(nextRenderContext.lastColumnIndex + rootProps.columnBuffer, maxLastColumn);
206
221
  var renderedColumns = visibleColumns.slice(firstColumnToRender, lastColumnToRender);
222
+ return {
223
+ renderedColumns: renderedColumns,
224
+ firstColumnToRender: firstColumnToRender,
225
+ lastColumnToRender: lastColumnToRender,
226
+ minFirstColumn: minFirstColumn,
227
+ maxLastColumn: maxLastColumn
228
+ };
229
+ };
230
+
231
+ var getColumnHeaders = function getColumnHeaders(params) {
232
+ var other = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
233
+ var columnsToRender = getColumnsToRender(params);
234
+
235
+ if (columnsToRender == null) {
236
+ return null;
237
+ }
238
+
239
+ var renderedColumns = columnsToRender.renderedColumns,
240
+ firstColumnToRender = columnsToRender.firstColumnToRender;
241
+ var columns = [];
207
242
 
208
243
  for (var i = 0; i < renderedColumns.length; i += 1) {
209
244
  var column = renderedColumns[i];
@@ -228,17 +263,184 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
228
263
  }, other), column.field));
229
264
  }
230
265
 
266
+ return /*#__PURE__*/_jsx(GridColumnHeaderRow, {
267
+ role: "row",
268
+ "aria-rowindex": headerGroupingMaxDepth + 1,
269
+ children: columns
270
+ });
271
+ };
272
+
273
+ var getParents = function getParents() {
274
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
275
+ var depth = arguments.length > 1 ? arguments[1] : undefined;
276
+ return path.slice(0, depth + 1);
277
+ };
278
+
279
+ var getColumnGroupHeaders = function getColumnGroupHeaders(params) {
280
+ if (headerGroupingMaxDepth === 0) {
281
+ return null;
282
+ }
283
+
284
+ var columnsToRender = getColumnsToRender(params);
285
+
286
+ if (columnsToRender == null) {
287
+ return null;
288
+ }
289
+
290
+ var renderedColumns = columnsToRender.renderedColumns,
291
+ firstColumnToRender = columnsToRender.firstColumnToRender,
292
+ lastColumnToRender = columnsToRender.lastColumnToRender,
293
+ maxLastColumn = columnsToRender.maxLastColumn;
294
+ var columns = [];
295
+ var headerToRender = [];
296
+
297
+ var _loop = function _loop(depth) {
298
+ var _visibleColumns$first, _visibleColumns$first2, _visibleColumns$first3;
299
+
300
+ // Initialize the header line with a grouping item containing all the columns on the left of the virtualization which are in the same group as the first group to render
301
+ var initialHeader = [];
302
+ var leftOverflow = 0;
303
+ var columnIndex = firstColumnToRender - 1;
304
+ var firstColumnToRenderGroup = (_visibleColumns$first = visibleColumns[firstColumnToRender]) == null ? void 0 : (_visibleColumns$first2 = _visibleColumns$first.groupPath) == null ? void 0 : _visibleColumns$first2[depth]; // The array of parent is used to manage empty grouping cell
305
+ // When two empty grouping cell are next to each other, we merge them if the belong to the same group.
306
+
307
+ var firstColumnToRenderGroupParents = getParents((_visibleColumns$first3 = visibleColumns[firstColumnToRender]) == null ? void 0 : _visibleColumns$first3.groupPath, depth);
308
+
309
+ while (firstColumnToRenderGroup !== null && columnIndex >= minColumnIndex && (_visibleColumns$colum = visibleColumns[columnIndex]) != null && _visibleColumns$colum.groupPath && isDeepEqual(getParents((_visibleColumns$colum2 = visibleColumns[columnIndex]) == null ? void 0 : _visibleColumns$colum2.groupPath, depth), firstColumnToRenderGroupParents)) {
310
+ var _visibleColumns$colum, _visibleColumns$colum2, _column$computedWidth;
311
+
312
+ var column = visibleColumns[columnIndex];
313
+ leftOverflow += (_column$computedWidth = column.computedWidth) != null ? _column$computedWidth : 0;
314
+
315
+ if (initialHeader.length === 0) {
316
+ var _column$computedWidth2;
317
+
318
+ initialHeader.push({
319
+ width: (_column$computedWidth2 = column.computedWidth) != null ? _column$computedWidth2 : 0,
320
+ fields: [column.field],
321
+ groupId: firstColumnToRenderGroup,
322
+ groupParents: firstColumnToRenderGroupParents,
323
+ colIndex: columnIndex
324
+ });
325
+ } else {
326
+ var _column$computedWidth3;
327
+
328
+ initialHeader[0].width += (_column$computedWidth3 = column.computedWidth) != null ? _column$computedWidth3 : 0;
329
+ initialHeader[0].fields.push(column.field);
330
+ initialHeader[0].colIndex = columnIndex;
331
+ }
332
+
333
+ columnIndex -= 1;
334
+ }
335
+
336
+ var depthInfo = renderedColumns.reduce(function (aggregated, column, i) {
337
+ var _column$computedWidth7;
338
+
339
+ var lastItem = aggregated[aggregated.length - 1];
340
+
341
+ if (column.groupPath && column.groupPath.length > depth) {
342
+ var _column$computedWidth5;
343
+
344
+ if (lastItem && lastItem.groupId === column.groupPath[depth]) {
345
+ var _column$computedWidth4;
346
+
347
+ // Merge with the previous columns
348
+ return [].concat(_toConsumableArray(aggregated.slice(0, aggregated.length - 1)), [_extends({}, lastItem, {
349
+ width: lastItem.width + ((_column$computedWidth4 = column.computedWidth) != null ? _column$computedWidth4 : 0),
350
+ fields: [].concat(_toConsumableArray(lastItem.fields), [column.field])
351
+ })]);
352
+ } // Create a new grouping
353
+
354
+
355
+ return [].concat(_toConsumableArray(aggregated), [{
356
+ groupId: column.groupPath[depth],
357
+ groupParents: getParents(column.groupPath, depth),
358
+ width: (_column$computedWidth5 = column.computedWidth) != null ? _column$computedWidth5 : 0,
359
+ fields: [column.field],
360
+ colIndex: firstColumnToRender + i
361
+ }]);
362
+ }
363
+
364
+ if (MERGE_EMPTY_CELLS && lastItem && lastItem.groupId === null && isDeepEqual(getParents(column.groupPath, depth), lastItem.groupParents)) {
365
+ var _column$computedWidth6;
366
+
367
+ // We merge with previous column
368
+ return [].concat(_toConsumableArray(aggregated.slice(0, aggregated.length - 1)), [_extends({}, lastItem, {
369
+ width: lastItem.width + ((_column$computedWidth6 = column.computedWidth) != null ? _column$computedWidth6 : 0),
370
+ fields: [].concat(_toConsumableArray(lastItem.fields), [column.field])
371
+ })]);
372
+ } // We create new empty cell
373
+
374
+
375
+ return [].concat(_toConsumableArray(aggregated), [{
376
+ groupId: null,
377
+ groupParents: getParents(column.groupPath, depth),
378
+ width: (_column$computedWidth7 = column.computedWidth) != null ? _column$computedWidth7 : 0,
379
+ fields: [column.field],
380
+ colIndex: firstColumnToRender + i
381
+ }]);
382
+ }, initialHeader);
383
+ columnIndex = lastColumnToRender;
384
+ var lastColumnToRenderGroup = depthInfo[depthInfo.length - 1].groupId;
385
+
386
+ while (lastColumnToRenderGroup !== null && columnIndex < maxLastColumn && (_visibleColumns$colum3 = visibleColumns[columnIndex]) != null && _visibleColumns$colum3.groupPath && ((_visibleColumns$colum4 = visibleColumns[columnIndex]) == null ? void 0 : (_visibleColumns$colum5 = _visibleColumns$colum4.groupPath) == null ? void 0 : _visibleColumns$colum5[depth]) === lastColumnToRenderGroup) {
387
+ var _visibleColumns$colum3, _visibleColumns$colum4, _visibleColumns$colum5, _column$computedWidth8;
388
+
389
+ var _column = visibleColumns[columnIndex];
390
+ depthInfo[depthInfo.length - 1].width += (_column$computedWidth8 = _column.computedWidth) != null ? _column$computedWidth8 : 0;
391
+ depthInfo[depthInfo.length - 1].fields.push(_column.field);
392
+ columnIndex += 1;
393
+ }
394
+
395
+ headerToRender.push({
396
+ leftOverflow: leftOverflow,
397
+ elements: _toConsumableArray(depthInfo)
398
+ });
399
+ };
400
+
401
+ for (var depth = 0; depth < headerGroupingMaxDepth; depth += 1) {
402
+ _loop(depth);
403
+ }
404
+
405
+ headerToRender.forEach(function (depthInfo, depthIndex) {
406
+ columns.push( /*#__PURE__*/_jsx(GridColumnHeaderRow, {
407
+ style: {
408
+ height: "".concat(headerHeight, "px"),
409
+ transform: "translateX(-".concat(depthInfo.leftOverflow, "px)")
410
+ },
411
+ role: "row",
412
+ "aria-rowindex": depthIndex + 1,
413
+ children: depthInfo.elements.map(function (_ref3, groupIndex) {
414
+ var groupId = _ref3.groupId,
415
+ width = _ref3.width,
416
+ fields = _ref3.fields,
417
+ colIndex = _ref3.colIndex;
418
+ return /*#__PURE__*/_jsx(GridColumnGroupHeader, {
419
+ groupId: groupId,
420
+ width: width,
421
+ fields: fields,
422
+ colIndex: colIndex,
423
+ depth: depthIndex,
424
+ isLastColumn: colIndex === visibleColumns.length - fields.length,
425
+ extendRowFullWidth: !rootProps.disableExtendRowFullWidth,
426
+ maxDepth: headerToRender.length,
427
+ height: headerHeight
428
+ }, groupIndex);
429
+ })
430
+ }, depthIndex));
431
+ });
231
432
  return columns;
232
433
  };
233
434
 
234
435
  var rootStyle = {
235
- minHeight: headerHeight,
236
- maxHeight: headerHeight,
436
+ minHeight: totalHeaderHeight,
437
+ maxHeight: totalHeaderHeight,
237
438
  lineHeight: "".concat(headerHeight, "px")
238
439
  };
239
440
  return {
240
441
  renderContext: renderContext,
241
- getColumns: getColumns,
442
+ getColumnHeaders: getColumnHeaders,
443
+ getColumnGroupHeaders: getColumnGroupHeaders,
242
444
  isDragging: !!dragCol,
243
445
  getRootProps: function getRootProps() {
244
446
  var other = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -249,8 +451,7 @@ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
249
451
  getInnerProps: function getInnerProps() {
250
452
  return {
251
453
  ref: handleInnerRef,
252
- 'aria-rowindex': 1,
253
- role: 'row'
454
+ role: 'rowgroup'
254
455
  };
255
456
  }
256
457
  };