@mui/x-tree-view-pro 8.0.0-alpha.8 → 8.0.0-beta.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.
- package/CHANGELOG.md +2566 -687
- package/README.md +1 -1
- package/RichTreeViewPro/RichTreeViewPro.d.ts +5 -5
- package/RichTreeViewPro/RichTreeViewPro.js +101 -89
- package/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +4 -5
- package/RichTreeViewPro/RichTreeViewPro.plugins.js +10 -3
- package/RichTreeViewPro/RichTreeViewPro.types.d.ts +38 -38
- package/RichTreeViewPro/RichTreeViewPro.types.js +5 -1
- package/RichTreeViewPro/index.d.ts +3 -3
- package/RichTreeViewPro/index.js +27 -3
- package/RichTreeViewPro/richTreeViewProClasses.d.ts +3 -3
- package/RichTreeViewPro/richTreeViewProClasses.js +13 -5
- package/esm/RichTreeViewPro/RichTreeViewPro.d.ts +20 -0
- package/{node → esm}/RichTreeViewPro/RichTreeViewPro.js +95 -95
- package/esm/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +7 -0
- package/esm/RichTreeViewPro/RichTreeViewPro.plugins.js +6 -0
- package/esm/RichTreeViewPro/RichTreeViewPro.types.d.ts +51 -0
- package/esm/RichTreeViewPro/RichTreeViewPro.types.js +1 -0
- package/esm/RichTreeViewPro/index.d.ts +3 -0
- package/esm/RichTreeViewPro/index.js +3 -0
- package/esm/RichTreeViewPro/richTreeViewProClasses.d.ts +7 -0
- package/esm/RichTreeViewPro/richTreeViewProClasses.js +6 -0
- package/esm/index.d.ts +12 -0
- package/esm/index.js +22 -0
- package/esm/internals/index.d.ts +1 -0
- package/esm/internals/index.js +1 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/index.d.ts +2 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/index.js +1 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.d.ts +3 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.itemPlugin.d.ts +3 -0
- package/{node → esm}/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.itemPlugin.js +10 -19
- package/{node → esm}/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.js +29 -48
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +183 -0
- package/{node → esm}/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.js +4 -11
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.d.ts +132 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.js +1 -0
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.d.ts +37 -0
- package/{node → esm}/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.js +21 -31
- package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +288 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/utils.js +85 -0
- package/esm/internals/utils/releaseInfo.d.ts +1 -0
- package/esm/internals/utils/releaseInfo.js +13 -0
- package/esm/internals/zero-styled/index.d.ts +3 -0
- package/esm/internals/zero-styled/index.js +7 -0
- package/esm/package.json +1 -0
- package/esm/themeAugmentation/components.d.ts +11 -0
- package/esm/themeAugmentation/index.d.ts +3 -0
- package/esm/themeAugmentation/index.js +0 -0
- package/esm/themeAugmentation/overrides.d.ts +12 -0
- package/esm/themeAugmentation/props.d.ts +10 -0
- package/index.d.ts +2 -2
- package/index.js +147 -15
- package/internals/index.d.ts +1 -1
- package/internals/index.js +12 -1
- package/internals/plugins/useTreeViewItemsReordering/index.d.ts +2 -2
- package/internals/plugins/useTreeViewItemsReordering/index.js +12 -1
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.d.ts +2 -2
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.itemPlugin.d.ts +1 -1
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.itemPlugin.js +19 -10
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.js +38 -39
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +138 -134
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.js +11 -4
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.d.ts +108 -117
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.js +5 -1
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.d.ts +28 -15
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.js +31 -21
- package/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/internals/plugins/useTreeViewLazyLoading/index.js +12 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +297 -0
- package/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/internals/plugins/useTreeViewLazyLoading/utils.js +89 -0
- package/internals/utils/releaseInfo.d.ts +1 -1
- package/internals/utils/releaseInfo.js +13 -5
- package/internals/zero-styled/index.d.ts +1 -1
- package/internals/zero-styled/index.js +14 -4
- package/modern/RichTreeViewPro/RichTreeViewPro.d.ts +20 -0
- package/modern/RichTreeViewPro/RichTreeViewPro.js +21 -15
- package/modern/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +7 -0
- package/modern/RichTreeViewPro/RichTreeViewPro.plugins.js +2 -1
- package/modern/RichTreeViewPro/RichTreeViewPro.types.d.ts +51 -0
- package/modern/RichTreeViewPro/index.d.ts +3 -0
- package/modern/RichTreeViewPro/richTreeViewProClasses.d.ts +7 -0
- package/modern/index.d.ts +12 -0
- package/modern/index.js +1 -1
- package/modern/internals/index.d.ts +1 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/index.d.ts +2 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.d.ts +3 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.itemPlugin.d.ts +3 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.js +4 -14
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +183 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.d.ts +132 -0
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.d.ts +37 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +288 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/utils.js +85 -0
- package/modern/internals/utils/releaseInfo.d.ts +1 -0
- package/modern/internals/utils/releaseInfo.js +1 -1
- package/modern/internals/zero-styled/index.d.ts +3 -0
- package/modern/package.json +1 -0
- package/modern/themeAugmentation/components.d.ts +11 -0
- package/modern/themeAugmentation/index.d.ts +3 -0
- package/modern/themeAugmentation/overrides.d.ts +12 -0
- package/modern/themeAugmentation/props.d.ts +10 -0
- package/package.json +43 -10
- package/themeAugmentation/components.d.ts +1 -3
- package/themeAugmentation/index.d.ts +1 -1
- package/themeAugmentation/index.js +1 -0
- package/themeAugmentation/overrides.d.ts +2 -3
- package/themeAugmentation/props.d.ts +2 -4
- package/tsconfig.build.tsbuildinfo +1 -0
- package/RichTreeViewPro/package.json +0 -6
- package/internals/package.json +0 -6
- package/node/RichTreeViewPro/RichTreeViewPro.plugins.js +0 -11
- package/node/RichTreeViewPro/RichTreeViewPro.types.js +0 -5
- package/node/RichTreeViewPro/index.js +0 -27
- package/node/RichTreeViewPro/richTreeViewProClasses.js +0 -14
- package/node/index.js +0 -154
- package/node/internals/index.js +0 -12
- package/node/internals/plugins/useTreeViewItemsReordering/index.js +0 -12
- package/node/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.js +0 -5
- package/node/internals/utils/releaseInfo.js +0 -21
- package/node/internals/zero-styled/index.js +0 -17
- package/node/themeAugmentation/index.js +0 -1
- package/themeAugmentation/package.json +0 -6
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
import { TreeViewUsedStore, UseTreeViewItemsState } from '@mui/x-tree-view/internals';
|
|
2
2
|
import { TreeViewItemId, TreeViewItemsReorderingAction } from '@mui/x-tree-view/models';
|
|
3
|
-
import { TreeViewItemItemReorderingValidActions, TreeViewItemReorderPosition, UseTreeViewItemsReorderingSignature } from
|
|
3
|
+
import { TreeViewItemItemReorderingValidActions, TreeViewItemReorderPosition, UseTreeViewItemsReorderingSignature } from "./useTreeViewItemsReordering.types.js";
|
|
4
4
|
/**
|
|
5
5
|
* Checks if the item with the id itemIdB is an ancestor of the item with the id itemIdA.
|
|
6
6
|
*/
|
|
7
7
|
export declare const isAncestor: (store: TreeViewUsedStore<UseTreeViewItemsReorderingSignature>, itemIdA: string, itemIdB: string) => boolean;
|
|
8
8
|
interface GetNewPositionParams {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
itemChildrenIndentation: string | number;
|
|
10
|
+
validActions: TreeViewItemItemReorderingValidActions;
|
|
11
|
+
targetHeight: number;
|
|
12
|
+
targetDepth: number;
|
|
13
|
+
cursorY: number;
|
|
14
|
+
cursorX: number;
|
|
15
|
+
contentElement: HTMLDivElement;
|
|
16
16
|
}
|
|
17
|
-
export declare const chooseActionToApply: ({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
export declare const chooseActionToApply: ({
|
|
18
|
+
itemChildrenIndentation,
|
|
19
|
+
validActions,
|
|
20
|
+
targetHeight,
|
|
21
|
+
targetDepth,
|
|
22
|
+
cursorX,
|
|
23
|
+
cursorY,
|
|
24
|
+
contentElement
|
|
25
|
+
}: GetNewPositionParams) => TreeViewItemsReorderingAction | null;
|
|
26
|
+
export declare const moveItemInTree: <R extends {}>({
|
|
27
|
+
itemToMoveId,
|
|
28
|
+
oldPosition,
|
|
29
|
+
newPosition,
|
|
30
|
+
prevState
|
|
31
|
+
}: {
|
|
32
|
+
itemToMoveId: TreeViewItemId;
|
|
33
|
+
oldPosition: TreeViewItemReorderPosition;
|
|
34
|
+
newPosition: TreeViewItemReorderPosition;
|
|
35
|
+
prevState: UseTreeViewItemsState<R>["items"];
|
|
23
36
|
}) => UseTreeViewItemsState<R>["items"];
|
|
24
|
-
export {};
|
|
37
|
+
export {};
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.moveItemInTree = exports.isAncestor = exports.chooseActionToApply = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _internals = require("@mui/x-tree-view/internals");
|
|
3
10
|
/**
|
|
4
11
|
* Checks if the item with the id itemIdB is an ancestor of the item with the id itemIdA.
|
|
5
12
|
*/
|
|
6
|
-
|
|
7
|
-
const itemMetaA = selectorItemMeta(store.value, itemIdA);
|
|
13
|
+
const isAncestor = (store, itemIdA, itemIdB) => {
|
|
14
|
+
const itemMetaA = (0, _internals.selectorItemMeta)(store.value, itemIdA);
|
|
8
15
|
if (itemMetaA.parentId === itemIdB) {
|
|
9
16
|
return true;
|
|
10
17
|
}
|
|
@@ -19,6 +26,7 @@ export const isAncestor = (store, itemIdA, itemIdB) => {
|
|
|
19
26
|
* @param {string | null} itemChildrenIndentation The indentation as passed to the `itemChildrenIndentation` prop.
|
|
20
27
|
* @param {HTMLElement} contentElement The DOM element to which the indentation will be applied.
|
|
21
28
|
*/
|
|
29
|
+
exports.isAncestor = isAncestor;
|
|
22
30
|
const parseItemChildrenIndentation = (itemChildrenIndentation, contentElement) => {
|
|
23
31
|
if (typeof itemChildrenIndentation === 'number') {
|
|
24
32
|
return itemChildrenIndentation;
|
|
@@ -37,7 +45,7 @@ const parseItemChildrenIndentation = (itemChildrenIndentation, contentElement) =
|
|
|
37
45
|
contentElement.removeChild(tempElement);
|
|
38
46
|
return value;
|
|
39
47
|
};
|
|
40
|
-
|
|
48
|
+
const chooseActionToApply = ({
|
|
41
49
|
itemChildrenIndentation,
|
|
42
50
|
validActions,
|
|
43
51
|
targetHeight,
|
|
@@ -82,23 +90,24 @@ export const chooseActionToApply = ({
|
|
|
82
90
|
}
|
|
83
91
|
return action;
|
|
84
92
|
};
|
|
85
|
-
|
|
93
|
+
exports.chooseActionToApply = chooseActionToApply;
|
|
94
|
+
const moveItemInTree = ({
|
|
86
95
|
itemToMoveId,
|
|
87
96
|
oldPosition,
|
|
88
97
|
newPosition,
|
|
89
98
|
prevState
|
|
90
99
|
}) => {
|
|
91
100
|
const itemToMoveMeta = prevState.itemMetaLookup[itemToMoveId];
|
|
92
|
-
const oldParentId = oldPosition.parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
93
|
-
const newParentId = newPosition.parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
101
|
+
const oldParentId = oldPosition.parentId ?? _internals.TREE_VIEW_ROOT_PARENT_ID;
|
|
102
|
+
const newParentId = newPosition.parentId ?? _internals.TREE_VIEW_ROOT_PARENT_ID;
|
|
94
103
|
|
|
95
104
|
// 1. Update the `itemOrderedChildrenIds`.
|
|
96
|
-
const itemOrderedChildrenIds =
|
|
105
|
+
const itemOrderedChildrenIds = (0, _extends2.default)({}, prevState.itemOrderedChildrenIdsLookup);
|
|
97
106
|
if (oldParentId === newParentId) {
|
|
98
107
|
const updatedChildren = [...itemOrderedChildrenIds[oldParentId]];
|
|
99
108
|
updatedChildren.splice(oldPosition.index, 1);
|
|
100
109
|
updatedChildren.splice(newPosition.index, 0, itemToMoveId);
|
|
101
|
-
itemOrderedChildrenIds[itemToMoveMeta.parentId ?? TREE_VIEW_ROOT_PARENT_ID] = updatedChildren;
|
|
110
|
+
itemOrderedChildrenIds[itemToMoveMeta.parentId ?? _internals.TREE_VIEW_ROOT_PARENT_ID] = updatedChildren;
|
|
102
111
|
} else {
|
|
103
112
|
const updatedOldParentChildren = [...itemOrderedChildrenIds[oldParentId]];
|
|
104
113
|
updatedOldParentChildren.splice(oldPosition.index, 1);
|
|
@@ -109,50 +118,51 @@ export const moveItemInTree = ({
|
|
|
109
118
|
}
|
|
110
119
|
|
|
111
120
|
// 2. Update the `itemChildrenIndexes`
|
|
112
|
-
const itemChildrenIndexes =
|
|
113
|
-
itemChildrenIndexes[oldParentId] = buildSiblingIndexes(itemOrderedChildrenIds[oldParentId]);
|
|
121
|
+
const itemChildrenIndexes = (0, _extends2.default)({}, prevState.itemChildrenIndexesLookup);
|
|
122
|
+
itemChildrenIndexes[oldParentId] = (0, _internals.buildSiblingIndexes)(itemOrderedChildrenIds[oldParentId]);
|
|
114
123
|
if (newParentId !== oldParentId) {
|
|
115
|
-
itemChildrenIndexes[newParentId] = buildSiblingIndexes(itemOrderedChildrenIds[newParentId]);
|
|
124
|
+
itemChildrenIndexes[newParentId] = (0, _internals.buildSiblingIndexes)(itemOrderedChildrenIds[newParentId]);
|
|
116
125
|
}
|
|
117
126
|
|
|
118
127
|
// 3. Update the `itemMetaLookup`
|
|
119
|
-
const itemMetaLookup =
|
|
128
|
+
const itemMetaLookup = (0, _extends2.default)({}, prevState.itemMetaLookup);
|
|
120
129
|
|
|
121
130
|
// 3.1 Update the `expandable` property of the old and the new parent
|
|
122
131
|
function updateExpandable(itemId) {
|
|
123
132
|
const isExpandable = itemOrderedChildrenIds[itemId].length > 0;
|
|
124
133
|
if (itemMetaLookup[itemId].expandable !== isExpandable) {
|
|
125
|
-
itemMetaLookup[itemId] =
|
|
134
|
+
itemMetaLookup[itemId] = (0, _extends2.default)({}, itemMetaLookup[itemId], {
|
|
126
135
|
expandable: isExpandable
|
|
127
136
|
});
|
|
128
137
|
}
|
|
129
138
|
}
|
|
130
|
-
if (oldParentId !== TREE_VIEW_ROOT_PARENT_ID && oldParentId !== newParentId) {
|
|
139
|
+
if (oldParentId !== _internals.TREE_VIEW_ROOT_PARENT_ID && oldParentId !== newParentId) {
|
|
131
140
|
updateExpandable(oldParentId);
|
|
132
141
|
}
|
|
133
|
-
if (newParentId !== TREE_VIEW_ROOT_PARENT_ID && newParentId !== oldParentId) {
|
|
142
|
+
if (newParentId !== _internals.TREE_VIEW_ROOT_PARENT_ID && newParentId !== oldParentId) {
|
|
134
143
|
updateExpandable(newParentId);
|
|
135
144
|
}
|
|
136
145
|
|
|
137
146
|
// 3.2 Update the `parentId` and `depth` properties of the item to move
|
|
138
147
|
// The depth is always defined because drag&drop is only usable with Rich Tree View components.
|
|
139
148
|
const itemToMoveDepth = newPosition.parentId == null ? 0 : itemMetaLookup[newParentId].depth + 1;
|
|
140
|
-
itemMetaLookup[itemToMoveId] =
|
|
149
|
+
itemMetaLookup[itemToMoveId] = (0, _extends2.default)({}, itemToMoveMeta, {
|
|
141
150
|
parentId: newPosition.parentId,
|
|
142
151
|
depth: itemToMoveDepth
|
|
143
152
|
});
|
|
144
153
|
|
|
145
154
|
// 3.3 Update the depth of all the children of the item to move
|
|
146
155
|
const updateItemDepth = (itemId, depth) => {
|
|
147
|
-
itemMetaLookup[itemId] =
|
|
156
|
+
itemMetaLookup[itemId] = (0, _extends2.default)({}, itemMetaLookup[itemId], {
|
|
148
157
|
depth
|
|
149
158
|
});
|
|
150
159
|
itemOrderedChildrenIds[itemId]?.forEach(childId => updateItemDepth(childId, depth + 1));
|
|
151
160
|
};
|
|
152
161
|
itemOrderedChildrenIds[itemToMoveId]?.forEach(childId => updateItemDepth(childId, itemToMoveDepth + 1));
|
|
153
|
-
return
|
|
162
|
+
return (0, _extends2.default)({}, prevState, {
|
|
154
163
|
itemOrderedChildrenIdsLookup: itemOrderedChildrenIds,
|
|
155
164
|
itemChildrenIndexesLookup: itemChildrenIndexes,
|
|
156
165
|
itemMetaLookup
|
|
157
166
|
});
|
|
158
|
-
};
|
|
167
|
+
};
|
|
168
|
+
exports.moveItemInTree = moveItemInTree;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeViewLazyLoading } from "./useTreeViewLazyLoading.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "useTreeViewLazyLoading", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeViewLazyLoading.useTreeViewLazyLoading;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeViewLazyLoading = require("./useTreeViewLazyLoading");
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.useTreeViewLazyLoading = void 0;
|
|
9
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
|
|
12
|
+
var _warning = require("@mui/x-internals/warning");
|
|
13
|
+
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
14
|
+
var _internals = require("@mui/x-tree-view/internals");
|
|
15
|
+
var _utils = require("@mui/x-tree-view/utils");
|
|
16
|
+
var _utils2 = require("./utils");
|
|
17
|
+
const INITIAL_STATE = {
|
|
18
|
+
loading: {},
|
|
19
|
+
errors: {}
|
|
20
|
+
};
|
|
21
|
+
const noopCache = {
|
|
22
|
+
clear: () => {},
|
|
23
|
+
get: () => undefined,
|
|
24
|
+
set: () => {}
|
|
25
|
+
};
|
|
26
|
+
function getCache(cacheProp) {
|
|
27
|
+
if (cacheProp === null) {
|
|
28
|
+
return noopCache;
|
|
29
|
+
}
|
|
30
|
+
return cacheProp ?? new _utils.DataSourceCacheDefault({});
|
|
31
|
+
}
|
|
32
|
+
const useTreeViewLazyLoading = ({
|
|
33
|
+
instance,
|
|
34
|
+
params,
|
|
35
|
+
store
|
|
36
|
+
}) => {
|
|
37
|
+
const isLazyLoadingEnabled = params.dataSource?.getChildrenCount !== undefined;
|
|
38
|
+
const firstRenderRef = React.useRef(true);
|
|
39
|
+
const nestedDataManager = (0, _useLazyRef.default)(() => new _utils2.NestedDataManager(instance)).current;
|
|
40
|
+
const cacheRef = (0, _useLazyRef.default)(() => getCache(params.dataSourceCache));
|
|
41
|
+
const setDataSourceLoading = (0, _useEventCallback.default)((itemId, isLoading) => {
|
|
42
|
+
if (!isLazyLoadingEnabled) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
store.update(prevState => {
|
|
46
|
+
if (!prevState.lazyLoading.dataSource.loading[itemId] && !isLoading) {
|
|
47
|
+
return prevState;
|
|
48
|
+
}
|
|
49
|
+
const loading = (0, _extends2.default)({}, prevState.lazyLoading.dataSource.loading);
|
|
50
|
+
if (isLoading === false) {
|
|
51
|
+
delete loading[itemId];
|
|
52
|
+
} else {
|
|
53
|
+
loading[itemId] = isLoading;
|
|
54
|
+
}
|
|
55
|
+
return (0, _extends2.default)({}, prevState, {
|
|
56
|
+
lazyLoading: (0, _extends2.default)({}, prevState.lazyLoading, {
|
|
57
|
+
dataSource: (0, _extends2.default)({}, prevState.lazyLoading.dataSource, {
|
|
58
|
+
loading
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
const setDataSourceError = (itemId, error) => {
|
|
65
|
+
if (!isLazyLoadingEnabled) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
store.update(prevState => {
|
|
69
|
+
const errors = (0, _extends2.default)({}, prevState.lazyLoading.dataSource.errors);
|
|
70
|
+
if (error === null && errors[itemId] !== undefined) {
|
|
71
|
+
delete errors[itemId];
|
|
72
|
+
} else {
|
|
73
|
+
errors[itemId] = error;
|
|
74
|
+
}
|
|
75
|
+
errors[itemId] = error;
|
|
76
|
+
return (0, _extends2.default)({}, prevState, {
|
|
77
|
+
lazyLoading: (0, _extends2.default)({}, prevState.lazyLoading, {
|
|
78
|
+
dataSource: (0, _extends2.default)({}, prevState.lazyLoading.dataSource, {
|
|
79
|
+
errors
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
const resetDataSourceState = (0, _useEventCallback.default)(() => {
|
|
86
|
+
if (!isLazyLoadingEnabled) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
store.update(prevState => (0, _extends2.default)({}, prevState, {
|
|
90
|
+
lazyLoading: (0, _extends2.default)({}, prevState.lazyLoading, {
|
|
91
|
+
dataSource: INITIAL_STATE
|
|
92
|
+
})
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
const fetchItems = (0, _useEventCallback.default)(async parentIds => {
|
|
96
|
+
if (!isLazyLoadingEnabled) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
100
|
+
const getTreeItems = params.dataSource?.getTreeItems;
|
|
101
|
+
if (!getTreeItems) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (parentIds) {
|
|
105
|
+
await nestedDataManager.queue(parentIds);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
nestedDataManager.clear();
|
|
109
|
+
|
|
110
|
+
// reset the state if we are refetching the first visible items
|
|
111
|
+
if ((0, _internals.selectorDataSourceState)(store.value) !== INITIAL_STATE) {
|
|
112
|
+
resetDataSourceState();
|
|
113
|
+
}
|
|
114
|
+
// handle caching here
|
|
115
|
+
const cachedData = cacheRef.current.get('root');
|
|
116
|
+
if (cachedData !== undefined) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// handle loading here
|
|
121
|
+
instance.setTreeViewLoading(true);
|
|
122
|
+
try {
|
|
123
|
+
const getTreeItemsResponse = await getTreeItems();
|
|
124
|
+
|
|
125
|
+
// set caching
|
|
126
|
+
cacheRef.current.set('root', getTreeItemsResponse);
|
|
127
|
+
|
|
128
|
+
// update the items in the state
|
|
129
|
+
instance.addItems({
|
|
130
|
+
items: getTreeItemsResponse,
|
|
131
|
+
depth: 0,
|
|
132
|
+
getChildrenCount
|
|
133
|
+
});
|
|
134
|
+
} catch (error) {
|
|
135
|
+
// set the items to empty
|
|
136
|
+
instance.addItems({
|
|
137
|
+
items: [],
|
|
138
|
+
depth: 0,
|
|
139
|
+
getChildrenCount
|
|
140
|
+
});
|
|
141
|
+
// set error state
|
|
142
|
+
instance.setTreeViewError(error);
|
|
143
|
+
} finally {
|
|
144
|
+
// set loading state
|
|
145
|
+
instance.setTreeViewLoading(false);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
const fetchItemChildren = (0, _useEventCallback.default)(async id => {
|
|
149
|
+
if (!isLazyLoadingEnabled) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
153
|
+
const getTreeItems = params.dataSource?.getTreeItems;
|
|
154
|
+
if (!getTreeItems) {
|
|
155
|
+
nestedDataManager.clearPendingRequest(id);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const parent = (0, _internals.selectorItemMeta)(store.value, id);
|
|
159
|
+
if (!parent) {
|
|
160
|
+
nestedDataManager.clearPendingRequest(id);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const depth = parent.depth ? parent.depth + 1 : 1;
|
|
164
|
+
|
|
165
|
+
// handle loading here
|
|
166
|
+
instance.setDataSourceLoading(id, true);
|
|
167
|
+
|
|
168
|
+
// handle caching here
|
|
169
|
+
const cachedData = cacheRef.current.get(id);
|
|
170
|
+
if (cachedData !== undefined && cachedData !== -1) {
|
|
171
|
+
nestedDataManager.setRequestSettled(id);
|
|
172
|
+
instance.addItems({
|
|
173
|
+
items: cachedData,
|
|
174
|
+
depth,
|
|
175
|
+
parentId: id,
|
|
176
|
+
getChildrenCount
|
|
177
|
+
});
|
|
178
|
+
instance.setDataSourceLoading(id, false);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (cachedData === -1) {
|
|
182
|
+
instance.removeChildren(id);
|
|
183
|
+
}
|
|
184
|
+
const existingError = (0, _internals.selectorGetTreeItemError)(store.value, id) ?? null;
|
|
185
|
+
if (existingError) {
|
|
186
|
+
instance.setDataSourceError(id, null);
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const getTreeItemsResponse = await getTreeItems(id);
|
|
190
|
+
nestedDataManager.setRequestSettled(id);
|
|
191
|
+
|
|
192
|
+
// set caching
|
|
193
|
+
cacheRef.current.set(id, getTreeItemsResponse);
|
|
194
|
+
// update the items in the state
|
|
195
|
+
instance.addItems({
|
|
196
|
+
items: getTreeItemsResponse,
|
|
197
|
+
depth,
|
|
198
|
+
parentId: id,
|
|
199
|
+
getChildrenCount
|
|
200
|
+
});
|
|
201
|
+
} catch (error) {
|
|
202
|
+
const childrenFetchError = error;
|
|
203
|
+
// handle errors here
|
|
204
|
+
instance.setDataSourceError(id, childrenFetchError);
|
|
205
|
+
instance.removeChildren(id);
|
|
206
|
+
} finally {
|
|
207
|
+
// unset loading
|
|
208
|
+
instance.setDataSourceLoading(id, false);
|
|
209
|
+
nestedDataManager.setRequestSettled(id);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
(0, _internals.useInstanceEventHandler)(instance, 'beforeItemToggleExpansion', async eventParameters => {
|
|
213
|
+
if (!isLazyLoadingEnabled || !eventParameters.shouldBeExpanded) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
eventParameters.isExpansionPrevented = true;
|
|
217
|
+
await instance.fetchItems([eventParameters.itemId]);
|
|
218
|
+
const fetchErrors = Boolean((0, _internals.selectorGetTreeItemError)(store.value, eventParameters.itemId));
|
|
219
|
+
if (!fetchErrors) {
|
|
220
|
+
instance.applyItemExpansion({
|
|
221
|
+
itemId: eventParameters.itemId,
|
|
222
|
+
shouldBeExpanded: true,
|
|
223
|
+
event: eventParameters.event
|
|
224
|
+
});
|
|
225
|
+
if ((0, _internals.selectorIsItemSelected)(store.value, eventParameters.itemId)) {
|
|
226
|
+
// make sure selection propagation works correctly
|
|
227
|
+
instance.setItemSelection({
|
|
228
|
+
event: eventParameters.event,
|
|
229
|
+
itemId: eventParameters.itemId,
|
|
230
|
+
keepExistingSelection: true,
|
|
231
|
+
shouldBeSelected: true
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
React.useEffect(() => {
|
|
237
|
+
if (isLazyLoadingEnabled && firstRenderRef.current) {
|
|
238
|
+
store.update(prevState => (0, _extends2.default)({}, prevState, {
|
|
239
|
+
lazyLoading: (0, _extends2.default)({}, prevState.lazyLoading, {
|
|
240
|
+
enabled: true
|
|
241
|
+
})
|
|
242
|
+
}));
|
|
243
|
+
if (params.items.length) {
|
|
244
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
245
|
+
instance.addItems({
|
|
246
|
+
items: params.items,
|
|
247
|
+
depth: 0,
|
|
248
|
+
getChildrenCount
|
|
249
|
+
});
|
|
250
|
+
} else {
|
|
251
|
+
instance.fetchItems();
|
|
252
|
+
}
|
|
253
|
+
firstRenderRef.current = false;
|
|
254
|
+
}
|
|
255
|
+
}, [instance, params.items, params.dataSource, isLazyLoadingEnabled, store]);
|
|
256
|
+
if (isLazyLoadingEnabled) {
|
|
257
|
+
instance.preventItemUpdates();
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
instance: {
|
|
261
|
+
fetchItemChildren,
|
|
262
|
+
fetchItems,
|
|
263
|
+
setDataSourceLoading,
|
|
264
|
+
setDataSourceError
|
|
265
|
+
},
|
|
266
|
+
publicAPI: {}
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
exports.useTreeViewLazyLoading = useTreeViewLazyLoading;
|
|
270
|
+
useTreeViewLazyLoading.getDefaultizedParams = ({
|
|
271
|
+
params,
|
|
272
|
+
experimentalFeatures
|
|
273
|
+
}) => {
|
|
274
|
+
const canUseFeature = experimentalFeatures?.lazyLoading;
|
|
275
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
276
|
+
if (params.dataSource && !canUseFeature) {
|
|
277
|
+
(0, _warning.warnOnce)(['MUI X: The label editing feature requires the `lazyLoading` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ lazyLoading: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/lazy-loading/']);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const defaultDataSource = params?.dataSource ?? {
|
|
281
|
+
getChildrenCount: () => 0,
|
|
282
|
+
getTreeItems: () => Promise.resolve([])
|
|
283
|
+
};
|
|
284
|
+
return (0, _extends2.default)({}, params, {
|
|
285
|
+
dataSource: canUseFeature ? defaultDataSource : {}
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
useTreeViewLazyLoading.getInitialState = () => ({
|
|
289
|
+
lazyLoading: {
|
|
290
|
+
enabled: false,
|
|
291
|
+
dataSource: INITIAL_STATE
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
useTreeViewLazyLoading.params = {
|
|
295
|
+
dataSource: true,
|
|
296
|
+
dataSourceCache: true
|
|
297
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TreeViewInstance, UseTreeViewLazyLoadingSignature } from '@mui/x-tree-view/internals';
|
|
2
|
+
import { TreeViewItemId } from '@mui/x-tree-view/models';
|
|
3
|
+
export declare enum RequestStatus {
|
|
4
|
+
QUEUED = 0,
|
|
5
|
+
PENDING = 1,
|
|
6
|
+
SETTLED = 2,
|
|
7
|
+
UNKNOWN = 3,
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Plugins that the `NestedDataManager` class can use if they are present, but are not required.
|
|
11
|
+
*/
|
|
12
|
+
export type NestedDataManagerOptionalPlugins = readonly [];
|
|
13
|
+
/**
|
|
14
|
+
* Fetches row children from the server with option to limit the number of concurrent requests
|
|
15
|
+
* Determines the status of a request based on the enum `RequestStatus`
|
|
16
|
+
* Uses `ParentId` to uniquely identify a request
|
|
17
|
+
*/
|
|
18
|
+
export declare class NestedDataManager {
|
|
19
|
+
private pendingRequests;
|
|
20
|
+
private queuedRequests;
|
|
21
|
+
private settledRequests;
|
|
22
|
+
private instance;
|
|
23
|
+
private maxConcurrentRequests;
|
|
24
|
+
constructor(instance: TreeViewInstance<[UseTreeViewLazyLoadingSignature]>, maxConcurrentRequests?: number);
|
|
25
|
+
private processQueue;
|
|
26
|
+
queue: (ids: TreeViewItemId[]) => Promise<void>;
|
|
27
|
+
setRequestSettled: (id: TreeViewItemId) => Promise<void>;
|
|
28
|
+
clear: () => void;
|
|
29
|
+
clearPendingRequest: (id: TreeViewItemId) => Promise<void>;
|
|
30
|
+
getRequestStatus: (id: TreeViewItemId) => RequestStatus;
|
|
31
|
+
getActiveRequestsCount: () => number;
|
|
32
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RequestStatus = exports.NestedDataManager = void 0;
|
|
7
|
+
const MAX_CONCURRENT_REQUESTS = Infinity;
|
|
8
|
+
let RequestStatus = exports.RequestStatus = /*#__PURE__*/function (RequestStatus) {
|
|
9
|
+
RequestStatus[RequestStatus["QUEUED"] = 0] = "QUEUED";
|
|
10
|
+
RequestStatus[RequestStatus["PENDING"] = 1] = "PENDING";
|
|
11
|
+
RequestStatus[RequestStatus["SETTLED"] = 2] = "SETTLED";
|
|
12
|
+
RequestStatus[RequestStatus["UNKNOWN"] = 3] = "UNKNOWN";
|
|
13
|
+
return RequestStatus;
|
|
14
|
+
}({});
|
|
15
|
+
/**
|
|
16
|
+
* Plugins that need to be present in the Tree View in order for the `NestedDataManager` class to work correctly.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Plugins that the `NestedDataManager` class can use if they are present, but are not required.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Fetches row children from the server with option to limit the number of concurrent requests
|
|
23
|
+
* Determines the status of a request based on the enum `RequestStatus`
|
|
24
|
+
* Uses `ParentId` to uniquely identify a request
|
|
25
|
+
*/
|
|
26
|
+
class NestedDataManager {
|
|
27
|
+
constructor(instance, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
|
|
28
|
+
this.pendingRequests = new Set();
|
|
29
|
+
this.queuedRequests = new Set();
|
|
30
|
+
this.settledRequests = new Set();
|
|
31
|
+
this.instance = void 0;
|
|
32
|
+
this.maxConcurrentRequests = void 0;
|
|
33
|
+
this.processQueue = async () => {
|
|
34
|
+
if (this.queuedRequests.size === 0 || this.pendingRequests.size >= this.maxConcurrentRequests) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const loopLength = Math.min(this.maxConcurrentRequests - this.pendingRequests.size, this.queuedRequests.size);
|
|
38
|
+
if (loopLength === 0) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const fetchQueue = Array.from(this.queuedRequests);
|
|
42
|
+
const fetchPromises = [];
|
|
43
|
+
for (let i = 0; i < loopLength; i += 1) {
|
|
44
|
+
const id = fetchQueue[i];
|
|
45
|
+
this.queuedRequests.delete(id);
|
|
46
|
+
this.pendingRequests.add(id);
|
|
47
|
+
fetchPromises.push(this.instance.fetchItemChildren(id));
|
|
48
|
+
}
|
|
49
|
+
await Promise.all(fetchPromises);
|
|
50
|
+
};
|
|
51
|
+
this.queue = async ids => {
|
|
52
|
+
const loadingIds = {};
|
|
53
|
+
ids.forEach(id => {
|
|
54
|
+
this.queuedRequests.add(id);
|
|
55
|
+
loadingIds[id] = true;
|
|
56
|
+
});
|
|
57
|
+
await this.processQueue();
|
|
58
|
+
};
|
|
59
|
+
this.setRequestSettled = async id => {
|
|
60
|
+
this.pendingRequests.delete(id);
|
|
61
|
+
this.settledRequests.add(id);
|
|
62
|
+
await this.processQueue();
|
|
63
|
+
};
|
|
64
|
+
this.clear = () => {
|
|
65
|
+
this.queuedRequests.clear();
|
|
66
|
+
Array.from(this.pendingRequests).forEach(id => this.clearPendingRequest(id));
|
|
67
|
+
};
|
|
68
|
+
this.clearPendingRequest = async id => {
|
|
69
|
+
this.pendingRequests.delete(id);
|
|
70
|
+
await this.processQueue();
|
|
71
|
+
};
|
|
72
|
+
this.getRequestStatus = id => {
|
|
73
|
+
if (this.pendingRequests.has(id)) {
|
|
74
|
+
return RequestStatus.PENDING;
|
|
75
|
+
}
|
|
76
|
+
if (this.queuedRequests.has(id)) {
|
|
77
|
+
return RequestStatus.QUEUED;
|
|
78
|
+
}
|
|
79
|
+
if (this.settledRequests.has(id)) {
|
|
80
|
+
return RequestStatus.SETTLED;
|
|
81
|
+
}
|
|
82
|
+
return RequestStatus.UNKNOWN;
|
|
83
|
+
};
|
|
84
|
+
this.getActiveRequestsCount = () => this.pendingRequests.size + this.queuedRequests.size;
|
|
85
|
+
this.instance = instance;
|
|
86
|
+
this.maxConcurrentRequests = maxConcurrentRequests;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.NestedDataManager = NestedDataManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getReleaseInfo: () => any;
|
|
1
|
+
export declare const getReleaseInfo: () => any;
|
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getReleaseInfo = void 0;
|
|
8
|
+
var _ponyfillGlobal = _interopRequireDefault(require("@mui/utils/ponyfillGlobal"));
|
|
9
|
+
const getReleaseInfo = () => {
|
|
10
|
+
const releaseInfo = "MTc0MjI0ODgwMDAwMA==";
|
|
4
11
|
if (process.env.NODE_ENV !== 'production') {
|
|
5
12
|
// A simple hack to set the value in the test environment (has no build step).
|
|
6
13
|
// eslint-disable-next-line no-useless-concat
|
|
7
14
|
if (releaseInfo === '__RELEASE' + '_INFO__') {
|
|
8
15
|
// eslint-disable-next-line no-underscore-dangle
|
|
9
|
-
return
|
|
16
|
+
return _ponyfillGlobal.default.__MUI_RELEASE_INFO__;
|
|
10
17
|
}
|
|
11
18
|
}
|
|
12
19
|
return releaseInfo;
|
|
13
|
-
};
|
|
20
|
+
};
|
|
21
|
+
exports.getReleaseInfo = getReleaseInfo;
|