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

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 (159) hide show
  1. package/CHANGELOG.md +651 -6
  2. package/README.md +2 -2
  3. package/RichTreeView/RichTreeView.js +2 -4
  4. package/RichTreeView/RichTreeView.types.d.ts +5 -18
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +2 -2
  6. package/TreeItem/TreeItem.js +4 -4
  7. package/TreeItem/TreeItem.types.d.ts +4 -2
  8. package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  9. package/TreeItemIcon/TreeItemIcon.types.d.ts +1 -1
  10. package/TreeItemProvider/TreeItemProvider.d.ts +2 -4
  11. package/TreeItemProvider/TreeItemProvider.js +26 -11
  12. package/TreeItemProvider/TreeItemProvider.types.d.ts +1 -0
  13. package/hooks/index.d.ts +1 -0
  14. package/hooks/index.js +2 -1
  15. package/hooks/useTreeItemModel.d.ts +2 -0
  16. package/hooks/useTreeItemModel.js +11 -0
  17. package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +2 -1
  18. package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  19. package/hooks/useTreeViewApiRef.d.ts +1 -0
  20. package/index.js +1 -1
  21. package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
  22. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
  23. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  24. package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  25. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  26. package/internals/components/RichTreeViewItems.d.ts +3 -5
  27. package/internals/components/RichTreeViewItems.js +42 -30
  28. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  29. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
  30. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  31. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
  32. package/internals/hooks/useSelector.d.ts +4 -0
  33. package/internals/hooks/useSelector.js +6 -0
  34. package/internals/index.d.ts +6 -1
  35. package/internals/index.js +5 -1
  36. package/internals/models/itemPlugin.d.ts +5 -5
  37. package/internals/models/plugin.d.ts +20 -8
  38. package/internals/models/treeView.d.ts +6 -0
  39. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  40. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +124 -0
  41. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
  42. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -14
  43. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +1 -0
  44. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
  45. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  46. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
  47. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  48. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
  49. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  50. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  51. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  52. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  53. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +718 -0
  54. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  55. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +15 -52
  56. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  57. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  58. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  59. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  60. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
  61. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  62. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +7 -24
  63. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +8 -6
  64. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  67. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
  68. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +6 -6
  69. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  70. package/internals/useTreeView/useTreeView.js +30 -17
  71. package/internals/useTreeView/useTreeView.types.d.ts +2 -3
  72. package/internals/useTreeView/useTreeViewBuildContext.d.ts +3 -1
  73. package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  74. package/internals/utils/TreeViewStore.d.ts +12 -0
  75. package/internals/utils/TreeViewStore.js +24 -0
  76. package/internals/utils/selectors.d.ts +9 -0
  77. package/internals/utils/selectors.js +37 -0
  78. package/internals/utils/tree.d.ts +8 -8
  79. package/internals/utils/tree.js +51 -43
  80. package/models/items.d.ts +3 -2
  81. package/modern/RichTreeView/RichTreeView.js +2 -4
  82. package/modern/TreeItem/TreeItem.js +4 -4
  83. package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  84. package/modern/TreeItemProvider/TreeItemProvider.js +26 -11
  85. package/modern/hooks/index.js +2 -1
  86. package/modern/hooks/useTreeItemModel.js +11 -0
  87. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  88. package/modern/index.js +1 -1
  89. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  90. package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  91. package/modern/internals/components/RichTreeViewItems.js +42 -30
  92. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  93. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  94. package/modern/internals/hooks/useSelector.js +6 -0
  95. package/modern/internals/index.js +5 -1
  96. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  97. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
  98. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
  99. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  100. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  101. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  102. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  103. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  104. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  105. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  106. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  107. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  108. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  109. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +8 -6
  110. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  111. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  112. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  113. package/modern/internals/useTreeView/useTreeView.js +30 -17
  114. package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  115. package/modern/internals/utils/TreeViewStore.js +24 -0
  116. package/modern/internals/utils/selectors.js +37 -0
  117. package/modern/internals/utils/tree.js +51 -43
  118. package/modern/useTreeItem/useTreeItem.js +26 -11
  119. package/node/RichTreeView/RichTreeView.js +2 -4
  120. package/node/TreeItem/TreeItem.js +4 -4
  121. package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
  122. package/node/TreeItemProvider/TreeItemProvider.js +26 -10
  123. package/node/hooks/index.js +8 -1
  124. package/node/hooks/useTreeItemModel.js +17 -0
  125. package/node/hooks/useTreeItemUtils/useTreeItemUtils.js +32 -15
  126. package/node/index.js +1 -1
  127. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  128. package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  129. package/node/internals/components/RichTreeViewItems.js +42 -30
  130. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
  131. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
  132. package/node/internals/hooks/useSelector.js +13 -0
  133. package/node/internals/index.js +47 -1
  134. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  135. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +23 -0
  136. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +14 -0
  137. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  138. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
  139. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
  140. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -100
  141. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
  142. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
  143. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  144. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  145. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  146. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
  147. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +8 -6
  148. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +46 -35
  149. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
  150. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +24 -14
  151. package/node/internals/useTreeView/useTreeView.js +30 -17
  152. package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
  153. package/node/internals/utils/TreeViewStore.js +31 -0
  154. package/node/internals/utils/selectors.js +44 -0
  155. package/node/internals/utils/tree.js +51 -43
  156. package/node/useTreeItem/useTreeItem.js +26 -11
  157. package/package.json +6 -4
  158. package/useTreeItem/useTreeItem.js +26 -11
  159. package/useTreeItem/useTreeItem.types.d.ts +9 -0
@@ -1,7 +1,9 @@
1
- const getLastNavigableItemInArray = (instance, items) => {
1
+ import { selectorIsItemExpandable, selectorIsItemExpanded } from "../plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
2
+ import { selectorCanItemBeFocused, selectorIsItemDisabled, selectorItemIndex, selectorItemMeta, selectorItemOrderedChildrenIds, selectorItemParentId } from "../plugins/useTreeViewItems/useTreeViewItems.selectors.js";
3
+ const getLastNavigableItemInArray = (state, items) => {
2
4
  // Equivalent to Array.prototype.findLastIndex
3
5
  let itemIndex = items.length - 1;
4
- while (itemIndex >= 0 && !instance.isItemNavigable(items[itemIndex])) {
6
+ while (itemIndex >= 0 && !selectorCanItemBeFocused(state, items[itemIndex])) {
5
7
  itemIndex -= 1;
6
8
  }
7
9
  if (itemIndex === -1) {
@@ -9,10 +11,13 @@ const getLastNavigableItemInArray = (instance, items) => {
9
11
  }
10
12
  return items[itemIndex];
11
13
  };
12
- export const getPreviousNavigableItem = (instance, itemId) => {
13
- const itemMeta = instance.getItemMeta(itemId);
14
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
15
- const itemIndex = instance.getItemIndex(itemId);
14
+ export const getPreviousNavigableItem = (state, itemId) => {
15
+ const itemMeta = selectorItemMeta(state, itemId);
16
+ if (!itemMeta) {
17
+ return null;
18
+ }
19
+ const siblings = selectorItemOrderedChildrenIds(state, itemMeta.parentId);
20
+ const itemIndex = selectorItemIndex(state, itemId);
16
21
 
17
22
  // TODO: What should we do if the parent is not navigable?
18
23
  if (itemIndex === 0) {
@@ -21,7 +26,7 @@ export const getPreviousNavigableItem = (instance, itemId) => {
21
26
 
22
27
  // Finds the previous navigable sibling.
23
28
  let previousNavigableSiblingIndex = itemIndex - 1;
24
- while (!instance.isItemNavigable(siblings[previousNavigableSiblingIndex]) && previousNavigableSiblingIndex >= 0) {
29
+ while (!selectorCanItemBeFocused(state, siblings[previousNavigableSiblingIndex]) && previousNavigableSiblingIndex >= 0) {
25
30
  previousNavigableSiblingIndex -= 1;
26
31
  }
27
32
  if (previousNavigableSiblingIndex === -1) {
@@ -31,51 +36,51 @@ export const getPreviousNavigableItem = (instance, itemId) => {
31
36
  }
32
37
 
33
38
  // Otherwise, we can try to go up a level and find the previous navigable item.
34
- return getPreviousNavigableItem(instance, itemMeta.parentId);
39
+ return getPreviousNavigableItem(state, itemMeta.parentId);
35
40
  }
36
41
 
37
42
  // Finds the last navigable ancestor of the previous navigable sibling.
38
43
  let currentItemId = siblings[previousNavigableSiblingIndex];
39
- let lastNavigableChild = getLastNavigableItemInArray(instance, instance.getItemOrderedChildrenIds(currentItemId));
40
- while (instance.isItemExpanded(currentItemId) && lastNavigableChild != null) {
44
+ let lastNavigableChild = getLastNavigableItemInArray(state, selectorItemOrderedChildrenIds(state, currentItemId));
45
+ while (selectorIsItemExpanded(state, currentItemId) && lastNavigableChild != null) {
41
46
  currentItemId = lastNavigableChild;
42
- lastNavigableChild = instance.getItemOrderedChildrenIds(currentItemId).find(instance.isItemNavigable);
47
+ lastNavigableChild = selectorItemOrderedChildrenIds(state, currentItemId).find(childId => selectorCanItemBeFocused(state, childId));
43
48
  }
44
49
  return currentItemId;
45
50
  };
46
- export const getNextNavigableItem = (instance, itemId) => {
51
+ export const getNextNavigableItem = (state, itemId) => {
47
52
  // If the item is expanded and has some navigable children, return the first of them.
48
- if (instance.isItemExpanded(itemId)) {
49
- const firstNavigableChild = instance.getItemOrderedChildrenIds(itemId).find(instance.isItemNavigable);
53
+ if (selectorIsItemExpanded(state, itemId)) {
54
+ const firstNavigableChild = selectorItemOrderedChildrenIds(state, itemId).find(childId => selectorCanItemBeFocused(state, childId));
50
55
  if (firstNavigableChild != null) {
51
56
  return firstNavigableChild;
52
57
  }
53
58
  }
54
- let itemMeta = instance.getItemMeta(itemId);
59
+ let itemMeta = selectorItemMeta(state, itemId);
55
60
  while (itemMeta != null) {
56
61
  // Try to find the first navigable sibling after the current item.
57
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
58
- const currentItemIndex = instance.getItemIndex(itemMeta.id);
62
+ const siblings = selectorItemOrderedChildrenIds(state, itemMeta.parentId);
63
+ const currentItemIndex = selectorItemIndex(state, itemMeta.id);
59
64
  if (currentItemIndex < siblings.length - 1) {
60
65
  let nextItemIndex = currentItemIndex + 1;
61
- while (!instance.isItemNavigable(siblings[nextItemIndex]) && nextItemIndex < siblings.length - 1) {
66
+ while (!selectorCanItemBeFocused(state, siblings[nextItemIndex]) && nextItemIndex < siblings.length - 1) {
62
67
  nextItemIndex += 1;
63
68
  }
64
- if (instance.isItemNavigable(siblings[nextItemIndex])) {
69
+ if (selectorCanItemBeFocused(state, siblings[nextItemIndex])) {
65
70
  return siblings[nextItemIndex];
66
71
  }
67
72
  }
68
73
 
69
74
  // If the sibling does not exist, go up a level to the parent and try again.
70
- itemMeta = instance.getItemMeta(itemMeta.parentId);
75
+ itemMeta = selectorItemMeta(state, itemMeta.parentId);
71
76
  }
72
77
  return null;
73
78
  };
74
- export const getLastNavigableItem = instance => {
79
+ export const getLastNavigableItem = state => {
75
80
  let itemId = null;
76
- while (itemId == null || instance.isItemExpanded(itemId)) {
77
- const children = instance.getItemOrderedChildrenIds(itemId);
78
- const lastNavigableChild = getLastNavigableItemInArray(instance, children);
81
+ while (itemId == null || selectorIsItemExpanded(state, itemId)) {
82
+ const children = selectorItemOrderedChildrenIds(state, itemId);
83
+ const lastNavigableChild = getLastNavigableItemInArray(state, children);
79
84
 
80
85
  // The item has no navigable children.
81
86
  if (lastNavigableChild == null) {
@@ -85,7 +90,7 @@ export const getLastNavigableItem = instance => {
85
90
  }
86
91
  return itemId;
87
92
  };
88
- export const getFirstNavigableItem = instance => instance.getItemOrderedChildrenIds(null).find(instance.isItemNavigable);
93
+ export const getFirstNavigableItem = state => selectorItemOrderedChildrenIds(state, null).find(itemId => selectorCanItemBeFocused(state, itemId));
89
94
 
90
95
  /**
91
96
  * This is used to determine the start and end of a selection range so
@@ -101,12 +106,15 @@ export const getFirstNavigableItem = instance => instance.getItemOrderedChildren
101
106
  * Another way to put it is which item is shallower in a trémaux tree
102
107
  * https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree
103
108
  */
104
- export const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
109
+ export const findOrderInTremauxTree = (state, itemAId, itemBId) => {
105
110
  if (itemAId === itemBId) {
106
111
  return [itemAId, itemBId];
107
112
  }
108
- const itemMetaA = instance.getItemMeta(itemAId);
109
- const itemMetaB = instance.getItemMeta(itemBId);
113
+ const itemMetaA = selectorItemMeta(state, itemAId);
114
+ const itemMetaB = selectorItemMeta(state, itemBId);
115
+ if (!itemMetaA || !itemMetaB) {
116
+ return [itemAId, itemBId];
117
+ }
110
118
  if (itemMetaA.parentId === itemMetaB.id || itemMetaB.parentId === itemMetaA.id) {
111
119
  return itemMetaB.parentId === itemMetaA.id ? [itemMetaA.id, itemMetaB.id] : [itemMetaB.id, itemMetaA.id];
112
120
  }
@@ -124,7 +132,7 @@ export const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
124
132
  aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
125
133
  continueA = aAncestor !== null;
126
134
  if (!aAncestorIsCommon && continueA) {
127
- aAncestor = instance.getItemMeta(aAncestor).parentId;
135
+ aAncestor = selectorItemParentId(state, aAncestor);
128
136
  }
129
137
  }
130
138
  if (continueB && !aAncestorIsCommon) {
@@ -132,53 +140,53 @@ export const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
132
140
  bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
133
141
  continueB = bAncestor !== null;
134
142
  if (!bAncestorIsCommon && continueB) {
135
- bAncestor = instance.getItemMeta(bAncestor).parentId;
143
+ bAncestor = selectorItemParentId(state, bAncestor);
136
144
  }
137
145
  }
138
146
  }
139
147
  const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
140
- const ancestorFamily = instance.getItemOrderedChildrenIds(commonAncestor);
148
+ const ancestorFamily = selectorItemOrderedChildrenIds(state, commonAncestor);
141
149
  const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
142
150
  const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
143
151
  return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [itemAId, itemBId] : [itemBId, itemAId];
144
152
  };
145
- export const getNonDisabledItemsInRange = (instance, itemAId, itemBId) => {
153
+ export const getNonDisabledItemsInRange = (state, itemAId, itemBId) => {
146
154
  const getNextItem = itemId => {
147
155
  // If the item is expanded and has some children, return the first of them.
148
- if (instance.isItemExpandable(itemId) && instance.isItemExpanded(itemId)) {
149
- return instance.getItemOrderedChildrenIds(itemId)[0];
156
+ if (selectorIsItemExpandable(state, itemId) && selectorIsItemExpanded(state, itemId)) {
157
+ return selectorItemOrderedChildrenIds(state, itemId)[0];
150
158
  }
151
- let itemMeta = instance.getItemMeta(itemId);
159
+ let itemMeta = selectorItemMeta(state, itemId);
152
160
  while (itemMeta != null) {
153
161
  // Try to find the first navigable sibling after the current item.
154
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
155
- const currentItemIndex = instance.getItemIndex(itemMeta.id);
162
+ const siblings = selectorItemOrderedChildrenIds(state, itemMeta.parentId);
163
+ const currentItemIndex = selectorItemIndex(state, itemMeta.id);
156
164
  if (currentItemIndex < siblings.length - 1) {
157
165
  return siblings[currentItemIndex + 1];
158
166
  }
159
167
 
160
168
  // If the item is the last of its siblings, go up a level to the parent and try again.
161
- itemMeta = instance.getItemMeta(itemMeta.parentId);
169
+ itemMeta = itemMeta.parentId ? selectorItemMeta(state, itemMeta.parentId) : null;
162
170
  }
163
171
  throw new Error('Invalid range');
164
172
  };
165
- const [first, last] = findOrderInTremauxTree(instance, itemAId, itemBId);
173
+ const [first, last] = findOrderInTremauxTree(state, itemAId, itemBId);
166
174
  const items = [first];
167
175
  let current = first;
168
176
  while (current !== last) {
169
177
  current = getNextItem(current);
170
- if (!instance.isItemDisabled(current)) {
178
+ if (!selectorIsItemDisabled(state, current)) {
171
179
  items.push(current);
172
180
  }
173
181
  }
174
182
  return items;
175
183
  };
176
- export const getAllNavigableItems = instance => {
177
- let item = getFirstNavigableItem(instance);
184
+ export const getAllNavigableItems = state => {
185
+ let item = getFirstNavigableItem(state);
178
186
  const navigableItems = [];
179
187
  while (item != null) {
180
188
  navigableItems.push(item);
181
- item = getNextNavigableItem(instance, item);
189
+ item = getNextNavigableItem(state, item);
182
190
  }
183
191
  return navigableItems;
184
192
  };
@@ -8,13 +8,16 @@ 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";
12
16
  export const useTreeItem = parameters => {
13
17
  const {
14
18
  runItemPlugins,
15
19
  items: {
16
- onItemClick,
17
- disabledItemsFocusable
20
+ onItemClick
18
21
  },
19
22
  selection: {
20
23
  disableSelection,
@@ -23,11 +26,18 @@ export const useTreeItem = parameters => {
23
26
  expansion: {
24
27
  expansionTrigger
25
28
  },
26
- treeId,
29
+ label: labelContext,
27
30
  instance,
28
- publicAPI
31
+ publicAPI,
32
+ store
29
33
  } = useTreeViewContext();
30
34
  const depthContext = React.useContext(TreeViewItemDepthContext);
35
+ const depth = useSelector(store, (...params) => {
36
+ if (typeof depthContext === 'function') {
37
+ return depthContext(...params);
38
+ }
39
+ return depthContext;
40
+ }, parameters.itemId);
31
41
  const {
32
42
  id,
33
43
  itemId,
@@ -52,12 +62,13 @@ export const useTreeItem = parameters => {
52
62
  const handleRootRef = useForkRef(rootRef, pluginRootRef, rootRefObject);
53
63
  const handleContentRef = useForkRef(contentRef, contentRefObject);
54
64
  const checkboxRef = React.useRef(null);
65
+ const treeId = useSelector(store, selectorTreeViewId);
55
66
  const idAttribute = generateTreeItemIdAttribute({
56
67
  itemId,
57
68
  treeId,
58
69
  id
59
70
  });
60
- const rootTabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
71
+ const shouldBeAccessibleWithTab = useSelector(store, selectorIsItemTheDefaultFocusableItem, itemId);
61
72
  const sharedPropsEnhancerParams = {
62
73
  rootRefObject,
63
74
  contentRefObject,
@@ -69,8 +80,7 @@ export const useTreeItem = parameters => {
69
80
  if (event.defaultMuiPrevented) {
70
81
  return;
71
82
  }
72
- const canBeFocused = !status.disabled || disabledItemsFocusable;
73
- if (!status.focused && canBeFocused && event.currentTarget === event.target) {
83
+ if (!status.focused && selectorCanItemBeFocused(store.value, itemId) && event.currentTarget === event.target) {
74
84
  instance.focusItem(event, itemId);
75
85
  }
76
86
  };
@@ -108,7 +118,7 @@ export const useTreeItem = parameters => {
108
118
  };
109
119
  const createContentHandleClick = otherHandlers => event => {
110
120
  otherHandlers.onClick?.(event);
111
- onItemClick?.(event, itemId);
121
+ onItemClick(event, itemId);
112
122
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
113
123
  return;
114
124
  }
@@ -139,6 +149,10 @@ export const useTreeItem = parameters => {
139
149
  interactions.handleExpansion(event);
140
150
  }
141
151
  };
152
+ const getContextProviderProps = () => ({
153
+ itemId,
154
+ id
155
+ });
142
156
  const getRootProps = (externalProps = {}) => {
143
157
  const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
144
158
 
@@ -157,14 +171,14 @@ export const useTreeItem = parameters => {
157
171
  const props = _extends({}, externalEventHandlers, {
158
172
  ref: handleRootRef,
159
173
  role: 'treeitem',
160
- tabIndex: rootTabIndex,
174
+ tabIndex: shouldBeAccessibleWithTab ? 0 : -1,
161
175
  id: idAttribute,
162
176
  'aria-expanded': status.expandable ? status.expanded : undefined,
163
177
  'aria-selected': ariaSelected,
164
178
  'aria-disabled': status.disabled || undefined
165
179
  }, externalProps, {
166
180
  style: _extends({}, externalProps.style ?? {}, {
167
- '--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
181
+ '--TreeView-itemDepth': depth
168
182
  }),
169
183
  onFocus: createRootHandleFocus(externalEventHandlers),
170
184
  onBlur: createRootHandleBlur(externalEventHandlers),
@@ -205,7 +219,7 @@ export const useTreeItem = parameters => {
205
219
  }, externalProps, {
206
220
  onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
207
221
  });
208
- if (instance.isTreeViewEditable) {
222
+ if (labelContext?.isItemEditable) {
209
223
  props.editable = status.editable;
210
224
  }
211
225
  return props;
@@ -242,6 +256,7 @@ export const useTreeItem = parameters => {
242
256
  return _extends({}, externalProps, enhancedDragAndDropOverlayProps);
243
257
  };
244
258
  return {
259
+ getContextProviderProps,
245
260
  getRootProps,
246
261
  getContentProps,
247
262
  getGroupTransitionProps,
@@ -63,8 +63,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
63
63
  }
64
64
  const {
65
65
  getRootProps,
66
- contextValue,
67
- instance
66
+ contextValue
68
67
  } = (0, _useTreeView.useTreeView)({
69
68
  plugins: _RichTreeView.RICH_TREE_VIEW_PLUGINS,
70
69
  rootRef: ref,
@@ -88,8 +87,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
88
87
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Root, (0, _extends2.default)({}, rootProps, {
89
88
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RichTreeViewItems.RichTreeViewItems, {
90
89
  slots: slots,
91
- slotProps: slotProps,
92
- itemsToRender: instance.getItemsToRender()
90
+ slotProps: slotProps
93
91
  })
94
92
  }))
95
93
  });
@@ -217,6 +217,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
217
217
  } = props,
218
218
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded2);
219
219
  const {
220
+ getContextProviderProps,
220
221
  getRootProps,
221
222
  getContentProps,
222
223
  getIconContainerProps,
@@ -303,8 +304,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
303
304
  ownerState: {},
304
305
  className: classes.dragAndDropOverlay
305
306
  });
306
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItemProvider.TreeItemProvider, {
307
- itemId: itemId,
307
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItemProvider.TreeItemProvider, (0, _extends2.default)({}, getContextProviderProps(), {
308
308
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, (0, _extends2.default)({}, rootProps, {
309
309
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Content, (0, _extends2.default)({}, contentProps, {
310
310
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(IconContainer, (0, _extends2.default)({}, iconContainerProps, {
@@ -318,7 +318,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
318
318
  as: GroupTransition
319
319
  }, groupTransitionProps))]
320
320
  }))
321
- });
321
+ }));
322
322
  });
323
323
  process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
324
324
  // ----------------------------- Warning --------------------------------
@@ -328,7 +328,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
328
328
  /**
329
329
  * The content of the component.
330
330
  */
331
- children: _propTypes.default.node,
331
+ children: _propTypes.default /* @typescript-to-proptypes-ignore */.any,
332
332
  /**
333
333
  * Override or extend the styles applied to the component.
334
334
  */
@@ -11,14 +11,14 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
  var _styles = require("@mui/material/styles");
14
- var _system = require("@mui/system");
14
+ var _createStyled = require("@mui/system/createStyled");
15
15
  var _zeroStyled = require("../internals/zero-styled");
16
16
  var _jsxRuntime = require("react/jsx-runtime");
17
17
  const TreeItemDragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
18
18
  name: 'MuiTreeItemDragAndDropOverlay',
19
19
  slot: 'Root',
20
20
  overridesResolver: (props, styles) => styles.root,
21
- shouldForwardProp: prop => (0, _system.shouldForwardProp)(prop) && prop !== 'action'
21
+ shouldForwardProp: prop => (0, _createStyled.shouldForwardProp)(prop) && prop !== 'action'
22
22
  })(({
23
23
  theme
24
24
  }) => ({
@@ -1,35 +1,51 @@
1
1
  "use strict";
2
+ 'use client';
2
3
 
3
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
6
  Object.defineProperty(exports, "__esModule", {
5
7
  value: true
6
8
  });
7
9
  exports.TreeItemProvider = TreeItemProvider;
10
+ var React = _interopRequireWildcard(require("react"));
8
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
12
  var _TreeViewProvider = require("../internals/TreeViewProvider");
10
- /**
11
- * @ignore - internal component.
12
- */
13
+ var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
14
+ var _useSelector = require("../internals/hooks/useSelector");
15
+ var _useTreeViewId2 = require("../internals/corePlugins/useTreeViewId/useTreeViewId.selectors");
16
+ var _jsxRuntime = require("react/jsx-runtime");
13
17
  function TreeItemProvider(props) {
14
18
  const {
15
19
  children,
16
- itemId
20
+ itemId,
21
+ id
17
22
  } = props;
18
23
  const {
19
24
  wrapItem,
20
- instance
25
+ instance,
26
+ store
21
27
  } = (0, _TreeViewProvider.useTreeViewContext)();
22
- return wrapItem({
23
- children,
28
+ const treeId = (0, _useSelector.useSelector)(store, _useTreeViewId2.selectorTreeViewId);
29
+ const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
24
30
  itemId,
25
- instance
31
+ treeId,
32
+ id
33
+ });
34
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
35
+ children: wrapItem({
36
+ children,
37
+ itemId,
38
+ instance,
39
+ idAttribute
40
+ })
26
41
  });
27
42
  }
28
- TreeItemProvider.propTypes = {
43
+ process.env.NODE_ENV !== "production" ? TreeItemProvider.propTypes = {
29
44
  // ----------------------------- Warning --------------------------------
30
45
  // | These PropTypes are generated from the TypeScript type definitions |
31
46
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
32
47
  // ----------------------------------------------------------------------
33
48
  children: _propTypes.default.node,
49
+ id: _propTypes.default.string,
34
50
  itemId: _propTypes.default.string.isRequired
35
- };
51
+ } : void 0;
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "useTreeItemModel", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeItemModel.useTreeItemModel;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "useTreeItemUtils", {
7
13
  enumerable: true,
8
14
  get: function () {
@@ -16,4 +22,5 @@ Object.defineProperty(exports, "useTreeViewApiRef", {
16
22
  }
17
23
  });
18
24
  var _useTreeViewApiRef = require("./useTreeViewApiRef");
19
- var _useTreeItemUtils = require("./useTreeItemUtils");
25
+ var _useTreeItemUtils = require("./useTreeItemUtils");
26
+ var _useTreeItemModel = require("./useTreeItemModel");
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeItemModel = void 0;
8
+ var _TreeViewProvider = require("../internals/TreeViewProvider");
9
+ var _useSelector = require("../internals/hooks/useSelector");
10
+ var _useTreeViewItems = require("../internals/plugins/useTreeViewItems/useTreeViewItems.selectors");
11
+ const useTreeItemModel = itemId => {
12
+ const {
13
+ store
14
+ } = (0, _TreeViewProvider.useTreeViewContext)();
15
+ return (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorItemModel, itemId);
16
+ };
17
+ exports.useTreeItemModel = useTreeItemModel;
@@ -4,10 +4,16 @@
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useTreeItemUtils = void 0;
7
+ exports.useTreeItemUtils = exports.isItemExpandable = void 0;
8
8
  var _TreeViewProvider = require("../../internals/TreeViewProvider");
9
9
  var _useTreeViewLabel = require("../../internals/plugins/useTreeViewLabel");
10
10
  var _plugins = require("../../internals/utils/plugins");
11
+ var _useSelector = require("../../internals/hooks/useSelector");
12
+ var _useTreeViewExpansion = require("../../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors");
13
+ var _useTreeViewFocus = require("../../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors");
14
+ var _useTreeViewItems = require("../../internals/plugins/useTreeViewItems/useTreeViewItems.selectors");
15
+ var _useTreeViewSelection = require("../../internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors");
16
+ var _useTreeViewLabel2 = require("../../internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors");
11
17
  /**
12
18
  * Plugins that need to be present in the Tree View in order for `useTreeItemUtils` to work correctly.
13
19
  */
@@ -22,25 +28,37 @@ const isItemExpandable = reactChildren => {
22
28
  }
23
29
  return Boolean(reactChildren);
24
30
  };
31
+ exports.isItemExpandable = isItemExpandable;
25
32
  const useTreeItemUtils = ({
26
33
  itemId,
27
34
  children
28
35
  }) => {
29
36
  const {
30
37
  instance,
38
+ label,
39
+ store,
31
40
  selection: {
32
41
  multiSelect
33
42
  },
34
43
  publicAPI
35
44
  } = (0, _TreeViewProvider.useTreeViewContext)();
45
+ const isExpanded = (0, _useSelector.useSelector)(store, _useTreeViewExpansion.selectorIsItemExpanded, itemId);
46
+ const isFocused = (0, _useSelector.useSelector)(store, _useTreeViewFocus.selectorIsItemFocused, itemId);
47
+ const isSelected = (0, _useSelector.useSelector)(store, _useTreeViewSelection.selectorIsItemSelected, itemId);
48
+ const isDisabled = (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorIsItemDisabled, itemId);
49
+ const isEditing = (0, _useSelector.useSelector)(store, state => label == null ? false : (0, _useTreeViewLabel2.selectorIsItemBeingEdited)(state, itemId));
50
+ const isEditable = (0, _useSelector.useSelector)(store, state => label == null ? false : (0, _useTreeViewLabel2.selectorIsItemEditable)(state, {
51
+ itemId,
52
+ isItemEditable: label.isItemEditable
53
+ }));
36
54
  const status = {
37
55
  expandable: isItemExpandable(children),
38
- expanded: instance.isItemExpanded(itemId),
39
- focused: instance.isItemFocused(itemId),
40
- selected: instance.isItemSelected(itemId),
41
- disabled: instance.isItemDisabled(itemId),
42
- editing: instance?.isItemBeingEdited ? instance?.isItemBeingEdited(itemId) : false,
43
- editable: instance.isItemEditable ? instance.isItemEditable(itemId) : false
56
+ expanded: isExpanded,
57
+ focused: isFocused,
58
+ selected: isSelected,
59
+ disabled: isDisabled,
60
+ editing: isEditing,
61
+ editable: isEditable
44
62
  };
45
63
  const handleExpansion = event => {
46
64
  if (status.disabled) {
@@ -52,7 +70,7 @@ const useTreeItemUtils = ({
52
70
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
53
71
 
54
72
  // If already expanded and trying to toggle selection don't close
55
- if (status.expandable && !(multiple && instance.isItemExpanded(itemId))) {
73
+ if (status.expandable && !(multiple && (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemId))) {
56
74
  instance.toggleItemExpansion(event, itemId);
57
75
  }
58
76
  };
@@ -99,15 +117,15 @@ const useTreeItemUtils = ({
99
117
  if (!(0, _plugins.hasPlugin)(instance, _useTreeViewLabel.useTreeViewLabel)) {
100
118
  return;
101
119
  }
102
- if (instance.isItemEditable(itemId)) {
103
- if (instance.isItemBeingEdited(itemId)) {
120
+ if (isEditable) {
121
+ if (isEditing) {
104
122
  instance.setEditedItemId(null);
105
123
  } else {
106
124
  instance.setEditedItemId(itemId);
107
125
  }
108
126
  }
109
127
  };
110
- const handleSaveItemLabel = (event, label) => {
128
+ const handleSaveItemLabel = (event, newLabel) => {
111
129
  if (!(0, _plugins.hasPlugin)(instance, _useTreeViewLabel.useTreeViewLabel)) {
112
130
  return;
113
131
  }
@@ -115,9 +133,8 @@ const useTreeItemUtils = ({
115
133
  // As a side effect of `instance.focusItem` called here and in `handleCancelItemLabelEditing` the `labelInput` is blurred
116
134
  // The `onBlur` event is triggered, which calls `handleSaveItemLabel` again.
117
135
  // To avoid creating an unwanted behavior we need to check if the item is being edited before calling `updateItemLabel`
118
- // using `instance.isItemBeingEditedRef` instead of `instance.isItemBeingEdited` since the state is not yet updated in this point
119
- if (instance.isItemBeingEditedRef(itemId)) {
120
- instance.updateItemLabel(itemId, label);
136
+ if ((0, _useTreeViewLabel2.selectorIsItemBeingEdited)(store.value, itemId)) {
137
+ instance.updateItemLabel(itemId, newLabel);
121
138
  toggleItemEditing();
122
139
  instance.focusItem(event, itemId);
123
140
  }
@@ -126,7 +143,7 @@ const useTreeItemUtils = ({
126
143
  if (!(0, _plugins.hasPlugin)(instance, _useTreeViewLabel.useTreeViewLabel)) {
127
144
  return;
128
145
  }
129
- if (instance.isItemBeingEditedRef(itemId)) {
146
+ if ((0, _useTreeViewLabel2.selectorIsItemBeingEdited)(store.value, itemId)) {
130
147
  toggleItemEditing();
131
148
  instance.focusItem(event, itemId);
132
149
  }
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-alpha.0
2
+ * @mui/x-tree-view v8.0.0-alpha.2
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the