@mui/x-tree-view 8.11.0 → 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 (150) hide show
  1. package/CHANGELOG.md +74 -0
  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/TreeItemProvider/TreeItemProvider.js +3 -3
  8. package/esm/RichTreeView/RichTreeView.js +16 -15
  9. package/esm/RichTreeView/RichTreeView.types.d.ts +3 -2
  10. package/esm/SimpleTreeView/SimpleTreeView.js +10 -9
  11. package/esm/SimpleTreeView/SimpleTreeView.types.d.ts +3 -2
  12. package/esm/TreeItem/TreeItem.d.ts +1 -1
  13. package/esm/TreeItemProvider/TreeItemProvider.js +3 -3
  14. package/esm/hooks/useTreeItemModel.js +3 -3
  15. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +24 -25
  16. package/esm/index.js +1 -1
  17. package/esm/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +2 -2
  18. package/esm/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  19. package/esm/internals/components/RichTreeViewItems.js +5 -5
  20. package/esm/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
  21. package/esm/internals/corePlugins/useTreeViewId/index.js +2 -1
  22. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -13
  23. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
  24. package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -9
  25. package/esm/internals/index.d.ts +6 -14
  26. package/esm/internals/index.js +6 -13
  27. package/esm/internals/models/plugin.d.ts +2 -3
  28. package/esm/internals/models/treeView.d.ts +4 -6
  29. package/esm/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
  30. package/esm/internals/plugins/useTreeViewExpansion/index.js +2 -1
  31. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -30
  32. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
  33. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
  34. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
  35. package/esm/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
  36. package/esm/internals/plugins/useTreeViewFocus/index.js +2 -1
  37. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +17 -21
  38. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
  39. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +25 -37
  40. package/esm/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  41. package/esm/internals/plugins/useTreeViewItems/index.js +2 -1
  42. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +78 -99
  43. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
  44. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +58 -98
  45. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  46. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
  47. package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
  48. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +22 -22
  49. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
  50. package/esm/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
  51. package/esm/internals/plugins/useTreeViewLabel/index.js +2 -1
  52. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +4 -4
  53. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +17 -25
  54. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
  55. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
  56. package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
  57. package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -1
  58. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
  59. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +15 -27
  60. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
  61. package/esm/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
  62. package/esm/internals/plugins/useTreeViewSelection/index.js +2 -1
  63. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +25 -38
  64. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +30 -34
  65. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
  66. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
  67. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
  68. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +10 -10
  69. package/esm/internals/useTreeView/useTreeView.d.ts +1 -1
  70. package/esm/internals/useTreeView/useTreeView.js +11 -18
  71. package/esm/internals/useTreeView/useTreeView.types.d.ts +1 -1
  72. package/esm/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
  73. package/esm/internals/utils/tree.js +33 -33
  74. package/esm/useTreeItem/useTreeItem.js +14 -14
  75. package/esm/useTreeItem/useTreeItem.types.d.ts +2 -1
  76. package/hooks/useTreeItemModel.js +3 -3
  77. package/hooks/useTreeItemUtils/useTreeItemUtils.js +18 -19
  78. package/index.js +1 -1
  79. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
  80. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  81. package/internals/components/RichTreeViewItems.js +5 -5
  82. package/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
  83. package/internals/corePlugins/useTreeViewId/index.js +8 -1
  84. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +9 -12
  85. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
  86. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +10 -10
  87. package/internals/index.d.ts +6 -14
  88. package/internals/index.js +12 -73
  89. package/internals/models/plugin.d.ts +2 -3
  90. package/internals/models/treeView.d.ts +4 -6
  91. package/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
  92. package/internals/plugins/useTreeViewExpansion/index.js +8 -1
  93. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -28
  94. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
  95. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
  96. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
  97. package/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
  98. package/internals/plugins/useTreeViewFocus/index.js +8 -1
  99. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +14 -18
  100. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
  101. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +23 -35
  102. package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  103. package/internals/plugins/useTreeViewItems/index.js +8 -1
  104. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +77 -98
  105. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
  106. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +59 -99
  107. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  108. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
  109. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
  110. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +18 -18
  111. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
  112. package/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
  113. package/internals/plugins/useTreeViewLabel/index.js +8 -1
  114. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +3 -3
  115. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -24
  116. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
  117. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
  118. package/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
  119. package/internals/plugins/useTreeViewLazyLoading/index.js +8 -1
  120. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
  121. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +16 -28
  122. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
  123. package/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
  124. package/internals/plugins/useTreeViewSelection/index.js +8 -1
  125. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +23 -37
  126. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +29 -33
  127. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
  128. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
  129. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
  130. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +8 -8
  131. package/internals/useTreeView/useTreeView.d.ts +1 -1
  132. package/internals/useTreeView/useTreeView.js +11 -18
  133. package/internals/useTreeView/useTreeView.types.d.ts +1 -1
  134. package/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
  135. package/internals/utils/tree.js +31 -31
  136. package/package.json +12 -13
  137. package/useTreeItem/useTreeItem.js +14 -14
  138. package/useTreeItem/useTreeItem.types.d.ts +2 -1
  139. package/esm/internals/hooks/useSelector.d.ts +0 -4
  140. package/esm/internals/hooks/useSelector.js +0 -8
  141. package/esm/internals/utils/TreeViewStore.d.ts +0 -12
  142. package/esm/internals/utils/TreeViewStore.js +0 -22
  143. package/esm/internals/utils/selectors.d.ts +0 -21
  144. package/esm/internals/utils/selectors.js +0 -51
  145. package/internals/hooks/useSelector.d.ts +0 -4
  146. package/internals/hooks/useSelector.js +0 -16
  147. package/internals/utils/TreeViewStore.d.ts +0 -12
  148. package/internals/utils/TreeViewStore.js +0 -29
  149. package/internals/utils/selectors.d.ts +0 -21
  150. package/internals/utils/selectors.js +0 -58
@@ -1,100 +1,60 @@
1
- import { createSelector } from "../../utils/selectors.js";
1
+ import { createSelector } from '@mui/x-internals/store';
2
2
  import { isItemDisabled, TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
3
- const selectorTreeViewItemsState = state => state.items;
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
-
18
- /**
19
- * Get the meta-information of all items.
20
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
21
- * @returns {TreeViewItemMetaLookup} The meta-information of all items.
22
- */
23
- export const selectorItemMetaLookup = createSelector(selectorTreeViewItemsState, items => items.itemMetaLookup);
24
3
  const EMPTY_CHILDREN = [];
25
-
26
- /**
27
- * Get the ordered children ids of a given item.
28
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
29
- * @param {TreeViewItemId} itemId The id of the item to get the children of.
30
- * @returns {TreeViewItemId[]} The ordered children ids of the item.
31
- */
32
- export const selectorItemOrderedChildrenIds = createSelector([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => itemsState.itemOrderedChildrenIdsLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? EMPTY_CHILDREN);
33
-
34
- /**
35
- * Get the model of an item.
36
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
37
- * @param {TreeViewItemId} itemId The id of the item to get the model of.
38
- * @returns {R} The model of the item.
39
- */
40
- export const selectorItemModel = createSelector([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => itemsState.itemModelLookup[itemId]);
41
-
42
- /**
43
- * Get the meta-information of an item.
44
- * Check the `TreeViewItemMeta` type for more information.
45
- * @param {TreeViewState<[UseTreeViewItemsSignature]>}
46
- * @param {TreeViewItemId} itemId The id of the item to get the meta-information of.
47
- * @returns {TreeViewItemMeta | null} The meta-information of the item.
48
- */
49
- export const selectorItemMeta = createSelector([selectorItemMetaLookup, (_, itemId) => itemId], (itemMetaLookup, itemId) => itemMetaLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? null);
50
-
51
- /**
52
- * Check if an item is disabled.
53
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
54
- * @param {TreeViewItemId} itemId The id of the item to check.
55
- * @returns {boolean} `true` if the item is disabled, `false` otherwise.
56
- */
57
- export const selectorIsItemDisabled = createSelector([selectorItemMetaLookup, (_, itemId) => itemId], isItemDisabled);
58
-
59
- /**
60
- * Get the index of an item in its parent's children.
61
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
62
- * @param {TreeViewItemId} itemId The id of the item to get the index of.
63
- * @returns {number} The index of the item in its parent's children.
64
- */
65
- export const selectorItemIndex = createSelector([selectorTreeViewItemsState, selectorItemMeta], (itemsState, itemMeta) => {
66
- if (itemMeta == null) {
67
- return -1;
68
- }
69
- const parentIndexes = itemsState.itemChildrenIndexesLookup[itemMeta.parentId ?? TREE_VIEW_ROOT_PARENT_ID];
70
- return parentIndexes[itemMeta.id];
71
- });
72
-
73
- /**
74
- * Get the id of the parent of an item.
75
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
76
- * @param {TreeViewItemId} itemId The id of the item to get the parent id of.
77
- * @returns {TreeViewItemId | null} The id of the parent of the item.
78
- */
79
- export const selectorItemParentId = createSelector([selectorItemMeta], itemMeta => itemMeta?.parentId ?? null);
80
-
81
- /**
82
- * Get the depth of an item (items at the root level have a depth of 0).
83
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
84
- * @param {TreeViewItemId} itemId The id of the item to get the depth of.
85
- * @returns {number} The depth of the item.
86
- */
87
- export const selectorItemDepth = createSelector([selectorItemMeta], itemMeta => itemMeta?.depth ?? 0);
88
-
89
- /**
90
- * Check if the disabled items are focusable.
91
- * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
92
- * @returns {boolean} Whether the disabled items are focusable.
93
- */
94
- export const selectorDisabledItemFocusable = createSelector([selectorTreeViewItemsState], itemsState => itemsState.disabledItemsFocusable);
95
- export const selectorCanItemBeFocused = createSelector([selectorDisabledItemFocusable, selectorIsItemDisabled], (disabledItemsFocusable, isDisabled) => {
96
- if (disabledItemsFocusable) {
97
- return true;
98
- }
99
- return !isDisabled;
100
- });
4
+ export const itemsSelectors = {
5
+ /**
6
+ * Gets the loading state for the Tree View.
7
+ */
8
+ isLoading: createSelector(state => state.items.loading),
9
+ /**
10
+ * Gets the error state for the Tree View.
11
+ */
12
+ error: createSelector(state => state.items.error),
13
+ /**
14
+ * Checks whether the disabled items are focusable.
15
+ */
16
+ disabledItemFocusable: createSelector(state => state.items.disabledItemsFocusable),
17
+ /**
18
+ * Gets the meta-information of all items.
19
+ */
20
+ itemMetaLookup: createSelector(state => state.items.itemMetaLookup),
21
+ /**
22
+ * Gets the meta-information of an item.
23
+ */
24
+ itemMeta: createSelector((state, itemId) => state.items.itemMetaLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? null),
25
+ /**
26
+ * Gets the ordered children ids of an item.
27
+ */
28
+ itemOrderedChildrenIds: createSelector((state, itemId) => state.items.itemOrderedChildrenIdsLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? EMPTY_CHILDREN),
29
+ /**
30
+ * Gets the model of an item.
31
+ */
32
+ itemModel: createSelector((state, itemId) => state.items.itemModelLookup[itemId]),
33
+ /**
34
+ * Checks whether an item is disabled.
35
+ */
36
+ isItemDisabled: createSelector((state, itemId) => isItemDisabled(state.items.itemMetaLookup, itemId)),
37
+ /**
38
+ * Gets the index of an item in its parent's children.
39
+ */
40
+ itemIndex: createSelector((state, itemId) => {
41
+ const itemMeta = state.items.itemMetaLookup[itemId];
42
+ if (itemMeta == null) {
43
+ return -1;
44
+ }
45
+ const parentIndexes = state.items.itemChildrenIndexesLookup[itemMeta.parentId ?? TREE_VIEW_ROOT_PARENT_ID];
46
+ return parentIndexes[itemMeta.id];
47
+ }),
48
+ /**
49
+ * Gets the id of an item's parent.
50
+ */
51
+ itemParentId: createSelector((state, itemId) => state.items.itemMetaLookup[itemId]?.parentId ?? null),
52
+ /**
53
+ * Gets the depth of an item (items at the root level have a depth of 0).
54
+ */
55
+ itemDepth: createSelector((state, itemId) => state.items.itemMetaLookup[itemId]?.depth ?? 0),
56
+ /**
57
+ * Checks whether an item can be focused.
58
+ */
59
+ canItemBeFocused: createSelector((state, itemId) => state.items.disabledItemsFocusable || !isItemDisabled(state.items.itemMetaLookup, itemId))
60
+ };
@@ -7,7 +7,7 @@ export declare const buildSiblingIndexes: (siblings: string[]) => {
7
7
  /**
8
8
  * Check if an item is disabled.
9
9
  * This method should only be used in selectors that are checking if several items are disabled.
10
- * Otherwise, use the `selectorIsItemDisabled` selector.
10
+ * Otherwise, use the `itemsSelector.isItemDisabled` selector.
11
11
  * @returns
12
12
  */
13
13
  export declare const isItemDisabled: (itemMetaLookup: {
@@ -10,7 +10,7 @@ export const buildSiblingIndexes = siblings => {
10
10
  /**
11
11
  * Check if an item is disabled.
12
12
  * This method should only be used in selectors that are checking if several items are disabled.
13
- * Otherwise, use the `selectorIsItemDisabled` selector.
13
+ * Otherwise, use the `itemsSelector.isItemDisabled` selector.
14
14
  * @returns
15
15
  */
16
16
  export const isItemDisabled = (itemMetaLookup, itemId) => {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import * as React from 'react';
5
+ import { useStore } from '@mui/x-internals/store';
5
6
  import useEventCallback from '@mui/utils/useEventCallback';
6
7
  import useForkRef from '@mui/utils/useForkRef';
7
8
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
@@ -12,8 +13,7 @@ import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewIte
12
13
  import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
13
14
  import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
14
15
  import { itemHasChildren } from "../../../hooks/useTreeItemUtils/useTreeItemUtils.js";
15
- import { useSelector } from "../../hooks/useSelector.js";
16
- import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
16
+ import { idSelectors } from "../../corePlugins/useTreeViewId/index.js";
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
  export const useTreeViewJSXItems = ({
19
19
  instance,
@@ -21,38 +21,30 @@ export const useTreeViewJSXItems = ({
21
21
  }) => {
22
22
  instance.preventItemUpdates();
23
23
  const insertJSXItem = useEventCallback(item => {
24
- store.update(prevState => {
25
- if (prevState.items.itemMetaLookup[item.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.', `Two items were provided with the same id in the \`items\` prop: "${item.id}"`].join('\n'));
27
- }
28
- return _extends({}, prevState, {
29
- items: _extends({}, prevState.items, {
30
- itemMetaLookup: _extends({}, prevState.items.itemMetaLookup, {
31
- [item.id]: item
32
- }),
33
- // For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
34
- itemModelLookup: _extends({}, prevState.items.itemModelLookup, {
35
- [item.id]: {
36
- id: item.id,
37
- label: item.label ?? ''
38
- }
39
- })
40
- })
41
- });
42
- });
24
+ if (store.state.items.itemMetaLookup[item.id] != null) {
25
+ 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: "${item.id}"`].join('\n'));
26
+ }
27
+ store.set('items', _extends({}, store.state.items, {
28
+ itemMetaLookup: _extends({}, store.state.items.itemMetaLookup, {
29
+ [item.id]: item
30
+ }),
31
+ // For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
32
+ itemModelLookup: _extends({}, store.state.items.itemModelLookup, {
33
+ [item.id]: {
34
+ id: item.id,
35
+ label: item.label ?? ''
36
+ }
37
+ })
38
+ }));
43
39
  return () => {
44
- store.update(prevState => {
45
- const newItemMetaLookup = _extends({}, prevState.items.itemMetaLookup);
46
- const newItemModelLookup = _extends({}, prevState.items.itemModelLookup);
47
- delete newItemMetaLookup[item.id];
48
- delete newItemModelLookup[item.id];
49
- return _extends({}, prevState, {
50
- items: _extends({}, prevState.items, {
51
- itemMetaLookup: newItemMetaLookup,
52
- itemModelLookup: newItemModelLookup
53
- })
54
- });
55
- });
40
+ const newItemMetaLookup = _extends({}, store.state.items.itemMetaLookup);
41
+ const newItemModelLookup = _extends({}, store.state.items.itemModelLookup);
42
+ delete newItemMetaLookup[item.id];
43
+ delete newItemModelLookup[item.id];
44
+ store.set('items', _extends({}, store.state.items, {
45
+ itemMetaLookup: newItemMetaLookup,
46
+ itemModelLookup: newItemModelLookup
47
+ }));
56
48
  publishTreeViewEvent(instance, 'removeItem', {
57
49
  id: item.id
58
50
  });
@@ -60,14 +52,12 @@ export const useTreeViewJSXItems = ({
60
52
  });
61
53
  const setJSXItemsOrderedChildrenIds = (parentId, orderedChildrenIds) => {
62
54
  const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
63
- store.update(prevState => _extends({}, prevState, {
64
- items: _extends({}, prevState.items, {
65
- itemOrderedChildrenIdsLookup: _extends({}, prevState.items.itemOrderedChildrenIdsLookup, {
66
- [parentIdWithDefault]: orderedChildrenIds
67
- }),
68
- itemChildrenIndexesLookup: _extends({}, prevState.items.itemChildrenIndexesLookup, {
69
- [parentIdWithDefault]: buildSiblingIndexes(orderedChildrenIds)
70
- })
55
+ store.set('items', _extends({}, store.state.items, {
56
+ itemOrderedChildrenIdsLookup: _extends({}, store.state.items.itemOrderedChildrenIdsLookup, {
57
+ [parentIdWithDefault]: orderedChildrenIds
58
+ }),
59
+ itemChildrenIndexesLookup: _extends({}, store.state.items.itemChildrenIndexesLookup, {
60
+ [parentIdWithDefault]: buildSiblingIndexes(orderedChildrenIds)
71
61
  })
72
62
  }));
73
63
  };
@@ -120,7 +110,7 @@ const useTreeViewJSXItemsItemPlugin = ({
120
110
  const expandable = itemHasChildren(children);
121
111
  const pluginContentRef = React.useRef(null);
122
112
  const handleContentRef = useForkRef(pluginContentRef, contentRef);
123
- const treeId = useSelector(store, selectorTreeViewId);
113
+ const treeId = useStore(store, idSelectors.treeId);
124
114
 
125
115
  // Prevent any flashing
126
116
  useEnhancedEffect(() => {
@@ -1,16 +1,16 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { useStore } from '@mui/x-internals/store';
4
5
  import { useRtl } from '@mui/system/RtlProvider';
5
6
  import useEventCallback from '@mui/utils/useEventCallback';
6
7
  import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
7
8
  import { hasPlugin } from "../../utils/plugins.js";
8
9
  import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
9
- import { useSelector } from "../../hooks/useSelector.js";
10
- import { selectorItemMetaLookup, selectorIsItemDisabled, selectorItemParentId } from "../useTreeViewItems/useTreeViewItems.selectors.js";
11
- import { selectorIsItemBeingEdited, selectorIsItemEditable } from "../useTreeViewLabel/useTreeViewLabel.selectors.js";
12
- import { selectorIsItemSelected, selectorIsMultiSelectEnabled, selectorIsSelectionEnabled } from "../useTreeViewSelection/useTreeViewSelection.selectors.js";
13
- import { selectorIsItemExpandable, selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
10
+ import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
11
+ import { labelSelectors } from "../useTreeViewLabel/useTreeViewLabel.selectors.js";
12
+ import { selectionSelectors } from "../useTreeViewSelection/useTreeViewSelection.selectors.js";
13
+ import { expansionSelectors } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
14
14
  function isPrintableKey(string) {
15
15
  return !!string && string.length === 1 && !!string.match(/\S/);
16
16
  }
@@ -24,7 +24,7 @@ export const useTreeViewKeyboardNavigation = ({
24
24
  const updateFirstCharMap = useEventCallback(callback => {
25
25
  firstCharMap.current = callback(firstCharMap.current);
26
26
  });
27
- const itemMetaLookup = useSelector(store, selectorItemMetaLookup);
27
+ const itemMetaLookup = useStore(store, itemsSelectors.itemMetaLookup);
28
28
  React.useEffect(() => {
29
29
  if (instance.areItemUpdatesPrevented()) {
30
30
  return;
@@ -39,10 +39,10 @@ export const useTreeViewKeyboardNavigation = ({
39
39
  const getFirstMatchingItem = (itemId, query) => {
40
40
  const cleanQuery = query.toLowerCase();
41
41
  const getNextItem = itemIdToCheck => {
42
- const nextItemId = getNextNavigableItem(store.value, itemIdToCheck);
42
+ const nextItemId = getNextNavigableItem(store.state, itemIdToCheck);
43
43
  // We reached the end of the tree, check from the beginning
44
44
  if (nextItemId === null) {
45
- return getFirstNavigableItem(store.value);
45
+ return getFirstNavigableItem(store.state);
46
46
  }
47
47
  return nextItemId;
48
48
  };
@@ -60,9 +60,9 @@ export const useTreeViewKeyboardNavigation = ({
60
60
  }
61
61
  return matchingItemId;
62
62
  };
63
- const canToggleItemSelection = itemId => selectorIsSelectionEnabled(store.value) && !selectorIsItemDisabled(store.value, itemId);
63
+ const canToggleItemSelection = itemId => selectionSelectors.enabled(store.state) && !itemsSelectors.isItemDisabled(store.state, itemId);
64
64
  const canToggleItemExpansion = itemId => {
65
- return !selectorIsItemDisabled(store.value, itemId) && selectorIsItemExpandable(store.value, itemId);
65
+ return !itemsSelectors.isItemDisabled(store.state, itemId) && expansionSelectors.isItemExpandable(store.state, itemId);
66
66
  };
67
67
 
68
68
  // ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
@@ -75,7 +75,7 @@ export const useTreeViewKeyboardNavigation = ({
75
75
  }
76
76
  const ctrlPressed = event.ctrlKey || event.metaKey;
77
77
  const key = event.key;
78
- const isMultiSelectEnabled = selectorIsMultiSelectEnabled(store.value);
78
+ const isMultiSelectEnabled = selectionSelectors.isMultiSelectEnabled(store.state);
79
79
 
80
80
  // eslint-disable-next-line default-case
81
81
  switch (true) {
@@ -100,7 +100,7 @@ export const useTreeViewKeyboardNavigation = ({
100
100
  // If the focused item has no children, we select it.
101
101
  case key === 'Enter':
102
102
  {
103
- if (hasPlugin(instance, useTreeViewLabel) && selectorIsItemEditable(store.value, itemId) && !selectorIsItemBeingEdited(store.value, itemId)) {
103
+ if (hasPlugin(instance, useTreeViewLabel) && labelSelectors.isItemEditable(store.state, itemId) && !labelSelectors.isItemBeingEdited(store.state, itemId)) {
104
104
  instance.setEditedItem(itemId);
105
105
  } else if (canToggleItemExpansion(itemId)) {
106
106
  instance.setItemExpansion({
@@ -116,7 +116,7 @@ export const useTreeViewKeyboardNavigation = ({
116
116
  itemId,
117
117
  keepExistingSelection: true
118
118
  });
119
- } else if (!selectorIsItemSelected(store.value, itemId)) {
119
+ } else if (!selectionSelectors.isItemSelected(store.state, itemId)) {
120
120
  instance.setItemSelection({
121
121
  event,
122
122
  itemId
@@ -130,7 +130,7 @@ export const useTreeViewKeyboardNavigation = ({
130
130
  // Focus the next focusable item
131
131
  case key === 'ArrowDown':
132
132
  {
133
- const nextItem = getNextNavigableItem(store.value, itemId);
133
+ const nextItem = getNextNavigableItem(store.state, itemId);
134
134
  if (nextItem) {
135
135
  event.preventDefault();
136
136
  instance.focusItem(event, nextItem);
@@ -147,7 +147,7 @@ export const useTreeViewKeyboardNavigation = ({
147
147
  // Focuses the previous focusable item
148
148
  case key === 'ArrowUp':
149
149
  {
150
- const previousItem = getPreviousNavigableItem(store.value, itemId);
150
+ const previousItem = getPreviousNavigableItem(store.state, itemId);
151
151
  if (previousItem) {
152
152
  event.preventDefault();
153
153
  instance.focusItem(event, previousItem);
@@ -168,8 +168,8 @@ export const useTreeViewKeyboardNavigation = ({
168
168
  if (ctrlPressed) {
169
169
  return;
170
170
  }
171
- if (selectorIsItemExpanded(store.value, itemId)) {
172
- const nextItemId = getNextNavigableItem(store.value, itemId);
171
+ if (expansionSelectors.isItemExpanded(store.state, itemId)) {
172
+ const nextItemId = getNextNavigableItem(store.state, itemId);
173
173
  if (nextItemId) {
174
174
  instance.focusItem(event, nextItemId);
175
175
  event.preventDefault();
@@ -191,14 +191,14 @@ export const useTreeViewKeyboardNavigation = ({
191
191
  if (ctrlPressed) {
192
192
  return;
193
193
  }
194
- if (canToggleItemExpansion(itemId) && selectorIsItemExpanded(store.value, itemId)) {
194
+ if (canToggleItemExpansion(itemId) && expansionSelectors.isItemExpanded(store.state, itemId)) {
195
195
  instance.setItemExpansion({
196
196
  event,
197
197
  itemId
198
198
  });
199
199
  event.preventDefault();
200
200
  } else {
201
- const parent = selectorItemParentId(store.value, itemId);
201
+ const parent = itemsSelectors.itemParentId(store.state, itemId);
202
202
  if (parent) {
203
203
  instance.focusItem(event, parent);
204
204
  event.preventDefault();
@@ -215,7 +215,7 @@ export const useTreeViewKeyboardNavigation = ({
215
215
  if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
216
216
  instance.selectRangeFromStartToItem(event, itemId);
217
217
  } else {
218
- instance.focusItem(event, getFirstNavigableItem(store.value));
218
+ instance.focusItem(event, getFirstNavigableItem(store.state));
219
219
  }
220
220
  event.preventDefault();
221
221
  break;
@@ -229,7 +229,7 @@ export const useTreeViewKeyboardNavigation = ({
229
229
  if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
230
230
  instance.selectRangeFromItemToEnd(event, itemId);
231
231
  } else {
232
- instance.focusItem(event, getLastNavigableItem(store.value));
232
+ instance.focusItem(event, getLastNavigableItem(store.state));
233
233
  }
234
234
  event.preventDefault();
235
235
  break;
@@ -245,7 +245,7 @@ export const useTreeViewKeyboardNavigation = ({
245
245
 
246
246
  // Multi select behavior when pressing Ctrl + a
247
247
  // Selects all the items
248
- case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && isMultiSelectEnabled && selectorIsSelectionEnabled(store.value):
248
+ case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && isMultiSelectEnabled && selectionSelectors.enabled(store.state):
249
249
  {
250
250
  instance.selectAllNavigableItems(event);
251
251
  event.preventDefault();
@@ -4,6 +4,7 @@ import { UseTreeViewItemsSignature } from "../useTreeViewItems/index.js";
4
4
  import { UseTreeViewSelectionSignature } from "../useTreeViewSelection/index.js";
5
5
  import { UseTreeViewFocusSignature } from "../useTreeViewFocus/index.js";
6
6
  import { UseTreeViewExpansionSignature } from "../useTreeViewExpansion/index.js";
7
+ import { UseTreeViewLabelSignature } from "../useTreeViewLabel/index.js";
7
8
  import { TreeViewItemId, TreeViewCancellableEvent } from "../../../models/index.js";
8
9
  export interface UseTreeViewKeyboardNavigationInstance {
9
10
  /**
@@ -24,6 +25,7 @@ export interface UseTreeViewKeyboardNavigationInstance {
24
25
  export type UseTreeViewKeyboardNavigationSignature = TreeViewPluginSignature<{
25
26
  instance: UseTreeViewKeyboardNavigationInstance;
26
27
  dependencies: [UseTreeViewItemsSignature, UseTreeViewSelectionSignature, UseTreeViewFocusSignature, UseTreeViewExpansionSignature];
28
+ optionalDependencies: [UseTreeViewLabelSignature];
27
29
  }>;
28
30
  export type TreeViewFirstCharMap = {
29
31
  [itemId: string]: string;
@@ -1,2 +1,3 @@
1
1
  export { useTreeViewLabel } from "./useTreeViewLabel.js";
2
- export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from "./useTreeViewLabel.types.js";
2
+ export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from "./useTreeViewLabel.types.js";
3
+ export { labelSelectors } from "./useTreeViewLabel.selectors.js";
@@ -1 +1,2 @@
1
- export { useTreeViewLabel } from "./useTreeViewLabel.js";
1
+ export { useTreeViewLabel } from "./useTreeViewLabel.js";
2
+ export { labelSelectors } from "./useTreeViewLabel.selectors.js";
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { useStore } from '@mui/x-internals/store';
4
5
  import { useTreeViewContext } from "../../TreeViewProvider/index.js";
5
- import { useSelector } from "../../hooks/useSelector.js";
6
- import { selectorIsItemBeingEdited, selectorIsItemEditable } from "./useTreeViewLabel.selectors.js";
6
+ import { labelSelectors } from "./useTreeViewLabel.selectors.js";
7
7
  export const useTreeViewLabelItemPlugin = ({
8
8
  props
9
9
  }) => {
@@ -15,8 +15,8 @@ export const useTreeViewLabelItemPlugin = ({
15
15
  itemId
16
16
  } = props;
17
17
  const [labelInputValue, setLabelInputValue] = React.useState(label);
18
- const isItemEditable = useSelector(store, selectorIsItemEditable, itemId);
19
- const isItemBeingEdited = useSelector(store, selectorIsItemBeingEdited, itemId);
18
+ const isItemEditable = useStore(store, labelSelectors.isItemEditable, itemId);
19
+ const isItemBeingEdited = useStore(store, labelSelectors.isItemBeingEdited, itemId);
20
20
  React.useEffect(() => {
21
21
  if (!isItemBeingEdited) {
22
22
  setLabelInputValue(label);
@@ -1,52 +1,44 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
3
3
  import { useTreeViewLabelItemPlugin } from "./useTreeViewLabel.itemPlugin.js";
4
- import { selectorIsItemEditable } from "./useTreeViewLabel.selectors.js";
4
+ import { labelSelectors } from "./useTreeViewLabel.selectors.js";
5
5
  export const useTreeViewLabel = ({
6
6
  store,
7
7
  params
8
8
  }) => {
9
9
  const setEditedItem = editedItemId => {
10
10
  if (editedItemId !== null) {
11
- const isEditable = selectorIsItemEditable(store.value, editedItemId);
11
+ const isEditable = labelSelectors.isItemEditable(store.state, editedItemId);
12
12
  if (!isEditable) {
13
13
  return;
14
14
  }
15
15
  }
16
- store.update(prevState => _extends({}, prevState, {
17
- label: _extends({}, prevState.label, {
18
- editedItemId
19
- })
16
+ store.set('label', _extends({}, store.state.label, {
17
+ editedItemId
20
18
  }));
21
19
  };
22
20
  const updateItemLabel = (itemId, label) => {
23
21
  if (!label) {
24
22
  throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'The label of an item cannot be empty.', itemId].join('\n'));
25
23
  }
26
- store.update(prevState => {
27
- const item = prevState.items.itemMetaLookup[itemId];
28
- if (item.label !== label) {
29
- return _extends({}, prevState, {
30
- items: _extends({}, prevState.items, {
31
- itemMetaLookup: _extends({}, prevState.items.itemMetaLookup, {
32
- [itemId]: _extends({}, item, {
33
- label
34
- })
35
- })
36
- })
37
- });
38
- }
39
- return prevState;
40
- });
24
+ const item = store.state.items.itemMetaLookup[itemId];
25
+ if (item.label === label) {
26
+ return;
27
+ }
28
+ store.set('items', _extends({}, store.state.items, {
29
+ itemMetaLookup: _extends({}, store.state.items.itemMetaLookup, {
30
+ [itemId]: _extends({}, item, {
31
+ label
32
+ })
33
+ })
34
+ }));
41
35
  if (params.onItemLabelChange) {
42
36
  params.onItemLabelChange(itemId, label);
43
37
  }
44
38
  };
45
39
  useEnhancedEffect(() => {
46
- store.update(prevState => _extends({}, prevState, {
47
- label: _extends({}, prevState.label, {
48
- isItemEditable: params.isItemEditable
49
- })
40
+ store.set('label', _extends({}, store.state.items, {
41
+ isItemEditable: params.isItemEditable
50
42
  }));
51
43
  }, [store, params.isItemEditable]);
52
44
  return {