@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
|
@@ -6,15 +6,15 @@ import { TreeViewEventLookupElement } from './events';
|
|
|
6
6
|
import type { TreeViewCorePluginSignatures } from '../corePlugins';
|
|
7
7
|
import { TreeViewItemPlugin } from './itemPlugin';
|
|
8
8
|
import { TreeViewItemId } from '../../models';
|
|
9
|
+
import { TreeViewStore } from '../utils/TreeViewStore';
|
|
9
10
|
export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSignature> {
|
|
10
11
|
instance: TreeViewUsedInstance<TSignature>;
|
|
11
12
|
params: TreeViewUsedDefaultizedParams<TSignature>;
|
|
12
|
-
state: TreeViewUsedState<TSignature>;
|
|
13
13
|
slots: TSignature['slots'];
|
|
14
14
|
slotProps: TSignature['slotProps'];
|
|
15
15
|
experimentalFeatures: TreeViewUsedExperimentalFeatures<TSignature>;
|
|
16
16
|
models: TreeViewUsedModels<TSignature>;
|
|
17
|
-
|
|
17
|
+
store: TreeViewUsedStore<TSignature>;
|
|
18
18
|
rootRef: React.RefObject<HTMLUListElement>;
|
|
19
19
|
plugins: TreeViewPlugin<TreeViewAnyPluginSignature>[];
|
|
20
20
|
}
|
|
@@ -35,6 +35,7 @@ export type TreeViewPluginSignature<T extends {
|
|
|
35
35
|
[key in keyof T['events']]: TreeViewEventLookupElement;
|
|
36
36
|
};
|
|
37
37
|
state?: {};
|
|
38
|
+
cache?: {};
|
|
38
39
|
contextValue?: {};
|
|
39
40
|
slots?: {
|
|
40
41
|
[key in keyof T['slots']]: React.ElementType;
|
|
@@ -65,6 +66,9 @@ export type TreeViewPluginSignature<T extends {
|
|
|
65
66
|
state: T extends {
|
|
66
67
|
state: {};
|
|
67
68
|
} ? T['state'] : {};
|
|
69
|
+
cache: T extends {
|
|
70
|
+
cache: {};
|
|
71
|
+
} ? T['cache'] : {};
|
|
68
72
|
contextValue: T extends {
|
|
69
73
|
contextValue: {};
|
|
70
74
|
} ? T['contextValue'] : {};
|
|
@@ -93,6 +97,7 @@ export type TreeViewPluginSignature<T extends {
|
|
|
93
97
|
} ? T['optionalDependencies'] : [];
|
|
94
98
|
};
|
|
95
99
|
export type TreeViewAnyPluginSignature = {
|
|
100
|
+
cache: any;
|
|
96
101
|
state: any;
|
|
97
102
|
instance: any;
|
|
98
103
|
params: any;
|
|
@@ -120,8 +125,14 @@ export type TreeViewUsedInstance<TSignature extends TreeViewAnyPluginSignature>
|
|
|
120
125
|
*/
|
|
121
126
|
$$signature: TSignature;
|
|
122
127
|
};
|
|
123
|
-
type
|
|
124
|
-
|
|
128
|
+
export type TreeViewUsedStore<TSignature extends TreeViewAnyPluginSignature> = TreeViewStore<[
|
|
129
|
+
TSignature,
|
|
130
|
+
...TSignature['dependencies']
|
|
131
|
+
]>;
|
|
132
|
+
type TreeViewUsedExperimentalFeatures<TSignature extends TreeViewAnyPluginSignature> = TreeViewExperimentalFeatures<[
|
|
133
|
+
TSignature,
|
|
134
|
+
...TSignature['dependencies']
|
|
135
|
+
], TSignature['optionalDependencies']>;
|
|
125
136
|
type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = {
|
|
126
137
|
[K in keyof Models]: Omit<Models[K], 'setValue'>;
|
|
127
138
|
};
|
|
@@ -131,10 +142,10 @@ export type TreeItemWrapper<TSignatures extends readonly TreeViewAnyPluginSignat
|
|
|
131
142
|
itemId: TreeViewItemId;
|
|
132
143
|
children: React.ReactNode;
|
|
133
144
|
instance: TreeViewInstance<TSignatures>;
|
|
145
|
+
idAttribute: string;
|
|
134
146
|
}) => React.ReactNode;
|
|
135
|
-
export type TreeRootWrapper
|
|
147
|
+
export type TreeRootWrapper = (params: {
|
|
136
148
|
children: React.ReactNode;
|
|
137
|
-
instance: TreeViewInstance<TSignatures>;
|
|
138
149
|
}) => React.ReactNode;
|
|
139
150
|
export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
|
|
140
151
|
(options: TreeViewPluginOptions<TSignature>): TreeViewResponse<TSignature>;
|
|
@@ -143,9 +154,10 @@ export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
|
|
|
143
154
|
experimentalFeatures: TreeViewUsedExperimentalFeatures<TSignature>;
|
|
144
155
|
}) => TSignature['defaultizedParams'];
|
|
145
156
|
getInitialState?: (params: TreeViewUsedDefaultizedParams<TSignature>) => TSignature['state'];
|
|
157
|
+
getInitialCache?: () => TSignature['cache'];
|
|
146
158
|
models?: TreeViewModelsInitializer<TSignature>;
|
|
147
159
|
params: Record<keyof TSignature['params'], true>;
|
|
148
|
-
itemPlugin?: TreeViewItemPlugin
|
|
160
|
+
itemPlugin?: TreeViewItemPlugin;
|
|
149
161
|
/**
|
|
150
162
|
* Render function used to add React wrappers around the TreeItem.
|
|
151
163
|
* @param {{ nodeId: TreeViewItemId; children: React.ReactNode; }} params The params of the item.
|
|
@@ -157,6 +169,6 @@ export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
|
|
|
157
169
|
* @param {{ children: React.ReactNode; }} params The params of the root.
|
|
158
170
|
* @returns {React.ReactNode} The wrapped root.
|
|
159
171
|
*/
|
|
160
|
-
wrapRoot?: TreeRootWrapper
|
|
172
|
+
wrapRoot?: TreeRootWrapper;
|
|
161
173
|
};
|
|
162
174
|
export {};
|
|
@@ -24,3 +24,9 @@ export interface TreeViewModel<TValue> {
|
|
|
24
24
|
export type TreeViewInstance<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'instance'> & Partial<MergeSignaturesProperty<TOptionalSignatures, 'instance'>>;
|
|
25
25
|
export type TreeViewPublicAPI<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'publicAPI'> & Partial<MergeSignaturesProperty<TOptionalSignatures, 'instance'>>;
|
|
26
26
|
export type TreeViewExperimentalFeatures<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TSignatures, ...TOptionalSignatures], 'experimentalFeatures'>;
|
|
27
|
+
export type TreeViewStateCacheKey = {
|
|
28
|
+
id: number;
|
|
29
|
+
};
|
|
30
|
+
export type TreeViewState<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'state'> & Partial<MergeSignaturesProperty<TOptionalSignatures, 'state'>> & {
|
|
31
|
+
cacheKey: TreeViewStateCacheKey;
|
|
32
|
+
};
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
|
+
import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
|
|
5
|
+
import { selectorIsItemExpandable, selectorIsItemExpanded } from "./useTreeViewExpansion.selectors.js";
|
|
6
|
+
import { createExpandedItemsMap } from "./useTreeViewExpansion.utils.js";
|
|
7
|
+
import { selectorItemMeta, selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
4
8
|
export const useTreeViewExpansion = ({
|
|
5
9
|
instance,
|
|
10
|
+
store,
|
|
6
11
|
params,
|
|
7
|
-
models
|
|
12
|
+
models,
|
|
13
|
+
experimentalFeatures
|
|
8
14
|
}) => {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
|
|
16
|
+
useEnhancedEffect(() => {
|
|
17
|
+
store.update(prevState => _extends({}, prevState, {
|
|
18
|
+
expansion: {
|
|
19
|
+
expandedItemsMap: createExpandedItemsMap(models.expandedItems.value)
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
}, [store, models.expandedItems.value]);
|
|
16
23
|
const setExpandedItems = (event, value) => {
|
|
17
24
|
params.onExpandedItemsChange?.(event, value);
|
|
18
25
|
models.expandedItems.setControlledValue(value);
|
|
19
26
|
};
|
|
20
|
-
const isItemExpanded = React.useCallback(itemId => expandedItemsMap.has(itemId), [expandedItemsMap]);
|
|
21
|
-
const isItemExpandable = React.useCallback(itemId => !!instance.getItemMeta(itemId)?.expandable, [instance]);
|
|
22
27
|
const toggleItemExpansion = useEventCallback((event, itemId) => {
|
|
23
|
-
const isExpandedBefore =
|
|
28
|
+
const isExpandedBefore = selectorIsItemExpanded(store.value, itemId);
|
|
24
29
|
instance.setItemExpansion(event, itemId, !isExpandedBefore);
|
|
25
30
|
});
|
|
26
31
|
const setItemExpansion = useEventCallback((event, itemId, isExpanded) => {
|
|
27
|
-
const isExpandedBefore =
|
|
32
|
+
const isExpandedBefore = selectorIsItemExpanded(store.value, itemId);
|
|
28
33
|
if (isExpandedBefore === isExpanded) {
|
|
29
34
|
return;
|
|
30
35
|
}
|
|
@@ -40,9 +45,12 @@ export const useTreeViewExpansion = ({
|
|
|
40
45
|
setExpandedItems(event, newExpanded);
|
|
41
46
|
});
|
|
42
47
|
const expandAllSiblings = (event, itemId) => {
|
|
43
|
-
const itemMeta =
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
49
|
+
if (itemMeta == null) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const siblings = selectorItemOrderedChildrenIds(store.value, itemMeta.parentId);
|
|
53
|
+
const diff = siblings.filter(child => selectorIsItemExpandable(store.value, child) && !selectorIsItemExpanded(store.value, child));
|
|
46
54
|
const newExpanded = models.expandedItems.value.concat(diff);
|
|
47
55
|
if (diff.length > 0) {
|
|
48
56
|
if (params.onItemExpansionToggle) {
|
|
@@ -57,27 +65,26 @@ export const useTreeViewExpansion = ({
|
|
|
57
65
|
if (params.expansionTrigger) {
|
|
58
66
|
return params.expansionTrigger;
|
|
59
67
|
}
|
|
60
|
-
if (
|
|
68
|
+
if (isTreeViewEditable) {
|
|
61
69
|
return 'iconContainer';
|
|
62
70
|
}
|
|
63
71
|
return 'content';
|
|
64
|
-
}, [params.expansionTrigger,
|
|
72
|
+
}, [params.expansionTrigger, isTreeViewEditable]);
|
|
73
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
74
|
+
expansion: {
|
|
75
|
+
expansionTrigger
|
|
76
|
+
}
|
|
77
|
+
}), [expansionTrigger]);
|
|
65
78
|
return {
|
|
66
79
|
publicAPI: {
|
|
67
80
|
setItemExpansion
|
|
68
81
|
},
|
|
69
82
|
instance: {
|
|
70
|
-
isItemExpanded,
|
|
71
|
-
isItemExpandable,
|
|
72
83
|
setItemExpansion,
|
|
73
84
|
toggleItemExpansion,
|
|
74
85
|
expandAllSiblings
|
|
75
86
|
},
|
|
76
|
-
contextValue:
|
|
77
|
-
expansion: {
|
|
78
|
-
expansionTrigger
|
|
79
|
-
}
|
|
80
|
-
}
|
|
87
|
+
contextValue: pluginContextValue
|
|
81
88
|
};
|
|
82
89
|
};
|
|
83
90
|
useTreeViewExpansion.models = {
|
|
@@ -91,6 +98,11 @@ useTreeViewExpansion.getDefaultizedParams = ({
|
|
|
91
98
|
}) => _extends({}, params, {
|
|
92
99
|
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
|
|
93
100
|
});
|
|
101
|
+
useTreeViewExpansion.getInitialState = params => ({
|
|
102
|
+
expansion: {
|
|
103
|
+
expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
|
|
104
|
+
}
|
|
105
|
+
});
|
|
94
106
|
useTreeViewExpansion.params = {
|
|
95
107
|
expandedItems: true,
|
|
96
108
|
defaultExpandedItems: true,
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { TreeViewRootSelector } from '../../utils/selectors';
|
|
2
|
+
import { UseTreeViewExpansionSignature } from './useTreeViewExpansion.types';
|
|
3
|
+
/**
|
|
4
|
+
* Check if an item is expanded.
|
|
5
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
6
|
+
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export declare const selectorIsItemExpanded: ((state: any, itemId: string) => boolean) & {
|
|
9
|
+
clearCache: () => void;
|
|
10
|
+
resultsCount: () => number;
|
|
11
|
+
resetResultsCount: () => void;
|
|
12
|
+
} & {
|
|
13
|
+
resultFunc: (resultFuncArgs_0: {
|
|
14
|
+
expandedItemsMap: Map<string, true>;
|
|
15
|
+
}, resultFuncArgs_1: string) => boolean;
|
|
16
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
17
|
+
expandedItemsMap: Map<string, true>;
|
|
18
|
+
}, resultFuncArgs_1: string) => boolean) & {
|
|
19
|
+
clearCache: () => void;
|
|
20
|
+
resultsCount: () => number;
|
|
21
|
+
resetResultsCount: () => void;
|
|
22
|
+
};
|
|
23
|
+
lastResult: () => boolean;
|
|
24
|
+
dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>, (_: 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
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Check if an item is expandable.
|
|
35
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
36
|
+
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
37
|
+
*/
|
|
38
|
+
export declare const selectorIsItemExpandable: ((state: any, itemId: string | null) => boolean) & {
|
|
39
|
+
clearCache: () => void;
|
|
40
|
+
resultsCount: () => number;
|
|
41
|
+
resetResultsCount: () => void;
|
|
42
|
+
} & {
|
|
43
|
+
resultFunc: (resultFuncArgs_0: import("../..").TreeViewItemMeta | null) => boolean;
|
|
44
|
+
memoizedResultFunc: ((resultFuncArgs_0: import("../..").TreeViewItemMeta | null) => boolean) & {
|
|
45
|
+
clearCache: () => void;
|
|
46
|
+
resultsCount: () => number;
|
|
47
|
+
resetResultsCount: () => void;
|
|
48
|
+
};
|
|
49
|
+
lastResult: () => boolean;
|
|
50
|
+
dependencies: [((state: any, itemId: string | null) => import("../..").TreeViewItemMeta | null) & {
|
|
51
|
+
clearCache: () => void;
|
|
52
|
+
resultsCount: () => number;
|
|
53
|
+
resetResultsCount: () => void;
|
|
54
|
+
} & {
|
|
55
|
+
resultFunc: (resultFuncArgs_0: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup, resultFuncArgs_1: string | null) => import("../..").TreeViewItemMeta | null;
|
|
56
|
+
memoizedResultFunc: ((resultFuncArgs_0: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup, resultFuncArgs_1: string | null) => import("../..").TreeViewItemMeta | null) & {
|
|
57
|
+
clearCache: () => void;
|
|
58
|
+
resultsCount: () => number;
|
|
59
|
+
resetResultsCount: () => void;
|
|
60
|
+
};
|
|
61
|
+
lastResult: () => import("../..").TreeViewItemMeta | null;
|
|
62
|
+
dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("../useTreeViewItems").UseTreeViewItemsState<import("../../..").TreeViewDefaultItemModelProperties> & Partial<{}> & {
|
|
63
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
64
|
+
}) => import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup) & {
|
|
65
|
+
clearCache: () => void;
|
|
66
|
+
resultsCount: () => number;
|
|
67
|
+
resetResultsCount: () => void;
|
|
68
|
+
} & {
|
|
69
|
+
resultFunc: (resultFuncArgs_0: {
|
|
70
|
+
disabledItemsFocusable: boolean;
|
|
71
|
+
itemModelLookup: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemModelLookup<import("../../..").TreeViewDefaultItemModelProperties>;
|
|
72
|
+
itemMetaLookup: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup;
|
|
73
|
+
itemOrderedChildrenIdsLookup: {
|
|
74
|
+
[parentItemId: string]: string[];
|
|
75
|
+
};
|
|
76
|
+
itemChildrenIndexesLookup: {
|
|
77
|
+
[parentItemId: string]: {
|
|
78
|
+
[itemId: string]: number;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
}) => import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup;
|
|
82
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
83
|
+
disabledItemsFocusable: boolean;
|
|
84
|
+
itemModelLookup: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemModelLookup<import("../../..").TreeViewDefaultItemModelProperties>;
|
|
85
|
+
itemMetaLookup: import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup;
|
|
86
|
+
itemOrderedChildrenIdsLookup: {
|
|
87
|
+
[parentItemId: string]: string[];
|
|
88
|
+
};
|
|
89
|
+
itemChildrenIndexesLookup: {
|
|
90
|
+
[parentItemId: string]: {
|
|
91
|
+
[itemId: string]: number;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
}) => import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup) & {
|
|
95
|
+
clearCache: () => void;
|
|
96
|
+
resultsCount: () => number;
|
|
97
|
+
resetResultsCount: () => void;
|
|
98
|
+
};
|
|
99
|
+
lastResult: () => import("../useTreeViewItems/useTreeViewItems.types").TreeViewItemMetaLookup;
|
|
100
|
+
dependencies: [TreeViewRootSelector<import("../useTreeViewItems").UseTreeViewItemsSignature>];
|
|
101
|
+
recomputations: () => number;
|
|
102
|
+
resetRecomputations: () => void;
|
|
103
|
+
dependencyRecomputations: () => number;
|
|
104
|
+
resetDependencyRecomputations: () => void;
|
|
105
|
+
} & {
|
|
106
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
107
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
108
|
+
}, (_: any, itemId: string | null) => string | null];
|
|
109
|
+
recomputations: () => number;
|
|
110
|
+
resetRecomputations: () => void;
|
|
111
|
+
dependencyRecomputations: () => number;
|
|
112
|
+
resetDependencyRecomputations: () => void;
|
|
113
|
+
} & {
|
|
114
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
115
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
116
|
+
}];
|
|
117
|
+
recomputations: () => number;
|
|
118
|
+
resetRecomputations: () => void;
|
|
119
|
+
dependencyRecomputations: () => number;
|
|
120
|
+
resetDependencyRecomputations: () => void;
|
|
121
|
+
} & {
|
|
122
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
123
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
124
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
import { selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
3
|
+
const selectorExpansion = state => state.expansion;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if an item is expanded.
|
|
7
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
8
|
+
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export const selectorIsItemExpanded = createSelector([selectorExpansion, (_, itemId) => itemId], (expansionState, itemId) => expansionState.expandedItemsMap.has(itemId));
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if an item is expandable.
|
|
14
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
15
|
+
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
16
|
+
*/
|
|
17
|
+
export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
|
|
@@ -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';
|
|
@@ -13,20 +14,6 @@ export interface UseTreeViewExpansionPublicAPI {
|
|
|
13
14
|
setItemExpansion: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
|
|
14
15
|
}
|
|
15
16
|
export interface UseTreeViewExpansionInstance extends UseTreeViewExpansionPublicAPI {
|
|
16
|
-
/**
|
|
17
|
-
* Check if an item is expanded.
|
|
18
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
19
|
-
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
20
|
-
*/
|
|
21
|
-
isItemExpanded: (itemId: TreeViewItemId) => boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Check if an item is expandable.
|
|
24
|
-
* Currently, an item is expandable if it has children.
|
|
25
|
-
* In the future, the user should be able to flag an item as expandable even if it has no loaded children to support children lazy loading.
|
|
26
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
27
|
-
* @returns {boolean} `true` if the item can be expanded, `false` otherwise.
|
|
28
|
-
*/
|
|
29
|
-
isItemExpandable: (itemId: TreeViewItemId) => boolean;
|
|
30
17
|
/**
|
|
31
18
|
* Toggle the current expansion of an item.
|
|
32
19
|
* If it is expanded, it will be collapsed, and vice versa.
|
|
@@ -73,6 +60,11 @@ export interface UseTreeViewExpansionParameters {
|
|
|
73
60
|
expansionTrigger?: 'content' | 'iconContainer';
|
|
74
61
|
}
|
|
75
62
|
export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedItems'>;
|
|
63
|
+
export interface UseTreeViewExpansionState {
|
|
64
|
+
expansion: {
|
|
65
|
+
expandedItemsMap: Map<string, true>;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
76
68
|
interface UseTreeViewExpansionContextValue {
|
|
77
69
|
expansion: Pick<UseTreeViewExpansionParameters, 'expansionTrigger'>;
|
|
78
70
|
}
|
|
@@ -82,6 +74,7 @@ export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
|
|
|
82
74
|
instance: UseTreeViewExpansionInstance;
|
|
83
75
|
publicAPI: UseTreeViewExpansionPublicAPI;
|
|
84
76
|
modelNames: 'expandedItems';
|
|
77
|
+
state: UseTreeViewExpansionState;
|
|
85
78
|
contextValue: UseTreeViewExpansionContextValue;
|
|
86
79
|
dependencies: [UseTreeViewItemsSignature];
|
|
87
80
|
optionalDependencies: [UseTreeViewLabelSignature];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createExpandedItemsMap: (expandedItems: string[]) => Map<string, true>;
|
|
@@ -1,46 +1,56 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
|
-
import ownerDocument from '@mui/utils/ownerDocument';
|
|
5
4
|
import { useInstanceEventHandler } from "../../hooks/useInstanceEventHandler.js";
|
|
6
|
-
import { getActiveElement } from "../../utils/utils.js";
|
|
7
5
|
import { getFirstNavigableItem } from "../../utils/tree.js";
|
|
8
6
|
import { convertSelectedItemsToArray } from "../useTreeViewSelection/useTreeViewSelection.utils.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
const itemMeta = instance.getItemMeta(itemId);
|
|
15
|
-
return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
|
|
16
|
-
});
|
|
17
|
-
if (tabbableItemId == null) {
|
|
18
|
-
tabbableItemId = getFirstNavigableItem(instance);
|
|
19
|
-
}
|
|
20
|
-
return tabbableItemId;
|
|
21
|
-
};
|
|
7
|
+
import { selectorDefaultFocusableItemId, selectorFocusedItemId } from "./useTreeViewFocus.selectors.js";
|
|
8
|
+
import { selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
9
|
+
import { selectorCanItemBeFocused, selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
22
10
|
export const useTreeViewFocus = ({
|
|
23
11
|
instance,
|
|
24
12
|
params,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
models,
|
|
28
|
-
rootRef
|
|
13
|
+
store,
|
|
14
|
+
models
|
|
29
15
|
}) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
16
|
+
React.useEffect(() => {
|
|
17
|
+
let defaultFocusableItemId = convertSelectedItemsToArray(models.selectedItems.value).find(itemId => {
|
|
18
|
+
if (!selectorCanItemBeFocused(store.value, itemId)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
22
|
+
return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
|
|
23
|
+
});
|
|
24
|
+
if (defaultFocusableItemId == null) {
|
|
25
|
+
defaultFocusableItemId = getFirstNavigableItem(store.value) ?? null;
|
|
37
26
|
}
|
|
27
|
+
store.update(prevState => {
|
|
28
|
+
if (defaultFocusableItemId === prevState.focus.defaultFocusableItemId) {
|
|
29
|
+
return prevState;
|
|
30
|
+
}
|
|
31
|
+
return _extends({}, prevState, {
|
|
32
|
+
focus: _extends({}, prevState.focus, {
|
|
33
|
+
defaultFocusableItemId
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}, [store, models.selectedItems.value]);
|
|
38
|
+
const setFocusedItemId = useEventCallback(itemId => {
|
|
39
|
+
store.update(prevState => {
|
|
40
|
+
const focusedItemId = selectorFocusedItemId(prevState);
|
|
41
|
+
if (focusedItemId === itemId) {
|
|
42
|
+
return prevState;
|
|
43
|
+
}
|
|
44
|
+
return _extends({}, prevState, {
|
|
45
|
+
focus: _extends({}, prevState.focus, {
|
|
46
|
+
focusedItemId: itemId
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
});
|
|
38
50
|
});
|
|
39
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains(getActiveElement(ownerDocument(rootRef.current))), [rootRef]);
|
|
40
|
-
const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
|
|
41
51
|
const isItemVisible = itemId => {
|
|
42
|
-
const itemMeta =
|
|
43
|
-
return itemMeta && (itemMeta.parentId == null ||
|
|
52
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
53
|
+
return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
|
|
44
54
|
};
|
|
45
55
|
const innerFocusItem = (event, itemId) => {
|
|
46
56
|
const itemElement = instance.getItemDOMElement(itemId);
|
|
@@ -59,23 +69,25 @@ export const useTreeViewFocus = ({
|
|
|
59
69
|
}
|
|
60
70
|
});
|
|
61
71
|
const removeFocusedItem = useEventCallback(() => {
|
|
62
|
-
|
|
72
|
+
const focusedItemId = selectorFocusedItemId(store.value);
|
|
73
|
+
if (focusedItemId == null) {
|
|
63
74
|
return;
|
|
64
75
|
}
|
|
65
|
-
const itemMeta =
|
|
76
|
+
const itemMeta = selectorItemMeta(store.value, focusedItemId);
|
|
66
77
|
if (itemMeta) {
|
|
67
|
-
const itemElement = instance.getItemDOMElement(
|
|
78
|
+
const itemElement = instance.getItemDOMElement(focusedItemId);
|
|
68
79
|
if (itemElement) {
|
|
69
80
|
itemElement.blur();
|
|
70
81
|
}
|
|
71
82
|
}
|
|
72
83
|
setFocusedItemId(null);
|
|
73
84
|
});
|
|
74
|
-
const canItemBeTabbed = itemId => itemId === defaultFocusableItemId;
|
|
75
85
|
useInstanceEventHandler(instance, 'removeItem', ({
|
|
76
86
|
id
|
|
77
87
|
}) => {
|
|
78
|
-
|
|
88
|
+
const focusedItemId = selectorFocusedItemId(store.value);
|
|
89
|
+
const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
|
|
90
|
+
if (focusedItemId === id && defaultFocusableItemId != null) {
|
|
79
91
|
innerFocusItem(null, defaultFocusableItemId);
|
|
80
92
|
}
|
|
81
93
|
});
|
|
@@ -86,27 +98,37 @@ export const useTreeViewFocus = ({
|
|
|
86
98
|
}
|
|
87
99
|
|
|
88
100
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
89
|
-
|
|
101
|
+
const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
|
|
102
|
+
if (event.target === event.currentTarget && defaultFocusableItemId != null) {
|
|
90
103
|
innerFocusItem(event, defaultFocusableItemId);
|
|
91
104
|
}
|
|
92
105
|
};
|
|
106
|
+
const createRootHandleBlur = otherHandlers => event => {
|
|
107
|
+
otherHandlers.onBlur?.(event);
|
|
108
|
+
if (event.defaultMuiPrevented) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
setFocusedItemId(null);
|
|
112
|
+
};
|
|
93
113
|
return {
|
|
94
114
|
getRootProps: otherHandlers => ({
|
|
95
|
-
onFocus: createRootHandleFocus(otherHandlers)
|
|
115
|
+
onFocus: createRootHandleFocus(otherHandlers),
|
|
116
|
+
onBlur: createRootHandleBlur(otherHandlers)
|
|
96
117
|
}),
|
|
97
118
|
publicAPI: {
|
|
98
119
|
focusItem
|
|
99
120
|
},
|
|
100
121
|
instance: {
|
|
101
|
-
isItemFocused,
|
|
102
|
-
canItemBeTabbed,
|
|
103
122
|
focusItem,
|
|
104
123
|
removeFocusedItem
|
|
105
124
|
}
|
|
106
125
|
};
|
|
107
126
|
};
|
|
108
127
|
useTreeViewFocus.getInitialState = () => ({
|
|
109
|
-
|
|
128
|
+
focus: {
|
|
129
|
+
focusedItemId: null,
|
|
130
|
+
defaultFocusableItemId: null
|
|
131
|
+
}
|
|
110
132
|
});
|
|
111
133
|
useTreeViewFocus.params = {
|
|
112
134
|
onItemFocus: true
|