@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.
- package/CHANGELOG.md +161 -48
- package/README.md +2 -2
- package/RichTreeView/RichTreeView.js +20 -1
- package/RichTreeView/RichTreeView.types.d.ts +4 -4
- package/SimpleTreeView/SimpleTreeView.js +21 -3
- package/TreeItem/TreeItem.d.ts +20 -2
- package/TreeItem/TreeItem.js +238 -368
- package/TreeItem/TreeItem.types.d.ts +51 -86
- package/TreeItem/index.d.ts +1 -4
- package/TreeItem/index.js +2 -4
- package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.d.ts +7 -0
- package/{modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +26 -21
- package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.d.ts} +1 -1
- package/TreeItemDragAndDropOverlay/index.d.ts +2 -0
- package/TreeItemDragAndDropOverlay/index.js +1 -0
- package/{TreeItem2LabelInput → TreeItemDragAndDropOverlay}/package.json +1 -1
- package/TreeItemIcon/TreeItemIcon.d.ts +7 -0
- package/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
- package/{TreeItem2Icon/TreeItem2Icon.types.d.ts → TreeItemIcon/TreeItemIcon.types.d.ts} +7 -7
- package/TreeItemIcon/index.d.ts +2 -0
- package/TreeItemIcon/index.js +1 -0
- package/{useTreeItem2 → TreeItemIcon}/package.json +1 -1
- package/TreeItemLabelInput/TreeItemLabelInput.d.ts +5 -0
- package/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +7 -3
- package/{TreeItem2LabelInput/TreeItem2LabelInput.types.d.ts → TreeItemLabelInput/TreeItemLabelInput.types.d.ts} +1 -1
- package/TreeItemLabelInput/index.d.ts +2 -0
- package/TreeItemLabelInput/index.js +1 -0
- package/{TreeItem2Provider → TreeItemLabelInput}/package.json +1 -1
- package/TreeItemProvider/TreeItemProvider.d.ts +9 -0
- package/{modern/TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +7 -3
- package/{TreeItem2Provider/TreeItem2Provider.types.d.ts → TreeItemProvider/TreeItemProvider.types.d.ts} +1 -1
- package/TreeItemProvider/index.d.ts +2 -0
- package/TreeItemProvider/index.js +1 -0
- package/{TreeItem2Icon → TreeItemProvider}/package.json +1 -1
- package/hooks/index.d.ts +1 -1
- package/hooks/index.js +1 -1
- package/hooks/useTreeItemUtils/index.d.ts +1 -0
- package/hooks/useTreeItemUtils/index.js +1 -0
- package/hooks/{useTreeItem2Utils/useTreeItem2Utils.d.ts → useTreeItemUtils/useTreeItemUtils.d.ts} +11 -11
- package/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +5 -3
- package/index.d.ts +5 -5
- package/index.js +6 -6
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +2 -1
- package/internals/components/RichTreeViewItems.d.ts +1 -2
- package/internals/index.d.ts +1 -1
- package/internals/models/helpers.d.ts +0 -2
- package/internals/models/itemPlugin.d.ts +11 -8
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +3 -5
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.d.ts +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +6 -5
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.d.ts +2 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +86 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -18
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +33 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +20 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +95 -0
- package/models/items.d.ts +4 -0
- package/modern/RichTreeView/RichTreeView.js +20 -1
- package/modern/SimpleTreeView/SimpleTreeView.js +21 -3
- package/modern/TreeItem/TreeItem.js +238 -368
- package/modern/TreeItem/index.js +2 -4
- package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +26 -21
- package/modern/TreeItemDragAndDropOverlay/index.js +1 -0
- package/modern/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
- package/modern/TreeItemIcon/index.js +1 -0
- package/modern/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +7 -3
- package/modern/TreeItemLabelInput/index.js +1 -0
- package/{TreeItem2Provider/TreeItem2Provider.js → modern/TreeItemProvider/TreeItemProvider.js} +7 -3
- package/modern/TreeItemProvider/index.js +1 -0
- package/modern/hooks/index.js +1 -1
- package/modern/hooks/useTreeItemUtils/index.js +1 -0
- package/modern/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +5 -3
- package/modern/index.js +6 -6
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +86 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -18
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +95 -0
- package/modern/useTreeItem/index.js +1 -0
- package/modern/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +21 -42
- package/node/RichTreeView/RichTreeView.js +20 -1
- package/node/SimpleTreeView/SimpleTreeView.js +21 -3
- package/node/TreeItem/TreeItem.js +239 -369
- package/node/TreeItem/index.js +38 -16
- package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +26 -22
- package/node/TreeItemDragAndDropOverlay/index.js +12 -0
- package/node/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +4 -3
- package/node/TreeItemIcon/index.js +12 -0
- package/node/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +6 -3
- package/node/TreeItemLabelInput/index.js +12 -0
- package/node/{TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +6 -3
- package/node/TreeItemProvider/index.js +12 -0
- package/node/hooks/index.js +3 -3
- package/node/hooks/useTreeItemUtils/index.js +12 -0
- package/node/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +6 -5
- package/node/index.js +29 -29
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +2 -4
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +94 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +42 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +99 -2
- package/node/useTreeItem/index.js +12 -0
- package/node/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +22 -44
- package/package.json +3 -3
- package/themeAugmentation/components.d.ts +0 -10
- package/themeAugmentation/overrides.d.ts +0 -3
- package/themeAugmentation/props.d.ts +1 -5
- package/useTreeItem/index.d.ts +2 -0
- package/useTreeItem/index.js +1 -0
- package/{TreeItem2 → useTreeItem}/package.json +1 -1
- package/useTreeItem/useTreeItem.d.ts +2 -0
- package/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +21 -42
- package/{useTreeItem2/useTreeItem2.types.d.ts → useTreeItem/useTreeItem.types.d.ts} +42 -58
- package/TreeItem/TreeItemContent.d.ts +0 -61
- package/TreeItem/TreeItemContent.js +0 -146
- package/TreeItem/useTreeItemState.d.ts +0 -21
- package/TreeItem/useTreeItemState.js +0 -143
- package/TreeItem2/TreeItem2.d.ts +0 -34
- package/TreeItem2/TreeItem2.js +0 -387
- package/TreeItem2/TreeItem2.types.d.ts +0 -92
- package/TreeItem2/index.d.ts +0 -2
- package/TreeItem2/index.js +0 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +0 -4
- package/TreeItem2DragAndDropOverlay/index.d.ts +0 -2
- package/TreeItem2DragAndDropOverlay/index.js +0 -1
- package/TreeItem2DragAndDropOverlay/package.json +0 -6
- package/TreeItem2Icon/TreeItem2Icon.d.ts +0 -7
- package/TreeItem2Icon/index.d.ts +0 -2
- package/TreeItem2Icon/index.js +0 -1
- package/TreeItem2LabelInput/TreeItem2LabelInput.d.ts +0 -2
- package/TreeItem2LabelInput/index.d.ts +0 -2
- package/TreeItem2LabelInput/index.js +0 -1
- package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -6
- package/TreeItem2Provider/index.d.ts +0 -2
- package/TreeItem2Provider/index.js +0 -1
- package/TreeView/TreeView.d.ts +0 -21
- package/TreeView/TreeView.js +0 -211
- package/TreeView/TreeView.types.d.ts +0 -9
- package/TreeView/index.d.ts +0 -3
- package/TreeView/index.js +0 -3
- package/TreeView/package.json +0 -6
- package/TreeView/treeViewClasses.d.ts +0 -7
- package/TreeView/treeViewClasses.js +0 -6
- package/hooks/useTreeItem2Utils/index.d.ts +0 -1
- package/hooks/useTreeItem2Utils/index.js +0 -1
- package/modern/TreeItem/TreeItemContent.js +0 -146
- package/modern/TreeItem/useTreeItemState.js +0 -143
- package/modern/TreeItem2/TreeItem2.js +0 -387
- package/modern/TreeItem2/index.js +0 -1
- package/modern/TreeItem2DragAndDropOverlay/index.js +0 -1
- package/modern/TreeItem2Icon/index.js +0 -1
- package/modern/TreeItem2LabelInput/index.js +0 -1
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +0 -1
- package/modern/TreeItem2Provider/index.js +0 -1
- package/modern/TreeView/TreeView.js +0 -211
- package/modern/TreeView/TreeView.types.js +0 -1
- package/modern/TreeView/index.js +0 -3
- package/modern/TreeView/treeViewClasses.js +0 -6
- package/modern/hooks/useTreeItem2Utils/index.js +0 -1
- package/modern/useTreeItem2/index.js +0 -4
- package/modern/useTreeItem2/useTreeItem2.types.js +0 -1
- package/node/TreeItem/TreeItemContent.js +0 -153
- package/node/TreeItem/useTreeItemState.js +0 -148
- package/node/TreeItem2/TreeItem2.js +0 -394
- package/node/TreeItem2/index.js +0 -48
- package/node/TreeItem2DragAndDropOverlay/index.js +0 -12
- package/node/TreeItem2Icon/index.js +0 -12
- package/node/TreeItem2LabelInput/index.js +0 -12
- package/node/TreeItem2Provider/index.js +0 -12
- package/node/TreeView/TreeView.js +0 -217
- package/node/TreeView/TreeView.types.js +0 -5
- package/node/TreeView/index.js +0 -27
- package/node/TreeView/treeViewClasses.js +0 -14
- package/node/hooks/useTreeItem2Utils/index.js +0 -12
- package/node/useTreeItem2/index.js +0 -10
- package/node/useTreeItem2/useTreeItem2.types.js +0 -5
- package/useTreeItem2/index.d.ts +0 -3
- package/useTreeItem2/index.js +0 -4
- package/useTreeItem2/useTreeItem2.d.ts +0 -2
- package/useTreeItem2/useTreeItem2.types.js +0 -1
- /package/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/{TreeItem2Provider/TreeItem2Provider.types.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/{TreeView/TreeView.types.js → modern/TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/modern/{TreeItem2/TreeItem2.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/modern/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/modern/{TreeItem2Icon/TreeItem2Icon.types.js → useTreeItem/useTreeItem.types.js} +0 -0
- /package/node/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/node/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/node/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/node/{TreeItem2Provider/TreeItem2Provider.types.js → useTreeItem/useTreeItem.types.js} +0 -0
- /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
|
|
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 "./
|
|
16
|
-
export * from "./
|
|
17
|
-
export * from "./
|
|
18
|
-
export * from "./
|
|
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
|
-
|
|
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
|
|
15
|
+
item?: React.JSXElementConstructor<TreeItemProps>;
|
|
17
16
|
}
|
|
18
17
|
export interface RichTreeViewItemsSlotProps {
|
|
19
18
|
item?: SlotComponentProps<typeof TreeItem, {}, RichTreeViewItemsOwnerState>;
|
package/internals/index.d.ts
CHANGED
|
@@ -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,
|
|
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 {
|
|
4
|
-
import type {
|
|
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:
|
|
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<
|
|
14
|
-
content?: TreeViewItemPluginSlotPropsEnhancer<
|
|
15
|
-
dragAndDropOverlay?: TreeViewItemPluginSlotPropsEnhancer<
|
|
16
|
-
labelInput?: TreeViewItemPluginSlotPropsEnhancer<
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
2
|
+
export declare const useTreeViewLabelItemPlugin: TreeViewItemPlugin;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { DefaultizedProps
|
|
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 {
|
|
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
|
|
76
|
+
export interface UseTreeItemLabelInputSlotPropsFromLabelEditing extends TreeItemLabelInputProps {
|
|
76
77
|
}
|
|
77
|
-
declare module '@mui/x-tree-view/
|
|
78
|
-
interface
|
|
78
|
+
declare module '@mui/x-tree-view/useTreeItem' {
|
|
79
|
+
interface UseTreeItemLabelInputSlotOwnProps extends UseTreeItemLabelInputSlotPropsFromLabelEditing {
|
|
79
80
|
}
|
|
80
81
|
}
|
|
@@ -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,
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
const changes = getAddedAndRemovedItems({
|
|
40
|
+
instance,
|
|
41
|
+
newModel: cleanModel,
|
|
42
|
+
oldModel: models.selectedItems.value
|
|
30
43
|
});
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 (
|
|
39
|
-
params.onItemSelectionToggle(event,
|
|
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,
|
|
62
|
+
params.onSelectedItemsChange(event, cleanModel);
|
|
45
63
|
}
|
|
46
|
-
models.selectedItems.setControlledValue(
|
|
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
|
|
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]:
|
|
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 {}
|