@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
@@ -0,0 +1,74 @@
1
+ import { UseTreeViewLabelSignature } from './useTreeViewLabel.types';
2
+ import { TreeViewRootSelector } from '../../utils/selectors';
3
+ /**
4
+ * Check if an item is editable.
5
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
6
+ * @param {object} params The parameters.
7
+ * @param {TreeViewItemId} params.itemId The id of the item to check.
8
+ * @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
9
+ * @returns {boolean} `true` if the item is editable, `false` otherwise.
10
+ */
11
+ export declare const selectorIsItemEditable: ((state: any, args: any) => boolean) & {
12
+ clearCache: () => void;
13
+ resultsCount: () => number;
14
+ resetResultsCount: () => void;
15
+ } & {
16
+ resultFunc: (resultFuncArgs_0: {
17
+ itemId: string;
18
+ isItemEditable: ((item: any) => boolean) | boolean;
19
+ }, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean;
20
+ memoizedResultFunc: ((resultFuncArgs_0: {
21
+ itemId: string;
22
+ isItemEditable: ((item: any) => boolean) | boolean;
23
+ }, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean) & {
24
+ clearCache: () => void;
25
+ resultsCount: () => number;
26
+ resetResultsCount: () => void;
27
+ };
28
+ lastResult: () => boolean;
29
+ dependencies: [(_: any, args: {
30
+ itemId: string;
31
+ isItemEditable: ((item: any) => boolean) | boolean;
32
+ }) => {
33
+ itemId: string;
34
+ isItemEditable: ((item: any) => boolean) | boolean;
35
+ }, (state: any, args: any) => import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>];
36
+ recomputations: () => number;
37
+ resetRecomputations: () => void;
38
+ dependencyRecomputations: () => number;
39
+ resetDependencyRecomputations: () => void;
40
+ } & {
41
+ argsMemoize: typeof import("reselect").weakMapMemoize;
42
+ memoize: typeof import("reselect").weakMapMemoize;
43
+ };
44
+ /**
45
+ * Check if an item is being edited.
46
+ * @param {TreeViewState<[UseTreeViewLabelSignature]>} state The state of the tree view.
47
+ * @param {TreeViewItemId} itemId The id of the item to check.
48
+ * @returns {boolean} `true` if the item is being edited, `false` otherwise.
49
+ */
50
+ export declare const selectorIsItemBeingEdited: ((state: any, itemId: string) => boolean) & {
51
+ clearCache: () => void;
52
+ resultsCount: () => number;
53
+ resetResultsCount: () => void;
54
+ } & {
55
+ resultFunc: (resultFuncArgs_0: {
56
+ editedItemId: string | null;
57
+ }, resultFuncArgs_1: string) => boolean;
58
+ memoizedResultFunc: ((resultFuncArgs_0: {
59
+ editedItemId: string | null;
60
+ }, resultFuncArgs_1: string) => boolean) & {
61
+ clearCache: () => void;
62
+ resultsCount: () => number;
63
+ resetResultsCount: () => void;
64
+ };
65
+ lastResult: () => boolean;
66
+ dependencies: [TreeViewRootSelector<UseTreeViewLabelSignature>, (_: any, itemId: string) => string];
67
+ recomputations: () => number;
68
+ resetRecomputations: () => void;
69
+ dependencyRecomputations: () => number;
70
+ resetDependencyRecomputations: () => void;
71
+ } & {
72
+ argsMemoize: typeof import("reselect").weakMapMemoize;
73
+ memoize: typeof import("reselect").weakMapMemoize;
74
+ };
@@ -0,0 +1,26 @@
1
+ import { createSelector } from "../../utils/selectors.js";
2
+ import { selectorItemModel } from "../useTreeViewItems/useTreeViewItems.selectors.js";
3
+ const selectorTreeViewLabelState = state => state.label;
4
+
5
+ /**
6
+ * Check if an item is editable.
7
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
8
+ * @param {object} params The parameters.
9
+ * @param {TreeViewItemId} params.itemId The id of the item to check.
10
+ * @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
11
+ * @returns {boolean} `true` if the item is editable, `false` otherwise.
12
+ */
13
+ export const selectorIsItemEditable = createSelector([(_, args) => args, (state, args) => selectorItemModel(state, args.itemId)], (args, itemModel) => {
14
+ if (!itemModel || !args.isItemEditable) {
15
+ return false;
16
+ }
17
+ return typeof args.isItemEditable === 'function' ? args.isItemEditable(itemModel) : true;
18
+ });
19
+
20
+ /**
21
+ * Check if an item is being edited.
22
+ * @param {TreeViewState<[UseTreeViewLabelSignature]>} state The state of the tree view.
23
+ * @param {TreeViewItemId} itemId The id of the item to check.
24
+ * @returns {boolean} `true` if the item is being edited, `false` otherwise.
25
+ */
26
+ export const selectorIsItemBeingEdited = createSelector([selectorTreeViewLabelState, (_, itemId) => itemId], (labelState, itemId) => labelState.editedItemId === itemId);
@@ -1,7 +1,8 @@
1
- import { DefaultizedProps, TreeViewPluginSignature } from '../../models';
1
+ import { DefaultizedProps } from '@mui/x-internals/types';
2
+ import { TreeViewPluginSignature } from '../../models';
2
3
  import { TreeViewItemId } from '../../../models';
3
4
  import { UseTreeViewItemsSignature } from '../useTreeViewItems';
4
- import { TreeItem2LabelInputProps } from '../../../TreeItem2LabelInput';
5
+ import { TreeItemLabelInputProps } from '../../../TreeItemLabelInput';
5
6
  export interface UseTreeViewLabelPublicAPI {
6
7
  /**
7
8
  * Used to update the label of an item.
@@ -17,29 +18,6 @@ export interface UseTreeViewLabelInstance extends UseTreeViewLabelPublicAPI {
17
18
  * @returns {void}.
18
19
  */
19
20
  setEditedItemId: (itemId: TreeViewItemId | null) => void;
20
- /**
21
- * Checks if an item is being edited or not.
22
- * @param {TreeViewItemId} itemId The id of the item to check.
23
- * @returns {boolean}.
24
- */
25
- isItemBeingEdited: (itemId: TreeViewItemId) => boolean;
26
- /**
27
- * Checks if an item is being edited or not.
28
- * Purely internal use, used to avoid unnecessarily calling `updateItemLabel` twice.
29
- * @param {TreeViewItemId} itemId The id of the item to check.
30
- * @returns {boolean}.
31
- */
32
- isItemBeingEditedRef: (itemId: TreeViewItemId) => boolean;
33
- /**
34
- * Determines if a given item is editable.
35
- * @param {TreeViewItemId} itemId The id of the item to check.
36
- * @returns {boolean} `true` if the item is editable.
37
- */
38
- isItemEditable: (itemId: TreeViewItemId) => boolean;
39
- /**
40
- * Set to `true` if the Tree View is editable.
41
- */
42
- isTreeViewEditable: boolean;
43
21
  }
44
22
  export interface UseTreeViewLabelParameters<R extends {}> {
45
23
  /**
@@ -61,7 +39,12 @@ export interface UseTreeViewLabelParameters<R extends {}> {
61
39
  }
62
40
  export type UseTreeViewLabelDefaultizedParameters<R extends {}> = DefaultizedProps<UseTreeViewLabelParameters<R>, 'isItemEditable'>;
63
41
  export interface UseTreeViewLabelState {
64
- editedItemId: string | null;
42
+ label: {
43
+ editedItemId: string | null;
44
+ };
45
+ }
46
+ export interface UseTreeViewLabelContextValue {
47
+ label: Pick<UseTreeViewLabelDefaultizedParameters<any>, 'isItemEditable'>;
65
48
  }
66
49
  export type UseTreeViewLabelSignature = TreeViewPluginSignature<{
67
50
  params: UseTreeViewLabelParameters<any>;
@@ -69,12 +52,13 @@ export type UseTreeViewLabelSignature = TreeViewPluginSignature<{
69
52
  publicAPI: UseTreeViewLabelPublicAPI;
70
53
  instance: UseTreeViewLabelInstance;
71
54
  state: UseTreeViewLabelState;
55
+ contextValue: UseTreeViewLabelContextValue;
72
56
  experimentalFeatures: 'labelEditing';
73
57
  dependencies: [UseTreeViewItemsSignature];
74
58
  }>;
75
- export interface UseTreeItem2LabelInputSlotPropsFromLabelEditing extends TreeItem2LabelInputProps {
59
+ export interface UseTreeItemLabelInputSlotPropsFromLabelEditing extends TreeItemLabelInputProps {
76
60
  }
77
- declare module '@mui/x-tree-view/useTreeItem2' {
78
- interface UseTreeItem2LabelInputSlotOwnProps extends UseTreeItem2LabelInputSlotPropsFromLabelEditing {
61
+ declare module '@mui/x-tree-view/useTreeItem' {
62
+ interface UseTreeItemLabelInputSlotOwnProps extends UseTreeItemLabelInputSlotPropsFromLabelEditing {
79
63
  }
80
64
  }
@@ -0,0 +1,2 @@
1
+ import { TreeViewItemPlugin } from '../../models';
2
+ export declare const useTreeViewSelectionItemPlugin: TreeViewItemPlugin;
@@ -0,0 +1,88 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { useTreeViewContext } from "../../TreeViewProvider/index.js";
3
+ import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
4
+ import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
5
+ function getCheckboxStatus({
6
+ itemId,
7
+ store,
8
+ selectionPropagation,
9
+ selected
10
+ }) {
11
+ if (selected) {
12
+ return {
13
+ indeterminate: false,
14
+ checked: true
15
+ };
16
+ }
17
+ const children = selectorItemOrderedChildrenIds(store.value, itemId);
18
+ if (children.length === 0) {
19
+ return {
20
+ indeterminate: false,
21
+ checked: false
22
+ };
23
+ }
24
+ let hasSelectedDescendant = false;
25
+ let hasUnSelectedDescendant = false;
26
+ const traverseDescendants = itemToTraverseId => {
27
+ if (itemToTraverseId !== itemId) {
28
+ if (selectorIsItemSelected(store.value, itemToTraverseId)) {
29
+ hasSelectedDescendant = true;
30
+ } else {
31
+ hasUnSelectedDescendant = true;
32
+ }
33
+ }
34
+ selectorItemOrderedChildrenIds(store.value, itemToTraverseId).forEach(traverseDescendants);
35
+ };
36
+ traverseDescendants(itemId);
37
+ return {
38
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
39
+ checked: selectionPropagation.parents ? hasSelectedDescendant : selected
40
+ };
41
+ }
42
+ export const useTreeViewSelectionItemPlugin = ({
43
+ props
44
+ }) => {
45
+ const {
46
+ itemId
47
+ } = props;
48
+ const {
49
+ store,
50
+ selection: {
51
+ disableSelection,
52
+ checkboxSelection,
53
+ selectionPropagation
54
+ }
55
+ } = useTreeViewContext();
56
+ return {
57
+ propsEnhancers: {
58
+ checkbox: ({
59
+ externalEventHandlers,
60
+ interactions,
61
+ status
62
+ }) => {
63
+ const handleChange = event => {
64
+ externalEventHandlers.onChange?.(event);
65
+ if (event.defaultMuiPrevented) {
66
+ return;
67
+ }
68
+ if (disableSelection || status.disabled) {
69
+ return;
70
+ }
71
+ interactions.handleCheckboxSelection(event);
72
+ };
73
+ const checkboxStatus = getCheckboxStatus({
74
+ store,
75
+ itemId,
76
+ selectionPropagation,
77
+ selected: status.selected
78
+ });
79
+ return _extends({
80
+ visible: checkboxSelection,
81
+ disabled: disableSelection || status.disabled,
82
+ tabIndex: -1,
83
+ onChange: handleChange
84
+ }, checkboxStatus);
85
+ }
86
+ }
87
+ };
88
+ };
@@ -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,32 @@
1
+ import { TreeViewRootSelector } from '../../utils/selectors';
2
+ import { UseTreeViewSelectionSignature } from './useTreeViewSelection.types';
3
+ /**
4
+ * Check if an item is selected.
5
+ * @param {TreeViewState<[UseTreeViewSelectionSignature]>} state The state of the tree view.
6
+ * @returns {boolean} `true` if the item is selected, `false` otherwise.
7
+ */
8
+ export declare const selectorIsItemSelected: ((state: any, itemId: string) => boolean) & {
9
+ clearCache: () => void;
10
+ resultsCount: () => number;
11
+ resetResultsCount: () => void;
12
+ } & {
13
+ resultFunc: (resultFuncArgs_0: {
14
+ selectedItemsMap: Map<string, true>;
15
+ }, resultFuncArgs_1: string) => boolean;
16
+ memoizedResultFunc: ((resultFuncArgs_0: {
17
+ selectedItemsMap: Map<string, true>;
18
+ }, resultFuncArgs_1: string) => boolean) & {
19
+ clearCache: () => void;
20
+ resultsCount: () => number;
21
+ resetResultsCount: () => void;
22
+ };
23
+ lastResult: () => boolean;
24
+ dependencies: [TreeViewRootSelector<UseTreeViewSelectionSignature>, (_: any, itemId: string) => string];
25
+ recomputations: () => number;
26
+ resetRecomputations: () => void;
27
+ dependencyRecomputations: () => number;
28
+ resetDependencyRecomputations: () => void;
29
+ } & {
30
+ argsMemoize: typeof import("reselect").weakMapMemoize;
31
+ memoize: typeof import("reselect").weakMapMemoize;
32
+ };
@@ -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,7 +1,9 @@
1
1
  import * as React from 'react';
2
- import type { DefaultizedProps, TreeViewPluginSignature } from '../../models';
2
+ import type { DefaultizedProps } from '@mui/x-internals/types';
3
+ import type { TreeViewPluginSignature } from '../../models';
3
4
  import { UseTreeViewItemsSignature } from '../useTreeViewItems';
4
5
  import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
6
+ import { TreeViewSelectionPropagation, TreeViewCancellableEventHandler } from '../../../models';
5
7
  export interface UseTreeViewSelectionPublicAPI {
6
8
  /**
7
9
  * Select or deselect an item.
@@ -19,12 +21,6 @@ export interface UseTreeViewSelectionPublicAPI {
19
21
  }) => void;
20
22
  }
21
23
  export interface UseTreeViewSelectionInstance extends UseTreeViewSelectionPublicAPI {
22
- /**
23
- * Check if an item is selected.
24
- * @param {TreeViewItemId} itemId The id of the item to check.
25
- * @returns {boolean} `true` if the item is selected, `false` otherwise.
26
- */
27
- isItemSelected: (itemId: string) => boolean;
28
24
  /**
29
25
  * Select all the navigable items in the tree.
30
26
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -84,6 +80,23 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
84
80
  * @default false
85
81
  */
86
82
  checkboxSelection?: boolean;
83
+ /**
84
+ * When `selectionPropagation.descendants` is set to `true`.
85
+ *
86
+ * - Selecting a parent selects all its descendants automatically.
87
+ * - Deselecting a parent deselects all its descendants automatically.
88
+ *
89
+ * When `selectionPropagation.parents` is set to `true`.
90
+ *
91
+ * - Selecting all the descendants of a parent selects the parent automatically.
92
+ * - Deselecting a descendant of a selected parent deselects the parent automatically.
93
+ *
94
+ * Only works when `multiSelect` is `true`.
95
+ * On the <SimpleTreeView />, only the expanded items are considered (since the collapsed item are not passed to the Tree View component at all)
96
+ *
97
+ * @default { parents: false, descendants: false }
98
+ */
99
+ selectionPropagation?: TreeViewSelectionPropagation;
87
100
  /**
88
101
  * Callback fired when Tree Items are selected/deselected.
89
102
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -99,9 +112,14 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
99
112
  */
100
113
  onItemSelectionToggle?: (event: React.SyntheticEvent, itemId: string, isSelected: boolean) => void;
101
114
  }
102
- export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect' | 'checkboxSelection'>;
115
+ export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect' | 'checkboxSelection' | 'selectionPropagation'>;
116
+ export interface UseTreeViewSelectionState {
117
+ selection: {
118
+ selectedItemsMap: Map<string, true>;
119
+ };
120
+ }
103
121
  interface UseTreeViewSelectionContextValue {
104
- selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect' | 'checkboxSelection' | 'disableSelection'>;
122
+ selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect' | 'checkboxSelection' | 'disableSelection' | 'selectionPropagation'>;
105
123
  }
106
124
  export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
107
125
  params: UseTreeViewSelectionParameters<any>;
@@ -110,10 +128,22 @@ export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
110
128
  publicAPI: UseTreeViewSelectionPublicAPI;
111
129
  contextValue: UseTreeViewSelectionContextValue;
112
130
  modelNames: 'selectedItems';
131
+ state: UseTreeViewSelectionState;
113
132
  dependencies: [
114
133
  UseTreeViewItemsSignature,
115
134
  UseTreeViewExpansionSignature,
116
135
  UseTreeViewItemsSignature
117
136
  ];
118
137
  }>;
138
+ export interface UseTreeItemCheckboxSlotPropsFromSelection {
139
+ visible?: boolean;
140
+ checked?: boolean;
141
+ disabled?: boolean;
142
+ tabIndex?: -1;
143
+ onChange?: TreeViewCancellableEventHandler<React.ChangeEvent<HTMLInputElement>>;
144
+ }
145
+ declare module '@mui/x-tree-view/useTreeItem' {
146
+ interface UseTreeItemCheckboxSlotOwnProps extends UseTreeItemCheckboxSlotPropsFromSelection {
147
+ }
148
+ }
119
149
  export {};
@@ -1,9 +1,28 @@
1
+ import { TreeViewItemId, TreeViewSelectionPropagation } from '../../../models';
2
+ import { TreeViewUsedStore } from '../../models';
3
+ import { UseTreeViewSelectionSignature } from './useTreeViewSelection.types';
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.
4
7
  * @returns {string[]} The converted model.
5
8
  */
6
9
  export declare const convertSelectedItemsToArray: (model: string[] | string | null) => string[];
10
+ export declare const createSelectedItemsMap: (selectedItems: string | string[] | null) => Map<string, true>;
7
11
  export declare const getLookupFromArray: (array: string[]) => {
8
- [itemId: string]: boolean;
12
+ [itemId: string]: true;
9
13
  };
14
+ export declare const getAddedAndRemovedItems: ({ store, oldModel, newModel, }: {
15
+ store: TreeViewUsedStore<UseTreeViewSelectionSignature>;
16
+ oldModel: TreeViewItemId[];
17
+ newModel: TreeViewItemId[];
18
+ }) => {
19
+ added: string[];
20
+ removed: string[];
21
+ };
22
+ export declare const propagateSelection: ({ store, selectionPropagation, newModel, oldModel, additionalItemsToPropagate, }: {
23
+ store: TreeViewUsedStore<UseTreeViewSelectionSignature>;
24
+ selectionPropagation: TreeViewSelectionPropagation;
25
+ newModel: TreeViewItemId[];
26
+ oldModel: TreeViewItemId[];
27
+ additionalItemsToPropagate?: TreeViewItemId[];
28
+ }) => string[];