@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
@@ -49,6 +49,7 @@ export function useGridDimensions(apiRef, props) {
49
49
  const logger = useGridLogger(apiRef, 'useResizeContainer');
50
50
  const errorShown = React.useRef(false);
51
51
  const rootDimensionsRef = React.useRef(EMPTY_SIZE);
52
+ const dimensionsState = useGridSelector(apiRef, gridDimensionsSelector);
52
53
  const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
53
54
  const pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
54
55
  const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
@@ -208,26 +209,25 @@ export function useGridDimensions(apiRef, props) {
208
209
  }
209
210
  }, [apiRef, savedSize, updateDimensions]);
210
211
  const root = apiRef.current.rootElementRef.current;
211
- const dimensions = apiRef.current.state.dimensions;
212
212
  useEnhancedEffect(() => {
213
213
  if (!root) {
214
214
  return;
215
215
  }
216
216
  const set = (k, v) => root.style.setProperty(k, v);
217
- set('--DataGrid-width', `${dimensions.viewportOuterSize.width}px`);
218
- set('--DataGrid-hasScrollX', `${Number(dimensions.hasScrollX)}`);
219
- set('--DataGrid-hasScrollY', `${Number(dimensions.hasScrollY)}`);
220
- set('--DataGrid-scrollbarSize', `${dimensions.scrollbarSize}px`);
221
- set('--DataGrid-rowWidth', `${dimensions.rowWidth}px`);
222
- set('--DataGrid-columnsTotalWidth', `${dimensions.columnsTotalWidth}px`);
223
- set('--DataGrid-leftPinnedWidth', `${dimensions.leftPinnedWidth}px`);
224
- set('--DataGrid-rightPinnedWidth', `${dimensions.rightPinnedWidth}px`);
225
- set('--DataGrid-headerHeight', `${dimensions.headerHeight}px`);
226
- set('--DataGrid-headersTotalHeight', `${dimensions.headersTotalHeight}px`);
227
- set('--DataGrid-topContainerHeight', `${dimensions.topContainerHeight}px`);
228
- set('--DataGrid-bottomContainerHeight', `${dimensions.bottomContainerHeight}px`);
229
- set('--height', `${dimensions.rowHeight}px`);
230
- }, [root, dimensions]);
217
+ set('--DataGrid-width', `${dimensionsState.viewportOuterSize.width}px`);
218
+ set('--DataGrid-hasScrollX', `${Number(dimensionsState.hasScrollX)}`);
219
+ set('--DataGrid-hasScrollY', `${Number(dimensionsState.hasScrollY)}`);
220
+ set('--DataGrid-scrollbarSize', `${dimensionsState.scrollbarSize}px`);
221
+ set('--DataGrid-rowWidth', `${dimensionsState.rowWidth}px`);
222
+ set('--DataGrid-columnsTotalWidth', `${dimensionsState.columnsTotalWidth}px`);
223
+ set('--DataGrid-leftPinnedWidth', `${dimensionsState.leftPinnedWidth}px`);
224
+ set('--DataGrid-rightPinnedWidth', `${dimensionsState.rightPinnedWidth}px`);
225
+ set('--DataGrid-headerHeight', `${dimensionsState.headerHeight}px`);
226
+ set('--DataGrid-headersTotalHeight', `${dimensionsState.headersTotalHeight}px`);
227
+ set('--DataGrid-topContainerHeight', `${dimensionsState.topContainerHeight}px`);
228
+ set('--DataGrid-bottomContainerHeight', `${dimensionsState.bottomContainerHeight}px`);
229
+ set('--height', `${dimensionsState.rowHeight}px`);
230
+ }, [root, dimensionsState]);
231
231
  const isFirstSizing = React.useRef(true);
232
232
  const handleResize = React.useCallback(size => {
233
233
  rootDimensionsRef.current = size;
@@ -119,14 +119,15 @@ export const useGridPrintExport = (apiRef, props) => {
119
119
  gridClone.style.height = `${computedTotalHeight}px`;
120
120
  // The height above does not include grid border width, so we need to exclude it
121
121
  gridClone.style.boxSizing = 'content-box';
122
-
123
- // the footer is always being placed at the bottom of the page as if all rows are exported
124
- // so if getRowsToExport is being used to only export a subset of rows then we need to
125
- // adjust the footer position to be correctly placed at the bottom of the grid
126
- const gridFooterElement = gridClone.querySelector(`.${gridClasses.footerContainer}`);
127
- gridFooterElement.style.position = 'absolute';
128
- gridFooterElement.style.width = '100%';
129
- gridFooterElement.style.top = `${computedTotalHeight - gridFooterElementHeight}px`;
122
+ if (!normalizeOptions.hideFooter) {
123
+ // the footer is always being placed at the bottom of the page as if all rows are exported
124
+ // so if getRowsToExport is being used to only export a subset of rows then we need to
125
+ // adjust the footer position to be correctly placed at the bottom of the grid
126
+ const gridFooterElement = gridClone.querySelector(`.${gridClasses.footerContainer}`);
127
+ gridFooterElement.style.position = 'absolute';
128
+ gridFooterElement.style.width = '100%';
129
+ gridFooterElement.style.top = `${computedTotalHeight - gridFooterElementHeight}px`;
130
+ }
130
131
 
131
132
  // printDoc.body.appendChild(gridClone); should be enough but a clone isolation bug in Safari
132
133
  // prevents us to do it
@@ -0,0 +1,35 @@
1
+ import { useGridSelector } from '../../utils';
2
+ import { useGridApiContext } from '../../utils/useGridApiContext';
3
+ import { useGridRootProps } from '../../utils/useGridRootProps';
4
+ import { gridExpandedRowCountSelector } from '../filter';
5
+ import { gridRowCountSelector, gridRowsLoadingSelector } from '../rows';
6
+ /**
7
+ * Uses the grid state to determine which overlay to display.
8
+ * Returns the active overlay type and the active loading overlay variant.
9
+ */
10
+ export const useGridOverlays = () => {
11
+ const apiRef = useGridApiContext();
12
+ const rootProps = useGridRootProps();
13
+ const totalRowCount = useGridSelector(apiRef, gridRowCountSelector);
14
+ const visibleRowCount = useGridSelector(apiRef, gridExpandedRowCountSelector);
15
+ const noRows = totalRowCount === 0;
16
+ const loading = useGridSelector(apiRef, gridRowsLoadingSelector);
17
+ const showNoRowsOverlay = !loading && noRows;
18
+ const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
19
+ let overlayType = null;
20
+ let loadingOverlayVariant = null;
21
+ if (showNoRowsOverlay) {
22
+ overlayType = 'noRowsOverlay';
23
+ }
24
+ if (showNoResultsOverlay) {
25
+ overlayType = 'noResultsOverlay';
26
+ }
27
+ if (loading) {
28
+ overlayType = 'loadingOverlay';
29
+ loadingOverlayVariant = rootProps.slotProps?.loadingOverlay?.[noRows ? 'noRowsVariant' : 'variant'] || null;
30
+ }
31
+ return {
32
+ overlayType,
33
+ loadingOverlayVariant
34
+ };
35
+ };
@@ -8,6 +8,7 @@ export const gridTopLevelRowCountSelector = createSelector(gridRowsStateSelector
8
8
  export const gridRowsLookupSelector = createSelector(gridRowsStateSelector, rows => rows.dataRowIdToModelLookup);
9
9
  export const gridRowsDataRowIdToIdLookupSelector = createSelector(gridRowsStateSelector, rows => rows.dataRowIdToIdLookup);
10
10
  export const gridRowTreeSelector = createSelector(gridRowsStateSelector, rows => rows.tree);
11
+ export const gridRowGroupsToFetchSelector = createSelector(gridRowsStateSelector, rows => rows.groupsToFetch);
11
12
  export const gridRowGroupingNameSelector = createSelector(gridRowsStateSelector, rows => rows.groupingName);
12
13
  export const gridRowTreeDepthsSelector = createSelector(gridRowsStateSelector, rows => rows.treeDepths);
13
14
  export const gridRowMaximumTreeDepthSelector = createSelectorMemoized(gridRowsStateSelector, rows => {
@@ -72,7 +72,8 @@ export const getRowsStateFromCache = ({
72
72
  rowCountProp = 0,
73
73
  loadingProp,
74
74
  previousTree,
75
- previousTreeDepths
75
+ previousTreeDepths,
76
+ previousGroupsToFetch
76
77
  }) => {
77
78
  const cache = apiRef.current.caches.rows;
78
79
 
@@ -81,13 +82,15 @@ export const getRowsStateFromCache = ({
81
82
  tree: unProcessedTree,
82
83
  treeDepths: unProcessedTreeDepths,
83
84
  dataRowIds: unProcessedDataRowIds,
84
- groupingName
85
+ groupingName,
86
+ groupsToFetch = []
85
87
  } = apiRef.current.applyStrategyProcessor('rowTreeCreation', {
86
88
  previousTree,
87
89
  previousTreeDepths,
88
90
  updates: cache.updates,
89
91
  dataRowIdToIdLookup: cache.dataRowIdToIdLookup,
90
- dataRowIdToModelLookup: cache.dataRowIdToModelLookup
92
+ dataRowIdToModelLookup: cache.dataRowIdToModelLookup,
93
+ previousGroupsToFetch
91
94
  });
92
95
 
93
96
  // 2. Apply the "hydrateRows" pipe-processing.
@@ -116,7 +119,8 @@ export const getRowsStateFromCache = ({
116
119
  rowCountProp
117
120
  }),
118
121
  groupingName,
119
- loading: loadingProp
122
+ loading: loadingProp,
123
+ groupsToFetch
120
124
  });
121
125
  };
122
126
  export const isAutoGeneratedRow = rowNode => rowNode.type === 'skeletonRow' || rowNode.type === 'footer' || rowNode.type === 'group' && rowNode.isAutoGenerated || rowNode.type === 'pinnedRow' && rowNode.isAutoGenerated;
@@ -144,7 +148,8 @@ export const getTreeNodeDescendants = (tree, parentId, skipAutoGeneratedRows) =>
144
148
  export const updateCacheWithNewRows = ({
145
149
  previousCache,
146
150
  getRowId,
147
- updates
151
+ updates,
152
+ groupKeys
148
153
  }) => {
149
154
  if (previousCache.updates.type === 'full') {
150
155
  throw new Error('MUI X: Unable to prepare a partial update if a full update is not applied yet.');
@@ -168,7 +173,8 @@ export const updateCacheWithNewRows = ({
168
173
  modify: [...(previousCache.updates.actions.modify ?? [])],
169
174
  remove: [...(previousCache.updates.actions.remove ?? [])]
170
175
  },
171
- idToActionLookup: _extends({}, previousCache.updates.idToActionLookup)
176
+ idToActionLookup: _extends({}, previousCache.updates.idToActionLookup),
177
+ groupKeys
172
178
  };
173
179
  const dataRowIdToModelLookup = _extends({}, previousCache.dataRowIdToModelLookup);
174
180
  const dataRowIdToIdLookup = _extends({}, previousCache.dataRowIdToIdLookup);
@@ -281,4 +287,22 @@ export function calculatePinnedRowsHeight(apiRef) {
281
287
  export function getMinimalContentHeight(apiRef) {
282
288
  const dimensions = gridDimensionsSelector(apiRef.current.state);
283
289
  return `var(--DataGrid-overlayHeight, ${2 * dimensions.rowHeight}px)`;
290
+ }
291
+ export function computeRowsUpdates(apiRef, updates, getRowId) {
292
+ const nonPinnedRowsUpdates = [];
293
+ updates.forEach(update => {
294
+ const id = getRowIdFromRowModel(update, getRowId, 'A row was provided without id when calling updateRows():');
295
+ const rowNode = apiRef.current.getRowNode(id);
296
+ if (rowNode?.type === 'pinnedRow') {
297
+ // @ts-ignore because otherwise `release:build` doesn't work
298
+ const pinnedRowsCache = apiRef.current.caches.pinnedRows;
299
+ const prevModel = pinnedRowsCache.idLookup[id];
300
+ if (prevModel) {
301
+ pinnedRowsCache.idLookup[id] = _extends({}, prevModel, update);
302
+ }
303
+ } else {
304
+ nonPinnedRowsUpdates.push(update);
305
+ }
306
+ });
307
+ return nonPinnedRowsUpdates;
284
308
  }
@@ -2,17 +2,18 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
4
4
  import { useGridLogger } from '../../utils/useGridLogger';
5
- import { gridRowCountSelector, gridRowsLookupSelector, gridRowTreeSelector, gridRowGroupingNameSelector, gridRowTreeDepthsSelector, gridDataRowIdsSelector, gridRowsDataRowIdToIdLookupSelector, gridRowMaximumTreeDepthSelector } from './gridRowsSelector';
5
+ import { gridRowCountSelector, gridRowsLookupSelector, gridRowTreeSelector, gridRowGroupingNameSelector, gridRowTreeDepthsSelector, gridDataRowIdsSelector, gridRowsDataRowIdToIdLookupSelector, gridRowMaximumTreeDepthSelector, gridRowGroupsToFetchSelector } from './gridRowsSelector';
6
6
  import { useTimeout } from '../../utils/useTimeout';
7
7
  import { GridSignature, useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
8
8
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
9
9
  import { gridSortedRowIdsSelector } from '../sorting/gridSortingSelector';
10
10
  import { gridFilteredRowsLookupSelector } from '../filter/gridFilterSelector';
11
- import { getTreeNodeDescendants, createRowsInternalCache, getRowsStateFromCache, isAutoGeneratedRow, GRID_ROOT_GROUP_ID, GRID_ID_AUTOGENERATED, updateCacheWithNewRows, getTopLevelRowCount, getRowIdFromRowModel } from './gridRowsUtils';
11
+ import { getTreeNodeDescendants, createRowsInternalCache, getRowsStateFromCache, isAutoGeneratedRow, GRID_ROOT_GROUP_ID, GRID_ID_AUTOGENERATED, updateCacheWithNewRows, getTopLevelRowCount, getRowIdFromRowModel, computeRowsUpdates } from './gridRowsUtils';
12
12
  import { useGridRegisterPipeApplier } from '../../core/pipeProcessing';
13
13
  export const rowsStateInitializer = (state, props, apiRef) => {
14
+ const isDataSourceAvailable = !!props.unstable_dataSource;
14
15
  apiRef.current.caches.rows = createRowsInternalCache({
15
- rows: props.rows,
16
+ rows: isDataSourceAvailable ? [] : props.rows,
16
17
  getRowId: props.getRowId,
17
18
  loading: props.loading,
18
19
  rowCount: props.rowCount
@@ -21,7 +22,7 @@ export const rowsStateInitializer = (state, props, apiRef) => {
21
22
  rows: getRowsStateFromCache({
22
23
  apiRef,
23
24
  rowCountProp: props.rowCount,
24
- loadingProp: props.loading,
25
+ loadingProp: isDataSourceAvailable ? true : props.loading,
25
26
  previousTree: null,
26
27
  previousTreeDepths: null
27
28
  })
@@ -82,7 +83,8 @@ export const useGridRows = (apiRef, props) => {
82
83
  rowCountProp: props.rowCount,
83
84
  loadingProp: props.loading,
84
85
  previousTree: gridRowTreeSelector(apiRef),
85
- previousTreeDepths: gridRowTreeDepthsSelector(apiRef)
86
+ previousTreeDepths: gridRowTreeDepthsSelector(apiRef),
87
+ previousGroupsToFetch: gridRowGroupsToFetchSelector(apiRef)
86
88
  })
87
89
  }));
88
90
  apiRef.current.publishEvent('rowsSet');
@@ -124,21 +126,7 @@ export const useGridRows = (apiRef, props) => {
124
126
  if (props.signature === GridSignature.DataGrid && updates.length > 1) {
125
127
  throw new Error(['MUI X: You cannot update several rows at once in `apiRef.current.updateRows` on the DataGrid.', 'You need to upgrade to DataGridPro or DataGridPremium component to unlock this feature.'].join('\n'));
126
128
  }
127
- const nonPinnedRowsUpdates = [];
128
- updates.forEach(update => {
129
- const id = getRowIdFromRowModel(update, props.getRowId, 'A row was provided without id when calling updateRows():');
130
- const rowNode = apiRef.current.getRowNode(id);
131
- if (rowNode?.type === 'pinnedRow') {
132
- // @ts-ignore because otherwise `release:build` doesn't work
133
- const pinnedRowsCache = apiRef.current.caches.pinnedRows;
134
- const prevModel = pinnedRowsCache.idLookup[id];
135
- if (prevModel) {
136
- pinnedRowsCache.idLookup[id] = _extends({}, prevModel, update);
137
- }
138
- } else {
139
- nonPinnedRowsUpdates.push(update);
140
- }
141
- });
129
+ const nonPinnedRowsUpdates = computeRowsUpdates(apiRef, updates, props.getRowId);
142
130
  const cache = updateCacheWithNewRows({
143
131
  updates: nonPinnedRowsUpdates,
144
132
  getRowId: props.getRowId,
@@ -149,6 +137,31 @@ export const useGridRows = (apiRef, props) => {
149
137
  throttle: true
150
138
  });
151
139
  }, [props.signature, props.getRowId, throttledRowsChange, apiRef]);
140
+ const updateServerRows = React.useCallback((updates, groupKeys) => {
141
+ const nonPinnedRowsUpdates = computeRowsUpdates(apiRef, updates, props.getRowId);
142
+ const cache = updateCacheWithNewRows({
143
+ updates: nonPinnedRowsUpdates,
144
+ getRowId: props.getRowId,
145
+ previousCache: apiRef.current.caches.rows,
146
+ groupKeys: groupKeys ?? []
147
+ });
148
+ throttledRowsChange({
149
+ cache,
150
+ throttle: false
151
+ });
152
+ }, [props.getRowId, throttledRowsChange, apiRef]);
153
+ const setLoading = React.useCallback(loading => {
154
+ if (loading === props.loading) {
155
+ return;
156
+ }
157
+ logger.debug(`Setting loading to ${loading}`);
158
+ apiRef.current.setState(state => _extends({}, state, {
159
+ rows: _extends({}, state.rows, {
160
+ loading
161
+ })
162
+ }));
163
+ apiRef.current.caches.rows.loadingPropBeforePartialUpdates = loading;
164
+ }, [props.loading, apiRef, logger]);
152
165
  const getRowModels = React.useCallback(() => {
153
166
  const dataRows = gridDataRowIdsSelector(apiRef);
154
167
  const idRowsLookup = gridRowsLookupSelector(apiRef);
@@ -303,6 +316,7 @@ export const useGridRows = (apiRef, props) => {
303
316
  }, [apiRef, props.signature, props.getRowId]);
304
317
  const rowApi = {
305
318
  getRow,
319
+ setLoading,
306
320
  getRowId,
307
321
  getRowModels,
308
322
  getRowsCount,
@@ -318,6 +332,9 @@ export const useGridRows = (apiRef, props) => {
318
332
  setRowChildrenExpansion,
319
333
  getRowGroupChildren
320
334
  };
335
+ const rowProPrivateApi = {
336
+ updateServerRows
337
+ };
321
338
 
322
339
  /**
323
340
  * EVENTS
@@ -392,6 +409,7 @@ export const useGridRows = (apiRef, props) => {
392
409
  useGridRegisterPipeApplier(apiRef, 'hydrateRows', applyHydrateRowsProcessor);
393
410
  useGridApiMethod(apiRef, rowApi, 'public');
394
411
  useGridApiMethod(apiRef, rowProApi, props.signature === GridSignature.DataGrid ? 'private' : 'public');
412
+ useGridApiMethod(apiRef, rowProPrivateApi, 'private');
395
413
 
396
414
  // The effect do not track any value defined synchronously during the 1st render by hooks called after `useGridRows`
397
415
  // As a consequence, the state generated by the 1st run of this useEffect will always be equal to the initialization one
@@ -436,7 +454,7 @@ export const useGridRows = (apiRef, props) => {
436
454
  return;
437
455
  }
438
456
  }
439
- logger.debug(`Updating all rows, new length ${props.rows.length}`);
457
+ logger.debug(`Updating all rows, new length ${props.rows?.length}`);
440
458
  throttledRowsChange({
441
459
  cache: createRowsInternalCache({
442
460
  rows: props.rows,
@@ -4,11 +4,11 @@ import * as ReactDOM from 'react-dom';
4
4
  import { unstable_useEnhancedEffect as useEnhancedEffect, unstable_useEventCallback as useEventCallback } from '@mui/utils';
5
5
  import useLazyRef from '@mui/utils/useLazyRef';
6
6
  import useTimeout from '@mui/utils/useTimeout';
7
+ import { useResizeObserver } from '@mui/x-internals/useResizeObserver';
7
8
  import { useTheme } from '@mui/material/styles';
8
9
  import { useGridPrivateApiContext } from '../../utils/useGridPrivateApiContext';
9
10
  import { useGridRootProps } from '../../utils/useGridRootProps';
10
11
  import { useGridSelector } from '../../utils/useGridSelector';
11
- import { useResizeObserver } from '../../utils/useResizeObserver';
12
12
  import { useRunOnce } from '../../utils/useRunOnce';
13
13
  import { gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, gridColumnPositionsSelector, gridHasColSpanSelector } from '../columns/gridColumnsSelector';
14
14
  import { gridDimensionsSelector } from '../dimensions/gridDimensionsSelectors';
@@ -5,5 +5,4 @@ export { useGridSelector } from './useGridSelector';
5
5
  export * from './useGridNativeEventListener';
6
6
  export * from './useFirstRender';
7
7
  export * from './useOnMount';
8
- export * from './useResizeObserver';
9
8
  export * from './useRunOnce';
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.7.1
2
+ * @mui/x-data-grid v7.9.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -55,6 +55,7 @@ export { useGridInitializeState } from '../hooks/utils/useGridInitializeState';
55
55
  export { getColumnsToExport, defaultGetRowsToExport } from '../hooks/features/export/utils';
56
56
  export * from '../utils/createControllablePromise';
57
57
  export { createSelector, createSelectorMemoized } from '../utils/createSelector';
58
+ export { gridRowGroupsToFetchSelector } from '../hooks/features/rows/gridRowsSelector';
58
59
  export { findParentElementFromClassName, getActiveElement, isEventTargetInPortal } from '../utils/domUtils';
59
60
  export { isNavigationKey, isPasteShortcut } from '../utils/keyboardUtils';
60
61
  export * from '../utils/utils';
@@ -1,6 +1,6 @@
1
1
  import { isNumber } from '../../utils/utils';
2
2
  import { GridSignature } from '../../hooks/utils/useGridApiEventHandler';
3
- export const propValidatorsDataGrid = [props => props.autoPageSize && props.autoHeight && ['MUI X: `<DataGrid autoPageSize={true} autoHeight={true} />` are not valid props.', 'You cannot use both the `autoPageSize` and `autoHeight` props at the same time because `autoHeight` scales the height of the Data Grid according to the `pageSize`.', '', 'Please remove one of these two props.'].join('\n') || undefined, props => props.paginationMode === 'client' && props.paginationMeta != null && ['MUI X: Usage of the `paginationMeta` prop with client-side pagination (`paginationMode="client"`) has no effect.', '`paginationMeta` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.signature === GridSignature.DataGrid && props.paginationMode === 'client' && isNumber(props.rowCount) && ['MUI X: Usage of the `rowCount` prop with client side pagination (`paginationMode="client"`) has no effect.', '`rowCount` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.paginationMode === 'server' && props.rowCount == null && ["MUI X: The `rowCount` prop must be passed using `paginationMode='server'`", 'For more detail, see http://mui.com/components/data-grid/pagination/#index-based-pagination'].join('\n') || undefined];
3
+ export const propValidatorsDataGrid = [props => props.autoPageSize && props.autoHeight && ['MUI X: `<DataGrid autoPageSize={true} autoHeight={true} />` are not valid props.', 'You cannot use both the `autoPageSize` and `autoHeight` props at the same time because `autoHeight` scales the height of the Data Grid according to the `pageSize`.', '', 'Please remove one of these two props.'].join('\n') || undefined, props => props.paginationMode === 'client' && props.paginationMeta != null && ['MUI X: Usage of the `paginationMeta` prop with client-side pagination (`paginationMode="client"`) has no effect.', '`paginationMeta` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.signature === GridSignature.DataGrid && props.paginationMode === 'client' && isNumber(props.rowCount) && ['MUI X: Usage of the `rowCount` prop with client side pagination (`paginationMode="client"`) has no effect.', '`rowCount` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.paginationMode === 'server' && props.rowCount == null && !props.unstable_dataSource && ["MUI X: The `rowCount` prop must be passed using `paginationMode='server'`", 'For more detail, see http://mui.com/components/data-grid/pagination/#index-based-pagination'].join('\n') || undefined];
4
4
  const warnedOnceCache = new Set();
5
5
  function warnOnce(message) {
6
6
  if (!warnedOnceCache.has(message)) {
@@ -0,0 +1 @@
1
+ export {};
@@ -172,9 +172,17 @@ function mulberry32(a) {
172
172
  /* eslint-enable */
173
173
  };
174
174
  }
175
- export function randomNumberBetween(seed, min, max) {
175
+
176
+ /**
177
+ * Create a random number generator from a seed. The seed
178
+ * ensures that the random number generator produces the
179
+ * same sequence of 'random' numbers on every render. It
180
+ * returns a function that generates a random number between
181
+ * a specified min and max.
182
+ */
183
+ export function createRandomNumberGenerator(seed) {
176
184
  const random = mulberry32(seed);
177
- return () => min + (max - min) * random();
185
+ return (min, max) => min + (max - min) * random();
178
186
  }
179
187
  export function deepClone(obj) {
180
188
  if (typeof structuredClone === 'function') {
@@ -94,9 +94,16 @@ const useDataGridProps = inProps => {
94
94
  defaultSlots,
95
95
  slots: themedProps.slots
96
96
  }), [themedProps.slots]);
97
- return React.useMemo(() => (0, _extends2.default)({}, DATA_GRID_PROPS_DEFAULT_VALUES, themedProps, {
97
+ const injectDefaultProps = React.useMemo(() => {
98
+ return Object.keys(DATA_GRID_PROPS_DEFAULT_VALUES).reduce((acc, key) => {
99
+ // @ts-ignore
100
+ acc[key] = themedProps[key] ?? DATA_GRID_PROPS_DEFAULT_VALUES[key];
101
+ return acc;
102
+ }, {});
103
+ }, [themedProps]);
104
+ return React.useMemo(() => (0, _extends2.default)({}, themedProps, injectDefaultProps, {
98
105
  localeText,
99
106
  slots
100
- }, DATA_GRID_FORCED_PROPS), [themedProps, localeText, slots]);
107
+ }, DATA_GRID_FORCED_PROPS), [themedProps, localeText, slots, injectDefaultProps]);
101
108
  };
102
109
  exports.useDataGridProps = useDataGridProps;
@@ -6,18 +6,52 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.GridLoadingOverlay = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
10
  var React = _interopRequireWildcard(require("react"));
10
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
+ var _LinearProgress = _interopRequireDefault(require("@mui/material/LinearProgress"));
11
13
  var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
12
14
  var _GridOverlay = require("./containers/GridOverlay");
15
+ var _GridSkeletonLoadingOverlay = require("./GridSkeletonLoadingOverlay");
16
+ var _useGridApiContext = require("../hooks/utils/useGridApiContext");
17
+ var _hooks = require("../hooks");
13
18
  var _jsxRuntime = require("react/jsx-runtime");
19
+ const _excluded = ["variant", "noRowsVariant", "style"];
14
20
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
21
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
+ const LOADING_VARIANTS = {
23
+ 'circular-progress': {
24
+ component: _CircularProgress.default,
25
+ style: {}
26
+ },
27
+ 'linear-progress': {
28
+ component: _LinearProgress.default,
29
+ style: {
30
+ display: 'block'
31
+ }
32
+ },
33
+ skeleton: {
34
+ component: _GridSkeletonLoadingOverlay.GridSkeletonLoadingOverlay,
35
+ style: {
36
+ display: 'block'
37
+ }
38
+ }
39
+ };
16
40
  const GridLoadingOverlay = exports.GridLoadingOverlay = /*#__PURE__*/React.forwardRef(function GridLoadingOverlay(props, ref) {
41
+ const {
42
+ variant = 'circular-progress',
43
+ noRowsVariant = 'circular-progress',
44
+ style
45
+ } = props,
46
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
47
+ const apiRef = (0, _useGridApiContext.useGridApiContext)();
48
+ const rowsCount = (0, _hooks.useGridSelector)(apiRef, _hooks.gridRowCountSelector);
49
+ const activeVariant = LOADING_VARIANTS[rowsCount === 0 ? noRowsVariant : variant];
17
50
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlay.GridOverlay, (0, _extends2.default)({
18
- ref: ref
19
- }, props, {
20
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {})
51
+ ref: ref,
52
+ style: (0, _extends2.default)({}, activeVariant.style, style)
53
+ }, other, {
54
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(activeVariant.component, {})
21
55
  }));
22
56
  });
23
57
  process.env.NODE_ENV !== "production" ? GridLoadingOverlay.propTypes = {
@@ -25,5 +59,15 @@ process.env.NODE_ENV !== "production" ? GridLoadingOverlay.propTypes = {
25
59
  // | These PropTypes are generated from the TypeScript type definitions |
26
60
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
27
61
  // ----------------------------------------------------------------------
28
- sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object])
62
+ /**
63
+ * The variant of the overlay when no rows are displayed.
64
+ * @default 'circular-progress'
65
+ */
66
+ noRowsVariant: _propTypes.default.oneOf(['circular-progress', 'linear-progress', 'skeleton']),
67
+ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
68
+ /**
69
+ * The variant of the overlay.
70
+ * @default 'circular-progress'
71
+ */
72
+ variant: _propTypes.default.oneOf(['circular-progress', 'linear-progress', 'skeleton'])
29
73
  } : void 0;
@@ -258,10 +258,11 @@ const GridRow = /*#__PURE__*/React.forwardRef(function GridRow(props, refProp) {
258
258
  const pinnedOffset = (0, _getPinnedCellOffset.getPinnedCellOffset)(_GridCell.gridPinnedColumnPositionLookup[pinnedPosition], column.computedWidth, indexRelativeToAllColumns, columnPositions, dimensions);
259
259
  if (rowNode?.type === 'skeletonRow') {
260
260
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(slots.skeletonCell, {
261
+ type: column.type,
261
262
  width: width,
262
263
  height: rowHeight,
263
264
  field: column.field,
264
- align: column.align ?? 'left'
265
+ align: column.align
265
266
  }, column.field);
266
267
  }
267
268
  const editCellState = editRowsState[rowId]?.[column.field] ?? null;