@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,238 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.TreeViewLazyLoadingPlugin = exports.TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _internals = require("@mui/x-tree-view/internals");
10
+ var _utils = require("@mui/x-tree-view/utils");
11
+ var _utils2 = require("./utils");
12
+ const TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE = exports.TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE = {
13
+ loading: {},
14
+ errors: {}
15
+ };
16
+ class TreeViewLazyLoadingPlugin {
17
+ nestedDataManager = new _utils2.NestedDataManager(this);
18
+ constructor(store) {
19
+ this.store = store;
20
+ this.cache = store.parameters.dataSourceCache ?? new _utils.DataSourceCacheDefault({});
21
+ if (store.parameters.dataSource != null) {
22
+ this.init();
23
+ store.subscribeEvent('beforeItemToggleExpansion', this.handleBeforeItemToggleExpansion);
24
+ }
25
+ }
26
+ init = () => {
27
+ const store = this.store;
28
+ // eslint-disable-next-line consistent-this
29
+ const plugin = this;
30
+ const fetchAllExpandedItems = async () => {
31
+ async function fetchChildrenIfExpanded(parentIds) {
32
+ const expandedItems = parentIds.filter(id => _internals.expansionSelectors.isItemExpanded(store.state, id));
33
+ if (expandedItems.length > 0) {
34
+ const itemsToLazyLoad = expandedItems.filter(id => _internals.itemsSelectors.itemOrderedChildrenIds(store.state, id).length === 0);
35
+ if (itemsToLazyLoad.length > 0) {
36
+ await plugin.fetchItems(itemsToLazyLoad);
37
+ }
38
+ const childrenIds = expandedItems.flatMap(id => _internals.itemsSelectors.itemOrderedChildrenIds(store.state, id));
39
+ await fetchChildrenIfExpanded(childrenIds);
40
+ }
41
+ }
42
+ if (store.parameters.items.length) {
43
+ const newlyExpandableItems = getExpandableItemsFromDataSource(store, store.parameters.dataSource);
44
+ if (newlyExpandableItems.length > 0) {
45
+ store.expansion.addExpandableItems(newlyExpandableItems);
46
+ }
47
+ } else {
48
+ await plugin.fetchItemChildren({
49
+ itemId: null
50
+ });
51
+ }
52
+ await fetchChildrenIfExpanded(_internals.itemsSelectors.itemOrderedChildrenIds(store.state, null));
53
+ };
54
+ fetchAllExpandedItems();
55
+ };
56
+ handleBeforeItemToggleExpansion = async (eventParameters, event) => {
57
+ if (!this.store.parameters.dataSource || !eventParameters.shouldBeExpanded) {
58
+ return;
59
+ }
60
+
61
+ // prevent the default expansion behavior
62
+ eventParameters.isExpansionPrevented = true;
63
+ await this.fetchItems([eventParameters.itemId]);
64
+ const hasError = _internals.lazyLoadingSelectors.itemHasError(this.store.state, eventParameters.itemId);
65
+ if (!hasError) {
66
+ this.store.expansion.applyItemExpansion({
67
+ itemId: eventParameters.itemId,
68
+ shouldBeExpanded: true,
69
+ event
70
+ });
71
+ if (_internals.selectionSelectors.isItemSelected(this.store.state, eventParameters.itemId)) {
72
+ // make sure selection propagation works correctly
73
+ this.store.selection.setItemSelection({
74
+ event,
75
+ itemId: eventParameters.itemId,
76
+ keepExistingSelection: true,
77
+ shouldBeSelected: true
78
+ });
79
+ }
80
+ }
81
+ };
82
+ setItemLoading = (itemId, isLoading) => {
83
+ if (!this.store.parameters.dataSource || !this.store.state.lazyLoadedItems) {
84
+ return;
85
+ }
86
+ if (_internals.lazyLoadingSelectors.isItemLoading(this.store.state, itemId) === isLoading) {
87
+ return;
88
+ }
89
+ const itemIdWithDefault = itemId ?? _internals.TREE_VIEW_ROOT_PARENT_ID;
90
+ const loading = (0, _extends2.default)({}, this.store.state.lazyLoadedItems.loading);
91
+ if (isLoading === false) {
92
+ delete loading[itemIdWithDefault];
93
+ } else {
94
+ loading[itemIdWithDefault] = isLoading;
95
+ }
96
+ this.store.set('lazyLoadedItems', (0, _extends2.default)({}, this.store.state.lazyLoadedItems, {
97
+ loading
98
+ }));
99
+ };
100
+ setItemError = (itemId, error) => {
101
+ if (!this.store.parameters.dataSource || !this.store.state.lazyLoadedItems) {
102
+ return;
103
+ }
104
+ if (_internals.lazyLoadingSelectors.itemError(this.store.state, itemId) === error) {
105
+ return;
106
+ }
107
+ const itemIdWithDefault = itemId ?? _internals.TREE_VIEW_ROOT_PARENT_ID;
108
+ const errors = (0, _extends2.default)({}, this.store.state.lazyLoadedItems.errors);
109
+ if (error === null && errors[itemIdWithDefault] !== undefined) {
110
+ delete errors[itemIdWithDefault];
111
+ } else {
112
+ errors[itemIdWithDefault] = error;
113
+ }
114
+ this.store.set('lazyLoadedItems', (0, _extends2.default)({}, this.store.state.lazyLoadedItems, {
115
+ errors
116
+ }));
117
+ };
118
+ buildPublicAPI = () => {
119
+ return {
120
+ updateItemChildren: this.updateItemChildren
121
+ };
122
+ };
123
+
124
+ /**
125
+ * Method used for fetching multiple items concurrently.
126
+ * Only relevant for lazy-loaded tree views.
127
+ *
128
+ * @param {TreeViewItemId[]} parentIds The ids of the items to fetch the children of.
129
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
130
+ */
131
+ fetchItems = parentIds => this.nestedDataManager.queue(parentIds);
132
+
133
+ /**
134
+ * Method used for updating an item's children.
135
+ * Only relevant for lazy-loaded tree views.
136
+ *
137
+ * @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.
138
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
139
+ */
140
+ updateItemChildren = itemId => this.fetchItemChildren({
141
+ itemId,
142
+ forceRefresh: true
143
+ });
144
+
145
+ /**
146
+ * Method used for fetching an item's children.
147
+ * Only relevant for lazy-loaded tree views.
148
+ *
149
+ * @param {object} parameters The parameters of the method.
150
+ * @param {TreeViewItemId} parameters.itemId The The id of the item to fetch the children of.
151
+ * @param {boolean} [parameters.forceRefresh] Whether to force a refresh of the children when the cache already contains some data.
152
+ * @returns {Promise<void>} The promise resolved when the items are fetched.
153
+ */
154
+ fetchItemChildren = async ({
155
+ itemId,
156
+ forceRefresh
157
+ }) => {
158
+ if (!this.store.parameters.dataSource) {
159
+ return;
160
+ }
161
+ const {
162
+ getChildrenCount,
163
+ getTreeItems
164
+ } = this.store.parameters.dataSource;
165
+ // clear the request if the item is not in the tree
166
+ if (itemId != null && !_internals.itemsSelectors.itemMeta(this.store.state, itemId)) {
167
+ this.nestedDataManager.clearPendingRequest(itemId);
168
+ return;
169
+ }
170
+
171
+ // reset the state if we are fetching the root items
172
+ if (itemId == null && !_internals.lazyLoadingSelectors.isEmpty(this.store.state)) {
173
+ this.store.set('lazyLoadedItems', TREE_VIEW_LAZY_LOADED_ITEMS_INITIAL_STATE);
174
+ }
175
+ const cacheKey = itemId ?? _internals.TREE_VIEW_ROOT_PARENT_ID;
176
+ if (!forceRefresh) {
177
+ // reads from the value from the cache
178
+ const cachedData = this.cache.get(cacheKey);
179
+ if (cachedData !== undefined && cachedData !== -1) {
180
+ if (itemId != null) {
181
+ this.nestedDataManager.setRequestSettled(itemId);
182
+ }
183
+ this.store.items.setItemChildren({
184
+ items: cachedData,
185
+ parentId: itemId,
186
+ getChildrenCount
187
+ });
188
+ this.setItemLoading(itemId, false);
189
+ return;
190
+ }
191
+
192
+ // set the item loading status to true
193
+ this.setItemLoading(itemId, true);
194
+ if (cachedData === -1) {
195
+ this.store.items.removeChildren(itemId);
196
+ }
197
+ }
198
+
199
+ // reset existing error if any
200
+ if (_internals.lazyLoadingSelectors.itemError(this.store.state, itemId)) {
201
+ this.setItemError(itemId, null);
202
+ }
203
+ try {
204
+ let response;
205
+ if (itemId == null) {
206
+ response = await getTreeItems();
207
+ } else {
208
+ response = await getTreeItems(itemId);
209
+ this.nestedDataManager.setRequestSettled(itemId);
210
+ }
211
+ // save the response in the cache
212
+ this.cache.set(cacheKey, response);
213
+ // update the items in the state
214
+ this.store.items.setItemChildren({
215
+ items: response,
216
+ parentId: itemId,
217
+ getChildrenCount
218
+ });
219
+ } catch (error) {
220
+ const childrenFetchError = error;
221
+ // set the item error in the state
222
+ this.setItemError(itemId, childrenFetchError);
223
+ if (forceRefresh) {
224
+ this.store.items.removeChildren(itemId);
225
+ }
226
+ } finally {
227
+ // set the item loading status to false
228
+ this.setItemLoading(itemId, false);
229
+ if (itemId != null) {
230
+ this.nestedDataManager.setRequestSettled(itemId);
231
+ }
232
+ }
233
+ };
234
+ }
235
+ exports.TreeViewLazyLoadingPlugin = TreeViewLazyLoadingPlugin;
236
+ function getExpandableItemsFromDataSource(store, dataSource) {
237
+ return Object.values(store.state.itemMetaLookup).filter(itemMeta => !itemMeta.expandable && dataSource.getChildrenCount(store.state.itemModelLookup[itemMeta.id]) !== 0).map(item => item.id);
238
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./TreeViewLazyLoadingPlugin.js";
2
+ export * from "./types.js";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _TreeViewLazyLoadingPlugin = require("./TreeViewLazyLoadingPlugin");
7
+ Object.keys(_TreeViewLazyLoadingPlugin).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _TreeViewLazyLoadingPlugin[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _TreeViewLazyLoadingPlugin[key];
14
+ }
15
+ });
16
+ });
17
+ var _types = require("./types");
18
+ Object.keys(_types).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _types[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _types[key];
25
+ }
26
+ });
27
+ });
@@ -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,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -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>;
@@ -12,12 +12,6 @@ let RequestStatus = exports.RequestStatus = /*#__PURE__*/function (RequestStatus
12
12
  RequestStatus[RequestStatus["UNKNOWN"] = 3] = "UNKNOWN";
13
13
  return RequestStatus;
14
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
15
  /**
22
16
  * Fetches row children from the server with option to limit the number of concurrent requests
23
17
  * Determines the status of a request based on the enum `RequestStatus`
@@ -27,8 +21,8 @@ class NestedDataManager {
27
21
  pendingRequests = new Set();
28
22
  queuedRequests = new Set();
29
23
  settledRequests = new Set();
30
- constructor(instance, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
31
- this.instance = instance;
24
+ constructor(lazyLoadingPlugin, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
25
+ this.lazyLoadingPlugin = lazyLoadingPlugin;
32
26
  this.maxConcurrentRequests = maxConcurrentRequests;
33
27
  }
34
28
  processQueue = async () => {
@@ -45,7 +39,7 @@ class NestedDataManager {
45
39
  const id = fetchQueue[i];
46
40
  this.queuedRequests.delete(id);
47
41
  this.pendingRequests.add(id);
48
- fetchPromises.push(this.instance.fetchItemChildren({
42
+ fetchPromises.push(this.lazyLoadingPlugin.fetchItemChildren({
49
43
  itemId: id
50
44
  }));
51
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view-pro",
3
- "version": "8.23.0",
3
+ "version": "8.24.0",
4
4
  "author": "MUI Team",
5
5
  "description": "The Pro plan edition of the MUI X Tree View components.",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -40,9 +40,9 @@
40
40
  "react-transition-group": "^4.4.5",
41
41
  "reselect": "^5.1.1",
42
42
  "use-sync-external-store": "^1.6.0",
43
- "@mui/x-internals": "8.23.0",
44
- "@mui/x-license": "8.23.0",
45
- "@mui/x-tree-view": "8.23.0"
43
+ "@mui/x-internals": "8.24.0",
44
+ "@mui/x-tree-view": "8.24.0",
45
+ "@mui/x-license": "8.24.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "@emotion/react": "^11.9.0",
@@ -1,5 +0,0 @@
1
- import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, ConvertPluginsIntoSignatures, TreeViewCorePluginParameters, UseTreeViewLabelParameters, UseTreeViewLazyLoadingParameters } from '@mui/x-tree-view/internals';
2
- import { UseTreeViewItemsReorderingParameters } from "../internals/plugins/useTreeViewItemsReordering/index.js";
3
- export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLazyLoadingSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals/index.js").UseTreeViewItemsReorderingSignature>];
4
- export type RichTreeViewProPluginSignatures = ConvertPluginsIntoSignatures<typeof RICH_TREE_VIEW_PRO_PLUGINS>;
5
- export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewLabelParameters<R>, UseTreeViewLazyLoadingParameters<R>, UseTreeViewItemsReorderingParameters {}
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.RICH_TREE_VIEW_PRO_PLUGINS = void 0;
7
- var _internals = require("@mui/x-tree-view/internals");
8
- var _useTreeViewItemsReordering = require("../internals/plugins/useTreeViewItemsReordering");
9
- var _useTreeViewLazyLoading = require("../internals/plugins/useTreeViewLazyLoading");
10
- const RICH_TREE_VIEW_PRO_PLUGINS = exports.RICH_TREE_VIEW_PRO_PLUGINS = [_internals.useTreeViewItems, _internals.useTreeViewExpansion, _internals.useTreeViewSelection, _internals.useTreeViewFocus, _internals.useTreeViewKeyboardNavigation, _internals.useTreeViewLabel, _useTreeViewLazyLoading.useTreeViewLazyLoading, _useTreeViewItemsReordering.useTreeViewItemsReordering];
11
-
12
- // We can't infer this type from the plugin, otherwise we would lose the generics.
@@ -1,5 +0,0 @@
1
- import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, ConvertPluginsIntoSignatures, TreeViewCorePluginParameters, UseTreeViewLabelParameters, UseTreeViewLazyLoadingParameters } from '@mui/x-tree-view/internals';
2
- import { UseTreeViewItemsReorderingParameters } from "../internals/plugins/useTreeViewItemsReordering/index.js";
3
- export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLazyLoadingSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals/index.js").UseTreeViewItemsReorderingSignature>];
4
- export type RichTreeViewProPluginSignatures = ConvertPluginsIntoSignatures<typeof RICH_TREE_VIEW_PRO_PLUGINS>;
5
- export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewLabelParameters<R>, UseTreeViewLazyLoadingParameters<R>, UseTreeViewItemsReorderingParameters {}
@@ -1,6 +0,0 @@
1
- import { useTreeViewItems, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewLabel } from '@mui/x-tree-view/internals';
2
- import { useTreeViewItemsReordering } from "../internals/plugins/useTreeViewItemsReordering/index.js";
3
- import { useTreeViewLazyLoading } from "../internals/plugins/useTreeViewLazyLoading/index.js";
4
- export const RICH_TREE_VIEW_PRO_PLUGINS = [useTreeViewItems, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewLabel, useTreeViewLazyLoading, useTreeViewItemsReordering];
5
-
6
- // We can't infer this type from the plugin, otherwise we would lose the generics.
@@ -1 +0,0 @@
1
- export type { UseTreeViewItemsReorderingSignature } from "./plugins/useTreeViewItemsReordering/index.js";
@@ -1,3 +0,0 @@
1
- export { useTreeViewItemsReordering } from "./useTreeViewItemsReordering.js";
2
- export type { UseTreeViewItemsReorderingSignature, UseTreeViewItemsReorderingParameters, UseTreeViewItemsReorderingParametersWithDefaults, TreeViewItemReorderPosition } from "./useTreeViewItemsReordering.types.js";
3
- export { itemsReorderingSelectors } from "./useTreeViewItemsReordering.selectors.js";
@@ -1,2 +0,0 @@
1
- export { useTreeViewItemsReordering } from "./useTreeViewItemsReordering.js";
2
- export { itemsReorderingSelectors } from "./useTreeViewItemsReordering.selectors.js";
@@ -1,3 +0,0 @@
1
- import { TreeViewPlugin } from '@mui/x-tree-view/internals';
2
- import { UseTreeViewItemsReorderingSignature } from "./useTreeViewItemsReordering.types.js";
3
- export declare const useTreeViewItemsReordering: TreeViewPlugin<UseTreeViewItemsReorderingSignature>;
@@ -1,196 +0,0 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
- import * as React from 'react';
3
- import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
4
- import { itemsSelectors, labelSelectors } from '@mui/x-tree-view/internals';
5
- import { chooseActionToApply, isAncestor, moveItemInTree } from "./useTreeViewItemsReordering.utils.js";
6
- import { useTreeViewItemsReorderingItemPlugin } from "./itemPlugin.js";
7
- import { itemsReorderingSelectors } from "./useTreeViewItemsReordering.selectors.js";
8
- export const useTreeViewItemsReordering = ({
9
- params,
10
- store
11
- }) => {
12
- const getDroppingTargetValidActions = React.useCallback(itemId => {
13
- const currentReorder = itemsReorderingSelectors.currentReorder(store.state);
14
- if (!currentReorder) {
15
- throw new Error('There is no ongoing reordering.');
16
- }
17
- if (itemId === currentReorder.draggedItemId) {
18
- return {};
19
- }
20
- const canMoveItemToNewPosition = params.canMoveItemToNewPosition;
21
- const targetItemMeta = itemsSelectors.itemMeta(store.state, itemId);
22
- const targetItemIndex = itemsSelectors.itemIndex(store.state, targetItemMeta.id);
23
- const draggedItemMeta = itemsSelectors.itemMeta(store.state, currentReorder.draggedItemId);
24
- const draggedItemIndex = itemsSelectors.itemIndex(store.state, draggedItemMeta.id);
25
- const isTargetLastSibling = targetItemIndex === itemsSelectors.itemOrderedChildrenIds(store.state, targetItemMeta.parentId).length - 1;
26
- const oldPosition = {
27
- parentId: draggedItemMeta.parentId,
28
- index: draggedItemIndex
29
- };
30
- const checkIfPositionIsValid = positionAfterAction => {
31
- let isValid;
32
- // If the new position is equal to the old one, we don't want to show any dropping UI.
33
- if (positionAfterAction.parentId === oldPosition.parentId && positionAfterAction.index === oldPosition.index) {
34
- isValid = false;
35
- } else if (canMoveItemToNewPosition) {
36
- isValid = canMoveItemToNewPosition({
37
- itemId: currentReorder.draggedItemId,
38
- oldPosition,
39
- newPosition: positionAfterAction
40
- });
41
- } else {
42
- isValid = true;
43
- }
44
- return isValid;
45
- };
46
- const positionsAfterAction = {
47
- 'make-child': {
48
- parentId: targetItemMeta.id,
49
- index: 0
50
- },
51
- 'reorder-above': {
52
- parentId: targetItemMeta.parentId,
53
- index: targetItemMeta.parentId === draggedItemMeta.parentId && targetItemIndex > draggedItemIndex ? targetItemIndex - 1 : targetItemIndex
54
- },
55
- 'reorder-below': !targetItemMeta.expandable || isTargetLastSibling ? {
56
- parentId: targetItemMeta.parentId,
57
- index: targetItemMeta.parentId === draggedItemMeta.parentId && targetItemIndex > draggedItemIndex ? targetItemIndex : targetItemIndex + 1
58
- } : null,
59
- 'move-to-parent': targetItemMeta.parentId == null ? null : {
60
- parentId: targetItemMeta.parentId,
61
- index: itemsSelectors.itemOrderedChildrenIds(store.state, targetItemMeta.parentId).length
62
- }
63
- };
64
- const validActions = {};
65
- Object.keys(positionsAfterAction).forEach(action => {
66
- const positionAfterAction = positionsAfterAction[action];
67
- if (positionAfterAction != null && checkIfPositionIsValid(positionAfterAction)) {
68
- validActions[action] = positionAfterAction;
69
- }
70
- });
71
- return validActions;
72
- }, [store, params.canMoveItemToNewPosition]);
73
- const startDraggingItem = React.useCallback(itemId => {
74
- const isItemBeingEdited = labelSelectors.isItemBeingEdited(store.state, itemId);
75
- if (isItemBeingEdited) {
76
- return;
77
- }
78
- store.set('itemsReordering', _extends({}, store.state.itemsReordering, {
79
- currentReorder: {
80
- targetItemId: itemId,
81
- draggedItemId: itemId,
82
- action: null,
83
- newPosition: null
84
- }
85
- }));
86
- }, [store]);
87
- const cancelDraggingItem = React.useCallback(() => {
88
- const currentReorder = itemsReorderingSelectors.currentReorder(store.state);
89
- if (currentReorder == null) {
90
- return;
91
- }
92
- store.set('itemsReordering', _extends({}, store.state.itemsReordering, {
93
- currentReorder: null
94
- }));
95
- }, [store]);
96
- const completeDraggingItem = React.useCallback(itemId => {
97
- const currentReorder = itemsReorderingSelectors.currentReorder(store.state);
98
- if (currentReorder == null || currentReorder.draggedItemId !== itemId) {
99
- return;
100
- }
101
- if (currentReorder.draggedItemId === currentReorder.targetItemId || currentReorder.action == null || currentReorder.newPosition == null) {
102
- store.set('itemsReordering', _extends({}, store.state.itemsReordering, {
103
- currentReorder: null
104
- }));
105
- return;
106
- }
107
- const draggedItemMeta = itemsSelectors.itemMeta(store.state, currentReorder.draggedItemId);
108
- const oldPosition = {
109
- parentId: draggedItemMeta.parentId,
110
- index: itemsSelectors.itemIndex(store.state, draggedItemMeta.id)
111
- };
112
- const newPosition = currentReorder.newPosition;
113
- store.update({
114
- itemsReordering: _extends({}, store.state.itemsReordering, {
115
- currentReorder: null
116
- }),
117
- items: moveItemInTree({
118
- itemToMoveId: itemId,
119
- newPosition,
120
- oldPosition,
121
- prevState: store.state.items
122
- })
123
- });
124
- const onItemPositionChange = params.onItemPositionChange;
125
- onItemPositionChange?.({
126
- itemId,
127
- newPosition,
128
- oldPosition
129
- });
130
- }, [store, params.onItemPositionChange]);
131
- const setDragTargetItem = React.useCallback(({
132
- itemId,
133
- validActions,
134
- targetHeight,
135
- cursorY,
136
- cursorX,
137
- contentElement
138
- }) => {
139
- const prevItemReorder = store.state.itemsReordering.currentReorder;
140
- if (prevItemReorder == null || isAncestor(store, itemId, prevItemReorder.draggedItemId)) {
141
- return;
142
- }
143
- const action = chooseActionToApply({
144
- itemChildrenIndentation: params.itemChildrenIndentation,
145
- validActions,
146
- targetHeight,
147
- targetDepth: store.state.items.itemMetaLookup[itemId].depth,
148
- cursorY,
149
- cursorX,
150
- contentElement
151
- });
152
- const newPosition = action == null ? null : validActions[action];
153
- if (prevItemReorder.targetItemId === itemId && prevItemReorder.action === action && prevItemReorder.newPosition?.parentId === newPosition?.parentId && prevItemReorder.newPosition?.index === newPosition?.index) {
154
- return;
155
- }
156
- store.set('itemsReordering', _extends({}, store.state.itemsReordering, {
157
- currentReorder: _extends({}, prevItemReorder, {
158
- targetItemId: itemId,
159
- newPosition,
160
- action
161
- })
162
- }));
163
- }, [store, params.itemChildrenIndentation]);
164
- useIsoLayoutEffect(() => {
165
- store.set('itemsReordering', _extends({}, store.state.itemsReordering, {
166
- isItemReorderable: params.itemsReordering ? params.isItemReorderable ?? (() => true) : () => false
167
- }));
168
- }, [store, params.itemsReordering, params.isItemReorderable]);
169
- return {
170
- instance: {
171
- getDroppingTargetValidActions,
172
- startDraggingItem,
173
- cancelDraggingItem,
174
- completeDraggingItem,
175
- setDragTargetItem
176
- }
177
- };
178
- };
179
- useTreeViewItemsReordering.itemPlugin = useTreeViewItemsReorderingItemPlugin;
180
- useTreeViewItemsReordering.applyDefaultValuesToParams = ({
181
- params
182
- }) => _extends({}, params, {
183
- itemsReordering: params.itemsReordering ?? false
184
- });
185
- useTreeViewItemsReordering.getInitialState = params => ({
186
- itemsReordering: {
187
- currentReorder: null,
188
- isItemReorderable: params.itemsReordering ? params.isItemReorderable ?? (() => true) : () => false
189
- }
190
- });
191
- useTreeViewItemsReordering.params = {
192
- itemsReordering: true,
193
- isItemReorderable: true,
194
- canMoveItemToNewPosition: true,
195
- onItemPositionChange: true
196
- };
@@ -1,30 +0,0 @@
1
- import { TreeViewState } from '@mui/x-tree-view/internals';
2
- import { TreeViewItemId } from '@mui/x-tree-view/models';
3
- import { UseTreeViewItemsReorderingSignature } from "./useTreeViewItemsReordering.types.js";
4
- export declare const itemsReorderingSelectors: {
5
- /**
6
- * Gets the properties of the current reordering.
7
- */
8
- currentReorder: (state: TreeViewState<[UseTreeViewItemsReorderingSignature]>) => {
9
- draggedItemId: TreeViewItemId;
10
- targetItemId: TreeViewItemId;
11
- newPosition: import("./useTreeViewItemsReordering.types.js").TreeViewItemReorderPosition | null;
12
- action: import("@mui/x-tree-view").TreeViewItemsReorderingAction | null;
13
- } | null;
14
- /**
15
- * Gets the properties of the dragged item.
16
- */
17
- draggedItemProperties: (args_0: import("@mui/x-tree-view/internals/corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("@mui/x-tree-view/internals").UseTreeViewItemsState<import("@mui/x-tree-view").TreeViewDefaultItemModelProperties> & Partial<{}>, itemId: string) => {
18
- newPosition: import("./useTreeViewItemsReordering.types.js").TreeViewItemReorderPosition | null;
19
- action: import("@mui/x-tree-view").TreeViewItemsReorderingAction;
20
- targetDepth: number;
21
- } | null;
22
- /**
23
- * Checks whether an item is being dragged.
24
- */
25
- isDragging: (state: TreeViewState<[UseTreeViewItemsReorderingSignature]>) => boolean;
26
- /**
27
- * Checks whether an item can be reordered.
28
- */
29
- canItemBeReordered: (args_0: import("@mui/x-tree-view/internals/corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewItemsReordering.types.js").UseTreeViewItemsReorderingState & Partial<{}>, itemId: string) => boolean;
30
- };