@mui/x-tree-view 7.22.1 → 8.0.0-alpha.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 (296) hide show
  1. package/CHANGELOG.md +486 -11
  2. package/README.md +4 -4
  3. package/RichTreeView/RichTreeView.js +22 -5
  4. package/RichTreeView/RichTreeView.types.d.ts +4 -17
  5. package/SimpleTreeView/SimpleTreeView.js +21 -3
  6. package/TreeItem/TreeItem.d.ts +20 -2
  7. package/TreeItem/TreeItem.js +241 -371
  8. package/TreeItem/TreeItem.types.d.ts +52 -85
  9. package/TreeItem/index.d.ts +1 -4
  10. package/TreeItem/index.js +2 -4
  11. package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.d.ts +7 -0
  12. package/{modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +8 -6
  13. package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.d.ts} +1 -1
  14. package/TreeItemDragAndDropOverlay/index.d.ts +2 -0
  15. package/TreeItemDragAndDropOverlay/index.js +1 -0
  16. package/{TreeItem2LabelInput → TreeItemDragAndDropOverlay}/package.json +1 -1
  17. package/TreeItemIcon/TreeItemIcon.d.ts +7 -0
  18. package/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
  19. package/{TreeItem2Icon/TreeItem2Icon.types.d.ts → TreeItemIcon/TreeItemIcon.types.d.ts} +7 -7
  20. package/TreeItemIcon/index.d.ts +2 -0
  21. package/TreeItemIcon/index.js +1 -0
  22. package/{useTreeItem2 → TreeItemIcon}/package.json +1 -1
  23. package/TreeItemLabelInput/TreeItemLabelInput.d.ts +5 -0
  24. package/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
  25. package/{TreeItem2LabelInput/TreeItem2LabelInput.types.d.ts → TreeItemLabelInput/TreeItemLabelInput.types.d.ts} +1 -1
  26. package/TreeItemLabelInput/index.d.ts +2 -0
  27. package/TreeItemLabelInput/index.js +1 -0
  28. package/{TreeItem2Provider → TreeItemLabelInput}/package.json +1 -1
  29. package/TreeItemProvider/TreeItemProvider.d.ts +9 -0
  30. package/TreeItemProvider/TreeItemProvider.js +43 -0
  31. package/{TreeItem2Provider/TreeItem2Provider.types.d.ts → TreeItemProvider/TreeItemProvider.types.d.ts} +2 -1
  32. package/TreeItemProvider/index.d.ts +2 -0
  33. package/TreeItemProvider/index.js +1 -0
  34. package/{TreeItem2Icon → TreeItemProvider}/package.json +1 -1
  35. package/hooks/index.d.ts +2 -1
  36. package/hooks/index.js +2 -1
  37. package/hooks/useTreeItemModel.d.ts +2 -0
  38. package/hooks/useTreeItemModel.js +11 -0
  39. package/hooks/useTreeItemUtils/index.d.ts +1 -0
  40. package/hooks/useTreeItemUtils/index.js +1 -0
  41. package/hooks/{useTreeItem2Utils/useTreeItem2Utils.d.ts → useTreeItemUtils/useTreeItemUtils.d.ts} +13 -12
  42. package/{modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js → hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
  43. package/index.d.ts +5 -7
  44. package/index.js +6 -8
  45. package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
  46. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
  47. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  48. package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  49. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -2
  50. package/internals/components/RichTreeViewItems.d.ts +3 -6
  51. package/internals/components/RichTreeViewItems.js +42 -30
  52. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  53. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
  54. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  55. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
  56. package/internals/hooks/useSelector.d.ts +4 -0
  57. package/internals/hooks/useSelector.js +6 -0
  58. package/internals/index.d.ts +6 -1
  59. package/internals/index.js +5 -1
  60. package/internals/models/helpers.d.ts +0 -2
  61. package/internals/models/itemPlugin.d.ts +13 -10
  62. package/internals/models/plugin.d.ts +20 -8
  63. package/internals/models/treeView.d.ts +6 -0
  64. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  65. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +124 -0
  66. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
  67. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +8 -15
  68. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +1 -0
  69. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
  70. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  71. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
  72. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  73. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
  74. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  75. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  76. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
  77. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +718 -0
  78. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  79. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +16 -55
  80. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  81. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  82. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.d.ts +1 -1
  83. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  84. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  85. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
  86. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  87. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +13 -29
  88. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.d.ts +2 -0
  89. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
  90. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
  91. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
  92. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  93. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +39 -9
  94. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +20 -1
  95. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
  96. package/internals/useTreeView/useTreeView.js +30 -17
  97. package/internals/useTreeView/useTreeView.types.d.ts +1 -2
  98. package/internals/useTreeView/useTreeViewBuildContext.d.ts +3 -1
  99. package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  100. package/internals/utils/TreeViewStore.d.ts +12 -0
  101. package/internals/utils/TreeViewStore.js +24 -0
  102. package/internals/utils/selectors.d.ts +9 -0
  103. package/internals/utils/selectors.js +37 -0
  104. package/internals/utils/tree.d.ts +8 -8
  105. package/internals/utils/tree.js +51 -43
  106. package/models/items.d.ts +7 -2
  107. package/modern/RichTreeView/RichTreeView.js +22 -5
  108. package/modern/SimpleTreeView/SimpleTreeView.js +21 -3
  109. package/modern/TreeItem/TreeItem.js +241 -371
  110. package/modern/TreeItem/index.js +2 -4
  111. package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +8 -6
  112. package/modern/TreeItemDragAndDropOverlay/index.js +1 -0
  113. package/modern/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
  114. package/modern/TreeItemIcon/index.js +1 -0
  115. package/modern/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
  116. package/modern/TreeItemLabelInput/index.js +1 -0
  117. package/modern/TreeItemProvider/TreeItemProvider.js +43 -0
  118. package/modern/TreeItemProvider/index.js +1 -0
  119. package/modern/hooks/index.js +2 -1
  120. package/modern/hooks/useTreeItemModel.js +11 -0
  121. package/modern/hooks/useTreeItemUtils/index.js +1 -0
  122. package/{hooks/useTreeItem2Utils/useTreeItem2Utils.js → modern/hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
  123. package/modern/index.js +6 -8
  124. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  125. package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  126. package/modern/internals/components/RichTreeViewItems.js +42 -30
  127. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  128. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  129. package/modern/internals/hooks/useSelector.js +6 -0
  130. package/modern/internals/index.js +5 -1
  131. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  132. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
  133. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
  134. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  135. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  136. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  137. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
  138. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  139. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  140. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  141. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  142. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  143. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  144. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
  145. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
  146. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  147. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
  148. package/modern/internals/useTreeView/useTreeView.js +30 -17
  149. package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  150. package/modern/internals/utils/TreeViewStore.js +24 -0
  151. package/modern/internals/utils/selectors.js +37 -0
  152. package/modern/internals/utils/tree.js +51 -43
  153. package/modern/useTreeItem/index.js +1 -0
  154. package/modern/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +45 -51
  155. package/node/RichTreeView/RichTreeView.js +22 -5
  156. package/node/SimpleTreeView/SimpleTreeView.js +21 -3
  157. package/node/TreeItem/TreeItem.js +242 -372
  158. package/node/TreeItem/index.js +38 -16
  159. package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +7 -6
  160. package/node/TreeItemDragAndDropOverlay/index.js +12 -0
  161. package/node/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +4 -3
  162. package/node/TreeItemIcon/index.js +12 -0
  163. package/node/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
  164. package/node/TreeItemLabelInput/index.js +12 -0
  165. package/node/{TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +22 -6
  166. package/node/TreeItemProvider/index.js +12 -0
  167. package/node/hooks/index.js +10 -3
  168. package/node/hooks/useTreeItemModel.js +17 -0
  169. package/node/hooks/useTreeItemUtils/index.js +12 -0
  170. package/node/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +37 -19
  171. package/node/index.js +18 -42
  172. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  173. package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  174. package/node/internals/components/RichTreeViewItems.js +42 -30
  175. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
  176. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
  177. package/node/internals/hooks/useSelector.js +13 -0
  178. package/node/internals/index.js +47 -1
  179. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
  180. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +23 -0
  181. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +14 -0
  182. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  183. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
  184. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
  185. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -102
  186. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
  187. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
  188. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  189. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  190. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  191. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
  192. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +96 -0
  193. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +78 -42
  194. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
  195. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +109 -2
  196. package/node/internals/useTreeView/useTreeView.js +30 -17
  197. package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
  198. package/node/internals/utils/TreeViewStore.js +31 -0
  199. package/node/internals/utils/selectors.js +44 -0
  200. package/node/internals/utils/tree.js +51 -43
  201. package/node/useTreeItem/index.js +12 -0
  202. package/node/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +46 -53
  203. package/package.json +7 -5
  204. package/themeAugmentation/components.d.ts +0 -10
  205. package/themeAugmentation/overrides.d.ts +0 -3
  206. package/themeAugmentation/props.d.ts +1 -5
  207. package/useTreeItem/index.d.ts +2 -0
  208. package/useTreeItem/index.js +1 -0
  209. package/{TreeItem2 → useTreeItem}/package.json +1 -1
  210. package/useTreeItem/useTreeItem.d.ts +2 -0
  211. package/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +45 -51
  212. package/{useTreeItem2/useTreeItem2.types.d.ts → useTreeItem/useTreeItem.types.d.ts} +51 -58
  213. package/TreeItem/TreeItemContent.d.ts +0 -61
  214. package/TreeItem/TreeItemContent.js +0 -146
  215. package/TreeItem/useTreeItemState.d.ts +0 -21
  216. package/TreeItem/useTreeItemState.js +0 -143
  217. package/TreeItem2/TreeItem2.d.ts +0 -34
  218. package/TreeItem2/TreeItem2.js +0 -387
  219. package/TreeItem2/TreeItem2.types.d.ts +0 -92
  220. package/TreeItem2/index.d.ts +0 -2
  221. package/TreeItem2/index.js +0 -1
  222. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +0 -7
  223. package/TreeItem2DragAndDropOverlay/index.d.ts +0 -2
  224. package/TreeItem2DragAndDropOverlay/index.js +0 -1
  225. package/TreeItem2DragAndDropOverlay/package.json +0 -6
  226. package/TreeItem2Icon/TreeItem2Icon.d.ts +0 -7
  227. package/TreeItem2Icon/index.d.ts +0 -2
  228. package/TreeItem2Icon/index.js +0 -1
  229. package/TreeItem2LabelInput/TreeItem2LabelInput.d.ts +0 -5
  230. package/TreeItem2LabelInput/index.d.ts +0 -2
  231. package/TreeItem2LabelInput/index.js +0 -1
  232. package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -6
  233. package/TreeItem2Provider/TreeItem2Provider.js +0 -26
  234. package/TreeItem2Provider/index.d.ts +0 -2
  235. package/TreeItem2Provider/index.js +0 -1
  236. package/TreeView/TreeView.d.ts +0 -21
  237. package/TreeView/TreeView.js +0 -211
  238. package/TreeView/TreeView.types.d.ts +0 -9
  239. package/TreeView/index.d.ts +0 -3
  240. package/TreeView/index.js +0 -3
  241. package/TreeView/package.json +0 -6
  242. package/TreeView/treeViewClasses.d.ts +0 -7
  243. package/TreeView/treeViewClasses.js +0 -6
  244. package/hooks/useTreeItem2Utils/index.d.ts +0 -1
  245. package/hooks/useTreeItem2Utils/index.js +0 -1
  246. package/modern/TreeItem/TreeItemContent.js +0 -146
  247. package/modern/TreeItem/useTreeItemState.js +0 -143
  248. package/modern/TreeItem2/TreeItem2.js +0 -387
  249. package/modern/TreeItem2/index.js +0 -1
  250. package/modern/TreeItem2DragAndDropOverlay/index.js +0 -1
  251. package/modern/TreeItem2Icon/index.js +0 -1
  252. package/modern/TreeItem2LabelInput/index.js +0 -1
  253. package/modern/TreeItem2Provider/TreeItem2Provider.js +0 -26
  254. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +0 -1
  255. package/modern/TreeItem2Provider/index.js +0 -1
  256. package/modern/TreeView/TreeView.js +0 -211
  257. package/modern/TreeView/TreeView.types.js +0 -1
  258. package/modern/TreeView/index.js +0 -3
  259. package/modern/TreeView/treeViewClasses.js +0 -6
  260. package/modern/hooks/useTreeItem2Utils/index.js +0 -1
  261. package/modern/useTreeItem2/index.js +0 -4
  262. package/modern/useTreeItem2/useTreeItem2.types.js +0 -1
  263. package/node/TreeItem/TreeItemContent.js +0 -153
  264. package/node/TreeItem/useTreeItemState.js +0 -148
  265. package/node/TreeItem2/TreeItem2.js +0 -394
  266. package/node/TreeItem2/index.js +0 -48
  267. package/node/TreeItem2DragAndDropOverlay/index.js +0 -12
  268. package/node/TreeItem2Icon/index.js +0 -12
  269. package/node/TreeItem2LabelInput/index.js +0 -12
  270. package/node/TreeItem2Provider/index.js +0 -12
  271. package/node/TreeView/TreeView.js +0 -217
  272. package/node/TreeView/TreeView.types.js +0 -5
  273. package/node/TreeView/index.js +0 -27
  274. package/node/TreeView/treeViewClasses.js +0 -14
  275. package/node/hooks/useTreeItem2Utils/index.js +0 -12
  276. package/node/useTreeItem2/index.js +0 -10
  277. package/node/useTreeItem2/useTreeItem2.types.js +0 -5
  278. package/useTreeItem2/index.d.ts +0 -3
  279. package/useTreeItem2/index.js +0 -4
  280. package/useTreeItem2/useTreeItem2.d.ts +0 -2
  281. package/useTreeItem2/useTreeItem2.types.js +0 -1
  282. /package/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  283. /package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
  284. /package/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  285. /package/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  286. /package/{TreeItem2Provider/TreeItem2Provider.types.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  287. /package/{TreeView/TreeView.types.js → modern/TreeItemIcon/TreeItemIcon.types.js} +0 -0
  288. /package/modern/{TreeItem2/TreeItem2.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  289. /package/modern/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  290. /package/modern/{TreeItem2Icon/TreeItem2Icon.types.js → useTreeItem/useTreeItem.types.js} +0 -0
  291. /package/node/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  292. /package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
  293. /package/node/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  294. /package/node/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  295. /package/node/{TreeItem2Provider/TreeItem2Provider.types.js → useTreeItem/useTreeItem.types.js} +0 -0
  296. /package/{modern/TreeItem2LabelInput/TreeItem2LabelInput.types.js → useTreeItem/useTreeItem.types.js} +0 -0
@@ -1,30 +1,35 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
+ import { selectorIsItemExpandable, selectorIsItemExpanded } from "./useTreeViewExpansion.selectors.js";
6
+ import { createExpandedItemsMap } from "./useTreeViewExpansion.utils.js";
7
+ import { selectorItemMeta, selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
4
8
  export const useTreeViewExpansion = ({
5
9
  instance,
10
+ store,
6
11
  params,
7
- models
12
+ models,
13
+ experimentalFeatures
8
14
  }) => {
9
- const expandedItemsMap = React.useMemo(() => {
10
- const temp = new Map();
11
- models.expandedItems.value.forEach(id => {
12
- temp.set(id, true);
13
- });
14
- return temp;
15
- }, [models.expandedItems.value]);
15
+ const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
16
+ useEnhancedEffect(() => {
17
+ store.update(prevState => _extends({}, prevState, {
18
+ expansion: {
19
+ expandedItemsMap: createExpandedItemsMap(models.expandedItems.value)
20
+ }
21
+ }));
22
+ }, [store, models.expandedItems.value]);
16
23
  const setExpandedItems = (event, value) => {
17
24
  params.onExpandedItemsChange?.(event, value);
18
25
  models.expandedItems.setControlledValue(value);
19
26
  };
20
- const isItemExpanded = React.useCallback(itemId => expandedItemsMap.has(itemId), [expandedItemsMap]);
21
- const isItemExpandable = React.useCallback(itemId => !!instance.getItemMeta(itemId)?.expandable, [instance]);
22
27
  const toggleItemExpansion = useEventCallback((event, itemId) => {
23
- const isExpandedBefore = instance.isItemExpanded(itemId);
28
+ const isExpandedBefore = selectorIsItemExpanded(store.value, itemId);
24
29
  instance.setItemExpansion(event, itemId, !isExpandedBefore);
25
30
  });
26
31
  const setItemExpansion = useEventCallback((event, itemId, isExpanded) => {
27
- const isExpandedBefore = instance.isItemExpanded(itemId);
32
+ const isExpandedBefore = selectorIsItemExpanded(store.value, itemId);
28
33
  if (isExpandedBefore === isExpanded) {
29
34
  return;
30
35
  }
@@ -40,9 +45,12 @@ export const useTreeViewExpansion = ({
40
45
  setExpandedItems(event, newExpanded);
41
46
  });
42
47
  const expandAllSiblings = (event, itemId) => {
43
- const itemMeta = instance.getItemMeta(itemId);
44
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
45
- const diff = siblings.filter(child => instance.isItemExpandable(child) && !instance.isItemExpanded(child));
48
+ const itemMeta = selectorItemMeta(store.value, itemId);
49
+ if (itemMeta == null) {
50
+ return;
51
+ }
52
+ const siblings = selectorItemOrderedChildrenIds(store.value, itemMeta.parentId);
53
+ const diff = siblings.filter(child => selectorIsItemExpandable(store.value, child) && !selectorIsItemExpanded(store.value, child));
46
54
  const newExpanded = models.expandedItems.value.concat(diff);
47
55
  if (diff.length > 0) {
48
56
  if (params.onItemExpansionToggle) {
@@ -57,27 +65,26 @@ export const useTreeViewExpansion = ({
57
65
  if (params.expansionTrigger) {
58
66
  return params.expansionTrigger;
59
67
  }
60
- if (instance.isTreeViewEditable) {
68
+ if (isTreeViewEditable) {
61
69
  return 'iconContainer';
62
70
  }
63
71
  return 'content';
64
- }, [params.expansionTrigger, instance.isTreeViewEditable]);
72
+ }, [params.expansionTrigger, isTreeViewEditable]);
73
+ const pluginContextValue = React.useMemo(() => ({
74
+ expansion: {
75
+ expansionTrigger
76
+ }
77
+ }), [expansionTrigger]);
65
78
  return {
66
79
  publicAPI: {
67
80
  setItemExpansion
68
81
  },
69
82
  instance: {
70
- isItemExpanded,
71
- isItemExpandable,
72
83
  setItemExpansion,
73
84
  toggleItemExpansion,
74
85
  expandAllSiblings
75
86
  },
76
- contextValue: {
77
- expansion: {
78
- expansionTrigger
79
- }
80
- }
87
+ contextValue: pluginContextValue
81
88
  };
82
89
  };
83
90
  useTreeViewExpansion.models = {
@@ -91,6 +98,11 @@ useTreeViewExpansion.getDefaultizedParams = ({
91
98
  }) => _extends({}, params, {
92
99
  defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
93
100
  });
101
+ useTreeViewExpansion.getInitialState = params => ({
102
+ expansion: {
103
+ expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
104
+ }
105
+ });
94
106
  useTreeViewExpansion.params = {
95
107
  expandedItems: true,
96
108
  defaultExpandedItems: true,
@@ -0,0 +1,17 @@
1
+ import { createSelector } from "../../utils/selectors.js";
2
+ import { selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
3
+ const selectorExpansion = state => state.expansion;
4
+
5
+ /**
6
+ * Check if an item is expanded.
7
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
8
+ * @returns {boolean} `true` if the item is expanded, `false` otherwise.
9
+ */
10
+ export const selectorIsItemExpanded = createSelector([selectorExpansion, (_, itemId) => itemId], (expansionState, itemId) => expansionState.expandedItemsMap.has(itemId));
11
+
12
+ /**
13
+ * Check if an item is expandable.
14
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
15
+ * @returns {boolean} `true` if the item is expandable, `false` otherwise.
16
+ */
17
+ export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
@@ -0,0 +1,7 @@
1
+ export const createExpandedItemsMap = expandedItems => {
2
+ const expandedItemsMap = new Map();
3
+ expandedItems.forEach(id => {
4
+ expandedItemsMap.set(id, true);
5
+ });
6
+ return expandedItemsMap;
7
+ };
@@ -1,46 +1,56 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
- import ownerDocument from '@mui/utils/ownerDocument';
5
4
  import { useInstanceEventHandler } from "../../hooks/useInstanceEventHandler.js";
6
- import { getActiveElement } from "../../utils/utils.js";
7
5
  import { getFirstNavigableItem } from "../../utils/tree.js";
8
6
  import { convertSelectedItemsToArray } from "../useTreeViewSelection/useTreeViewSelection.utils.js";
9
- const useDefaultFocusableItemId = (instance, selectedItems) => {
10
- let tabbableItemId = convertSelectedItemsToArray(selectedItems).find(itemId => {
11
- if (!instance.isItemNavigable(itemId)) {
12
- return false;
13
- }
14
- const itemMeta = instance.getItemMeta(itemId);
15
- return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
16
- });
17
- if (tabbableItemId == null) {
18
- tabbableItemId = getFirstNavigableItem(instance);
19
- }
20
- return tabbableItemId;
21
- };
7
+ import { selectorDefaultFocusableItemId, selectorFocusedItemId } from "./useTreeViewFocus.selectors.js";
8
+ import { selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
9
+ import { selectorCanItemBeFocused, selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
22
10
  export const useTreeViewFocus = ({
23
11
  instance,
24
12
  params,
25
- state,
26
- setState,
27
- models,
28
- rootRef
13
+ store,
14
+ models
29
15
  }) => {
30
- const defaultFocusableItemId = useDefaultFocusableItemId(instance, models.selectedItems.value);
31
- const setFocusedItemId = useEventCallback(itemId => {
32
- const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedItemId) : itemId;
33
- if (state.focusedItemId !== cleanItemId) {
34
- setState(prevState => _extends({}, prevState, {
35
- focusedItemId: cleanItemId
36
- }));
16
+ React.useEffect(() => {
17
+ let defaultFocusableItemId = convertSelectedItemsToArray(models.selectedItems.value).find(itemId => {
18
+ if (!selectorCanItemBeFocused(store.value, itemId)) {
19
+ return false;
20
+ }
21
+ const itemMeta = selectorItemMeta(store.value, itemId);
22
+ return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
23
+ });
24
+ if (defaultFocusableItemId == null) {
25
+ defaultFocusableItemId = getFirstNavigableItem(store.value) ?? null;
37
26
  }
27
+ store.update(prevState => {
28
+ if (defaultFocusableItemId === prevState.focus.defaultFocusableItemId) {
29
+ return prevState;
30
+ }
31
+ return _extends({}, prevState, {
32
+ focus: _extends({}, prevState.focus, {
33
+ defaultFocusableItemId
34
+ })
35
+ });
36
+ });
37
+ }, [store, models.selectedItems.value]);
38
+ const setFocusedItemId = useEventCallback(itemId => {
39
+ store.update(prevState => {
40
+ const focusedItemId = selectorFocusedItemId(prevState);
41
+ if (focusedItemId === itemId) {
42
+ return prevState;
43
+ }
44
+ return _extends({}, prevState, {
45
+ focus: _extends({}, prevState.focus, {
46
+ focusedItemId: itemId
47
+ })
48
+ });
49
+ });
38
50
  });
39
- const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains(getActiveElement(ownerDocument(rootRef.current))), [rootRef]);
40
- const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
41
51
  const isItemVisible = itemId => {
42
- const itemMeta = instance.getItemMeta(itemId);
43
- return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
52
+ const itemMeta = selectorItemMeta(store.value, itemId);
53
+ return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
44
54
  };
45
55
  const innerFocusItem = (event, itemId) => {
46
56
  const itemElement = instance.getItemDOMElement(itemId);
@@ -59,23 +69,25 @@ export const useTreeViewFocus = ({
59
69
  }
60
70
  });
61
71
  const removeFocusedItem = useEventCallback(() => {
62
- if (state.focusedItemId == null) {
72
+ const focusedItemId = selectorFocusedItemId(store.value);
73
+ if (focusedItemId == null) {
63
74
  return;
64
75
  }
65
- const itemMeta = instance.getItemMeta(state.focusedItemId);
76
+ const itemMeta = selectorItemMeta(store.value, focusedItemId);
66
77
  if (itemMeta) {
67
- const itemElement = instance.getItemDOMElement(state.focusedItemId);
78
+ const itemElement = instance.getItemDOMElement(focusedItemId);
68
79
  if (itemElement) {
69
80
  itemElement.blur();
70
81
  }
71
82
  }
72
83
  setFocusedItemId(null);
73
84
  });
74
- const canItemBeTabbed = itemId => itemId === defaultFocusableItemId;
75
85
  useInstanceEventHandler(instance, 'removeItem', ({
76
86
  id
77
87
  }) => {
78
- if (state.focusedItemId === id) {
88
+ const focusedItemId = selectorFocusedItemId(store.value);
89
+ const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
90
+ if (focusedItemId === id && defaultFocusableItemId != null) {
79
91
  innerFocusItem(null, defaultFocusableItemId);
80
92
  }
81
93
  });
@@ -86,27 +98,37 @@ export const useTreeViewFocus = ({
86
98
  }
87
99
 
88
100
  // if the event bubbled (which is React specific) we don't want to steal focus
89
- if (event.target === event.currentTarget) {
101
+ const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
102
+ if (event.target === event.currentTarget && defaultFocusableItemId != null) {
90
103
  innerFocusItem(event, defaultFocusableItemId);
91
104
  }
92
105
  };
106
+ const createRootHandleBlur = otherHandlers => event => {
107
+ otherHandlers.onBlur?.(event);
108
+ if (event.defaultMuiPrevented) {
109
+ return;
110
+ }
111
+ setFocusedItemId(null);
112
+ };
93
113
  return {
94
114
  getRootProps: otherHandlers => ({
95
- onFocus: createRootHandleFocus(otherHandlers)
115
+ onFocus: createRootHandleFocus(otherHandlers),
116
+ onBlur: createRootHandleBlur(otherHandlers)
96
117
  }),
97
118
  publicAPI: {
98
119
  focusItem
99
120
  },
100
121
  instance: {
101
- isItemFocused,
102
- canItemBeTabbed,
103
122
  focusItem,
104
123
  removeFocusedItem
105
124
  }
106
125
  };
107
126
  };
108
127
  useTreeViewFocus.getInitialState = () => ({
109
- focusedItemId: null
128
+ focus: {
129
+ focusedItemId: null,
130
+ defaultFocusableItemId: null
131
+ }
110
132
  });
111
133
  useTreeViewFocus.params = {
112
134
  onItemFocus: true
@@ -0,0 +1,34 @@
1
+ import { createSelector } from "../../utils/selectors.js";
2
+ const selectorTreeViewFocusState = state => state.focus;
3
+
4
+ /**
5
+ * Get the item that should be sequentially focusable (usually with the Tab key).
6
+ * At any point in time, there is a single item that can be sequentially focused in the Tree View.
7
+ * This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected.
8
+ * @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
9
+ * @returns {TreeViewItemId | null} The id of the item that should be sequentially focusable.
10
+ */
11
+ export const selectorDefaultFocusableItemId = createSelector(selectorTreeViewFocusState, focus => focus.defaultFocusableItemId);
12
+
13
+ /**
14
+ * Check if an item is the default focusable item.
15
+ * @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
16
+ * @param {TreeViewItemId} itemId The id of the item to check.
17
+ * @returns {boolean} `true` if the item is the default focusable item, `false` otherwise.
18
+ */
19
+ export const selectorIsItemTheDefaultFocusableItem = createSelector([selectorDefaultFocusableItemId, (_, itemId) => itemId], (defaultFocusableItemId, itemId) => defaultFocusableItemId === itemId);
20
+
21
+ /**
22
+ * Get the id of the item that is currently focused.
23
+ * @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
24
+ * @returns {TreeViewItemId | null} The id of the item that is currently focused.
25
+ */
26
+ export const selectorFocusedItemId = createSelector(selectorTreeViewFocusState, focus => focus.focusedItemId);
27
+
28
+ /**
29
+ * Check if an item is focused.
30
+ * @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
31
+ * @param {TreeViewItemId} itemId The id of the item to check.
32
+ * @returns {boolean} `true` if the item is focused, `false` otherwise.
33
+ */
34
+ export const selectorIsItemFocused = createSelector([selectorFocusedItemId, (_, itemId) => itemId], (focusedItemId, itemId) => focusedItemId === itemId);
@@ -1,22 +1,24 @@
1
+ import * as React from 'react';
1
2
  export const useTreeViewIcons = ({
2
3
  slots,
3
4
  slotProps
4
5
  }) => {
5
- return {
6
- contextValue: {
7
- icons: {
8
- slots: {
9
- collapseIcon: slots.collapseIcon,
10
- expandIcon: slots.expandIcon,
11
- endIcon: slots.endIcon
12
- },
13
- slotProps: {
14
- collapseIcon: slotProps.collapseIcon,
15
- expandIcon: slotProps.expandIcon,
16
- endIcon: slotProps.endIcon
17
- }
6
+ const pluginContextValue = React.useMemo(() => ({
7
+ icons: {
8
+ slots: {
9
+ collapseIcon: slots.collapseIcon,
10
+ expandIcon: slots.expandIcon,
11
+ endIcon: slots.endIcon
12
+ },
13
+ slotProps: {
14
+ collapseIcon: slotProps.collapseIcon,
15
+ expandIcon: slotProps.expandIcon,
16
+ endIcon: slotProps.endIcon
18
17
  }
19
18
  }
19
+ }), [slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
20
+ return {
21
+ contextValue: pluginContextValue
20
22
  };
21
23
  };
22
24
  useTreeViewIcons.params = {};
@@ -1,21 +1,23 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["children"];
4
2
  import * as React from 'react';
3
+ import useEventCallback from '@mui/utils/useEventCallback';
5
4
  import { publishTreeViewEvent } from "../../utils/publishTreeViewEvent.js";
6
5
  import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
7
6
  import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
7
+ import { selectorItemMeta, selectorItemOrderedChildrenIds, selectorItemModel, selectorItemDepth } from "./useTreeViewItems.selectors.js";
8
+ import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
8
9
  import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
9
10
  import { jsx as _jsx } from "react/jsx-runtime";
10
11
  const updateItemsState = ({
12
+ disabledItemsFocusable,
11
13
  items,
12
14
  isItemDisabled,
13
15
  getItemLabel,
14
16
  getItemId
15
17
  }) => {
16
- const itemMetaMap = {};
17
- const itemMap = {};
18
- const itemOrderedChildrenIds = {
18
+ const itemMetaLookup = {};
19
+ const itemModelLookup = {};
20
+ const itemOrderedChildrenIdsLookup = {
19
21
  [TREE_VIEW_ROOT_PARENT_ID]: []
20
22
  };
21
23
  const processItem = (item, depth, parentId) => {
@@ -23,14 +25,14 @@ const updateItemsState = ({
23
25
  if (id == null) {
24
26
  throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
25
27
  }
26
- if (itemMetaMap[id] != null) {
28
+ if (itemMetaLookup[id] != null) {
27
29
  throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
28
30
  }
29
31
  const label = getItemLabel ? getItemLabel(item) : item.label;
30
32
  if (label == null) {
31
33
  throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
32
34
  }
33
- itemMetaMap[id] = {
35
+ itemMetaLookup[id] = {
34
36
  id,
35
37
  label,
36
38
  parentId,
@@ -39,89 +41,58 @@ const updateItemsState = ({
39
41
  disabled: isItemDisabled ? isItemDisabled(item) : false,
40
42
  depth
41
43
  };
42
- itemMap[id] = item;
44
+ itemModelLookup[id] = item;
43
45
  const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
44
- if (!itemOrderedChildrenIds[parentIdWithDefault]) {
45
- itemOrderedChildrenIds[parentIdWithDefault] = [];
46
+ if (!itemOrderedChildrenIdsLookup[parentIdWithDefault]) {
47
+ itemOrderedChildrenIdsLookup[parentIdWithDefault] = [];
46
48
  }
47
- itemOrderedChildrenIds[parentIdWithDefault].push(id);
49
+ itemOrderedChildrenIdsLookup[parentIdWithDefault].push(id);
48
50
  item.children?.forEach(child => processItem(child, depth + 1, id));
49
51
  };
50
52
  items.forEach(item => processItem(item, 0, null));
51
- const itemChildrenIndexes = {};
52
- Object.keys(itemOrderedChildrenIds).forEach(parentId => {
53
- itemChildrenIndexes[parentId] = buildSiblingIndexes(itemOrderedChildrenIds[parentId]);
53
+ const itemChildrenIndexesLookup = {};
54
+ Object.keys(itemOrderedChildrenIdsLookup).forEach(parentId => {
55
+ itemChildrenIndexesLookup[parentId] = buildSiblingIndexes(itemOrderedChildrenIdsLookup[parentId]);
54
56
  });
55
57
  return {
56
- itemMetaMap,
57
- itemMap,
58
- itemOrderedChildrenIds,
59
- itemChildrenIndexes
58
+ disabledItemsFocusable,
59
+ itemMetaLookup,
60
+ itemModelLookup,
61
+ itemOrderedChildrenIdsLookup,
62
+ itemChildrenIndexesLookup
60
63
  };
61
64
  };
62
65
  export const useTreeViewItems = ({
63
66
  instance,
64
67
  params,
65
- state,
66
- setState,
67
- experimentalFeatures
68
+ store
68
69
  }) => {
69
- const getItemMeta = React.useCallback(itemId => state.items.itemMetaMap[itemId], [state.items.itemMetaMap]);
70
- const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
70
+ const getItem = React.useCallback(itemId => selectorItemModel(store.value, itemId), [store]);
71
71
  const getItemTree = React.useCallback(() => {
72
- const getItemFromItemId = id => {
73
- const _state$items$itemMap$ = state.items.itemMap[id],
74
- item = _objectWithoutPropertiesLoose(_state$items$itemMap$, _excluded);
75
- const newChildren = state.items.itemOrderedChildrenIds[id];
76
- if (newChildren) {
72
+ const getItemFromItemId = itemId => {
73
+ const item = selectorItemModel(store.value, itemId);
74
+ const newChildren = selectorItemOrderedChildrenIds(store.value, itemId);
75
+ if (newChildren.length > 0) {
77
76
  item.children = newChildren.map(getItemFromItemId);
77
+ } else {
78
+ delete item.children;
78
79
  }
79
80
  return item;
80
81
  };
81
- return state.items.itemOrderedChildrenIds[TREE_VIEW_ROOT_PARENT_ID].map(getItemFromItemId);
82
- }, [state.items.itemMap, state.items.itemOrderedChildrenIds]);
83
- const isItemDisabled = React.useCallback(itemId => {
84
- if (itemId == null) {
85
- return false;
86
- }
87
- let itemMeta = instance.getItemMeta(itemId);
88
-
89
- // This can be called before the item has been added to the item map.
90
- if (!itemMeta) {
91
- return false;
92
- }
93
- if (itemMeta.disabled) {
94
- return true;
95
- }
96
- while (itemMeta.parentId != null) {
97
- itemMeta = instance.getItemMeta(itemMeta.parentId);
98
- if (itemMeta.disabled) {
99
- return true;
100
- }
101
- }
102
- return false;
103
- }, [instance]);
104
- const getItemIndex = React.useCallback(itemId => {
105
- const parentId = instance.getItemMeta(itemId).parentId ?? TREE_VIEW_ROOT_PARENT_ID;
106
- return state.items.itemChildrenIndexes[parentId][itemId];
107
- }, [instance, state.items.itemChildrenIndexes]);
108
- const getItemOrderedChildrenIds = React.useCallback(itemId => state.items.itemOrderedChildrenIds[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? [], [state.items.itemOrderedChildrenIds]);
82
+ return selectorItemOrderedChildrenIds(store.value, null).map(getItemFromItemId);
83
+ }, [store]);
84
+ const getItemOrderedChildrenIds = React.useCallback(itemId => selectorItemOrderedChildrenIds(store.value, itemId), [store]);
109
85
  const getItemDOMElement = itemId => {
110
- const itemMeta = instance.getItemMeta(itemId);
86
+ const itemMeta = selectorItemMeta(store.value, itemId);
111
87
  if (itemMeta == null) {
112
88
  return null;
113
89
  }
114
- return document.getElementById(generateTreeItemIdAttribute({
115
- treeId: state.id.treeId,
90
+ const idAttribute = generateTreeItemIdAttribute({
91
+ treeId: selectorTreeViewId(store.value),
116
92
  itemId,
117
93
  id: itemMeta.idAttribute
118
- }));
119
- };
120
- const isItemNavigable = itemId => {
121
- if (params.disabledItemsFocusable) {
122
- return true;
123
- }
124
- return !instance.isItemDisabled(itemId);
94
+ });
95
+ return document.getElementById(idAttribute);
125
96
  };
126
97
  const areItemUpdatesPreventedRef = React.useRef(false);
127
98
  const preventItemUpdates = React.useCallback(() => {
@@ -132,15 +103,16 @@ export const useTreeViewItems = ({
132
103
  if (instance.areItemUpdatesPrevented()) {
133
104
  return;
134
105
  }
135
- setState(prevState => {
106
+ store.update(prevState => {
136
107
  const newState = updateItemsState({
108
+ disabledItemsFocusable: params.disabledItemsFocusable,
137
109
  items: params.items,
138
110
  isItemDisabled: params.isItemDisabled,
139
111
  getItemId: params.getItemId,
140
112
  getItemLabel: params.getItemLabel
141
113
  });
142
- Object.values(prevState.items.itemMetaMap).forEach(item => {
143
- if (!newState.itemMetaMap[item.id]) {
114
+ Object.values(prevState.items.itemMetaLookup).forEach(item => {
115
+ if (!newState.itemMetaLookup[item.id]) {
144
116
  publishTreeViewEvent(instance, 'removeItem', {
145
117
  id: item.id
146
118
  });
@@ -150,19 +122,19 @@ export const useTreeViewItems = ({
150
122
  items: newState
151
123
  });
152
124
  });
153
- }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
154
- const getItemsToRender = () => {
155
- const getPropsFromItemId = id => {
156
- const item = state.items.itemMetaMap[id];
157
- return {
158
- label: item.label,
159
- itemId: item.id,
160
- id: item.idAttribute,
161
- children: state.items.itemOrderedChildrenIds[id]?.map(getPropsFromItemId)
162
- };
163
- };
164
- return state.items.itemOrderedChildrenIds[TREE_VIEW_ROOT_PARENT_ID].map(getPropsFromItemId);
165
- };
125
+ }, [instance, store, params.items, params.disabledItemsFocusable, params.isItemDisabled, params.getItemId, params.getItemLabel]);
126
+
127
+ // Wrap `props.onItemClick` with `useEventCallback` to prevent unneeded context updates.
128
+ const handleItemClick = useEventCallback((event, itemId) => {
129
+ if (params.onItemClick) {
130
+ params.onItemClick(event, itemId);
131
+ }
132
+ });
133
+ const pluginContextValue = React.useMemo(() => ({
134
+ items: {
135
+ onItemClick: handleItemClick
136
+ }
137
+ }), [handleItemClick]);
166
138
  return {
167
139
  getRootProps: () => ({
168
140
  style: {
@@ -176,29 +148,16 @@ export const useTreeViewItems = ({
176
148
  getItemOrderedChildrenIds
177
149
  },
178
150
  instance: {
179
- getItemMeta,
180
- getItem,
181
- getItemTree,
182
- getItemsToRender,
183
- getItemIndex,
184
151
  getItemDOMElement,
185
- getItemOrderedChildrenIds,
186
- isItemDisabled,
187
- isItemNavigable,
188
152
  preventItemUpdates,
189
153
  areItemUpdatesPrevented
190
154
  },
191
- contextValue: {
192
- items: {
193
- onItemClick: params.onItemClick,
194
- disabledItemsFocusable: params.disabledItemsFocusable,
195
- indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
196
- }
197
- }
155
+ contextValue: pluginContextValue
198
156
  };
199
157
  };
200
158
  useTreeViewItems.getInitialState = params => ({
201
159
  items: updateItemsState({
160
+ disabledItemsFocusable: params.disabledItemsFocusable,
202
161
  items: params.items,
203
162
  isItemDisabled: params.isItemDisabled,
204
163
  getItemId: params.getItemId,
@@ -212,11 +171,10 @@ useTreeViewItems.getDefaultizedParams = ({
212
171
  itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
213
172
  });
214
173
  useTreeViewItems.wrapRoot = ({
215
- children,
216
- instance
174
+ children
217
175
  }) => {
218
176
  return /*#__PURE__*/_jsx(TreeViewItemDepthContext.Provider, {
219
- value: itemId => instance.getItemMeta(itemId)?.depth ?? 0,
177
+ value: selectorItemDepth,
220
178
  children: children
221
179
  });
222
180
  };