@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.
- package/CHANGELOG.md +486 -11
- package/README.md +4 -4
- package/RichTreeView/RichTreeView.js +22 -5
- package/RichTreeView/RichTreeView.types.d.ts +4 -17
- package/SimpleTreeView/SimpleTreeView.js +21 -3
- package/TreeItem/TreeItem.d.ts +20 -2
- package/TreeItem/TreeItem.js +241 -371
- package/TreeItem/TreeItem.types.d.ts +52 -85
- 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} +8 -6
- 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} +3 -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/TreeItemProvider/TreeItemProvider.js +43 -0
- package/{TreeItem2Provider/TreeItem2Provider.types.d.ts → TreeItemProvider/TreeItemProvider.types.d.ts} +2 -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 +2 -1
- package/hooks/index.js +2 -1
- package/hooks/useTreeItemModel.d.ts +2 -0
- package/hooks/useTreeItemModel.js +11 -0
- 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} +13 -12
- package/{modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js → hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
- package/index.d.ts +5 -7
- package/index.js +6 -8
- package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -2
- package/internals/components/RichTreeViewItems.d.ts +3 -6
- package/internals/components/RichTreeViewItems.js +42 -30
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
- package/internals/hooks/useSelector.d.ts +4 -0
- package/internals/hooks/useSelector.js +6 -0
- package/internals/index.d.ts +6 -1
- package/internals/index.js +5 -1
- package/internals/models/helpers.d.ts +0 -2
- package/internals/models/itemPlugin.d.ts +13 -10
- package/internals/models/plugin.d.ts +20 -8
- package/internals/models/treeView.d.ts +6 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +124 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +8 -15
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +1 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +718 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +16 -55
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.d.ts +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +13 -29
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.d.ts +2 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +39 -9
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +20 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
- package/internals/useTreeView/useTreeView.js +30 -17
- package/internals/useTreeView/useTreeView.types.d.ts +1 -2
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +3 -1
- package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/internals/utils/TreeViewStore.d.ts +12 -0
- package/internals/utils/TreeViewStore.js +24 -0
- package/internals/utils/selectors.d.ts +9 -0
- package/internals/utils/selectors.js +37 -0
- package/internals/utils/tree.d.ts +8 -8
- package/internals/utils/tree.js +51 -43
- package/models/items.d.ts +7 -2
- package/modern/RichTreeView/RichTreeView.js +22 -5
- package/modern/SimpleTreeView/SimpleTreeView.js +21 -3
- package/modern/TreeItem/TreeItem.js +241 -371
- package/modern/TreeItem/index.js +2 -4
- package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +8 -6
- 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} +3 -3
- package/modern/TreeItemLabelInput/index.js +1 -0
- package/modern/TreeItemProvider/TreeItemProvider.js +43 -0
- package/modern/TreeItemProvider/index.js +1 -0
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItemModel.js +11 -0
- package/modern/hooks/useTreeItemUtils/index.js +1 -0
- package/{hooks/useTreeItem2Utils/useTreeItem2Utils.js → modern/hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
- package/modern/index.js +6 -8
- package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/modern/internals/components/RichTreeViewItems.js +42 -30
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/modern/internals/hooks/useSelector.js +6 -0
- package/modern/internals/index.js +5 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
- package/modern/internals/useTreeView/useTreeView.js +30 -17
- package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/modern/internals/utils/TreeViewStore.js +24 -0
- package/modern/internals/utils/selectors.js +37 -0
- package/modern/internals/utils/tree.js +51 -43
- package/modern/useTreeItem/index.js +1 -0
- package/modern/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +45 -51
- package/node/RichTreeView/RichTreeView.js +22 -5
- package/node/SimpleTreeView/SimpleTreeView.js +21 -3
- package/node/TreeItem/TreeItem.js +242 -372
- package/node/TreeItem/index.js +38 -16
- package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +7 -6
- 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} +3 -3
- package/node/TreeItemLabelInput/index.js +12 -0
- package/node/{TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +22 -6
- package/node/TreeItemProvider/index.js +12 -0
- package/node/hooks/index.js +10 -3
- package/node/hooks/useTreeItemModel.js +17 -0
- package/node/hooks/useTreeItemUtils/index.js +12 -0
- package/node/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +37 -19
- package/node/index.js +18 -42
- package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/node/internals/components/RichTreeViewItems.js +42 -30
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
- package/node/internals/hooks/useSelector.js +13 -0
- package/node/internals/index.js +47 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +23 -0
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +14 -0
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
- package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -102
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +96 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +78 -42
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +109 -2
- package/node/internals/useTreeView/useTreeView.js +30 -17
- package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
- package/node/internals/utils/TreeViewStore.js +31 -0
- package/node/internals/utils/selectors.js +44 -0
- package/node/internals/utils/tree.js +51 -43
- package/node/useTreeItem/index.js +12 -0
- package/node/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +46 -53
- package/package.json +7 -5
- 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} +45 -51
- package/{useTreeItem2/useTreeItem2.types.d.ts → useTreeItem/useTreeItem.types.d.ts} +51 -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 -7
- 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 -5
- package/TreeItem2LabelInput/index.d.ts +0 -2
- package/TreeItem2LabelInput/index.js +0 -1
- package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -6
- package/TreeItem2Provider/TreeItem2Provider.js +0 -26
- 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.js +0 -26
- 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
|
@@ -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
|
|
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.
|
|
@@ -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
|
-
|
|
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
|
|
59
|
+
export interface UseTreeItemLabelInputSlotPropsFromLabelEditing extends TreeItemLabelInputProps {
|
|
76
60
|
}
|
|
77
|
-
declare module '@mui/x-tree-view/
|
|
78
|
-
interface
|
|
61
|
+
declare module '@mui/x-tree-view/useTreeItem' {
|
|
62
|
+
interface UseTreeItemLabelInputSlotOwnProps extends UseTreeItemLabelInputSlotPropsFromLabelEditing {
|
|
79
63
|
}
|
|
80
64
|
}
|
|
@@ -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
|
-
|
|
9
|
+
store,
|
|
7
10
|
params,
|
|
8
11
|
models
|
|
9
12
|
}) => {
|
|
10
13
|
const lastSelectedItem = React.useRef(null);
|
|
11
14
|
const lastSelectedRange = React.useRef({});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
19
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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 (
|
|
39
|
-
params.onItemSelectionToggle(event,
|
|
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,
|
|
60
|
+
params.onSelectedItemsChange(event, cleanModel);
|
|
45
61
|
}
|
|
46
|
-
models.selectedItems.setControlledValue(
|
|
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 =
|
|
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 &&
|
|
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(
|
|
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(
|
|
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(
|
|
126
|
+
selectRange(event, [getFirstNavigableItem(store.value), itemId]);
|
|
109
127
|
};
|
|
110
128
|
const selectRangeFromItemToEnd = (event, itemId) => {
|
|
111
|
-
selectRange(event, [itemId, getLastNavigableItem(
|
|
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(
|
|
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
|
|
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]:
|
|
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[];
|