@mui/x-data-grid 7.7.1 → 7.9.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 (162) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/DataGrid/useDataGridComponent.d.ts +0 -1
  3. package/DataGrid/useDataGridProps.js +9 -2
  4. package/components/GridFooter.d.ts +1 -1
  5. package/components/GridLoadingOverlay.d.ts +15 -3
  6. package/components/GridLoadingOverlay.js +48 -4
  7. package/components/GridNoResultsOverlay.d.ts +1 -1
  8. package/components/GridNoRowsOverlay.d.ts +1 -1
  9. package/components/GridRow.js +2 -1
  10. package/components/GridRowCount.d.ts +1 -1
  11. package/components/GridSelectedRowCount.d.ts +1 -1
  12. package/components/GridSkeletonLoadingOverlay.d.ts +3 -0
  13. package/components/GridSkeletonLoadingOverlay.js +181 -0
  14. package/components/base/GridOverlays.d.ts +11 -1
  15. package/components/base/GridOverlays.js +25 -39
  16. package/components/cell/GridActionsCellItem.d.ts +3 -3
  17. package/components/cell/GridSkeletonCell.d.ts +13 -6
  18. package/components/cell/GridSkeletonCell.js +61 -19
  19. package/components/columnHeaders/GridColumnHeaderItem.js +3 -3
  20. package/components/columnHeaders/GridColumnHeaderSortIcon.d.ts +1 -0
  21. package/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
  22. package/components/containers/GridFooterContainer.d.ts +1 -1
  23. package/components/containers/GridOverlay.d.ts +1 -1
  24. package/components/containers/GridRootStyles.d.ts +0 -1
  25. package/components/containers/GridRootStyles.js +19 -2
  26. package/components/containers/GridToolbarContainer.d.ts +1 -1
  27. package/components/panel/GridPanel.d.ts +1 -1
  28. package/components/toolbar/GridToolbarExportContainer.d.ts +1 -1
  29. package/components/virtualization/GridMainContainer.d.ts +1 -1
  30. package/components/virtualization/GridVirtualScroller.js +7 -5
  31. package/components/virtualization/GridVirtualScrollerContent.d.ts +1 -1
  32. package/components/virtualization/GridVirtualScrollerRenderZone.d.ts +1 -1
  33. package/constants/defaultGridSlotsComponents.js +2 -1
  34. package/constants/gridClasses.d.ts +14 -0
  35. package/constants/gridClasses.js +1 -1
  36. package/hooks/core/pipeProcessing/useGridRegisterPipeApplier.d.ts +2 -1
  37. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +2 -2
  38. package/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.d.ts +2 -2
  39. package/hooks/core/useGridInitialization.d.ts +1 -1
  40. package/hooks/core/useGridLocaleText.d.ts +1 -1
  41. package/hooks/core/useGridLoggerFactory.d.ts +1 -1
  42. package/hooks/features/clipboard/useGridClipboard.d.ts +1 -1
  43. package/hooks/features/columnGrouping/useGridColumnGrouping.d.ts +1 -1
  44. package/hooks/features/columnResize/useGridColumnResize.d.ts +1 -1
  45. package/hooks/features/density/useGridDensity.d.ts +1 -1
  46. package/hooks/features/dimensions/useGridDimensions.js +15 -15
  47. package/hooks/features/editing/useGridCellEditing.d.ts +1 -1
  48. package/hooks/features/editing/useGridEditing.d.ts +1 -1
  49. package/hooks/features/editing/useGridRowEditing.d.ts +1 -1
  50. package/hooks/features/export/serializers/csvSerializer.d.ts +0 -1
  51. package/hooks/features/export/useGridCsvExport.d.ts +1 -1
  52. package/hooks/features/export/useGridPrintExport.d.ts +1 -1
  53. package/hooks/features/export/useGridPrintExport.js +9 -8
  54. package/hooks/features/filter/gridFilterUtils.d.ts +1 -1
  55. package/hooks/features/filter/useGridFilter.d.ts +1 -1
  56. package/hooks/features/focus/useGridFocus.d.ts +1 -1
  57. package/hooks/features/headerFiltering/useGridHeaderFiltering.d.ts +1 -1
  58. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.d.ts +1 -1
  59. package/hooks/features/overlays/useGridOverlays.d.ts +11 -0
  60. package/hooks/features/overlays/useGridOverlays.js +35 -0
  61. package/hooks/features/pagination/gridPaginationUtils.d.ts +1 -1
  62. package/hooks/features/pagination/index.d.ts +1 -1
  63. package/hooks/features/pagination/useGridPaginationMeta.d.ts +1 -1
  64. package/hooks/features/pagination/useGridPaginationModel.d.ts +2 -2
  65. package/hooks/features/pagination/useGridRowCount.d.ts +1 -1
  66. package/hooks/features/preferencesPanel/useGridPreferencesPanel.d.ts +1 -1
  67. package/hooks/features/rowSelection/useGridRowSelection.d.ts +1 -1
  68. package/hooks/features/rows/gridRowsInterfaces.d.ts +10 -2
  69. package/hooks/features/rows/gridRowsSelector.d.ts +2 -1
  70. package/hooks/features/rows/gridRowsSelector.js +1 -0
  71. package/hooks/features/rows/gridRowsUtils.d.ts +8 -6
  72. package/hooks/features/rows/gridRowsUtils.js +30 -6
  73. package/hooks/features/rows/useGridRows.d.ts +2 -2
  74. package/hooks/features/rows/useGridRows.js +39 -21
  75. package/hooks/features/rows/useGridRowsMeta.d.ts +1 -1
  76. package/hooks/features/scroll/useGridScroll.d.ts +1 -1
  77. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  78. package/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  79. package/hooks/utils/index.d.ts +0 -1
  80. package/hooks/utils/index.js +0 -1
  81. package/hooks/utils/useGridApiEventHandler.d.ts +2 -2
  82. package/hooks/utils/useGridApiRef.d.ts +1 -1
  83. package/hooks/utils/useGridInitializeState.d.ts +1 -1
  84. package/hooks/utils/useGridRootProps.d.ts +1 -1
  85. package/hooks/utils/useGridSelector.d.ts +1 -1
  86. package/hooks/utils/useGridVisibleRows.d.ts +2 -2
  87. package/index.js +1 -1
  88. package/internals/index.d.ts +2 -0
  89. package/internals/index.js +1 -0
  90. package/internals/utils/propValidation.js +1 -1
  91. package/models/api/gridApiCommon.d.ts +2 -2
  92. package/models/api/gridInfiniteLoaderApi.d.ts +0 -1
  93. package/models/api/gridRowApi.d.ts +14 -0
  94. package/models/gridColumnGrouping.d.ts +0 -1
  95. package/models/gridDataSource.d.ts +87 -0
  96. package/models/gridDataSource.js +1 -0
  97. package/models/gridRows.d.ts +10 -0
  98. package/models/gridSlotsComponent.d.ts +5 -0
  99. package/models/gridSlotsComponentsProps.d.ts +7 -2
  100. package/models/props/DataGridProps.d.ts +2 -0
  101. package/modern/DataGrid/useDataGridProps.js +9 -2
  102. package/modern/components/GridLoadingOverlay.js +48 -4
  103. package/modern/components/GridRow.js +2 -1
  104. package/modern/components/GridSkeletonLoadingOverlay.js +181 -0
  105. package/modern/components/base/GridOverlays.js +25 -39
  106. package/modern/components/cell/GridSkeletonCell.js +61 -19
  107. package/modern/components/columnHeaders/GridColumnHeaderItem.js +3 -3
  108. package/modern/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
  109. package/modern/components/containers/GridRootStyles.js +19 -2
  110. package/modern/components/virtualization/GridVirtualScroller.js +7 -5
  111. package/modern/constants/defaultGridSlotsComponents.js +2 -1
  112. package/modern/constants/gridClasses.js +1 -1
  113. package/modern/hooks/features/dimensions/useGridDimensions.js +15 -15
  114. package/modern/hooks/features/export/useGridPrintExport.js +9 -8
  115. package/modern/hooks/features/overlays/useGridOverlays.js +35 -0
  116. package/modern/hooks/features/rows/gridRowsSelector.js +1 -0
  117. package/modern/hooks/features/rows/gridRowsUtils.js +30 -6
  118. package/modern/hooks/features/rows/useGridRows.js +39 -21
  119. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  120. package/modern/hooks/utils/index.js +0 -1
  121. package/modern/index.js +1 -1
  122. package/modern/internals/index.js +1 -0
  123. package/modern/internals/utils/propValidation.js +1 -1
  124. package/modern/models/gridDataSource.js +1 -0
  125. package/modern/utils/utils.js +10 -2
  126. package/node/DataGrid/useDataGridProps.js +9 -2
  127. package/node/components/GridLoadingOverlay.js +48 -4
  128. package/node/components/GridRow.js +2 -1
  129. package/node/components/GridSkeletonLoadingOverlay.js +189 -0
  130. package/node/components/base/GridOverlays.js +25 -39
  131. package/node/components/cell/GridSkeletonCell.js +60 -18
  132. package/node/components/columnHeaders/GridColumnHeaderItem.js +3 -3
  133. package/node/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
  134. package/node/components/containers/GridRootStyles.js +19 -2
  135. package/node/components/virtualization/GridVirtualScroller.js +6 -4
  136. package/node/constants/defaultGridSlotsComponents.js +1 -0
  137. package/node/constants/gridClasses.js +1 -1
  138. package/node/hooks/features/dimensions/useGridDimensions.js +15 -15
  139. package/node/hooks/features/export/useGridPrintExport.js +9 -8
  140. package/node/hooks/features/overlays/useGridOverlays.js +42 -0
  141. package/node/hooks/features/rows/gridRowsSelector.js +2 -1
  142. package/node/hooks/features/rows/gridRowsUtils.js +31 -6
  143. package/node/hooks/features/rows/useGridRows.js +37 -19
  144. package/node/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  145. package/node/hooks/utils/index.js +0 -12
  146. package/node/index.js +1 -1
  147. package/node/internals/index.js +7 -0
  148. package/node/internals/utils/propValidation.js +1 -1
  149. package/node/models/gridDataSource.js +5 -0
  150. package/node/utils/utils.js +11 -3
  151. package/package.json +5 -4
  152. package/utils/cleanupTracking/TimerBasedCleanupTracking.d.ts +0 -1
  153. package/utils/domUtils.d.ts +0 -1
  154. package/utils/getPublicApiRef.d.ts +1 -2
  155. package/utils/keyboardUtils.d.ts +1 -1
  156. package/utils/utils.d.ts +8 -1
  157. package/utils/utils.js +10 -2
  158. package/utils/warning.d.ts +1 -1
  159. package/hooks/utils/useResizeObserver.d.ts +0 -2
  160. package/hooks/utils/useResizeObserver.js +0 -36
  161. package/modern/hooks/utils/useResizeObserver.js +0 -36
  162. package/node/hooks/utils/useResizeObserver.js +0 -44
@@ -0,0 +1,181 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import clsx from 'clsx';
4
+ import { styled } from '@mui/system';
5
+ import useForkRef from '@mui/utils/useForkRef';
6
+ import composeClasses from '@mui/utils/composeClasses';
7
+ import { useGridApiContext } from '../hooks/utils/useGridApiContext';
8
+ import { useGridRootProps } from '../hooks/utils/useGridRootProps';
9
+ import { GridPinnedColumnPosition, gridColumnPositionsSelector, gridColumnsTotalWidthSelector, gridDimensionsSelector, gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, useGridApiEventHandler, useGridSelector } from '../hooks';
10
+ import { getDataGridUtilityClass, gridClasses } from '../constants/gridClasses';
11
+ import { getPinnedCellOffset } from '../internals/utils/getPinnedCellOffset';
12
+ import { shouldCellShowLeftBorder, shouldCellShowRightBorder } from '../utils/cellBorderUtils';
13
+ import { escapeOperandAttributeSelector } from '../utils/domUtils';
14
+ import { GridScrollbarFillerCell } from './GridScrollbarFillerCell';
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ const SkeletonOverlay = styled('div', {
17
+ name: 'MuiDataGrid',
18
+ slot: 'SkeletonLoadingOverlay',
19
+ overridesResolver: (props, styles) => styles.skeletonLoadingOverlay
20
+ })({
21
+ minWidth: '100%',
22
+ width: 'max-content',
23
+ // prevents overflow: clip; cutting off the x axis
24
+ height: '100%',
25
+ overflow: 'clip' // y axis is hidden while the x axis is allowed to overflow
26
+ });
27
+ const useUtilityClasses = ownerState => {
28
+ const {
29
+ classes
30
+ } = ownerState;
31
+ const slots = {
32
+ root: ['skeletonLoadingOverlay']
33
+ };
34
+ return composeClasses(slots, getDataGridUtilityClass, classes);
35
+ };
36
+ const getColIndex = el => parseInt(el.getAttribute('data-colindex'), 10);
37
+ const GridSkeletonLoadingOverlay = /*#__PURE__*/React.forwardRef(function GridSkeletonLoadingOverlay(props, forwardedRef) {
38
+ const rootProps = useGridRootProps();
39
+ const {
40
+ slots
41
+ } = rootProps;
42
+ const classes = useUtilityClasses({
43
+ classes: rootProps.classes
44
+ });
45
+ const ref = React.useRef(null);
46
+ const handleRef = useForkRef(ref, forwardedRef);
47
+ const apiRef = useGridApiContext();
48
+ const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
49
+ const viewportHeight = dimensions?.viewportInnerSize.height ?? 0;
50
+ const skeletonRowsCount = Math.ceil(viewportHeight / dimensions.rowHeight);
51
+ const totalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
52
+ const positions = useGridSelector(apiRef, gridColumnPositionsSelector);
53
+ const inViewportCount = React.useMemo(() => positions.filter(value => value <= totalWidth).length, [totalWidth, positions]);
54
+ const allVisibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
55
+ const columns = React.useMemo(() => allVisibleColumns.slice(0, inViewportCount), [allVisibleColumns, inViewportCount]);
56
+ const pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
57
+ const getPinnedStyle = React.useCallback((computedWidth, index, position) => {
58
+ const pinnedOffset = getPinnedCellOffset(position, computedWidth, index, positions, dimensions);
59
+ return {
60
+ [position]: pinnedOffset
61
+ };
62
+ }, [dimensions, positions]);
63
+ const getPinnedPosition = React.useCallback(field => {
64
+ if (pinnedColumns.left.findIndex(col => col.field === field) !== -1) {
65
+ return GridPinnedColumnPosition.LEFT;
66
+ }
67
+ if (pinnedColumns.right.findIndex(col => col.field === field) !== -1) {
68
+ return GridPinnedColumnPosition.RIGHT;
69
+ }
70
+ return undefined;
71
+ }, [pinnedColumns.left, pinnedColumns.right]);
72
+ const children = React.useMemo(() => {
73
+ const array = [];
74
+ for (let i = 0; i < skeletonRowsCount; i += 1) {
75
+ const rowCells = [];
76
+ for (let colIndex = 0; colIndex < columns.length; colIndex += 1) {
77
+ const column = columns[colIndex];
78
+ const pinnedPosition = getPinnedPosition(column.field);
79
+ const isPinnedLeft = pinnedPosition === GridPinnedColumnPosition.LEFT;
80
+ const isPinnedRight = pinnedPosition === GridPinnedColumnPosition.RIGHT;
81
+ const sectionLength = pinnedPosition ? pinnedColumns[pinnedPosition].length // pinned section
82
+ : columns.length - pinnedColumns.left.length - pinnedColumns.right.length; // middle section
83
+ const sectionIndex = pinnedPosition ? pinnedColumns[pinnedPosition].findIndex(col => col.field === column.field) // pinned section
84
+ : colIndex - pinnedColumns.left.length; // middle section
85
+ const pinnedStyle = pinnedPosition && getPinnedStyle(column.computedWidth, colIndex, pinnedPosition);
86
+ const gridHasFiller = dimensions.columnsTotalWidth < dimensions.viewportOuterSize.width;
87
+ const showRightBorder = shouldCellShowRightBorder(pinnedPosition, sectionIndex, sectionLength, rootProps.showCellVerticalBorder, gridHasFiller);
88
+ const showLeftBorder = shouldCellShowLeftBorder(pinnedPosition, sectionIndex);
89
+ const isLastColumn = colIndex === columns.length - 1;
90
+ const isFirstPinnedRight = isPinnedRight && sectionIndex === 0;
91
+ const hasFillerBefore = isFirstPinnedRight && gridHasFiller;
92
+ const hasFillerAfter = isLastColumn && !isFirstPinnedRight && gridHasFiller;
93
+ const expandedWidth = dimensions.viewportOuterSize.width - dimensions.columnsTotalWidth;
94
+ const emptyCellWidth = Math.max(0, expandedWidth);
95
+ const emptyCell = /*#__PURE__*/_jsx(slots.skeletonCell, {
96
+ width: emptyCellWidth,
97
+ empty: true
98
+ }, `skeleton-filler-column-${i}`);
99
+ const scrollbarWidth = dimensions.hasScrollY ? dimensions.scrollbarSize : 0;
100
+ const hasScrollbarFiller = isLastColumn && scrollbarWidth !== 0;
101
+ if (hasFillerBefore) {
102
+ rowCells.push(emptyCell);
103
+ }
104
+ rowCells.push( /*#__PURE__*/_jsx(slots.skeletonCell, {
105
+ field: column.field,
106
+ type: column.type,
107
+ align: column.align,
108
+ width: "var(--width)",
109
+ height: dimensions.rowHeight,
110
+ "data-colindex": colIndex,
111
+ className: clsx(isPinnedLeft && gridClasses['cell--pinnedLeft'], isPinnedRight && gridClasses['cell--pinnedRight'], showRightBorder && gridClasses['cell--withRightBorder'], showLeftBorder && gridClasses['cell--withLeftBorder']),
112
+ style: _extends({
113
+ '--width': `${column.computedWidth}px`
114
+ }, pinnedStyle)
115
+ }, `skeleton-column-${i}-${column.field}`));
116
+ if (hasFillerAfter) {
117
+ rowCells.push(emptyCell);
118
+ }
119
+ if (hasScrollbarFiller) {
120
+ rowCells.push( /*#__PURE__*/_jsx(GridScrollbarFillerCell, {
121
+ pinnedRight: pinnedColumns.right.length > 0
122
+ }));
123
+ }
124
+ }
125
+ array.push( /*#__PURE__*/_jsx("div", {
126
+ className: clsx(gridClasses.row, gridClasses.rowSkeleton, i === 0 && gridClasses['row--firstVisible']),
127
+ children: rowCells
128
+ }, `skeleton-row-${i}`));
129
+ }
130
+ return array;
131
+ }, [slots, columns, pinnedColumns, skeletonRowsCount, rootProps.showCellVerticalBorder, dimensions.columnsTotalWidth, dimensions.viewportOuterSize.width, dimensions.rowHeight, dimensions.hasScrollY, dimensions.scrollbarSize, getPinnedPosition, getPinnedStyle]);
132
+
133
+ // Sync the column resize of the overlay columns with the grid
134
+ const handleColumnResize = params => {
135
+ const {
136
+ colDef,
137
+ width
138
+ } = params;
139
+ const cells = ref.current?.querySelectorAll(`[data-field="${escapeOperandAttributeSelector(colDef.field)}"]`);
140
+ if (!cells) {
141
+ throw new Error('MUI X: Expected skeleton cells to be defined with `data-field` attribute.');
142
+ }
143
+ const resizedColIndex = columns.findIndex(col => col.field === colDef.field);
144
+ const pinnedPosition = getPinnedPosition(colDef.field);
145
+ const isPinnedLeft = pinnedPosition === GridPinnedColumnPosition.LEFT;
146
+ const isPinnedRight = pinnedPosition === GridPinnedColumnPosition.RIGHT;
147
+ const currentWidth = getComputedStyle(cells[0]).getPropertyValue('--width');
148
+ const delta = parseInt(currentWidth, 10) - width;
149
+ if (cells) {
150
+ cells.forEach(element => {
151
+ element.style.setProperty('--width', `${width}px`);
152
+ });
153
+ }
154
+ if (isPinnedLeft) {
155
+ const pinnedCells = ref.current?.querySelectorAll(`.${gridClasses['cell--pinnedLeft']}`);
156
+ pinnedCells?.forEach(element => {
157
+ const colIndex = getColIndex(element);
158
+ if (colIndex > resizedColIndex) {
159
+ element.style.left = `${parseInt(getComputedStyle(element).left, 10) - delta}px`;
160
+ }
161
+ });
162
+ }
163
+ if (isPinnedRight) {
164
+ const pinnedCells = ref.current?.querySelectorAll(`.${gridClasses['cell--pinnedRight']}`);
165
+ pinnedCells?.forEach(element => {
166
+ const colIndex = getColIndex(element);
167
+ if (colIndex < resizedColIndex) {
168
+ element.style.right = `${parseInt(getComputedStyle(element).right, 10) + delta}px`;
169
+ }
170
+ });
171
+ }
172
+ };
173
+ useGridApiEventHandler(apiRef, 'columnResize', handleColumnResize);
174
+ return /*#__PURE__*/_jsx(SkeletonOverlay, _extends({
175
+ className: classes.root,
176
+ ref: handleRef
177
+ }, props, {
178
+ children: children
179
+ }));
180
+ });
181
+ export { GridSkeletonLoadingOverlay };
@@ -5,8 +5,6 @@ import { styled } from '@mui/system';
5
5
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
6
6
  import clsx from 'clsx';
7
7
  import { useGridSelector } from '../../hooks/utils/useGridSelector';
8
- import { gridExpandedRowCountSelector } from '../../hooks/features/filter/gridFilterSelector';
9
- import { gridRowCountSelector, gridRowsLoadingSelector } from '../../hooks/features/rows/gridRowsSelector';
10
8
  import { gridDimensionsSelector } from '../../hooks/features/dimensions';
11
9
  import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
12
10
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
@@ -17,11 +15,14 @@ import { jsx as _jsx } from "react/jsx-runtime";
17
15
  const GridOverlayWrapperRoot = styled('div', {
18
16
  name: 'MuiDataGrid',
19
17
  slot: 'OverlayWrapper',
20
- shouldForwardProp: prop => prop !== 'overlayType',
18
+ shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
21
19
  overridesResolver: (props, styles) => styles.overlayWrapper
22
20
  })(({
23
- overlayType
24
- }) => ({
21
+ overlayType,
22
+ loadingOverlayVariant
23
+ }) =>
24
+ // Skeleton overlay should flow with the scroll container and not be sticky
25
+ loadingOverlayVariant !== 'skeleton' ? {
25
26
  position: 'sticky',
26
27
  // To stay in place while scrolling
27
28
  top: 'var(--DataGrid-headersTotalHeight)',
@@ -32,11 +33,11 @@ const GridOverlayWrapperRoot = styled('div', {
32
33
  // To stay above the content instead of shifting it down
33
34
  zIndex: overlayType === 'loadingOverlay' ? 5 // Should be above pinned columns, pinned rows, and detail panel
34
35
  : 4 // Should be above pinned columns and detail panel
35
- }));
36
+ } : {});
36
37
  const GridOverlayWrapperInner = styled('div', {
37
38
  name: 'MuiDataGrid',
38
39
  slot: 'OverlayWrapperInner',
39
- shouldForwardProp: prop => prop !== 'overlayType',
40
+ shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
40
41
  overridesResolver: (props, styles) => styles.overlayWrapperInner
41
42
  })({});
42
43
  const useUtilityClasses = ownerState => {
@@ -61,9 +62,9 @@ function GridOverlayWrapper(props) {
61
62
  const classes = useUtilityClasses(_extends({}, props, {
62
63
  classes: rootProps.classes
63
64
  }));
64
- return /*#__PURE__*/_jsx(GridOverlayWrapperRoot, {
65
- className: clsx(classes.root),
66
- overlayType: props.overlayType,
65
+ return /*#__PURE__*/_jsx(GridOverlayWrapperRoot, _extends({
66
+ className: clsx(classes.root)
67
+ }, props, {
67
68
  children: /*#__PURE__*/_jsx(GridOverlayWrapperInner, _extends({
68
69
  className: clsx(classes.inner),
69
70
  style: {
@@ -71,42 +72,27 @@ function GridOverlayWrapper(props) {
71
72
  width: dimensions.viewportOuterSize.width
72
73
  }
73
74
  }, props))
74
- });
75
+ }));
75
76
  }
76
- process.env.NODE_ENV !== "production" ? GridOverlayWrapper.propTypes = {
77
+ process.env.NODE_ENV !== "production" ? GridOverlays.propTypes = {
77
78
  // ----------------------------- Warning --------------------------------
78
79
  // | These PropTypes are generated from the TypeScript type definitions |
79
80
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
80
81
  // ----------------------------------------------------------------------
81
- overlayType: PropTypes.string.isRequired
82
+ loadingOverlayVariant: PropTypes.oneOf(['circular-progress', 'linear-progress', 'skeleton']),
83
+ overlayType: PropTypes.oneOf(['loadingOverlay', 'noResultsOverlay', 'noRowsOverlay'])
82
84
  } : void 0;
83
- export function GridOverlays() {
84
- const apiRef = useGridApiContext();
85
+ export function GridOverlays(props) {
86
+ const {
87
+ overlayType
88
+ } = props;
85
89
  const rootProps = useGridRootProps();
86
- const totalRowCount = useGridSelector(apiRef, gridRowCountSelector);
87
- const visibleRowCount = useGridSelector(apiRef, gridExpandedRowCountSelector);
88
- const loading = useGridSelector(apiRef, gridRowsLoadingSelector);
89
- const showNoRowsOverlay = !loading && totalRowCount === 0;
90
- const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
91
- let overlay = null;
92
- let overlayType = '';
93
- if (showNoRowsOverlay) {
94
- overlay = /*#__PURE__*/_jsx(rootProps.slots.noRowsOverlay, _extends({}, rootProps.slotProps?.noRowsOverlay));
95
- overlayType = 'noRowsOverlay';
96
- }
97
- if (showNoResultsOverlay) {
98
- overlay = /*#__PURE__*/_jsx(rootProps.slots.noResultsOverlay, _extends({}, rootProps.slotProps?.noResultsOverlay));
99
- overlayType = 'noResultsOverlay';
100
- }
101
- if (loading) {
102
- overlay = /*#__PURE__*/_jsx(rootProps.slots.loadingOverlay, _extends({}, rootProps.slotProps?.loadingOverlay));
103
- overlayType = 'loadingOverlay';
104
- }
105
- if (overlay === null) {
90
+ if (!overlayType) {
106
91
  return null;
107
92
  }
108
- return /*#__PURE__*/_jsx(GridOverlayWrapper, {
109
- overlayType: overlayType,
110
- children: overlay
111
- });
93
+ const Overlay = rootProps.slots?.[overlayType];
94
+ const overlayProps = rootProps.slotProps?.[overlayType];
95
+ return /*#__PURE__*/_jsx(GridOverlayWrapper, _extends({}, props, {
96
+ children: /*#__PURE__*/_jsx(Overlay, _extends({}, overlayProps))
97
+ }));
112
98
  }
@@ -1,52 +1,88 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["field", "align", "width", "height"];
3
+ const _excluded = ["field", "type", "align", "width", "height", "empty", "style", "className"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import Skeleton from '@mui/material/Skeleton';
7
7
  import { unstable_composeClasses as composeClasses, unstable_capitalize as capitalize } from '@mui/utils';
8
+ import clsx from 'clsx';
8
9
  import { fastMemo } from '../../utils/fastMemo';
9
- import { randomNumberBetween } from '../../utils/utils';
10
+ import { createRandomNumberGenerator } from '../../utils/utils';
10
11
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
11
12
  import { getDataGridUtilityClass } from '../../constants/gridClasses';
12
13
  import { jsx as _jsx } from "react/jsx-runtime";
13
- const randomWidth = randomNumberBetween(10000, 20, 80);
14
+ const CIRCULAR_CONTENT_SIZE = '1.3em';
15
+ const CONTENT_HEIGHT = '1.2em';
16
+ const DEFAULT_CONTENT_WIDTH_RANGE = [40, 80];
17
+ const CONTENT_WIDTH_RANGE_BY_TYPE = {
18
+ number: [40, 60],
19
+ string: [40, 80],
20
+ date: [40, 60],
21
+ dateTime: [60, 80],
22
+ singleSelect: [40, 80]
23
+ };
14
24
  const useUtilityClasses = ownerState => {
15
25
  const {
16
26
  align,
17
- classes
27
+ classes,
28
+ empty
18
29
  } = ownerState;
19
30
  const slots = {
20
- root: ['cell', 'cellSkeleton', `cell--text${capitalize(align)}`, 'withBorderColor']
31
+ root: ['cell', 'cellSkeleton', `cell--text${align ? capitalize(align) : 'Left'}`, empty && 'cellEmpty']
21
32
  };
22
33
  return composeClasses(slots, getDataGridUtilityClass, classes);
23
34
  };
35
+ const randomNumberGenerator = createRandomNumberGenerator(12345);
24
36
  function GridSkeletonCell(props) {
25
37
  const {
38
+ field,
39
+ type,
26
40
  align,
27
41
  width,
28
- height
42
+ height,
43
+ empty = false,
44
+ style,
45
+ className
29
46
  } = props,
30
47
  other = _objectWithoutPropertiesLoose(props, _excluded);
31
48
  const rootProps = useGridRootProps();
32
49
  const ownerState = {
33
50
  classes: rootProps.classes,
34
- align
51
+ align,
52
+ empty
35
53
  };
36
54
  const classes = useUtilityClasses(ownerState);
37
- const contentWidth = Math.round(randomWidth());
55
+
56
+ // Memo prevents the non-circular skeleton widths changing to random widths on every render
57
+ const skeletonProps = React.useMemo(() => {
58
+ const isCircularContent = type === 'boolean' || type === 'actions';
59
+ if (isCircularContent) {
60
+ return {
61
+ variant: 'circular',
62
+ width: CIRCULAR_CONTENT_SIZE,
63
+ height: CIRCULAR_CONTENT_SIZE
64
+ };
65
+ }
66
+
67
+ // The width of the skeleton is a random number between the min and max values
68
+ // The min and max values are determined by the type of the column
69
+ const [min, max] = type ? CONTENT_WIDTH_RANGE_BY_TYPE[type] ?? DEFAULT_CONTENT_WIDTH_RANGE : DEFAULT_CONTENT_WIDTH_RANGE;
70
+ return {
71
+ variant: 'text',
72
+ width: `${Math.round(randomNumberGenerator(min, max))}%`,
73
+ height: CONTENT_HEIGHT
74
+ };
75
+ }, [type]);
38
76
  return /*#__PURE__*/_jsx("div", _extends({
39
- className: classes.root,
40
- style: {
77
+ "data-field": field,
78
+ className: clsx(classes.root, className),
79
+ style: _extends({
41
80
  height,
42
81
  maxWidth: width,
43
82
  minWidth: width
44
- }
83
+ }, style)
45
84
  }, other, {
46
- children: /*#__PURE__*/_jsx(Skeleton, {
47
- width: `${contentWidth}%`,
48
- height: 25
49
- })
85
+ children: !empty && /*#__PURE__*/_jsx(Skeleton, _extends({}, skeletonProps))
50
86
  }));
51
87
  }
52
88
  process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
@@ -54,10 +90,16 @@ process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
54
90
  // | These PropTypes are generated from the TypeScript type definitions |
55
91
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
56
92
  // ----------------------------------------------------------------------
57
- align: PropTypes.string.isRequired,
58
- field: PropTypes.string.isRequired,
59
- height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]).isRequired,
60
- width: PropTypes.number.isRequired
93
+ align: PropTypes.string,
94
+ /**
95
+ * If `true`, the cell will not display the skeleton but still reserve the cell space.
96
+ * @default false
97
+ */
98
+ empty: PropTypes.bool,
99
+ field: PropTypes.string,
100
+ height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
101
+ type: PropTypes.oneOf(['actions', 'boolean', 'custom', 'date', 'dateTime', 'number', 'singleSelect', 'string']),
102
+ width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
61
103
  } : void 0;
62
104
  const Memoized = fastMemo(GridSkeletonCell);
63
105
  export { Memoized as GridSkeletonCell };
@@ -5,7 +5,6 @@ import clsx from 'clsx';
5
5
  import { unstable_composeClasses as composeClasses, unstable_useId as useId } from '@mui/utils';
6
6
  import { fastMemo } from '../../utils/fastMemo';
7
7
  import { useGridPrivateApiContext } from '../../hooks/utils/useGridPrivateApiContext';
8
- import { GridColumnHeaderSortIcon } from './GridColumnHeaderSortIcon';
9
8
  import { ColumnHeaderMenuIcon } from './ColumnHeaderMenuIcon';
10
9
  import { GridColumnHeaderMenu } from '../menu/columnMenu/GridColumnHeaderMenu';
11
10
  import { gridClasses, getDataGridUtilityClass } from '../../constants/gridClasses';
@@ -142,12 +141,13 @@ function GridColumnHeaderItem(props) {
142
141
  children: [!rootProps.disableColumnFilter && /*#__PURE__*/_jsx(rootProps.slots.columnHeaderFilterIconButton, _extends({
143
142
  field: colDef.field,
144
143
  counter: filterItemsCounter
145
- }, rootProps.slotProps?.columnHeaderFilterIconButton)), showSortIcon && /*#__PURE__*/_jsx(GridColumnHeaderSortIcon, {
144
+ }, rootProps.slotProps?.columnHeaderFilterIconButton)), showSortIcon && /*#__PURE__*/_jsx(rootProps.slots.columnHeaderSortIcon, _extends({
145
+ field: colDef.field,
146
146
  direction: sortDirection,
147
147
  index: sortIndex,
148
148
  sortingOrder: sortingOrder,
149
149
  disabled: !colDef.sortable
150
- })]
150
+ }, rootProps.slotProps?.columnHeaderSortIcon))]
151
151
  });
152
152
  React.useLayoutEffect(() => {
153
153
  const columnMenuState = apiRef.current.state.columnMenu;
@@ -1,4 +1,6 @@
1
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
1
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
+ const _excluded = ["direction", "index", "sortingOrder", "disabled"];
2
4
  import * as React from 'react';
3
5
  import PropTypes from 'prop-types';
4
6
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
@@ -35,11 +37,12 @@ function getIcon(icons, direction, className, sortingOrder) {
35
37
  }
36
38
  function GridColumnHeaderSortIconRaw(props) {
37
39
  const {
38
- direction,
39
- index,
40
- sortingOrder,
41
- disabled
42
- } = props;
40
+ direction,
41
+ index,
42
+ sortingOrder,
43
+ disabled
44
+ } = props,
45
+ other = _objectWithoutPropertiesLoose(props, _excluded);
43
46
  const apiRef = useGridApiContext();
44
47
  const rootProps = useGridRootProps();
45
48
  const ownerState = _extends({}, props, {
@@ -56,13 +59,14 @@ function GridColumnHeaderSortIconRaw(props) {
56
59
  title: apiRef.current.getLocaleText('columnHeaderSortIconLabel'),
57
60
  size: "small",
58
61
  disabled: disabled
59
- }, rootProps.slotProps?.baseIconButton, {
62
+ }, rootProps.slotProps?.baseIconButton, other, {
60
63
  children: iconElement
61
64
  }));
62
65
  return /*#__PURE__*/_jsxs(GridIconButtonContainer, {
63
66
  children: [index != null && /*#__PURE__*/_jsx(Badge, {
64
67
  badgeContent: index,
65
68
  color: "default",
69
+ overlap: "circular",
66
70
  children: iconButton
67
71
  }), index == null && iconButton]
68
72
  });
@@ -75,6 +79,7 @@ process.env.NODE_ENV !== "production" ? GridColumnHeaderSortIconRaw.propTypes =
75
79
  // ----------------------------------------------------------------------
76
80
  direction: PropTypes.oneOf(['asc', 'desc']),
77
81
  disabled: PropTypes.bool,
82
+ field: PropTypes.string.isRequired,
78
83
  index: PropTypes.number,
79
84
  sortingOrder: PropTypes.arrayOf(PropTypes.oneOf(['asc', 'desc'])).isRequired
80
85
  } : void 0;
@@ -141,6 +141,8 @@ export const GridRootStyles = styled('div', {
141
141
  [`& .${c.treeDataGroupingCell}`]: styles.treeDataGroupingCell
142
142
  }, {
143
143
  [`& .${c.treeDataGroupingCellToggle}`]: styles.treeDataGroupingCellToggle
144
+ }, {
145
+ [`& .${c.treeDataGroupingCellLoadingContainer}`]: styles.treeDataGroupingCellLoadingContainer
144
146
  }, {
145
147
  [`& .${c.detailPanelToggleCell}`]: styles.detailPanelToggleCell
146
148
  }, {
@@ -159,7 +161,7 @@ export const GridRootStyles = styled('div', {
159
161
  const selectedOpacity = (t.vars || t).palette.action.selectedOpacity;
160
162
  const selectedBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / ${selectedOpacity})` : alpha(t.palette.primary.main, selectedOpacity);
161
163
  const selectedHoverBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / calc(
162
- ${t.vars.palette.action.selectedOpacity} +
164
+ ${t.vars.palette.action.selectedOpacity} +
163
165
  ${t.vars.palette.action.hoverOpacity}
164
166
  ))` : alpha(t.palette.primary.main, t.palette.action.selectedOpacity + t.palette.action.hoverOpacity);
165
167
  const pinnedHoverBackground = t.vars ? hoverColor : blend(pinnedBackground, hoverColor, hoverOpacity);
@@ -423,6 +425,9 @@ export const GridRootStyles = styled('div', {
423
425
  backgroundColor: 'transparent'
424
426
  }
425
427
  },
428
+ [`&.${c.rowSkeleton}:hover`]: {
429
+ backgroundColor: 'transparent'
430
+ },
426
431
  '&.Mui-selected': selectedStyles
427
432
  },
428
433
  [`& .${c['container--top']}, & .${c['container--bottom']}`]: {
@@ -608,6 +613,12 @@ export const GridRootStyles = styled('div', {
608
613
  alignSelf: 'stretch',
609
614
  marginRight: t.spacing(2)
610
615
  },
616
+ [`& .${c.treeDataGroupingCellLoadingContainer}`]: {
617
+ display: 'flex',
618
+ alignItems: 'center',
619
+ justifyContent: 'center',
620
+ height: '100%'
621
+ },
611
622
  [`& .${c.groupingCriteriaCell}`]: {
612
623
  display: 'flex',
613
624
  alignItems: 'center',
@@ -623,7 +634,7 @@ export const GridRootStyles = styled('div', {
623
634
  minWidth: 'calc(var(--DataGrid-hasScrollY) * var(--DataGrid-scrollbarSize))',
624
635
  alignSelf: 'stretch',
625
636
  [`&.${c['scrollbarFiller--borderTop']}`]: {
626
- borderTop: '1px solid var(--DataGrid-rowBorderColor)'
637
+ borderTop: '1px solid var(--rowBorderColor)'
627
638
  },
628
639
  [`&.${c['scrollbarFiller--pinnedRight']}`]: {
629
640
  backgroundColor: 'var(--DataGrid-pinnedBackground)',
@@ -636,6 +647,12 @@ export const GridRootStyles = styled('div', {
636
647
  },
637
648
  [`& .${c['filler--borderTop']}`]: {
638
649
  borderTop: '1px solid var(--DataGrid-rowBorderColor)'
650
+ },
651
+ /* Hide grid rows and vertical scrollbar when skeleton overlay is visible */
652
+ [`& .${c['main--hasSkeletonLoadingOverlay']}`]: {
653
+ [`& .${c.virtualScrollerContent}, & .${c['scrollbar--vertical']}, & .${c.pinnedRows}`]: {
654
+ display: 'none'
655
+ }
639
656
  }
640
657
  });
641
658
  return gridStyle;
@@ -9,7 +9,8 @@ import { useGridSelector } from '../../hooks/utils/useGridSelector';
9
9
  import { getDataGridUtilityClass } from '../../constants/gridClasses';
10
10
  import { gridDimensionsSelector } from '../../hooks/features/dimensions';
11
11
  import { useGridVirtualScroller } from '../../hooks/features/virtualization/useGridVirtualScroller';
12
- import { GridOverlays } from '../base/GridOverlays';
12
+ import { useGridOverlays } from '../../hooks/features/overlays/useGridOverlays';
13
+ import { GridOverlays as Overlays } from '../base/GridOverlays';
13
14
  import { GridHeaders } from '../GridHeaders';
14
15
  import { GridMainContainer as Container } from './GridMainContainer';
15
16
  import { GridTopContainer as TopContainer } from './GridTopContainer';
@@ -19,12 +20,12 @@ import { GridVirtualScrollerFiller as SpaceFiller } from './GridVirtualScrollerF
19
20
  import { GridVirtualScrollerRenderZone as RenderZone } from './GridVirtualScrollerRenderZone';
20
21
  import { GridVirtualScrollbar as Scrollbar } from './GridVirtualScrollbar';
21
22
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
22
- const useUtilityClasses = (ownerState, dimensions) => {
23
+ const useUtilityClasses = (ownerState, dimensions, loadingOverlayVariant) => {
23
24
  const {
24
25
  classes
25
26
  } = ownerState;
26
27
  const slots = {
27
- root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight'],
28
+ root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
28
29
  scroller: ['virtualScroller']
29
30
  };
30
31
  return composeClasses(slots, getDataGridUtilityClass, classes);
@@ -51,7 +52,8 @@ function GridVirtualScroller(props) {
51
52
  const apiRef = useGridApiContext();
52
53
  const rootProps = useGridRootProps();
53
54
  const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
54
- const classes = useUtilityClasses(rootProps, dimensions);
55
+ const overlaysProps = useGridOverlays();
56
+ const classes = useUtilityClasses(rootProps, dimensions, overlaysProps.loadingOverlayVariant);
55
57
  const virtualScroller = useGridVirtualScroller();
56
58
  const {
57
59
  getContainerProps,
@@ -79,7 +81,7 @@ function GridVirtualScroller(props) {
79
81
  position: "top",
80
82
  virtualScroller: virtualScroller
81
83
  })]
82
- }), /*#__PURE__*/_jsx(GridOverlays, {}), /*#__PURE__*/_jsx(Content, _extends({}, getContentProps(), {
84
+ }), /*#__PURE__*/_jsx(Overlays, _extends({}, overlaysProps)), /*#__PURE__*/_jsx(Content, _extends({}, getContentProps(), {
83
85
  children: /*#__PURE__*/_jsxs(RenderZone, _extends({}, getRenderZoneProps(), {
84
86
  children: [rows, /*#__PURE__*/_jsx(rootProps.slots.detailPanels, {
85
87
  virtualScroller: virtualScroller
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { GridSkeletonCell, GridColumnsPanel, GridFilterPanel, GridFooter, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridRow, GridColumnHeaderFilterIconButton, GridRowCount, GridColumnsManagement } from '../components';
2
+ import { GridSkeletonCell, GridColumnsPanel, GridFilterPanel, GridFooter, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridRow, GridColumnHeaderFilterIconButton, GridRowCount, GridColumnsManagement, GridColumnHeaderSortIcon } from '../components';
3
3
  import { GridCell } from '../components/cell/GridCell';
4
4
  import { GridColumnHeaders } from '../components/GridColumnHeaders';
5
5
  import { GridColumnMenu } from '../components/menu/columnMenu/GridColumnMenu';
@@ -14,6 +14,7 @@ export const DATA_GRID_DEFAULT_SLOTS_COMPONENTS = _extends({}, materialSlots, {
14
14
  cell: GridCell,
15
15
  skeletonCell: GridSkeletonCell,
16
16
  columnHeaderFilterIconButton: GridColumnHeaderFilterIconButton,
17
+ columnHeaderSortIcon: GridColumnHeaderSortIcon,
17
18
  columnMenu: GridColumnMenu,
18
19
  columnHeaders: GridColumnHeaders,
19
20
  detailPanels: GridDetailPanels,
@@ -2,4 +2,4 @@ import { unstable_generateUtilityClasses as generateUtilityClasses, unstable_gen
2
2
  export function getDataGridUtilityClass(slot) {
3
3
  return generateUtilityClass('MuiDataGrid', slot);
4
4
  }
5
- export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
5
+ export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'main--hasSkeletonLoadingOverlay', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'rowSkeleton', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'treeDataGroupingCellLoadingContainer', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);