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

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 (196) hide show
  1. package/CHANGELOG.md +161 -48
  2. package/README.md +2 -2
  3. package/RichTreeView/RichTreeView.js +20 -1
  4. package/RichTreeView/RichTreeView.types.d.ts +4 -4
  5. package/SimpleTreeView/SimpleTreeView.js +21 -3
  6. package/TreeItem/TreeItem.d.ts +20 -2
  7. package/TreeItem/TreeItem.js +238 -368
  8. package/TreeItem/TreeItem.types.d.ts +51 -86
  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} +26 -21
  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} +7 -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/{modern/TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +7 -3
  31. package/{TreeItem2Provider/TreeItem2Provider.types.d.ts → TreeItemProvider/TreeItemProvider.types.d.ts} +1 -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 +1 -1
  36. package/hooks/index.js +1 -1
  37. package/hooks/useTreeItemUtils/index.d.ts +1 -0
  38. package/hooks/useTreeItemUtils/index.js +1 -0
  39. package/hooks/{useTreeItem2Utils/useTreeItem2Utils.d.ts → useTreeItemUtils/useTreeItemUtils.d.ts} +11 -11
  40. package/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +5 -3
  41. package/index.d.ts +5 -5
  42. package/index.js +6 -6
  43. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +2 -1
  44. package/internals/components/RichTreeViewItems.d.ts +1 -2
  45. package/internals/index.d.ts +1 -1
  46. package/internals/models/helpers.d.ts +0 -2
  47. package/internals/models/itemPlugin.d.ts +11 -8
  48. package/internals/models/plugin.d.ts +1 -1
  49. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -1
  50. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
  51. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +3 -5
  52. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.d.ts +1 -1
  53. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +6 -5
  54. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.d.ts +2 -0
  55. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +86 -0
  56. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -18
  57. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +33 -3
  58. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +20 -1
  59. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +95 -0
  60. package/models/items.d.ts +4 -0
  61. package/modern/RichTreeView/RichTreeView.js +20 -1
  62. package/modern/SimpleTreeView/SimpleTreeView.js +21 -3
  63. package/modern/TreeItem/TreeItem.js +238 -368
  64. package/modern/TreeItem/index.js +2 -4
  65. package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +26 -21
  66. package/modern/TreeItemDragAndDropOverlay/index.js +1 -0
  67. package/modern/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
  68. package/modern/TreeItemIcon/index.js +1 -0
  69. package/modern/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +7 -3
  70. package/modern/TreeItemLabelInput/index.js +1 -0
  71. package/{TreeItem2Provider/TreeItem2Provider.js → modern/TreeItemProvider/TreeItemProvider.js} +7 -3
  72. package/modern/TreeItemProvider/index.js +1 -0
  73. package/modern/hooks/index.js +1 -1
  74. package/modern/hooks/useTreeItemUtils/index.js +1 -0
  75. package/modern/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +5 -3
  76. package/modern/index.js +6 -6
  77. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
  78. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +86 -0
  79. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -18
  80. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +95 -0
  81. package/modern/useTreeItem/index.js +1 -0
  82. package/modern/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +21 -42
  83. package/node/RichTreeView/RichTreeView.js +20 -1
  84. package/node/SimpleTreeView/SimpleTreeView.js +21 -3
  85. package/node/TreeItem/TreeItem.js +239 -369
  86. package/node/TreeItem/index.js +38 -16
  87. package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +26 -22
  88. package/node/TreeItemDragAndDropOverlay/index.js +12 -0
  89. package/node/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +4 -3
  90. package/node/TreeItemIcon/index.js +12 -0
  91. package/node/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +6 -3
  92. package/node/TreeItemLabelInput/index.js +12 -0
  93. package/node/{TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +6 -3
  94. package/node/TreeItemProvider/index.js +12 -0
  95. package/node/hooks/index.js +3 -3
  96. package/node/hooks/useTreeItemUtils/index.js +12 -0
  97. package/node/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +6 -5
  98. package/node/index.js +29 -29
  99. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
  100. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +94 -0
  101. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +42 -17
  102. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +99 -2
  103. package/node/useTreeItem/index.js +12 -0
  104. package/node/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +22 -44
  105. package/package.json +3 -3
  106. package/themeAugmentation/components.d.ts +0 -10
  107. package/themeAugmentation/overrides.d.ts +0 -3
  108. package/themeAugmentation/props.d.ts +1 -5
  109. package/useTreeItem/index.d.ts +2 -0
  110. package/useTreeItem/index.js +1 -0
  111. package/{TreeItem2 → useTreeItem}/package.json +1 -1
  112. package/useTreeItem/useTreeItem.d.ts +2 -0
  113. package/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +21 -42
  114. package/{useTreeItem2/useTreeItem2.types.d.ts → useTreeItem/useTreeItem.types.d.ts} +42 -58
  115. package/TreeItem/TreeItemContent.d.ts +0 -61
  116. package/TreeItem/TreeItemContent.js +0 -146
  117. package/TreeItem/useTreeItemState.d.ts +0 -21
  118. package/TreeItem/useTreeItemState.js +0 -143
  119. package/TreeItem2/TreeItem2.d.ts +0 -34
  120. package/TreeItem2/TreeItem2.js +0 -387
  121. package/TreeItem2/TreeItem2.types.d.ts +0 -92
  122. package/TreeItem2/index.d.ts +0 -2
  123. package/TreeItem2/index.js +0 -1
  124. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +0 -4
  125. package/TreeItem2DragAndDropOverlay/index.d.ts +0 -2
  126. package/TreeItem2DragAndDropOverlay/index.js +0 -1
  127. package/TreeItem2DragAndDropOverlay/package.json +0 -6
  128. package/TreeItem2Icon/TreeItem2Icon.d.ts +0 -7
  129. package/TreeItem2Icon/index.d.ts +0 -2
  130. package/TreeItem2Icon/index.js +0 -1
  131. package/TreeItem2LabelInput/TreeItem2LabelInput.d.ts +0 -2
  132. package/TreeItem2LabelInput/index.d.ts +0 -2
  133. package/TreeItem2LabelInput/index.js +0 -1
  134. package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -6
  135. package/TreeItem2Provider/index.d.ts +0 -2
  136. package/TreeItem2Provider/index.js +0 -1
  137. package/TreeView/TreeView.d.ts +0 -21
  138. package/TreeView/TreeView.js +0 -211
  139. package/TreeView/TreeView.types.d.ts +0 -9
  140. package/TreeView/index.d.ts +0 -3
  141. package/TreeView/index.js +0 -3
  142. package/TreeView/package.json +0 -6
  143. package/TreeView/treeViewClasses.d.ts +0 -7
  144. package/TreeView/treeViewClasses.js +0 -6
  145. package/hooks/useTreeItem2Utils/index.d.ts +0 -1
  146. package/hooks/useTreeItem2Utils/index.js +0 -1
  147. package/modern/TreeItem/TreeItemContent.js +0 -146
  148. package/modern/TreeItem/useTreeItemState.js +0 -143
  149. package/modern/TreeItem2/TreeItem2.js +0 -387
  150. package/modern/TreeItem2/index.js +0 -1
  151. package/modern/TreeItem2DragAndDropOverlay/index.js +0 -1
  152. package/modern/TreeItem2Icon/index.js +0 -1
  153. package/modern/TreeItem2LabelInput/index.js +0 -1
  154. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +0 -1
  155. package/modern/TreeItem2Provider/index.js +0 -1
  156. package/modern/TreeView/TreeView.js +0 -211
  157. package/modern/TreeView/TreeView.types.js +0 -1
  158. package/modern/TreeView/index.js +0 -3
  159. package/modern/TreeView/treeViewClasses.js +0 -6
  160. package/modern/hooks/useTreeItem2Utils/index.js +0 -1
  161. package/modern/useTreeItem2/index.js +0 -4
  162. package/modern/useTreeItem2/useTreeItem2.types.js +0 -1
  163. package/node/TreeItem/TreeItemContent.js +0 -153
  164. package/node/TreeItem/useTreeItemState.js +0 -148
  165. package/node/TreeItem2/TreeItem2.js +0 -394
  166. package/node/TreeItem2/index.js +0 -48
  167. package/node/TreeItem2DragAndDropOverlay/index.js +0 -12
  168. package/node/TreeItem2Icon/index.js +0 -12
  169. package/node/TreeItem2LabelInput/index.js +0 -12
  170. package/node/TreeItem2Provider/index.js +0 -12
  171. package/node/TreeView/TreeView.js +0 -217
  172. package/node/TreeView/TreeView.types.js +0 -5
  173. package/node/TreeView/index.js +0 -27
  174. package/node/TreeView/treeViewClasses.js +0 -14
  175. package/node/hooks/useTreeItem2Utils/index.js +0 -12
  176. package/node/useTreeItem2/index.js +0 -10
  177. package/node/useTreeItem2/useTreeItem2.types.js +0 -5
  178. package/useTreeItem2/index.d.ts +0 -3
  179. package/useTreeItem2/index.js +0 -4
  180. package/useTreeItem2/useTreeItem2.d.ts +0 -2
  181. package/useTreeItem2/useTreeItem2.types.js +0 -1
  182. /package/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  183. /package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
  184. /package/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  185. /package/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  186. /package/{TreeItem2Provider/TreeItem2Provider.types.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  187. /package/{TreeView/TreeView.types.js → modern/TreeItemIcon/TreeItemIcon.types.js} +0 -0
  188. /package/modern/{TreeItem2/TreeItem2.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  189. /package/modern/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  190. /package/modern/{TreeItem2Icon/TreeItem2Icon.types.js → useTreeItem/useTreeItem.types.js} +0 -0
  191. /package/node/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
  192. /package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
  193. /package/node/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
  194. /package/node/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
  195. /package/node/{TreeItem2Provider/TreeItem2Provider.types.js → useTreeItem/useTreeItem.types.js} +0 -0
  196. /package/{modern/TreeItem2LabelInput/TreeItem2LabelInput.types.js → useTreeItem/useTreeItem.types.js} +0 -0
package/index.js CHANGED
@@ -1,21 +1,21 @@
1
1
  /**
2
- * @mui/x-tree-view v7.22.0
2
+ * @mui/x-tree-view v8.0.0-alpha.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  // Tree View
9
- export * from "./TreeView/index.js";
10
9
  export * from "./SimpleTreeView/index.js";
11
10
  export * from "./RichTreeView/index.js";
12
11
 
13
12
  // Tree Item
14
13
  export * from "./TreeItem/index.js";
15
- export * from "./TreeItem2/index.js";
16
- export * from "./useTreeItem2/index.js";
17
- export * from "./TreeItem2Icon/index.js";
18
- export * from "./TreeItem2Provider/index.js";
14
+ export * from "./useTreeItem/index.js";
15
+ export * from "./TreeItemIcon/index.js";
16
+ export * from "./TreeItemProvider/index.js";
17
+ export * from "./TreeItemDragAndDropOverlay/index.js";
18
+ export * from "./TreeItemLabelInput/index.js";
19
19
  export { unstable_resetCleanupTracking } from "./internals/hooks/useInstanceEventHandler.js";
20
20
  export * from "./models/index.js";
21
21
  export * from "./icons/index.js";
@@ -1,7 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { MergeSignaturesProperty, TreeItemWrapper, TreeRootWrapper, TreeViewAnyPluginSignature, TreeViewInstance, TreeViewItemPluginResponse, TreeViewPublicAPI } from '../models';
3
3
  import { TreeViewCorePluginSignatures } from '../corePlugins';
4
- export type TreeViewItemPluginsRunner = <TProps extends {}>(props: TProps) => Required<TreeViewItemPluginResponse>;
4
+ import type { TreeItemProps } from '../../TreeItem';
5
+ export type TreeViewItemPluginsRunner = (props: TreeItemProps) => Required<TreeViewItemPluginResponse>;
5
6
  export type TreeViewContextValue<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'contextValue'> & Partial<MergeSignaturesProperty<TOptionalSignatures, 'contextValue'>> & {
6
7
  instance: TreeViewInstance<TSignatures, TOptionalSignatures>;
7
8
  publicAPI: TreeViewPublicAPI<TSignatures, TOptionalSignatures>;
@@ -1,7 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { SlotComponentProps } from '@mui/utils';
3
3
  import { TreeItem, TreeItemProps } from '../../TreeItem';
4
- import { TreeItem2Props } from '../../TreeItem2';
5
4
  import { TreeViewItemId } from '../../models';
6
5
  import { TreeViewItemToRenderProps } from '../plugins/useTreeViewItems';
7
6
  interface RichTreeViewItemsOwnerState {
@@ -13,7 +12,7 @@ export interface RichTreeViewItemsSlots {
13
12
  * Custom component for the item.
14
13
  * @default TreeItem.
15
14
  */
16
- item?: React.JSXElementConstructor<TreeItemProps> | React.JSXElementConstructor<TreeItem2Props>;
15
+ item?: React.JSXElementConstructor<TreeItemProps>;
17
16
  }
18
17
  export interface RichTreeViewItemsSlotProps {
19
18
  item?: SlotComponentProps<typeof TreeItem, {}, RichTreeViewItemsOwnerState>;
@@ -2,7 +2,7 @@ export { useTreeView } from './useTreeView';
2
2
  export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
3
3
  export { RichTreeViewItems } from './components/RichTreeViewItems';
4
4
  export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
5
- export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, DefaultizedProps, TreeViewItemPlugin, } from './models';
5
+ export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, TreeViewItemPlugin, } from './models';
6
6
  export type { TreeViewCorePluginParameters } from './corePlugins';
7
7
  export { useTreeViewExpansion } from './plugins/useTreeViewExpansion';
8
8
  export type { UseTreeViewExpansionSignature, UseTreeViewExpansionParameters, } from './plugins/useTreeViewExpansion';
@@ -1,6 +1,4 @@
1
1
  import type { TreeViewAnyPluginSignature, TreeViewPlugin } from './plugin';
2
- export type DefaultizedProps<P extends {}, RequiredProps extends keyof P, AdditionalProps extends {} = {}> = Omit<P, RequiredProps | keyof AdditionalProps> & Required<Pick<P, RequiredProps>> & AdditionalProps;
3
- export type SlotComponentPropsFromProps<TProps extends {}, TOverrides extends {}, TOwnerState extends {}> = (Partial<TProps> & TOverrides) | ((ownerState: TOwnerState) => Partial<TProps> & TOverrides);
4
2
  type IsAny<T> = 0 extends 1 & T ? true : false;
5
3
  export type OptionalIfEmpty<A extends string, B> = keyof B extends never ? Partial<Record<A, B>> : IsAny<B> extends true ? Partial<Record<A, B>> : Record<A, B>;
6
4
  export type MergeSignaturesProperty<TSignatures extends readonly any[], TProperty extends keyof TreeViewAnyPluginSignature> = TSignatures extends readonly [plugin: infer P, ...otherPlugin: infer R] ? P extends TreeViewAnyPluginSignature ? P[TProperty] & MergeSignaturesProperty<R, TProperty> : {} : {};
@@ -1,19 +1,22 @@
1
1
  import * as React from 'react';
2
2
  import { EventHandlers } from '@mui/utils';
3
- import type { UseTreeItem2ContentSlotOwnProps, UseTreeItem2DragAndDropOverlaySlotOwnProps, UseTreeItem2LabelInputSlotOwnProps, UseTreeItem2RootSlotOwnProps } from '../../useTreeItem2';
4
- import type { UseTreeItem2Interactions } from '../../hooks/useTreeItem2Utils/useTreeItem2Utils';
3
+ import type { TreeItemProps } from '../../TreeItem';
4
+ import type { UseTreeItemContentSlotOwnProps, UseTreeItemDragAndDropOverlaySlotOwnProps, UseTreeItemLabelInputSlotOwnProps, UseTreeItemRootSlotOwnProps, UseTreeItemCheckboxSlotOwnProps, UseTreeItemStatus } from '../../useTreeItem';
5
+ import type { UseTreeItemInteractions } from '../../hooks/useTreeItemUtils/useTreeItemUtils';
5
6
  export interface TreeViewItemPluginSlotPropsEnhancerParams {
6
7
  rootRefObject: React.MutableRefObject<HTMLLIElement | null>;
7
8
  contentRefObject: React.MutableRefObject<HTMLDivElement | null>;
8
9
  externalEventHandlers: EventHandlers;
9
- interactions: Pick<UseTreeItem2Interactions, 'handleSaveItemLabel' | 'handleCancelItemLabelEditing'>;
10
+ interactions: UseTreeItemInteractions;
11
+ status: UseTreeItemStatus;
10
12
  }
11
13
  type TreeViewItemPluginSlotPropsEnhancer<TSlotProps> = (params: TreeViewItemPluginSlotPropsEnhancerParams) => Partial<TSlotProps>;
12
14
  export interface TreeViewItemPluginSlotPropsEnhancers {
13
- root?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2RootSlotOwnProps>;
14
- content?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2ContentSlotOwnProps>;
15
- dragAndDropOverlay?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2DragAndDropOverlaySlotOwnProps>;
16
- labelInput?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2LabelInputSlotOwnProps>;
15
+ root?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemRootSlotOwnProps>;
16
+ content?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemContentSlotOwnProps>;
17
+ dragAndDropOverlay?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemDragAndDropOverlaySlotOwnProps>;
18
+ labelInput?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemLabelInputSlotOwnProps>;
19
+ checkbox?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemCheckboxSlotOwnProps>;
17
20
  }
18
21
  export interface TreeViewItemPluginResponse {
19
22
  /**
@@ -36,5 +39,5 @@ export interface TreeViewItemPluginResponse {
36
39
  export interface TreeViewItemPluginOptions<TProps extends {}> extends Omit<TreeViewItemPluginResponse, 'propsEnhancers'> {
37
40
  props: TProps;
38
41
  }
39
- export type TreeViewItemPlugin<TProps extends {}> = (options: TreeViewItemPluginOptions<TProps>) => void | TreeViewItemPluginResponse;
42
+ export type TreeViewItemPlugin = (options: TreeViewItemPluginOptions<TreeItemProps>) => void | TreeViewItemPluginResponse;
40
43
  export {};
@@ -145,7 +145,7 @@ export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
145
145
  getInitialState?: (params: TreeViewUsedDefaultizedParams<TSignature>) => TSignature['state'];
146
146
  models?: TreeViewModelsInitializer<TSignature>;
147
147
  params: Record<keyof TSignature['params'], true>;
148
- itemPlugin?: TreeViewItemPlugin<any>;
148
+ itemPlugin?: TreeViewItemPlugin;
149
149
  /**
150
150
  * Render function used to add React wrappers around the TreeItem.
151
151
  * @param {{ nodeId: TreeViewItemId; children: React.ReactNode; }} params The params of the item.
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
- import { DefaultizedProps, TreeViewPluginSignature } from '../../models';
2
+ import { DefaultizedProps } from '@mui/x-internals/types';
3
+ import { TreeViewPluginSignature } from '../../models';
3
4
  import { UseTreeViewItemsSignature } from '../useTreeViewItems';
4
5
  import { TreeViewItemId } from '../../../models';
5
6
  import { UseTreeViewLabelSignature } from '../useTreeViewLabel';
@@ -63,8 +63,7 @@ export const useTreeViewItems = ({
63
63
  instance,
64
64
  params,
65
65
  state,
66
- setState,
67
- experimentalFeatures
66
+ setState
68
67
  }) => {
69
68
  const getItemMeta = React.useCallback(itemId => state.items.itemMetaMap[itemId], [state.items.itemMetaMap]);
70
69
  const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
@@ -191,8 +190,7 @@ export const useTreeViewItems = ({
191
190
  contextValue: {
192
191
  items: {
193
192
  onItemClick: params.onItemClick,
194
- disabledItemsFocusable: params.disabledItemsFocusable,
195
- indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
193
+ disabledItemsFocusable: params.disabledItemsFocusable
196
194
  }
197
195
  }
198
196
  };
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
- import { TreeViewItemMeta, DefaultizedProps, TreeViewPluginSignature } from '../../models';
2
+ import { DefaultizedProps } from '@mui/x-internals/types';
3
+ import { TreeViewItemMeta, TreeViewPluginSignature } from '../../models';
3
4
  import { TreeViewBaseItem, TreeViewItemId } from '../../../models';
4
5
  export interface TreeViewItemToRenderProps {
5
6
  label: string;
@@ -154,9 +155,7 @@ export interface UseTreeViewItemsState<R extends {}> {
154
155
  };
155
156
  }
156
157
  interface UseTreeViewItemsContextValue {
157
- items: Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable' | 'onItemClick'> & {
158
- indentationAtItemLevel: boolean;
159
- };
158
+ items: Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable' | 'onItemClick'>;
160
159
  }
161
160
  export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
162
161
  params: UseTreeViewItemsParameters<any>;
@@ -166,7 +165,6 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
166
165
  events: UseTreeViewItemsEventLookup;
167
166
  state: UseTreeViewItemsState<any>;
168
167
  contextValue: UseTreeViewItemsContextValue;
169
- experimentalFeatures: 'indentationAtItemLevel';
170
168
  }>;
171
169
  export type TreeViewItemMetaMap = {
172
170
  [itemId: string]: TreeViewItemMeta;
@@ -1,2 +1,2 @@
1
1
  import { TreeViewItemPlugin } from '../../models';
2
- export declare const useTreeViewLabelItemPlugin: TreeViewItemPlugin<any>;
2
+ export declare const useTreeViewLabelItemPlugin: TreeViewItemPlugin;
@@ -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.
@@ -72,9 +73,9 @@ export type UseTreeViewLabelSignature = TreeViewPluginSignature<{
72
73
  experimentalFeatures: 'labelEditing';
73
74
  dependencies: [UseTreeViewItemsSignature];
74
75
  }>;
75
- export interface UseTreeItem2LabelInputSlotPropsFromLabelEditing extends TreeItem2LabelInputProps {
76
+ export interface UseTreeItemLabelInputSlotPropsFromLabelEditing extends TreeItemLabelInputProps {
76
77
  }
77
- declare module '@mui/x-tree-view/useTreeItem2' {
78
- interface UseTreeItem2LabelInputSlotOwnProps extends UseTreeItem2LabelInputSlotPropsFromLabelEditing {
78
+ declare module '@mui/x-tree-view/useTreeItem' {
79
+ interface UseTreeItemLabelInputSlotOwnProps extends UseTreeItemLabelInputSlotPropsFromLabelEditing {
79
80
  }
80
81
  }
@@ -0,0 +1,2 @@
1
+ import { TreeViewItemPlugin } from '../../models';
2
+ export declare const useTreeViewSelectionItemPlugin: TreeViewItemPlugin;
@@ -0,0 +1,86 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { useTreeViewContext } from "../../TreeViewProvider/index.js";
3
+ function getCheckboxStatus({
4
+ itemId,
5
+ instance,
6
+ selectionPropagation,
7
+ selected
8
+ }) {
9
+ if (selected) {
10
+ return {
11
+ indeterminate: false,
12
+ checked: true
13
+ };
14
+ }
15
+ const children = instance.getItemOrderedChildrenIds(itemId);
16
+ if (children.length === 0) {
17
+ return {
18
+ indeterminate: false,
19
+ checked: false
20
+ };
21
+ }
22
+ let hasSelectedDescendant = false;
23
+ let hasUnSelectedDescendant = false;
24
+ const traverseDescendants = itemToTraverseId => {
25
+ if (itemToTraverseId !== itemId) {
26
+ if (instance.isItemSelected(itemToTraverseId)) {
27
+ hasSelectedDescendant = true;
28
+ } else {
29
+ hasUnSelectedDescendant = true;
30
+ }
31
+ }
32
+ instance.getItemOrderedChildrenIds(itemToTraverseId).forEach(traverseDescendants);
33
+ };
34
+ traverseDescendants(itemId);
35
+ return {
36
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
37
+ checked: selectionPropagation.parents ? hasSelectedDescendant : selected
38
+ };
39
+ }
40
+ export const useTreeViewSelectionItemPlugin = ({
41
+ props
42
+ }) => {
43
+ const {
44
+ itemId
45
+ } = props;
46
+ const {
47
+ instance,
48
+ selection: {
49
+ disableSelection,
50
+ checkboxSelection,
51
+ selectionPropagation
52
+ }
53
+ } = useTreeViewContext();
54
+ return {
55
+ propsEnhancers: {
56
+ checkbox: ({
57
+ externalEventHandlers,
58
+ interactions,
59
+ status
60
+ }) => {
61
+ const handleChange = event => {
62
+ externalEventHandlers.onChange?.(event);
63
+ if (event.defaultMuiPrevented) {
64
+ return;
65
+ }
66
+ if (disableSelection || status.disabled) {
67
+ return;
68
+ }
69
+ interactions.handleCheckboxSelection(event);
70
+ };
71
+ const checkboxStatus = getCheckboxStatus({
72
+ instance,
73
+ itemId,
74
+ selectionPropagation,
75
+ selected: status.selected
76
+ });
77
+ return _extends({
78
+ visible: checkboxSelection,
79
+ disabled: disableSelection || status.disabled,
80
+ tabIndex: -1,
81
+ onChange: handleChange
82
+ }, checkboxStatus);
83
+ }
84
+ }
85
+ };
86
+ };
@@ -1,7 +1,8 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { findOrderInTremauxTree, getAllNavigableItems, getFirstNavigableItem, getLastNavigableItem, getNonDisabledItemsInRange } from "../../utils/tree.js";
4
- import { convertSelectedItemsToArray, getLookupFromArray } from "./useTreeViewSelection.utils.js";
4
+ import { convertSelectedItemsToArray, propagateSelection, getAddedAndRemovedItems, getLookupFromArray } from "./useTreeViewSelection.utils.js";
5
+ import { useTreeViewSelectionItemPlugin } from "./useTreeViewSelection.itemPlugin.js";
5
6
  export const useTreeViewSelection = ({
6
7
  instance,
7
8
  params,
@@ -20,30 +21,47 @@ export const useTreeViewSelection = ({
20
21
  }
21
22
  return temp;
22
23
  }, [models.selectedItems.value]);
23
- const setSelectedItems = (event, newSelectedItems) => {
24
+ const setSelectedItems = (event, newModel, additionalItemsToPropagate) => {
25
+ let cleanModel;
26
+ if (params.multiSelect && (params.selectionPropagation.descendants || params.selectionPropagation.parents)) {
27
+ cleanModel = propagateSelection({
28
+ instance,
29
+ selectionPropagation: params.selectionPropagation,
30
+ newModel: newModel,
31
+ oldModel: models.selectedItems.value,
32
+ additionalItemsToPropagate
33
+ });
34
+ } else {
35
+ cleanModel = newModel;
36
+ }
24
37
  if (params.onItemSelectionToggle) {
25
38
  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);
39
+ const changes = getAddedAndRemovedItems({
40
+ instance,
41
+ newModel: cleanModel,
42
+ oldModel: models.selectedItems.value
30
43
  });
31
- removedItems.forEach(itemId => {
32
- params.onItemSelectionToggle(event, itemId, false);
33
- });
34
- } else if (newSelectedItems !== models.selectedItems.value) {
44
+ if (params.onItemSelectionToggle) {
45
+ changes.added.forEach(itemId => {
46
+ params.onItemSelectionToggle(event, itemId, true);
47
+ });
48
+ changes.removed.forEach(itemId => {
49
+ params.onItemSelectionToggle(event, itemId, false);
50
+ });
51
+ }
52
+ } else if (params.onItemSelectionToggle && cleanModel !== models.selectedItems.value) {
35
53
  if (models.selectedItems.value != null) {
36
54
  params.onItemSelectionToggle(event, models.selectedItems.value, false);
37
55
  }
38
- if (newSelectedItems != null) {
39
- params.onItemSelectionToggle(event, newSelectedItems, true);
56
+ if (cleanModel != null) {
57
+ params.onItemSelectionToggle(event, cleanModel, true);
40
58
  }
41
59
  }
42
60
  }
43
61
  if (params.onSelectedItemsChange) {
44
- params.onSelectedItemsChange(event, newSelectedItems);
62
+ params.onSelectedItemsChange(event, cleanModel);
45
63
  }
46
- models.selectedItems.setControlledValue(newSelectedItems);
64
+ models.selectedItems.setControlledValue(cleanModel);
47
65
  };
48
66
  const isItemSelected = itemId => selectedItemsMap.has(itemId);
49
67
  const selectItem = ({
@@ -74,7 +92,10 @@ export const useTreeViewSelection = ({
74
92
  newSelected = params.multiSelect ? [itemId] : itemId;
75
93
  }
76
94
  }
77
- setSelectedItems(event, newSelected);
95
+ setSelectedItems(event, newSelected,
96
+ // If shouldBeSelected === instance.isItemSelect(itemId), we still want to propagate the select.
97
+ // This is useful when the element is in an indeterminate state.
98
+ [itemId]);
78
99
  lastSelectedItem.current = itemId;
79
100
  lastSelectedRange.current = {};
80
101
  };
@@ -163,11 +184,13 @@ export const useTreeViewSelection = ({
163
184
  selection: {
164
185
  multiSelect: params.multiSelect,
165
186
  checkboxSelection: params.checkboxSelection,
166
- disableSelection: params.disableSelection
187
+ disableSelection: params.disableSelection,
188
+ selectionPropagation: params.selectionPropagation
167
189
  }
168
190
  }
169
191
  };
170
192
  };
193
+ useTreeViewSelection.itemPlugin = useTreeViewSelectionItemPlugin;
171
194
  useTreeViewSelection.models = {
172
195
  selectedItems: {
173
196
  getDefaultValue: params => params.defaultSelectedItems
@@ -180,7 +203,8 @@ useTreeViewSelection.getDefaultizedParams = ({
180
203
  disableSelection: params.disableSelection ?? false,
181
204
  multiSelect: params.multiSelect ?? false,
182
205
  checkboxSelection: params.checkboxSelection ?? false,
183
- defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null)
206
+ defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null),
207
+ selectionPropagation: params.selectionPropagation ?? {}
184
208
  });
185
209
  useTreeViewSelection.params = {
186
210
  disableSelection: true,
@@ -189,5 +213,6 @@ useTreeViewSelection.params = {
189
213
  defaultSelectedItems: true,
190
214
  selectedItems: true,
191
215
  onSelectedItemsChange: true,
192
- onItemSelectionToggle: true
216
+ onItemSelectionToggle: true,
217
+ selectionPropagation: true
193
218
  };
@@ -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.
@@ -84,6 +86,23 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
84
86
  * @default false
85
87
  */
86
88
  checkboxSelection?: boolean;
89
+ /**
90
+ * When `selectionPropagation.descendants` is set to `true`.
91
+ *
92
+ * - Selecting a parent selects all its descendants automatically.
93
+ * - Deselecting a parent deselects all its descendants automatically.
94
+ *
95
+ * When `selectionPropagation.parents` is set to `true`.
96
+ *
97
+ * - Selecting all the descendants of a parent selects the parent automatically.
98
+ * - Deselecting a descendant of a selected parent deselects the parent automatically.
99
+ *
100
+ * Only works when `multiSelect` is `true`.
101
+ * On the <SimpleTreeView />, only the expanded items are considered (since the collapsed item are not passed to the Tree View component at all)
102
+ *
103
+ * @default { parents: false, descendants: false }
104
+ */
105
+ selectionPropagation?: TreeViewSelectionPropagation;
87
106
  /**
88
107
  * Callback fired when Tree Items are selected/deselected.
89
108
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -99,9 +118,9 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
99
118
  */
100
119
  onItemSelectionToggle?: (event: React.SyntheticEvent, itemId: string, isSelected: boolean) => void;
101
120
  }
102
- export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect' | 'checkboxSelection'>;
121
+ export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect' | 'checkboxSelection' | 'selectionPropagation'>;
103
122
  interface UseTreeViewSelectionContextValue {
104
- selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect' | 'checkboxSelection' | 'disableSelection'>;
123
+ selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect' | 'checkboxSelection' | 'disableSelection' | 'selectionPropagation'>;
105
124
  }
106
125
  export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
107
126
  params: UseTreeViewSelectionParameters<any>;
@@ -116,4 +135,15 @@ export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
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,3 +1,7 @@
1
+ import { TreeViewItemId, TreeViewSelectionPropagation } from '../../../models';
2
+ import { TreeViewInstance } from '../../models';
3
+ import { UseTreeViewItemsSignature } from '../useTreeViewItems';
4
+ import { UseTreeViewSelectionSignature } from './useTreeViewSelection.types';
1
5
  /**
2
6
  * Transform the `selectedItems` model to be an array if it was a string or null.
3
7
  * @param {string[] | string | null} model The raw model.
@@ -5,5 +9,20 @@
5
9
  */
6
10
  export declare const convertSelectedItemsToArray: (model: string[] | string | null) => string[];
7
11
  export declare const getLookupFromArray: (array: string[]) => {
8
- [itemId: string]: boolean;
12
+ [itemId: string]: true;
9
13
  };
14
+ export declare const getAddedAndRemovedItems: ({ instance, oldModel, newModel, }: {
15
+ instance: TreeViewInstance<[UseTreeViewSelectionSignature]>;
16
+ oldModel: TreeViewItemId[];
17
+ newModel: TreeViewItemId[];
18
+ }) => {
19
+ added: string[];
20
+ removed: string[];
21
+ };
22
+ export declare const propagateSelection: ({ instance, selectionPropagation, newModel, oldModel, additionalItemsToPropagate, }: {
23
+ instance: TreeViewInstance<[UseTreeViewItemsSignature, UseTreeViewSelectionSignature]>;
24
+ selectionPropagation: TreeViewSelectionPropagation;
25
+ newModel: TreeViewItemId[];
26
+ oldModel: TreeViewItemId[];
27
+ additionalItemsToPropagate?: TreeViewItemId[];
28
+ }) => string[];
@@ -18,4 +18,99 @@ export const getLookupFromArray = array => {
18
18
  lookup[itemId] = true;
19
19
  });
20
20
  return lookup;
21
+ };
22
+ export const getAddedAndRemovedItems = ({
23
+ instance,
24
+ oldModel,
25
+ newModel
26
+ }) => {
27
+ const newModelLookup = getLookupFromArray(newModel);
28
+ return {
29
+ added: newModel.filter(itemId => !instance.isItemSelected(itemId)),
30
+ removed: oldModel.filter(itemId => !newModelLookup[itemId])
31
+ };
32
+ };
33
+ export const propagateSelection = ({
34
+ instance,
35
+ selectionPropagation,
36
+ newModel,
37
+ oldModel,
38
+ additionalItemsToPropagate
39
+ }) => {
40
+ if (!selectionPropagation.descendants && !selectionPropagation.parents) {
41
+ return newModel;
42
+ }
43
+ let shouldRegenerateModel = false;
44
+ const newModelLookup = getLookupFromArray(newModel);
45
+ const changes = getAddedAndRemovedItems({
46
+ instance,
47
+ newModel,
48
+ oldModel
49
+ });
50
+ additionalItemsToPropagate?.forEach(itemId => {
51
+ if (newModelLookup[itemId]) {
52
+ if (!changes.added.includes(itemId)) {
53
+ changes.added.push(itemId);
54
+ }
55
+ } else if (!changes.removed.includes(itemId)) {
56
+ changes.removed.push(itemId);
57
+ }
58
+ });
59
+ changes.added.forEach(addedItemId => {
60
+ if (selectionPropagation.descendants) {
61
+ const selectDescendants = itemId => {
62
+ if (itemId !== addedItemId) {
63
+ shouldRegenerateModel = true;
64
+ newModelLookup[itemId] = true;
65
+ }
66
+ instance.getItemOrderedChildrenIds(itemId).forEach(selectDescendants);
67
+ };
68
+ selectDescendants(addedItemId);
69
+ }
70
+ if (selectionPropagation.parents) {
71
+ const checkAllDescendantsSelected = itemId => {
72
+ if (!newModelLookup[itemId]) {
73
+ return false;
74
+ }
75
+ const children = instance.getItemOrderedChildrenIds(itemId);
76
+ return children.every(checkAllDescendantsSelected);
77
+ };
78
+ const selectParents = itemId => {
79
+ const parentId = instance.getItemMeta(itemId).parentId;
80
+ if (parentId == null) {
81
+ return;
82
+ }
83
+ const siblings = instance.getItemOrderedChildrenIds(parentId);
84
+ if (siblings.every(checkAllDescendantsSelected)) {
85
+ shouldRegenerateModel = true;
86
+ newModelLookup[parentId] = true;
87
+ selectParents(parentId);
88
+ }
89
+ };
90
+ selectParents(addedItemId);
91
+ }
92
+ });
93
+ changes.removed.forEach(removedItemId => {
94
+ if (selectionPropagation.parents) {
95
+ let parentId = instance.getItemMeta(removedItemId).parentId;
96
+ while (parentId != null) {
97
+ if (newModelLookup[parentId]) {
98
+ shouldRegenerateModel = true;
99
+ delete newModelLookup[parentId];
100
+ }
101
+ parentId = instance.getItemMeta(parentId).parentId;
102
+ }
103
+ }
104
+ if (selectionPropagation.descendants) {
105
+ const deSelectDescendants = itemId => {
106
+ if (itemId !== removedItemId) {
107
+ shouldRegenerateModel = true;
108
+ delete newModelLookup[itemId];
109
+ }
110
+ instance.getItemOrderedChildrenIds(itemId).forEach(deSelectDescendants);
111
+ };
112
+ deSelectDescendants(removedItemId);
113
+ }
114
+ });
115
+ return shouldRegenerateModel ? Object.keys(newModelLookup) : newModel;
21
116
  };
package/models/items.d.ts CHANGED
@@ -6,3 +6,7 @@ export type TreeViewBaseItem<R extends {} = {
6
6
  children?: TreeViewBaseItem<R>[];
7
7
  };
8
8
  export type TreeViewItemsReorderingAction = 'reorder-above' | 'reorder-below' | 'make-child' | 'move-to-parent';
9
+ export interface TreeViewSelectionPropagation {
10
+ descendants?: boolean;
11
+ parents?: boolean;
12
+ }
@@ -155,7 +155,6 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
155
155
  * the feature will be fully disabled and any property / method call will not have any effect.
156
156
  */
157
157
  experimentalFeatures: PropTypes.shape({
158
- indentationAtItemLevel: PropTypes.bool,
159
158
  labelEditing: PropTypes.bool
160
159
  }),
161
160
  /**
@@ -260,6 +259,26 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
260
259
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
261
260
  */
262
261
  selectedItems: PropTypes.any,
262
+ /**
263
+ * When `selectionPropagation.descendants` is set to `true`.
264
+ *
265
+ * - Selecting a parent selects all its descendants automatically.
266
+ * - Deselecting a parent deselects all its descendants automatically.
267
+ *
268
+ * When `selectionPropagation.parents` is set to `true`.
269
+ *
270
+ * - Selecting all the descendants of a parent selects the parent automatically.
271
+ * - Deselecting a descendant of a selected parent deselects the parent automatically.
272
+ *
273
+ * Only works when `multiSelect` is `true`.
274
+ * On the <SimpleTreeView />, only the expanded items are considered (since the collapsed item are not passed to the Tree View component at all)
275
+ *
276
+ * @default { parents: false, descendants: false }
277
+ */
278
+ selectionPropagation: PropTypes.shape({
279
+ descendants: PropTypes.bool,
280
+ parents: PropTypes.bool
281
+ }),
263
282
  /**
264
283
  * The props used for each component slot.
265
284
  * @default {}