@mui/x-data-grid 5.15.3 → 5.16.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 (149) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/DataGrid/DataGrid.js +2 -0
  3. package/DataGrid/useDataGridComponent.js +5 -0
  4. package/components/DataGridColumnHeaders.js +4 -3
  5. package/components/GridRow.js +5 -3
  6. package/components/base/GridBody.js +8 -5
  7. package/components/base/GridOverlays.js +3 -3
  8. package/components/columnHeaders/GridColumnGroupHeader.d.ts +14 -0
  9. package/components/columnHeaders/GridColumnGroupHeader.js +122 -0
  10. package/components/columnHeaders/GridColumnHeaderItem.js +55 -71
  11. package/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  12. package/components/columnHeaders/GridGenericColumnHeaderItem.d.ts +32 -0
  13. package/components/columnHeaders/GridGenericColumnHeaderItem.js +104 -0
  14. package/components/containers/GridRoot.js +3 -3
  15. package/components/containers/GridRootStyles.js +14 -2
  16. package/components/panel/GridPanel.d.ts +1 -1
  17. package/constants/gridClasses.d.ts +16 -0
  18. package/constants/gridClasses.js +1 -1
  19. package/hooks/features/columnGrouping/gridColumnGroupsInterfaces.d.ts +7 -0
  20. package/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  21. package/hooks/features/columnGrouping/gridColumnGroupsSelector.d.ts +7 -0
  22. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +8 -0
  23. package/hooks/features/columnGrouping/index.d.ts +2 -0
  24. package/hooks/features/columnGrouping/index.js +2 -0
  25. package/hooks/features/columnGrouping/useGridColumnGrouping.d.ts +24 -0
  26. package/hooks/features/columnGrouping/useGridColumnGrouping.js +153 -0
  27. package/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.d.ts +4 -0
  28. package/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +35 -0
  29. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +7 -6
  30. package/hooks/features/columnHeaders/useGridColumnHeaders.js +204 -9
  31. package/hooks/features/density/densitySelector.d.ts +2 -0
  32. package/hooks/features/density/densitySelector.js +3 -1
  33. package/hooks/features/density/densityState.d.ts +1 -0
  34. package/hooks/features/density/useGridDensity.d.ts +1 -1
  35. package/hooks/features/density/useGridDensity.js +45 -9
  36. package/hooks/features/dimensions/useGridDimensions.js +4 -4
  37. package/hooks/features/export/useGridPrintExport.js +3 -3
  38. package/hooks/features/filter/gridFilterSelector.d.ts +3 -3
  39. package/hooks/features/index.d.ts +1 -0
  40. package/hooks/features/index.js +1 -0
  41. package/hooks/features/pagination/gridPaginationSelector.d.ts +1 -1
  42. package/hooks/features/rows/gridRowsSelector.d.ts +1 -1
  43. package/hooks/features/selection/gridSelectionSelector.d.ts +1 -1
  44. package/hooks/features/sorting/gridSortingSelector.d.ts +1 -1
  45. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  46. package/hooks/utils/useGridVisibleRows.d.ts +2 -2
  47. package/index.js +1 -1
  48. package/internals/index.d.ts +2 -0
  49. package/internals/index.js +2 -0
  50. package/legacy/DataGrid/DataGrid.js +2 -0
  51. package/legacy/DataGrid/useDataGridComponent.js +5 -0
  52. package/legacy/components/DataGridColumnHeaders.js +4 -3
  53. package/legacy/components/GridRow.js +4 -3
  54. package/legacy/components/base/GridBody.js +8 -5
  55. package/legacy/components/base/GridOverlays.js +3 -3
  56. package/legacy/components/columnHeaders/GridColumnGroupHeader.js +120 -0
  57. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +78 -88
  58. package/legacy/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  59. package/legacy/components/columnHeaders/GridGenericColumnHeaderItem.js +112 -0
  60. package/legacy/components/containers/GridRoot.js +3 -3
  61. package/legacy/components/containers/GridRootStyles.js +11 -2
  62. package/legacy/constants/gridClasses.js +1 -1
  63. package/legacy/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  64. package/legacy/hooks/features/columnGrouping/gridColumnGroupsSelector.js +12 -0
  65. package/legacy/hooks/features/columnGrouping/index.js +2 -0
  66. package/legacy/hooks/features/columnGrouping/useGridColumnGrouping.js +151 -0
  67. package/legacy/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +35 -0
  68. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +213 -12
  69. package/legacy/hooks/features/density/densitySelector.js +6 -0
  70. package/legacy/hooks/features/density/useGridDensity.js +44 -6
  71. package/legacy/hooks/features/dimensions/useGridDimensions.js +4 -4
  72. package/legacy/hooks/features/export/useGridPrintExport.js +3 -3
  73. package/legacy/hooks/features/index.js +1 -0
  74. package/legacy/index.js +1 -1
  75. package/legacy/internals/index.js +2 -0
  76. package/legacy/models/api/gridColumnGroupingApi.js +1 -0
  77. package/legacy/models/gridColumnGrouping.js +6 -0
  78. package/legacy/models/index.js +2 -1
  79. package/models/api/gridApiCommon.d.ts +2 -1
  80. package/models/api/gridColumnGroupingApi.d.ts +19 -0
  81. package/models/api/gridColumnGroupingApi.js +1 -0
  82. package/models/api/gridDensityApi.d.ts +2 -1
  83. package/models/colDef/gridColDef.d.ts +15 -1
  84. package/models/gridColumnGrouping.d.ts +67 -0
  85. package/models/gridColumnGrouping.js +6 -0
  86. package/models/gridRows.d.ts +5 -5
  87. package/models/gridStateCommunity.d.ts +2 -1
  88. package/models/index.d.ts +1 -0
  89. package/models/index.js +2 -1
  90. package/models/props/DataGridProps.d.ts +6 -0
  91. package/modern/DataGrid/DataGrid.js +2 -0
  92. package/modern/DataGrid/useDataGridComponent.js +5 -0
  93. package/modern/components/DataGridColumnHeaders.js +4 -3
  94. package/modern/components/GridRow.js +5 -3
  95. package/modern/components/base/GridBody.js +8 -5
  96. package/modern/components/base/GridOverlays.js +3 -3
  97. package/modern/components/columnHeaders/GridColumnGroupHeader.js +120 -0
  98. package/modern/components/columnHeaders/GridColumnHeaderItem.js +53 -69
  99. package/modern/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  100. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +104 -0
  101. package/modern/components/containers/GridRoot.js +3 -3
  102. package/modern/components/containers/GridRootStyles.js +14 -2
  103. package/modern/constants/gridClasses.js +1 -1
  104. package/modern/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +1 -0
  105. package/modern/hooks/features/columnGrouping/gridColumnGroupsSelector.js +8 -0
  106. package/modern/hooks/features/columnGrouping/index.js +2 -0
  107. package/modern/hooks/features/columnGrouping/useGridColumnGrouping.js +145 -0
  108. package/modern/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +29 -0
  109. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +186 -9
  110. package/modern/hooks/features/density/densitySelector.js +3 -1
  111. package/modern/hooks/features/density/useGridDensity.js +37 -9
  112. package/modern/hooks/features/dimensions/useGridDimensions.js +4 -4
  113. package/modern/hooks/features/export/useGridPrintExport.js +3 -3
  114. package/modern/hooks/features/index.js +1 -0
  115. package/modern/index.js +1 -1
  116. package/modern/internals/index.js +2 -0
  117. package/modern/models/api/gridColumnGroupingApi.js +1 -0
  118. package/modern/models/gridColumnGrouping.js +6 -0
  119. package/modern/models/index.js +2 -1
  120. package/node/DataGrid/DataGrid.js +2 -0
  121. package/node/DataGrid/useDataGridComponent.js +7 -0
  122. package/node/components/DataGridColumnHeaders.js +4 -3
  123. package/node/components/GridRow.js +6 -3
  124. package/node/components/base/GridBody.js +7 -4
  125. package/node/components/base/GridOverlays.js +2 -2
  126. package/node/components/columnHeaders/GridColumnGroupHeader.js +141 -0
  127. package/node/components/columnHeaders/GridColumnHeaderItem.js +53 -72
  128. package/node/components/columnHeaders/GridColumnHeadersInner.js +2 -1
  129. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +126 -0
  130. package/node/components/containers/GridRoot.js +4 -4
  131. package/node/components/containers/GridRootStyles.js +14 -2
  132. package/node/constants/gridClasses.js +1 -1
  133. package/node/hooks/features/columnGrouping/gridColumnGroupsInterfaces.js +5 -0
  134. package/node/hooks/features/columnGrouping/gridColumnGroupsSelector.js +18 -0
  135. package/node/hooks/features/columnGrouping/index.js +18 -0
  136. package/node/hooks/features/columnGrouping/useGridColumnGrouping.js +182 -0
  137. package/node/hooks/features/columnGrouping/useGridColumnGroupingPreProcessors.js +55 -0
  138. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +207 -8
  139. package/node/hooks/features/density/densitySelector.js +6 -2
  140. package/node/hooks/features/density/useGridDensity.js +48 -9
  141. package/node/hooks/features/dimensions/useGridDimensions.js +3 -3
  142. package/node/hooks/features/export/useGridPrintExport.js +2 -2
  143. package/node/hooks/features/index.js +13 -0
  144. package/node/index.js +1 -1
  145. package/node/internals/index.js +22 -0
  146. package/node/models/api/gridColumnGroupingApi.js +5 -0
  147. package/node/models/gridColumnGrouping.js +13 -0
  148. package/node/models/index.js +13 -0
  149. package/package.json +3 -3
@@ -2,12 +2,13 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import * as ReactDOM from 'react-dom';
4
4
  import { useForkRef } from '@mui/material/utils';
5
+ import { styled } from '@mui/material/styles';
5
6
  import { defaultMemoize } from 'reselect';
6
7
  import { useGridApiContext } from '../../utils/useGridApiContext';
7
8
  import { useGridSelector } from '../../utils/useGridSelector';
8
9
  import { gridVisibleColumnDefinitionsSelector, gridColumnPositionsSelector } from '../columns/gridColumnsSelector';
9
10
  import { gridTabIndexColumnHeaderSelector, gridTabIndexCellSelector, gridFocusColumnHeaderSelector } from '../focus/gridFocusStateSelector';
10
- import { gridDensityHeaderHeightSelector } from '../density/densitySelector';
11
+ import { gridDensityHeaderHeightSelector, gridDensityHeaderGroupingMaxDepthSelector, gridDensityTotalHeaderHeightSelector } from '../density/densitySelector';
11
12
  import { gridFilterActiveItemsLookupSelector } from '../filter/gridFilterSelector';
12
13
  import { gridSortColumnLookupSelector } from '../sorting/gridSortingSelector';
13
14
  import { gridColumnMenuSelector } from '../columnMenu/columnMenuSelector';
@@ -17,7 +18,18 @@ import { GridColumnHeaderItem } from '../../../components/columnHeaders/GridColu
17
18
  import { getFirstColumnIndexToRender } from '../columns/gridColumnsUtils';
18
19
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
19
20
  import { getRenderableIndexes } from '../virtualization/useGridVirtualScroller';
21
+ import { GridColumnGroupHeader } from '../../../components/columnHeaders/GridColumnGroupHeader';
22
+ import { isDeepEqual } from '../../../utils/utils'; // TODO: add the possibility to switch this value if needed for customization
23
+
20
24
  import { jsx as _jsx } from "react/jsx-runtime";
25
+ const MERGE_EMPTY_CELLS = true;
26
+ const GridColumnHeaderRow = styled('div', {
27
+ name: 'MuiDataGrid',
28
+ slot: 'ColumnHeaderRow',
29
+ overridesResolver: (props, styles) => styles.columnHeaderRow
30
+ })(() => ({
31
+ display: 'flex'
32
+ }));
21
33
 
22
34
  function isUIEvent(event) {
23
35
  return !!event.target;
@@ -37,6 +49,8 @@ export const useGridColumnHeaders = props => {
37
49
  const cellTabIndexState = useGridSelector(apiRef, gridTabIndexCellSelector);
38
50
  const columnHeaderFocus = useGridSelector(apiRef, gridFocusColumnHeaderSelector);
39
51
  const headerHeight = useGridSelector(apiRef, gridDensityHeaderHeightSelector);
52
+ const headerGroupingMaxDepth = useGridSelector(apiRef, gridDensityHeaderGroupingMaxDepthSelector);
53
+ const totalHeaderHeight = useGridSelector(apiRef, gridDensityTotalHeaderHeightSelector);
40
54
  const filterColumnLookup = useGridSelector(apiRef, gridFilterActiveItemsLookupSelector);
41
55
  const sortColumnLookup = useGridSelector(apiRef, gridSortColumnLookupSelector);
42
56
  const columnMenuState = useGridSelector(apiRef, gridColumnMenuSelector);
@@ -132,9 +146,9 @@ export const useGridColumnHeaders = props => {
132
146
  useGridApiEventHandler(apiRef, 'columnResizeStop', handleColumnResizeStop);
133
147
  useGridApiEventHandler(apiRef, 'columnHeaderDragStart', handleColumnReorderStart);
134
148
  useGridApiEventHandler(apiRef, 'columnHeaderDragEnd', handleColumnReorderStop);
135
- useGridApiEventHandler(apiRef, 'rowsScroll', handleScroll);
149
+ useGridApiEventHandler(apiRef, 'rowsScroll', handleScroll); // Helper for computation common between getColumnHeaders and getColumnGroupHeaders
136
150
 
137
- const getColumns = (params, other = {}) => {
151
+ const getColumnsToRender = params => {
138
152
  const {
139
153
  renderContext: nextRenderContext = renderContext,
140
154
  minFirstColumn = minColumnIndex,
@@ -145,7 +159,6 @@ export const useGridColumnHeaders = props => {
145
159
  return null;
146
160
  }
147
161
 
148
- const columns = [];
149
162
  const [firstRowToRender, lastRowToRender] = getRenderableIndexes({
150
163
  firstIndex: nextRenderContext.firstRowIndex,
151
164
  lastIndex: nextRenderContext.lastRowIndex,
@@ -164,6 +177,27 @@ export const useGridColumnHeaders = props => {
164
177
  });
165
178
  const lastColumnToRender = Math.min(nextRenderContext.lastColumnIndex + rootProps.columnBuffer, maxLastColumn);
166
179
  const renderedColumns = visibleColumns.slice(firstColumnToRender, lastColumnToRender);
180
+ return {
181
+ renderedColumns,
182
+ firstColumnToRender,
183
+ lastColumnToRender,
184
+ minFirstColumn,
185
+ maxLastColumn
186
+ };
187
+ };
188
+
189
+ const getColumnHeaders = (params, other = {}) => {
190
+ const columnsToRender = getColumnsToRender(params);
191
+
192
+ if (columnsToRender == null) {
193
+ return null;
194
+ }
195
+
196
+ const {
197
+ renderedColumns,
198
+ firstColumnToRender
199
+ } = columnsToRender;
200
+ const columns = [];
167
201
 
168
202
  for (let i = 0; i < renderedColumns.length; i += 1) {
169
203
  const column = renderedColumns[i];
@@ -188,25 +222,186 @@ export const useGridColumnHeaders = props => {
188
222
  }, other), column.field));
189
223
  }
190
224
 
225
+ return /*#__PURE__*/_jsx(GridColumnHeaderRow, {
226
+ role: "row",
227
+ "aria-rowindex": headerGroupingMaxDepth + 1,
228
+ children: columns
229
+ });
230
+ };
231
+
232
+ const getParents = (path = [], depth) => path.slice(0, depth + 1);
233
+
234
+ const getColumnGroupHeaders = params => {
235
+ if (headerGroupingMaxDepth === 0) {
236
+ return null;
237
+ }
238
+
239
+ const columnsToRender = getColumnsToRender(params);
240
+
241
+ if (columnsToRender == null) {
242
+ return null;
243
+ }
244
+
245
+ const {
246
+ renderedColumns,
247
+ firstColumnToRender,
248
+ lastColumnToRender,
249
+ maxLastColumn
250
+ } = columnsToRender;
251
+ const columns = [];
252
+ const headerToRender = [];
253
+
254
+ for (let depth = 0; depth < headerGroupingMaxDepth; depth += 1) {
255
+ var _visibleColumns$first, _visibleColumns$first2, _visibleColumns$first3;
256
+
257
+ // 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
258
+ const initialHeader = [];
259
+ let leftOverflow = 0;
260
+ let columnIndex = firstColumnToRender - 1;
261
+ const 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
262
+ // When two empty grouping cell are next to each other, we merge them if the belong to the same group.
263
+
264
+ const firstColumnToRenderGroupParents = getParents((_visibleColumns$first3 = visibleColumns[firstColumnToRender]) == null ? void 0 : _visibleColumns$first3.groupPath, depth);
265
+
266
+ 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)) {
267
+ var _visibleColumns$colum, _visibleColumns$colum2, _column$computedWidth;
268
+
269
+ const column = visibleColumns[columnIndex];
270
+ leftOverflow += (_column$computedWidth = column.computedWidth) != null ? _column$computedWidth : 0;
271
+
272
+ if (initialHeader.length === 0) {
273
+ var _column$computedWidth2;
274
+
275
+ initialHeader.push({
276
+ width: (_column$computedWidth2 = column.computedWidth) != null ? _column$computedWidth2 : 0,
277
+ fields: [column.field],
278
+ groupId: firstColumnToRenderGroup,
279
+ groupParents: firstColumnToRenderGroupParents,
280
+ colIndex: columnIndex
281
+ });
282
+ } else {
283
+ var _column$computedWidth3;
284
+
285
+ initialHeader[0].width += (_column$computedWidth3 = column.computedWidth) != null ? _column$computedWidth3 : 0;
286
+ initialHeader[0].fields.push(column.field);
287
+ initialHeader[0].colIndex = columnIndex;
288
+ }
289
+
290
+ columnIndex -= 1;
291
+ }
292
+
293
+ const depthInfo = renderedColumns.reduce((aggregated, column, i) => {
294
+ var _column$computedWidth7;
295
+
296
+ const lastItem = aggregated[aggregated.length - 1];
297
+
298
+ if (column.groupPath && column.groupPath.length > depth) {
299
+ var _column$computedWidth5;
300
+
301
+ if (lastItem && lastItem.groupId === column.groupPath[depth]) {
302
+ var _column$computedWidth4;
303
+
304
+ // Merge with the previous columns
305
+ return [...aggregated.slice(0, aggregated.length - 1), _extends({}, lastItem, {
306
+ width: lastItem.width + ((_column$computedWidth4 = column.computedWidth) != null ? _column$computedWidth4 : 0),
307
+ fields: [...lastItem.fields, column.field]
308
+ })];
309
+ } // Create a new grouping
310
+
311
+
312
+ return [...aggregated, {
313
+ groupId: column.groupPath[depth],
314
+ groupParents: getParents(column.groupPath, depth),
315
+ width: (_column$computedWidth5 = column.computedWidth) != null ? _column$computedWidth5 : 0,
316
+ fields: [column.field],
317
+ colIndex: firstColumnToRender + i
318
+ }];
319
+ }
320
+
321
+ if (MERGE_EMPTY_CELLS && lastItem && lastItem.groupId === null && isDeepEqual(getParents(column.groupPath, depth), lastItem.groupParents)) {
322
+ var _column$computedWidth6;
323
+
324
+ // We merge with previous column
325
+ return [...aggregated.slice(0, aggregated.length - 1), _extends({}, lastItem, {
326
+ width: lastItem.width + ((_column$computedWidth6 = column.computedWidth) != null ? _column$computedWidth6 : 0),
327
+ fields: [...lastItem.fields, column.field]
328
+ })];
329
+ } // We create new empty cell
330
+
331
+
332
+ return [...aggregated, {
333
+ groupId: null,
334
+ groupParents: getParents(column.groupPath, depth),
335
+ width: (_column$computedWidth7 = column.computedWidth) != null ? _column$computedWidth7 : 0,
336
+ fields: [column.field],
337
+ colIndex: firstColumnToRender + i
338
+ }];
339
+ }, initialHeader);
340
+ columnIndex = lastColumnToRender;
341
+ const lastColumnToRenderGroup = depthInfo[depthInfo.length - 1].groupId;
342
+
343
+ 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) {
344
+ var _visibleColumns$colum3, _visibleColumns$colum4, _visibleColumns$colum5, _column$computedWidth8;
345
+
346
+ const column = visibleColumns[columnIndex];
347
+ depthInfo[depthInfo.length - 1].width += (_column$computedWidth8 = column.computedWidth) != null ? _column$computedWidth8 : 0;
348
+ depthInfo[depthInfo.length - 1].fields.push(column.field);
349
+ columnIndex += 1;
350
+ }
351
+
352
+ headerToRender.push({
353
+ leftOverflow,
354
+ elements: [...depthInfo]
355
+ });
356
+ }
357
+
358
+ headerToRender.forEach((depthInfo, depthIndex) => {
359
+ columns.push( /*#__PURE__*/_jsx(GridColumnHeaderRow, {
360
+ style: {
361
+ height: `${headerHeight}px`,
362
+ transform: `translateX(-${depthInfo.leftOverflow}px)`
363
+ },
364
+ role: "row",
365
+ "aria-rowindex": depthIndex + 1,
366
+ children: depthInfo.elements.map(({
367
+ groupId,
368
+ width,
369
+ fields,
370
+ colIndex
371
+ }, groupIndex) => {
372
+ return /*#__PURE__*/_jsx(GridColumnGroupHeader, {
373
+ groupId: groupId,
374
+ width: width,
375
+ fields: fields,
376
+ colIndex: colIndex,
377
+ depth: depthIndex,
378
+ isLastColumn: colIndex === visibleColumns.length - fields.length,
379
+ extendRowFullWidth: !rootProps.disableExtendRowFullWidth,
380
+ maxDepth: headerToRender.length,
381
+ height: headerHeight
382
+ }, groupIndex);
383
+ })
384
+ }, depthIndex));
385
+ });
191
386
  return columns;
192
387
  };
193
388
 
194
389
  const rootStyle = {
195
- minHeight: headerHeight,
196
- maxHeight: headerHeight,
390
+ minHeight: totalHeaderHeight,
391
+ maxHeight: totalHeaderHeight,
197
392
  lineHeight: `${headerHeight}px`
198
393
  };
199
394
  return {
200
395
  renderContext,
201
- getColumns,
396
+ getColumnHeaders,
397
+ getColumnGroupHeaders,
202
398
  isDragging: !!dragCol,
203
399
  getRootProps: (other = {}) => _extends({
204
400
  style: rootStyle
205
401
  }, other),
206
402
  getInnerProps: () => ({
207
403
  ref: handleInnerRef,
208
- 'aria-rowindex': 1,
209
- role: 'row'
404
+ role: 'rowgroup'
210
405
  })
211
406
  };
212
407
  };
@@ -3,4 +3,6 @@ export declare const gridDensitySelector: (state: GridStateCommunity) => import(
3
3
  export declare const gridDensityValueSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridDensity>;
4
4
  export declare const gridDensityRowHeightSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
5
5
  export declare const gridDensityHeaderHeightSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
6
+ export declare const gridDensityHeaderGroupingMaxDepthSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
6
7
  export declare const gridDensityFactorSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
8
+ export declare const gridDensityTotalHeaderHeightSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
@@ -3,4 +3,6 @@ export const gridDensitySelector = state => state.density;
3
3
  export const gridDensityValueSelector = createSelector(gridDensitySelector, density => density.value);
4
4
  export const gridDensityRowHeightSelector = createSelector(gridDensitySelector, density => density.rowHeight);
5
5
  export const gridDensityHeaderHeightSelector = createSelector(gridDensitySelector, density => density.headerHeight);
6
- export const gridDensityFactorSelector = createSelector(gridDensitySelector, density => density.factor);
6
+ export const gridDensityHeaderGroupingMaxDepthSelector = createSelector(gridDensitySelector, density => density.headerGroupingMaxDepth);
7
+ export const gridDensityFactorSelector = createSelector(gridDensitySelector, density => density.factor);
8
+ export const gridDensityTotalHeaderHeightSelector = createSelector(gridDensitySelector, density => density.headerHeight * (1 + density.headerGroupingMaxDepth));
@@ -3,5 +3,6 @@ export interface GridDensityState {
3
3
  value: GridDensity;
4
4
  rowHeight: number;
5
5
  headerHeight: number;
6
+ headerGroupingMaxDepth: number;
6
7
  factor: number;
7
8
  }
@@ -4,5 +4,5 @@ import { DataGridProcessedProps } from '../../../models/props/DataGridProps';
4
4
  import { GridStateInitializer } from '../../utils/useGridInitializeState';
5
5
  export declare const COMPACT_DENSITY_FACTOR = 0.7;
6
6
  export declare const COMFORTABLE_DENSITY_FACTOR = 1.3;
7
- export declare const densityStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'density' | 'headerHeight' | 'rowHeight'>>;
7
+ export declare const densityStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'density' | 'headerHeight' | 'rowHeight' | 'columnGroupingModel'>>;
8
8
  export declare const useGridDensity: (apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'headerHeight' | 'rowHeight' | 'density'>) => void;
@@ -5,16 +5,20 @@ import { useGridLogger } from '../../utils/useGridLogger';
5
5
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
6
6
  import { gridDensitySelector } from './densitySelector';
7
7
  import { isDeepEqual } from '../../../utils/utils';
8
+ import { useGridSelector } from '../../utils/useGridSelector';
9
+ import { gridVisibleColumnDefinitionsSelector } from '../columns';
10
+ import { unwrapGroupingColumnModel } from '../columnGrouping/useGridColumnGrouping';
8
11
  export const COMPACT_DENSITY_FACTOR = 0.7;
9
12
  export const COMFORTABLE_DENSITY_FACTOR = 1.3; // TODO v6: revise keeping headerHeight and rowHeight in state
10
13
 
11
- const getUpdatedDensityState = (newDensity, newHeaderHeight, newRowHeight) => {
14
+ const getUpdatedDensityState = (newDensity, newHeaderHeight, newRowHeight, newMaxDepth) => {
12
15
  switch (newDensity) {
13
16
  case GridDensityTypes.Compact:
14
17
  return {
15
18
  value: newDensity,
16
19
  headerHeight: Math.floor(newHeaderHeight * COMPACT_DENSITY_FACTOR),
17
20
  rowHeight: Math.floor(newRowHeight * COMPACT_DENSITY_FACTOR),
21
+ headerGroupingMaxDepth: newMaxDepth,
18
22
  factor: COMPACT_DENSITY_FACTOR
19
23
  };
20
24
 
@@ -23,6 +27,7 @@ const getUpdatedDensityState = (newDensity, newHeaderHeight, newRowHeight) => {
23
27
  value: newDensity,
24
28
  headerHeight: Math.floor(newHeaderHeight * COMFORTABLE_DENSITY_FACTOR),
25
29
  rowHeight: Math.floor(newRowHeight * COMFORTABLE_DENSITY_FACTOR),
30
+ headerGroupingMaxDepth: newMaxDepth,
26
31
  factor: COMFORTABLE_DENSITY_FACTOR
27
32
  };
28
33
 
@@ -31,21 +36,52 @@ const getUpdatedDensityState = (newDensity, newHeaderHeight, newRowHeight) => {
31
36
  value: newDensity,
32
37
  headerHeight: newHeaderHeight,
33
38
  rowHeight: newRowHeight,
39
+ headerGroupingMaxDepth: newMaxDepth,
34
40
  factor: 1
35
41
  };
36
42
  }
37
43
  };
38
44
 
39
- export const densityStateInitializer = (state, props) => _extends({}, state, {
40
- density: getUpdatedDensityState(props.density, props.headerHeight, props.rowHeight)
41
- });
45
+ export const densityStateInitializer = (state, props) => {
46
+ // TODO: think about improving this initialization. Could it be done in the useColumn initializer?
47
+ // TODO: manage to remove ts-ignore
48
+ let maxDepth;
49
+
50
+ if (props.columnGroupingModel == null || Object.keys(props.columnGroupingModel).length === 0) {
51
+ maxDepth = 0;
52
+ } else {
53
+ const unwrappedGroupingColumnModel = unwrapGroupingColumnModel(props.columnGroupingModel);
54
+ const columnsState = state.columns;
55
+ const visibleColumns = columnsState.all.filter(field => columnsState.columnVisibilityModel[field] !== false);
56
+
57
+ if (visibleColumns.length === 0) {
58
+ maxDepth = 0;
59
+ } else {
60
+ maxDepth = Math.max(...visibleColumns.map(field => {
61
+ var _unwrappedGroupingCol, _unwrappedGroupingCol2;
62
+
63
+ return (_unwrappedGroupingCol = (_unwrappedGroupingCol2 = unwrappedGroupingColumnModel[field]) == null ? void 0 : _unwrappedGroupingCol2.length) != null ? _unwrappedGroupingCol : 0;
64
+ }));
65
+ }
66
+ }
67
+
68
+ return _extends({}, state, {
69
+ density: getUpdatedDensityState(props.density, props.headerHeight, props.rowHeight, maxDepth)
70
+ });
71
+ };
42
72
  export const useGridDensity = (apiRef, props) => {
73
+ const visibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
74
+ const maxDepth = visibleColumns.length > 0 ? Math.max(...visibleColumns.map(column => {
75
+ var _column$groupPath$len, _column$groupPath;
76
+
77
+ return (_column$groupPath$len = (_column$groupPath = column.groupPath) == null ? void 0 : _column$groupPath.length) != null ? _column$groupPath$len : 0;
78
+ })) : 0;
43
79
  const logger = useGridLogger(apiRef, 'useDensity');
44
- const setDensity = React.useCallback((newDensity, newHeaderHeight = props.headerHeight, newRowHeight = props.rowHeight) => {
80
+ const setDensity = React.useCallback((newDensity, newHeaderHeight = props.headerHeight, newRowHeight = props.rowHeight, newMaxDepth = maxDepth) => {
45
81
  logger.debug(`Set grid density to ${newDensity}`);
46
82
  apiRef.current.setState(state => {
47
83
  const currentDensityState = gridDensitySelector(state);
48
- const newDensityState = getUpdatedDensityState(newDensity, newHeaderHeight, newRowHeight);
84
+ const newDensityState = getUpdatedDensityState(newDensity, newHeaderHeight, newRowHeight, newMaxDepth);
49
85
 
50
86
  if (isDeepEqual(currentDensityState, newDensityState)) {
51
87
  return state;
@@ -56,10 +92,10 @@ export const useGridDensity = (apiRef, props) => {
56
92
  });
57
93
  });
58
94
  apiRef.current.forceUpdate();
59
- }, [logger, apiRef, props.headerHeight, props.rowHeight]);
95
+ }, [logger, apiRef, props.headerHeight, props.rowHeight, maxDepth]);
60
96
  React.useEffect(() => {
61
- apiRef.current.setDensity(props.density, props.headerHeight, props.rowHeight);
62
- }, [apiRef, props.density, props.rowHeight, props.headerHeight]);
97
+ apiRef.current.setDensity(props.density, props.headerHeight, props.rowHeight, maxDepth);
98
+ }, [apiRef, props.density, props.rowHeight, props.headerHeight, maxDepth]);
63
99
  const densityApi = {
64
100
  setDensity
65
101
  };
@@ -4,7 +4,7 @@ import { useGridApiEventHandler, useGridApiOptionHandler } from '../../utils/use
4
4
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
5
5
  import { useGridLogger } from '../../utils/useGridLogger';
6
6
  import { gridColumnsTotalWidthSelector } from '../columns';
7
- import { gridDensityHeaderHeightSelector, gridDensityRowHeightSelector } from '../density';
7
+ import { gridDensityTotalHeaderHeightSelector, gridDensityRowHeightSelector } from '../density';
8
8
  import { useGridSelector } from '../../utils';
9
9
  import { getVisibleRows } from '../../utils/useGridVisibleRows';
10
10
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
@@ -42,7 +42,7 @@ export function useGridDimensions(apiRef, props) {
42
42
  const rootDimensionsRef = React.useRef(null);
43
43
  const fullDimensionsRef = React.useRef(null);
44
44
  const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
45
- const headerHeight = useGridSelector(apiRef, gridDensityHeaderHeightSelector);
45
+ const totalHeaderHeight = useGridSelector(apiRef, gridDensityTotalHeaderHeightSelector);
46
46
  const updateGridDimensionsRef = React.useCallback(() => {
47
47
  var _apiRef$current$rootE;
48
48
 
@@ -87,7 +87,7 @@ export function useGridDimensions(apiRef, props) {
87
87
  } else {
88
88
  viewportOuterSize = {
89
89
  width: rootDimensionsRef.current.width,
90
- height: rootDimensionsRef.current.height - headerHeight
90
+ height: rootDimensionsRef.current.height - totalHeaderHeight
91
91
  };
92
92
  const scrollInformation = hasScroll({
93
93
  content: {
@@ -121,7 +121,7 @@ export function useGridDimensions(apiRef, props) {
121
121
  if (newFullDimensions.viewportInnerSize.width !== (prevDimensions == null ? void 0 : prevDimensions.viewportInnerSize.width) || newFullDimensions.viewportInnerSize.height !== (prevDimensions == null ? void 0 : prevDimensions.viewportInnerSize.height)) {
122
122
  apiRef.current.publishEvent('viewportInnerSizeChange', newFullDimensions.viewportInnerSize);
123
123
  }
124
- }, [apiRef, props.scrollbarSize, props.autoHeight, headerHeight, rowsMeta.currentPageTotalHeight]);
124
+ }, [apiRef, props.scrollbarSize, props.autoHeight, totalHeaderHeight, rowsMeta.currentPageTotalHeight]);
125
125
  const resize = React.useCallback(() => {
126
126
  updateGridDimensionsRef();
127
127
  apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
@@ -4,7 +4,7 @@ import { ownerDocument } from '@mui/material/utils';
4
4
  import { useGridLogger } from '../../utils/useGridLogger';
5
5
  import { gridVisibleRowCountSelector } from '../filter/gridFilterSelector';
6
6
  import { gridColumnDefinitionsSelector, gridColumnVisibilityModelSelector } from '../columns/gridColumnsSelector';
7
- import { gridDensityHeaderHeightSelector } from '../density/densitySelector';
7
+ import { gridDensityTotalHeaderHeightSelector } from '../density/densitySelector';
8
8
  import { gridClasses } from '../../../constants/gridClasses';
9
9
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
10
10
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
@@ -79,7 +79,7 @@ export const useGridPrintExport = (apiRef, props) => {
79
79
  return;
80
80
  }
81
81
 
82
- const headerHeight = gridDensityHeaderHeightSelector(apiRef);
82
+ const totalHeaderHeight = gridDensityTotalHeaderHeightSelector(apiRef);
83
83
  const rowsMeta = gridRowsMetaSelector(apiRef.current.state);
84
84
  const gridRootElement = apiRef.current.rootElementRef.current;
85
85
  const gridClone = gridRootElement.cloneNode(true);
@@ -113,7 +113,7 @@ export const useGridPrintExport = (apiRef, props) => {
113
113
  } // Expand container height to accommodate all rows
114
114
 
115
115
 
116
- gridClone.style.height = `${rowsMeta.currentPageTotalHeight + headerHeight + gridToolbarElementHeight + gridFooterElementHeight}px`; // Remove all loaded elements from the current host
116
+ gridClone.style.height = `${rowsMeta.currentPageTotalHeight + totalHeaderHeight + gridToolbarElementHeight + gridFooterElementHeight}px`; // Remove all loaded elements from the current host
117
117
 
118
118
  printDoc.body.innerHTML = '';
119
119
  printDoc.body.appendChild(gridClone);
@@ -36,7 +36,7 @@ export declare const gridFilteredDescendantCountLookupSelector: import("../../..
36
36
  */
37
37
  export declare const gridVisibleSortedRowEntriesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
38
38
  id: import("../../..").GridRowId;
39
- model: any;
39
+ model: import("../../..").GridValidRowModel;
40
40
  }[]>;
41
41
  /**
42
42
  * Get the id of the rows accessible after the filtering process.
@@ -51,7 +51,7 @@ export declare const gridVisibleSortedRowIdsSelector: import("../../../utils/cre
51
51
  */
52
52
  export declare const gridFilteredSortedRowEntriesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
53
53
  id: import("../../..").GridRowId;
54
- model: any;
54
+ model: import("../../..").GridValidRowModel;
55
55
  }[]>;
56
56
  /**
57
57
  * Get the id of the rows accessible after the filtering process.
@@ -72,7 +72,7 @@ export declare const gridVisibleRowsSelector: import("../../../utils/createSelec
72
72
  */
73
73
  export declare const gridVisibleSortedTopLevelRowEntriesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
74
74
  id: import("../../..").GridRowId;
75
- model: any;
75
+ model: import("../../..").GridValidRowModel;
76
76
  }[]>;
77
77
  /**
78
78
  * Get the amount of rows accessible after the filtering process.
@@ -1,5 +1,6 @@
1
1
  export * from './columnMenu';
2
2
  export * from './columns';
3
+ export * from './columnGrouping';
3
4
  export * from './density';
4
5
  export * from './editRows';
5
6
  export * from './filter';
@@ -1,6 +1,7 @@
1
1
  // Only export the variable and types that should be publicly exposed and re-exported from `@mui/x-data-grid-pro`
2
2
  export * from './columnMenu';
3
3
  export * from './columns';
4
+ export * from './columnGrouping';
4
5
  export * from './density';
5
6
  export * from './editRows';
6
7
  export * from './filter';
@@ -33,7 +33,7 @@ export declare const gridPaginationRowRangeSelector: import("../../../utils/crea
33
33
  */
34
34
  export declare const gridPaginatedVisibleSortedGridRowEntriesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
35
35
  id: import("../../..").GridRowId;
36
- model: any;
36
+ model: import("../../..").GridValidRowModel;
37
37
  }[]>;
38
38
  /**
39
39
  * Get the id of each row to include in the current page if the pagination is enabled.
@@ -3,7 +3,7 @@ export declare const gridRowsStateSelector: (state: GridStateCommunity) => impor
3
3
  export declare const gridRowCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
4
4
  export declare const gridRowsLoadingSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, boolean | undefined>;
5
5
  export declare const gridTopLevelRowCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
6
- export declare const gridRowsLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowsLookup<any>>;
6
+ export declare const gridRowsLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowsLookup<import("../../..").GridValidRowModel>>;
7
7
  export declare const gridRowsIdToIdLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, Record<string, import("../../..").GridRowId>>;
8
8
  export declare const gridRowTreeSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowTreeConfig>;
9
9
  export declare const gridRowGroupingNameSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, string>;
@@ -2,5 +2,5 @@ import { GridStateCommunity } from '../../../models/gridStateCommunity';
2
2
  import { GridRowId } from '../../../models/gridRows';
3
3
  export declare const gridSelectionStateSelector: (state: GridStateCommunity) => import("../../..").GridSelectionModel;
4
4
  export declare const selectedGridRowsCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
5
- export declare const selectedGridRowsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, Map<GridRowId, any>>;
5
+ export declare const selectedGridRowsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, Map<GridRowId, import("../../../models/gridRows").GridValidRowModel>>;
6
6
  export declare const selectedIdsLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, Record<GridRowId, GridRowId>>;
@@ -16,7 +16,7 @@ export declare const gridSortedRowIdsSelector: import("../../../utils/createSele
16
16
  */
17
17
  export declare const gridSortedRowEntriesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
18
18
  id: import("../../..").GridRowId;
19
- model: any;
19
+ model: import("../../..").GridValidRowModel;
20
20
  }[]>;
21
21
  /**
22
22
  * Get the current sorting model.
@@ -29,7 +29,7 @@ export declare const useGridVirtualScroller: (props: UseGridVirtualScrollerProps
29
29
  maxLastColumn?: number | undefined;
30
30
  availableSpace?: number | null | undefined;
31
31
  ignoreAutoHeight?: boolean | undefined;
32
- rows?: GridRowEntry<any>[] | undefined;
32
+ rows?: GridRowEntry<import("../../../models").GridValidRowModel>[] | undefined;
33
33
  rowIndexOffset?: number | undefined;
34
34
  }) => JSX.Element[] | null;
35
35
  getRootProps: ({ style, ...other }?: {
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { DataGridProcessedProps } from '../../models/props/DataGridProps';
3
3
  import type { GridApiCommon, GridRowEntry } from '../../models';
4
4
  export declare const getVisibleRows: <Api extends GridApiCommon>(apiRef: React.MutableRefObject<Api>, props: Pick<DataGridProcessedProps, 'pagination' | 'paginationMode'>) => {
5
- rows: GridRowEntry<any>[];
5
+ rows: GridRowEntry<import("../../models").GridValidRowModel>[];
6
6
  range: {
7
7
  firstRowIndex: number;
8
8
  lastRowIndex: number;
@@ -16,7 +16,7 @@ export declare const getVisibleRows: <Api extends GridApiCommon>(apiRef: React.M
16
16
  * - If the row tree is flat, it only contains up to `state.pageSize` rows.
17
17
  */
18
18
  export declare const useGridVisibleRows: <Api extends GridApiCommon>(apiRef: React.MutableRefObject<Api>, props: Pick<DataGridProcessedProps, 'pagination' | 'paginationMode'>) => {
19
- rows: GridRowEntry<any>[];
19
+ rows: GridRowEntry<import("../../models").GridValidRowModel>[];
20
20
  range: {
21
21
  firstRowIndex: number;
22
22
  lastRowIndex: number;
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license MUI v5.15.3
1
+ /** @license MUI v5.16.0
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -13,6 +13,8 @@ export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridCol
13
13
  export { useGridColumnMenu, columnMenuStateInitializer, } from '../hooks/features/columnMenu/useGridColumnMenu';
14
14
  export { useGridColumns, columnsStateInitializer } from '../hooks/features/columns/useGridColumns';
15
15
  export { useGridColumnSpanning } from '../hooks/features/columns/useGridColumnSpanning';
16
+ export { useGridColumnGrouping, columnGroupsStateInitializer, } from '../hooks/features/columnGrouping/useGridColumnGrouping';
17
+ export { useGridColumnGroupingPreProcessors } from '../hooks/features/columnGrouping/useGridColumnGroupingPreProcessors';
16
18
  export type { GridColumnRawLookup, GridColumnsRawState, GridHydrateColumnsValue, } from '../hooks/features/columns/gridColumnsInterfaces';
17
19
  export { useGridDensity, densityStateInitializer } from '../hooks/features/density/useGridDensity';
18
20
  export { useGridCsvExport } from '../hooks/features/export/useGridCsvExport';
@@ -11,6 +11,8 @@ export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridCol
11
11
  export { useGridColumnMenu, columnMenuStateInitializer } from '../hooks/features/columnMenu/useGridColumnMenu';
12
12
  export { useGridColumns, columnsStateInitializer } from '../hooks/features/columns/useGridColumns';
13
13
  export { useGridColumnSpanning } from '../hooks/features/columns/useGridColumnSpanning';
14
+ export { useGridColumnGrouping, columnGroupsStateInitializer } from '../hooks/features/columnGrouping/useGridColumnGrouping';
15
+ export { useGridColumnGroupingPreProcessors } from '../hooks/features/columnGrouping/useGridColumnGroupingPreProcessors';
14
16
  export { useGridDensity, densityStateInitializer } from '../hooks/features/density/useGridDensity';
15
17
  export { useGridCsvExport } from '../hooks/features/export/useGridCsvExport';
16
18
  export { useGridPrintExport } from '../hooks/features/export/useGridPrintExport';
@@ -79,6 +79,7 @@ DataGridRaw.propTypes = {
79
79
  * @default 3
80
80
  */
81
81
  columnBuffer: PropTypes.number,
82
+ columnGroupingModel: PropTypes.arrayOf(PropTypes.object),
82
83
 
83
84
  /**
84
85
  * Set of columns of type [[GridColumns]].
@@ -196,6 +197,7 @@ DataGridRaw.propTypes = {
196
197
  * For each feature, if the flag is not explicitly set to `true`, the feature will be fully disabled and any property / method call will not have any effect.
197
198
  */
198
199
  experimentalFeatures: PropTypes.shape({
200
+ columnGrouping: PropTypes.bool,
199
201
  newEditingApi: PropTypes.bool,
200
202
  preventCommitWhileValidating: PropTypes.bool,
201
203
  warnIfFocusStateIsNotSynced: PropTypes.bool