@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
@@ -0,0 +1,104 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["classes", "columnMenuOpen", "colIndex", "height", "isResizing", "sortDirection", "hasFocus", "tabIndex", "separatorSide", "isDraggable", "headerComponent", "description", "elementId", "width", "columnMenuIconButton", "columnMenu", "columnTitleIconButtons", "headerClassName", "label", "resizable", "draggableContainerProps", "columnHeaderSeparatorProps", "disableHeaderSeparator"];
4
+ import * as React from 'react';
5
+ import clsx from 'clsx';
6
+ import { useForkRef } from '@mui/material/utils';
7
+ import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
8
+ import { GridColumnHeaderTitle } from './GridColumnHeaderTitle';
9
+ import { GridColumnHeaderSeparator } from './GridColumnHeaderSeparator';
10
+ import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
+ const GridGenericColumnHeaderItem = /*#__PURE__*/React.forwardRef(function GridGenericColumnHeaderItem(props, ref) {
14
+ const {
15
+ classes,
16
+ columnMenuOpen,
17
+ colIndex,
18
+ height,
19
+ isResizing,
20
+ sortDirection,
21
+ hasFocus,
22
+ tabIndex,
23
+ separatorSide,
24
+ isDraggable,
25
+ headerComponent,
26
+ description,
27
+ width,
28
+ columnMenuIconButton = null,
29
+ columnMenu = null,
30
+ columnTitleIconButtons = null,
31
+ headerClassName,
32
+ label,
33
+ resizable,
34
+ draggableContainerProps,
35
+ columnHeaderSeparatorProps,
36
+ disableHeaderSeparator
37
+ } = props,
38
+ other = _objectWithoutPropertiesLoose(props, _excluded);
39
+
40
+ const apiRef = useGridApiContext();
41
+ const rootProps = useGridRootProps();
42
+ const headerCellRef = React.useRef(null);
43
+ const [showColumnMenuIcon, setShowColumnMenuIcon] = React.useState(columnMenuOpen);
44
+ const handleRef = useForkRef(headerCellRef, ref);
45
+ let ariaSort = 'none';
46
+
47
+ if (sortDirection != null) {
48
+ ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending';
49
+ }
50
+
51
+ React.useEffect(() => {
52
+ if (!showColumnMenuIcon) {
53
+ setShowColumnMenuIcon(columnMenuOpen);
54
+ }
55
+ }, [showColumnMenuIcon, columnMenuOpen]);
56
+ React.useLayoutEffect(() => {
57
+ const columnMenuState = apiRef.current.state.columnMenu;
58
+
59
+ if (hasFocus && !columnMenuState.open) {
60
+ const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
61
+ const elementToFocus = focusableElement || headerCellRef.current;
62
+ elementToFocus == null ? void 0 : elementToFocus.focus();
63
+ apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
64
+ }
65
+ }, [apiRef, hasFocus]);
66
+ return /*#__PURE__*/_jsxs("div", _extends({
67
+ ref: handleRef,
68
+ className: clsx(classes.root, headerClassName),
69
+ style: {
70
+ height,
71
+ width,
72
+ minWidth: width,
73
+ maxWidth: width
74
+ },
75
+ role: "columnheader",
76
+ tabIndex: tabIndex,
77
+ "aria-colindex": colIndex + 1,
78
+ "aria-sort": ariaSort,
79
+ "aria-label": headerComponent == null ? label : undefined
80
+ }, other, {
81
+ children: [/*#__PURE__*/_jsxs("div", _extends({
82
+ className: classes.draggableContainer,
83
+ draggable: isDraggable
84
+ }, draggableContainerProps, {
85
+ children: [/*#__PURE__*/_jsxs("div", {
86
+ className: classes.titleContainer,
87
+ children: [/*#__PURE__*/_jsx("div", {
88
+ className: classes.titleContainerContent,
89
+ children: headerComponent !== undefined ? headerComponent : /*#__PURE__*/_jsx(GridColumnHeaderTitle, {
90
+ label: label,
91
+ description: description,
92
+ columnWidth: width
93
+ })
94
+ }), columnTitleIconButtons]
95
+ }), columnMenuIconButton]
96
+ })), !disableHeaderSeparator && /*#__PURE__*/_jsx(GridColumnHeaderSeparator, _extends({
97
+ resizable: !rootProps.disableColumnResize && !!resizable,
98
+ resizing: isResizing,
99
+ height: height,
100
+ side: separatorSide
101
+ }, columnHeaderSeparatorProps)), columnMenu]
102
+ }));
103
+ });
104
+ export { GridGenericColumnHeaderItem };
@@ -12,8 +12,8 @@ import { useGridSelector } from '../../hooks/utils/useGridSelector';
12
12
  import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
13
13
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
14
14
  import { getDataGridUtilityClass } from '../../constants/gridClasses';
15
+ import { gridDensityHeaderGroupingMaxDepthSelector, gridDensityValueSelector } from '../../hooks/features/density/densitySelector';
15
16
  import { gridPinnedRowsCountSelector, gridRowCountSelector } from '../../hooks/features/rows/gridRowsSelector';
16
- import { gridDensityValueSelector } from '../../hooks/features/density/densitySelector';
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
 
19
19
  const useUtilityClasses = ownerState => {
@@ -41,6 +41,7 @@ const GridRoot = /*#__PURE__*/React.forwardRef(function GridRoot(props, ref) {
41
41
  const visibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
42
42
  const totalRowCount = useGridSelector(apiRef, gridRowCountSelector);
43
43
  const densityValue = useGridSelector(apiRef, gridDensityValueSelector);
44
+ const headerGroupingMaxDepth = useGridSelector(apiRef, gridDensityHeaderGroupingMaxDepthSelector);
44
45
  const rootContainerRef = React.useRef(null);
45
46
  const handleRef = useForkRef(rootContainerRef, ref);
46
47
  const pinnedRowsCount = useGridSelector(apiRef, gridPinnedRowsCountSelector);
@@ -71,8 +72,7 @@ const GridRoot = /*#__PURE__*/React.forwardRef(function GridRoot(props, ref) {
71
72
  className: clsx(className, classes.root),
72
73
  role: "grid",
73
74
  "aria-colcount": visibleColumns.length,
74
- "aria-rowcount": totalRowCount + pinnedRowsCount + 1 // +1 for the header row
75
- ,
75
+ "aria-rowcount": headerGroupingMaxDepth + 1 + pinnedRowsCount + totalRowCount,
76
76
  "aria-multiselectable": !rootProps.disableMultipleSelection,
77
77
  "aria-label": rootProps['aria-label'],
78
78
  "aria-labelledby": rootProps['aria-labelledby']
@@ -175,13 +175,24 @@ export const GridRootStyles = styled('div', {
175
175
  minWidth: 0,
176
176
  flex: 1,
177
177
  whiteSpace: 'nowrap',
178
- overflowX: 'hidden'
178
+ overflow: 'hidden'
179
179
  },
180
180
  [`& .${gridClasses.columnHeaderTitleContainerContent}`]: {
181
181
  overflow: 'hidden',
182
182
  display: 'flex',
183
183
  alignItems: 'center'
184
184
  },
185
+ [`& .${gridClasses['columnHeader--filledGroup']} .${gridClasses.columnHeaderTitleContainer}`]: {
186
+ borderBottom: `solid ${borderColor} 1px`,
187
+ boxSizing: 'border-box'
188
+ },
189
+ [`& .${gridClasses['columnHeader--filledGroup']}.${gridClasses['columnHeader--showColumnBorder']} .${gridClasses.columnHeaderTitleContainer}`]: {
190
+ borderBottom: `none`
191
+ },
192
+ [`& .${gridClasses['columnHeader--filledGroup']}.${gridClasses['columnHeader--showColumnBorder']}`]: {
193
+ borderBottom: `solid ${borderColor} 1px`,
194
+ boxSizing: 'border-box'
195
+ },
185
196
  [`& .${gridClasses.sortIcon}, & .${gridClasses.filterIcon}`]: {
186
197
  fontSize: 'inherit'
187
198
  },
@@ -361,7 +372,8 @@ export const GridRootStyles = styled('div', {
361
372
  },
362
373
  [`& .${gridClasses.columnHeaderDraggableContainer}`]: {
363
374
  display: 'flex',
364
- width: '100%'
375
+ width: '100%',
376
+ height: '100%'
365
377
  },
366
378
  [`& .${gridClasses.rowReorderCellPlaceholder}`]: {
367
379
  display: 'none'
@@ -18,5 +18,5 @@ export interface GridPanelProps extends StandardProps<MUIStyledCommonProps<Theme
18
18
  open: boolean;
19
19
  }
20
20
  export declare const gridPanelClasses: Record<keyof GridPanelClasses, string>;
21
- declare const GridPanel: React.ForwardRefExoticComponent<Pick<GridPanelProps, "hidden" | "color" | "style" | "open" | "translate" | "transition" | "slot" | "title" | "as" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "sx" | "theme" | "classes" | "placement" | "anchorEl" | "container" | "disablePortal" | "keepMounted" | "modifiers" | "popperOptions" | "popperRef"> & React.RefAttributes<HTMLDivElement>>;
21
+ declare const GridPanel: React.ForwardRefExoticComponent<Pick<GridPanelProps, "hidden" | "color" | "style" | "open" | "translate" | "transition" | "slot" | "title" | "key" | "as" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "component" | "sx" | "theme" | "classes" | "components" | "container" | "placement" | "disablePortal" | "modifiers" | "anchorEl" | "componentsProps" | "keepMounted" | "popperOptions" | "popperRef"> & React.RefAttributes<HTMLDivElement>>;
22
22
  export { GridPanel };
@@ -111,6 +111,10 @@ export interface GridClasses {
111
111
  * Styles applied to the column header element.
112
112
  */
113
113
  columnHeader: string;
114
+ /**
115
+ * Styles applied to the column group header element.
116
+ */
117
+ columnGroupHeader: string;
114
118
  /**
115
119
  * Styles applied to the header checkbox cell element.
116
120
  */
@@ -139,6 +143,18 @@ export interface GridClasses {
139
143
  * Styles applied to the column header's title excepted buttons.
140
144
  */
141
145
  columnHeaderTitleContainerContent: string;
146
+ /**
147
+ * Styles applied to the column group header cell if not empty.
148
+ */
149
+ 'columnHeader--filledGroup': string;
150
+ /**
151
+ * Styles applied to the empty column group header cell.
152
+ */
153
+ 'columnHeader--emptyGroup': string;
154
+ /**
155
+ * Styles applied to the column group header cell when show column border.
156
+ */
157
+ 'columnHeader--showColumnBorder': string;
142
158
  /**
143
159
  * Styles applied to the column headers.
144
160
  */
@@ -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 const 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 const 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', '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', '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,7 @@
1
+ import { GridColumnGroup } from '../../../models/gridColumnGrouping';
2
+ export declare type GridColumnGroupLookup = {
3
+ [field: string]: Omit<GridColumnGroup, 'children'>;
4
+ };
5
+ export interface GridColumnsGroupingState {
6
+ lookup: GridColumnGroupLookup;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { GridStateCommunity } from '../../../models/gridStateCommunity';
2
+ /**
3
+ * @category ColumnGrouping
4
+ * @ignore - do not document.
5
+ */
6
+ export declare const gridColumnGroupingSelector: (state: GridStateCommunity) => import("./gridColumnGroupsInterfaces").GridColumnsGroupingState;
7
+ export declare const gridColumnGroupsLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("./gridColumnGroupsInterfaces").GridColumnGroupLookup>;
@@ -0,0 +1,8 @@
1
+ import { createSelector } from '../../../utils/createSelector';
2
+
3
+ /**
4
+ * @category ColumnGrouping
5
+ * @ignore - do not document.
6
+ */
7
+ export const gridColumnGroupingSelector = state => state.columnGrouping;
8
+ export const gridColumnGroupsLookupSelector = createSelector(gridColumnGroupingSelector, columnGrouping => columnGrouping.lookup);
@@ -0,0 +1,2 @@
1
+ export * from './gridColumnGroupsSelector';
2
+ export type { GridColumnsGroupingState } from './gridColumnGroupsInterfaces';
@@ -0,0 +1,2 @@
1
+ export * from './gridColumnGroupsSelector';
2
+ export {};
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { GridApiCommunity } from '../../../models/api/gridApiCommunity';
3
+ import { DataGridProcessedProps } from '../../../models/props/DataGridProps';
4
+ import { GridStateInitializer } from '../../utils/useGridInitializeState';
5
+ import { GridColumnGroupingModel, GridColumnGroup } from '../../../models/gridColumnGrouping';
6
+ import { GridStateColDef, GridColDef } from '../../../models/colDef';
7
+ export declare function hasGroupPath(lookupElement: GridColDef | GridStateColDef): lookupElement is GridStateColDef;
8
+ declare type UnwrappedGroupingModel = {
9
+ [key: GridColDef['field']]: GridColumnGroup['groupId'][];
10
+ };
11
+ /**
12
+ * This is a function that provide for each column the array of its parents.
13
+ * Parents are ordered from the root to the leaf.
14
+ * @param columnGroupingModel The model such as provided in DataGrid props
15
+ * @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
16
+ */
17
+ export declare const unwrapGroupingColumnModel: (columnGroupingModel?: GridColumnGroupingModel) => UnwrappedGroupingModel;
18
+ export declare const columnGroupsStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'columnGroupingModel'>>;
19
+ /**
20
+ * @requires useGridColumns (method, event)
21
+ * @requires useGridParamsApi (method)
22
+ */
23
+ export declare const useGridColumnGrouping: (apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'columnGroupingModel' | 'experimentalFeatures'>) => void;
24
+ export {};
@@ -0,0 +1,153 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["groupId", "children"];
4
+ import * as React from 'react';
5
+ import { isLeaf } from '../../../models/gridColumnGrouping';
6
+ import { gridColumnGroupsLookupSelector } from './gridColumnGroupsSelector';
7
+ import { gridColumnLookupSelector } from '../columns/gridColumnsSelector';
8
+ import { useGridApiMethod } from '../../utils/useGridApiMethod';
9
+ export function hasGroupPath(lookupElement) {
10
+ return lookupElement.groupPath !== undefined;
11
+ }
12
+
13
+ // This is the recurrence function that help writing `unwrapGroupingColumnModel()`
14
+ const recurrentUnwrapGroupingColumnModel = (columnGroupNode, parents, unwrappedGroupingModelToComplet) => {
15
+ if (isLeaf(columnGroupNode)) {
16
+ if (unwrappedGroupingModelToComplet[columnGroupNode.field] !== undefined) {
17
+ throw new Error([`MUI: columnGroupingModel contains duplicated field`, `column field ${columnGroupNode.field} occurrs two times in the grouping model:`, `- ${unwrappedGroupingModelToComplet[columnGroupNode.field].join(' > ')}`, `- ${parents.join(' > ')}`].join('\n'));
18
+ }
19
+
20
+ unwrappedGroupingModelToComplet[columnGroupNode.field] = parents;
21
+ return;
22
+ }
23
+
24
+ const {
25
+ groupId,
26
+ children
27
+ } = columnGroupNode;
28
+ children.forEach(child => {
29
+ recurrentUnwrapGroupingColumnModel(child, [...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 const unwrapGroupingColumnModel = columnGroupingModel => {
41
+ if (!columnGroupingModel) {
42
+ return {};
43
+ }
44
+
45
+ const unwrappedSubTree = {};
46
+ columnGroupingModel.forEach(columnGroupNode => {
47
+ recurrentUnwrapGroupingColumnModel(columnGroupNode, [], unwrappedSubTree);
48
+ });
49
+ return unwrappedSubTree;
50
+ };
51
+
52
+ const createGroupLookup = columnGroupingModel => {
53
+ let groupLookup = {};
54
+ columnGroupingModel.forEach(node => {
55
+ if (isLeaf(node)) {
56
+ return;
57
+ }
58
+
59
+ const {
60
+ groupId,
61
+ children
62
+ } = node,
63
+ other = _objectWithoutPropertiesLoose(node, _excluded);
64
+
65
+ if (!groupId) {
66
+ throw new Error('MUI: An element of the columnGroupingModel does not have either `field` or `groupId`.');
67
+ }
68
+
69
+ if (!children) {
70
+ console.warn(`MUI: group groupId=${groupId} has no children.`);
71
+ }
72
+
73
+ const groupParam = _extends({}, other, {
74
+ groupId
75
+ });
76
+
77
+ const subTreeLookup = createGroupLookup(children);
78
+
79
+ if (subTreeLookup[groupId] !== undefined || groupLookup[groupId] !== undefined) {
80
+ throw new Error(`MUI: The groupId ${groupId} is used multiple times in the columnGroupingModel.`);
81
+ }
82
+
83
+ groupLookup = _extends({}, groupLookup, subTreeLookup, {
84
+ [groupId]: groupParam
85
+ });
86
+ });
87
+ return _extends({}, groupLookup);
88
+ };
89
+
90
+ export const columnGroupsStateInitializer = (state, props) => {
91
+ var _props$columnGrouping;
92
+
93
+ const groupLookup = createGroupLookup((_props$columnGrouping = props.columnGroupingModel) != null ? _props$columnGrouping : []);
94
+ return _extends({}, state, {
95
+ columnGrouping: {
96
+ lookup: groupLookup,
97
+ groupCollapsedModel: {}
98
+ }
99
+ });
100
+ };
101
+ /**
102
+ * @requires useGridColumns (method, event)
103
+ * @requires useGridParamsApi (method)
104
+ */
105
+
106
+ export const useGridColumnGrouping = (apiRef, props) => {
107
+ var _props$experimentalFe2;
108
+
109
+ /**
110
+ * API METHODS
111
+ */
112
+ const getColumnGroupPath = React.useCallback(field => {
113
+ var _columnLookup$field$g, _columnLookup$field;
114
+
115
+ const columnLookup = gridColumnLookupSelector(apiRef);
116
+ return (_columnLookup$field$g = (_columnLookup$field = columnLookup[field]) == null ? void 0 : _columnLookup$field.groupPath) != null ? _columnLookup$field$g : [];
117
+ }, [apiRef]);
118
+ const getAllGroupDetails = React.useCallback(() => {
119
+ const columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
120
+ return columnGroupLookup;
121
+ }, [apiRef]);
122
+ const columnGroupingApi = {
123
+ unstable_getColumnGroupPath: getColumnGroupPath,
124
+ unstable_getAllGroupDetails: getAllGroupDetails
125
+ };
126
+ useGridApiMethod(apiRef, columnGroupingApi, 'GridColumnGroupingApi');
127
+ /**
128
+ * EFFECTS
129
+ */
130
+ // The effect does not track any value defined synchronously during the 1st render by hooks called after `useGridColumns`
131
+ // As a consequence, the state generated by the 1st run of this useEffect will always be equal to the initialization one
132
+
133
+ const isFirstRender = React.useRef(true);
134
+ React.useEffect(() => {
135
+ var _props$experimentalFe, _props$columnGrouping2;
136
+
137
+ if (isFirstRender.current) {
138
+ isFirstRender.current = false;
139
+ return;
140
+ }
141
+
142
+ if (!((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.columnGrouping)) {
143
+ return;
144
+ }
145
+
146
+ const groupLookup = createGroupLookup((_props$columnGrouping2 = props.columnGroupingModel) != null ? _props$columnGrouping2 : []);
147
+ apiRef.current.setState(state => _extends({}, state, {
148
+ columnGrouping: _extends({}, state.columnGrouping, {
149
+ lookup: groupLookup
150
+ })
151
+ }));
152
+ }, [apiRef, props.columnGroupingModel, (_props$experimentalFe2 = props.experimentalFeatures) == null ? void 0 : _props$experimentalFe2.columnGrouping]);
153
+ };
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import { DataGridProcessedProps } from '../../../models/props/DataGridProps';
3
+ import { GridApiCommunity } from '../../../models/api/gridApiCommunity';
4
+ export declare const useGridColumnGroupingPreProcessors: (apiRef: React.MutableRefObject<GridApiCommunity>, props: DataGridProcessedProps) => void;
@@ -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 const useGridColumnGroupingPreProcessors = (apiRef, props) => {
7
+ var _props$experimentalFe2;
8
+
9
+ const addHeaderGroups = React.useCallback(columnsState => {
10
+ var _props$experimentalFe;
11
+
12
+ if (!((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.columnGrouping)) {
13
+ return columnsState;
14
+ }
15
+
16
+ const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel);
17
+ columnsState.all.forEach(field => {
18
+ var _unwrappedGroupingMod, _unwrappedGroupingMod2;
19
+
20
+ const newGroupPath = (_unwrappedGroupingMod = unwrappedGroupingModel[field]) != null ? _unwrappedGroupingMod : [];
21
+ const 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
+ };
@@ -4,13 +4,15 @@ interface UseGridColumnHeadersProps {
4
4
  innerRef?: React.Ref<HTMLDivElement>;
5
5
  minColumnIndex?: number;
6
6
  }
7
+ interface GetHeadersParams {
8
+ renderContext: GridRenderContext | null;
9
+ minFirstColumn?: number;
10
+ maxLastColumn?: number;
11
+ }
7
12
  export declare const useGridColumnHeaders: (props: UseGridColumnHeadersProps) => {
8
13
  renderContext: GridRenderContext | null;
9
- getColumns: (params?: {
10
- renderContext: GridRenderContext | null;
11
- minFirstColumn?: number | undefined;
12
- maxLastColumn?: number | undefined;
13
- } | undefined, other?: {}) => JSX.Element[] | null;
14
+ getColumnHeaders: (params?: GetHeadersParams, other?: {}) => JSX.Element | null;
15
+ getColumnGroupHeaders: (params?: GetHeadersParams) => JSX.Element[] | null;
14
16
  isDragging: boolean;
15
17
  getRootProps: (other?: {}) => {
16
18
  style: {
@@ -21,7 +23,6 @@ export declare const useGridColumnHeaders: (props: UseGridColumnHeadersProps) =>
21
23
  };
22
24
  getInnerProps: () => {
23
25
  ref: React.Ref<HTMLDivElement>;
24
- 'aria-rowindex': number;
25
26
  role: string;
26
27
  };
27
28
  };