@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
@@ -7,30 +7,38 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.useTreeViewLabelItemPlugin = void 0;
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
  var _TreeViewProvider = require("../../TreeViewProvider");
10
+ var _useSelector = require("../../hooks/useSelector");
11
+ var _useTreeViewLabel = require("./useTreeViewLabel.selectors");
10
12
  const useTreeViewLabelItemPlugin = ({
11
13
  props
12
14
  }) => {
13
15
  const {
14
- instance
16
+ store,
17
+ label: {
18
+ isItemEditable
19
+ }
15
20
  } = (0, _TreeViewProvider.useTreeViewContext)();
16
21
  const {
17
22
  label,
18
23
  itemId
19
24
  } = props;
20
25
  const [labelInputValue, setLabelInputValue] = React.useState(label);
21
- const isItemBeingEdited = instance.isItemBeingEdited(itemId);
26
+ const editable = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemEditable, {
27
+ itemId,
28
+ isItemEditable
29
+ });
30
+ const editing = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemBeingEdited, itemId);
22
31
  React.useEffect(() => {
23
- if (!isItemBeingEdited) {
32
+ if (!editing) {
24
33
  setLabelInputValue(label);
25
34
  }
26
- }, [isItemBeingEdited, label]);
35
+ }, [editing, label]);
27
36
  return {
28
37
  propsEnhancers: {
29
38
  labelInput: ({
30
39
  externalEventHandlers,
31
40
  interactions
32
41
  }) => {
33
- const editable = instance.isItemEditable(itemId);
34
42
  if (!editable) {
35
43
  return {};
36
44
  }
@@ -11,41 +11,26 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _warning = require("@mui/x-internals/warning");
12
12
  var _useTreeViewLabel = require("./useTreeViewLabel.itemPlugin");
13
13
  const useTreeViewLabel = ({
14
- instance,
15
- state,
16
- setState,
14
+ store,
17
15
  params
18
16
  }) => {
19
- const editedItemRef = React.useRef(state.editedItemId);
20
- const isItemBeingEditedRef = itemId => editedItemRef.current === itemId;
21
17
  const setEditedItemId = editedItemId => {
22
- setState(prevState => (0, _extends2.default)({}, prevState, {
23
- editedItemId
18
+ store.update(prevState => (0, _extends2.default)({}, prevState, {
19
+ label: {
20
+ editedItemId
21
+ }
24
22
  }));
25
- editedItemRef.current = editedItemId;
26
- };
27
- const isItemBeingEdited = itemId => itemId === state.editedItemId;
28
- const isTreeViewEditable = Boolean(params.isItemEditable);
29
- const isItemEditable = itemId => {
30
- if (itemId == null || !isTreeViewEditable) {
31
- return false;
32
- }
33
- const item = instance.getItem(itemId);
34
- if (!item) {
35
- return false;
36
- }
37
- return typeof params.isItemEditable === 'function' ? params.isItemEditable(item) : Boolean(params.isItemEditable);
38
23
  };
39
24
  const updateItemLabel = (itemId, label) => {
40
25
  if (!label) {
41
26
  throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'The label of an item cannot be empty.', itemId].join('\n'));
42
27
  }
43
- setState(prevState => {
44
- const item = prevState.items.itemMetaMap[itemId];
28
+ store.update(prevState => {
29
+ const item = prevState.items.itemMetaLookup[itemId];
45
30
  if (item.label !== label) {
46
31
  return (0, _extends2.default)({}, prevState, {
47
32
  items: (0, _extends2.default)({}, prevState.items, {
48
- itemMetaMap: (0, _extends2.default)({}, prevState.items.itemMetaMap, {
33
+ itemMetaLookup: (0, _extends2.default)({}, prevState.items.itemMetaLookup, {
49
34
  [itemId]: (0, _extends2.default)({}, item, {
50
35
  label
51
36
  })
@@ -59,18 +44,20 @@ const useTreeViewLabel = ({
59
44
  params.onItemLabelChange(itemId, label);
60
45
  }
61
46
  };
47
+ const pluginContextValue = React.useMemo(() => ({
48
+ label: {
49
+ isItemEditable: params.isItemEditable
50
+ }
51
+ }), [params.isItemEditable]);
62
52
  return {
63
53
  instance: {
64
54
  setEditedItemId,
65
- isItemBeingEdited,
66
- updateItemLabel,
67
- isItemEditable,
68
- isTreeViewEditable,
69
- isItemBeingEditedRef
55
+ updateItemLabel
70
56
  },
71
57
  publicAPI: {
72
58
  updateItemLabel
73
- }
59
+ },
60
+ contextValue: pluginContextValue
74
61
  };
75
62
  };
76
63
  exports.useTreeViewLabel = useTreeViewLabel;
@@ -90,7 +77,9 @@ useTreeViewLabel.getDefaultizedParams = ({
90
77
  });
91
78
  };
92
79
  useTreeViewLabel.getInitialState = () => ({
93
- editedItemId: null
80
+ label: {
81
+ editedItemId: null
82
+ }
94
83
  });
95
84
  useTreeViewLabel.params = {
96
85
  onItemLabelChange: true,
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectorIsItemEditable = exports.selectorIsItemBeingEdited = void 0;
7
+ var _selectors = require("../../utils/selectors");
8
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
9
+ const selectorTreeViewLabelState = state => state.label;
10
+
11
+ /**
12
+ * Check if an item is editable.
13
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
14
+ * @param {object} params The parameters.
15
+ * @param {TreeViewItemId} params.itemId The id of the item to check.
16
+ * @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
17
+ * @returns {boolean} `true` if the item is editable, `false` otherwise.
18
+ */
19
+ const selectorIsItemEditable = exports.selectorIsItemEditable = (0, _selectors.createSelector)([(_, args) => args, (state, args) => (0, _useTreeViewItems.selectorItemModel)(state, args.itemId)], (args, itemModel) => {
20
+ if (!itemModel || !args.isItemEditable) {
21
+ return false;
22
+ }
23
+ return typeof args.isItemEditable === 'function' ? args.isItemEditable(itemModel) : true;
24
+ });
25
+
26
+ /**
27
+ * Check if an item is being edited.
28
+ * @param {TreeViewState<[UseTreeViewLabelSignature]>} state The state of the tree view.
29
+ * @param {TreeViewItemId} itemId The id of the item to check.
30
+ * @returns {boolean} `true` if the item is being edited, `false` otherwise.
31
+ */
32
+ const selectorIsItemBeingEdited = exports.selectorIsItemBeingEdited = (0, _selectors.createSelector)([selectorTreeViewLabelState, (_, itemId) => itemId], (labelState, itemId) => labelState.editedItemId === itemId);
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeViewSelectionItemPlugin = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _TreeViewProvider = require("../../TreeViewProvider");
10
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
11
+ var _useTreeViewSelection = require("./useTreeViewSelection.selectors");
12
+ function getCheckboxStatus({
13
+ itemId,
14
+ store,
15
+ selectionPropagation,
16
+ selected
17
+ }) {
18
+ if (selected) {
19
+ return {
20
+ indeterminate: false,
21
+ checked: true
22
+ };
23
+ }
24
+ const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId);
25
+ if (children.length === 0) {
26
+ return {
27
+ indeterminate: false,
28
+ checked: false
29
+ };
30
+ }
31
+ let hasSelectedDescendant = false;
32
+ let hasUnSelectedDescendant = false;
33
+ const traverseDescendants = itemToTraverseId => {
34
+ if (itemToTraverseId !== itemId) {
35
+ if ((0, _useTreeViewSelection.selectorIsItemSelected)(store.value, itemToTraverseId)) {
36
+ hasSelectedDescendant = true;
37
+ } else {
38
+ hasUnSelectedDescendant = true;
39
+ }
40
+ }
41
+ (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemToTraverseId).forEach(traverseDescendants);
42
+ };
43
+ traverseDescendants(itemId);
44
+ return {
45
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
46
+ checked: selectionPropagation.parents ? hasSelectedDescendant : selected
47
+ };
48
+ }
49
+ const useTreeViewSelectionItemPlugin = ({
50
+ props
51
+ }) => {
52
+ const {
53
+ itemId
54
+ } = props;
55
+ const {
56
+ store,
57
+ selection: {
58
+ disableSelection,
59
+ checkboxSelection,
60
+ selectionPropagation
61
+ }
62
+ } = (0, _TreeViewProvider.useTreeViewContext)();
63
+ return {
64
+ propsEnhancers: {
65
+ checkbox: ({
66
+ externalEventHandlers,
67
+ interactions,
68
+ status
69
+ }) => {
70
+ const handleChange = event => {
71
+ externalEventHandlers.onChange?.(event);
72
+ if (event.defaultMuiPrevented) {
73
+ return;
74
+ }
75
+ if (disableSelection || status.disabled) {
76
+ return;
77
+ }
78
+ interactions.handleCheckboxSelection(event);
79
+ };
80
+ const checkboxStatus = getCheckboxStatus({
81
+ store,
82
+ itemId,
83
+ selectionPropagation,
84
+ selected: status.selected
85
+ });
86
+ return (0, _extends2.default)({
87
+ visible: checkboxSelection,
88
+ disabled: disableSelection || status.disabled,
89
+ tabIndex: -1,
90
+ onChange: handleChange
91
+ }, checkboxStatus);
92
+ }
93
+ }
94
+ };
95
+ };
96
+ exports.useTreeViewSelectionItemPlugin = useTreeViewSelectionItemPlugin;
@@ -8,52 +8,67 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.useTreeViewSelection = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
+ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
11
12
  var _tree = require("../../utils/tree");
12
13
  var _useTreeViewSelection = require("./useTreeViewSelection.utils");
14
+ var _useTreeViewSelection2 = require("./useTreeViewSelection.selectors");
15
+ var _useTreeViewSelection3 = require("./useTreeViewSelection.itemPlugin");
13
16
  const useTreeViewSelection = ({
14
- instance,
17
+ store,
15
18
  params,
16
19
  models
17
20
  }) => {
18
21
  const lastSelectedItem = React.useRef(null);
19
22
  const lastSelectedRange = React.useRef({});
20
- const selectedItemsMap = React.useMemo(() => {
21
- const temp = new Map();
22
- if (Array.isArray(models.selectedItems.value)) {
23
- models.selectedItems.value.forEach(id => {
24
- temp.set(id, true);
23
+ (0, _useEnhancedEffect.default)(() => {
24
+ store.update(prevState => (0, _extends2.default)({}, prevState, {
25
+ selection: {
26
+ selectedItemsMap: (0, _useTreeViewSelection.createSelectedItemsMap)(models.selectedItems.value)
27
+ }
28
+ }));
29
+ }, [store, models.selectedItems.value]);
30
+ const setSelectedItems = (event, newModel, additionalItemsToPropagate) => {
31
+ let cleanModel;
32
+ if (params.multiSelect && (params.selectionPropagation.descendants || params.selectionPropagation.parents)) {
33
+ cleanModel = (0, _useTreeViewSelection.propagateSelection)({
34
+ store,
35
+ selectionPropagation: params.selectionPropagation,
36
+ newModel: newModel,
37
+ oldModel: models.selectedItems.value,
38
+ additionalItemsToPropagate
25
39
  });
26
- } else if (models.selectedItems.value != null) {
27
- temp.set(models.selectedItems.value, true);
40
+ } else {
41
+ cleanModel = newModel;
28
42
  }
29
- return temp;
30
- }, [models.selectedItems.value]);
31
- const setSelectedItems = (event, newSelectedItems) => {
32
43
  if (params.onItemSelectionToggle) {
33
44
  if (params.multiSelect) {
34
- const addedItems = newSelectedItems.filter(itemId => !instance.isItemSelected(itemId));
35
- const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
36
- addedItems.forEach(itemId => {
37
- params.onItemSelectionToggle(event, itemId, true);
38
- });
39
- removedItems.forEach(itemId => {
40
- params.onItemSelectionToggle(event, itemId, false);
45
+ const changes = (0, _useTreeViewSelection.getAddedAndRemovedItems)({
46
+ store,
47
+ newModel: cleanModel,
48
+ oldModel: models.selectedItems.value
41
49
  });
42
- } else if (newSelectedItems !== models.selectedItems.value) {
50
+ if (params.onItemSelectionToggle) {
51
+ changes.added.forEach(itemId => {
52
+ params.onItemSelectionToggle(event, itemId, true);
53
+ });
54
+ changes.removed.forEach(itemId => {
55
+ params.onItemSelectionToggle(event, itemId, false);
56
+ });
57
+ }
58
+ } else if (params.onItemSelectionToggle && cleanModel !== models.selectedItems.value) {
43
59
  if (models.selectedItems.value != null) {
44
60
  params.onItemSelectionToggle(event, models.selectedItems.value, false);
45
61
  }
46
- if (newSelectedItems != null) {
47
- params.onItemSelectionToggle(event, newSelectedItems, true);
62
+ if (cleanModel != null) {
63
+ params.onItemSelectionToggle(event, cleanModel, true);
48
64
  }
49
65
  }
50
66
  }
51
67
  if (params.onSelectedItemsChange) {
52
- params.onSelectedItemsChange(event, newSelectedItems);
68
+ params.onSelectedItemsChange(event, cleanModel);
53
69
  }
54
- models.selectedItems.setControlledValue(newSelectedItems);
70
+ models.selectedItems.setControlledValue(cleanModel);
55
71
  };
56
- const isItemSelected = itemId => selectedItemsMap.has(itemId);
57
72
  const selectItem = ({
58
73
  event,
59
74
  itemId,
@@ -66,7 +81,7 @@ const useTreeViewSelection = ({
66
81
  let newSelected;
67
82
  if (keepExistingSelection) {
68
83
  const cleanSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value);
69
- const isSelectedBefore = instance.isItemSelected(itemId);
84
+ const isSelectedBefore = (0, _useTreeViewSelection2.selectorIsItemSelected)(store.value, itemId);
70
85
  if (isSelectedBefore && (shouldBeSelected === false || shouldBeSelected == null)) {
71
86
  newSelected = cleanSelectedItems.filter(id => id !== itemId);
72
87
  } else if (!isSelectedBefore && (shouldBeSelected === true || shouldBeSelected == null)) {
@@ -76,13 +91,16 @@ const useTreeViewSelection = ({
76
91
  }
77
92
  } else {
78
93
  // eslint-disable-next-line no-lonely-if
79
- if (shouldBeSelected === false || shouldBeSelected == null && instance.isItemSelected(itemId)) {
94
+ if (shouldBeSelected === false || shouldBeSelected == null && (0, _useTreeViewSelection2.selectorIsItemSelected)(store.value, itemId)) {
80
95
  newSelected = params.multiSelect ? [] : null;
81
96
  } else {
82
97
  newSelected = params.multiSelect ? [itemId] : itemId;
83
98
  }
84
99
  }
85
- setSelectedItems(event, newSelected);
100
+ setSelectedItems(event, newSelected,
101
+ // If shouldBeSelected === selectorIsItemSelected(store, itemId), we still want to propagate the select.
102
+ // This is useful when the element is in an indeterminate state.
103
+ [itemId]);
86
104
  lastSelectedItem.current = itemId;
87
105
  lastSelectedRange.current = {};
88
106
  };
@@ -100,7 +118,7 @@ const useTreeViewSelection = ({
100
118
 
101
119
  // Add to the model the items that are part of the new range and not already part of the model.
102
120
  const selectedItemsLookup = (0, _useTreeViewSelection.getLookupFromArray)(newSelectedItems);
103
- const range = (0, _tree.getNonDisabledItemsInRange)(instance, start, end);
121
+ const range = (0, _tree.getNonDisabledItemsInRange)(store.value, start, end);
104
122
  const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
105
123
  newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
106
124
  setSelectedItems(event, newSelectedItems);
@@ -108,21 +126,21 @@ const useTreeViewSelection = ({
108
126
  };
109
127
  const expandSelectionRange = (event, itemId) => {
110
128
  if (lastSelectedItem.current != null) {
111
- const [start, end] = (0, _tree.findOrderInTremauxTree)(instance, itemId, lastSelectedItem.current);
129
+ const [start, end] = (0, _tree.findOrderInTremauxTree)(store.value, itemId, lastSelectedItem.current);
112
130
  selectRange(event, [start, end]);
113
131
  }
114
132
  };
115
133
  const selectRangeFromStartToItem = (event, itemId) => {
116
- selectRange(event, [(0, _tree.getFirstNavigableItem)(instance), itemId]);
134
+ selectRange(event, [(0, _tree.getFirstNavigableItem)(store.value), itemId]);
117
135
  };
118
136
  const selectRangeFromItemToEnd = (event, itemId) => {
119
- selectRange(event, [itemId, (0, _tree.getLastNavigableItem)(instance)]);
137
+ selectRange(event, [itemId, (0, _tree.getLastNavigableItem)(store.value)]);
120
138
  };
121
139
  const selectAllNavigableItems = event => {
122
140
  if (params.disableSelection || !params.multiSelect) {
123
141
  return;
124
142
  }
125
- const navigableItems = (0, _tree.getAllNavigableItems)(instance);
143
+ const navigableItems = (0, _tree.getAllNavigableItems)(store.value);
126
144
  setSelectedItems(event, navigableItems);
127
145
  lastSelectedRange.current = (0, _useTreeViewSelection.getLookupFromArray)(navigableItems);
128
146
  };
@@ -151,6 +169,17 @@ const useTreeViewSelection = ({
151
169
  }
152
170
  setSelectedItems(event, newSelectedItems);
153
171
  };
172
+ const pluginContextValue = React.useMemo(() => ({
173
+ selection: {
174
+ multiSelect: params.multiSelect,
175
+ checkboxSelection: params.checkboxSelection,
176
+ disableSelection: params.disableSelection,
177
+ selectionPropagation: {
178
+ descendants: params.selectionPropagation.descendants,
179
+ parents: params.selectionPropagation.parents
180
+ }
181
+ }
182
+ }), [params.multiSelect, params.checkboxSelection, params.disableSelection, params.selectionPropagation.descendants, params.selectionPropagation.parents]);
154
183
  return {
155
184
  getRootProps: () => ({
156
185
  'aria-multiselectable': params.multiSelect
@@ -159,7 +188,6 @@ const useTreeViewSelection = ({
159
188
  selectItem
160
189
  },
161
190
  instance: {
162
- isItemSelected,
163
191
  selectItem,
164
192
  selectAllNavigableItems,
165
193
  expandSelectionRange,
@@ -167,29 +195,36 @@ const useTreeViewSelection = ({
167
195
  selectRangeFromItemToEnd,
168
196
  selectItemFromArrowNavigation
169
197
  },
170
- contextValue: {
171
- selection: {
172
- multiSelect: params.multiSelect,
173
- checkboxSelection: params.checkboxSelection,
174
- disableSelection: params.disableSelection
175
- }
176
- }
198
+ contextValue: pluginContextValue
177
199
  };
178
200
  };
179
201
  exports.useTreeViewSelection = useTreeViewSelection;
202
+ useTreeViewSelection.itemPlugin = _useTreeViewSelection3.useTreeViewSelectionItemPlugin;
180
203
  useTreeViewSelection.models = {
181
204
  selectedItems: {
182
205
  getDefaultValue: params => params.defaultSelectedItems
183
206
  }
184
207
  };
185
208
  const DEFAULT_SELECTED_ITEMS = [];
209
+ const EMPTY_SELECTION_PROPAGATION = {};
186
210
  useTreeViewSelection.getDefaultizedParams = ({
187
211
  params
188
212
  }) => (0, _extends2.default)({}, params, {
189
213
  disableSelection: params.disableSelection ?? false,
190
214
  multiSelect: params.multiSelect ?? false,
191
215
  checkboxSelection: params.checkboxSelection ?? false,
192
- defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null)
216
+ defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null),
217
+ selectionPropagation: params.selectionPropagation ?? EMPTY_SELECTION_PROPAGATION
218
+ });
219
+ useTreeViewSelection.getInitialState = params => ({
220
+ selection: {
221
+ selectedItemsMap: (0, _useTreeViewSelection.createSelectedItemsMap)(params.selectedItems === undefined ? params.defaultSelectedItems : params.selectedItems)
222
+ }
223
+ });
224
+ useTreeViewSelection.getInitialState = params => ({
225
+ selection: {
226
+ selectedItemsMap: (0, _useTreeViewSelection.createSelectedItemsMap)(params.selectedItems === undefined ? params.defaultSelectedItems : params.selectedItems)
227
+ }
193
228
  });
194
229
  useTreeViewSelection.params = {
195
230
  disableSelection: true,
@@ -198,5 +233,6 @@ useTreeViewSelection.params = {
198
233
  defaultSelectedItems: true,
199
234
  selectedItems: true,
200
235
  onSelectedItemsChange: true,
201
- onItemSelectionToggle: true
236
+ onItemSelectionToggle: true,
237
+ selectionPropagation: true
202
238
  };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectorIsItemSelected = void 0;
7
+ var _selectors = require("../../utils/selectors");
8
+ const selectorTreeViewSelectionState = state => state.selection;
9
+
10
+ /**
11
+ * Check if an item is selected.
12
+ * @param {TreeViewState<[UseTreeViewSelectionSignature]>} state The state of the tree view.
13
+ * @returns {boolean} `true` if the item is selected, `false` otherwise.
14
+ */
15
+ const selectorIsItemSelected = exports.selectorIsItemSelected = (0, _selectors.createSelector)([selectorTreeViewSelectionState, (_, itemId) => itemId], (selectionState, itemId) => selectionState.selectedItemsMap.has(itemId));
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getLookupFromArray = exports.convertSelectedItemsToArray = void 0;
6
+ exports.propagateSelection = exports.getLookupFromArray = exports.getAddedAndRemovedItems = exports.createSelectedItemsMap = exports.convertSelectedItemsToArray = void 0;
7
+ var _useTreeViewSelection = require("./useTreeViewSelection.selectors");
8
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
7
9
  /**
8
10
  * Transform the `selectedItems` model to be an array if it was a string or null.
9
11
  * @param {string[] | string | null} model The raw model.
@@ -19,6 +21,14 @@ const convertSelectedItemsToArray = model => {
19
21
  return [];
20
22
  };
21
23
  exports.convertSelectedItemsToArray = convertSelectedItemsToArray;
24
+ const createSelectedItemsMap = selectedItems => {
25
+ const selectedItemsMap = new Map();
26
+ convertSelectedItemsToArray(selectedItems).forEach(id => {
27
+ selectedItemsMap.set(id, true);
28
+ });
29
+ return selectedItemsMap;
30
+ };
31
+ exports.createSelectedItemsMap = createSelectedItemsMap;
22
32
  const getLookupFromArray = array => {
23
33
  const lookup = {};
24
34
  array.forEach(itemId => {
@@ -26,4 +36,101 @@ const getLookupFromArray = array => {
26
36
  });
27
37
  return lookup;
28
38
  };
29
- exports.getLookupFromArray = getLookupFromArray;
39
+ exports.getLookupFromArray = getLookupFromArray;
40
+ const getAddedAndRemovedItems = ({
41
+ store,
42
+ oldModel,
43
+ newModel
44
+ }) => {
45
+ const newModelLookup = createSelectedItemsMap(newModel);
46
+ return {
47
+ added: newModel.filter(itemId => !(0, _useTreeViewSelection.selectorIsItemSelected)(store.value, itemId)),
48
+ removed: oldModel.filter(itemId => !newModelLookup.has(itemId))
49
+ };
50
+ };
51
+ exports.getAddedAndRemovedItems = getAddedAndRemovedItems;
52
+ const propagateSelection = ({
53
+ store,
54
+ selectionPropagation,
55
+ newModel,
56
+ oldModel,
57
+ additionalItemsToPropagate
58
+ }) => {
59
+ if (!selectionPropagation.descendants && !selectionPropagation.parents) {
60
+ return newModel;
61
+ }
62
+ let shouldRegenerateModel = false;
63
+ const newModelLookup = getLookupFromArray(newModel);
64
+ const changes = getAddedAndRemovedItems({
65
+ store,
66
+ newModel,
67
+ oldModel
68
+ });
69
+ additionalItemsToPropagate?.forEach(itemId => {
70
+ if (newModelLookup[itemId]) {
71
+ if (!changes.added.includes(itemId)) {
72
+ changes.added.push(itemId);
73
+ }
74
+ } else if (!changes.removed.includes(itemId)) {
75
+ changes.removed.push(itemId);
76
+ }
77
+ });
78
+ changes.added.forEach(addedItemId => {
79
+ if (selectionPropagation.descendants) {
80
+ const selectDescendants = itemId => {
81
+ if (itemId !== addedItemId) {
82
+ shouldRegenerateModel = true;
83
+ newModelLookup[itemId] = true;
84
+ }
85
+ (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId).forEach(selectDescendants);
86
+ };
87
+ selectDescendants(addedItemId);
88
+ }
89
+ if (selectionPropagation.parents) {
90
+ const checkAllDescendantsSelected = itemId => {
91
+ if (!newModelLookup[itemId]) {
92
+ return false;
93
+ }
94
+ const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId);
95
+ return children.every(checkAllDescendantsSelected);
96
+ };
97
+ const selectParents = itemId => {
98
+ const parentId = (0, _useTreeViewItems.selectorItemParentId)(store.value, itemId);
99
+ if (parentId == null) {
100
+ return;
101
+ }
102
+ const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, parentId);
103
+ if (siblings.every(checkAllDescendantsSelected)) {
104
+ shouldRegenerateModel = true;
105
+ newModelLookup[parentId] = true;
106
+ selectParents(parentId);
107
+ }
108
+ };
109
+ selectParents(addedItemId);
110
+ }
111
+ });
112
+ changes.removed.forEach(removedItemId => {
113
+ if (selectionPropagation.parents) {
114
+ let parentId = (0, _useTreeViewItems.selectorItemParentId)(store.value, removedItemId);
115
+ while (parentId != null) {
116
+ if (newModelLookup[parentId]) {
117
+ shouldRegenerateModel = true;
118
+ delete newModelLookup[parentId];
119
+ }
120
+ parentId = (0, _useTreeViewItems.selectorItemParentId)(store.value, parentId);
121
+ }
122
+ }
123
+ if (selectionPropagation.descendants) {
124
+ const deSelectDescendants = itemId => {
125
+ if (itemId !== removedItemId) {
126
+ shouldRegenerateModel = true;
127
+ delete newModelLookup[itemId];
128
+ }
129
+ (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId).forEach(deSelectDescendants);
130
+ };
131
+ deSelectDescendants(removedItemId);
132
+ }
133
+ });
134
+ return shouldRegenerateModel ? Object.keys(newModelLookup) : newModel;
135
+ };
136
+ exports.propagateSelection = propagateSelection;