@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,51 +1,66 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
3
4
  import { findOrderInTremauxTree, getAllNavigableItems, getFirstNavigableItem, getLastNavigableItem, getNonDisabledItemsInRange } from "../../utils/tree.js";
4
- import { convertSelectedItemsToArray, getLookupFromArray } from "./useTreeViewSelection.utils.js";
5
+ import { convertSelectedItemsToArray, propagateSelection, getAddedAndRemovedItems, getLookupFromArray, createSelectedItemsMap } from "./useTreeViewSelection.utils.js";
6
+ import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
7
+ import { useTreeViewSelectionItemPlugin } from "./useTreeViewSelection.itemPlugin.js";
5
8
  export const useTreeViewSelection = ({
6
- instance,
9
+ store,
7
10
  params,
8
11
  models
9
12
  }) => {
10
13
  const lastSelectedItem = React.useRef(null);
11
14
  const lastSelectedRange = React.useRef({});
12
- const selectedItemsMap = React.useMemo(() => {
13
- const temp = new Map();
14
- if (Array.isArray(models.selectedItems.value)) {
15
- models.selectedItems.value.forEach(id => {
16
- temp.set(id, true);
15
+ useEnhancedEffect(() => {
16
+ store.update(prevState => _extends({}, prevState, {
17
+ selection: {
18
+ selectedItemsMap: createSelectedItemsMap(models.selectedItems.value)
19
+ }
20
+ }));
21
+ }, [store, models.selectedItems.value]);
22
+ const setSelectedItems = (event, newModel, additionalItemsToPropagate) => {
23
+ let cleanModel;
24
+ if (params.multiSelect && (params.selectionPropagation.descendants || params.selectionPropagation.parents)) {
25
+ cleanModel = propagateSelection({
26
+ store,
27
+ selectionPropagation: params.selectionPropagation,
28
+ newModel: newModel,
29
+ oldModel: models.selectedItems.value,
30
+ additionalItemsToPropagate
17
31
  });
18
- } else if (models.selectedItems.value != null) {
19
- temp.set(models.selectedItems.value, true);
32
+ } else {
33
+ cleanModel = newModel;
20
34
  }
21
- return temp;
22
- }, [models.selectedItems.value]);
23
- const setSelectedItems = (event, newSelectedItems) => {
24
35
  if (params.onItemSelectionToggle) {
25
36
  if (params.multiSelect) {
26
- const addedItems = newSelectedItems.filter(itemId => !instance.isItemSelected(itemId));
27
- const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
28
- addedItems.forEach(itemId => {
29
- params.onItemSelectionToggle(event, itemId, true);
30
- });
31
- removedItems.forEach(itemId => {
32
- params.onItemSelectionToggle(event, itemId, false);
37
+ const changes = getAddedAndRemovedItems({
38
+ store,
39
+ newModel: cleanModel,
40
+ oldModel: models.selectedItems.value
33
41
  });
34
- } else if (newSelectedItems !== models.selectedItems.value) {
42
+ if (params.onItemSelectionToggle) {
43
+ changes.added.forEach(itemId => {
44
+ params.onItemSelectionToggle(event, itemId, true);
45
+ });
46
+ changes.removed.forEach(itemId => {
47
+ params.onItemSelectionToggle(event, itemId, false);
48
+ });
49
+ }
50
+ } else if (params.onItemSelectionToggle && cleanModel !== models.selectedItems.value) {
35
51
  if (models.selectedItems.value != null) {
36
52
  params.onItemSelectionToggle(event, models.selectedItems.value, false);
37
53
  }
38
- if (newSelectedItems != null) {
39
- params.onItemSelectionToggle(event, newSelectedItems, true);
54
+ if (cleanModel != null) {
55
+ params.onItemSelectionToggle(event, cleanModel, true);
40
56
  }
41
57
  }
42
58
  }
43
59
  if (params.onSelectedItemsChange) {
44
- params.onSelectedItemsChange(event, newSelectedItems);
60
+ params.onSelectedItemsChange(event, cleanModel);
45
61
  }
46
- models.selectedItems.setControlledValue(newSelectedItems);
62
+ models.selectedItems.setControlledValue(cleanModel);
47
63
  };
48
- const isItemSelected = itemId => selectedItemsMap.has(itemId);
49
64
  const selectItem = ({
50
65
  event,
51
66
  itemId,
@@ -58,7 +73,7 @@ export const useTreeViewSelection = ({
58
73
  let newSelected;
59
74
  if (keepExistingSelection) {
60
75
  const cleanSelectedItems = convertSelectedItemsToArray(models.selectedItems.value);
61
- const isSelectedBefore = instance.isItemSelected(itemId);
76
+ const isSelectedBefore = selectorIsItemSelected(store.value, itemId);
62
77
  if (isSelectedBefore && (shouldBeSelected === false || shouldBeSelected == null)) {
63
78
  newSelected = cleanSelectedItems.filter(id => id !== itemId);
64
79
  } else if (!isSelectedBefore && (shouldBeSelected === true || shouldBeSelected == null)) {
@@ -68,13 +83,16 @@ export const useTreeViewSelection = ({
68
83
  }
69
84
  } else {
70
85
  // eslint-disable-next-line no-lonely-if
71
- if (shouldBeSelected === false || shouldBeSelected == null && instance.isItemSelected(itemId)) {
86
+ if (shouldBeSelected === false || shouldBeSelected == null && selectorIsItemSelected(store.value, itemId)) {
72
87
  newSelected = params.multiSelect ? [] : null;
73
88
  } else {
74
89
  newSelected = params.multiSelect ? [itemId] : itemId;
75
90
  }
76
91
  }
77
- setSelectedItems(event, newSelected);
92
+ setSelectedItems(event, newSelected,
93
+ // If shouldBeSelected === selectorIsItemSelected(store, itemId), we still want to propagate the select.
94
+ // This is useful when the element is in an indeterminate state.
95
+ [itemId]);
78
96
  lastSelectedItem.current = itemId;
79
97
  lastSelectedRange.current = {};
80
98
  };
@@ -92,7 +110,7 @@ export const useTreeViewSelection = ({
92
110
 
93
111
  // Add to the model the items that are part of the new range and not already part of the model.
94
112
  const selectedItemsLookup = getLookupFromArray(newSelectedItems);
95
- const range = getNonDisabledItemsInRange(instance, start, end);
113
+ const range = getNonDisabledItemsInRange(store.value, start, end);
96
114
  const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
97
115
  newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
98
116
  setSelectedItems(event, newSelectedItems);
@@ -100,21 +118,21 @@ export const useTreeViewSelection = ({
100
118
  };
101
119
  const expandSelectionRange = (event, itemId) => {
102
120
  if (lastSelectedItem.current != null) {
103
- const [start, end] = findOrderInTremauxTree(instance, itemId, lastSelectedItem.current);
121
+ const [start, end] = findOrderInTremauxTree(store.value, itemId, lastSelectedItem.current);
104
122
  selectRange(event, [start, end]);
105
123
  }
106
124
  };
107
125
  const selectRangeFromStartToItem = (event, itemId) => {
108
- selectRange(event, [getFirstNavigableItem(instance), itemId]);
126
+ selectRange(event, [getFirstNavigableItem(store.value), itemId]);
109
127
  };
110
128
  const selectRangeFromItemToEnd = (event, itemId) => {
111
- selectRange(event, [itemId, getLastNavigableItem(instance)]);
129
+ selectRange(event, [itemId, getLastNavigableItem(store.value)]);
112
130
  };
113
131
  const selectAllNavigableItems = event => {
114
132
  if (params.disableSelection || !params.multiSelect) {
115
133
  return;
116
134
  }
117
- const navigableItems = getAllNavigableItems(instance);
135
+ const navigableItems = getAllNavigableItems(store.value);
118
136
  setSelectedItems(event, navigableItems);
119
137
  lastSelectedRange.current = getLookupFromArray(navigableItems);
120
138
  };
@@ -143,6 +161,17 @@ export const useTreeViewSelection = ({
143
161
  }
144
162
  setSelectedItems(event, newSelectedItems);
145
163
  };
164
+ const pluginContextValue = React.useMemo(() => ({
165
+ selection: {
166
+ multiSelect: params.multiSelect,
167
+ checkboxSelection: params.checkboxSelection,
168
+ disableSelection: params.disableSelection,
169
+ selectionPropagation: {
170
+ descendants: params.selectionPropagation.descendants,
171
+ parents: params.selectionPropagation.parents
172
+ }
173
+ }
174
+ }), [params.multiSelect, params.checkboxSelection, params.disableSelection, params.selectionPropagation.descendants, params.selectionPropagation.parents]);
146
175
  return {
147
176
  getRootProps: () => ({
148
177
  'aria-multiselectable': params.multiSelect
@@ -151,7 +180,6 @@ export const useTreeViewSelection = ({
151
180
  selectItem
152
181
  },
153
182
  instance: {
154
- isItemSelected,
155
183
  selectItem,
156
184
  selectAllNavigableItems,
157
185
  expandSelectionRange,
@@ -159,28 +187,35 @@ export const useTreeViewSelection = ({
159
187
  selectRangeFromItemToEnd,
160
188
  selectItemFromArrowNavigation
161
189
  },
162
- contextValue: {
163
- selection: {
164
- multiSelect: params.multiSelect,
165
- checkboxSelection: params.checkboxSelection,
166
- disableSelection: params.disableSelection
167
- }
168
- }
190
+ contextValue: pluginContextValue
169
191
  };
170
192
  };
193
+ useTreeViewSelection.itemPlugin = useTreeViewSelectionItemPlugin;
171
194
  useTreeViewSelection.models = {
172
195
  selectedItems: {
173
196
  getDefaultValue: params => params.defaultSelectedItems
174
197
  }
175
198
  };
176
199
  const DEFAULT_SELECTED_ITEMS = [];
200
+ const EMPTY_SELECTION_PROPAGATION = {};
177
201
  useTreeViewSelection.getDefaultizedParams = ({
178
202
  params
179
203
  }) => _extends({}, params, {
180
204
  disableSelection: params.disableSelection ?? false,
181
205
  multiSelect: params.multiSelect ?? false,
182
206
  checkboxSelection: params.checkboxSelection ?? false,
183
- defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null)
207
+ defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null),
208
+ selectionPropagation: params.selectionPropagation ?? EMPTY_SELECTION_PROPAGATION
209
+ });
210
+ useTreeViewSelection.getInitialState = params => ({
211
+ selection: {
212
+ selectedItemsMap: createSelectedItemsMap(params.selectedItems === undefined ? params.defaultSelectedItems : params.selectedItems)
213
+ }
214
+ });
215
+ useTreeViewSelection.getInitialState = params => ({
216
+ selection: {
217
+ selectedItemsMap: createSelectedItemsMap(params.selectedItems === undefined ? params.defaultSelectedItems : params.selectedItems)
218
+ }
184
219
  });
185
220
  useTreeViewSelection.params = {
186
221
  disableSelection: true,
@@ -189,5 +224,6 @@ useTreeViewSelection.params = {
189
224
  defaultSelectedItems: true,
190
225
  selectedItems: true,
191
226
  onSelectedItemsChange: true,
192
- onItemSelectionToggle: true
227
+ onItemSelectionToggle: true,
228
+ selectionPropagation: true
193
229
  };
@@ -0,0 +1,9 @@
1
+ import { createSelector } from "../../utils/selectors.js";
2
+ const selectorTreeViewSelectionState = state => state.selection;
3
+
4
+ /**
5
+ * Check if an item is selected.
6
+ * @param {TreeViewState<[UseTreeViewSelectionSignature]>} state The state of the tree view.
7
+ * @returns {boolean} `true` if the item is selected, `false` otherwise.
8
+ */
9
+ export const selectorIsItemSelected = createSelector([selectorTreeViewSelectionState, (_, itemId) => itemId], (selectionState, itemId) => selectionState.selectedItemsMap.has(itemId));
@@ -1,3 +1,6 @@
1
+ import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
2
+ import { selectorItemOrderedChildrenIds, selectorItemParentId } from "../useTreeViewItems/useTreeViewItems.selectors.js";
3
+
1
4
  /**
2
5
  * Transform the `selectedItems` model to be an array if it was a string or null.
3
6
  * @param {string[] | string | null} model The raw model.
@@ -12,10 +15,112 @@ export const convertSelectedItemsToArray = model => {
12
15
  }
13
16
  return [];
14
17
  };
18
+ export const createSelectedItemsMap = selectedItems => {
19
+ const selectedItemsMap = new Map();
20
+ convertSelectedItemsToArray(selectedItems).forEach(id => {
21
+ selectedItemsMap.set(id, true);
22
+ });
23
+ return selectedItemsMap;
24
+ };
15
25
  export const getLookupFromArray = array => {
16
26
  const lookup = {};
17
27
  array.forEach(itemId => {
18
28
  lookup[itemId] = true;
19
29
  });
20
30
  return lookup;
31
+ };
32
+ export const getAddedAndRemovedItems = ({
33
+ store,
34
+ oldModel,
35
+ newModel
36
+ }) => {
37
+ const newModelLookup = createSelectedItemsMap(newModel);
38
+ return {
39
+ added: newModel.filter(itemId => !selectorIsItemSelected(store.value, itemId)),
40
+ removed: oldModel.filter(itemId => !newModelLookup.has(itemId))
41
+ };
42
+ };
43
+ export const propagateSelection = ({
44
+ store,
45
+ selectionPropagation,
46
+ newModel,
47
+ oldModel,
48
+ additionalItemsToPropagate
49
+ }) => {
50
+ if (!selectionPropagation.descendants && !selectionPropagation.parents) {
51
+ return newModel;
52
+ }
53
+ let shouldRegenerateModel = false;
54
+ const newModelLookup = getLookupFromArray(newModel);
55
+ const changes = getAddedAndRemovedItems({
56
+ store,
57
+ newModel,
58
+ oldModel
59
+ });
60
+ additionalItemsToPropagate?.forEach(itemId => {
61
+ if (newModelLookup[itemId]) {
62
+ if (!changes.added.includes(itemId)) {
63
+ changes.added.push(itemId);
64
+ }
65
+ } else if (!changes.removed.includes(itemId)) {
66
+ changes.removed.push(itemId);
67
+ }
68
+ });
69
+ changes.added.forEach(addedItemId => {
70
+ if (selectionPropagation.descendants) {
71
+ const selectDescendants = itemId => {
72
+ if (itemId !== addedItemId) {
73
+ shouldRegenerateModel = true;
74
+ newModelLookup[itemId] = true;
75
+ }
76
+ selectorItemOrderedChildrenIds(store.value, itemId).forEach(selectDescendants);
77
+ };
78
+ selectDescendants(addedItemId);
79
+ }
80
+ if (selectionPropagation.parents) {
81
+ const checkAllDescendantsSelected = itemId => {
82
+ if (!newModelLookup[itemId]) {
83
+ return false;
84
+ }
85
+ const children = selectorItemOrderedChildrenIds(store.value, itemId);
86
+ return children.every(checkAllDescendantsSelected);
87
+ };
88
+ const selectParents = itemId => {
89
+ const parentId = selectorItemParentId(store.value, itemId);
90
+ if (parentId == null) {
91
+ return;
92
+ }
93
+ const siblings = selectorItemOrderedChildrenIds(store.value, parentId);
94
+ if (siblings.every(checkAllDescendantsSelected)) {
95
+ shouldRegenerateModel = true;
96
+ newModelLookup[parentId] = true;
97
+ selectParents(parentId);
98
+ }
99
+ };
100
+ selectParents(addedItemId);
101
+ }
102
+ });
103
+ changes.removed.forEach(removedItemId => {
104
+ if (selectionPropagation.parents) {
105
+ let parentId = selectorItemParentId(store.value, removedItemId);
106
+ while (parentId != null) {
107
+ if (newModelLookup[parentId]) {
108
+ shouldRegenerateModel = true;
109
+ delete newModelLookup[parentId];
110
+ }
111
+ parentId = selectorItemParentId(store.value, parentId);
112
+ }
113
+ }
114
+ if (selectionPropagation.descendants) {
115
+ const deSelectDescendants = itemId => {
116
+ if (itemId !== removedItemId) {
117
+ shouldRegenerateModel = true;
118
+ delete newModelLookup[itemId];
119
+ }
120
+ selectorItemOrderedChildrenIds(store.value, itemId).forEach(deSelectDescendants);
121
+ };
122
+ deSelectDescendants(removedItemId);
123
+ }
124
+ });
125
+ return shouldRegenerateModel ? Object.keys(newModelLookup) : newModel;
21
126
  };
@@ -5,6 +5,7 @@ import { useTreeViewModels } from "./useTreeViewModels.js";
5
5
  import { TREE_VIEW_CORE_PLUGINS } from "../corePlugins/index.js";
6
6
  import { extractPluginParamsFromProps } from "./extractPluginParamsFromProps.js";
7
7
  import { useTreeViewBuildContext } from "./useTreeViewBuildContext.js";
8
+ import { TreeViewStore } from "../utils/TreeViewStore.js";
8
9
  export function useTreeViewApiInitialization(inputApiRef) {
9
10
  const fallbackPublicApiRef = React.useRef({});
10
11
  if (inputApiRef) {
@@ -15,12 +16,13 @@ export function useTreeViewApiInitialization(inputApiRef) {
15
16
  }
16
17
  return fallbackPublicApiRef.current;
17
18
  }
19
+ let globalId = 0;
18
20
  export const useTreeView = ({
19
21
  plugins: inPlugins,
20
22
  rootRef,
21
23
  props
22
24
  }) => {
23
- const plugins = [...TREE_VIEW_CORE_PLUGINS, ...inPlugins];
25
+ const plugins = React.useMemo(() => [...TREE_VIEW_CORE_PLUGINS, ...inPlugins], [inPlugins]);
24
26
  const {
25
27
  pluginParams,
26
28
  forwardedProps,
@@ -38,22 +40,30 @@ export const useTreeView = ({
38
40
  const publicAPI = useTreeViewApiInitialization(apiRef);
39
41
  const innerRootRef = React.useRef(null);
40
42
  const handleRootRef = useForkRef(innerRootRef, rootRef);
41
- const contextValue = useTreeViewBuildContext({
42
- plugins,
43
- instance,
44
- publicAPI,
45
- rootRef: innerRootRef
46
- });
47
- const [state, setState] = React.useState(() => {
48
- const temp = {};
43
+ const storeRef = React.useRef(null);
44
+ if (storeRef.current == null) {
45
+ globalId += 1;
46
+ const initialState = {
47
+ cacheKey: {
48
+ id: globalId
49
+ }
50
+ };
49
51
  plugins.forEach(plugin => {
50
52
  if (plugin.getInitialState) {
51
- Object.assign(temp, plugin.getInitialState(pluginParams));
53
+ Object.assign(initialState, plugin.getInitialState(pluginParams));
52
54
  }
53
55
  });
54
- return temp;
56
+ storeRef.current = new TreeViewStore(initialState);
57
+ }
58
+ const baseContextValue = useTreeViewBuildContext({
59
+ plugins,
60
+ instance,
61
+ publicAPI,
62
+ store: storeRef.current,
63
+ rootRef: innerRootRef
55
64
  });
56
65
  const rootPropsGetters = [];
66
+ const pluginContextValues = [];
57
67
  const runPlugin = plugin => {
58
68
  const pluginResponse = plugin({
59
69
  instance,
@@ -61,11 +71,10 @@ export const useTreeView = ({
61
71
  slots,
62
72
  slotProps,
63
73
  experimentalFeatures,
64
- state,
65
- setState,
66
74
  rootRef: innerRootRef,
67
75
  models,
68
- plugins
76
+ plugins,
77
+ store: storeRef.current
69
78
  });
70
79
  if (pluginResponse.getRootProps) {
71
80
  rootPropsGetters.push(pluginResponse.getRootProps);
@@ -77,7 +86,7 @@ export const useTreeView = ({
77
86
  Object.assign(instance, pluginResponse.instance);
78
87
  }
79
88
  if (pluginResponse.contextValue) {
80
- Object.assign(contextValue, pluginResponse.contextValue);
89
+ pluginContextValues.push(pluginResponse.contextValue);
81
90
  }
82
91
  };
83
92
  plugins.forEach(runPlugin);
@@ -92,10 +101,14 @@ export const useTreeView = ({
92
101
  });
93
102
  return rootProps;
94
103
  };
104
+ const contextValue = React.useMemo(() => {
105
+ const copiedBaseContextValue = _extends({}, baseContextValue);
106
+ return Object.assign(copiedBaseContextValue, ...pluginContextValues);
107
+ // eslint-disable-next-line react-hooks/exhaustive-deps
108
+ }, [baseContextValue, ...pluginContextValues]);
95
109
  return {
96
110
  getRootProps,
97
111
  rootRef: handleRootRef,
98
- contextValue,
99
- instance
112
+ contextValue
100
113
  };
101
114
  };
@@ -1,10 +1,12 @@
1
+ import * as React from 'react';
1
2
  export const useTreeViewBuildContext = ({
2
3
  plugins,
3
4
  instance,
4
5
  publicAPI,
6
+ store,
5
7
  rootRef
6
8
  }) => {
7
- const runItemPlugins = itemPluginProps => {
9
+ const runItemPlugins = React.useCallback(itemPluginProps => {
8
10
  let finalRootRef = null;
9
11
  let finalContentRef = null;
10
12
  const pluginPropEnhancers = [];
@@ -49,10 +51,11 @@ export const useTreeViewBuildContext = ({
49
51
  rootRef: finalRootRef,
50
52
  propsEnhancers
51
53
  };
52
- };
53
- const wrapItem = ({
54
+ }, [plugins]);
55
+ const wrapItem = React.useCallback(({
54
56
  itemId,
55
- children
57
+ children,
58
+ idAttribute
56
59
  }) => {
57
60
  let finalChildren = children;
58
61
  // The wrappers are reversed to ensure that the first wrapper is the outermost one.
@@ -60,15 +63,16 @@ export const useTreeViewBuildContext = ({
60
63
  const plugin = plugins[i];
61
64
  if (plugin.wrapItem) {
62
65
  finalChildren = plugin.wrapItem({
66
+ instance,
63
67
  itemId,
64
68
  children: finalChildren,
65
- instance
69
+ idAttribute
66
70
  });
67
71
  }
68
72
  }
69
73
  return finalChildren;
70
- };
71
- const wrapRoot = ({
74
+ }, [plugins, instance]);
75
+ const wrapRoot = React.useCallback(({
72
76
  children
73
77
  }) => {
74
78
  let finalChildren = children;
@@ -77,19 +81,21 @@ export const useTreeViewBuildContext = ({
77
81
  const plugin = plugins[i];
78
82
  if (plugin.wrapRoot) {
79
83
  finalChildren = plugin.wrapRoot({
80
- children: finalChildren,
81
- instance
84
+ children: finalChildren
82
85
  });
83
86
  }
84
87
  }
85
88
  return finalChildren;
86
- };
87
- return {
88
- runItemPlugins,
89
- wrapItem,
90
- wrapRoot,
91
- instance,
92
- rootRef,
93
- publicAPI
94
- };
89
+ }, [plugins]);
90
+ return React.useMemo(() => {
91
+ return {
92
+ runItemPlugins,
93
+ wrapItem,
94
+ wrapRoot,
95
+ instance,
96
+ publicAPI,
97
+ store,
98
+ rootRef
99
+ };
100
+ }, [runItemPlugins, wrapItem, wrapRoot, instance, publicAPI, store, rootRef]);
95
101
  };
@@ -0,0 +1,24 @@
1
+ export class TreeViewStore {
2
+ constructor(value) {
3
+ this.value = void 0;
4
+ this.listeners = void 0;
5
+ this.subscribe = fn => {
6
+ this.listeners.add(fn);
7
+ return () => {
8
+ this.listeners.delete(fn);
9
+ };
10
+ };
11
+ this.getSnapshot = () => {
12
+ return this.value;
13
+ };
14
+ this.update = updater => {
15
+ const newState = updater(this.value);
16
+ if (newState !== this.value) {
17
+ this.value = newState;
18
+ this.listeners.forEach(l => l(newState));
19
+ }
20
+ };
21
+ this.value = value;
22
+ this.listeners = new Set();
23
+ }
24
+ }
@@ -0,0 +1,37 @@
1
+ import { lruMemoize, createSelectorCreator } from 'reselect';
2
+ const reselectCreateSelector = createSelectorCreator({
3
+ memoize: lruMemoize,
4
+ memoizeOptions: {
5
+ maxSize: 1,
6
+ equalityCheck: Object.is
7
+ }
8
+ });
9
+ const cache = new WeakMap();
10
+ /**
11
+ * Method wrapping reselect's createSelector to provide caching for tree view instances.
12
+ *
13
+ */
14
+ export const createSelector = (...createSelectorArgs) => {
15
+ const selector = (state, selectorArgs) => {
16
+ const cacheKey = state.cacheKey;
17
+
18
+ // If there is no cache for the current tree view instance, create one.
19
+ let cacheForCurrentTreeViewInstance = cache.get(cacheKey);
20
+ if (!cacheForCurrentTreeViewInstance) {
21
+ cacheForCurrentTreeViewInstance = new Map();
22
+ cache.set(cacheKey, cacheForCurrentTreeViewInstance);
23
+ }
24
+
25
+ // If there is a cached selector, execute it.
26
+ const cachedSelector = cacheForCurrentTreeViewInstance.get(createSelectorArgs);
27
+ if (cachedSelector) {
28
+ return cachedSelector(state, selectorArgs);
29
+ }
30
+
31
+ // Otherwise, create a new selector and cache it and execute it.
32
+ const fn = reselectCreateSelector(...createSelectorArgs);
33
+ cacheForCurrentTreeViewInstance.set(createSelectorArgs, fn);
34
+ return fn(state, selectorArgs);
35
+ };
36
+ return selector;
37
+ };