@mui/x-data-grid-pro 5.17.5 → 6.0.0-alpha.1

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 (129) hide show
  1. package/CHANGELOG.md +297 -19
  2. package/DataGridPro/DataGridPro.js +4 -14
  3. package/DataGridPro/useDataGridProProps.js +2 -2
  4. package/components/DataGridProVirtualScroller.js +2 -2
  5. package/components/GridDetailPanelToggleCell.js +1 -1
  6. package/components/GridRowReorderCell.js +4 -6
  7. package/components/GridTreeDataGroupingCell.d.ts +2 -2
  8. package/components/GridTreeDataGroupingCell.js +1 -1
  9. package/hooks/features/detailPanel/useGridDetailPanel.js +2 -2
  10. package/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  11. package/hooks/features/infiniteLoader/useGridInfiniteLoader.js +2 -2
  12. package/hooks/features/lazyLoader/useGridLazyLoader.js +20 -9
  13. package/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.d.ts +1 -1
  14. package/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +20 -6
  15. package/hooks/features/rowPinning/gridRowPinningInterface.d.ts +2 -2
  16. package/hooks/features/rowPinning/useGridRowPinningPreProcessors.d.ts +16 -16
  17. package/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +62 -25
  18. package/hooks/features/rowReorder/useGridRowReorder.js +5 -5
  19. package/hooks/features/treeData/gridTreeDataGroupColDef.js +1 -1
  20. package/hooks/features/treeData/gridTreeDataUtils.js +14 -12
  21. package/hooks/features/treeData/useGridTreeData.js +2 -6
  22. package/hooks/features/treeData/useGridTreeDataPreProcessors.js +35 -18
  23. package/index.js +1 -1
  24. package/internals/index.d.ts +4 -2
  25. package/internals/index.js +4 -2
  26. package/legacy/DataGridPro/DataGridPro.js +4 -14
  27. package/legacy/DataGridPro/useDataGridProProps.js +2 -2
  28. package/legacy/components/DataGridProVirtualScroller.js +2 -2
  29. package/legacy/components/GridDetailPanelToggleCell.js +1 -1
  30. package/legacy/components/GridRowReorderCell.js +4 -6
  31. package/legacy/components/GridTreeDataGroupingCell.js +1 -1
  32. package/legacy/hooks/features/detailPanel/useGridDetailPanel.js +2 -2
  33. package/legacy/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  34. package/legacy/hooks/features/infiniteLoader/useGridInfiniteLoader.js +2 -2
  35. package/legacy/hooks/features/lazyLoader/useGridLazyLoader.js +25 -15
  36. package/legacy/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +21 -7
  37. package/legacy/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +62 -25
  38. package/legacy/hooks/features/rowReorder/useGridRowReorder.js +5 -5
  39. package/legacy/hooks/features/treeData/gridTreeDataGroupColDef.js +1 -1
  40. package/legacy/hooks/features/treeData/gridTreeDataUtils.js +14 -12
  41. package/legacy/hooks/features/treeData/useGridTreeData.js +2 -6
  42. package/legacy/hooks/features/treeData/useGridTreeDataPreProcessors.js +37 -22
  43. package/legacy/index.js +1 -1
  44. package/legacy/internals/index.js +4 -2
  45. package/legacy/utils/tree/createRowTree.js +36 -0
  46. package/legacy/utils/tree/index.js +1 -1
  47. package/legacy/utils/tree/insertDataRowInTree.js +127 -0
  48. package/legacy/utils/tree/models.js +1 -0
  49. package/legacy/utils/tree/removeDataRowFromTree.js +97 -0
  50. package/legacy/utils/tree/sortRowTree.js +49 -43
  51. package/legacy/utils/tree/updateRowTree.js +81 -0
  52. package/legacy/utils/tree/utils.js +184 -0
  53. package/models/dataGridProProps.d.ts +3 -3
  54. package/modern/DataGridPro/DataGridPro.js +4 -14
  55. package/modern/DataGridPro/useDataGridProProps.js +2 -2
  56. package/modern/components/DataGridProVirtualScroller.js +2 -2
  57. package/modern/components/GridDetailPanelToggleCell.js +1 -1
  58. package/modern/components/GridRowReorderCell.js +4 -4
  59. package/modern/components/GridTreeDataGroupingCell.js +1 -1
  60. package/modern/hooks/features/detailPanel/useGridDetailPanel.js +2 -2
  61. package/modern/hooks/features/detailPanel/useGridDetailPanelCache.js +2 -2
  62. package/modern/hooks/features/infiniteLoader/useGridInfiniteLoader.js +2 -2
  63. package/modern/hooks/features/lazyLoader/useGridLazyLoader.js +20 -9
  64. package/modern/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +20 -6
  65. package/modern/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +60 -23
  66. package/modern/hooks/features/rowReorder/useGridRowReorder.js +5 -3
  67. package/modern/hooks/features/treeData/gridTreeDataGroupColDef.js +1 -1
  68. package/modern/hooks/features/treeData/gridTreeDataUtils.js +13 -9
  69. package/modern/hooks/features/treeData/useGridTreeData.js +2 -4
  70. package/modern/hooks/features/treeData/useGridTreeDataPreProcessors.js +35 -18
  71. package/modern/index.js +1 -1
  72. package/modern/internals/index.js +4 -2
  73. package/modern/utils/tree/createRowTree.js +35 -0
  74. package/modern/utils/tree/index.js +1 -1
  75. package/modern/utils/tree/insertDataRowInTree.js +127 -0
  76. package/modern/utils/tree/models.js +1 -0
  77. package/modern/utils/tree/removeDataRowFromTree.js +100 -0
  78. package/modern/utils/tree/sortRowTree.js +46 -40
  79. package/modern/utils/tree/updateRowTree.js +83 -0
  80. package/modern/utils/tree/utils.js +180 -0
  81. package/node/DataGridPro/DataGridPro.js +4 -14
  82. package/node/DataGridPro/useDataGridProProps.js +1 -1
  83. package/node/components/DataGridProVirtualScroller.js +1 -1
  84. package/node/components/GridDetailPanelToggleCell.js +1 -1
  85. package/node/components/GridRowReorderCell.js +3 -5
  86. package/node/components/GridTreeDataGroupingCell.js +1 -1
  87. package/node/hooks/features/detailPanel/useGridDetailPanel.js +1 -1
  88. package/node/hooks/features/detailPanel/useGridDetailPanelCache.js +1 -1
  89. package/node/hooks/features/infiniteLoader/useGridInfiniteLoader.js +1 -1
  90. package/node/hooks/features/lazyLoader/useGridLazyLoader.js +19 -8
  91. package/node/hooks/features/lazyLoader/useGridLazyLoaderPreProcessors.js +18 -5
  92. package/node/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +63 -26
  93. package/node/hooks/features/rowReorder/useGridRowReorder.js +4 -4
  94. package/node/hooks/features/treeData/gridTreeDataGroupColDef.js +1 -1
  95. package/node/hooks/features/treeData/gridTreeDataUtils.js +14 -12
  96. package/node/hooks/features/treeData/useGridTreeData.js +1 -5
  97. package/node/hooks/features/treeData/useGridTreeDataPreProcessors.js +35 -17
  98. package/node/index.js +1 -1
  99. package/node/internals/index.js +35 -10
  100. package/node/utils/tree/createRowTree.js +46 -0
  101. package/node/utils/tree/index.js +2 -2
  102. package/node/utils/tree/insertDataRowInTree.js +139 -0
  103. package/node/utils/tree/models.js +5 -0
  104. package/node/utils/tree/removeDataRowFromTree.js +110 -0
  105. package/node/utils/tree/sortRowTree.js +50 -43
  106. package/node/utils/tree/updateRowTree.js +98 -0
  107. package/node/utils/tree/utils.js +217 -0
  108. package/package.json +5 -5
  109. package/utils/tree/createRowTree.d.ts +15 -0
  110. package/utils/tree/createRowTree.js +35 -0
  111. package/utils/tree/index.d.ts +1 -1
  112. package/utils/tree/index.js +1 -1
  113. package/utils/tree/insertDataRowInTree.d.ts +51 -0
  114. package/utils/tree/insertDataRowInTree.js +129 -0
  115. package/utils/tree/models.d.ts +13 -0
  116. package/utils/tree/models.js +1 -0
  117. package/utils/tree/removeDataRowFromTree.d.ts +40 -0
  118. package/utils/tree/removeDataRowFromTree.js +100 -0
  119. package/utils/tree/sortRowTree.d.ts +6 -1
  120. package/utils/tree/sortRowTree.js +46 -40
  121. package/utils/tree/updateRowTree.d.ts +19 -0
  122. package/utils/tree/updateRowTree.js +83 -0
  123. package/utils/tree/utils.d.ts +66 -0
  124. package/utils/tree/utils.js +186 -0
  125. package/legacy/utils/tree/buildRowTree.js +0 -195
  126. package/modern/utils/tree/buildRowTree.js +0 -174
  127. package/node/utils/tree/buildRowTree.js +0 -195
  128. package/utils/tree/buildRowTree.d.ts +0 -48
  129. package/utils/tree/buildRowTree.js +0 -186
@@ -2,7 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
3
  import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import * as React from 'react';
5
- import { useGridSelector, useGridApiEventHandler, useGridApiMethod, gridRowIdsSelector } from '@mui/x-data-grid';
5
+ import { useGridSelector, useGridApiEventHandler, useGridApiMethod, gridDataRowIdsSelector } from '@mui/x-data-grid';
6
6
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
7
7
  import { GRID_DETAIL_PANEL_TOGGLE_FIELD } from './gridDetailPanelToggleColDef';
8
8
  import { gridDetailPanelExpandedRowIdsSelector, gridDetailPanelExpandedRowsContentCacheSelector, gridDetailPanelExpandedRowsHeightCacheSelector, gridDetailPanelRawHeightCacheSelector } from './gridDetailPanelSelector';
@@ -24,7 +24,7 @@ function cacheContentAndHeight(apiRef, getDetailPanelContent, getDetailPanelHeig
24
24
  // only call getDetailPanelContent when asked for an id
25
25
 
26
26
 
27
- var rowIds = gridRowIdsSelector(apiRef);
27
+ var rowIds = gridDataRowIdsSelector(apiRef);
28
28
  var contentCache = rowIds.reduce(function (acc, id) {
29
29
  var params = apiRef.current.getRowParams(id);
30
30
  acc[id] = getDetailPanelContent(params);
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { useGridApiEventHandler, gridRowIdsSelector } from '@mui/x-data-grid';
3
+ import { useGridApiEventHandler, gridDataRowIdsSelector } from '@mui/x-data-grid';
4
4
 
5
5
  function cacheContentAndHeight(apiRef, getDetailPanelContent, getDetailPanelHeight, previousHeightCache) {
6
6
  if (typeof getDetailPanelContent !== 'function') {
@@ -9,7 +9,7 @@ function cacheContentAndHeight(apiRef, getDetailPanelContent, getDetailPanelHeig
9
9
  // only call getDetailPanelContent when asked for an id
10
10
 
11
11
 
12
- var rowIds = gridRowIdsSelector(apiRef);
12
+ var rowIds = gridDataRowIdsSelector(apiRef);
13
13
  var contentCache = rowIds.reduce(function (acc, id) {
14
14
  var params = apiRef.current.getRowParams(id);
15
15
  acc[id] = getDetailPanelContent(params);
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { useGridSelector, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector, GridFeatureModeConstant } from '@mui/x-data-grid';
2
+ import { useGridSelector, useGridApiEventHandler, useGridApiOptionHandler, gridVisibleColumnDefinitionsSelector, gridRowsMetaSelector } from '@mui/x-data-grid';
3
3
  import { useGridVisibleRows } from '@mui/x-data-grid/internals';
4
4
 
5
5
  /**
@@ -16,7 +16,7 @@ export var useGridInfiniteLoader = function useGridInfiniteLoader(apiRef, props)
16
16
  var handleRowsScrollEnd = React.useCallback(function (scrollPosition) {
17
17
  var dimensions = apiRef.current.getRootDimensions(); // Prevent the infite loading working in combination with lazy loading
18
18
 
19
- if (!dimensions || props.rowsLoadingMode !== GridFeatureModeConstant.client) {
19
+ if (!dimensions || props.rowsLoadingMode !== 'client') {
20
20
  return;
21
21
  }
22
22
 
@@ -1,9 +1,12 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import * as React from 'react';
3
- import { useGridApiEventHandler, GridFeatureModeConstant, useGridSelector, gridSortModelSelector, gridFilterModelSelector, useGridApiOptionHandler } from '@mui/x-data-grid';
3
+ import { useGridApiEventHandler, useGridSelector, gridSortModelSelector, gridFilterModelSelector, useGridApiOptionHandler } from '@mui/x-data-grid';
4
4
  import { useGridVisibleRows, getRenderableIndexes } from '@mui/x-data-grid/internals';
5
5
 
6
- function findSkeletonRowsSection(visibleRows, range) {
6
+ function findSkeletonRowsSection(_ref) {
7
+ var apiRef = _ref.apiRef,
8
+ visibleRows = _ref.visibleRows,
9
+ range = _ref.range;
7
10
  var firstRowIndex = range.firstRowIndex,
8
11
  lastRowIndex = range.lastRowIndex;
9
12
  var visibleRowsSection = visibleRows.slice(range.firstRowIndex, range.lastRowIndex);
@@ -12,16 +15,19 @@ function findSkeletonRowsSection(visibleRows, range) {
12
15
  var isSkeletonSectionFound = false;
13
16
 
14
17
  while (!isSkeletonSectionFound && firstRowIndex < lastRowIndex) {
15
- if (!visibleRowsSection[startIndex].model && !visibleRowsSection[endIndex].model) {
18
+ var isStartingWithASkeletonRow = apiRef.current.getRowNode(visibleRowsSection[startIndex].id).type === 'skeletonRow';
19
+ var isEndingWithASkeletonRow = apiRef.current.getRowNode(visibleRowsSection[endIndex].id).type === 'skeletonRow';
20
+
21
+ if (isStartingWithASkeletonRow && isEndingWithASkeletonRow) {
16
22
  isSkeletonSectionFound = true;
17
23
  }
18
24
 
19
- if (visibleRowsSection[startIndex].model) {
25
+ if (!isStartingWithASkeletonRow) {
20
26
  startIndex += 1;
21
27
  firstRowIndex += 1;
22
28
  }
23
29
 
24
- if (visibleRowsSection[endIndex].model) {
30
+ if (!isEndingWithASkeletonRow) {
25
31
  endIndex -= 1;
26
32
  lastRowIndex -= 1;
27
33
  }
@@ -33,16 +39,16 @@ function findSkeletonRowsSection(visibleRows, range) {
33
39
  } : undefined;
34
40
  }
35
41
 
36
- function isLazyLoadingDisabled(_ref) {
37
- var lazyLoadingFeatureFlag = _ref.lazyLoadingFeatureFlag,
38
- rowsLoadingMode = _ref.rowsLoadingMode,
39
- gridDimensions = _ref.gridDimensions;
42
+ function isLazyLoadingDisabled(_ref2) {
43
+ var lazyLoadingFeatureFlag = _ref2.lazyLoadingFeatureFlag,
44
+ rowsLoadingMode = _ref2.rowsLoadingMode,
45
+ gridDimensions = _ref2.gridDimensions;
40
46
 
41
47
  if (!lazyLoadingFeatureFlag || !gridDimensions) {
42
48
  return true;
43
49
  }
44
50
 
45
- if (rowsLoadingMode !== GridFeatureModeConstant.server) {
51
+ if (rowsLoadingMode !== 'server') {
46
52
  return true;
47
53
  }
48
54
 
@@ -67,8 +73,8 @@ export var useGridLazyLoader = function useGridLazyLoader(apiRef, props) {
67
73
  lastRowToRender: 0
68
74
  });
69
75
 
70
- var _ref2 = (_props$experimentalFe = props.experimentalFeatures) != null ? _props$experimentalFe : {},
71
- lazyLoading = _ref2.lazyLoading;
76
+ var _ref3 = (_props$experimentalFe = props.experimentalFeatures) != null ? _props$experimentalFe : {},
77
+ lazyLoading = _ref3.lazyLoading;
72
78
 
73
79
  var getCurrentIntervalToRender = React.useCallback(function () {
74
80
  var currentRenderContext = apiRef.current.unstable_getRenderContext();
@@ -112,9 +118,13 @@ export var useGridLazyLoader = function useGridLazyLoader(apiRef, props) {
112
118
  }
113
119
 
114
120
  if (sortModel.length === 0 && filterModel.items.length === 0) {
115
- var skeletonRowsSection = findSkeletonRowsSection(visibleRows.rows, {
116
- firstRowIndex: params.firstRowToRender,
117
- lastRowIndex: params.lastRowToRender
121
+ var skeletonRowsSection = findSkeletonRowsSection({
122
+ apiRef: apiRef,
123
+ visibleRows: visibleRows.rows,
124
+ range: {
125
+ firstRowIndex: params.firstRowToRender,
126
+ lastRowIndex: params.lastRowToRender
127
+ }
118
128
  });
119
129
 
120
130
  if (!skeletonRowsSection) {
@@ -1,8 +1,8 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import * as React from 'react';
4
4
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
5
- import { GridFeatureModeConstant } from '@mui/x-data-grid';
5
+ import { GRID_ROOT_GROUP_ID } from '@mui/x-data-grid';
6
6
  export var GRID_SKELETON_ROW_ROOT_ID = 'auto-generated-skeleton-row-root';
7
7
 
8
8
  var getSkeletonRowId = function getSkeletonRowId(index) {
@@ -16,19 +16,33 @@ export var useGridLazyLoaderPreProcessors = function useGridLazyLoaderPreProcess
16
16
  lazyLoading = _ref.lazyLoading;
17
17
 
18
18
  var addSkeletonRows = React.useCallback(function (groupingParams) {
19
- if (!lazyLoading || props.rowsLoadingMode !== GridFeatureModeConstant.server || !props.rowCount || groupingParams.ids.length >= props.rowCount) {
19
+ var tree = _extends({}, groupingParams.tree);
20
+
21
+ var rootGroup = tree[GRID_ROOT_GROUP_ID];
22
+
23
+ if (!lazyLoading || props.rowsLoadingMode !== 'server' || !props.rowCount || rootGroup.children.length >= props.rowCount) {
20
24
  return groupingParams;
21
25
  }
22
26
 
23
- var newRowsIds = _toConsumableArray(groupingParams.ids);
27
+ var rootGroupChildren = _toConsumableArray(rootGroup.children);
24
28
 
25
- for (var i = 0; i < props.rowCount - groupingParams.ids.length; i += 1) {
29
+ for (var i = 0; i < props.rowCount - rootGroup.children.length; i += 1) {
26
30
  var skeletonId = getSkeletonRowId(i);
27
- newRowsIds.push(skeletonId);
31
+ rootGroupChildren.push(skeletonId);
32
+ var skeletonRowNode = {
33
+ type: 'skeletonRow',
34
+ id: skeletonId,
35
+ parent: GRID_ROOT_GROUP_ID,
36
+ depth: 0
37
+ };
38
+ tree[skeletonId] = skeletonRowNode;
28
39
  }
29
40
 
41
+ tree[GRID_ROOT_GROUP_ID] = _extends({}, rootGroup, {
42
+ children: rootGroupChildren
43
+ });
30
44
  return _extends({}, groupingParams, {
31
- ids: newRowsIds
45
+ tree: tree
32
46
  });
33
47
  }, [props.rowCount, props.rowsLoadingMode, lazyLoading]);
34
48
  useGridRegisterPipeProcessor(apiRef, 'hydrateRows', addSkeletonRows);
@@ -3,42 +3,68 @@ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
3
  import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import * as React from 'react';
5
5
  import { useGridRegisterPipeProcessor } from '@mui/x-data-grid/internals';
6
+ import { GRID_ROOT_GROUP_ID } from '@mui/x-data-grid';
7
+ import { insertNodeInTree } from '../../../utils/tree/utils';
6
8
  export function addPinnedRow(_ref) {
7
- var _groupingParams$addit;
9
+ var _groupingParams$addit, _groupingParams$addit2, _groupingParams$addit3, _groupingParams$addit4;
8
10
 
9
11
  var groupingParams = _ref.groupingParams,
10
12
  rowModel = _ref.rowModel,
11
13
  rowId = _ref.rowId,
12
14
  position = _ref.position,
13
- apiRef = _ref.apiRef;
15
+ apiRef = _ref.apiRef,
16
+ isAutoGenerated = _ref.isAutoGenerated;
14
17
 
15
- var idRowsLookup = _extends({}, groupingParams.idRowsLookup);
18
+ var dataRowIdToModelLookup = _extends({}, groupingParams.dataRowIdToModelLookup);
16
19
 
17
- var tree = _extends({}, groupingParams.tree); // TODO: warn if id is already present in `props.rows`
20
+ var dataRowIdToIdLookup = _extends({}, groupingParams.dataRowIdToIdLookup);
18
21
 
22
+ var tree = _extends({}, groupingParams.tree);
19
23
 
20
- idRowsLookup[rowId] = rowModel; // Do not push it to ids list so that pagination is not affected by pinned rows
21
- // ids.push(rowId);
24
+ var treeDepths = _extends({}, groupingParams.treeDepths); // TODO: warn if id is already present in `props.rows`
22
25
 
23
- tree[rowId] = {
26
+
27
+ var node = {
28
+ type: 'pinnedRow',
24
29
  id: rowId,
25
- isAutoGenerated: false,
26
- parent: null,
27
30
  depth: 0,
28
- groupingKey: null,
29
- groupingField: null,
30
- isPinned: true
31
+ parent: GRID_ROOT_GROUP_ID,
32
+ isAutoGenerated: isAutoGenerated
31
33
  };
32
- apiRef.current.unstable_caches.rows.idRowsLookup[rowId] = _extends({}, rowModel);
33
- apiRef.current.unstable_caches.rows.idToIdLookup[rowId] = rowId;
34
+ insertNodeInTree({
35
+ node: node,
36
+ tree: tree,
37
+ treeDepths: treeDepths
38
+ });
39
+
40
+ if (!isAutoGenerated) {
41
+ dataRowIdToModelLookup[rowId] = rowModel;
42
+ dataRowIdToIdLookup[rowId] = rowId;
43
+ } // Do not push it to ids list so that pagination is not affected by pinned rows
44
+
45
+
46
+ apiRef.current.unstable_caches.rows.dataRowIdToModelLookup[rowId] = _extends({}, rowModel);
47
+ apiRef.current.unstable_caches.rows.dataRowIdToIdLookup[rowId] = rowId;
34
48
  var previousPinnedRows = ((_groupingParams$addit = groupingParams.additionalRowGroups) == null ? void 0 : _groupingParams$addit.pinnedRows) || {};
35
49
  var newPinnedRow = {
36
50
  id: rowId,
37
51
  model: rowModel
38
52
  };
53
+
54
+ if ((_groupingParams$addit2 = groupingParams.additionalRowGroups) != null && (_groupingParams$addit3 = _groupingParams$addit2.pinnedRows) != null && (_groupingParams$addit4 = _groupingParams$addit3[position]) != null && _groupingParams$addit4.includes(newPinnedRow)) {
55
+ return _extends({}, groupingParams, {
56
+ dataRowIdToModelLookup: dataRowIdToModelLookup,
57
+ dataRowIdToIdLookup: dataRowIdToIdLookup,
58
+ tree: tree,
59
+ treeDepths: treeDepths
60
+ });
61
+ }
62
+
39
63
  return _extends({}, groupingParams, {
40
- idRowsLookup: idRowsLookup,
64
+ dataRowIdToModelLookup: dataRowIdToModelLookup,
65
+ dataRowIdToIdLookup: dataRowIdToIdLookup,
41
66
  tree: tree,
67
+ treeDepths: treeDepths,
42
68
  additionalRowGroups: _extends({}, groupingParams.additionalRowGroups, {
43
69
  pinnedRows: _extends({}, previousPinnedRows, _defineProperty({}, position, [].concat(_toConsumableArray(previousPinnedRows[position] || []), [newPinnedRow])))
44
70
  })
@@ -46,7 +72,7 @@ export function addPinnedRow(_ref) {
46
72
  }
47
73
  export var useGridRowPinningPreProcessors = function useGridRowPinningPreProcessors(apiRef) {
48
74
  var addPinnedRows = React.useCallback(function (groupingParams) {
49
- var _pinnedRowsCache$topI, _pinnedRowsCache$bott;
75
+ var _pinnedRowsCache$topI, _pinnedRowsCache$bott, _pinnedRowsCache$bott2, _pinnedRowsCache$topI2;
50
76
 
51
77
  var pinnedRowsCache = apiRef.current.unstable_caches.pinnedRows || {};
52
78
 
@@ -63,7 +89,8 @@ export var useGridRowPinningPreProcessors = function useGridRowPinningPreProcess
63
89
  rowModel: pinnedRowsCache.idLookup[rowId],
64
90
  rowId: rowId,
65
91
  position: 'top',
66
- apiRef: apiRef
92
+ apiRef: apiRef,
93
+ isAutoGenerated: false
67
94
  });
68
95
  });
69
96
  (_pinnedRowsCache$bott = pinnedRowsCache.bottomIds) == null ? void 0 : _pinnedRowsCache$bott.forEach(function (rowId) {
@@ -72,17 +99,27 @@ export var useGridRowPinningPreProcessors = function useGridRowPinningPreProcess
72
99
  rowModel: pinnedRowsCache.idLookup[rowId],
73
100
  rowId: rowId,
74
101
  position: 'bottom',
75
- apiRef: apiRef
102
+ apiRef: apiRef,
103
+ isAutoGenerated: false
76
104
  });
77
- }); // If row with the same `id` is present both in `rows` and `pinnedRows` - remove it from `ids`
105
+ }); // If row with the same `id` is present both in `rows` and `pinnedRows` - remove it from the root group children
78
106
 
79
- newGroupingParams.ids = newGroupingParams.ids.filter(function (rowId) {
80
- if (newGroupingParams.tree[rowId] && newGroupingParams.tree[rowId].isPinned) {
81
- return false;
82
- }
107
+ if ((_pinnedRowsCache$bott2 = pinnedRowsCache.bottomIds) != null && _pinnedRowsCache$bott2.length || (_pinnedRowsCache$topI2 = pinnedRowsCache.topIds) != null && _pinnedRowsCache$topI2.length) {
108
+ var shouldKeepRow = function shouldKeepRow(rowId) {
109
+ if (newGroupingParams.tree[rowId] && newGroupingParams.tree[rowId].type === 'pinnedRow') {
110
+ return false;
111
+ }
112
+
113
+ return true;
114
+ };
115
+
116
+ var rootGroupNode = newGroupingParams.tree[GRID_ROOT_GROUP_ID];
117
+ newGroupingParams.tree[GRID_ROOT_GROUP_ID] = _extends({}, rootGroupNode, {
118
+ children: rootGroupNode.children.filter(shouldKeepRow)
119
+ });
120
+ newGroupingParams.dataRowIds = newGroupingParams.dataRowIds.filter(shouldKeepRow);
121
+ }
83
122
 
84
- return true;
85
- });
86
123
  return newGroupingParams;
87
124
  }, [apiRef]);
88
125
  useGridRegisterPipeProcessor(apiRef, 'hydrateRows', addPinnedRows);
@@ -1,7 +1,7 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import * as React from 'react';
3
3
  import { unstable_composeClasses as composeClasses } from '@mui/material';
4
- import { useGridLogger, useGridApiEventHandler, getDataGridUtilityClass, useGridSelector, gridSortModelSelector, gridRowTreeDepthSelector, useGridApiOptionHandler, gridEditRowsStateSelector } from '@mui/x-data-grid';
4
+ import { useGridLogger, useGridApiEventHandler, getDataGridUtilityClass, useGridSelector, gridSortModelSelector, gridRowMaximumTreeDepthSelector, useGridApiOptionHandler, gridEditRowsStateSelector } from '@mui/x-data-grid';
5
5
 
6
6
  var useUtilityClasses = function useUtilityClasses(ownerState) {
7
7
  var classes = ownerState.classes;
@@ -19,7 +19,7 @@ var useUtilityClasses = function useUtilityClasses(ownerState) {
19
19
  export var useGridRowReorder = function useGridRowReorder(apiRef, props) {
20
20
  var logger = useGridLogger(apiRef, 'useGridRowReorder');
21
21
  var sortModel = useGridSelector(apiRef, gridSortModelSelector);
22
- var treeDepth = useGridSelector(apiRef, gridRowTreeDepthSelector);
22
+ var treeDepth = useGridSelector(apiRef, gridRowMaximumTreeDepthSelector);
23
23
  var dragRowNode = React.useRef(null);
24
24
  var originRowIndex = React.useRef(null);
25
25
  var removeDnDStylesTimeout = React.useRef();
@@ -64,13 +64,13 @@ export var useGridRowReorder = function useGridRowReorder(apiRef, props) {
64
64
  originRowIndex.current = apiRef.current.getRowIndex(params.id);
65
65
  }, [isRowReorderDisabled, classes.rowDragging, logger, apiRef]);
66
66
  var handleDragOver = React.useCallback(function (params, event) {
67
- var _apiRef$current$getRo;
68
-
69
67
  if (dragRowId === '') {
70
68
  return;
71
69
  }
72
70
 
73
- if ((_apiRef$current$getRo = apiRef.current.getRowNode(params.id)) != null && _apiRef$current$getRo.isPinned) {
71
+ var rowNode = apiRef.current.getRowNode(params.id);
72
+
73
+ if (!rowNode || rowNode.type === 'footer' || rowNode.type === 'pinnedRow') {
74
74
  return;
75
75
  }
76
76
 
@@ -13,7 +13,7 @@ export var GRID_TREE_DATA_GROUPING_COL_DEF = _extends({}, GRID_STRING_COL_DEF, {
13
13
  align: 'left',
14
14
  width: 200,
15
15
  valueGetter: function valueGetter(params) {
16
- return params.rowNode.groupingKey;
16
+ return params.rowNode.type === 'group' ? params.rowNode.groupingKey : undefined;
17
17
  }
18
18
  });
19
19
  export var GRID_TREE_DATA_GROUPING_FIELD = '__tree_data_group__';
@@ -15,14 +15,12 @@ export var filterRowTreeFromTreeData = function filterRowTreeFromTreeData(params
15
15
  var filteredDescendantCountLookup = {};
16
16
 
17
17
  var filterTreeNode = function filterTreeNode(node, isParentMatchingFilters, areAncestorsExpanded) {
18
- var _node$children;
19
-
20
18
  var shouldSkipFilters = disableChildrenFiltering && node.depth > 0;
21
19
  var isMatchingFilters;
22
20
 
23
21
  if (shouldSkipFilters) {
24
22
  isMatchingFilters = null;
25
- } else if (!isRowMatchingFilters || node.position === 'footer') {
23
+ } else if (!isRowMatchingFilters || node.type === 'footer') {
26
24
  isMatchingFilters = true;
27
25
  } else {
28
26
  var _isRowMatchingFilters = isRowMatchingFilters(node.id),
@@ -33,13 +31,17 @@ export var filterRowTreeFromTreeData = function filterRowTreeFromTreeData(params
33
31
  }
34
32
 
35
33
  var filteredDescendantCount = 0;
36
- (_node$children = node.children) == null ? void 0 : _node$children.forEach(function (childId) {
37
- var _isMatchingFilters;
38
34
 
39
- var childNode = rowTree[childId];
40
- var childSubTreeSize = filterTreeNode(childNode, (_isMatchingFilters = isMatchingFilters) != null ? _isMatchingFilters : isParentMatchingFilters, areAncestorsExpanded && !!node.childrenExpanded);
41
- filteredDescendantCount += childSubTreeSize;
42
- });
35
+ if (node.type === 'group') {
36
+ node.children.forEach(function (childId) {
37
+ var _isMatchingFilters;
38
+
39
+ var childNode = rowTree[childId];
40
+ var childSubTreeSize = filterTreeNode(childNode, (_isMatchingFilters = isMatchingFilters) != null ? _isMatchingFilters : isParentMatchingFilters, areAncestorsExpanded && !!node.childrenExpanded);
41
+ filteredDescendantCount += childSubTreeSize;
42
+ });
43
+ }
44
+
43
45
  var shouldPassFilters;
44
46
 
45
47
  switch (isMatchingFilters) {
@@ -63,9 +65,9 @@ export var filterRowTreeFromTreeData = function filterRowTreeFromTreeData(params
63
65
  }
64
66
 
65
67
  visibleRowsLookup[node.id] = shouldPassFilters && areAncestorsExpanded;
66
- filteredRowsLookup[node.id] = shouldPassFilters;
68
+ filteredRowsLookup[node.id] = shouldPassFilters; // TODO: Should we keep storing the visibility status of footer independently or rely on the group visibility in the selector ?
67
69
 
68
- if (node.footerId != null) {
70
+ if (node.type === 'group' && node.footerId != null) {
69
71
  visibleRowsLookup[node.footerId] = shouldPassFilters && areAncestorsExpanded && !!node.childrenExpanded;
70
72
  }
71
73
 
@@ -75,7 +77,7 @@ export var filterRowTreeFromTreeData = function filterRowTreeFromTreeData(params
75
77
 
76
78
  filteredDescendantCountLookup[node.id] = filteredDescendantCount;
77
79
 
78
- if (node.position === 'footer') {
80
+ if (node.type === 'footer') {
79
81
  return filteredDescendantCount;
80
82
  }
81
83
 
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { useGridApiEventHandler, gridFilteredDescendantCountLookupSelector } from '@mui/x-data-grid';
2
+ import { useGridApiEventHandler } from '@mui/x-data-grid';
3
3
  export var useGridTreeData = function useGridTreeData(apiRef) {
4
4
  /**
5
5
  * EVENTS
@@ -8,11 +8,7 @@ export var useGridTreeData = function useGridTreeData(apiRef) {
8
8
  var cellParams = apiRef.current.getCellParams(params.id, params.field);
9
9
 
10
10
  if (cellParams.colDef.type === 'treeDataGroup' && event.key === ' ' && !event.shiftKey) {
11
- var _gridFilteredDescenda;
12
-
13
- var filteredDescendantCount = (_gridFilteredDescenda = gridFilteredDescendantCountLookupSelector(apiRef)[params.id]) != null ? _gridFilteredDescenda : 0;
14
-
15
- if (filteredDescendantCount === 0) {
11
+ if (params.rowNode.type !== 'group') {
16
12
  return;
17
13
  }
18
14
 
@@ -3,13 +3,14 @@ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
4
  var _excluded = ["hideDescendantCount"];
5
5
  import * as React from 'react';
6
- import { gridRowIdsSelector, gridRowTreeSelector, useFirstRender, GRID_CHECKBOX_SELECTION_FIELD } from '@mui/x-data-grid';
6
+ import { gridRowTreeSelector, useFirstRender, GRID_CHECKBOX_SELECTION_FIELD } from '@mui/x-data-grid';
7
7
  import { useGridRegisterPipeProcessor, useGridRegisterStrategyProcessor } from '@mui/x-data-grid/internals';
8
8
  import { GRID_TREE_DATA_GROUPING_COL_DEF, GRID_TREE_DATA_GROUPING_COL_DEF_FORCED_PROPERTIES } from './gridTreeDataGroupColDef';
9
9
  import { filterRowTreeFromTreeData, TREE_DATA_STRATEGY } from './gridTreeDataUtils';
10
10
  import { GridTreeDataGroupingCell } from '../../../components';
11
- import { buildRowTree } from '../../../utils/tree/buildRowTree';
11
+ import { createRowTree } from '../../../utils/tree/createRowTree';
12
12
  import { sortRowTree } from '../../../utils/tree/sortRowTree';
13
+ import { updateRowTree } from '../../../utils/tree/updateRowTree';
13
14
  import { jsx as _jsx } from "react/jsx-runtime";
14
15
  export var useGridTreeDataPreProcessors = function useGridTreeDataPreProcessors(apiRef, props) {
15
16
  var setStrategyAvailability = React.useCallback(function () {
@@ -78,36 +79,51 @@ export var useGridTreeDataPreProcessors = function useGridTreeDataPreProcessors(
78
79
 
79
80
  return columnsState;
80
81
  }, [props.treeData, getGroupingColDef]);
81
- var createRowTree = React.useCallback(function (params) {
82
+ var createRowTreeForTreeData = React.useCallback(function (params) {
82
83
  if (!props.getTreeDataPath) {
83
84
  throw new Error('MUI: No getTreeDataPath given.');
84
85
  }
85
86
 
86
- var rows = params.ids.map(function (rowId) {
87
+ var getRowTreeBuilderNode = function getRowTreeBuilderNode(rowId) {
87
88
  return {
88
89
  id: rowId,
89
- path: props.getTreeDataPath(params.idRowsLookup[rowId]).map(function (key) {
90
+ path: props.getTreeDataPath(params.dataRowIdToModelLookup[rowId]).map(function (key) {
90
91
  return {
91
92
  key: key,
92
93
  field: null
93
94
  };
94
95
  })
95
96
  };
96
- }).sort(function (a, b) {
97
- return a.path.length - b.path.length;
98
- });
99
- return buildRowTree(_extends({
100
- rows: rows
101
- }, params, {
97
+ };
98
+
99
+ var onDuplicatePath = function onDuplicatePath(firstId, secondId, path) {
100
+ throw new Error(['MUI: The path returned by `getTreeDataPath` should be unique.', "The rows with id #".concat(firstId, " and #").concat(secondId, " have the same."), "Path: ".concat(JSON.stringify(path.map(function (step) {
101
+ return step.key;
102
+ })), ".")].join('\n'));
103
+ };
104
+
105
+ if (params.updates.type === 'full') {
106
+ return createRowTree({
107
+ nodes: params.updates.rows.map(getRowTreeBuilderNode),
108
+ defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
109
+ isGroupExpandedByDefault: props.isGroupExpandedByDefault,
110
+ groupingName: TREE_DATA_STRATEGY,
111
+ onDuplicatePath: onDuplicatePath
112
+ });
113
+ }
114
+
115
+ return updateRowTree({
116
+ nodes: {
117
+ inserted: params.updates.actions.insert.map(getRowTreeBuilderNode),
118
+ modified: params.updates.actions.modify.map(getRowTreeBuilderNode),
119
+ removed: params.updates.actions.remove
120
+ },
121
+ previousTree: params.previousTree,
122
+ previousTreeDepth: params.previousTreeDepths,
102
123
  defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
103
124
  isGroupExpandedByDefault: props.isGroupExpandedByDefault,
104
- groupingName: TREE_DATA_STRATEGY,
105
- onDuplicatePath: function onDuplicatePath(firstId, secondId, path) {
106
- throw new Error(['MUI: The path returned by `getTreeDataPath` should be unique.', "The rows with id #".concat(firstId, " and #").concat(secondId, " have the same."), "Path: ".concat(JSON.stringify(path.map(function (step) {
107
- return step.key;
108
- })), ".")].join('\n'));
109
- }
110
- }));
125
+ groupingName: TREE_DATA_STRATEGY
126
+ });
111
127
  }, [props.getTreeDataPath, props.defaultGroupingExpansionDepth, props.isGroupExpandedByDefault]);
112
128
  var filterRows = React.useCallback(function (params) {
113
129
  var rowTree = gridRowTreeSelector(apiRef);
@@ -121,16 +137,15 @@ export var useGridTreeDataPreProcessors = function useGridTreeDataPreProcessors(
121
137
  }, [apiRef, props.disableChildrenFiltering]);
122
138
  var sortRows = React.useCallback(function (params) {
123
139
  var rowTree = gridRowTreeSelector(apiRef);
124
- var rowIds = gridRowIdsSelector(apiRef);
125
140
  return sortRowTree({
126
141
  rowTree: rowTree,
127
- rowIds: rowIds,
128
142
  sortRowList: params.sortRowList,
129
- disableChildrenSorting: props.disableChildrenSorting
143
+ disableChildrenSorting: props.disableChildrenSorting,
144
+ shouldRenderGroupBelowLeaves: false
130
145
  });
131
146
  }, [apiRef, props.disableChildrenSorting]);
132
147
  useGridRegisterPipeProcessor(apiRef, 'hydrateColumns', updateGroupingColumn);
133
- useGridRegisterStrategyProcessor(apiRef, TREE_DATA_STRATEGY, 'rowTreeCreation', createRowTree);
148
+ useGridRegisterStrategyProcessor(apiRef, TREE_DATA_STRATEGY, 'rowTreeCreation', createRowTreeForTreeData);
134
149
  useGridRegisterStrategyProcessor(apiRef, TREE_DATA_STRATEGY, 'filtering', filterRows);
135
150
  useGridRegisterStrategyProcessor(apiRef, TREE_DATA_STRATEGY, 'sorting', sortRows);
136
151
  /**
package/legacy/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license MUI v5.17.5
1
+ /** @license MUI v6.0.0-alpha.1
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -15,5 +15,7 @@ export { useGridTreeDataPreProcessors } from '../hooks/features/treeData/useGrid
15
15
  export { TREE_DATA_STRATEGY } from '../hooks/features/treeData/gridTreeDataUtils';
16
16
  export { useGridRowPinning, rowPinningStateInitializer } from '../hooks/features/rowPinning/useGridRowPinning';
17
17
  export { useGridRowPinningPreProcessors, addPinnedRow } from '../hooks/features/rowPinning/useGridRowPinningPreProcessors';
18
- export { buildRowTree } from '../utils/tree/buildRowTree';
19
- export { sortRowTree } from '../utils/tree/sortRowTree';
18
+ export { createRowTree } from '../utils/tree/createRowTree';
19
+ export { updateRowTree } from '../utils/tree/updateRowTree';
20
+ export { sortRowTree } from '../utils/tree/sortRowTree';
21
+ export { insertNodeInTree, removeNodeFromTree } from '../utils/tree/utils';
@@ -0,0 +1,36 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { GRID_ROOT_GROUP_ID } from '@mui/x-data-grid';
3
+ import { buildRootGroup } from '@mui/x-data-grid/internals';
4
+ import { insertDataRowInTree } from './insertDataRowInTree';
5
+
6
+ /**
7
+ * Transform a list of rows into a tree structure where each row references its parent and children.
8
+ */
9
+ export var createRowTree = function createRowTree(params) {
10
+ var dataRowIds = [];
11
+
12
+ var tree = _defineProperty({}, GRID_ROOT_GROUP_ID, buildRootGroup());
13
+
14
+ var treeDepths = {};
15
+
16
+ for (var i = 0; i < params.nodes.length; i += 1) {
17
+ var node = params.nodes[i];
18
+ dataRowIds.push(node.id);
19
+ insertDataRowInTree({
20
+ tree: tree,
21
+ id: node.id,
22
+ path: node.path,
23
+ onDuplicatePath: params.onDuplicatePath,
24
+ treeDepths: treeDepths,
25
+ isGroupExpandedByDefault: params.isGroupExpandedByDefault,
26
+ defaultGroupingExpansionDepth: params.defaultGroupingExpansionDepth
27
+ });
28
+ }
29
+
30
+ return {
31
+ tree: tree,
32
+ treeDepths: treeDepths,
33
+ groupingName: params.groupingName,
34
+ dataRowIds: dataRowIds
35
+ };
36
+ };
@@ -1 +1 @@
1
- export { getGroupRowIdFromPath } from './buildRowTree';
1
+ export { getGroupRowIdFromPath } from './utils';