@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
|
@@ -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,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,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
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
const selectorTreeViewFocusState = state => state.focus;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get the item that should be sequentially focusable (usually with the Tab key).
|
|
6
|
+
* At any point in time, there is a single item that can be sequentially focused in the Tree View.
|
|
7
|
+
* This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected.
|
|
8
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
9
|
+
* @returns {TreeViewItemId | null} The id of the item that should be sequentially focusable.
|
|
10
|
+
*/
|
|
11
|
+
export const selectorDefaultFocusableItemId = createSelector(selectorTreeViewFocusState, focus => focus.defaultFocusableItemId);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Check if an item is the default focusable item.
|
|
15
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
16
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
17
|
+
* @returns {boolean} `true` if the item is the default focusable item, `false` otherwise.
|
|
18
|
+
*/
|
|
19
|
+
export const selectorIsItemTheDefaultFocusableItem = createSelector([selectorDefaultFocusableItemId, (_, itemId) => itemId], (defaultFocusableItemId, itemId) => defaultFocusableItemId === itemId);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get the id of the item that is currently focused.
|
|
23
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
24
|
+
* @returns {TreeViewItemId | null} The id of the item that is currently focused.
|
|
25
|
+
*/
|
|
26
|
+
export const selectorFocusedItemId = createSelector(selectorTreeViewFocusState, focus => focus.focusedItemId);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check if an item is focused.
|
|
30
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
31
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
32
|
+
* @returns {boolean} `true` if the item is focused, `false` otherwise.
|
|
33
|
+
*/
|
|
34
|
+
export const selectorIsItemFocused = createSelector([selectorFocusedItemId, (_, itemId) => itemId], (focusedItemId, itemId) => focusedItemId === itemId);
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
export const useTreeViewIcons = ({
|
|
2
3
|
slots,
|
|
3
4
|
slotProps
|
|
4
5
|
}) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
endIcon: slotProps.endIcon
|
|
17
|
-
}
|
|
6
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
7
|
+
icons: {
|
|
8
|
+
slots: {
|
|
9
|
+
collapseIcon: slots.collapseIcon,
|
|
10
|
+
expandIcon: slots.expandIcon,
|
|
11
|
+
endIcon: slots.endIcon
|
|
12
|
+
},
|
|
13
|
+
slotProps: {
|
|
14
|
+
collapseIcon: slotProps.collapseIcon,
|
|
15
|
+
expandIcon: slotProps.expandIcon,
|
|
16
|
+
endIcon: slotProps.endIcon
|
|
18
17
|
}
|
|
19
18
|
}
|
|
19
|
+
}), [slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
|
|
20
|
+
return {
|
|
21
|
+
contextValue: pluginContextValue
|
|
20
22
|
};
|
|
21
23
|
};
|
|
22
24
|
useTreeViewIcons.params = {};
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
-
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["children"];
|
|
4
2
|
import * as React from 'react';
|
|
3
|
+
import useEventCallback from '@mui/utils/useEventCallback';
|
|
5
4
|
import { publishTreeViewEvent } from "../../utils/publishTreeViewEvent.js";
|
|
6
5
|
import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
|
|
7
6
|
import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
|
|
7
|
+
import { selectorItemMeta, selectorItemOrderedChildrenIds, selectorItemModel, selectorItemDepth } from "./useTreeViewItems.selectors.js";
|
|
8
|
+
import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
8
9
|
import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
9
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
11
|
const updateItemsState = ({
|
|
12
|
+
disabledItemsFocusable,
|
|
11
13
|
items,
|
|
12
14
|
isItemDisabled,
|
|
13
15
|
getItemLabel,
|
|
14
16
|
getItemId
|
|
15
17
|
}) => {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
18
|
+
const itemMetaLookup = {};
|
|
19
|
+
const itemModelLookup = {};
|
|
20
|
+
const itemOrderedChildrenIdsLookup = {
|
|
19
21
|
[TREE_VIEW_ROOT_PARENT_ID]: []
|
|
20
22
|
};
|
|
21
23
|
const processItem = (item, depth, parentId) => {
|
|
@@ -23,14 +25,14 @@ const updateItemsState = ({
|
|
|
23
25
|
if (id == null) {
|
|
24
26
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
25
27
|
}
|
|
26
|
-
if (
|
|
28
|
+
if (itemMetaLookup[id] != null) {
|
|
27
29
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
|
|
28
30
|
}
|
|
29
31
|
const label = getItemLabel ? getItemLabel(item) : item.label;
|
|
30
32
|
if (label == null) {
|
|
31
33
|
throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
32
34
|
}
|
|
33
|
-
|
|
35
|
+
itemMetaLookup[id] = {
|
|
34
36
|
id,
|
|
35
37
|
label,
|
|
36
38
|
parentId,
|
|
@@ -39,89 +41,58 @@ const updateItemsState = ({
|
|
|
39
41
|
disabled: isItemDisabled ? isItemDisabled(item) : false,
|
|
40
42
|
depth
|
|
41
43
|
};
|
|
42
|
-
|
|
44
|
+
itemModelLookup[id] = item;
|
|
43
45
|
const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
44
|
-
if (!
|
|
45
|
-
|
|
46
|
+
if (!itemOrderedChildrenIdsLookup[parentIdWithDefault]) {
|
|
47
|
+
itemOrderedChildrenIdsLookup[parentIdWithDefault] = [];
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
itemOrderedChildrenIdsLookup[parentIdWithDefault].push(id);
|
|
48
50
|
item.children?.forEach(child => processItem(child, depth + 1, id));
|
|
49
51
|
};
|
|
50
52
|
items.forEach(item => processItem(item, 0, null));
|
|
51
|
-
const
|
|
52
|
-
Object.keys(
|
|
53
|
-
|
|
53
|
+
const itemChildrenIndexesLookup = {};
|
|
54
|
+
Object.keys(itemOrderedChildrenIdsLookup).forEach(parentId => {
|
|
55
|
+
itemChildrenIndexesLookup[parentId] = buildSiblingIndexes(itemOrderedChildrenIdsLookup[parentId]);
|
|
54
56
|
});
|
|
55
57
|
return {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
disabledItemsFocusable,
|
|
59
|
+
itemMetaLookup,
|
|
60
|
+
itemModelLookup,
|
|
61
|
+
itemOrderedChildrenIdsLookup,
|
|
62
|
+
itemChildrenIndexesLookup
|
|
60
63
|
};
|
|
61
64
|
};
|
|
62
65
|
export const useTreeViewItems = ({
|
|
63
66
|
instance,
|
|
64
67
|
params,
|
|
65
|
-
|
|
66
|
-
setState,
|
|
67
|
-
experimentalFeatures
|
|
68
|
+
store
|
|
68
69
|
}) => {
|
|
69
|
-
const
|
|
70
|
-
const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
|
|
70
|
+
const getItem = React.useCallback(itemId => selectorItemModel(store.value, itemId), [store]);
|
|
71
71
|
const getItemTree = React.useCallback(() => {
|
|
72
|
-
const getItemFromItemId =
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (newChildren) {
|
|
72
|
+
const getItemFromItemId = itemId => {
|
|
73
|
+
const item = selectorItemModel(store.value, itemId);
|
|
74
|
+
const newChildren = selectorItemOrderedChildrenIds(store.value, itemId);
|
|
75
|
+
if (newChildren.length > 0) {
|
|
77
76
|
item.children = newChildren.map(getItemFromItemId);
|
|
77
|
+
} else {
|
|
78
|
+
delete item.children;
|
|
78
79
|
}
|
|
79
80
|
return item;
|
|
80
81
|
};
|
|
81
|
-
return
|
|
82
|
-
}, [
|
|
83
|
-
const
|
|
84
|
-
if (itemId == null) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
let itemMeta = instance.getItemMeta(itemId);
|
|
88
|
-
|
|
89
|
-
// This can be called before the item has been added to the item map.
|
|
90
|
-
if (!itemMeta) {
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
if (itemMeta.disabled) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
while (itemMeta.parentId != null) {
|
|
97
|
-
itemMeta = instance.getItemMeta(itemMeta.parentId);
|
|
98
|
-
if (itemMeta.disabled) {
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return false;
|
|
103
|
-
}, [instance]);
|
|
104
|
-
const getItemIndex = React.useCallback(itemId => {
|
|
105
|
-
const parentId = instance.getItemMeta(itemId).parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
106
|
-
return state.items.itemChildrenIndexes[parentId][itemId];
|
|
107
|
-
}, [instance, state.items.itemChildrenIndexes]);
|
|
108
|
-
const getItemOrderedChildrenIds = React.useCallback(itemId => state.items.itemOrderedChildrenIds[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? [], [state.items.itemOrderedChildrenIds]);
|
|
82
|
+
return selectorItemOrderedChildrenIds(store.value, null).map(getItemFromItemId);
|
|
83
|
+
}, [store]);
|
|
84
|
+
const getItemOrderedChildrenIds = React.useCallback(itemId => selectorItemOrderedChildrenIds(store.value, itemId), [store]);
|
|
109
85
|
const getItemDOMElement = itemId => {
|
|
110
|
-
const itemMeta =
|
|
86
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
111
87
|
if (itemMeta == null) {
|
|
112
88
|
return null;
|
|
113
89
|
}
|
|
114
|
-
|
|
115
|
-
treeId:
|
|
90
|
+
const idAttribute = generateTreeItemIdAttribute({
|
|
91
|
+
treeId: selectorTreeViewId(store.value),
|
|
116
92
|
itemId,
|
|
117
93
|
id: itemMeta.idAttribute
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
const isItemNavigable = itemId => {
|
|
121
|
-
if (params.disabledItemsFocusable) {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
return !instance.isItemDisabled(itemId);
|
|
94
|
+
});
|
|
95
|
+
return document.getElementById(idAttribute);
|
|
125
96
|
};
|
|
126
97
|
const areItemUpdatesPreventedRef = React.useRef(false);
|
|
127
98
|
const preventItemUpdates = React.useCallback(() => {
|
|
@@ -132,15 +103,16 @@ export const useTreeViewItems = ({
|
|
|
132
103
|
if (instance.areItemUpdatesPrevented()) {
|
|
133
104
|
return;
|
|
134
105
|
}
|
|
135
|
-
|
|
106
|
+
store.update(prevState => {
|
|
136
107
|
const newState = updateItemsState({
|
|
108
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
137
109
|
items: params.items,
|
|
138
110
|
isItemDisabled: params.isItemDisabled,
|
|
139
111
|
getItemId: params.getItemId,
|
|
140
112
|
getItemLabel: params.getItemLabel
|
|
141
113
|
});
|
|
142
|
-
Object.values(prevState.items.
|
|
143
|
-
if (!newState.
|
|
114
|
+
Object.values(prevState.items.itemMetaLookup).forEach(item => {
|
|
115
|
+
if (!newState.itemMetaLookup[item.id]) {
|
|
144
116
|
publishTreeViewEvent(instance, 'removeItem', {
|
|
145
117
|
id: item.id
|
|
146
118
|
});
|
|
@@ -150,19 +122,19 @@ export const useTreeViewItems = ({
|
|
|
150
122
|
items: newState
|
|
151
123
|
});
|
|
152
124
|
});
|
|
153
|
-
}, [instance,
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
};
|
|
125
|
+
}, [instance, store, params.items, params.disabledItemsFocusable, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
126
|
+
|
|
127
|
+
// Wrap `props.onItemClick` with `useEventCallback` to prevent unneeded context updates.
|
|
128
|
+
const handleItemClick = useEventCallback((event, itemId) => {
|
|
129
|
+
if (params.onItemClick) {
|
|
130
|
+
params.onItemClick(event, itemId);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
134
|
+
items: {
|
|
135
|
+
onItemClick: handleItemClick
|
|
136
|
+
}
|
|
137
|
+
}), [handleItemClick]);
|
|
166
138
|
return {
|
|
167
139
|
getRootProps: () => ({
|
|
168
140
|
style: {
|
|
@@ -176,29 +148,16 @@ export const useTreeViewItems = ({
|
|
|
176
148
|
getItemOrderedChildrenIds
|
|
177
149
|
},
|
|
178
150
|
instance: {
|
|
179
|
-
getItemMeta,
|
|
180
|
-
getItem,
|
|
181
|
-
getItemTree,
|
|
182
|
-
getItemsToRender,
|
|
183
|
-
getItemIndex,
|
|
184
151
|
getItemDOMElement,
|
|
185
|
-
getItemOrderedChildrenIds,
|
|
186
|
-
isItemDisabled,
|
|
187
|
-
isItemNavigable,
|
|
188
152
|
preventItemUpdates,
|
|
189
153
|
areItemUpdatesPrevented
|
|
190
154
|
},
|
|
191
|
-
contextValue:
|
|
192
|
-
items: {
|
|
193
|
-
onItemClick: params.onItemClick,
|
|
194
|
-
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
195
|
-
indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
|
|
196
|
-
}
|
|
197
|
-
}
|
|
155
|
+
contextValue: pluginContextValue
|
|
198
156
|
};
|
|
199
157
|
};
|
|
200
158
|
useTreeViewItems.getInitialState = params => ({
|
|
201
159
|
items: updateItemsState({
|
|
160
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
202
161
|
items: params.items,
|
|
203
162
|
isItemDisabled: params.isItemDisabled,
|
|
204
163
|
getItemId: params.getItemId,
|
|
@@ -212,11 +171,10 @@ useTreeViewItems.getDefaultizedParams = ({
|
|
|
212
171
|
itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
|
|
213
172
|
});
|
|
214
173
|
useTreeViewItems.wrapRoot = ({
|
|
215
|
-
children
|
|
216
|
-
instance
|
|
174
|
+
children
|
|
217
175
|
}) => {
|
|
218
176
|
return /*#__PURE__*/_jsx(TreeViewItemDepthContext.Provider, {
|
|
219
|
-
value:
|
|
177
|
+
value: selectorItemDepth,
|
|
220
178
|
children: children
|
|
221
179
|
});
|
|
222
180
|
};
|