@mui/x-tree-view 8.10.2 → 8.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/CHANGELOG.md +214 -13
  2. package/RichTreeView/RichTreeView.js +16 -15
  3. package/RichTreeView/RichTreeView.types.d.ts +3 -2
  4. package/SimpleTreeView/SimpleTreeView.js +10 -9
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -2
  6. package/TreeItem/TreeItem.d.ts +1 -1
  7. package/TreeItem/TreeItem.types.d.ts +3 -1
  8. package/TreeItemProvider/TreeItemProvider.js +3 -3
  9. package/esm/RichTreeView/RichTreeView.js +16 -15
  10. package/esm/RichTreeView/RichTreeView.types.d.ts +3 -2
  11. package/esm/SimpleTreeView/SimpleTreeView.js +10 -9
  12. package/esm/SimpleTreeView/SimpleTreeView.types.d.ts +3 -2
  13. package/esm/TreeItem/TreeItem.d.ts +1 -1
  14. package/esm/TreeItem/TreeItem.types.d.ts +3 -1
  15. package/esm/TreeItemProvider/TreeItemProvider.js +3 -3
  16. package/esm/hooks/useTreeItemModel.js +3 -3
  17. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +24 -25
  18. package/esm/index.js +1 -1
  19. package/esm/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +2 -2
  20. package/esm/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  21. package/esm/internals/components/RichTreeViewItems.js +5 -5
  22. package/esm/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
  23. package/esm/internals/corePlugins/useTreeViewId/index.js +2 -1
  24. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -13
  25. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
  26. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -9
  27. package/esm/internals/index.d.ts +6 -14
  28. package/esm/internals/index.js +6 -13
  29. package/esm/internals/models/plugin.d.ts +2 -3
  30. package/esm/internals/models/treeView.d.ts +4 -6
  31. package/esm/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
  32. package/esm/internals/plugins/useTreeViewExpansion/index.js +2 -1
  33. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -30
  34. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
  35. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
  36. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
  37. package/esm/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
  38. package/esm/internals/plugins/useTreeViewFocus/index.js +2 -1
  39. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +17 -21
  40. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
  41. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +25 -37
  42. package/esm/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  43. package/esm/internals/plugins/useTreeViewItems/index.js +2 -1
  44. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +78 -99
  45. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
  46. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +58 -98
  47. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  48. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
  49. package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
  50. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +22 -22
  51. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
  52. package/esm/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
  53. package/esm/internals/plugins/useTreeViewLabel/index.js +2 -1
  54. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +4 -4
  55. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +17 -25
  56. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
  57. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
  58. package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
  59. package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -1
  60. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
  61. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +15 -27
  62. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
  63. package/esm/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
  64. package/esm/internals/plugins/useTreeViewSelection/index.js +2 -1
  65. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +25 -38
  66. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +30 -34
  67. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
  68. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
  69. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
  70. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +10 -10
  71. package/esm/internals/useTreeView/useTreeView.d.ts +1 -1
  72. package/esm/internals/useTreeView/useTreeView.js +11 -18
  73. package/esm/internals/useTreeView/useTreeView.types.d.ts +1 -1
  74. package/esm/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
  75. package/esm/internals/utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking.js +0 -2
  76. package/esm/internals/utils/tree.js +33 -33
  77. package/esm/useTreeItem/useTreeItem.js +14 -14
  78. package/esm/useTreeItem/useTreeItem.types.d.ts +2 -1
  79. package/hooks/useTreeItemModel.js +3 -3
  80. package/hooks/useTreeItemUtils/useTreeItemUtils.js +18 -19
  81. package/index.js +1 -1
  82. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
  83. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  84. package/internals/components/RichTreeViewItems.js +5 -5
  85. package/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
  86. package/internals/corePlugins/useTreeViewId/index.js +8 -1
  87. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +9 -12
  88. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
  89. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +10 -10
  90. package/internals/index.d.ts +6 -14
  91. package/internals/index.js +12 -73
  92. package/internals/models/plugin.d.ts +2 -3
  93. package/internals/models/treeView.d.ts +4 -6
  94. package/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
  95. package/internals/plugins/useTreeViewExpansion/index.js +8 -1
  96. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -28
  97. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
  98. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
  99. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
  100. package/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
  101. package/internals/plugins/useTreeViewFocus/index.js +8 -1
  102. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +14 -18
  103. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
  104. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +23 -35
  105. package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  106. package/internals/plugins/useTreeViewItems/index.js +8 -1
  107. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +77 -98
  108. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
  109. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +59 -99
  110. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  111. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
  112. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
  113. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +18 -18
  114. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
  115. package/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
  116. package/internals/plugins/useTreeViewLabel/index.js +8 -1
  117. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +3 -3
  118. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -24
  119. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
  120. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
  121. package/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
  122. package/internals/plugins/useTreeViewLazyLoading/index.js +8 -1
  123. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
  124. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +16 -28
  125. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
  126. package/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
  127. package/internals/plugins/useTreeViewSelection/index.js +8 -1
  128. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +23 -37
  129. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +29 -33
  130. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
  131. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
  132. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
  133. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +8 -8
  134. package/internals/useTreeView/useTreeView.d.ts +1 -1
  135. package/internals/useTreeView/useTreeView.js +11 -18
  136. package/internals/useTreeView/useTreeView.types.d.ts +1 -1
  137. package/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
  138. package/internals/utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking.js +0 -2
  139. package/internals/utils/tree.js +31 -31
  140. package/package.json +12 -13
  141. package/useTreeItem/useTreeItem.js +14 -14
  142. package/useTreeItem/useTreeItem.types.d.ts +2 -1
  143. package/esm/internals/hooks/useSelector.d.ts +0 -4
  144. package/esm/internals/hooks/useSelector.js +0 -8
  145. package/esm/internals/utils/TreeViewStore.d.ts +0 -12
  146. package/esm/internals/utils/TreeViewStore.js +0 -22
  147. package/esm/internals/utils/selectors.d.ts +0 -21
  148. package/esm/internals/utils/selectors.js +0 -51
  149. package/internals/hooks/useSelector.d.ts +0 -4
  150. package/internals/hooks/useSelector.js +0 -16
  151. package/internals/utils/TreeViewStore.d.ts +0 -12
  152. package/internals/utils/TreeViewStore.js +0 -29
  153. package/internals/utils/selectors.d.ts +0 -21
  154. package/internals/utils/selectors.js +0 -58
@@ -2,9 +2,9 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import { useAssertModelConsistency } from '@mui/x-internals/useAssertModelConsistency';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
- import { selectorExpandedItems, selectorIsItemExpandable, selectorIsItemExpanded } from "./useTreeViewExpansion.selectors.js";
5
+ import { expansionSelectors } from "./useTreeViewExpansion.selectors.js";
6
6
  import { getExpansionTrigger } from "./useTreeViewExpansion.utils.js";
7
- import { selectorItemMeta, selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
7
+ import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
8
8
  import { publishTreeViewEvent } from "../../utils/publishTreeViewEvent.js";
9
9
  export const useTreeViewExpansion = ({
10
10
  instance,
@@ -18,27 +18,21 @@ export const useTreeViewExpansion = ({
18
18
  defaultValue: params.defaultExpandedItems
19
19
  });
20
20
  useEnhancedEffect(() => {
21
- store.update(prevState => {
22
- const newExpansionTrigger = getExpansionTrigger({
23
- isItemEditable: params.isItemEditable,
24
- expansionTrigger: params.expansionTrigger
25
- });
26
- if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
27
- return prevState;
28
- }
29
- return _extends({}, prevState, {
30
- expansion: _extends({}, prevState.expansion, {
31
- expansionTrigger: newExpansionTrigger
32
- })
33
- });
21
+ const newExpansionTrigger = getExpansionTrigger({
22
+ isItemEditable: params.isItemEditable,
23
+ expansionTrigger: params.expansionTrigger
34
24
  });
25
+ if (store.state.expansion.expansionTrigger === newExpansionTrigger) {
26
+ return;
27
+ }
28
+ store.set('expansion', _extends({}, store.state.expansion, {
29
+ expansionTrigger: newExpansionTrigger
30
+ }));
35
31
  }, [store, params.isItemEditable, params.expansionTrigger]);
36
32
  const setExpandedItems = (event, value) => {
37
33
  if (params.expandedItems === undefined) {
38
- store.update(prevState => _extends({}, prevState, {
39
- expansion: _extends({}, prevState.expansion, {
40
- expandedItems: value
41
- })
34
+ store.set('expansion', _extends({}, store.state.expansion, {
35
+ expandedItems: value
42
36
  }));
43
37
  }
44
38
  params.onExpandedItemsChange?.(event, value);
@@ -51,7 +45,7 @@ export const useTreeViewExpansion = ({
51
45
  event,
52
46
  shouldBeExpanded
53
47
  }) => {
54
- const oldExpanded = selectorExpandedItems(store.value);
48
+ const oldExpanded = expansionSelectors.expandedItemsRaw(store.state);
55
49
  let newExpanded;
56
50
  if (shouldBeExpanded) {
57
51
  newExpanded = [itemId].concat(oldExpanded);
@@ -68,7 +62,7 @@ export const useTreeViewExpansion = ({
68
62
  event = null,
69
63
  shouldBeExpanded
70
64
  }) => {
71
- const isExpandedBefore = selectorIsItemExpanded(store.value, itemId);
65
+ const isExpandedBefore = expansionSelectors.isItemExpanded(store.state, itemId);
72
66
  const cleanShouldBeExpanded = shouldBeExpanded ?? !isExpandedBefore;
73
67
  if (isExpandedBefore === cleanShouldBeExpanded) {
74
68
  return;
@@ -89,14 +83,17 @@ export const useTreeViewExpansion = ({
89
83
  shouldBeExpanded: cleanShouldBeExpanded
90
84
  });
91
85
  });
86
+ const isItemExpanded = useEventCallback(itemId => {
87
+ return expansionSelectors.isItemExpandable(store.state, itemId);
88
+ });
92
89
  const expandAllSiblings = (event, itemId) => {
93
- const itemMeta = selectorItemMeta(store.value, itemId);
90
+ const itemMeta = itemsSelectors.itemMeta(store.state, itemId);
94
91
  if (itemMeta == null) {
95
92
  return;
96
93
  }
97
- const siblings = selectorItemOrderedChildrenIds(store.value, itemMeta.parentId);
98
- const diff = siblings.filter(child => selectorIsItemExpandable(store.value, child) && !selectorIsItemExpanded(store.value, child));
99
- const newExpanded = selectorExpandedItems(store.value).concat(diff);
94
+ const siblings = itemsSelectors.itemOrderedChildrenIds(store.state, itemMeta.parentId);
95
+ const diff = siblings.filter(child => expansionSelectors.isItemExpandable(store.state, child) && !expansionSelectors.isItemExpanded(store.state, child));
96
+ const newExpanded = expansionSelectors.expandedItemsRaw(store.state).concat(diff);
100
97
  if (diff.length > 0) {
101
98
  if (params.onItemExpansionToggle) {
102
99
  diff.forEach(newlyExpandedItemId => {
@@ -113,16 +110,15 @@ export const useTreeViewExpansion = ({
113
110
  useEnhancedEffect(() => {
114
111
  const expandedItems = params.expandedItems;
115
112
  if (expandedItems !== undefined) {
116
- store.update(prevState => _extends({}, prevState, {
117
- expansion: _extends({}, prevState.expansion, {
118
- expandedItems
119
- })
113
+ store.set('expansion', _extends({}, store.state.expansion, {
114
+ expandedItems
120
115
  }));
121
116
  }
122
117
  }, [store, params.expandedItems]);
123
118
  return {
124
119
  publicAPI: {
125
- setItemExpansion
120
+ setItemExpansion,
121
+ isItemExpanded
126
122
  },
127
123
  instance: {
128
124
  setItemExpansion,
@@ -1,318 +1,26 @@
1
- import { TreeViewRootSelector } from "../../utils/selectors.js";
1
+ import { TreeViewState } from "../../models/index.js";
2
2
  import { UseTreeViewExpansionSignature } from "./useTreeViewExpansion.types.js";
3
- /**
4
- * Get the expanded items.
5
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
6
- * @returns {TreeViewItemId[]} The expanded items.
7
- */
8
- export declare const selectorExpandedItems: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
9
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
10
- }) => string[]) & {
11
- clearCache: () => void;
12
- resultsCount: () => number;
13
- resetResultsCount: () => void;
14
- } & {
15
- resultFunc: (resultFuncArgs_0: {
16
- expandedItems: string[];
17
- expansionTrigger: "content" | "iconContainer";
18
- }) => string[];
19
- memoizedResultFunc: ((resultFuncArgs_0: {
20
- expandedItems: string[];
21
- expansionTrigger: "content" | "iconContainer";
22
- }) => string[]) & {
23
- clearCache: () => void;
24
- resultsCount: () => number;
25
- resetResultsCount: () => void;
26
- };
27
- lastResult: () => string[];
28
- dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
29
- recomputations: () => number;
30
- resetRecomputations: () => void;
31
- dependencyRecomputations: () => number;
32
- resetDependencyRecomputations: () => void;
33
- } & {
34
- memoize: typeof import("reselect").weakMapMemoize;
35
- argsMemoize: typeof import("reselect").weakMapMemoize;
36
- };
37
- /**
38
- * Get the expanded items as a Map.
39
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
40
- * @returns {TreeViewExpansionValue} The expanded items as a Map.
41
- */
42
- export declare const selectorExpandedItemsMap: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
43
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
44
- }) => Map<string, true>) & {
45
- clearCache: () => void;
46
- resultsCount: () => number;
47
- resetResultsCount: () => void;
48
- } & {
49
- resultFunc: (resultFuncArgs_0: string[]) => Map<string, true>;
50
- memoizedResultFunc: ((resultFuncArgs_0: string[]) => Map<string, true>) & {
51
- clearCache: () => void;
52
- resultsCount: () => number;
53
- resetResultsCount: () => void;
54
- };
55
- lastResult: () => Map<string, true>;
56
- dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
57
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
58
- }) => string[]) & {
59
- clearCache: () => void;
60
- resultsCount: () => number;
61
- resetResultsCount: () => void;
62
- } & {
63
- resultFunc: (resultFuncArgs_0: {
64
- expandedItems: string[];
65
- expansionTrigger: "content" | "iconContainer";
66
- }) => string[];
67
- memoizedResultFunc: ((resultFuncArgs_0: {
68
- expandedItems: string[];
69
- expansionTrigger: "content" | "iconContainer";
70
- }) => string[]) & {
71
- clearCache: () => void;
72
- resultsCount: () => number;
73
- resetResultsCount: () => void;
74
- };
75
- lastResult: () => string[];
76
- dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
77
- recomputations: () => number;
78
- resetRecomputations: () => void;
79
- dependencyRecomputations: () => number;
80
- resetDependencyRecomputations: () => void;
81
- } & {
82
- memoize: typeof import("reselect").weakMapMemoize;
83
- argsMemoize: typeof import("reselect").weakMapMemoize;
84
- }];
85
- recomputations: () => number;
86
- resetRecomputations: () => void;
87
- dependencyRecomputations: () => number;
88
- resetDependencyRecomputations: () => void;
89
- } & {
90
- memoize: typeof import("reselect").weakMapMemoize;
91
- argsMemoize: typeof import("reselect").weakMapMemoize;
92
- };
93
- /**
94
- * Check if an item is expanded.
95
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
96
- * @returns {boolean} `true` if the item is expanded, `false` otherwise.
97
- */
98
- export declare const selectorIsItemExpanded: ((state: any, itemId: string) => boolean) & {
99
- clearCache: () => void;
100
- resultsCount: () => number;
101
- resetResultsCount: () => void;
102
- } & {
103
- resultFunc: (resultFuncArgs_0: Map<string, true>, resultFuncArgs_1: string) => boolean;
104
- memoizedResultFunc: ((resultFuncArgs_0: Map<string, true>, resultFuncArgs_1: string) => boolean) & {
105
- clearCache: () => void;
106
- resultsCount: () => number;
107
- resetResultsCount: () => void;
108
- };
109
- lastResult: () => boolean;
110
- dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
111
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
112
- }) => Map<string, true>) & {
113
- clearCache: () => void;
114
- resultsCount: () => number;
115
- resetResultsCount: () => void;
116
- } & {
117
- resultFunc: (resultFuncArgs_0: string[]) => Map<string, true>;
118
- memoizedResultFunc: ((resultFuncArgs_0: string[]) => Map<string, true>) & {
119
- clearCache: () => void;
120
- resultsCount: () => number;
121
- resetResultsCount: () => void;
122
- };
123
- lastResult: () => Map<string, true>;
124
- dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
125
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
126
- }) => string[]) & {
127
- clearCache: () => void;
128
- resultsCount: () => number;
129
- resetResultsCount: () => void;
130
- } & {
131
- resultFunc: (resultFuncArgs_0: {
132
- expandedItems: string[];
133
- expansionTrigger: "content" | "iconContainer";
134
- }) => string[];
135
- memoizedResultFunc: ((resultFuncArgs_0: {
136
- expandedItems: string[];
137
- expansionTrigger: "content" | "iconContainer";
138
- }) => string[]) & {
139
- clearCache: () => void;
140
- resultsCount: () => number;
141
- resetResultsCount: () => void;
142
- };
143
- lastResult: () => string[];
144
- dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
145
- recomputations: () => number;
146
- resetRecomputations: () => void;
147
- dependencyRecomputations: () => number;
148
- resetDependencyRecomputations: () => void;
149
- } & {
150
- memoize: typeof import("reselect").weakMapMemoize;
151
- argsMemoize: typeof import("reselect").weakMapMemoize;
152
- }];
153
- recomputations: () => number;
154
- resetRecomputations: () => void;
155
- dependencyRecomputations: () => number;
156
- resetDependencyRecomputations: () => void;
157
- } & {
158
- memoize: typeof import("reselect").weakMapMemoize;
159
- argsMemoize: typeof import("reselect").weakMapMemoize;
160
- }, (_: any, itemId: string) => string];
161
- recomputations: () => number;
162
- resetRecomputations: () => void;
163
- dependencyRecomputations: () => number;
164
- resetDependencyRecomputations: () => void;
165
- } & {
166
- memoize: typeof import("reselect").weakMapMemoize;
167
- argsMemoize: typeof import("reselect").weakMapMemoize;
168
- };
169
- /**
170
- * Check if an item is expandable.
171
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
172
- * @returns {boolean} `true` if the item is expandable, `false` otherwise.
173
- */
174
- export declare const selectorIsItemExpandable: ((state: any, itemId: string | null) => boolean) & {
175
- clearCache: () => void;
176
- resultsCount: () => number;
177
- resetResultsCount: () => void;
178
- } & {
179
- resultFunc: (resultFuncArgs_0: import("../../index.js").TreeViewItemMeta | null) => boolean;
180
- memoizedResultFunc: ((resultFuncArgs_0: import("../../index.js").TreeViewItemMeta | null) => boolean) & {
181
- clearCache: () => void;
182
- resultsCount: () => number;
183
- resetResultsCount: () => void;
184
- };
185
- lastResult: () => boolean;
186
- dependencies: [((state: any, itemId: string | null) => import("../../index.js").TreeViewItemMeta | null) & {
187
- clearCache: () => void;
188
- resultsCount: () => number;
189
- resetResultsCount: () => void;
190
- } & {
191
- resultFunc: (resultFuncArgs_0: {
192
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
193
- }, resultFuncArgs_1: string | null) => import("../../index.js").TreeViewItemMeta | null;
194
- memoizedResultFunc: ((resultFuncArgs_0: {
195
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
196
- }, resultFuncArgs_1: string | null) => import("../../index.js").TreeViewItemMeta | null) & {
197
- clearCache: () => void;
198
- resultsCount: () => number;
199
- resetResultsCount: () => void;
200
- };
201
- lastResult: () => import("../../index.js").TreeViewItemMeta | null;
202
- dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("../useTreeViewItems/index.js").UseTreeViewItemsState<import("../../../index.js").TreeViewDefaultItemModelProperties> & Partial<{}> & {
203
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
204
- }) => {
205
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
206
- }) & {
207
- clearCache: () => void;
208
- resultsCount: () => number;
209
- resetResultsCount: () => void;
210
- } & {
211
- resultFunc: (resultFuncArgs_0: {
212
- disabledItemsFocusable: boolean;
213
- itemModelLookup: {
214
- [itemId: string]: import("../../../index.js").TreeViewBaseItem<import("../../../index.js").TreeViewDefaultItemModelProperties>;
215
- };
216
- itemMetaLookup: {
217
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
218
- };
219
- itemOrderedChildrenIdsLookup: {
220
- [parentItemId: string]: string[];
221
- };
222
- itemChildrenIndexesLookup: {
223
- [parentItemId: string]: {
224
- [itemId: string]: number;
225
- };
226
- };
227
- loading: boolean;
228
- error: Error | null;
229
- }) => {
230
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
231
- };
232
- memoizedResultFunc: ((resultFuncArgs_0: {
233
- disabledItemsFocusable: boolean;
234
- itemModelLookup: {
235
- [itemId: string]: import("../../../index.js").TreeViewBaseItem<import("../../../index.js").TreeViewDefaultItemModelProperties>;
236
- };
237
- itemMetaLookup: {
238
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
239
- };
240
- itemOrderedChildrenIdsLookup: {
241
- [parentItemId: string]: string[];
242
- };
243
- itemChildrenIndexesLookup: {
244
- [parentItemId: string]: {
245
- [itemId: string]: number;
246
- };
247
- };
248
- loading: boolean;
249
- error: Error | null;
250
- }) => {
251
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
252
- }) & {
253
- clearCache: () => void;
254
- resultsCount: () => number;
255
- resetResultsCount: () => void;
256
- };
257
- lastResult: () => {
258
- [itemId: string]: import("../../index.js").TreeViewItemMeta;
259
- };
260
- dependencies: [TreeViewRootSelector<import("../useTreeViewItems/index.js").UseTreeViewItemsSignature>];
261
- recomputations: () => number;
262
- resetRecomputations: () => void;
263
- dependencyRecomputations: () => number;
264
- resetDependencyRecomputations: () => void;
265
- } & {
266
- memoize: typeof import("reselect").weakMapMemoize;
267
- argsMemoize: typeof import("reselect").weakMapMemoize;
268
- }, (_: any, itemId: string | null) => string | null];
269
- recomputations: () => number;
270
- resetRecomputations: () => void;
271
- dependencyRecomputations: () => number;
272
- resetDependencyRecomputations: () => void;
273
- } & {
274
- memoize: typeof import("reselect").weakMapMemoize;
275
- argsMemoize: typeof import("reselect").weakMapMemoize;
276
- }];
277
- recomputations: () => number;
278
- resetRecomputations: () => void;
279
- dependencyRecomputations: () => number;
280
- resetDependencyRecomputations: () => void;
281
- } & {
282
- memoize: typeof import("reselect").weakMapMemoize;
283
- argsMemoize: typeof import("reselect").weakMapMemoize;
284
- };
285
- /**
286
- * Get the slot that triggers the item's expansion when clicked.
287
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
288
- * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
289
- */
290
- export declare const selectorItemExpansionTrigger: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}> & {
291
- cacheKey: import("../../models/index.js").TreeViewStateCacheKey;
292
- }) => "content" | "iconContainer") & {
293
- clearCache: () => void;
294
- resultsCount: () => number;
295
- resetResultsCount: () => void;
296
- } & {
297
- resultFunc: (resultFuncArgs_0: {
298
- expandedItems: string[];
299
- expansionTrigger: "content" | "iconContainer";
300
- }) => "content" | "iconContainer";
301
- memoizedResultFunc: ((resultFuncArgs_0: {
302
- expandedItems: string[];
303
- expansionTrigger: "content" | "iconContainer";
304
- }) => "content" | "iconContainer") & {
305
- clearCache: () => void;
306
- resultsCount: () => number;
307
- resetResultsCount: () => void;
308
- };
309
- lastResult: () => "content" | "iconContainer";
310
- dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
311
- recomputations: () => number;
312
- resetRecomputations: () => void;
313
- dependencyRecomputations: () => number;
314
- resetDependencyRecomputations: () => void;
315
- } & {
316
- memoize: typeof import("reselect").weakMapMemoize;
317
- argsMemoize: typeof import("reselect").weakMapMemoize;
3
+ export declare const expansionSelectors: {
4
+ /**
5
+ * Gets the expanded items as provided to the component.
6
+ */
7
+ expandedItemsRaw: (state: TreeViewState<[UseTreeViewExpansionSignature]>) => string[];
8
+ /**
9
+ * Get the expanded items as a Map.
10
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
11
+ * @returns {TreeViewExpansionValue} The expanded items as a Map.
12
+ */
13
+ expandedItemsMap: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}>) => Map<string, true>;
14
+ /**
15
+ * Gets the slot that triggers the item's expansion when clicked.
16
+ */
17
+ triggerSlot: (state: TreeViewState<[UseTreeViewExpansionSignature]>) => "content" | "iconContainer";
18
+ /**
19
+ * Checks whether an item is expanded.
20
+ */
21
+ isItemExpanded: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewExpansion.types.js").UseTreeViewExpansionState & Partial<{}>, itemId: string) => boolean;
22
+ /**
23
+ * Checks whether an item is expandable.
24
+ */
25
+ isItemExpandable: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("../useTreeViewItems/index.js").UseTreeViewItemsState<import("../../../index.js").TreeViewDefaultItemModelProperties> & Partial<{}>, _itemId: string) => boolean;
318
26
  };
@@ -1,44 +1,33 @@
1
- import { createSelector } from "../../utils/selectors.js";
2
- import { selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
3
- const selectorExpansion = state => state.expansion;
4
-
5
- /**
6
- * Get the expanded items.
7
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
8
- * @returns {TreeViewItemId[]} The expanded items.
9
- */
10
- export const selectorExpandedItems = createSelector([selectorExpansion], expansionState => expansionState.expandedItems);
11
-
12
- /**
13
- * Get the expanded items as a Map.
14
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
15
- * @returns {TreeViewExpansionValue} The expanded items as a Map.
16
- */
17
- export const selectorExpandedItemsMap = createSelector([selectorExpandedItems], expandedItems => {
1
+ import { createSelector, createSelectorMemoized } from '@mui/x-internals/store';
2
+ import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
3
+ const expandedItemMapSelector = createSelectorMemoized(state => state.expansion.expandedItems, expandedItems => {
18
4
  const expandedItemsMap = new Map();
19
5
  expandedItems.forEach(id => {
20
6
  expandedItemsMap.set(id, true);
21
7
  });
22
8
  return expandedItemsMap;
23
9
  });
24
-
25
- /**
26
- * Check if an item is expanded.
27
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
28
- * @returns {boolean} `true` if the item is expanded, `false` otherwise.
29
- */
30
- export const selectorIsItemExpanded = createSelector([selectorExpandedItemsMap, (_, itemId) => itemId], (expandedItemsMap, itemId) => expandedItemsMap.has(itemId));
31
-
32
- /**
33
- * Check if an item is expandable.
34
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
35
- * @returns {boolean} `true` if the item is expandable, `false` otherwise.
36
- */
37
- export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
38
-
39
- /**
40
- * Get the slot that triggers the item's expansion when clicked.
41
- * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
42
- * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
43
- */
44
- export const selectorItemExpansionTrigger = createSelector([selectorExpansion], expansionState => expansionState.expansionTrigger);
10
+ export const expansionSelectors = {
11
+ /**
12
+ * Gets the expanded items as provided to the component.
13
+ */
14
+ expandedItemsRaw: createSelector(state => state.expansion.expandedItems),
15
+ /**
16
+ * Get the expanded items as a Map.
17
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
18
+ * @returns {TreeViewExpansionValue} The expanded items as a Map.
19
+ */
20
+ expandedItemsMap: expandedItemMapSelector,
21
+ /**
22
+ * Gets the slot that triggers the item's expansion when clicked.
23
+ */
24
+ triggerSlot: createSelector(state => state.expansion.expansionTrigger),
25
+ /**
26
+ * Checks whether an item is expanded.
27
+ */
28
+ isItemExpanded: createSelector(expandedItemMapSelector, (expandedItemsMap, itemId) => expandedItemsMap.has(itemId)),
29
+ /**
30
+ * Checks whether an item is expandable.
31
+ */
32
+ isItemExpandable: createSelector(itemsSelectors.itemMeta, (itemMeta, _itemId) => itemMeta?.expandable ?? false)
33
+ };
@@ -17,8 +17,14 @@ export interface UseTreeViewExpansionPublicAPI {
17
17
  event?: React.SyntheticEvent;
18
18
  shouldBeExpanded?: boolean;
19
19
  }) => void;
20
+ /**
21
+ * Check if an item is expanded.
22
+ * @param {TreeViewItemId} itemId The id of the item to check.
23
+ * @returns {boolean} `true` if the item is expanded, `false` otherwise.
24
+ */
25
+ isItemExpanded: (itemId: TreeViewItemId) => boolean;
20
26
  }
21
- export interface UseTreeViewExpansionInstance extends UseTreeViewExpansionPublicAPI {
27
+ export interface UseTreeViewExpansionInstance extends Omit<UseTreeViewExpansionPublicAPI, 'isItemExpanded'> {
22
28
  /**
23
29
  * Expand all the siblings (i.e.: the items that have the same parent) of a given item.
24
30
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -1,2 +1,3 @@
1
1
  export { useTreeViewFocus } from "./useTreeViewFocus.js";
2
- export type { UseTreeViewFocusSignature, UseTreeViewFocusParameters, UseTreeViewFocusParametersWithDefaults } from "./useTreeViewFocus.types.js";
2
+ export type { UseTreeViewFocusSignature, UseTreeViewFocusParameters, UseTreeViewFocusParametersWithDefaults } from "./useTreeViewFocus.types.js";
3
+ export { focusSelectors } from "./useTreeViewFocus.selectors.js";
@@ -1 +1,2 @@
1
- export { useTreeViewFocus } from "./useTreeViewFocus.js";
1
+ export { useTreeViewFocus } from "./useTreeViewFocus.js";
2
+ export { focusSelectors } from "./useTreeViewFocus.selectors.js";
@@ -1,30 +1,26 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import useEventCallback from '@mui/utils/useEventCallback';
3
3
  import { useInstanceEventHandler } from "../../hooks/useInstanceEventHandler.js";
4
- import { selectorDefaultFocusableItemId, selectorFocusedItemId } from "./useTreeViewFocus.selectors.js";
5
- import { selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
6
- import { selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
4
+ import { focusSelectors } from "./useTreeViewFocus.selectors.js";
5
+ import { expansionSelectors } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
6
+ import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
7
7
  export const useTreeViewFocus = ({
8
8
  instance,
9
9
  params,
10
10
  store
11
11
  }) => {
12
12
  const setFocusedItemId = useEventCallback(itemId => {
13
- store.update(prevState => {
14
- const focusedItemId = selectorFocusedItemId(prevState);
15
- if (focusedItemId === itemId) {
16
- return prevState;
17
- }
18
- return _extends({}, prevState, {
19
- focus: _extends({}, prevState.focus, {
20
- focusedItemId: itemId
21
- })
22
- });
23
- });
13
+ const focusedItemId = focusSelectors.focusedItemId(store.state);
14
+ if (focusedItemId === itemId) {
15
+ return;
16
+ }
17
+ store.set('focus', _extends({}, store.state.focus, {
18
+ focusedItemId: itemId
19
+ }));
24
20
  });
25
21
  const isItemVisible = itemId => {
26
- const itemMeta = selectorItemMeta(store.value, itemId);
27
- return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
22
+ const itemMeta = itemsSelectors.itemMeta(store.state, itemId);
23
+ return itemMeta && (itemMeta.parentId == null || expansionSelectors.isItemExpanded(store.state, itemMeta.parentId));
28
24
  };
29
25
  const innerFocusItem = (event, itemId) => {
30
26
  const itemElement = instance.getItemDOMElement(itemId);
@@ -43,11 +39,11 @@ export const useTreeViewFocus = ({
43
39
  }
44
40
  });
45
41
  const removeFocusedItem = useEventCallback(() => {
46
- const focusedItemId = selectorFocusedItemId(store.value);
42
+ const focusedItemId = focusSelectors.focusedItemId(store.state);
47
43
  if (focusedItemId == null) {
48
44
  return;
49
45
  }
50
- const itemMeta = selectorItemMeta(store.value, focusedItemId);
46
+ const itemMeta = itemsSelectors.itemMeta(store.state, focusedItemId);
51
47
  if (itemMeta) {
52
48
  const itemElement = instance.getItemDOMElement(focusedItemId);
53
49
  if (itemElement) {
@@ -59,8 +55,8 @@ export const useTreeViewFocus = ({
59
55
  useInstanceEventHandler(instance, 'removeItem', ({
60
56
  id
61
57
  }) => {
62
- const focusedItemId = selectorFocusedItemId(store.value);
63
- const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
58
+ const focusedItemId = focusSelectors.focusedItemId(store.state);
59
+ const defaultFocusableItemId = focusSelectors.defaultFocusableItemId(store.state);
64
60
  if (focusedItemId === id && defaultFocusableItemId != null) {
65
61
  innerFocusItem(null, defaultFocusableItemId);
66
62
  }
@@ -72,7 +68,7 @@ export const useTreeViewFocus = ({
72
68
  }
73
69
 
74
70
  // if the event bubbled (which is React specific) we don't want to steal focus
75
- const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
71
+ const defaultFocusableItemId = focusSelectors.defaultFocusableItemId(store.state);
76
72
  if (event.target === event.currentTarget && defaultFocusableItemId != null) {
77
73
  innerFocusItem(event, defaultFocusableItemId);
78
74
  }