@mui/x-tree-view 8.11.0 → 8.11.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 +74 -0
- package/RichTreeView/RichTreeView.js +16 -15
- package/RichTreeView/RichTreeView.types.d.ts +3 -2
- package/SimpleTreeView/SimpleTreeView.js +10 -9
- package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -2
- package/TreeItem/TreeItem.d.ts +1 -1
- package/TreeItemProvider/TreeItemProvider.js +3 -3
- package/esm/RichTreeView/RichTreeView.js +16 -15
- package/esm/RichTreeView/RichTreeView.types.d.ts +3 -2
- package/esm/SimpleTreeView/SimpleTreeView.js +10 -9
- package/esm/SimpleTreeView/SimpleTreeView.types.d.ts +3 -2
- package/esm/TreeItem/TreeItem.d.ts +1 -1
- package/esm/TreeItemProvider/TreeItemProvider.js +3 -3
- package/esm/hooks/useTreeItemModel.js +3 -3
- package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +24 -25
- package/esm/index.js +1 -1
- package/esm/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +2 -2
- package/esm/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
- package/esm/internals/components/RichTreeViewItems.js +5 -5
- package/esm/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
- package/esm/internals/corePlugins/useTreeViewId/index.js +2 -1
- package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -13
- package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
- package/esm/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -9
- package/esm/internals/index.d.ts +6 -14
- package/esm/internals/index.js +6 -13
- package/esm/internals/models/plugin.d.ts +2 -3
- package/esm/internals/models/treeView.d.ts +4 -6
- package/esm/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewExpansion/index.js +2 -1
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -30
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
- package/esm/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewFocus/index.js +2 -1
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +17 -21
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +25 -37
- package/esm/internals/plugins/useTreeViewItems/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewItems/index.js +2 -1
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +78 -99
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +58 -98
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
- package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +22 -22
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
- package/esm/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewLabel/index.js +2 -1
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +4 -4
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +17 -25
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
- package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -1
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +15 -27
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
- package/esm/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
- package/esm/internals/plugins/useTreeViewSelection/index.js +2 -1
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +25 -38
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +30 -34
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +10 -10
- package/esm/internals/useTreeView/useTreeView.d.ts +1 -1
- package/esm/internals/useTreeView/useTreeView.js +11 -18
- package/esm/internals/useTreeView/useTreeView.types.d.ts +1 -1
- package/esm/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
- package/esm/internals/utils/tree.js +33 -33
- package/esm/useTreeItem/useTreeItem.js +14 -14
- package/esm/useTreeItem/useTreeItem.types.d.ts +2 -1
- package/hooks/useTreeItemModel.js +3 -3
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +18 -19
- package/index.js +1 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
- package/internals/components/RichTreeViewItems.js +5 -5
- package/internals/corePlugins/useTreeViewId/index.d.ts +2 -1
- package/internals/corePlugins/useTreeViewId/index.js +8 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +9 -12
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +8 -34
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +10 -10
- package/internals/index.d.ts +6 -14
- package/internals/index.js +12 -73
- package/internals/models/plugin.d.ts +2 -3
- package/internals/models/treeView.d.ts +4 -6
- package/internals/plugins/useTreeViewExpansion/index.d.ts +2 -1
- package/internals/plugins/useTreeViewExpansion/index.js +8 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -28
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +24 -316
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +27 -38
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -1
- package/internals/plugins/useTreeViewFocus/index.d.ts +2 -1
- package/internals/plugins/useTreeViewFocus/index.js +8 -1
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +14 -18
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +20 -628
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +23 -35
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
- package/internals/plugins/useTreeViewItems/index.js +8 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +77 -98
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +52 -1142
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +59 -99
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -1
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +32 -42
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +18 -18
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -0
- package/internals/plugins/useTreeViewLabel/index.d.ts +2 -1
- package/internals/plugins/useTreeViewLabel/index.js +8 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +3 -3
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -24
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -100
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +24 -34
- package/internals/plugins/useTreeViewLazyLoading/index.d.ts +2 -1
- package/internals/plugins/useTreeViewLazyLoading/index.js +8 -1
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +18 -245
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +16 -28
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +20 -6
- package/internals/plugins/useTreeViewSelection/index.d.ts +2 -1
- package/internals/plugins/useTreeViewSelection/index.js +8 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +23 -37
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +29 -33
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +38 -517
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +46 -71
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +8 -8
- package/internals/useTreeView/useTreeView.d.ts +1 -1
- package/internals/useTreeView/useTreeView.js +11 -18
- package/internals/useTreeView/useTreeView.types.d.ts +1 -1
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +2 -3
- package/internals/utils/tree.js +31 -31
- package/package.json +12 -13
- package/useTreeItem/useTreeItem.js +14 -14
- package/useTreeItem/useTreeItem.types.d.ts +2 -1
- package/esm/internals/hooks/useSelector.d.ts +0 -4
- package/esm/internals/hooks/useSelector.js +0 -8
- package/esm/internals/utils/TreeViewStore.d.ts +0 -12
- package/esm/internals/utils/TreeViewStore.js +0 -22
- package/esm/internals/utils/selectors.d.ts +0 -21
- package/esm/internals/utils/selectors.js +0 -51
- package/internals/hooks/useSelector.d.ts +0 -4
- package/internals/hooks/useSelector.js +0 -16
- package/internals/utils/TreeViewStore.d.ts +0 -12
- package/internals/utils/TreeViewStore.js +0 -29
- package/internals/utils/selectors.d.ts +0 -21
- package/internals/utils/selectors.js +0 -58
|
@@ -1,100 +1,60 @@
|
|
|
1
|
-
import { createSelector } from
|
|
1
|
+
import { createSelector } from '@mui/x-internals/store';
|
|
2
2
|
import { isItemDisabled, TREE_VIEW_ROOT_PARENT_ID } from "./useTreeViewItems.utils.js";
|
|
3
|
-
const selectorTreeViewItemsState = state => state.items;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Get the loading state for the Tree View.
|
|
7
|
-
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
8
|
-
* @returns {boolean} The loading state for the Tree View.
|
|
9
|
-
*/
|
|
10
|
-
export const selectorIsTreeViewLoading = createSelector(selectorTreeViewItemsState, items => items.loading);
|
|
11
|
-
/**
|
|
12
|
-
* Get the error state for the Tree View.
|
|
13
|
-
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
14
|
-
* @returns {boolean} The error state for the Tree View.
|
|
15
|
-
*/
|
|
16
|
-
export const selectorGetTreeViewError = createSelector(selectorTreeViewItemsState, items => items.error);
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Get the meta-information of all items.
|
|
20
|
-
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
21
|
-
* @returns {TreeViewItemMetaLookup} The meta-information of all items.
|
|
22
|
-
*/
|
|
23
|
-
export const selectorItemMetaLookup = createSelector(selectorTreeViewItemsState, items => items.itemMetaLookup);
|
|
24
3
|
const EMPTY_CHILDREN = [];
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
* Get the depth of an item (items at the root level have a depth of 0).
|
|
83
|
-
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
84
|
-
* @param {TreeViewItemId} itemId The id of the item to get the depth of.
|
|
85
|
-
* @returns {number} The depth of the item.
|
|
86
|
-
*/
|
|
87
|
-
export const selectorItemDepth = createSelector([selectorItemMeta], itemMeta => itemMeta?.depth ?? 0);
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Check if the disabled items are focusable.
|
|
91
|
-
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
92
|
-
* @returns {boolean} Whether the disabled items are focusable.
|
|
93
|
-
*/
|
|
94
|
-
export const selectorDisabledItemFocusable = createSelector([selectorTreeViewItemsState], itemsState => itemsState.disabledItemsFocusable);
|
|
95
|
-
export const selectorCanItemBeFocused = createSelector([selectorDisabledItemFocusable, selectorIsItemDisabled], (disabledItemsFocusable, isDisabled) => {
|
|
96
|
-
if (disabledItemsFocusable) {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
return !isDisabled;
|
|
100
|
-
});
|
|
4
|
+
export const itemsSelectors = {
|
|
5
|
+
/**
|
|
6
|
+
* Gets the loading state for the Tree View.
|
|
7
|
+
*/
|
|
8
|
+
isLoading: createSelector(state => state.items.loading),
|
|
9
|
+
/**
|
|
10
|
+
* Gets the error state for the Tree View.
|
|
11
|
+
*/
|
|
12
|
+
error: createSelector(state => state.items.error),
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether the disabled items are focusable.
|
|
15
|
+
*/
|
|
16
|
+
disabledItemFocusable: createSelector(state => state.items.disabledItemsFocusable),
|
|
17
|
+
/**
|
|
18
|
+
* Gets the meta-information of all items.
|
|
19
|
+
*/
|
|
20
|
+
itemMetaLookup: createSelector(state => state.items.itemMetaLookup),
|
|
21
|
+
/**
|
|
22
|
+
* Gets the meta-information of an item.
|
|
23
|
+
*/
|
|
24
|
+
itemMeta: createSelector((state, itemId) => state.items.itemMetaLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? null),
|
|
25
|
+
/**
|
|
26
|
+
* Gets the ordered children ids of an item.
|
|
27
|
+
*/
|
|
28
|
+
itemOrderedChildrenIds: createSelector((state, itemId) => state.items.itemOrderedChildrenIdsLookup[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? EMPTY_CHILDREN),
|
|
29
|
+
/**
|
|
30
|
+
* Gets the model of an item.
|
|
31
|
+
*/
|
|
32
|
+
itemModel: createSelector((state, itemId) => state.items.itemModelLookup[itemId]),
|
|
33
|
+
/**
|
|
34
|
+
* Checks whether an item is disabled.
|
|
35
|
+
*/
|
|
36
|
+
isItemDisabled: createSelector((state, itemId) => isItemDisabled(state.items.itemMetaLookup, itemId)),
|
|
37
|
+
/**
|
|
38
|
+
* Gets the index of an item in its parent's children.
|
|
39
|
+
*/
|
|
40
|
+
itemIndex: createSelector((state, itemId) => {
|
|
41
|
+
const itemMeta = state.items.itemMetaLookup[itemId];
|
|
42
|
+
if (itemMeta == null) {
|
|
43
|
+
return -1;
|
|
44
|
+
}
|
|
45
|
+
const parentIndexes = state.items.itemChildrenIndexesLookup[itemMeta.parentId ?? TREE_VIEW_ROOT_PARENT_ID];
|
|
46
|
+
return parentIndexes[itemMeta.id];
|
|
47
|
+
}),
|
|
48
|
+
/**
|
|
49
|
+
* Gets the id of an item's parent.
|
|
50
|
+
*/
|
|
51
|
+
itemParentId: createSelector((state, itemId) => state.items.itemMetaLookup[itemId]?.parentId ?? null),
|
|
52
|
+
/**
|
|
53
|
+
* Gets the depth of an item (items at the root level have a depth of 0).
|
|
54
|
+
*/
|
|
55
|
+
itemDepth: createSelector((state, itemId) => state.items.itemMetaLookup[itemId]?.depth ?? 0),
|
|
56
|
+
/**
|
|
57
|
+
* Checks whether an item can be focused.
|
|
58
|
+
*/
|
|
59
|
+
canItemBeFocused: createSelector((state, itemId) => state.items.disabledItemsFocusable || !isItemDisabled(state.items.itemMetaLookup, itemId))
|
|
60
|
+
};
|
|
@@ -7,7 +7,7 @@ export declare const buildSiblingIndexes: (siblings: string[]) => {
|
|
|
7
7
|
/**
|
|
8
8
|
* Check if an item is disabled.
|
|
9
9
|
* This method should only be used in selectors that are checking if several items are disabled.
|
|
10
|
-
* Otherwise, use the `
|
|
10
|
+
* Otherwise, use the `itemsSelector.isItemDisabled` selector.
|
|
11
11
|
* @returns
|
|
12
12
|
*/
|
|
13
13
|
export declare const isItemDisabled: (itemMetaLookup: {
|
|
@@ -10,7 +10,7 @@ export const buildSiblingIndexes = siblings => {
|
|
|
10
10
|
/**
|
|
11
11
|
* Check if an item is disabled.
|
|
12
12
|
* This method should only be used in selectors that are checking if several items are disabled.
|
|
13
|
-
* Otherwise, use the `
|
|
13
|
+
* Otherwise, use the `itemsSelector.isItemDisabled` selector.
|
|
14
14
|
* @returns
|
|
15
15
|
*/
|
|
16
16
|
export const isItemDisabled = (itemMetaLookup, itemId) => {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
4
4
|
import * as React from 'react';
|
|
5
|
+
import { useStore } from '@mui/x-internals/store';
|
|
5
6
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
6
7
|
import useForkRef from '@mui/utils/useForkRef';
|
|
7
8
|
import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
|
|
@@ -12,8 +13,7 @@ import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewIte
|
|
|
12
13
|
import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
|
|
13
14
|
import { generateTreeItemIdAttribute } from "../../corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
14
15
|
import { itemHasChildren } from "../../../hooks/useTreeItemUtils/useTreeItemUtils.js";
|
|
15
|
-
import {
|
|
16
|
-
import { selectorTreeViewId } from "../../corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
16
|
+
import { idSelectors } from "../../corePlugins/useTreeViewId/index.js";
|
|
17
17
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
18
|
export const useTreeViewJSXItems = ({
|
|
19
19
|
instance,
|
|
@@ -21,38 +21,30 @@ export const useTreeViewJSXItems = ({
|
|
|
21
21
|
}) => {
|
|
22
22
|
instance.preventItemUpdates();
|
|
23
23
|
const insertJSXItem = useEventCallback(item => {
|
|
24
|
-
store.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
});
|
|
42
|
-
});
|
|
24
|
+
if (store.state.items.itemMetaLookup[item.id] != null) {
|
|
25
|
+
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'));
|
|
26
|
+
}
|
|
27
|
+
store.set('items', _extends({}, store.state.items, {
|
|
28
|
+
itemMetaLookup: _extends({}, store.state.items.itemMetaLookup, {
|
|
29
|
+
[item.id]: item
|
|
30
|
+
}),
|
|
31
|
+
// For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
|
|
32
|
+
itemModelLookup: _extends({}, store.state.items.itemModelLookup, {
|
|
33
|
+
[item.id]: {
|
|
34
|
+
id: item.id,
|
|
35
|
+
label: item.label ?? ''
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
}));
|
|
43
39
|
return () => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
itemModelLookup: newItemModelLookup
|
|
53
|
-
})
|
|
54
|
-
});
|
|
55
|
-
});
|
|
40
|
+
const newItemMetaLookup = _extends({}, store.state.items.itemMetaLookup);
|
|
41
|
+
const newItemModelLookup = _extends({}, store.state.items.itemModelLookup);
|
|
42
|
+
delete newItemMetaLookup[item.id];
|
|
43
|
+
delete newItemModelLookup[item.id];
|
|
44
|
+
store.set('items', _extends({}, store.state.items, {
|
|
45
|
+
itemMetaLookup: newItemMetaLookup,
|
|
46
|
+
itemModelLookup: newItemModelLookup
|
|
47
|
+
}));
|
|
56
48
|
publishTreeViewEvent(instance, 'removeItem', {
|
|
57
49
|
id: item.id
|
|
58
50
|
});
|
|
@@ -60,14 +52,12 @@ export const useTreeViewJSXItems = ({
|
|
|
60
52
|
});
|
|
61
53
|
const setJSXItemsOrderedChildrenIds = (parentId, orderedChildrenIds) => {
|
|
62
54
|
const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
63
|
-
store.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
[parentIdWithDefault]: buildSiblingIndexes(orderedChildrenIds)
|
|
70
|
-
})
|
|
55
|
+
store.set('items', _extends({}, store.state.items, {
|
|
56
|
+
itemOrderedChildrenIdsLookup: _extends({}, store.state.items.itemOrderedChildrenIdsLookup, {
|
|
57
|
+
[parentIdWithDefault]: orderedChildrenIds
|
|
58
|
+
}),
|
|
59
|
+
itemChildrenIndexesLookup: _extends({}, store.state.items.itemChildrenIndexesLookup, {
|
|
60
|
+
[parentIdWithDefault]: buildSiblingIndexes(orderedChildrenIds)
|
|
71
61
|
})
|
|
72
62
|
}));
|
|
73
63
|
};
|
|
@@ -120,7 +110,7 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
120
110
|
const expandable = itemHasChildren(children);
|
|
121
111
|
const pluginContentRef = React.useRef(null);
|
|
122
112
|
const handleContentRef = useForkRef(pluginContentRef, contentRef);
|
|
123
|
-
const treeId =
|
|
113
|
+
const treeId = useStore(store, idSelectors.treeId);
|
|
124
114
|
|
|
125
115
|
// Prevent any flashing
|
|
126
116
|
useEnhancedEffect(() => {
|
package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
+
import { useStore } from '@mui/x-internals/store';
|
|
4
5
|
import { useRtl } from '@mui/system/RtlProvider';
|
|
5
6
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
6
7
|
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
|
|
7
8
|
import { hasPlugin } from "../../utils/plugins.js";
|
|
8
9
|
import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { selectorIsItemExpandable, selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
10
|
+
import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
11
|
+
import { labelSelectors } from "../useTreeViewLabel/useTreeViewLabel.selectors.js";
|
|
12
|
+
import { selectionSelectors } from "../useTreeViewSelection/useTreeViewSelection.selectors.js";
|
|
13
|
+
import { expansionSelectors } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
14
14
|
function isPrintableKey(string) {
|
|
15
15
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
16
16
|
}
|
|
@@ -24,7 +24,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
24
24
|
const updateFirstCharMap = useEventCallback(callback => {
|
|
25
25
|
firstCharMap.current = callback(firstCharMap.current);
|
|
26
26
|
});
|
|
27
|
-
const itemMetaLookup =
|
|
27
|
+
const itemMetaLookup = useStore(store, itemsSelectors.itemMetaLookup);
|
|
28
28
|
React.useEffect(() => {
|
|
29
29
|
if (instance.areItemUpdatesPrevented()) {
|
|
30
30
|
return;
|
|
@@ -39,10 +39,10 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
39
39
|
const getFirstMatchingItem = (itemId, query) => {
|
|
40
40
|
const cleanQuery = query.toLowerCase();
|
|
41
41
|
const getNextItem = itemIdToCheck => {
|
|
42
|
-
const nextItemId = getNextNavigableItem(store.
|
|
42
|
+
const nextItemId = getNextNavigableItem(store.state, itemIdToCheck);
|
|
43
43
|
// We reached the end of the tree, check from the beginning
|
|
44
44
|
if (nextItemId === null) {
|
|
45
|
-
return getFirstNavigableItem(store.
|
|
45
|
+
return getFirstNavigableItem(store.state);
|
|
46
46
|
}
|
|
47
47
|
return nextItemId;
|
|
48
48
|
};
|
|
@@ -60,9 +60,9 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
60
60
|
}
|
|
61
61
|
return matchingItemId;
|
|
62
62
|
};
|
|
63
|
-
const canToggleItemSelection = itemId =>
|
|
63
|
+
const canToggleItemSelection = itemId => selectionSelectors.enabled(store.state) && !itemsSelectors.isItemDisabled(store.state, itemId);
|
|
64
64
|
const canToggleItemExpansion = itemId => {
|
|
65
|
-
return !
|
|
65
|
+
return !itemsSelectors.isItemDisabled(store.state, itemId) && expansionSelectors.isItemExpandable(store.state, itemId);
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
@@ -75,7 +75,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
75
75
|
}
|
|
76
76
|
const ctrlPressed = event.ctrlKey || event.metaKey;
|
|
77
77
|
const key = event.key;
|
|
78
|
-
const isMultiSelectEnabled =
|
|
78
|
+
const isMultiSelectEnabled = selectionSelectors.isMultiSelectEnabled(store.state);
|
|
79
79
|
|
|
80
80
|
// eslint-disable-next-line default-case
|
|
81
81
|
switch (true) {
|
|
@@ -100,7 +100,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
100
100
|
// If the focused item has no children, we select it.
|
|
101
101
|
case key === 'Enter':
|
|
102
102
|
{
|
|
103
|
-
if (hasPlugin(instance, useTreeViewLabel) &&
|
|
103
|
+
if (hasPlugin(instance, useTreeViewLabel) && labelSelectors.isItemEditable(store.state, itemId) && !labelSelectors.isItemBeingEdited(store.state, itemId)) {
|
|
104
104
|
instance.setEditedItem(itemId);
|
|
105
105
|
} else if (canToggleItemExpansion(itemId)) {
|
|
106
106
|
instance.setItemExpansion({
|
|
@@ -116,7 +116,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
116
116
|
itemId,
|
|
117
117
|
keepExistingSelection: true
|
|
118
118
|
});
|
|
119
|
-
} else if (!
|
|
119
|
+
} else if (!selectionSelectors.isItemSelected(store.state, itemId)) {
|
|
120
120
|
instance.setItemSelection({
|
|
121
121
|
event,
|
|
122
122
|
itemId
|
|
@@ -130,7 +130,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
130
130
|
// Focus the next focusable item
|
|
131
131
|
case key === 'ArrowDown':
|
|
132
132
|
{
|
|
133
|
-
const nextItem = getNextNavigableItem(store.
|
|
133
|
+
const nextItem = getNextNavigableItem(store.state, itemId);
|
|
134
134
|
if (nextItem) {
|
|
135
135
|
event.preventDefault();
|
|
136
136
|
instance.focusItem(event, nextItem);
|
|
@@ -147,7 +147,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
147
147
|
// Focuses the previous focusable item
|
|
148
148
|
case key === 'ArrowUp':
|
|
149
149
|
{
|
|
150
|
-
const previousItem = getPreviousNavigableItem(store.
|
|
150
|
+
const previousItem = getPreviousNavigableItem(store.state, itemId);
|
|
151
151
|
if (previousItem) {
|
|
152
152
|
event.preventDefault();
|
|
153
153
|
instance.focusItem(event, previousItem);
|
|
@@ -168,8 +168,8 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
168
168
|
if (ctrlPressed) {
|
|
169
169
|
return;
|
|
170
170
|
}
|
|
171
|
-
if (
|
|
172
|
-
const nextItemId = getNextNavigableItem(store.
|
|
171
|
+
if (expansionSelectors.isItemExpanded(store.state, itemId)) {
|
|
172
|
+
const nextItemId = getNextNavigableItem(store.state, itemId);
|
|
173
173
|
if (nextItemId) {
|
|
174
174
|
instance.focusItem(event, nextItemId);
|
|
175
175
|
event.preventDefault();
|
|
@@ -191,14 +191,14 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
191
191
|
if (ctrlPressed) {
|
|
192
192
|
return;
|
|
193
193
|
}
|
|
194
|
-
if (canToggleItemExpansion(itemId) &&
|
|
194
|
+
if (canToggleItemExpansion(itemId) && expansionSelectors.isItemExpanded(store.state, itemId)) {
|
|
195
195
|
instance.setItemExpansion({
|
|
196
196
|
event,
|
|
197
197
|
itemId
|
|
198
198
|
});
|
|
199
199
|
event.preventDefault();
|
|
200
200
|
} else {
|
|
201
|
-
const parent =
|
|
201
|
+
const parent = itemsSelectors.itemParentId(store.state, itemId);
|
|
202
202
|
if (parent) {
|
|
203
203
|
instance.focusItem(event, parent);
|
|
204
204
|
event.preventDefault();
|
|
@@ -215,7 +215,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
215
215
|
if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
|
|
216
216
|
instance.selectRangeFromStartToItem(event, itemId);
|
|
217
217
|
} else {
|
|
218
|
-
instance.focusItem(event, getFirstNavigableItem(store.
|
|
218
|
+
instance.focusItem(event, getFirstNavigableItem(store.state));
|
|
219
219
|
}
|
|
220
220
|
event.preventDefault();
|
|
221
221
|
break;
|
|
@@ -229,7 +229,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
229
229
|
if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
|
|
230
230
|
instance.selectRangeFromItemToEnd(event, itemId);
|
|
231
231
|
} else {
|
|
232
|
-
instance.focusItem(event, getLastNavigableItem(store.
|
|
232
|
+
instance.focusItem(event, getLastNavigableItem(store.state));
|
|
233
233
|
}
|
|
234
234
|
event.preventDefault();
|
|
235
235
|
break;
|
|
@@ -245,7 +245,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
245
245
|
|
|
246
246
|
// Multi select behavior when pressing Ctrl + a
|
|
247
247
|
// Selects all the items
|
|
248
|
-
case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && isMultiSelectEnabled &&
|
|
248
|
+
case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && isMultiSelectEnabled && selectionSelectors.enabled(store.state):
|
|
249
249
|
{
|
|
250
250
|
instance.selectAllNavigableItems(event);
|
|
251
251
|
event.preventDefault();
|
package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { UseTreeViewItemsSignature } from "../useTreeViewItems/index.js";
|
|
|
4
4
|
import { UseTreeViewSelectionSignature } from "../useTreeViewSelection/index.js";
|
|
5
5
|
import { UseTreeViewFocusSignature } from "../useTreeViewFocus/index.js";
|
|
6
6
|
import { UseTreeViewExpansionSignature } from "../useTreeViewExpansion/index.js";
|
|
7
|
+
import { UseTreeViewLabelSignature } from "../useTreeViewLabel/index.js";
|
|
7
8
|
import { TreeViewItemId, TreeViewCancellableEvent } from "../../../models/index.js";
|
|
8
9
|
export interface UseTreeViewKeyboardNavigationInstance {
|
|
9
10
|
/**
|
|
@@ -24,6 +25,7 @@ export interface UseTreeViewKeyboardNavigationInstance {
|
|
|
24
25
|
export type UseTreeViewKeyboardNavigationSignature = TreeViewPluginSignature<{
|
|
25
26
|
instance: UseTreeViewKeyboardNavigationInstance;
|
|
26
27
|
dependencies: [UseTreeViewItemsSignature, UseTreeViewSelectionSignature, UseTreeViewFocusSignature, UseTreeViewExpansionSignature];
|
|
28
|
+
optionalDependencies: [UseTreeViewLabelSignature];
|
|
27
29
|
}>;
|
|
28
30
|
export type TreeViewFirstCharMap = {
|
|
29
31
|
[itemId: string]: string;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { useTreeViewLabel } from "./useTreeViewLabel.js";
|
|
2
|
-
export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from "./useTreeViewLabel.types.js";
|
|
2
|
+
export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from "./useTreeViewLabel.types.js";
|
|
3
|
+
export { labelSelectors } from "./useTreeViewLabel.selectors.js";
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useTreeViewLabel } from "./useTreeViewLabel.js";
|
|
1
|
+
export { useTreeViewLabel } from "./useTreeViewLabel.js";
|
|
2
|
+
export { labelSelectors } from "./useTreeViewLabel.selectors.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
+
import { useStore } from '@mui/x-internals/store';
|
|
4
5
|
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
|
|
5
|
-
import {
|
|
6
|
-
import { selectorIsItemBeingEdited, selectorIsItemEditable } from "./useTreeViewLabel.selectors.js";
|
|
6
|
+
import { labelSelectors } from "./useTreeViewLabel.selectors.js";
|
|
7
7
|
export const useTreeViewLabelItemPlugin = ({
|
|
8
8
|
props
|
|
9
9
|
}) => {
|
|
@@ -15,8 +15,8 @@ export const useTreeViewLabelItemPlugin = ({
|
|
|
15
15
|
itemId
|
|
16
16
|
} = props;
|
|
17
17
|
const [labelInputValue, setLabelInputValue] = React.useState(label);
|
|
18
|
-
const isItemEditable =
|
|
19
|
-
const isItemBeingEdited =
|
|
18
|
+
const isItemEditable = useStore(store, labelSelectors.isItemEditable, itemId);
|
|
19
|
+
const isItemBeingEdited = useStore(store, labelSelectors.isItemBeingEdited, itemId);
|
|
20
20
|
React.useEffect(() => {
|
|
21
21
|
if (!isItemBeingEdited) {
|
|
22
22
|
setLabelInputValue(label);
|
|
@@ -1,52 +1,44 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
|
|
3
3
|
import { useTreeViewLabelItemPlugin } from "./useTreeViewLabel.itemPlugin.js";
|
|
4
|
-
import {
|
|
4
|
+
import { labelSelectors } from "./useTreeViewLabel.selectors.js";
|
|
5
5
|
export const useTreeViewLabel = ({
|
|
6
6
|
store,
|
|
7
7
|
params
|
|
8
8
|
}) => {
|
|
9
9
|
const setEditedItem = editedItemId => {
|
|
10
10
|
if (editedItemId !== null) {
|
|
11
|
-
const isEditable =
|
|
11
|
+
const isEditable = labelSelectors.isItemEditable(store.state, editedItemId);
|
|
12
12
|
if (!isEditable) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
store.
|
|
17
|
-
|
|
18
|
-
editedItemId
|
|
19
|
-
})
|
|
16
|
+
store.set('label', _extends({}, store.state.label, {
|
|
17
|
+
editedItemId
|
|
20
18
|
}));
|
|
21
19
|
};
|
|
22
20
|
const updateItemLabel = (itemId, label) => {
|
|
23
21
|
if (!label) {
|
|
24
22
|
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'));
|
|
25
23
|
}
|
|
26
|
-
store.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
return prevState;
|
|
40
|
-
});
|
|
24
|
+
const item = store.state.items.itemMetaLookup[itemId];
|
|
25
|
+
if (item.label === label) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
store.set('items', _extends({}, store.state.items, {
|
|
29
|
+
itemMetaLookup: _extends({}, store.state.items.itemMetaLookup, {
|
|
30
|
+
[itemId]: _extends({}, item, {
|
|
31
|
+
label
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
}));
|
|
41
35
|
if (params.onItemLabelChange) {
|
|
42
36
|
params.onItemLabelChange(itemId, label);
|
|
43
37
|
}
|
|
44
38
|
};
|
|
45
39
|
useEnhancedEffect(() => {
|
|
46
|
-
store.
|
|
47
|
-
|
|
48
|
-
isItemEditable: params.isItemEditable
|
|
49
|
-
})
|
|
40
|
+
store.set('label', _extends({}, store.state.items, {
|
|
41
|
+
isItemEditable: params.isItemEditable
|
|
50
42
|
}));
|
|
51
43
|
}, [store, params.isItemEditable]);
|
|
52
44
|
return {
|