@mui/x-tree-view 7.22.1 → 8.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +486 -11
- package/README.md +4 -4
- package/RichTreeView/RichTreeView.js +22 -5
- package/RichTreeView/RichTreeView.types.d.ts +4 -17
- package/SimpleTreeView/SimpleTreeView.js +21 -3
- package/TreeItem/TreeItem.d.ts +20 -2
- package/TreeItem/TreeItem.js +241 -371
- package/TreeItem/TreeItem.types.d.ts +52 -85
- package/TreeItem/index.d.ts +1 -4
- package/TreeItem/index.js +2 -4
- package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.d.ts +7 -0
- package/{modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +8 -6
- package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.d.ts} +1 -1
- package/TreeItemDragAndDropOverlay/index.d.ts +2 -0
- package/TreeItemDragAndDropOverlay/index.js +1 -0
- package/{TreeItem2LabelInput → TreeItemDragAndDropOverlay}/package.json +1 -1
- package/TreeItemIcon/TreeItemIcon.d.ts +7 -0
- package/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
- package/{TreeItem2Icon/TreeItem2Icon.types.d.ts → TreeItemIcon/TreeItemIcon.types.d.ts} +7 -7
- package/TreeItemIcon/index.d.ts +2 -0
- package/TreeItemIcon/index.js +1 -0
- package/{useTreeItem2 → TreeItemIcon}/package.json +1 -1
- package/TreeItemLabelInput/TreeItemLabelInput.d.ts +5 -0
- package/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
- package/{TreeItem2LabelInput/TreeItem2LabelInput.types.d.ts → TreeItemLabelInput/TreeItemLabelInput.types.d.ts} +1 -1
- package/TreeItemLabelInput/index.d.ts +2 -0
- package/TreeItemLabelInput/index.js +1 -0
- package/{TreeItem2Provider → TreeItemLabelInput}/package.json +1 -1
- package/TreeItemProvider/TreeItemProvider.d.ts +9 -0
- package/TreeItemProvider/TreeItemProvider.js +43 -0
- package/{TreeItem2Provider/TreeItem2Provider.types.d.ts → TreeItemProvider/TreeItemProvider.types.d.ts} +2 -1
- package/TreeItemProvider/index.d.ts +2 -0
- package/TreeItemProvider/index.js +1 -0
- package/{TreeItem2Icon → TreeItemProvider}/package.json +1 -1
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +2 -1
- package/hooks/useTreeItemModel.d.ts +2 -0
- package/hooks/useTreeItemModel.js +11 -0
- package/hooks/useTreeItemUtils/index.d.ts +1 -0
- package/hooks/useTreeItemUtils/index.js +1 -0
- package/hooks/{useTreeItem2Utils/useTreeItem2Utils.d.ts → useTreeItemUtils/useTreeItemUtils.d.ts} +13 -12
- package/{modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js → hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
- package/index.d.ts +5 -7
- package/index.js +6 -8
- package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -2
- package/internals/components/RichTreeViewItems.d.ts +3 -6
- package/internals/components/RichTreeViewItems.js +42 -30
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
- package/internals/hooks/useSelector.d.ts +4 -0
- package/internals/hooks/useSelector.js +6 -0
- package/internals/index.d.ts +6 -1
- package/internals/index.js +5 -1
- package/internals/models/helpers.d.ts +0 -2
- package/internals/models/itemPlugin.d.ts +13 -10
- package/internals/models/plugin.d.ts +20 -8
- package/internals/models/treeView.d.ts +6 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +124 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +8 -15
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +1 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +718 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +16 -55
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.d.ts +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +13 -29
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.d.ts +2 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +39 -9
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +20 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
- package/internals/useTreeView/useTreeView.js +30 -17
- package/internals/useTreeView/useTreeView.types.d.ts +1 -2
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +3 -1
- package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/internals/utils/TreeViewStore.d.ts +12 -0
- package/internals/utils/TreeViewStore.js +24 -0
- package/internals/utils/selectors.d.ts +9 -0
- package/internals/utils/selectors.js +37 -0
- package/internals/utils/tree.d.ts +8 -8
- package/internals/utils/tree.js +51 -43
- package/models/items.d.ts +7 -2
- package/modern/RichTreeView/RichTreeView.js +22 -5
- package/modern/SimpleTreeView/SimpleTreeView.js +21 -3
- package/modern/TreeItem/TreeItem.js +241 -371
- package/modern/TreeItem/index.js +2 -4
- package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +8 -6
- package/modern/TreeItemDragAndDropOverlay/index.js +1 -0
- package/modern/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +5 -3
- package/modern/TreeItemIcon/index.js +1 -0
- package/modern/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
- package/modern/TreeItemLabelInput/index.js +1 -0
- package/modern/TreeItemProvider/TreeItemProvider.js +43 -0
- package/modern/TreeItemProvider/index.js +1 -0
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItemModel.js +11 -0
- package/modern/hooks/useTreeItemUtils/index.js +1 -0
- package/{hooks/useTreeItem2Utils/useTreeItem2Utils.js → modern/hooks/useTreeItemUtils/useTreeItemUtils.js} +36 -18
- package/modern/index.js +6 -8
- package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/modern/internals/components/RichTreeViewItems.js +42 -30
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/modern/internals/hooks/useSelector.js +6 -0
- package/modern/internals/index.js +5 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +17 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +7 -0
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -100
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +88 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +79 -43
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +105 -0
- package/modern/internals/useTreeView/useTreeView.js +30 -17
- package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/modern/internals/utils/TreeViewStore.js +24 -0
- package/modern/internals/utils/selectors.js +37 -0
- package/modern/internals/utils/tree.js +51 -43
- package/modern/useTreeItem/index.js +1 -0
- package/modern/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +45 -51
- package/node/RichTreeView/RichTreeView.js +22 -5
- package/node/SimpleTreeView/SimpleTreeView.js +21 -3
- package/node/TreeItem/TreeItem.js +242 -372
- package/node/TreeItem/index.js +38 -16
- package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js} +7 -6
- package/node/TreeItemDragAndDropOverlay/index.js +12 -0
- package/node/{TreeItem2Icon/TreeItem2Icon.js → TreeItemIcon/TreeItemIcon.js} +4 -3
- package/node/TreeItemIcon/index.js +12 -0
- package/node/{TreeItem2LabelInput/TreeItem2LabelInput.js → TreeItemLabelInput/TreeItemLabelInput.js} +3 -3
- package/node/TreeItemLabelInput/index.js +12 -0
- package/node/{TreeItem2Provider/TreeItem2Provider.js → TreeItemProvider/TreeItemProvider.js} +22 -6
- package/node/TreeItemProvider/index.js +12 -0
- package/node/hooks/index.js +10 -3
- package/node/hooks/useTreeItemModel.js +17 -0
- package/node/hooks/useTreeItemUtils/index.js +12 -0
- package/node/hooks/{useTreeItem2Utils/useTreeItem2Utils.js → useTreeItemUtils/useTreeItemUtils.js} +37 -19
- package/node/index.js +18 -42
- package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/node/internals/components/RichTreeViewItems.js +42 -30
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
- package/node/internals/hooks/useSelector.js +13 -0
- package/node/internals/index.js +47 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +36 -24
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +23 -0
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +14 -0
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
- package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -102
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +96 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +78 -42
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +109 -2
- package/node/internals/useTreeView/useTreeView.js +30 -17
- package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
- package/node/internals/utils/TreeViewStore.js +31 -0
- package/node/internals/utils/selectors.js +44 -0
- package/node/internals/utils/tree.js +51 -43
- package/node/useTreeItem/index.js +12 -0
- package/node/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +46 -53
- package/package.json +7 -5
- package/themeAugmentation/components.d.ts +0 -10
- package/themeAugmentation/overrides.d.ts +0 -3
- package/themeAugmentation/props.d.ts +1 -5
- package/useTreeItem/index.d.ts +2 -0
- package/useTreeItem/index.js +1 -0
- package/{TreeItem2 → useTreeItem}/package.json +1 -1
- package/useTreeItem/useTreeItem.d.ts +2 -0
- package/{useTreeItem2/useTreeItem2.js → useTreeItem/useTreeItem.js} +45 -51
- package/{useTreeItem2/useTreeItem2.types.d.ts → useTreeItem/useTreeItem.types.d.ts} +51 -58
- package/TreeItem/TreeItemContent.d.ts +0 -61
- package/TreeItem/TreeItemContent.js +0 -146
- package/TreeItem/useTreeItemState.d.ts +0 -21
- package/TreeItem/useTreeItemState.js +0 -143
- package/TreeItem2/TreeItem2.d.ts +0 -34
- package/TreeItem2/TreeItem2.js +0 -387
- package/TreeItem2/TreeItem2.types.d.ts +0 -92
- package/TreeItem2/index.d.ts +0 -2
- package/TreeItem2/index.js +0 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +0 -7
- package/TreeItem2DragAndDropOverlay/index.d.ts +0 -2
- package/TreeItem2DragAndDropOverlay/index.js +0 -1
- package/TreeItem2DragAndDropOverlay/package.json +0 -6
- package/TreeItem2Icon/TreeItem2Icon.d.ts +0 -7
- package/TreeItem2Icon/index.d.ts +0 -2
- package/TreeItem2Icon/index.js +0 -1
- package/TreeItem2LabelInput/TreeItem2LabelInput.d.ts +0 -5
- package/TreeItem2LabelInput/index.d.ts +0 -2
- package/TreeItem2LabelInput/index.js +0 -1
- package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -6
- package/TreeItem2Provider/TreeItem2Provider.js +0 -26
- package/TreeItem2Provider/index.d.ts +0 -2
- package/TreeItem2Provider/index.js +0 -1
- package/TreeView/TreeView.d.ts +0 -21
- package/TreeView/TreeView.js +0 -211
- package/TreeView/TreeView.types.d.ts +0 -9
- package/TreeView/index.d.ts +0 -3
- package/TreeView/index.js +0 -3
- package/TreeView/package.json +0 -6
- package/TreeView/treeViewClasses.d.ts +0 -7
- package/TreeView/treeViewClasses.js +0 -6
- package/hooks/useTreeItem2Utils/index.d.ts +0 -1
- package/hooks/useTreeItem2Utils/index.js +0 -1
- package/modern/TreeItem/TreeItemContent.js +0 -146
- package/modern/TreeItem/useTreeItemState.js +0 -143
- package/modern/TreeItem2/TreeItem2.js +0 -387
- package/modern/TreeItem2/index.js +0 -1
- package/modern/TreeItem2DragAndDropOverlay/index.js +0 -1
- package/modern/TreeItem2Icon/index.js +0 -1
- package/modern/TreeItem2LabelInput/index.js +0 -1
- package/modern/TreeItem2Provider/TreeItem2Provider.js +0 -26
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +0 -1
- package/modern/TreeItem2Provider/index.js +0 -1
- package/modern/TreeView/TreeView.js +0 -211
- package/modern/TreeView/TreeView.types.js +0 -1
- package/modern/TreeView/index.js +0 -3
- package/modern/TreeView/treeViewClasses.js +0 -6
- package/modern/hooks/useTreeItem2Utils/index.js +0 -1
- package/modern/useTreeItem2/index.js +0 -4
- package/modern/useTreeItem2/useTreeItem2.types.js +0 -1
- package/node/TreeItem/TreeItemContent.js +0 -153
- package/node/TreeItem/useTreeItemState.js +0 -148
- package/node/TreeItem2/TreeItem2.js +0 -394
- package/node/TreeItem2/index.js +0 -48
- package/node/TreeItem2DragAndDropOverlay/index.js +0 -12
- package/node/TreeItem2Icon/index.js +0 -12
- package/node/TreeItem2LabelInput/index.js +0 -12
- package/node/TreeItem2Provider/index.js +0 -12
- package/node/TreeView/TreeView.js +0 -217
- package/node/TreeView/TreeView.types.js +0 -5
- package/node/TreeView/index.js +0 -27
- package/node/TreeView/treeViewClasses.js +0 -14
- package/node/hooks/useTreeItem2Utils/index.js +0 -12
- package/node/useTreeItem2/index.js +0 -10
- package/node/useTreeItem2/useTreeItem2.types.js +0 -5
- package/useTreeItem2/index.d.ts +0 -3
- package/useTreeItem2/index.js +0 -4
- package/useTreeItem2/useTreeItem2.d.ts +0 -2
- package/useTreeItem2/useTreeItem2.types.js +0 -1
- /package/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/{TreeItem2Provider/TreeItem2Provider.types.js → modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/{TreeView/TreeView.types.js → modern/TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/modern/{TreeItem2/TreeItem2.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/modern/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/modern/{TreeItem2Icon/TreeItem2Icon.types.js → useTreeItem/useTreeItem.types.js} +0 -0
- /package/node/{TreeItem2/TreeItem2.types.js → TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.types.js} +0 -0
- /package/node/{TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js → TreeItemIcon/TreeItemIcon.types.js} +0 -0
- /package/node/{TreeItem2Icon/TreeItem2Icon.types.js → TreeItemLabelInput/TreeItemLabelInput.types.js} +0 -0
- /package/node/{TreeItem2LabelInput/TreeItem2LabelInput.types.js → TreeItemProvider/TreeItemProvider.types.js} +0 -0
- /package/node/{TreeItem2Provider/TreeItem2Provider.types.js → useTreeItem/useTreeItem.types.js} +0 -0
- /package/{modern/TreeItem2LabelInput/TreeItem2LabelInput.types.js → useTreeItem/useTreeItem.types.js} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
import { TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
|
|
3
|
+
const selectorTreeViewItemsState = state => state.items;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get the meta-information of all items.
|
|
7
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
8
|
+
* @returns {TreeViewItemMetaLookup} The meta-information of all items.
|
|
9
|
+
*/
|
|
10
|
+
export const selectorItemMetaLookup = createSelector(selectorTreeViewItemsState, items => items.itemMetaLookup);
|
|
11
|
+
const EMPTY_CHILDREN = [];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Get the ordered children ids of a given item.
|
|
15
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
16
|
+
* @param {TreeViewItemId} itemId The id of the item to get the children of.
|
|
17
|
+
* @returns {TreeViewItemId[]} The ordered children ids of the item.
|
|
18
|
+
*/
|
|
19
|
+
export const selectorItemOrderedChildrenIds = createSelector([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => itemsState.itemOrderedChildrenIdsLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? EMPTY_CHILDREN);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get the model of an item.
|
|
23
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
24
|
+
* @param {TreeViewItemId} itemId The id of the item to get the model of.
|
|
25
|
+
* @returns {R} The model of the item.
|
|
26
|
+
*/
|
|
27
|
+
export const selectorItemModel = createSelector([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => {
|
|
28
|
+
const a = itemsState.itemModelLookup[itemId];
|
|
29
|
+
return a;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get the meta-information of an item.
|
|
34
|
+
* Check the `TreeViewItemMeta` type for more information.
|
|
35
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>}
|
|
36
|
+
* @param {TreeViewItemId} itemId The id of the item to get the meta-information of.
|
|
37
|
+
* @returns {TreeViewItemMeta | null} The meta-information of the item.
|
|
38
|
+
*/
|
|
39
|
+
export const selectorItemMeta = createSelector([selectorItemMetaLookup, (_, itemId) => itemId], (itemMetaLookup, itemId) => itemMetaLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? null);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Check if an item is disabled.
|
|
43
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
44
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
45
|
+
* @returns {boolean} `true` if the item is disabled, `false` otherwise.
|
|
46
|
+
*/
|
|
47
|
+
export const selectorIsItemDisabled = createSelector([selectorItemMetaLookup, (_, itemId) => itemId], (itemMetaLookup, itemId) => {
|
|
48
|
+
if (itemId == null) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
let itemMeta = itemMetaLookup[itemId];
|
|
52
|
+
|
|
53
|
+
// This can be called before the item has been added to the item map.
|
|
54
|
+
if (!itemMeta) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (itemMeta.disabled) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
while (itemMeta.parentId != null) {
|
|
61
|
+
itemMeta = itemMetaLookup[itemMeta.parentId];
|
|
62
|
+
if (itemMeta.disabled) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get the index of an item in its parent's children.
|
|
71
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
72
|
+
* @param {TreeViewItemId} itemId The id of the item to get the index of.
|
|
73
|
+
* @returns {number} The index of the item in its parent's children.
|
|
74
|
+
*/
|
|
75
|
+
export const selectorItemIndex = createSelector([selectorTreeViewItemsState, selectorItemMeta], (itemsState, itemMeta) => {
|
|
76
|
+
if (itemMeta == null) {
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
const parentIndexes = itemsState.itemChildrenIndexesLookup[itemMeta.parentId ?? TREE_VIEW_ROOT_PARENT_ID];
|
|
80
|
+
return parentIndexes[itemMeta.id];
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get the id of the parent of an item.
|
|
85
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
86
|
+
* @param {TreeViewItemId} itemId The id of the item to get the parent id of.
|
|
87
|
+
* @returns {TreeViewItemId | null} The id of the parent of the item.
|
|
88
|
+
*/
|
|
89
|
+
export const selectorItemParentId = createSelector([selectorItemMeta], itemMeta => itemMeta?.parentId ?? null);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get the depth of an item (items at the root level have a depth of 0).
|
|
93
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
94
|
+
* @param {TreeViewItemId} itemId The id of the item to get the depth of.
|
|
95
|
+
* @returns {number} The depth of the item.
|
|
96
|
+
*/
|
|
97
|
+
export const selectorItemDepth = createSelector([selectorItemMeta], itemMeta => itemMeta?.depth ?? 0);
|
|
98
|
+
export const selectorCanItemBeFocused = createSelector([selectorTreeViewItemsState, selectorIsItemDisabled], (itemsState, isItemDisabled) => {
|
|
99
|
+
if (itemsState.disabledItemsFocusable) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return !isItemDisabled;
|
|
103
|
+
});
|
|
@@ -9,42 +9,45 @@ import { TreeViewChildrenItemContext, TreeViewChildrenItemProvider } from "../..
|
|
|
9
9
|
import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewItems/useTreeViewItems.utils.js";
|
|
10
10
|
import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
|
|
11
11
|
import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
12
|
+
import { isItemExpandable } from "../../../hooks/useTreeItemUtils/useTreeItemUtils.js";
|
|
13
|
+
import { useSelector } from "../../hooks/useSelector.js";
|
|
14
|
+
import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
12
15
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
16
|
export const useTreeViewJSXItems = ({
|
|
14
17
|
instance,
|
|
15
|
-
|
|
18
|
+
store
|
|
16
19
|
}) => {
|
|
17
20
|
instance.preventItemUpdates();
|
|
18
21
|
const insertJSXItem = useEventCallback(item => {
|
|
19
|
-
|
|
20
|
-
if (prevState.items.
|
|
22
|
+
store.update(prevState => {
|
|
23
|
+
if (prevState.items.itemMetaLookup[item.id] != null) {
|
|
21
24
|
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: "${item.id}"`].join('\n'));
|
|
22
25
|
}
|
|
23
26
|
return _extends({}, prevState, {
|
|
24
27
|
items: _extends({}, prevState.items, {
|
|
25
|
-
|
|
28
|
+
itemMetaLookup: _extends({}, prevState.items.itemMetaLookup, {
|
|
26
29
|
[item.id]: item
|
|
27
30
|
}),
|
|
28
31
|
// For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
|
|
29
|
-
|
|
32
|
+
itemModelLookup: _extends({}, prevState.items.itemModelLookup, {
|
|
30
33
|
[item.id]: {
|
|
31
34
|
id: item.id,
|
|
32
|
-
label: item.label
|
|
35
|
+
label: item.label ?? ''
|
|
33
36
|
}
|
|
34
37
|
})
|
|
35
38
|
})
|
|
36
39
|
});
|
|
37
40
|
});
|
|
38
41
|
return () => {
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
delete
|
|
43
|
-
delete
|
|
42
|
+
store.update(prevState => {
|
|
43
|
+
const newItemMetaLookup = _extends({}, prevState.items.itemMetaLookup);
|
|
44
|
+
const newItemModelLookup = _extends({}, prevState.items.itemModelLookup);
|
|
45
|
+
delete newItemMetaLookup[item.id];
|
|
46
|
+
delete newItemModelLookup[item.id];
|
|
44
47
|
return _extends({}, prevState, {
|
|
45
48
|
items: _extends({}, prevState.items, {
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
itemMetaLookup: newItemMetaLookup,
|
|
50
|
+
itemModelLookup: newItemModelLookup
|
|
48
51
|
})
|
|
49
52
|
});
|
|
50
53
|
});
|
|
@@ -55,12 +58,12 @@ export const useTreeViewJSXItems = ({
|
|
|
55
58
|
});
|
|
56
59
|
const setJSXItemsOrderedChildrenIds = (parentId, orderedChildrenIds) => {
|
|
57
60
|
const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
58
|
-
|
|
61
|
+
store.update(prevState => _extends({}, prevState, {
|
|
59
62
|
items: _extends({}, prevState.items, {
|
|
60
|
-
|
|
63
|
+
itemOrderedChildrenIdsLookup: _extends({}, prevState.items.itemOrderedChildrenIdsLookup, {
|
|
61
64
|
[parentIdWithDefault]: orderedChildrenIds
|
|
62
65
|
}),
|
|
63
|
-
|
|
66
|
+
itemChildrenIndexesLookup: _extends({}, prevState.items.itemChildrenIndexesLookup, {
|
|
64
67
|
[parentIdWithDefault]: buildSiblingIndexes(orderedChildrenIds)
|
|
65
68
|
})
|
|
66
69
|
})
|
|
@@ -87,12 +90,6 @@ export const useTreeViewJSXItems = ({
|
|
|
87
90
|
}
|
|
88
91
|
};
|
|
89
92
|
};
|
|
90
|
-
const isItemExpandable = reactChildren => {
|
|
91
|
-
if (Array.isArray(reactChildren)) {
|
|
92
|
-
return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
|
|
93
|
-
}
|
|
94
|
-
return Boolean(reactChildren);
|
|
95
|
-
};
|
|
96
93
|
const useTreeViewJSXItemsItemPlugin = ({
|
|
97
94
|
props,
|
|
98
95
|
rootRef,
|
|
@@ -100,7 +97,7 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
100
97
|
}) => {
|
|
101
98
|
const {
|
|
102
99
|
instance,
|
|
103
|
-
|
|
100
|
+
store
|
|
104
101
|
} = useTreeViewContext();
|
|
105
102
|
const {
|
|
106
103
|
children,
|
|
@@ -121,6 +118,7 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
121
118
|
const expandable = isItemExpandable(children);
|
|
122
119
|
const pluginContentRef = React.useRef(null);
|
|
123
120
|
const handleContentRef = useForkRef(pluginContentRef, contentRef);
|
|
121
|
+
const treeId = useSelector(store, selectorTreeViewId);
|
|
124
122
|
|
|
125
123
|
// Prevent any flashing
|
|
126
124
|
useEnhancedEffect(() => {
|
|
@@ -132,9 +130,10 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
132
130
|
registerChild(idAttribute, itemId);
|
|
133
131
|
return () => {
|
|
134
132
|
unregisterChild(idAttribute);
|
|
133
|
+
unregisterChild(idAttribute);
|
|
135
134
|
};
|
|
136
|
-
}, [registerChild, unregisterChild, itemId, id, treeId]);
|
|
137
|
-
|
|
135
|
+
}, [store, instance, registerChild, unregisterChild, itemId, id, treeId]);
|
|
136
|
+
useEnhancedEffect(() => {
|
|
138
137
|
return instance.insertJSXItem({
|
|
139
138
|
id: itemId,
|
|
140
139
|
idAttribute: id,
|
|
@@ -157,12 +156,14 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
157
156
|
useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
|
|
158
157
|
useTreeViewJSXItems.wrapItem = ({
|
|
159
158
|
children,
|
|
160
|
-
itemId
|
|
159
|
+
itemId,
|
|
160
|
+
idAttribute
|
|
161
161
|
}) => {
|
|
162
162
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
163
163
|
const depthContext = React.useContext(TreeViewItemDepthContext);
|
|
164
164
|
return /*#__PURE__*/_jsx(TreeViewChildrenItemProvider, {
|
|
165
165
|
itemId: itemId,
|
|
166
|
+
idAttribute: idAttribute,
|
|
166
167
|
children: /*#__PURE__*/_jsx(TreeViewItemDepthContext.Provider, {
|
|
167
168
|
value: depthContext + 1,
|
|
168
169
|
children: children
|
|
@@ -172,6 +173,8 @@ useTreeViewJSXItems.wrapItem = ({
|
|
|
172
173
|
useTreeViewJSXItems.wrapRoot = ({
|
|
173
174
|
children
|
|
174
175
|
}) => /*#__PURE__*/_jsx(TreeViewChildrenItemProvider, {
|
|
176
|
+
itemId: null,
|
|
177
|
+
idAttribute: null,
|
|
175
178
|
children: /*#__PURE__*/_jsx(TreeViewItemDepthContext.Provider, {
|
|
176
179
|
value: 0,
|
|
177
180
|
children: children
|
package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -4,19 +4,25 @@ import useEventCallback from '@mui/utils/useEventCallback';
|
|
|
4
4
|
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
|
|
5
5
|
import { hasPlugin } from "../../utils/plugins.js";
|
|
6
6
|
import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
|
|
7
|
+
import { useSelector } from "../../hooks/useSelector.js";
|
|
8
|
+
import { selectorItemMetaLookup, selectorIsItemDisabled, selectorItemParentId } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
9
|
+
import { selectorIsItemBeingEdited, selectorIsItemEditable } from "../useTreeViewLabel/useTreeViewLabel.selectors.js";
|
|
10
|
+
import { selectorIsItemSelected } from "../useTreeViewSelection/useTreeViewSelection.selectors.js";
|
|
11
|
+
import { selectorIsItemExpandable, selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
7
12
|
function isPrintableKey(string) {
|
|
8
13
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
9
14
|
}
|
|
10
15
|
export const useTreeViewKeyboardNavigation = ({
|
|
11
16
|
instance,
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
store,
|
|
18
|
+
params
|
|
14
19
|
}) => {
|
|
15
20
|
const isRtl = useRtl();
|
|
16
21
|
const firstCharMap = React.useRef({});
|
|
17
22
|
const updateFirstCharMap = useEventCallback(callback => {
|
|
18
23
|
firstCharMap.current = callback(firstCharMap.current);
|
|
19
24
|
});
|
|
25
|
+
const itemMetaLookup = useSelector(store, selectorItemMetaLookup);
|
|
20
26
|
React.useEffect(() => {
|
|
21
27
|
if (instance.areItemUpdatesPrevented()) {
|
|
22
28
|
return;
|
|
@@ -25,16 +31,16 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
25
31
|
const processItem = item => {
|
|
26
32
|
newFirstCharMap[item.id] = item.label.substring(0, 1).toLowerCase();
|
|
27
33
|
};
|
|
28
|
-
Object.values(
|
|
34
|
+
Object.values(itemMetaLookup).forEach(processItem);
|
|
29
35
|
firstCharMap.current = newFirstCharMap;
|
|
30
|
-
}, [
|
|
36
|
+
}, [itemMetaLookup, params.getItemId, instance]);
|
|
31
37
|
const getFirstMatchingItem = (itemId, query) => {
|
|
32
38
|
const cleanQuery = query.toLowerCase();
|
|
33
39
|
const getNextItem = itemIdToCheck => {
|
|
34
|
-
const nextItemId = getNextNavigableItem(
|
|
40
|
+
const nextItemId = getNextNavigableItem(store.value, itemIdToCheck);
|
|
35
41
|
// We reached the end of the tree, check from the beginning
|
|
36
42
|
if (nextItemId === null) {
|
|
37
|
-
return getFirstNavigableItem(
|
|
43
|
+
return getFirstNavigableItem(store.value);
|
|
38
44
|
}
|
|
39
45
|
return nextItemId;
|
|
40
46
|
};
|
|
@@ -52,9 +58,9 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
52
58
|
}
|
|
53
59
|
return matchingItemId;
|
|
54
60
|
};
|
|
55
|
-
const canToggleItemSelection = itemId => !params.disableSelection && !
|
|
61
|
+
const canToggleItemSelection = itemId => !params.disableSelection && !selectorIsItemDisabled(store.value, itemId);
|
|
56
62
|
const canToggleItemExpansion = itemId => {
|
|
57
|
-
return !
|
|
63
|
+
return !selectorIsItemDisabled(store.value, itemId) && selectorIsItemExpandable(store.value, itemId);
|
|
58
64
|
};
|
|
59
65
|
|
|
60
66
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
@@ -91,7 +97,10 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
91
97
|
// If the focused item has no children, we select it.
|
|
92
98
|
case key === 'Enter':
|
|
93
99
|
{
|
|
94
|
-
if (hasPlugin(instance, useTreeViewLabel) &&
|
|
100
|
+
if (hasPlugin(instance, useTreeViewLabel) && selectorIsItemEditable(store.value, {
|
|
101
|
+
itemId,
|
|
102
|
+
isItemEditable: params.isItemEditable
|
|
103
|
+
}) && !selectorIsItemBeingEdited(store.value, itemId)) {
|
|
95
104
|
instance.setEditedItemId(itemId);
|
|
96
105
|
} else if (canToggleItemExpansion(itemId)) {
|
|
97
106
|
instance.toggleItemExpansion(event, itemId);
|
|
@@ -104,7 +113,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
104
113
|
itemId,
|
|
105
114
|
keepExistingSelection: true
|
|
106
115
|
});
|
|
107
|
-
} else if (!
|
|
116
|
+
} else if (!selectorIsItemSelected(store.value, itemId)) {
|
|
108
117
|
instance.selectItem({
|
|
109
118
|
event,
|
|
110
119
|
itemId
|
|
@@ -118,7 +127,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
118
127
|
// Focus the next focusable item
|
|
119
128
|
case key === 'ArrowDown':
|
|
120
129
|
{
|
|
121
|
-
const nextItem = getNextNavigableItem(
|
|
130
|
+
const nextItem = getNextNavigableItem(store.value, itemId);
|
|
122
131
|
if (nextItem) {
|
|
123
132
|
event.preventDefault();
|
|
124
133
|
instance.focusItem(event, nextItem);
|
|
@@ -135,7 +144,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
135
144
|
// Focuses the previous focusable item
|
|
136
145
|
case key === 'ArrowUp':
|
|
137
146
|
{
|
|
138
|
-
const previousItem = getPreviousNavigableItem(
|
|
147
|
+
const previousItem = getPreviousNavigableItem(store.value, itemId);
|
|
139
148
|
if (previousItem) {
|
|
140
149
|
event.preventDefault();
|
|
141
150
|
instance.focusItem(event, previousItem);
|
|
@@ -156,8 +165,8 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
156
165
|
if (ctrlPressed) {
|
|
157
166
|
return;
|
|
158
167
|
}
|
|
159
|
-
if (
|
|
160
|
-
const nextItemId = getNextNavigableItem(
|
|
168
|
+
if (selectorIsItemExpanded(store.value, itemId)) {
|
|
169
|
+
const nextItemId = getNextNavigableItem(store.value, itemId);
|
|
161
170
|
if (nextItemId) {
|
|
162
171
|
instance.focusItem(event, nextItemId);
|
|
163
172
|
event.preventDefault();
|
|
@@ -176,11 +185,11 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
176
185
|
if (ctrlPressed) {
|
|
177
186
|
return;
|
|
178
187
|
}
|
|
179
|
-
if (canToggleItemExpansion(itemId) &&
|
|
188
|
+
if (canToggleItemExpansion(itemId) && selectorIsItemExpanded(store.value, itemId)) {
|
|
180
189
|
instance.toggleItemExpansion(event, itemId);
|
|
181
190
|
event.preventDefault();
|
|
182
191
|
} else {
|
|
183
|
-
const parent =
|
|
192
|
+
const parent = selectorItemParentId(store.value, itemId);
|
|
184
193
|
if (parent) {
|
|
185
194
|
instance.focusItem(event, parent);
|
|
186
195
|
event.preventDefault();
|
|
@@ -197,7 +206,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
197
206
|
if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
|
|
198
207
|
instance.selectRangeFromStartToItem(event, itemId);
|
|
199
208
|
} else {
|
|
200
|
-
instance.focusItem(event, getFirstNavigableItem(
|
|
209
|
+
instance.focusItem(event, getFirstNavigableItem(store.value));
|
|
201
210
|
}
|
|
202
211
|
event.preventDefault();
|
|
203
212
|
break;
|
|
@@ -211,7 +220,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
211
220
|
if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
|
|
212
221
|
instance.selectRangeFromItemToEnd(event, itemId);
|
|
213
222
|
} else {
|
|
214
|
-
instance.focusItem(event, getLastNavigableItem(
|
|
223
|
+
instance.focusItem(event, getLastNavigableItem(store.value));
|
|
215
224
|
}
|
|
216
225
|
event.preventDefault();
|
|
217
226
|
break;
|
|
@@ -1,29 +1,37 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
|
|
3
|
+
import { useSelector } from "../../hooks/useSelector.js";
|
|
4
|
+
import { selectorIsItemBeingEdited, selectorIsItemEditable } from "./useTreeViewLabel.selectors.js";
|
|
3
5
|
export const useTreeViewLabelItemPlugin = ({
|
|
4
6
|
props
|
|
5
7
|
}) => {
|
|
6
8
|
const {
|
|
7
|
-
|
|
9
|
+
store,
|
|
10
|
+
label: {
|
|
11
|
+
isItemEditable
|
|
12
|
+
}
|
|
8
13
|
} = useTreeViewContext();
|
|
9
14
|
const {
|
|
10
15
|
label,
|
|
11
16
|
itemId
|
|
12
17
|
} = props;
|
|
13
18
|
const [labelInputValue, setLabelInputValue] = React.useState(label);
|
|
14
|
-
const
|
|
19
|
+
const editable = useSelector(store, selectorIsItemEditable, {
|
|
20
|
+
itemId,
|
|
21
|
+
isItemEditable
|
|
22
|
+
});
|
|
23
|
+
const editing = useSelector(store, selectorIsItemBeingEdited, itemId);
|
|
15
24
|
React.useEffect(() => {
|
|
16
|
-
if (!
|
|
25
|
+
if (!editing) {
|
|
17
26
|
setLabelInputValue(label);
|
|
18
27
|
}
|
|
19
|
-
}, [
|
|
28
|
+
}, [editing, label]);
|
|
20
29
|
return {
|
|
21
30
|
propsEnhancers: {
|
|
22
31
|
labelInput: ({
|
|
23
32
|
externalEventHandlers,
|
|
24
33
|
interactions
|
|
25
34
|
}) => {
|
|
26
|
-
const editable = instance.isItemEditable(itemId);
|
|
27
35
|
if (!editable) {
|
|
28
36
|
return {};
|
|
29
37
|
}
|
|
@@ -3,41 +3,26 @@ import * as React from 'react';
|
|
|
3
3
|
import { warnOnce } from '@mui/x-internals/warning';
|
|
4
4
|
import { useTreeViewLabelItemPlugin } from "./useTreeViewLabel.itemPlugin.js";
|
|
5
5
|
export const useTreeViewLabel = ({
|
|
6
|
-
|
|
7
|
-
state,
|
|
8
|
-
setState,
|
|
6
|
+
store,
|
|
9
7
|
params
|
|
10
8
|
}) => {
|
|
11
|
-
const editedItemRef = React.useRef(state.editedItemId);
|
|
12
|
-
const isItemBeingEditedRef = itemId => editedItemRef.current === itemId;
|
|
13
9
|
const setEditedItemId = editedItemId => {
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
store.update(prevState => _extends({}, prevState, {
|
|
11
|
+
label: {
|
|
12
|
+
editedItemId
|
|
13
|
+
}
|
|
16
14
|
}));
|
|
17
|
-
editedItemRef.current = editedItemId;
|
|
18
|
-
};
|
|
19
|
-
const isItemBeingEdited = itemId => itemId === state.editedItemId;
|
|
20
|
-
const isTreeViewEditable = Boolean(params.isItemEditable);
|
|
21
|
-
const isItemEditable = itemId => {
|
|
22
|
-
if (itemId == null || !isTreeViewEditable) {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
const item = instance.getItem(itemId);
|
|
26
|
-
if (!item) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
return typeof params.isItemEditable === 'function' ? params.isItemEditable(item) : Boolean(params.isItemEditable);
|
|
30
15
|
};
|
|
31
16
|
const updateItemLabel = (itemId, label) => {
|
|
32
17
|
if (!label) {
|
|
33
18
|
throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'The label of an item cannot be empty.', itemId].join('\n'));
|
|
34
19
|
}
|
|
35
|
-
|
|
36
|
-
const item = prevState.items.
|
|
20
|
+
store.update(prevState => {
|
|
21
|
+
const item = prevState.items.itemMetaLookup[itemId];
|
|
37
22
|
if (item.label !== label) {
|
|
38
23
|
return _extends({}, prevState, {
|
|
39
24
|
items: _extends({}, prevState.items, {
|
|
40
|
-
|
|
25
|
+
itemMetaLookup: _extends({}, prevState.items.itemMetaLookup, {
|
|
41
26
|
[itemId]: _extends({}, item, {
|
|
42
27
|
label
|
|
43
28
|
})
|
|
@@ -51,18 +36,20 @@ export const useTreeViewLabel = ({
|
|
|
51
36
|
params.onItemLabelChange(itemId, label);
|
|
52
37
|
}
|
|
53
38
|
};
|
|
39
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
40
|
+
label: {
|
|
41
|
+
isItemEditable: params.isItemEditable
|
|
42
|
+
}
|
|
43
|
+
}), [params.isItemEditable]);
|
|
54
44
|
return {
|
|
55
45
|
instance: {
|
|
56
46
|
setEditedItemId,
|
|
57
|
-
|
|
58
|
-
updateItemLabel,
|
|
59
|
-
isItemEditable,
|
|
60
|
-
isTreeViewEditable,
|
|
61
|
-
isItemBeingEditedRef
|
|
47
|
+
updateItemLabel
|
|
62
48
|
},
|
|
63
49
|
publicAPI: {
|
|
64
50
|
updateItemLabel
|
|
65
|
-
}
|
|
51
|
+
},
|
|
52
|
+
contextValue: pluginContextValue
|
|
66
53
|
};
|
|
67
54
|
};
|
|
68
55
|
useTreeViewLabel.itemPlugin = useTreeViewLabelItemPlugin;
|
|
@@ -81,7 +68,9 @@ useTreeViewLabel.getDefaultizedParams = ({
|
|
|
81
68
|
});
|
|
82
69
|
};
|
|
83
70
|
useTreeViewLabel.getInitialState = () => ({
|
|
84
|
-
|
|
71
|
+
label: {
|
|
72
|
+
editedItemId: null
|
|
73
|
+
}
|
|
85
74
|
});
|
|
86
75
|
useTreeViewLabel.params = {
|
|
87
76
|
onItemLabelChange: true,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
import { selectorItemModel } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
3
|
+
const selectorTreeViewLabelState = state => state.label;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if an item is editable.
|
|
7
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
8
|
+
* @param {object} params The parameters.
|
|
9
|
+
* @param {TreeViewItemId} params.itemId The id of the item to check.
|
|
10
|
+
* @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
|
|
11
|
+
* @returns {boolean} `true` if the item is editable, `false` otherwise.
|
|
12
|
+
*/
|
|
13
|
+
export const selectorIsItemEditable = createSelector([(_, args) => args, (state, args) => selectorItemModel(state, args.itemId)], (args, itemModel) => {
|
|
14
|
+
if (!itemModel || !args.isItemEditable) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return typeof args.isItemEditable === 'function' ? args.isItemEditable(itemModel) : true;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if an item is being edited.
|
|
22
|
+
* @param {TreeViewState<[UseTreeViewLabelSignature]>} state The state of the tree view.
|
|
23
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
24
|
+
* @returns {boolean} `true` if the item is being edited, `false` otherwise.
|
|
25
|
+
*/
|
|
26
|
+
export const selectorIsItemBeingEdited = createSelector([selectorTreeViewLabelState, (_, itemId) => itemId], (labelState, itemId) => labelState.editedItemId === itemId);
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
|
|
3
|
+
import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
4
|
+
import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
|
|
5
|
+
function getCheckboxStatus({
|
|
6
|
+
itemId,
|
|
7
|
+
store,
|
|
8
|
+
selectionPropagation,
|
|
9
|
+
selected
|
|
10
|
+
}) {
|
|
11
|
+
if (selected) {
|
|
12
|
+
return {
|
|
13
|
+
indeterminate: false,
|
|
14
|
+
checked: true
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const children = selectorItemOrderedChildrenIds(store.value, itemId);
|
|
18
|
+
if (children.length === 0) {
|
|
19
|
+
return {
|
|
20
|
+
indeterminate: false,
|
|
21
|
+
checked: false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
let hasSelectedDescendant = false;
|
|
25
|
+
let hasUnSelectedDescendant = false;
|
|
26
|
+
const traverseDescendants = itemToTraverseId => {
|
|
27
|
+
if (itemToTraverseId !== itemId) {
|
|
28
|
+
if (selectorIsItemSelected(store.value, itemToTraverseId)) {
|
|
29
|
+
hasSelectedDescendant = true;
|
|
30
|
+
} else {
|
|
31
|
+
hasUnSelectedDescendant = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
selectorItemOrderedChildrenIds(store.value, itemToTraverseId).forEach(traverseDescendants);
|
|
35
|
+
};
|
|
36
|
+
traverseDescendants(itemId);
|
|
37
|
+
return {
|
|
38
|
+
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
|
|
39
|
+
checked: selectionPropagation.parents ? hasSelectedDescendant : selected
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export const useTreeViewSelectionItemPlugin = ({
|
|
43
|
+
props
|
|
44
|
+
}) => {
|
|
45
|
+
const {
|
|
46
|
+
itemId
|
|
47
|
+
} = props;
|
|
48
|
+
const {
|
|
49
|
+
store,
|
|
50
|
+
selection: {
|
|
51
|
+
disableSelection,
|
|
52
|
+
checkboxSelection,
|
|
53
|
+
selectionPropagation
|
|
54
|
+
}
|
|
55
|
+
} = useTreeViewContext();
|
|
56
|
+
return {
|
|
57
|
+
propsEnhancers: {
|
|
58
|
+
checkbox: ({
|
|
59
|
+
externalEventHandlers,
|
|
60
|
+
interactions,
|
|
61
|
+
status
|
|
62
|
+
}) => {
|
|
63
|
+
const handleChange = event => {
|
|
64
|
+
externalEventHandlers.onChange?.(event);
|
|
65
|
+
if (event.defaultMuiPrevented) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (disableSelection || status.disabled) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
interactions.handleCheckboxSelection(event);
|
|
72
|
+
};
|
|
73
|
+
const checkboxStatus = getCheckboxStatus({
|
|
74
|
+
store,
|
|
75
|
+
itemId,
|
|
76
|
+
selectionPropagation,
|
|
77
|
+
selected: status.selected
|
|
78
|
+
});
|
|
79
|
+
return _extends({
|
|
80
|
+
visible: checkboxSelection,
|
|
81
|
+
disabled: disableSelection || status.disabled,
|
|
82
|
+
tabIndex: -1,
|
|
83
|
+
onChange: handleChange
|
|
84
|
+
}, checkboxStatus);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
};
|