@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
|
+
});
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
label: string;
|
|
6
|
-
itemId: string;
|
|
7
|
-
id: string | undefined;
|
|
8
|
-
children?: TreeViewItemToRenderProps[];
|
|
9
|
-
}
|
|
2
|
+
import { DefaultizedProps } from '@mui/x-internals/types';
|
|
3
|
+
import { TreeViewItemMeta, TreeViewPluginSignature } from '../../models';
|
|
4
|
+
import { TreeViewBaseItem, TreeViewDefaultItemModelProperties, TreeViewItemId } from '../../../models';
|
|
10
5
|
export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
11
6
|
/**
|
|
12
7
|
* Get the item with the given id.
|
|
@@ -31,45 +26,11 @@ export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
|
31
26
|
getItemOrderedChildrenIds: (itemId: TreeViewItemId | null) => TreeViewItemId[];
|
|
32
27
|
/**
|
|
33
28
|
* Get all the items in the same format as provided by `props.items`.
|
|
34
|
-
* @returns {
|
|
29
|
+
* @returns {TreeViewBaseItem[]} The items in the tree.
|
|
35
30
|
*/
|
|
36
31
|
getItemTree: () => TreeViewBaseItem[];
|
|
37
32
|
}
|
|
38
|
-
export interface UseTreeViewItemsInstance<R extends {}> extends UseTreeViewItemsPublicAPI<R> {
|
|
39
|
-
/**
|
|
40
|
-
* Get the meta-information of an item.
|
|
41
|
-
* Check the `TreeViewItemMeta` type for more information.
|
|
42
|
-
* @param {TreeViewItemId} itemId The id of the item to get the meta-information of.
|
|
43
|
-
* @returns {TreeViewItemMeta} The meta-information of the item.
|
|
44
|
-
*/
|
|
45
|
-
getItemMeta: (itemId: TreeViewItemId) => TreeViewItemMeta;
|
|
46
|
-
/**
|
|
47
|
-
* Get the item that should be rendered.
|
|
48
|
-
* This method is only used on Rich Tree View components.
|
|
49
|
-
* Check the `TreeViewItemToRenderProps` type for more information.
|
|
50
|
-
* @returns {TreeViewItemToRenderProps[]} The items to render.
|
|
51
|
-
*/
|
|
52
|
-
getItemsToRender: () => TreeViewItemToRenderProps[];
|
|
53
|
-
/**
|
|
54
|
-
* Check if a given item is disabled.
|
|
55
|
-
* An item is disabled if it was marked as disabled or if one of its ancestors is disabled.
|
|
56
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
57
|
-
* @returns {boolean} `true` if the item is disabled, `false` otherwise.
|
|
58
|
-
*/
|
|
59
|
-
isItemDisabled: (itemId: TreeViewItemId) => boolean;
|
|
60
|
-
/**
|
|
61
|
-
* Check if a given item is navigable (i.e.: if it can be accessed through keyboard navigation).
|
|
62
|
-
* An item is navigable if it is not disabled or if the `disabledItemsFocusable` prop is `true`.
|
|
63
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
64
|
-
* @returns {boolean} `true` if the item is navigable, `false` otherwise.
|
|
65
|
-
*/
|
|
66
|
-
isItemNavigable: (itemId: TreeViewItemId) => boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Get the index of a given item in its parent's children list.
|
|
69
|
-
* @param {TreeViewItemId} itemId The id of the item to get the index of.
|
|
70
|
-
* @returns {number} The index of the item in its parent's children list.
|
|
71
|
-
*/
|
|
72
|
-
getItemIndex: (itemId: TreeViewItemId) => number;
|
|
33
|
+
export interface UseTreeViewItemsInstance<R extends {}> extends Pick<UseTreeViewItemsPublicAPI<R>, 'getItemDOMElement'> {
|
|
73
34
|
/**
|
|
74
35
|
* Freeze any future update to the state based on the `items` prop.
|
|
75
36
|
* This is useful when `useTreeViewJSXItems` is used to avoid having conflicting sources of truth.
|
|
@@ -141,12 +102,13 @@ interface UseTreeViewItemsEventLookup {
|
|
|
141
102
|
}
|
|
142
103
|
export interface UseTreeViewItemsState<R extends {}> {
|
|
143
104
|
items: {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
105
|
+
disabledItemsFocusable: boolean;
|
|
106
|
+
itemModelLookup: TreeViewItemModelLookup<R>;
|
|
107
|
+
itemMetaLookup: TreeViewItemMetaLookup;
|
|
108
|
+
itemOrderedChildrenIdsLookup: {
|
|
147
109
|
[parentItemId: string]: string[];
|
|
148
110
|
};
|
|
149
|
-
|
|
111
|
+
itemChildrenIndexesLookup: {
|
|
150
112
|
[parentItemId: string]: {
|
|
151
113
|
[itemId: string]: number;
|
|
152
114
|
};
|
|
@@ -154,8 +116,8 @@ export interface UseTreeViewItemsState<R extends {}> {
|
|
|
154
116
|
};
|
|
155
117
|
}
|
|
156
118
|
interface UseTreeViewItemsContextValue {
|
|
157
|
-
items:
|
|
158
|
-
|
|
119
|
+
items: {
|
|
120
|
+
onItemClick: (event: React.MouseEvent, itemId: string) => void;
|
|
159
121
|
};
|
|
160
122
|
}
|
|
161
123
|
export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
|
|
@@ -164,14 +126,13 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
|
|
|
164
126
|
instance: UseTreeViewItemsInstance<any>;
|
|
165
127
|
publicAPI: UseTreeViewItemsPublicAPI<any>;
|
|
166
128
|
events: UseTreeViewItemsEventLookup;
|
|
167
|
-
state: UseTreeViewItemsState<
|
|
129
|
+
state: UseTreeViewItemsState<TreeViewDefaultItemModelProperties>;
|
|
168
130
|
contextValue: UseTreeViewItemsContextValue;
|
|
169
|
-
experimentalFeatures: 'indentationAtItemLevel';
|
|
170
131
|
}>;
|
|
171
|
-
export type
|
|
132
|
+
export type TreeViewItemMetaLookup = {
|
|
172
133
|
[itemId: string]: TreeViewItemMeta;
|
|
173
134
|
};
|
|
174
|
-
export type
|
|
175
|
-
[itemId: string]: R
|
|
135
|
+
export type TreeViewItemModelLookup<R extends {}> = {
|
|
136
|
+
[itemId: string]: TreeViewBaseItem<R>;
|
|
176
137
|
};
|
|
177
138
|
export {};
|
|
@@ -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
|
|
@@ -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,2 +1,2 @@
|
|
|
1
1
|
import { TreeViewItemPlugin } from '../../models';
|
|
2
|
-
export declare const useTreeViewLabelItemPlugin: TreeViewItemPlugin
|
|
2
|
+
export declare const useTreeViewLabelItemPlugin: TreeViewItemPlugin;
|
|
@@ -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,
|