@mui/x-tree-view-pro 8.23.0 → 8.24.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 (100) hide show
  1. package/CHANGELOG.md +111 -1
  2. package/RichTreeViewPro/RichTreeViewPro.js +32 -29
  3. package/RichTreeViewPro/RichTreeViewPro.types.d.ts +6 -5
  4. package/RichTreeViewPro/index.d.ts +1 -2
  5. package/RichTreeViewPro/useExtractRichTreeViewProParameters.d.ts +294 -0
  6. package/RichTreeViewPro/useExtractRichTreeViewProParameters.js +107 -0
  7. package/esm/RichTreeViewPro/RichTreeViewPro.js +32 -29
  8. package/esm/RichTreeViewPro/RichTreeViewPro.types.d.ts +6 -5
  9. package/esm/RichTreeViewPro/index.d.ts +1 -2
  10. package/esm/RichTreeViewPro/useExtractRichTreeViewProParameters.d.ts +294 -0
  11. package/esm/RichTreeViewPro/useExtractRichTreeViewProParameters.js +99 -0
  12. package/esm/hooks/useRichTreeViewProApiRef.d.ts +2 -2
  13. package/esm/index.d.ts +0 -1
  14. package/esm/index.js +1 -2
  15. package/esm/internals/RichTreeViewProStore/RichTreeViewProStore.d.ts +49 -0
  16. package/esm/internals/RichTreeViewProStore/RichTreeViewProStore.js +15 -0
  17. package/esm/internals/RichTreeViewProStore/RichTreeViewProStore.types.d.ts +69 -0
  18. package/esm/internals/RichTreeViewProStore/RichTreeViewProStore.utils.d.ts +3 -0
  19. package/esm/internals/RichTreeViewProStore/RichTreeViewProStore.utils.js +18 -0
  20. package/esm/internals/RichTreeViewProStore/index.d.ts +2 -0
  21. package/esm/internals/RichTreeViewProStore/index.js +2 -0
  22. package/esm/internals/plugins/itemsReordering/TreeViewItemsReorderingPlugin.d.ts +53 -0
  23. package/esm/internals/plugins/itemsReordering/TreeViewItemsReorderingPlugin.js +180 -0
  24. package/esm/internals/plugins/itemsReordering/index.d.ts +3 -0
  25. package/esm/internals/plugins/itemsReordering/index.js +3 -0
  26. package/esm/internals/plugins/{useTreeViewItemsReordering → itemsReordering}/itemPlugin.js +6 -7
  27. package/esm/internals/plugins/itemsReordering/selectors.d.ts +29 -0
  28. package/esm/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.js → itemsReordering/selectors.js} +4 -4
  29. package/esm/internals/plugins/itemsReordering/types.d.ts +6 -0
  30. package/{internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.d.ts → esm/internals/plugins/itemsReordering/utils.d.ts} +7 -7
  31. package/esm/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.utils.js → itemsReordering/utils.js} +2 -2
  32. package/esm/internals/plugins/lazyLoading/TreeViewLazyLoadingPlugin.d.ts +51 -0
  33. package/esm/internals/plugins/lazyLoading/TreeViewLazyLoadingPlugin.js +230 -0
  34. package/esm/internals/plugins/lazyLoading/index.d.ts +2 -0
  35. package/esm/internals/plugins/lazyLoading/index.js +2 -0
  36. package/esm/internals/plugins/lazyLoading/types.d.ts +21 -0
  37. package/esm/internals/plugins/lazyLoading/types.js +1 -0
  38. package/{internals/plugins/useTreeViewLazyLoading → esm/internals/plugins/lazyLoading}/utils.d.ts +3 -7
  39. package/esm/internals/plugins/{useTreeViewLazyLoading → lazyLoading}/utils.js +3 -11
  40. package/hooks/useRichTreeViewProApiRef.d.ts +2 -2
  41. package/index.d.ts +0 -1
  42. package/index.js +1 -23
  43. package/internals/RichTreeViewProStore/RichTreeViewProStore.d.ts +49 -0
  44. package/internals/RichTreeViewProStore/RichTreeViewProStore.js +23 -0
  45. package/internals/RichTreeViewProStore/RichTreeViewProStore.types.d.ts +69 -0
  46. package/internals/RichTreeViewProStore/RichTreeViewProStore.utils.d.ts +3 -0
  47. package/internals/RichTreeViewProStore/RichTreeViewProStore.utils.js +25 -0
  48. package/internals/RichTreeViewProStore/index.d.ts +2 -0
  49. package/internals/RichTreeViewProStore/index.js +27 -0
  50. package/internals/plugins/itemsReordering/TreeViewItemsReorderingPlugin.d.ts +53 -0
  51. package/internals/plugins/itemsReordering/TreeViewItemsReorderingPlugin.js +188 -0
  52. package/internals/plugins/itemsReordering/index.d.ts +3 -0
  53. package/internals/plugins/itemsReordering/index.js +27 -0
  54. package/internals/plugins/{useTreeViewItemsReordering → itemsReordering}/itemPlugin.js +9 -10
  55. package/internals/plugins/itemsReordering/selectors.d.ts +29 -0
  56. package/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.js → itemsReordering/selectors.js} +4 -4
  57. package/internals/plugins/itemsReordering/types.d.ts +6 -0
  58. package/{esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.utils.d.ts → internals/plugins/itemsReordering/utils.d.ts} +7 -7
  59. package/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.utils.js → itemsReordering/utils.js} +2 -2
  60. package/internals/plugins/lazyLoading/TreeViewLazyLoadingPlugin.d.ts +51 -0
  61. package/internals/plugins/lazyLoading/TreeViewLazyLoadingPlugin.js +238 -0
  62. package/internals/plugins/lazyLoading/index.d.ts +2 -0
  63. package/internals/plugins/lazyLoading/index.js +27 -0
  64. package/internals/plugins/lazyLoading/types.d.ts +21 -0
  65. package/internals/plugins/lazyLoading/types.js +5 -0
  66. package/{esm/internals/plugins/useTreeViewLazyLoading → internals/plugins/lazyLoading}/utils.d.ts +3 -7
  67. package/internals/plugins/{useTreeViewLazyLoading → lazyLoading}/utils.js +3 -9
  68. package/package.json +4 -4
  69. package/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +0 -5
  70. package/RichTreeViewPro/RichTreeViewPro.plugins.js +0 -12
  71. package/esm/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +0 -5
  72. package/esm/RichTreeViewPro/RichTreeViewPro.plugins.js +0 -6
  73. package/esm/internals/index.d.ts +0 -1
  74. package/esm/internals/plugins/useTreeViewItemsReordering/index.d.ts +0 -3
  75. package/esm/internals/plugins/useTreeViewItemsReordering/index.js +0 -2
  76. package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.d.ts +0 -3
  77. package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.js +0 -196
  78. package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +0 -30
  79. package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.d.ts +0 -107
  80. package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +0 -1
  81. package/esm/internals/plugins/useTreeViewLazyLoading/index.js +0 -1
  82. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +0 -2
  83. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +0 -251
  84. package/internals/index.d.ts +0 -1
  85. package/internals/plugins/useTreeViewItemsReordering/index.d.ts +0 -3
  86. package/internals/plugins/useTreeViewItemsReordering/index.js +0 -19
  87. package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.d.ts +0 -3
  88. package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.js +0 -205
  89. package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +0 -30
  90. package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.types.d.ts +0 -107
  91. package/internals/plugins/useTreeViewLazyLoading/index.d.ts +0 -1
  92. package/internals/plugins/useTreeViewLazyLoading/index.js +0 -12
  93. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +0 -2
  94. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +0 -259
  95. /package/esm/internals/{index.js → RichTreeViewProStore/RichTreeViewProStore.types.js} +0 -0
  96. /package/esm/internals/plugins/{useTreeViewItemsReordering → itemsReordering}/itemPlugin.d.ts +0 -0
  97. /package/esm/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.types.js → itemsReordering/types.js} +0 -0
  98. /package/internals/{index.js → RichTreeViewProStore/RichTreeViewProStore.types.js} +0 -0
  99. /package/internals/plugins/{useTreeViewItemsReordering → itemsReordering}/itemPlugin.d.ts +0 -0
  100. /package/internals/plugins/{useTreeViewItemsReordering/useTreeViewItemsReordering.types.js → itemsReordering/types.js} +0 -0
@@ -0,0 +1,6 @@
1
+ import { TreeViewItemsReorderingAction } from '@mui/x-tree-view/models';
2
+ export interface TreeViewItemReorderPosition {
3
+ parentId: string | null;
4
+ index: number;
5
+ }
6
+ export type TreeViewItemItemReorderingValidActions = { [key in TreeViewItemsReorderingAction]?: TreeViewItemReorderPosition };
@@ -1,10 +1,10 @@
1
- import { TreeViewUsedStore, UseTreeViewItemsState } from '@mui/x-tree-view/internals';
2
- import { TreeViewItemId, TreeViewItemsReorderingAction } from '@mui/x-tree-view/models';
3
- import { TreeViewItemItemReorderingValidActions, TreeViewItemReorderPosition, UseTreeViewItemsReorderingSignature } from "./useTreeViewItemsReordering.types.js";
1
+ import { TreeViewItemId, TreeViewItemsReorderingAction, TreeViewValidItem } from '@mui/x-tree-view/models';
2
+ import { TreeViewItemItemReorderingValidActions, TreeViewItemReorderPosition } from "./types.js";
3
+ import { RichTreeViewProState, RichTreeViewProStore } from "../../RichTreeViewProStore/index.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
- export declare const isAncestor: (store: TreeViewUsedStore<UseTreeViewItemsReorderingSignature>, itemIdA: string, itemIdB: string) => boolean;
7
+ export declare const isAncestor: (store: RichTreeViewProStore<any, any>, itemIdA: string, itemIdB: string) => boolean;
8
8
  interface GetNewPositionParameters {
9
9
  itemChildrenIndentation: string | number;
10
10
  validActions: TreeViewItemItemReorderingValidActions;
@@ -23,7 +23,7 @@ export declare const chooseActionToApply: ({
23
23
  cursorY,
24
24
  contentElement
25
25
  }: GetNewPositionParameters) => TreeViewItemsReorderingAction | null;
26
- export declare const moveItemInTree: <R extends {}>({
26
+ export declare const moveItemInTree: <R extends TreeViewValidItem<R>>({
27
27
  itemToMoveId,
28
28
  oldPosition,
29
29
  newPosition,
@@ -32,6 +32,6 @@ export declare const moveItemInTree: <R extends {}>({
32
32
  itemToMoveId: TreeViewItemId;
33
33
  oldPosition: TreeViewItemReorderPosition;
34
34
  newPosition: TreeViewItemReorderPosition;
35
- prevState: UseTreeViewItemsState<R>["items"];
36
- }) => UseTreeViewItemsState<R>["items"];
35
+ prevState: RichTreeViewProState<R, any>;
36
+ }) => Pick<RichTreeViewProState<R, any>, "itemOrderedChildrenIdsLookup" | "itemChildrenIndexesLookup" | "itemMetaLookup">;
37
37
  export {};
@@ -150,9 +150,9 @@ export const moveItemInTree = ({
150
150
  itemOrderedChildrenIds[itemId]?.forEach(childId => updateItemDepth(childId, depth + 1));
151
151
  };
152
152
  itemOrderedChildrenIds[itemToMoveId]?.forEach(childId => updateItemDepth(childId, itemToMoveDepth + 1));
153
- return _extends({}, prevState, {
153
+ return {
154
154
  itemOrderedChildrenIdsLookup: itemOrderedChildrenIds,
155
155
  itemChildrenIndexesLookup: itemChildrenIndexes,
156
156
  itemMetaLookup
157
- });
157
+ };
158
158
  };
@@ -0,0 +1,51 @@
1
+ import { TreeViewItemId } from '@mui/x-tree-view/models';
2
+ import { RichTreeViewProStore } from "../../RichTreeViewProStore/RichTreeViewProStore.js";
3
+ export declare const TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE: {
4
+ loading: {};
5
+ errors: {};
6
+ };
7
+ export declare class TreeViewLazyLoadingPlugin {
8
+ private store;
9
+ private nestedDataManager;
10
+ private cache;
11
+ constructor(store: RichTreeViewProStore<any, any>);
12
+ private init;
13
+ private handleBeforeItemToggleExpansion;
14
+ private setItemLoading;
15
+ private setItemError;
16
+ buildPublicAPI: () => {
17
+ updateItemChildren: (itemId: TreeViewItemId | null) => Promise<void>;
18
+ };
19
+ /**
20
+ * Method used for fetching multiple items concurrently.
21
+ * Only relevant for lazy-loaded tree views.
22
+ *
23
+ * @param {TreeViewItemId[]} parentIds The ids of the items to fetch the children of.
24
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
25
+ */
26
+ fetchItems: (parentIds: TreeViewItemId[]) => Promise<void>;
27
+ /**
28
+ * Method used for updating an item's children.
29
+ * Only relevant for lazy-loaded tree views.
30
+ *
31
+ * @param {TreeViewItemId | null} itemId The id of the item to update the children of. If null is passed, it will update the root's children.
32
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
33
+ */
34
+ updateItemChildren: (itemId: TreeViewItemId | null) => Promise<void>;
35
+ /**
36
+ * Method used for fetching an item's children.
37
+ * Only relevant for lazy-loaded tree views.
38
+ *
39
+ * @param {object} parameters The parameters of the method.
40
+ * @param {TreeViewItemId} parameters.itemId The The id of the item to fetch the children of.
41
+ * @param {boolean} [parameters.forceRefresh] Whether to force a refresh of the children when the cache already contains some data.
42
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
43
+ */
44
+ fetchItemChildren: ({
45
+ itemId,
46
+ forceRefresh
47
+ }: {
48
+ itemId: TreeViewItemId | null;
49
+ forceRefresh?: boolean;
50
+ }) => Promise<void>;
51
+ }
@@ -0,0 +1,230 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { itemsSelectors, lazyLoadingSelectors, TREE_VIEW_ROOT_PARENT_ID, expansionSelectors, selectionSelectors } from '@mui/x-tree-view/internals';
3
+ import { DataSourceCacheDefault } from '@mui/x-tree-view/utils';
4
+ import { NestedDataManager } from "./utils.js";
5
+ export const TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE = {
6
+ loading: {},
7
+ errors: {}
8
+ };
9
+ export class TreeViewLazyLoadingPlugin {
10
+ nestedDataManager = (() => new NestedDataManager(this))();
11
+ constructor(store) {
12
+ this.store = store;
13
+ this.cache = store.parameters.dataSourceCache ?? new DataSourceCacheDefault({});
14
+ if (store.parameters.dataSource != null) {
15
+ this.init();
16
+ store.subscribeEvent('beforeItemToggleExpansion', this.handleBeforeItemToggleExpansion);
17
+ }
18
+ }
19
+ init = () => {
20
+ const store = this.store;
21
+ // eslint-disable-next-line consistent-this
22
+ const plugin = this;
23
+ const fetchAllExpandedItems = async () => {
24
+ async function fetchChildrenIfExpanded(parentIds) {
25
+ const expandedItems = parentIds.filter(id => expansionSelectors.isItemExpanded(store.state, id));
26
+ if (expandedItems.length > 0) {
27
+ const itemsToLazyLoad = expandedItems.filter(id => itemsSelectors.itemOrderedChildrenIds(store.state, id).length === 0);
28
+ if (itemsToLazyLoad.length > 0) {
29
+ await plugin.fetchItems(itemsToLazyLoad);
30
+ }
31
+ const childrenIds = expandedItems.flatMap(id => itemsSelectors.itemOrderedChildrenIds(store.state, id));
32
+ await fetchChildrenIfExpanded(childrenIds);
33
+ }
34
+ }
35
+ if (store.parameters.items.length) {
36
+ const newlyExpandableItems = getExpandableItemsFromDataSource(store, store.parameters.dataSource);
37
+ if (newlyExpandableItems.length > 0) {
38
+ store.expansion.addExpandableItems(newlyExpandableItems);
39
+ }
40
+ } else {
41
+ await plugin.fetchItemChildren({
42
+ itemId: null
43
+ });
44
+ }
45
+ await fetchChildrenIfExpanded(itemsSelectors.itemOrderedChildrenIds(store.state, null));
46
+ };
47
+ fetchAllExpandedItems();
48
+ };
49
+ handleBeforeItemToggleExpansion = async (eventParameters, event) => {
50
+ if (!this.store.parameters.dataSource || !eventParameters.shouldBeExpanded) {
51
+ return;
52
+ }
53
+
54
+ // prevent the default expansion behavior
55
+ eventParameters.isExpansionPrevented = true;
56
+ await this.fetchItems([eventParameters.itemId]);
57
+ const hasError = lazyLoadingSelectors.itemHasError(this.store.state, eventParameters.itemId);
58
+ if (!hasError) {
59
+ this.store.expansion.applyItemExpansion({
60
+ itemId: eventParameters.itemId,
61
+ shouldBeExpanded: true,
62
+ event
63
+ });
64
+ if (selectionSelectors.isItemSelected(this.store.state, eventParameters.itemId)) {
65
+ // make sure selection propagation works correctly
66
+ this.store.selection.setItemSelection({
67
+ event,
68
+ itemId: eventParameters.itemId,
69
+ keepExistingSelection: true,
70
+ shouldBeSelected: true
71
+ });
72
+ }
73
+ }
74
+ };
75
+ setItemLoading = (itemId, isLoading) => {
76
+ if (!this.store.parameters.dataSource || !this.store.state.lazyLoadedItems) {
77
+ return;
78
+ }
79
+ if (lazyLoadingSelectors.isItemLoading(this.store.state, itemId) === isLoading) {
80
+ return;
81
+ }
82
+ const itemIdWithDefault = itemId ?? TREE_VIEW_ROOT_PARENT_ID;
83
+ const loading = _extends({}, this.store.state.lazyLoadedItems.loading);
84
+ if (isLoading === false) {
85
+ delete loading[itemIdWithDefault];
86
+ } else {
87
+ loading[itemIdWithDefault] = isLoading;
88
+ }
89
+ this.store.set('lazyLoadedItems', _extends({}, this.store.state.lazyLoadedItems, {
90
+ loading
91
+ }));
92
+ };
93
+ setItemError = (itemId, error) => {
94
+ if (!this.store.parameters.dataSource || !this.store.state.lazyLoadedItems) {
95
+ return;
96
+ }
97
+ if (lazyLoadingSelectors.itemError(this.store.state, itemId) === error) {
98
+ return;
99
+ }
100
+ const itemIdWithDefault = itemId ?? TREE_VIEW_ROOT_PARENT_ID;
101
+ const errors = _extends({}, this.store.state.lazyLoadedItems.errors);
102
+ if (error === null && errors[itemIdWithDefault] !== undefined) {
103
+ delete errors[itemIdWithDefault];
104
+ } else {
105
+ errors[itemIdWithDefault] = error;
106
+ }
107
+ this.store.set('lazyLoadedItems', _extends({}, this.store.state.lazyLoadedItems, {
108
+ errors
109
+ }));
110
+ };
111
+ buildPublicAPI = () => {
112
+ return {
113
+ updateItemChildren: this.updateItemChildren
114
+ };
115
+ };
116
+
117
+ /**
118
+ * Method used for fetching multiple items concurrently.
119
+ * Only relevant for lazy-loaded tree views.
120
+ *
121
+ * @param {TreeViewItemId[]} parentIds The ids of the items to fetch the children of.
122
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
123
+ */
124
+ fetchItems = parentIds => this.nestedDataManager.queue(parentIds);
125
+
126
+ /**
127
+ * Method used for updating an item's children.
128
+ * Only relevant for lazy-loaded tree views.
129
+ *
130
+ * @param {TreeViewItemId | null} itemId The id of the item to update the children of. If null is passed, it will update the root's children.
131
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
132
+ */
133
+ updateItemChildren = itemId => this.fetchItemChildren({
134
+ itemId,
135
+ forceRefresh: true
136
+ });
137
+
138
+ /**
139
+ * Method used for fetching an item's children.
140
+ * Only relevant for lazy-loaded tree views.
141
+ *
142
+ * @param {object} parameters The parameters of the method.
143
+ * @param {TreeViewItemId} parameters.itemId The The id of the item to fetch the children of.
144
+ * @param {boolean} [parameters.forceRefresh] Whether to force a refresh of the children when the cache already contains some data.
145
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
146
+ */
147
+ fetchItemChildren = async ({
148
+ itemId,
149
+ forceRefresh
150
+ }) => {
151
+ if (!this.store.parameters.dataSource) {
152
+ return;
153
+ }
154
+ const {
155
+ getChildrenCount,
156
+ getTreeItems
157
+ } = this.store.parameters.dataSource;
158
+ // clear the request if the item is not in the tree
159
+ if (itemId != null && !itemsSelectors.itemMeta(this.store.state, itemId)) {
160
+ this.nestedDataManager.clearPendingRequest(itemId);
161
+ return;
162
+ }
163
+
164
+ // reset the state if we are fetching the root items
165
+ if (itemId == null && !lazyLoadingSelectors.isEmpty(this.store.state)) {
166
+ this.store.set('lazyLoadedItems', TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE);
167
+ }
168
+ const cacheKey = itemId ?? TREE_VIEW_ROOT_PARENT_ID;
169
+ if (!forceRefresh) {
170
+ // reads from the value from the cache
171
+ const cachedData = this.cache.get(cacheKey);
172
+ if (cachedData !== undefined && cachedData !== -1) {
173
+ if (itemId != null) {
174
+ this.nestedDataManager.setRequestSettled(itemId);
175
+ }
176
+ this.store.items.setItemChildren({
177
+ items: cachedData,
178
+ parentId: itemId,
179
+ getChildrenCount
180
+ });
181
+ this.setItemLoading(itemId, false);
182
+ return;
183
+ }
184
+
185
+ // set the item loading status to true
186
+ this.setItemLoading(itemId, true);
187
+ if (cachedData === -1) {
188
+ this.store.items.removeChildren(itemId);
189
+ }
190
+ }
191
+
192
+ // reset existing error if any
193
+ if (lazyLoadingSelectors.itemError(this.store.state, itemId)) {
194
+ this.setItemError(itemId, null);
195
+ }
196
+ try {
197
+ let response;
198
+ if (itemId == null) {
199
+ response = await getTreeItems();
200
+ } else {
201
+ response = await getTreeItems(itemId);
202
+ this.nestedDataManager.setRequestSettled(itemId);
203
+ }
204
+ // save the response in the cache
205
+ this.cache.set(cacheKey, response);
206
+ // update the items in the state
207
+ this.store.items.setItemChildren({
208
+ items: response,
209
+ parentId: itemId,
210
+ getChildrenCount
211
+ });
212
+ } catch (error) {
213
+ const childrenFetchError = error;
214
+ // set the item error in the state
215
+ this.setItemError(itemId, childrenFetchError);
216
+ if (forceRefresh) {
217
+ this.store.items.removeChildren(itemId);
218
+ }
219
+ } finally {
220
+ // set the item loading status to false
221
+ this.setItemLoading(itemId, false);
222
+ if (itemId != null) {
223
+ this.nestedDataManager.setRequestSettled(itemId);
224
+ }
225
+ }
226
+ };
227
+ }
228
+ function getExpandableItemsFromDataSource(store, dataSource) {
229
+ return Object.values(store.state.itemMetaLookup).filter(itemMeta => !itemMeta.expandable && dataSource.getChildrenCount(store.state.itemModelLookup[itemMeta.id]) !== 0).map(item => item.id);
230
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./TreeViewLazyLoadingPlugin.js";
2
+ export * from "./types.js";
@@ -0,0 +1,2 @@
1
+ export * from "./TreeViewLazyLoadingPlugin.js";
2
+ export * from "./types.js";
@@ -0,0 +1,21 @@
1
+ import { TreeViewItemId } from '@mui/x-tree-view/models';
2
+ export type DataSource<R extends {}> = {
3
+ /**
4
+ * Used to determine the number of children the item has.
5
+ * Only relevant for lazy-loaded trees.
6
+ *
7
+ * @template R
8
+ * @param {R} item The item to check.
9
+ * @returns {number} The number of children.
10
+ */
11
+ getChildrenCount: (item: R) => number;
12
+ /**
13
+ * Method used for fetching the items.
14
+ * Only relevant for lazy-loaded tree views.
15
+ *
16
+ * @template R
17
+ * @param {TreeViewItemId} parentId The id of the item the children belong to.
18
+ * @returns { Promise<R[]>} The children of the item.
19
+ */
20
+ getTreeItems: (parentId?: TreeViewItemId) => Promise<R[]>;
21
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,15 +1,11 @@
1
- import { TreeViewInstance, UseTreeViewLazyLoadingSignature } from '@mui/x-tree-view/internals';
2
1
  import { TreeViewItemId } from '@mui/x-tree-view/models';
2
+ import { TreeViewLazyLoadingPlugin } from "./TreeViewLazyLoadingPlugin.js";
3
3
  export declare enum RequestStatus {
4
4
  QUEUED = 0,
5
5
  PENDING = 1,
6
6
  SETTLED = 2,
7
7
  UNKNOWN = 3,
8
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
9
  /**
14
10
  * Fetches row children from the server with option to limit the number of concurrent requests
15
11
  * Determines the status of a request based on the enum `RequestStatus`
@@ -19,9 +15,9 @@ export declare class NestedDataManager {
19
15
  private pendingRequests;
20
16
  private queuedRequests;
21
17
  private settledRequests;
22
- private instance;
18
+ private lazyLoadingPlugin;
23
19
  private maxConcurrentRequests;
24
- constructor(instance: TreeViewInstance<[UseTreeViewLazyLoadingSignature]>, maxConcurrentRequests?: number);
20
+ constructor(lazyLoadingPlugin: TreeViewLazyLoadingPlugin, maxConcurrentRequests?: number);
25
21
  private processQueue;
26
22
  queue: (ids: TreeViewItemId[]) => Promise<void>;
27
23
  setRequestSettled: (id: TreeViewItemId) => Promise<void>;
@@ -7,14 +7,6 @@ export let RequestStatus = /*#__PURE__*/function (RequestStatus) {
7
7
  return RequestStatus;
8
8
  }({});
9
9
 
10
- /**
11
- * Plugins that need to be present in the Tree View in order for the `NestedDataManager` class to work correctly.
12
- */
13
-
14
- /**
15
- * Plugins that the `NestedDataManager` class can use if they are present, but are not required.
16
- */
17
-
18
10
  /**
19
11
  * Fetches row children from the server with option to limit the number of concurrent requests
20
12
  * Determines the status of a request based on the enum `RequestStatus`
@@ -24,8 +16,8 @@ export class NestedDataManager {
24
16
  pendingRequests = (() => new Set())();
25
17
  queuedRequests = (() => new Set())();
26
18
  settledRequests = (() => new Set())();
27
- constructor(instance, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
28
- this.instance = instance;
19
+ constructor(lazyLoadingPlugin, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
20
+ this.lazyLoadingPlugin = lazyLoadingPlugin;
29
21
  this.maxConcurrentRequests = maxConcurrentRequests;
30
22
  }
31
23
  processQueue = async () => {
@@ -42,7 +34,7 @@ export class NestedDataManager {
42
34
  const id = fetchQueue[i];
43
35
  this.queuedRequests.delete(id);
44
36
  this.pendingRequests.add(id);
45
- fetchPromises.push(this.instance.fetchItemChildren({
37
+ fetchPromises.push(this.lazyLoadingPlugin.fetchItemChildren({
46
38
  itemId: id
47
39
  }));
48
40
  }
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { TreeViewPublicAPI } from '@mui/x-tree-view/internals';
3
3
  import { TreeViewDefaultItemModelProperties, TreeViewValidItem } from '@mui/x-tree-view/models';
4
- import { RichTreeViewProPluginSignatures } from "../RichTreeViewPro/index.js";
4
+ import { RichTreeViewProStore } from "../internals/RichTreeViewProStore/index.js";
5
5
  /**
6
6
  * Creates the ref to pass to the `apiRef` prop of the `RichTreeViewPro` component.
7
7
  */
8
- export declare function useRichTreeViewProApiRef<R extends TreeViewValidItem<R> = TreeViewDefaultItemModelProperties>(): React.RefObject<TreeViewPublicAPI<RichTreeViewProPluginSignatures> | undefined>;
8
+ export declare function useRichTreeViewProApiRef<R extends TreeViewValidItem<R> = TreeViewDefaultItemModelProperties>(): React.RefObject<TreeViewPublicAPI<RichTreeViewProStore<R, boolean>> | undefined>;
package/index.d.ts CHANGED
@@ -6,7 +6,6 @@ export * from '@mui/x-tree-view/TreeItemIcon';
6
6
  export * from '@mui/x-tree-view/TreeItemProvider';
7
7
  export * from '@mui/x-tree-view/TreeItemDragAndDropOverlay';
8
8
  export * from '@mui/x-tree-view/TreeItemLabelInput';
9
- export { unstable_resetCleanupTracking } from '@mui/x-tree-view/internals';
10
9
  export * from '@mui/x-tree-view/models';
11
10
  export * from '@mui/x-tree-view/icons';
12
11
  export * from '@mui/x-tree-view/hooks';
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view-pro v8.23.0
2
+ * @mui/x-tree-view-pro v8.24.0
3
3
  *
4
4
  * @license SEE LICENSE IN LICENSE
5
5
  * This source code is licensed under the SEE LICENSE IN LICENSE license found in the
@@ -10,19 +10,9 @@
10
10
  Object.defineProperty(exports, "__esModule", {
11
11
  value: true
12
12
  });
13
- var _exportNames = {
14
- unstable_resetCleanupTracking: true
15
- };
16
- Object.defineProperty(exports, "unstable_resetCleanupTracking", {
17
- enumerable: true,
18
- get: function () {
19
- return _internals.unstable_resetCleanupTracking;
20
- }
21
- });
22
13
  var _SimpleTreeView = require("@mui/x-tree-view/SimpleTreeView");
23
14
  Object.keys(_SimpleTreeView).forEach(function (key) {
24
15
  if (key === "default" || key === "__esModule") return;
25
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
26
16
  if (key in exports && exports[key] === _SimpleTreeView[key]) return;
27
17
  Object.defineProperty(exports, key, {
28
18
  enumerable: true,
@@ -34,7 +24,6 @@ Object.keys(_SimpleTreeView).forEach(function (key) {
34
24
  var _RichTreeViewPro = require("./RichTreeViewPro");
35
25
  Object.keys(_RichTreeViewPro).forEach(function (key) {
36
26
  if (key === "default" || key === "__esModule") return;
37
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
38
27
  if (key in exports && exports[key] === _RichTreeViewPro[key]) return;
39
28
  Object.defineProperty(exports, key, {
40
29
  enumerable: true,
@@ -46,7 +35,6 @@ Object.keys(_RichTreeViewPro).forEach(function (key) {
46
35
  var _TreeItem = require("@mui/x-tree-view/TreeItem");
47
36
  Object.keys(_TreeItem).forEach(function (key) {
48
37
  if (key === "default" || key === "__esModule") return;
49
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
50
38
  if (key in exports && exports[key] === _TreeItem[key]) return;
51
39
  Object.defineProperty(exports, key, {
52
40
  enumerable: true,
@@ -58,7 +46,6 @@ Object.keys(_TreeItem).forEach(function (key) {
58
46
  var _useTreeItem = require("@mui/x-tree-view/useTreeItem");
59
47
  Object.keys(_useTreeItem).forEach(function (key) {
60
48
  if (key === "default" || key === "__esModule") return;
61
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
62
49
  if (key in exports && exports[key] === _useTreeItem[key]) return;
63
50
  Object.defineProperty(exports, key, {
64
51
  enumerable: true,
@@ -70,7 +57,6 @@ Object.keys(_useTreeItem).forEach(function (key) {
70
57
  var _TreeItemIcon = require("@mui/x-tree-view/TreeItemIcon");
71
58
  Object.keys(_TreeItemIcon).forEach(function (key) {
72
59
  if (key === "default" || key === "__esModule") return;
73
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
74
60
  if (key in exports && exports[key] === _TreeItemIcon[key]) return;
75
61
  Object.defineProperty(exports, key, {
76
62
  enumerable: true,
@@ -82,7 +68,6 @@ Object.keys(_TreeItemIcon).forEach(function (key) {
82
68
  var _TreeItemProvider = require("@mui/x-tree-view/TreeItemProvider");
83
69
  Object.keys(_TreeItemProvider).forEach(function (key) {
84
70
  if (key === "default" || key === "__esModule") return;
85
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
86
71
  if (key in exports && exports[key] === _TreeItemProvider[key]) return;
87
72
  Object.defineProperty(exports, key, {
88
73
  enumerable: true,
@@ -94,7 +79,6 @@ Object.keys(_TreeItemProvider).forEach(function (key) {
94
79
  var _TreeItemDragAndDropOverlay = require("@mui/x-tree-view/TreeItemDragAndDropOverlay");
95
80
  Object.keys(_TreeItemDragAndDropOverlay).forEach(function (key) {
96
81
  if (key === "default" || key === "__esModule") return;
97
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
98
82
  if (key in exports && exports[key] === _TreeItemDragAndDropOverlay[key]) return;
99
83
  Object.defineProperty(exports, key, {
100
84
  enumerable: true,
@@ -106,7 +90,6 @@ Object.keys(_TreeItemDragAndDropOverlay).forEach(function (key) {
106
90
  var _TreeItemLabelInput = require("@mui/x-tree-view/TreeItemLabelInput");
107
91
  Object.keys(_TreeItemLabelInput).forEach(function (key) {
108
92
  if (key === "default" || key === "__esModule") return;
109
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
110
93
  if (key in exports && exports[key] === _TreeItemLabelInput[key]) return;
111
94
  Object.defineProperty(exports, key, {
112
95
  enumerable: true,
@@ -115,11 +98,9 @@ Object.keys(_TreeItemLabelInput).forEach(function (key) {
115
98
  }
116
99
  });
117
100
  });
118
- var _internals = require("@mui/x-tree-view/internals");
119
101
  var _models = require("@mui/x-tree-view/models");
120
102
  Object.keys(_models).forEach(function (key) {
121
103
  if (key === "default" || key === "__esModule") return;
122
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
123
104
  if (key in exports && exports[key] === _models[key]) return;
124
105
  Object.defineProperty(exports, key, {
125
106
  enumerable: true,
@@ -131,7 +112,6 @@ Object.keys(_models).forEach(function (key) {
131
112
  var _icons = require("@mui/x-tree-view/icons");
132
113
  Object.keys(_icons).forEach(function (key) {
133
114
  if (key === "default" || key === "__esModule") return;
134
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
135
115
  if (key in exports && exports[key] === _icons[key]) return;
136
116
  Object.defineProperty(exports, key, {
137
117
  enumerable: true,
@@ -143,7 +123,6 @@ Object.keys(_icons).forEach(function (key) {
143
123
  var _hooks = require("@mui/x-tree-view/hooks");
144
124
  Object.keys(_hooks).forEach(function (key) {
145
125
  if (key === "default" || key === "__esModule") return;
146
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
147
126
  if (key in exports && exports[key] === _hooks[key]) return;
148
127
  Object.defineProperty(exports, key, {
149
128
  enumerable: true,
@@ -155,7 +134,6 @@ Object.keys(_hooks).forEach(function (key) {
155
134
  var _hooks2 = require("./hooks");
156
135
  Object.keys(_hooks2).forEach(function (key) {
157
136
  if (key === "default" || key === "__esModule") return;
158
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
159
137
  if (key in exports && exports[key] === _hooks2[key]) return;
160
138
  Object.defineProperty(exports, key, {
161
139
  enumerable: true,
@@ -0,0 +1,49 @@
1
+ import { ExtendableRichTreeViewStore } from '@mui/x-tree-view/internals';
2
+ import { TreeViewValidItem } from '@mui/x-tree-view/models';
3
+ import { RichTreeViewProStoreParameters, RichTreeViewProState } from "./RichTreeViewProStore.types.js";
4
+ import { TreeViewLazyLoadingPlugin } from "../plugins/lazyLoading/index.js";
5
+ import { TreeViewItemsReorderingPlugin } from "../plugins/itemsReordering/index.js";
6
+ export declare class RichTreeViewProStore<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined> extends ExtendableRichTreeViewStore<R, Multiple, RichTreeViewProState<R, Multiple>, RichTreeViewProStoreParameters<R, Multiple>> {
7
+ lazyLoading: TreeViewLazyLoadingPlugin;
8
+ itemsReordering: TreeViewItemsReorderingPlugin;
9
+ constructor(parameters: RichTreeViewProStoreParameters<R, Multiple>);
10
+ buildPublicAPI(): {
11
+ updateItemChildren: (itemId: import("@mui/x-tree-view").TreeViewItemId | null) => Promise<void>;
12
+ setEditedItem: (itemId: import("@mui/x-tree-view").TreeViewItemId | null) => void;
13
+ updateItemLabel: (itemId: import("@mui/x-tree-view").TreeViewItemId, label: string) => void;
14
+ setItemSelection: ({
15
+ itemId,
16
+ event,
17
+ keepExistingSelection,
18
+ shouldBeSelected
19
+ }: {
20
+ itemId: string;
21
+ event?: React.SyntheticEvent | null;
22
+ shouldBeSelected?: boolean;
23
+ keepExistingSelection?: boolean;
24
+ }) => void;
25
+ isItemExpanded: (itemId: import("@mui/x-tree-view").TreeViewItemId) => boolean;
26
+ setItemExpansion: ({
27
+ itemId,
28
+ event,
29
+ shouldBeExpanded
30
+ }: {
31
+ itemId: import("@mui/x-tree-view").TreeViewItemId;
32
+ event?: React.SyntheticEvent | null;
33
+ shouldBeExpanded?: boolean;
34
+ }) => void;
35
+ focusItem: (event: React.SyntheticEvent | null, itemId: import("@mui/x-tree-view").TreeViewItemId) => void;
36
+ getItem: (itemId: import("@mui/x-tree-view").TreeViewItemId) => R;
37
+ getItemDOMElement: (itemId: import("@mui/x-tree-view").TreeViewItemId) => HTMLElement | null;
38
+ getItemOrderedChildrenIds: (itemId: import("@mui/x-tree-view").TreeViewItemId | null) => import("@mui/x-tree-view").TreeViewItemId[];
39
+ getItemTree: () => R[];
40
+ getParentId: (itemId: import("@mui/x-tree-view").TreeViewItemId) => import("@mui/x-tree-view").TreeViewItemId | null;
41
+ setIsItemDisabled: ({
42
+ itemId,
43
+ shouldBeDisabled
44
+ }: {
45
+ itemId: import("@mui/x-tree-view").TreeViewItemId;
46
+ shouldBeDisabled?: boolean;
47
+ }) => void;
48
+ };
49
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.RichTreeViewProStore = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _internals = require("@mui/x-tree-view/internals");
10
+ var _lazyLoading = require("../plugins/lazyLoading");
11
+ var _itemsReordering = require("../plugins/itemsReordering");
12
+ var _RichTreeViewProStore = require("./RichTreeViewProStore.utils");
13
+ class RichTreeViewProStore extends _internals.ExtendableRichTreeViewStore {
14
+ itemsReordering = new _itemsReordering.TreeViewItemsReorderingPlugin(this);
15
+ constructor(parameters) {
16
+ super(parameters, 'RichTreeViewPro', _RichTreeViewProStore.parametersToStateMapper);
17
+ this.lazyLoading = new _lazyLoading.TreeViewLazyLoadingPlugin(this);
18
+ }
19
+ buildPublicAPI() {
20
+ return (0, _extends2.default)({}, super.buildPublicAPI(), this.lazyLoading.buildPublicAPI());
21
+ }
22
+ }
23
+ exports.RichTreeViewProStore = RichTreeViewProStore;