@mui/x-tree-view 8.0.0-alpha.0 → 8.0.0-alpha.10

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 (164) hide show
  1. package/CHANGELOG.md +2215 -119
  2. package/README.md +3 -3
  3. package/RichTreeView/RichTreeView.js +2 -4
  4. package/RichTreeView/RichTreeView.types.d.ts +6 -19
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -3
  6. package/TreeItem/TreeItem.d.ts +1 -1
  7. package/TreeItem/TreeItem.js +4 -4
  8. package/TreeItem/TreeItem.types.d.ts +4 -2
  9. package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  10. package/TreeItemIcon/TreeItemIcon.types.d.ts +1 -1
  11. package/TreeItemProvider/TreeItemProvider.d.ts +2 -4
  12. package/TreeItemProvider/TreeItemProvider.js +26 -11
  13. package/TreeItemProvider/TreeItemProvider.types.d.ts +1 -0
  14. package/hooks/index.d.ts +1 -0
  15. package/hooks/index.js +2 -1
  16. package/hooks/useTreeItemModel.d.ts +2 -0
  17. package/hooks/useTreeItemModel.js +11 -0
  18. package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +6 -5
  19. package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  20. package/hooks/useTreeViewApiRef.d.ts +2 -1
  21. package/index.js +1 -1
  22. package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
  23. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
  24. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  25. package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  26. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -3
  27. package/internals/components/RichTreeViewItems.d.ts +3 -5
  28. package/internals/components/RichTreeViewItems.js +42 -30
  29. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  30. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
  31. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  32. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
  33. package/internals/hooks/useInstanceEventHandler.js +1 -1
  34. package/internals/hooks/useSelector.d.ts +4 -0
  35. package/internals/hooks/useSelector.js +6 -0
  36. package/internals/index.d.ts +6 -1
  37. package/internals/index.js +5 -1
  38. package/internals/models/itemPlugin.d.ts +7 -7
  39. package/internals/models/plugin.d.ts +22 -10
  40. package/internals/models/treeView.d.ts +6 -0
  41. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
  42. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +180 -0
  43. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
  44. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -18
  45. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +4 -0
  46. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
  47. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  48. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
  49. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  50. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
  51. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  52. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  53. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  54. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  55. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +886 -0
  56. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  57. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +36 -55
  58. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  59. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  60. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  61. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  62. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
  63. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  64. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +7 -24
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  67. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
  68. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  69. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
  70. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +6 -6
  71. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  72. package/internals/useTreeView/useTreeView.d.ts +1 -1
  73. package/internals/useTreeView/useTreeView.js +30 -17
  74. package/internals/useTreeView/useTreeView.types.d.ts +3 -4
  75. package/internals/useTreeView/useTreeViewBuildContext.d.ts +4 -2
  76. package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  77. package/internals/utils/TreeViewStore.d.ts +12 -0
  78. package/internals/utils/TreeViewStore.js +24 -0
  79. package/internals/utils/selectors.d.ts +9 -0
  80. package/internals/utils/selectors.js +37 -0
  81. package/internals/utils/tree.d.ts +8 -8
  82. package/internals/utils/tree.js +51 -43
  83. package/models/items.d.ts +3 -2
  84. package/modern/RichTreeView/RichTreeView.js +2 -4
  85. package/modern/TreeItem/TreeItem.js +4 -4
  86. package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  87. package/modern/TreeItemProvider/TreeItemProvider.js +26 -11
  88. package/modern/hooks/index.js +2 -1
  89. package/modern/hooks/useTreeItemModel.js +11 -0
  90. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  91. package/modern/index.js +1 -1
  92. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  93. package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  94. package/modern/internals/components/RichTreeViewItems.js +42 -30
  95. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  96. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  97. package/modern/internals/hooks/useInstanceEventHandler.js +1 -1
  98. package/modern/internals/hooks/useSelector.js +6 -0
  99. package/modern/internals/index.js +5 -1
  100. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
  101. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
  102. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
  103. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  104. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  105. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  106. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  107. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  108. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  109. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  110. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  111. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  112. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  113. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  114. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  115. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  116. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  117. package/modern/internals/useTreeView/useTreeView.js +30 -17
  118. package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  119. package/modern/internals/utils/TreeViewStore.js +24 -0
  120. package/modern/internals/utils/selectors.js +37 -0
  121. package/modern/internals/utils/tree.js +51 -43
  122. package/modern/useTreeItem/useTreeItem.js +29 -16
  123. package/node/RichTreeView/RichTreeView.js +2 -4
  124. package/node/TreeItem/TreeItem.js +4 -4
  125. package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
  126. package/node/TreeItemProvider/TreeItemProvider.js +26 -10
  127. package/node/hooks/index.js +8 -1
  128. package/node/hooks/useTreeItemModel.js +17 -0
  129. package/node/hooks/useTreeItemUtils/useTreeItemUtils.js +32 -15
  130. package/node/index.js +1 -1
  131. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  132. package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  133. package/node/internals/components/RichTreeViewItems.js +42 -30
  134. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
  135. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
  136. package/node/internals/hooks/useInstanceEventHandler.js +1 -1
  137. package/node/internals/hooks/useSelector.js +13 -0
  138. package/node/internals/index.js +47 -1
  139. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -31
  140. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +30 -0
  141. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +27 -0
  142. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  143. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
  144. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
  145. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -100
  146. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
  147. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
  148. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  149. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  150. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  151. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
  152. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  153. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +46 -35
  154. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
  155. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +24 -14
  156. package/node/internals/useTreeView/useTreeView.js +30 -17
  157. package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
  158. package/node/internals/utils/TreeViewStore.js +31 -0
  159. package/node/internals/utils/selectors.js +44 -0
  160. package/node/internals/utils/tree.js +51 -43
  161. package/node/useTreeItem/useTreeItem.js +29 -16
  162. package/package.json +8 -6
  163. package/useTreeItem/useTreeItem.js +29 -16
  164. package/useTreeItem/useTreeItem.types.d.ts +10 -1
@@ -4,10 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isTargetInDescendants = exports.getPreviousNavigableItem = exports.getNonDisabledItemsInRange = exports.getNextNavigableItem = exports.getLastNavigableItem = exports.getFirstNavigableItem = exports.getAllNavigableItems = exports.findOrderInTremauxTree = void 0;
7
- const getLastNavigableItemInArray = (instance, items) => {
7
+ var _useTreeViewExpansion = require("../plugins/useTreeViewExpansion/useTreeViewExpansion.selectors");
8
+ var _useTreeViewItems = require("../plugins/useTreeViewItems/useTreeViewItems.selectors");
9
+ const getLastNavigableItemInArray = (state, items) => {
8
10
  // Equivalent to Array.prototype.findLastIndex
9
11
  let itemIndex = items.length - 1;
10
- while (itemIndex >= 0 && !instance.isItemNavigable(items[itemIndex])) {
12
+ while (itemIndex >= 0 && !(0, _useTreeViewItems.selectorCanItemBeFocused)(state, items[itemIndex])) {
11
13
  itemIndex -= 1;
12
14
  }
13
15
  if (itemIndex === -1) {
@@ -15,10 +17,13 @@ const getLastNavigableItemInArray = (instance, items) => {
15
17
  }
16
18
  return items[itemIndex];
17
19
  };
18
- const getPreviousNavigableItem = (instance, itemId) => {
19
- const itemMeta = instance.getItemMeta(itemId);
20
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
21
- const itemIndex = instance.getItemIndex(itemId);
20
+ const getPreviousNavigableItem = (state, itemId) => {
21
+ const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
22
+ if (!itemMeta) {
23
+ return null;
24
+ }
25
+ const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
26
+ const itemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemId);
22
27
 
23
28
  // TODO: What should we do if the parent is not navigable?
24
29
  if (itemIndex === 0) {
@@ -27,7 +32,7 @@ const getPreviousNavigableItem = (instance, itemId) => {
27
32
 
28
33
  // Finds the previous navigable sibling.
29
34
  let previousNavigableSiblingIndex = itemIndex - 1;
30
- while (!instance.isItemNavigable(siblings[previousNavigableSiblingIndex]) && previousNavigableSiblingIndex >= 0) {
35
+ while (!(0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[previousNavigableSiblingIndex]) && previousNavigableSiblingIndex >= 0) {
31
36
  previousNavigableSiblingIndex -= 1;
32
37
  }
33
38
  if (previousNavigableSiblingIndex === -1) {
@@ -37,53 +42,53 @@ const getPreviousNavigableItem = (instance, itemId) => {
37
42
  }
38
43
 
39
44
  // Otherwise, we can try to go up a level and find the previous navigable item.
40
- return getPreviousNavigableItem(instance, itemMeta.parentId);
45
+ return getPreviousNavigableItem(state, itemMeta.parentId);
41
46
  }
42
47
 
43
48
  // Finds the last navigable ancestor of the previous navigable sibling.
44
49
  let currentItemId = siblings[previousNavigableSiblingIndex];
45
- let lastNavigableChild = getLastNavigableItemInArray(instance, instance.getItemOrderedChildrenIds(currentItemId));
46
- while (instance.isItemExpanded(currentItemId) && lastNavigableChild != null) {
50
+ let lastNavigableChild = getLastNavigableItemInArray(state, (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, currentItemId));
51
+ while ((0, _useTreeViewExpansion.selectorIsItemExpanded)(state, currentItemId) && lastNavigableChild != null) {
47
52
  currentItemId = lastNavigableChild;
48
- lastNavigableChild = instance.getItemOrderedChildrenIds(currentItemId).find(instance.isItemNavigable);
53
+ lastNavigableChild = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, currentItemId).find(childId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, childId));
49
54
  }
50
55
  return currentItemId;
51
56
  };
52
57
  exports.getPreviousNavigableItem = getPreviousNavigableItem;
53
- const getNextNavigableItem = (instance, itemId) => {
58
+ const getNextNavigableItem = (state, itemId) => {
54
59
  // If the item is expanded and has some navigable children, return the first of them.
55
- if (instance.isItemExpanded(itemId)) {
56
- const firstNavigableChild = instance.getItemOrderedChildrenIds(itemId).find(instance.isItemNavigable);
60
+ if ((0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
61
+ const firstNavigableChild = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId).find(childId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, childId));
57
62
  if (firstNavigableChild != null) {
58
63
  return firstNavigableChild;
59
64
  }
60
65
  }
61
- let itemMeta = instance.getItemMeta(itemId);
66
+ let itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
62
67
  while (itemMeta != null) {
63
68
  // Try to find the first navigable sibling after the current item.
64
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
65
- const currentItemIndex = instance.getItemIndex(itemMeta.id);
69
+ const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
70
+ const currentItemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemMeta.id);
66
71
  if (currentItemIndex < siblings.length - 1) {
67
72
  let nextItemIndex = currentItemIndex + 1;
68
- while (!instance.isItemNavigable(siblings[nextItemIndex]) && nextItemIndex < siblings.length - 1) {
73
+ while (!(0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[nextItemIndex]) && nextItemIndex < siblings.length - 1) {
69
74
  nextItemIndex += 1;
70
75
  }
71
- if (instance.isItemNavigable(siblings[nextItemIndex])) {
76
+ if ((0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[nextItemIndex])) {
72
77
  return siblings[nextItemIndex];
73
78
  }
74
79
  }
75
80
 
76
81
  // If the sibling does not exist, go up a level to the parent and try again.
77
- itemMeta = instance.getItemMeta(itemMeta.parentId);
82
+ itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemMeta.parentId);
78
83
  }
79
84
  return null;
80
85
  };
81
86
  exports.getNextNavigableItem = getNextNavigableItem;
82
- const getLastNavigableItem = instance => {
87
+ const getLastNavigableItem = state => {
83
88
  let itemId = null;
84
- while (itemId == null || instance.isItemExpanded(itemId)) {
85
- const children = instance.getItemOrderedChildrenIds(itemId);
86
- const lastNavigableChild = getLastNavigableItemInArray(instance, children);
89
+ while (itemId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
90
+ const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId);
91
+ const lastNavigableChild = getLastNavigableItemInArray(state, children);
87
92
 
88
93
  // The item has no navigable children.
89
94
  if (lastNavigableChild == null) {
@@ -94,7 +99,7 @@ const getLastNavigableItem = instance => {
94
99
  return itemId;
95
100
  };
96
101
  exports.getLastNavigableItem = getLastNavigableItem;
97
- const getFirstNavigableItem = instance => instance.getItemOrderedChildrenIds(null).find(instance.isItemNavigable);
102
+ const getFirstNavigableItem = state => (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, null).find(itemId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, itemId));
98
103
 
99
104
  /**
100
105
  * This is used to determine the start and end of a selection range so
@@ -111,12 +116,15 @@ const getFirstNavigableItem = instance => instance.getItemOrderedChildrenIds(nul
111
116
  * https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree
112
117
  */
113
118
  exports.getFirstNavigableItem = getFirstNavigableItem;
114
- const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
119
+ const findOrderInTremauxTree = (state, itemAId, itemBId) => {
115
120
  if (itemAId === itemBId) {
116
121
  return [itemAId, itemBId];
117
122
  }
118
- const itemMetaA = instance.getItemMeta(itemAId);
119
- const itemMetaB = instance.getItemMeta(itemBId);
123
+ const itemMetaA = (0, _useTreeViewItems.selectorItemMeta)(state, itemAId);
124
+ const itemMetaB = (0, _useTreeViewItems.selectorItemMeta)(state, itemBId);
125
+ if (!itemMetaA || !itemMetaB) {
126
+ return [itemAId, itemBId];
127
+ }
120
128
  if (itemMetaA.parentId === itemMetaB.id || itemMetaB.parentId === itemMetaA.id) {
121
129
  return itemMetaB.parentId === itemMetaA.id ? [itemMetaA.id, itemMetaB.id] : [itemMetaB.id, itemMetaA.id];
122
130
  }
@@ -134,7 +142,7 @@ const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
134
142
  aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
135
143
  continueA = aAncestor !== null;
136
144
  if (!aAncestorIsCommon && continueA) {
137
- aAncestor = instance.getItemMeta(aAncestor).parentId;
145
+ aAncestor = (0, _useTreeViewItems.selectorItemParentId)(state, aAncestor);
138
146
  }
139
147
  }
140
148
  if (continueB && !aAncestorIsCommon) {
@@ -142,55 +150,55 @@ const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
142
150
  bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
143
151
  continueB = bAncestor !== null;
144
152
  if (!bAncestorIsCommon && continueB) {
145
- bAncestor = instance.getItemMeta(bAncestor).parentId;
153
+ bAncestor = (0, _useTreeViewItems.selectorItemParentId)(state, bAncestor);
146
154
  }
147
155
  }
148
156
  }
149
157
  const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
150
- const ancestorFamily = instance.getItemOrderedChildrenIds(commonAncestor);
158
+ const ancestorFamily = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, commonAncestor);
151
159
  const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
152
160
  const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
153
161
  return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [itemAId, itemBId] : [itemBId, itemAId];
154
162
  };
155
163
  exports.findOrderInTremauxTree = findOrderInTremauxTree;
156
- const getNonDisabledItemsInRange = (instance, itemAId, itemBId) => {
164
+ const getNonDisabledItemsInRange = (state, itemAId, itemBId) => {
157
165
  const getNextItem = itemId => {
158
166
  // If the item is expanded and has some children, return the first of them.
159
- if (instance.isItemExpandable(itemId) && instance.isItemExpanded(itemId)) {
160
- return instance.getItemOrderedChildrenIds(itemId)[0];
167
+ if ((0, _useTreeViewExpansion.selectorIsItemExpandable)(state, itemId) && (0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
168
+ return (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId)[0];
161
169
  }
162
- let itemMeta = instance.getItemMeta(itemId);
170
+ let itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
163
171
  while (itemMeta != null) {
164
172
  // Try to find the first navigable sibling after the current item.
165
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
166
- const currentItemIndex = instance.getItemIndex(itemMeta.id);
173
+ const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
174
+ const currentItemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemMeta.id);
167
175
  if (currentItemIndex < siblings.length - 1) {
168
176
  return siblings[currentItemIndex + 1];
169
177
  }
170
178
 
171
179
  // If the item is the last of its siblings, go up a level to the parent and try again.
172
- itemMeta = instance.getItemMeta(itemMeta.parentId);
180
+ itemMeta = itemMeta.parentId ? (0, _useTreeViewItems.selectorItemMeta)(state, itemMeta.parentId) : null;
173
181
  }
174
182
  throw new Error('Invalid range');
175
183
  };
176
- const [first, last] = findOrderInTremauxTree(instance, itemAId, itemBId);
184
+ const [first, last] = findOrderInTremauxTree(state, itemAId, itemBId);
177
185
  const items = [first];
178
186
  let current = first;
179
187
  while (current !== last) {
180
188
  current = getNextItem(current);
181
- if (!instance.isItemDisabled(current)) {
189
+ if (!(0, _useTreeViewItems.selectorIsItemDisabled)(state, current)) {
182
190
  items.push(current);
183
191
  }
184
192
  }
185
193
  return items;
186
194
  };
187
195
  exports.getNonDisabledItemsInRange = getNonDisabledItemsInRange;
188
- const getAllNavigableItems = instance => {
189
- let item = getFirstNavigableItem(instance);
196
+ const getAllNavigableItems = state => {
197
+ let item = getFirstNavigableItem(state);
190
198
  const navigableItems = [];
191
199
  while (item != null) {
192
200
  navigableItems.push(item);
193
- item = getNextNavigableItem(instance, item);
201
+ item = getNextNavigableItem(state, item);
194
202
  }
195
203
  return navigableItems;
196
204
  };
@@ -15,26 +15,34 @@ var _TreeViewProvider = require("../internals/TreeViewProvider");
15
15
  var _useTreeItemUtils = require("../hooks/useTreeItemUtils");
16
16
  var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
17
17
  var _tree = require("../internals/utils/tree");
18
+ var _useSelector = require("../internals/hooks/useSelector");
19
+ var _useTreeViewFocus = require("../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors");
18
20
  var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
21
+ var _useTreeViewItems = require("../internals/plugins/useTreeViewItems/useTreeViewItems.selectors");
22
+ var _useTreeViewId2 = require("../internals/corePlugins/useTreeViewId/useTreeViewId.selectors");
23
+ var _useTreeViewExpansion = require("../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors");
19
24
  const useTreeItem = parameters => {
20
25
  const {
21
26
  runItemPlugins,
22
27
  items: {
23
- onItemClick,
24
- disabledItemsFocusable
28
+ onItemClick
25
29
  },
26
30
  selection: {
27
31
  disableSelection,
28
32
  checkboxSelection
29
33
  },
30
- expansion: {
31
- expansionTrigger
32
- },
33
- treeId,
34
+ label: labelContext,
34
35
  instance,
35
- publicAPI
36
+ publicAPI,
37
+ store
36
38
  } = (0, _TreeViewProvider.useTreeViewContext)();
37
39
  const depthContext = React.useContext(_TreeViewItemDepthContext.TreeViewItemDepthContext);
40
+ const depth = (0, _useSelector.useSelector)(store, (...params) => {
41
+ if (typeof depthContext === 'function') {
42
+ return depthContext(...params);
43
+ }
44
+ return depthContext;
45
+ }, parameters.itemId);
38
46
  const {
39
47
  id,
40
48
  itemId,
@@ -59,12 +67,13 @@ const useTreeItem = parameters => {
59
67
  const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef, rootRefObject);
60
68
  const handleContentRef = (0, _useForkRef.default)(contentRef, contentRefObject);
61
69
  const checkboxRef = React.useRef(null);
70
+ const treeId = (0, _useSelector.useSelector)(store, _useTreeViewId2.selectorTreeViewId);
62
71
  const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
63
72
  itemId,
64
73
  treeId,
65
74
  id
66
75
  });
67
- const rootTabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
76
+ const shouldBeAccessibleWithTab = (0, _useSelector.useSelector)(store, _useTreeViewFocus.selectorIsItemTheDefaultFocusableItem, itemId);
68
77
  const sharedPropsEnhancerParams = {
69
78
  rootRefObject,
70
79
  contentRefObject,
@@ -76,8 +85,7 @@ const useTreeItem = parameters => {
76
85
  if (event.defaultMuiPrevented) {
77
86
  return;
78
87
  }
79
- const canBeFocused = !status.disabled || disabledItemsFocusable;
80
- if (!status.focused && canBeFocused && event.currentTarget === event.target) {
88
+ if (!status.focused && (0, _useTreeViewItems.selectorCanItemBeFocused)(store.value, itemId) && event.currentTarget === event.target) {
81
89
  instance.focusItem(event, itemId);
82
90
  }
83
91
  };
@@ -115,11 +123,11 @@ const useTreeItem = parameters => {
115
123
  };
116
124
  const createContentHandleClick = otherHandlers => event => {
117
125
  otherHandlers.onClick?.(event);
118
- onItemClick?.(event, itemId);
126
+ onItemClick(event, itemId);
119
127
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
120
128
  return;
121
129
  }
122
- if (expansionTrigger === 'content') {
130
+ if ((0, _useTreeViewExpansion.selectorItemExpansionTrigger)(store.value) === 'content') {
123
131
  interactions.handleExpansion(event);
124
132
  }
125
133
  if (!checkboxSelection) {
@@ -142,10 +150,14 @@ const useTreeItem = parameters => {
142
150
  if (event.defaultMuiPrevented) {
143
151
  return;
144
152
  }
145
- if (expansionTrigger === 'iconContainer') {
153
+ if ((0, _useTreeViewExpansion.selectorItemExpansionTrigger)(store.value) === 'iconContainer') {
146
154
  interactions.handleExpansion(event);
147
155
  }
148
156
  };
157
+ const getContextProviderProps = () => ({
158
+ itemId,
159
+ id
160
+ });
149
161
  const getRootProps = (externalProps = {}) => {
150
162
  const externalEventHandlers = (0, _extends2.default)({}, (0, _extractEventHandlers.default)(parameters), (0, _extractEventHandlers.default)(externalProps));
151
163
 
@@ -164,14 +176,14 @@ const useTreeItem = parameters => {
164
176
  const props = (0, _extends2.default)({}, externalEventHandlers, {
165
177
  ref: handleRootRef,
166
178
  role: 'treeitem',
167
- tabIndex: rootTabIndex,
179
+ tabIndex: shouldBeAccessibleWithTab ? 0 : -1,
168
180
  id: idAttribute,
169
181
  'aria-expanded': status.expandable ? status.expanded : undefined,
170
182
  'aria-selected': ariaSelected,
171
183
  'aria-disabled': status.disabled || undefined
172
184
  }, externalProps, {
173
185
  style: (0, _extends2.default)({}, externalProps.style ?? {}, {
174
- '--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
186
+ '--TreeView-itemDepth': depth
175
187
  }),
176
188
  onFocus: createRootHandleFocus(externalEventHandlers),
177
189
  onBlur: createRootHandleBlur(externalEventHandlers),
@@ -212,7 +224,7 @@ const useTreeItem = parameters => {
212
224
  }, externalProps, {
213
225
  onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
214
226
  });
215
- if (instance.isTreeViewEditable) {
227
+ if (labelContext?.isItemEditable) {
216
228
  props.editable = status.editable;
217
229
  }
218
230
  return props;
@@ -249,6 +261,7 @@ const useTreeItem = parameters => {
249
261
  return (0, _extends2.default)({}, externalProps, enhancedDragAndDropOverlayProps);
250
262
  };
251
263
  return {
264
+ getContextProviderProps,
252
265
  getRootProps,
253
266
  getContentProps,
254
267
  getGroupTransitionProps,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "8.0.0-alpha.0",
3
+ "version": "8.0.0-alpha.10",
4
4
  "description": "The community edition of the Tree View components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -33,21 +33,23 @@
33
33
  "directory": "packages/x-tree-view"
34
34
  },
35
35
  "dependencies": {
36
- "@babel/runtime": "^7.26.0",
36
+ "@babel/runtime": "^7.26.7",
37
37
  "@mui/utils": "^5.16.6 || ^6.0.0",
38
- "@types/react-transition-group": "^4.4.11",
38
+ "@types/react-transition-group": "^4.4.12",
39
39
  "clsx": "^2.1.1",
40
40
  "prop-types": "^15.8.1",
41
41
  "react-transition-group": "^4.4.5",
42
- "@mui/x-internals": "8.0.0-alpha.0"
42
+ "reselect": "^5.1.1",
43
+ "use-sync-external-store": "^1.4.0",
44
+ "@mui/x-internals": "8.0.0-alpha.10"
43
45
  },
44
46
  "peerDependencies": {
45
47
  "@emotion/react": "^11.9.0",
46
48
  "@emotion/styled": "^11.8.1",
47
49
  "@mui/material": "^5.15.14 || ^6.0.0",
48
50
  "@mui/system": "^5.15.14 || ^6.0.0",
49
- "react": "^17.0.0 || ^18.0.0",
50
- "react-dom": "^17.0.0 || ^18.0.0"
51
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
52
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
51
53
  },
52
54
  "peerDependenciesMeta": {
53
55
  "@emotion/react": {
@@ -8,26 +8,34 @@ import { useTreeViewContext } from "../internals/TreeViewProvider/index.js";
8
8
  import { useTreeItemUtils } from "../hooks/useTreeItemUtils/index.js";
9
9
  import { TreeViewItemDepthContext } from "../internals/TreeViewItemDepthContext/index.js";
10
10
  import { isTargetInDescendants } from "../internals/utils/tree.js";
11
+ import { useSelector } from "../internals/hooks/useSelector.js";
12
+ import { selectorIsItemTheDefaultFocusableItem } from "../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js";
11
13
  import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
14
+ import { selectorCanItemBeFocused } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
15
+ import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
16
+ import { selectorItemExpansionTrigger } from "../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
12
17
  export const useTreeItem = parameters => {
13
18
  const {
14
19
  runItemPlugins,
15
20
  items: {
16
- onItemClick,
17
- disabledItemsFocusable
21
+ onItemClick
18
22
  },
19
23
  selection: {
20
24
  disableSelection,
21
25
  checkboxSelection
22
26
  },
23
- expansion: {
24
- expansionTrigger
25
- },
26
- treeId,
27
+ label: labelContext,
27
28
  instance,
28
- publicAPI
29
+ publicAPI,
30
+ store
29
31
  } = useTreeViewContext();
30
32
  const depthContext = React.useContext(TreeViewItemDepthContext);
33
+ const depth = useSelector(store, (...params) => {
34
+ if (typeof depthContext === 'function') {
35
+ return depthContext(...params);
36
+ }
37
+ return depthContext;
38
+ }, parameters.itemId);
31
39
  const {
32
40
  id,
33
41
  itemId,
@@ -52,12 +60,13 @@ export const useTreeItem = parameters => {
52
60
  const handleRootRef = useForkRef(rootRef, pluginRootRef, rootRefObject);
53
61
  const handleContentRef = useForkRef(contentRef, contentRefObject);
54
62
  const checkboxRef = React.useRef(null);
63
+ const treeId = useSelector(store, selectorTreeViewId);
55
64
  const idAttribute = generateTreeItemIdAttribute({
56
65
  itemId,
57
66
  treeId,
58
67
  id
59
68
  });
60
- const rootTabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
69
+ const shouldBeAccessibleWithTab = useSelector(store, selectorIsItemTheDefaultFocusableItem, itemId);
61
70
  const sharedPropsEnhancerParams = {
62
71
  rootRefObject,
63
72
  contentRefObject,
@@ -69,8 +78,7 @@ export const useTreeItem = parameters => {
69
78
  if (event.defaultMuiPrevented) {
70
79
  return;
71
80
  }
72
- const canBeFocused = !status.disabled || disabledItemsFocusable;
73
- if (!status.focused && canBeFocused && event.currentTarget === event.target) {
81
+ if (!status.focused && selectorCanItemBeFocused(store.value, itemId) && event.currentTarget === event.target) {
74
82
  instance.focusItem(event, itemId);
75
83
  }
76
84
  };
@@ -108,11 +116,11 @@ export const useTreeItem = parameters => {
108
116
  };
109
117
  const createContentHandleClick = otherHandlers => event => {
110
118
  otherHandlers.onClick?.(event);
111
- onItemClick?.(event, itemId);
119
+ onItemClick(event, itemId);
112
120
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
113
121
  return;
114
122
  }
115
- if (expansionTrigger === 'content') {
123
+ if (selectorItemExpansionTrigger(store.value) === 'content') {
116
124
  interactions.handleExpansion(event);
117
125
  }
118
126
  if (!checkboxSelection) {
@@ -135,10 +143,14 @@ export const useTreeItem = parameters => {
135
143
  if (event.defaultMuiPrevented) {
136
144
  return;
137
145
  }
138
- if (expansionTrigger === 'iconContainer') {
146
+ if (selectorItemExpansionTrigger(store.value) === 'iconContainer') {
139
147
  interactions.handleExpansion(event);
140
148
  }
141
149
  };
150
+ const getContextProviderProps = () => ({
151
+ itemId,
152
+ id
153
+ });
142
154
  const getRootProps = (externalProps = {}) => {
143
155
  const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
144
156
 
@@ -157,14 +169,14 @@ export const useTreeItem = parameters => {
157
169
  const props = _extends({}, externalEventHandlers, {
158
170
  ref: handleRootRef,
159
171
  role: 'treeitem',
160
- tabIndex: rootTabIndex,
172
+ tabIndex: shouldBeAccessibleWithTab ? 0 : -1,
161
173
  id: idAttribute,
162
174
  'aria-expanded': status.expandable ? status.expanded : undefined,
163
175
  'aria-selected': ariaSelected,
164
176
  'aria-disabled': status.disabled || undefined
165
177
  }, externalProps, {
166
178
  style: _extends({}, externalProps.style ?? {}, {
167
- '--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
179
+ '--TreeView-itemDepth': depth
168
180
  }),
169
181
  onFocus: createRootHandleFocus(externalEventHandlers),
170
182
  onBlur: createRootHandleBlur(externalEventHandlers),
@@ -205,7 +217,7 @@ export const useTreeItem = parameters => {
205
217
  }, externalProps, {
206
218
  onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
207
219
  });
208
- if (instance.isTreeViewEditable) {
220
+ if (labelContext?.isItemEditable) {
209
221
  props.editable = status.editable;
210
222
  }
211
223
  return props;
@@ -242,6 +254,7 @@ export const useTreeItem = parameters => {
242
254
  return _extends({}, externalProps, enhancedDragAndDropOverlayProps);
243
255
  };
244
256
  return {
257
+ getContextProviderProps,
245
258
  getRootProps,
246
259
  getContentProps,
247
260
  getGroupTransitionProps,
@@ -32,6 +32,10 @@ export interface UseTreeItemParameters {
32
32
  */
33
33
  children?: React.ReactNode;
34
34
  }
35
+ export interface UseTreeItemContextProviderProps {
36
+ itemId: string;
37
+ id: string | undefined;
38
+ }
35
39
  export interface UseTreeItemRootSlotPropsFromUseTreeItem {
36
40
  role: 'treeitem';
37
41
  tabIndex: 0 | -1;
@@ -74,7 +78,7 @@ export interface UseTreeItemLabelInputSlotOwnProps {
74
78
  }
75
79
  export type UseTreeItemLabelInputSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItemLabelInputSlotOwnProps;
76
80
  export interface UseTreeItemCheckboxSlotOwnProps {
77
- ref: React.RefObject<HTMLButtonElement>;
81
+ ref: React.RefObject<HTMLButtonElement | null>;
78
82
  }
79
83
  export type UseTreeItemCheckboxSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItemCheckboxSlotOwnProps;
80
84
  export interface UseTreeItemGroupTransitionSlotOwnProps {
@@ -98,6 +102,11 @@ export interface UseTreeItemStatus {
98
102
  editable: boolean;
99
103
  }
100
104
  export interface UseTreeItemReturnValue<TSignatures extends UseTreeItemMinimalPlugins, TOptionalSignatures extends UseTreeItemOptionalPlugins> {
105
+ /**
106
+ * Resolver for the context provider's props.
107
+ * @returns {UseTreeItemContextProviderProps} Props that should be spread on the context provider slot.
108
+ */
109
+ getContextProviderProps: () => UseTreeItemContextProviderProps;
101
110
  /**
102
111
  * Resolver for the root slot's props.
103
112
  * @param {ExternalProps} externalProps Additional props for the root slot.