@mui/x-tree-view 8.0.0-alpha.13 → 8.0.0-alpha.14

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 (120) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/RichTreeView/RichTreeView.js +24 -5
  3. package/SimpleTreeView/SimpleTreeView.js +8 -6
  4. package/TreeItem/TreeItem.d.ts +2 -0
  5. package/TreeItem/TreeItem.js +46 -5
  6. package/TreeItem/TreeItem.types.d.ts +14 -0
  7. package/TreeItemIcon/TreeItemIcon.js +2 -0
  8. package/esm/RichTreeView/RichTreeView.js +24 -5
  9. package/esm/SimpleTreeView/SimpleTreeView.js +8 -6
  10. package/esm/TreeItem/TreeItem.d.ts +2 -0
  11. package/esm/TreeItem/TreeItem.js +45 -4
  12. package/esm/TreeItem/TreeItem.types.d.ts +14 -0
  13. package/esm/TreeItemIcon/TreeItemIcon.js +2 -0
  14. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
  15. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +21 -9
  16. package/esm/hooks/useTreeViewApiRef.d.ts +1 -1
  17. package/esm/index.js +1 -1
  18. package/esm/internals/index.d.ts +6 -1
  19. package/esm/internals/index.js +4 -1
  20. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
  21. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
  22. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
  23. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
  24. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
  25. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +13 -0
  26. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
  27. package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
  28. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
  29. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
  30. package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
  31. package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
  32. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
  33. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +27 -0
  34. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
  35. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +1 -0
  36. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
  37. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
  38. package/esm/internals/utils/selectors.d.ts +7 -0
  39. package/esm/internals/utils/selectors.js +9 -0
  40. package/esm/useTreeItem/useTreeItem.d.ts +1 -1
  41. package/esm/useTreeItem/useTreeItem.js +13 -0
  42. package/esm/useTreeItem/useTreeItem.types.d.ts +21 -0
  43. package/esm/utils/cache.d.ts +38 -0
  44. package/esm/utils/cache.js +31 -0
  45. package/esm/utils/index.d.ts +1 -0
  46. package/esm/utils/index.js +1 -0
  47. package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
  48. package/hooks/useTreeItemUtils/useTreeItemUtils.js +22 -10
  49. package/hooks/useTreeViewApiRef.d.ts +1 -1
  50. package/index.js +1 -1
  51. package/internals/index.d.ts +6 -1
  52. package/internals/index.js +33 -0
  53. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
  55. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
  56. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
  57. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
  58. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +14 -1
  59. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
  60. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  61. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
  62. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
  63. package/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
  64. package/internals/plugins/useTreeViewLazyLoading/index.js +5 -0
  65. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
  66. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +33 -0
  67. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
  68. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +5 -0
  69. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
  70. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
  71. package/internals/utils/selectors.d.ts +7 -0
  72. package/internals/utils/selectors.js +9 -0
  73. package/modern/RichTreeView/RichTreeView.js +24 -5
  74. package/modern/SimpleTreeView/SimpleTreeView.js +8 -6
  75. package/modern/TreeItem/TreeItem.d.ts +2 -0
  76. package/modern/TreeItem/TreeItem.js +45 -4
  77. package/modern/TreeItem/TreeItem.types.d.ts +14 -0
  78. package/modern/TreeItemIcon/TreeItemIcon.js +2 -0
  79. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +3 -2
  80. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +21 -9
  81. package/modern/hooks/useTreeViewApiRef.d.ts +1 -1
  82. package/modern/index.js +1 -1
  83. package/modern/internals/index.d.ts +6 -1
  84. package/modern/internals/index.js +4 -1
  85. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +35 -12
  86. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +4 -0
  87. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +40 -16
  88. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +157 -16
  89. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +172 -0
  90. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +13 -0
  91. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +49 -0
  92. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
  93. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +16 -7
  94. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -1
  95. package/modern/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
  96. package/modern/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
  97. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +249 -0
  98. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +27 -0
  99. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +83 -0
  100. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.js +1 -0
  101. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +4 -4
  102. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +12 -12
  103. package/modern/internals/utils/selectors.d.ts +7 -0
  104. package/modern/internals/utils/selectors.js +9 -0
  105. package/modern/useTreeItem/useTreeItem.d.ts +1 -1
  106. package/modern/useTreeItem/useTreeItem.js +13 -0
  107. package/modern/useTreeItem/useTreeItem.types.d.ts +21 -0
  108. package/modern/utils/cache.d.ts +38 -0
  109. package/modern/utils/cache.js +31 -0
  110. package/modern/utils/index.d.ts +1 -0
  111. package/modern/utils/index.js +1 -0
  112. package/package.json +1 -1
  113. package/tsconfig.build.tsbuildinfo +1 -1
  114. package/useTreeItem/useTreeItem.d.ts +1 -1
  115. package/useTreeItem/useTreeItem.js +13 -0
  116. package/useTreeItem/useTreeItem.types.d.ts +21 -0
  117. package/utils/cache.d.ts +38 -0
  118. package/utils/cache.js +38 -0
  119. package/utils/index.d.ts +1 -0
  120. package/utils/index.js +16 -0
@@ -7,26 +7,38 @@ import { UseTreeViewLabelSignature } from "../useTreeViewLabel/index.js";
7
7
  export interface UseTreeViewExpansionPublicAPI {
8
8
  /**
9
9
  * Change the expansion status of a given item.
10
- * @param {React.SyntheticEvent} event The DOM event that triggered the change.
11
- * @param {string} itemId The id of the item to expand of collapse.
12
- * @param {boolean} isExpanded If `true` the item will be expanded. If `false` the item will be collapsed.
10
+ * @param {object} parameters The parameters of the method.
11
+ * @param {string} parameters.itemId The id of the item to expand of collapse.
12
+ * @param {React.SyntheticEvent} parameters.event The DOM event that triggered the change.
13
+ * @param {boolean} parameters.shouldBeExpanded If `true` the item will be expanded. If `false` the item will be collapsed. If not defined, the item's expansion status will be the toggled.
13
14
  */
14
- setItemExpansion: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
15
+ setItemExpansion: (parameters: {
16
+ itemId: string;
17
+ event?: React.SyntheticEvent;
18
+ shouldBeExpanded?: boolean;
19
+ }) => void;
15
20
  }
16
21
  export interface UseTreeViewExpansionInstance extends UseTreeViewExpansionPublicAPI {
17
- /**
18
- * Toggle the current expansion of an item.
19
- * If it is expanded, it will be collapsed, and vice versa.
20
- * @param {React.SyntheticEvent} event The DOM event that triggered the change.
21
- * @param {TreeViewItemId} itemId The id of the item to toggle.
22
- */
23
- toggleItemExpansion: (event: React.SyntheticEvent, itemId: TreeViewItemId) => void;
24
22
  /**
25
23
  * Expand all the siblings (i.e.: the items that have the same parent) of a given item.
26
24
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
27
25
  * @param {TreeViewItemId} itemId The id of the item whose siblings will be expanded.
28
26
  */
29
27
  expandAllSiblings: (event: React.KeyboardEvent, itemId: TreeViewItemId) => void;
28
+ /**
29
+ * APply the new expansion status of a given item.
30
+ * Is used by the `setItemExpansion` method and by the `useTreeViewLazyLoading` plugin.
31
+ * Unlike `setItemExpansion`, this method does not trigger the lazy loading.
32
+ * @param {object} parameters The parameters of the method.
33
+ * @param {string} parameters.itemId The id of the item to expand of collapse.
34
+ * @param {React.SyntheticEvent | null} parameters.event The DOM event that triggered the change.
35
+ * @param {boolean} parameters.shouldBeExpanded If `true` the item will be expanded. If `false` the item will be collapsed.
36
+ */
37
+ applyItemExpansion: (parameters: {
38
+ itemId: string;
39
+ event: React.SyntheticEvent | null;
40
+ shouldBeExpanded: boolean;
41
+ }) => void;
30
42
  }
31
43
  export interface UseTreeViewExpansionParameters {
32
44
  /**
@@ -42,17 +54,17 @@ export interface UseTreeViewExpansionParameters {
42
54
  defaultExpandedItems?: string[];
43
55
  /**
44
56
  * Callback fired when Tree Items are expanded/collapsed.
45
- * @param {React.SyntheticEvent} event The DOM event that triggered the change.
57
+ * @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
46
58
  * @param {array} itemIds The ids of the expanded items.
47
59
  */
48
- onExpandedItemsChange?: (event: React.SyntheticEvent, itemIds: string[]) => void;
60
+ onExpandedItemsChange?: (event: React.SyntheticEvent | null, itemIds: string[]) => void;
49
61
  /**
50
62
  * Callback fired when a Tree Item is expanded or collapsed.
51
- * @param {React.SyntheticEvent} event The DOM event that triggered the change.
63
+ * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
52
64
  * @param {array} itemId The itemId of the modified item.
53
65
  * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
54
66
  */
55
- onItemExpansionToggle?: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
67
+ onItemExpansionToggle?: (event: React.SyntheticEvent | null, itemId: string, isExpanded: boolean) => void;
56
68
  /**
57
69
  * The slot that triggers the item's expansion when clicked.
58
70
  * @default 'content'
@@ -66,6 +78,16 @@ export interface UseTreeViewExpansionState {
66
78
  expansionTrigger: 'content' | 'iconContainer';
67
79
  };
68
80
  }
81
+ interface UseTreeViewExpansionEventLookup {
82
+ beforeItemToggleExpansion: {
83
+ params: {
84
+ isExpansionPrevented: boolean;
85
+ shouldBeExpanded: boolean;
86
+ event: React.SyntheticEvent | null;
87
+ itemId: TreeViewItemId;
88
+ };
89
+ };
90
+ }
69
91
  export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
70
92
  params: UseTreeViewExpansionParameters;
71
93
  defaultizedParams: UseTreeViewExpansionDefaultizedParameters;
@@ -75,4 +97,6 @@ export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
75
97
  state: UseTreeViewExpansionState;
76
98
  dependencies: [UseTreeViewItemsSignature];
77
99
  optionalDependencies: [UseTreeViewLabelSignature];
78
- }>;
100
+ events: UseTreeViewExpansionEventLookup;
101
+ }>;
102
+ export {};
@@ -8,12 +8,24 @@ import { selectorItemMeta, selectorItemOrderedChildrenIds, selectorItemModel, se
8
8
  import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
9
9
  import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
10
10
  import { jsx as _jsx } from "react/jsx-runtime";
11
- const updateItemsState = ({
11
+ const checkId = (id, item, itemMetaLookup) => {
12
+ if (id == null) {
13
+ throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
14
+ }
15
+ if (itemMetaLookup[id] != null) {
16
+ throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
17
+ }
18
+ };
19
+ const processItemsLookups = ({
12
20
  disabledItemsFocusable,
13
21
  items,
14
22
  isItemDisabled,
15
23
  getItemLabel,
16
- getItemId
24
+ getItemId,
25
+ initialDepth = 0,
26
+ initialParentId = null,
27
+ getChildrenCount,
28
+ ignoreChildren = false
17
29
  }) => {
18
30
  const itemMetaLookup = {};
19
31
  const itemModelLookup = {};
@@ -22,12 +34,7 @@ const updateItemsState = ({
22
34
  };
23
35
  const processItem = (item, depth, parentId) => {
24
36
  const id = getItemId ? getItemId(item) : item.id;
25
- if (id == null) {
26
- throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
27
- }
28
- if (itemMetaLookup[id] != null) {
29
- throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
30
- }
37
+ checkId(id, item, itemMetaLookup);
31
38
  const label = getItemLabel ? getItemLabel(item) : item.label;
32
39
  if (label == null) {
33
40
  throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
@@ -37,7 +44,7 @@ const updateItemsState = ({
37
44
  label,
38
45
  parentId,
39
46
  idAttribute: undefined,
40
- expandable: !!item.children?.length,
47
+ expandable: getChildrenCount ? getChildrenCount(item) > 0 : !!item.children?.length,
41
48
  disabled: isItemDisabled ? isItemDisabled(item) : false,
42
49
  depth
43
50
  };
@@ -47,9 +54,13 @@ const updateItemsState = ({
47
54
  itemOrderedChildrenIdsLookup[parentIdWithDefault] = [];
48
55
  }
49
56
  itemOrderedChildrenIdsLookup[parentIdWithDefault].push(id);
50
- item.children?.forEach(child => processItem(child, depth + 1, id));
57
+
58
+ // if lazy loading is enabled, we don't want to process children passed through the `items` prop
59
+ if (!ignoreChildren) {
60
+ item.children?.forEach(child => processItem(child, depth + 1, id));
61
+ }
51
62
  };
52
- items.forEach(item => processItem(item, 0, null));
63
+ items?.forEach(item => processItem(item, initialDepth, initialParentId));
53
64
  const itemChildrenIndexesLookup = {};
54
65
  Object.keys(itemOrderedChildrenIdsLookup).forEach(parentId => {
55
66
  itemChildrenIndexesLookup[parentId] = buildSiblingIndexes(itemOrderedChildrenIdsLookup[parentId]);
@@ -68,6 +79,43 @@ export const useTreeViewItems = ({
68
79
  store
69
80
  }) => {
70
81
  const getItem = React.useCallback(itemId => selectorItemModel(store.value, itemId), [store]);
82
+ const getParentId = React.useCallback(itemId => {
83
+ const itemMeta = selectorItemMeta(store.value, itemId);
84
+ return itemMeta?.parentId || null;
85
+ }, [store]);
86
+ const setTreeViewLoading = useEventCallback(isLoading => {
87
+ store.update(prevState => _extends({}, prevState, {
88
+ items: _extends({}, prevState.items, {
89
+ loading: isLoading
90
+ })
91
+ }));
92
+ });
93
+ const setTreeViewError = useEventCallback(error => {
94
+ store.update(prevState => _extends({}, prevState, {
95
+ items: _extends({}, prevState.items, {
96
+ error
97
+ })
98
+ }));
99
+ });
100
+ const setIsItemDisabled = useEventCallback(({
101
+ itemId,
102
+ shouldBeDisabled
103
+ }) => {
104
+ store.update(prevState => {
105
+ if (!prevState.items.itemMetaLookup[itemId]) {
106
+ return prevState;
107
+ }
108
+ const itemMetaLookup = _extends({}, prevState.items.itemMetaLookup);
109
+ itemMetaLookup[itemId] = _extends({}, itemMetaLookup[itemId], {
110
+ disabled: shouldBeDisabled ?? !itemMetaLookup[itemId].disabled
111
+ });
112
+ return _extends({}, prevState, {
113
+ items: _extends({}, prevState.items, {
114
+ itemMetaLookup
115
+ })
116
+ });
117
+ });
118
+ });
71
119
  const getItemTree = React.useCallback(() => {
72
120
  const getItemFromItemId = itemId => {
73
121
  const item = selectorItemModel(store.value, itemId);
@@ -99,12 +147,96 @@ export const useTreeViewItems = ({
99
147
  areItemUpdatesPreventedRef.current = true;
100
148
  }, []);
101
149
  const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
150
+ const addItems = ({
151
+ items,
152
+ parentId,
153
+ depth,
154
+ getChildrenCount
155
+ }) => {
156
+ if (items) {
157
+ const newState = processItemsLookups({
158
+ disabledItemsFocusable: params.disabledItemsFocusable,
159
+ items,
160
+ isItemDisabled: params.isItemDisabled,
161
+ getItemId: params.getItemId,
162
+ getItemLabel: params.getItemLabel,
163
+ getChildrenCount,
164
+ initialDepth: depth,
165
+ initialParentId: parentId,
166
+ ignoreChildren: true
167
+ });
168
+ store.update(prevState => {
169
+ let newItems;
170
+ if (parentId) {
171
+ newItems = {
172
+ itemModelLookup: _extends({}, prevState.items.itemModelLookup, newState.itemModelLookup),
173
+ itemMetaLookup: _extends({}, prevState.items.itemMetaLookup, newState.itemMetaLookup),
174
+ itemOrderedChildrenIdsLookup: _extends({}, newState.itemOrderedChildrenIdsLookup, prevState.items.itemOrderedChildrenIdsLookup),
175
+ itemChildrenIndexesLookup: _extends({}, newState.itemChildrenIndexesLookup, prevState.items.itemChildrenIndexesLookup)
176
+ };
177
+ } else {
178
+ newItems = {
179
+ itemModelLookup: newState.itemModelLookup,
180
+ itemMetaLookup: newState.itemMetaLookup,
181
+ itemOrderedChildrenIdsLookup: newState.itemOrderedChildrenIdsLookup,
182
+ itemChildrenIndexesLookup: newState.itemChildrenIndexesLookup
183
+ };
184
+ }
185
+ Object.values(prevState.items.itemMetaLookup).forEach(item => {
186
+ if (!newState.itemMetaLookup[item.id]) {
187
+ publishTreeViewEvent(instance, 'removeItem', {
188
+ id: item.id
189
+ });
190
+ }
191
+ });
192
+ return _extends({}, prevState, {
193
+ items: _extends({}, prevState.items, newItems)
194
+ });
195
+ });
196
+ }
197
+ };
198
+ const removeChildren = parentId => {
199
+ store.update(prevState => {
200
+ if (!parentId) {
201
+ return _extends({}, prevState, {
202
+ items: _extends({}, prevState.items, {
203
+ itemMetaLookup: {},
204
+ itemOrderedChildrenIdsLookup: {},
205
+ itemChildrenIndexesLookup: {}
206
+ })
207
+ });
208
+ }
209
+ const newMetaMap = Object.keys(prevState.items.itemMetaLookup).reduce((acc, key) => {
210
+ const item = prevState.items.itemMetaLookup[key];
211
+ if (item.parentId === parentId) {
212
+ publishTreeViewEvent(instance, 'removeItem', {
213
+ id: item.id
214
+ });
215
+ return acc;
216
+ }
217
+ return _extends({}, acc, {
218
+ [item.id]: item
219
+ });
220
+ }, {});
221
+ const newItemOrderedChildrenIdsLookup = prevState.items.itemOrderedChildrenIdsLookup;
222
+ const newItemChildrenIndexesLookup = prevState.items.itemChildrenIndexesLookup;
223
+ delete newItemChildrenIndexesLookup[parentId];
224
+ delete newItemOrderedChildrenIdsLookup[parentId];
225
+ return _extends({}, prevState, {
226
+ items: _extends({}, prevState.items, {
227
+ itemMetaLookup: newMetaMap,
228
+ itemOrderedChildrenIdsLookup: newItemOrderedChildrenIdsLookup,
229
+ itemChildrenIndexesLookup: newItemChildrenIndexesLookup
230
+ })
231
+ });
232
+ });
233
+ };
102
234
  React.useEffect(() => {
103
235
  if (instance.areItemUpdatesPrevented()) {
104
236
  return;
105
237
  }
106
238
  store.update(prevState => {
107
- const newState = updateItemsState({
239
+ const newState = processItemsLookups({
108
240
  disabledItemsFocusable: params.disabledItemsFocusable,
109
241
  items: params.items,
110
242
  isItemDisabled: params.isItemDisabled,
@@ -119,7 +251,7 @@ export const useTreeViewItems = ({
119
251
  }
120
252
  });
121
253
  return _extends({}, prevState, {
122
- items: newState
254
+ items: _extends({}, prevState.items, newState)
123
255
  });
124
256
  });
125
257
  }, [instance, store, params.items, params.disabledItemsFocusable, params.isItemDisabled, params.getItemId, params.getItemLabel]);
@@ -145,23 +277,32 @@ export const useTreeViewItems = ({
145
277
  getItem,
146
278
  getItemDOMElement,
147
279
  getItemTree,
148
- getItemOrderedChildrenIds
280
+ getItemOrderedChildrenIds,
281
+ setIsItemDisabled,
282
+ getParentId
149
283
  },
150
284
  instance: {
151
285
  getItemDOMElement,
152
286
  preventItemUpdates,
153
- areItemUpdatesPrevented
287
+ areItemUpdatesPrevented,
288
+ addItems,
289
+ setTreeViewLoading,
290
+ setTreeViewError,
291
+ removeChildren
154
292
  },
155
293
  contextValue: pluginContextValue
156
294
  };
157
295
  };
158
296
  useTreeViewItems.getInitialState = params => ({
159
- items: updateItemsState({
297
+ items: _extends({}, processItemsLookups({
160
298
  disabledItemsFocusable: params.disabledItemsFocusable,
161
299
  items: params.items,
162
300
  isItemDisabled: params.isItemDisabled,
163
301
  getItemId: params.getItemId,
164
302
  getItemLabel: params.getItemLabel
303
+ }), {
304
+ loading: false,
305
+ error: null
165
306
  })
166
307
  });
167
308
  useTreeViewItems.getDefaultizedParams = ({
@@ -1,6 +1,134 @@
1
1
  import { TreeViewItemMeta } from "../../models/index.js";
2
2
  import { TreeViewRootSelector } from "../../utils/selectors.js";
3
3
  import { UseTreeViewItemsSignature } from "./useTreeViewItems.types.js";
4
+ /**
5
+ * Get the loading state for the Tree View.
6
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
7
+ * @returns {boolean} The loading state for the Tree View.
8
+ */
9
+ export declare const selectorIsTreeViewLoading: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewItems.types").UseTreeViewItemsState<import("../../..").TreeViewDefaultItemModelProperties> & Partial<{}> & {
10
+ cacheKey: import("../../models").TreeViewStateCacheKey;
11
+ }) => boolean) & {
12
+ clearCache: () => void;
13
+ resultsCount: () => number;
14
+ resetResultsCount: () => void;
15
+ } & {
16
+ resultFunc: (resultFuncArgs_0: {
17
+ disabledItemsFocusable: boolean;
18
+ itemModelLookup: {
19
+ [itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
20
+ };
21
+ itemMetaLookup: {
22
+ [itemId: string]: TreeViewItemMeta;
23
+ };
24
+ itemOrderedChildrenIdsLookup: {
25
+ [parentItemId: string]: string[];
26
+ };
27
+ itemChildrenIndexesLookup: {
28
+ [parentItemId: string]: {
29
+ [itemId: string]: number;
30
+ };
31
+ };
32
+ loading: boolean;
33
+ error: Error | null;
34
+ }) => boolean;
35
+ memoizedResultFunc: ((resultFuncArgs_0: {
36
+ disabledItemsFocusable: boolean;
37
+ itemModelLookup: {
38
+ [itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
39
+ };
40
+ itemMetaLookup: {
41
+ [itemId: string]: TreeViewItemMeta;
42
+ };
43
+ itemOrderedChildrenIdsLookup: {
44
+ [parentItemId: string]: string[];
45
+ };
46
+ itemChildrenIndexesLookup: {
47
+ [parentItemId: string]: {
48
+ [itemId: string]: number;
49
+ };
50
+ };
51
+ loading: boolean;
52
+ error: Error | null;
53
+ }) => boolean) & {
54
+ clearCache: () => void;
55
+ resultsCount: () => number;
56
+ resetResultsCount: () => void;
57
+ };
58
+ lastResult: () => boolean;
59
+ dependencies: [TreeViewRootSelector<UseTreeViewItemsSignature>];
60
+ recomputations: () => number;
61
+ resetRecomputations: () => void;
62
+ dependencyRecomputations: () => number;
63
+ resetDependencyRecomputations: () => void;
64
+ } & {
65
+ argsMemoize: typeof import("reselect").weakMapMemoize;
66
+ memoize: typeof import("reselect").weakMapMemoize;
67
+ };
68
+ /**
69
+ * Get the error state for the Tree View.
70
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
71
+ * @returns {boolean} The error state for the Tree View.
72
+ */
73
+ export declare const selectorGetTreeViewError: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewItems.types").UseTreeViewItemsState<import("../../..").TreeViewDefaultItemModelProperties> & Partial<{}> & {
74
+ cacheKey: import("../../models").TreeViewStateCacheKey;
75
+ }) => Error | null) & {
76
+ clearCache: () => void;
77
+ resultsCount: () => number;
78
+ resetResultsCount: () => void;
79
+ } & {
80
+ resultFunc: (resultFuncArgs_0: {
81
+ disabledItemsFocusable: boolean;
82
+ itemModelLookup: {
83
+ [itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
84
+ };
85
+ itemMetaLookup: {
86
+ [itemId: string]: TreeViewItemMeta;
87
+ };
88
+ itemOrderedChildrenIdsLookup: {
89
+ [parentItemId: string]: string[];
90
+ };
91
+ itemChildrenIndexesLookup: {
92
+ [parentItemId: string]: {
93
+ [itemId: string]: number;
94
+ };
95
+ };
96
+ loading: boolean;
97
+ error: Error | null;
98
+ }) => Error | null;
99
+ memoizedResultFunc: ((resultFuncArgs_0: {
100
+ disabledItemsFocusable: boolean;
101
+ itemModelLookup: {
102
+ [itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
103
+ };
104
+ itemMetaLookup: {
105
+ [itemId: string]: TreeViewItemMeta;
106
+ };
107
+ itemOrderedChildrenIdsLookup: {
108
+ [parentItemId: string]: string[];
109
+ };
110
+ itemChildrenIndexesLookup: {
111
+ [parentItemId: string]: {
112
+ [itemId: string]: number;
113
+ };
114
+ };
115
+ loading: boolean;
116
+ error: Error | null;
117
+ }) => Error | null) & {
118
+ clearCache: () => void;
119
+ resultsCount: () => number;
120
+ resetResultsCount: () => void;
121
+ };
122
+ lastResult: () => Error | null;
123
+ dependencies: [TreeViewRootSelector<UseTreeViewItemsSignature>];
124
+ recomputations: () => number;
125
+ resetRecomputations: () => void;
126
+ dependencyRecomputations: () => number;
127
+ resetDependencyRecomputations: () => void;
128
+ } & {
129
+ argsMemoize: typeof import("reselect").weakMapMemoize;
130
+ memoize: typeof import("reselect").weakMapMemoize;
131
+ };
4
132
  /**
5
133
  * Get the meta-information of all items.
6
134
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
@@ -31,6 +159,8 @@ export declare const selectorItemMetaLookup: ((state: import("../../corePlugins/
31
159
  [itemId: string]: number;
32
160
  };
33
161
  };
162
+ loading: boolean;
163
+ error: Error | null;
34
164
  }) => {
35
165
  [itemId: string]: TreeViewItemMeta;
36
166
  };
@@ -50,6 +180,8 @@ export declare const selectorItemMetaLookup: ((state: import("../../corePlugins/
50
180
  [itemId: string]: number;
51
181
  };
52
182
  };
183
+ loading: boolean;
184
+ error: Error | null;
53
185
  }) => {
54
186
  [itemId: string]: TreeViewItemMeta;
55
187
  }) & {
@@ -96,6 +228,8 @@ export declare const selectorItemOrderedChildrenIds: ((state: any, itemId: strin
96
228
  [itemId: string]: number;
97
229
  };
98
230
  };
231
+ loading: boolean;
232
+ error: Error | null;
99
233
  }, resultFuncArgs_1: string | null) => string[];
100
234
  memoizedResultFunc: ((resultFuncArgs_0: {
101
235
  disabledItemsFocusable: boolean;
@@ -113,6 +247,8 @@ export declare const selectorItemOrderedChildrenIds: ((state: any, itemId: strin
113
247
  [itemId: string]: number;
114
248
  };
115
249
  };
250
+ loading: boolean;
251
+ error: Error | null;
116
252
  }, resultFuncArgs_1: string | null) => string[]) & {
117
253
  clearCache: () => void;
118
254
  resultsCount: () => number;
@@ -155,6 +291,8 @@ export declare const selectorItemModel: ((state: any, itemId: string) => import(
155
291
  [itemId: string]: number;
156
292
  };
157
293
  };
294
+ loading: boolean;
295
+ error: Error | null;
158
296
  }, resultFuncArgs_1: string) => import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
159
297
  memoizedResultFunc: ((resultFuncArgs_0: {
160
298
  disabledItemsFocusable: boolean;
@@ -172,6 +310,8 @@ export declare const selectorItemModel: ((state: any, itemId: string) => import(
172
310
  [itemId: string]: number;
173
311
  };
174
312
  };
313
+ loading: boolean;
314
+ error: Error | null;
175
315
  }, resultFuncArgs_1: string) => import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) & {
176
316
  clearCache: () => void;
177
317
  resultsCount: () => number;
@@ -235,6 +375,8 @@ export declare const selectorItemMeta: ((state: any, itemId: string | null) => T
235
375
  [itemId: string]: number;
236
376
  };
237
377
  };
378
+ loading: boolean;
379
+ error: Error | null;
238
380
  }) => {
239
381
  [itemId: string]: TreeViewItemMeta;
240
382
  };
@@ -254,6 +396,8 @@ export declare const selectorItemMeta: ((state: any, itemId: string | null) => T
254
396
  [itemId: string]: number;
255
397
  };
256
398
  };
399
+ loading: boolean;
400
+ error: Error | null;
257
401
  }) => {
258
402
  [itemId: string]: TreeViewItemMeta;
259
403
  }) & {
@@ -328,6 +472,8 @@ export declare const selectorIsItemDisabled: ((state: any, itemId: string) => bo
328
472
  [itemId: string]: number;
329
473
  };
330
474
  };
475
+ loading: boolean;
476
+ error: Error | null;
331
477
  }) => {
332
478
  [itemId: string]: TreeViewItemMeta;
333
479
  };
@@ -347,6 +493,8 @@ export declare const selectorIsItemDisabled: ((state: any, itemId: string) => bo
347
493
  [itemId: string]: number;
348
494
  };
349
495
  };
496
+ loading: boolean;
497
+ error: Error | null;
350
498
  }) => {
351
499
  [itemId: string]: TreeViewItemMeta;
352
500
  }) & {
@@ -401,6 +549,8 @@ export declare const selectorItemIndex: ((state: any, itemId: string | null) =>
401
549
  [itemId: string]: number;
402
550
  };
403
551
  };
552
+ loading: boolean;
553
+ error: Error | null;
404
554
  }, resultFuncArgs_1: TreeViewItemMeta | null) => number;
405
555
  memoizedResultFunc: ((resultFuncArgs_0: {
406
556
  disabledItemsFocusable: boolean;
@@ -418,6 +568,8 @@ export declare const selectorItemIndex: ((state: any, itemId: string | null) =>
418
568
  [itemId: string]: number;
419
569
  };
420
570
  };
571
+ loading: boolean;
572
+ error: Error | null;
421
573
  }, resultFuncArgs_1: TreeViewItemMeta | null) => number) & {
422
574
  clearCache: () => void;
423
575
  resultsCount: () => number;
@@ -465,6 +617,8 @@ export declare const selectorItemIndex: ((state: any, itemId: string | null) =>
465
617
  [itemId: string]: number;
466
618
  };
467
619
  };
620
+ loading: boolean;
621
+ error: Error | null;
468
622
  }) => {
469
623
  [itemId: string]: TreeViewItemMeta;
470
624
  };
@@ -484,6 +638,8 @@ export declare const selectorItemIndex: ((state: any, itemId: string | null) =>
484
638
  [itemId: string]: number;
485
639
  };
486
640
  };
641
+ loading: boolean;
642
+ error: Error | null;
487
643
  }) => {
488
644
  [itemId: string]: TreeViewItemMeta;
489
645
  }) & {
@@ -578,6 +734,8 @@ export declare const selectorItemParentId: ((state: any, itemId: string | null)
578
734
  [itemId: string]: number;
579
735
  };
580
736
  };
737
+ loading: boolean;
738
+ error: Error | null;
581
739
  }) => {
582
740
  [itemId: string]: TreeViewItemMeta;
583
741
  };
@@ -597,6 +755,8 @@ export declare const selectorItemParentId: ((state: any, itemId: string | null)
597
755
  [itemId: string]: number;
598
756
  };
599
757
  };
758
+ loading: boolean;
759
+ error: Error | null;
600
760
  }) => {
601
761
  [itemId: string]: TreeViewItemMeta;
602
762
  }) & {
@@ -691,6 +851,8 @@ export declare const selectorItemDepth: ((state: any, itemId: string | null) =>
691
851
  [itemId: string]: number;
692
852
  };
693
853
  };
854
+ loading: boolean;
855
+ error: Error | null;
694
856
  }) => {
695
857
  [itemId: string]: TreeViewItemMeta;
696
858
  };
@@ -710,6 +872,8 @@ export declare const selectorItemDepth: ((state: any, itemId: string | null) =>
710
872
  [itemId: string]: number;
711
873
  };
712
874
  };
875
+ loading: boolean;
876
+ error: Error | null;
713
877
  }) => {
714
878
  [itemId: string]: TreeViewItemMeta;
715
879
  }) & {
@@ -766,6 +930,8 @@ export declare const selectorCanItemBeFocused: ((state: any, itemId: string) =>
766
930
  [itemId: string]: number;
767
931
  };
768
932
  };
933
+ loading: boolean;
934
+ error: Error | null;
769
935
  }, resultFuncArgs_1: boolean) => boolean;
770
936
  memoizedResultFunc: ((resultFuncArgs_0: {
771
937
  disabledItemsFocusable: boolean;
@@ -783,6 +949,8 @@ export declare const selectorCanItemBeFocused: ((state: any, itemId: string) =>
783
949
  [itemId: string]: number;
784
950
  };
785
951
  };
952
+ loading: boolean;
953
+ error: Error | null;
786
954
  }, resultFuncArgs_1: boolean) => boolean) & {
787
955
  clearCache: () => void;
788
956
  resultsCount: () => number;
@@ -830,6 +998,8 @@ export declare const selectorCanItemBeFocused: ((state: any, itemId: string) =>
830
998
  [itemId: string]: number;
831
999
  };
832
1000
  };
1001
+ loading: boolean;
1002
+ error: Error | null;
833
1003
  }) => {
834
1004
  [itemId: string]: TreeViewItemMeta;
835
1005
  };
@@ -849,6 +1019,8 @@ export declare const selectorCanItemBeFocused: ((state: any, itemId: string) =>
849
1019
  [itemId: string]: number;
850
1020
  };
851
1021
  };
1022
+ loading: boolean;
1023
+ error: Error | null;
852
1024
  }) => {
853
1025
  [itemId: string]: TreeViewItemMeta;
854
1026
  }) & {
@@ -2,6 +2,19 @@ import { createSelector } from "../../utils/selectors.js";
2
2
  import { TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
3
3
  const selectorTreeViewItemsState = state => state.items;
4
4
 
5
+ /**
6
+ * Get the loading state for the Tree View.
7
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
8
+ * @returns {boolean} The loading state for the Tree View.
9
+ */
10
+ export const selectorIsTreeViewLoading = createSelector(selectorTreeViewItemsState, items => items.loading);
11
+ /**
12
+ * Get the error state for the Tree View.
13
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
14
+ * @returns {boolean} The error state for the Tree View.
15
+ */
16
+ export const selectorGetTreeViewError = createSelector(selectorTreeViewItemsState, items => items.error);
17
+
5
18
  /**
6
19
  * Get the meta-information of all items.
7
20
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.