@mui/x-tree-view 8.0.0-alpha.0 → 8.0.0-alpha.10
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 +2215 -119
- package/README.md +3 -3
- package/RichTreeView/RichTreeView.js +2 -4
- package/RichTreeView/RichTreeView.types.d.ts +6 -19
- package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -3
- package/TreeItem/TreeItem.d.ts +1 -1
- package/TreeItem/TreeItem.js +4 -4
- package/TreeItem/TreeItem.types.d.ts +4 -2
- package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
- package/TreeItemIcon/TreeItemIcon.types.d.ts +1 -1
- package/TreeItemProvider/TreeItemProvider.d.ts +2 -4
- package/TreeItemProvider/TreeItemProvider.js +26 -11
- package/TreeItemProvider/TreeItemProvider.types.d.ts +1 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItemModel.d.ts +2 -0
- package/hooks/useTreeItemModel.js +11 -0
- package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +6 -5
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
- package/hooks/useTreeViewApiRef.d.ts +2 -1
- package/index.js +1 -1
- 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 -3
- package/internals/components/RichTreeViewItems.d.ts +3 -5
- 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/useInstanceEventHandler.js +1 -1
- 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/itemPlugin.d.ts +7 -7
- package/internals/models/plugin.d.ts +22 -10
- package/internals/models/treeView.d.ts +6 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +180 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -18
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +4 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -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/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +886 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +36 -55
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- 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 +7 -24
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
- 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 +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
- package/internals/useTreeView/useTreeView.d.ts +1 -1
- package/internals/useTreeView/useTreeView.js +30 -17
- package/internals/useTreeView/useTreeView.types.d.ts +3 -4
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +4 -2
- 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 +3 -2
- package/modern/RichTreeView/RichTreeView.js +2 -4
- package/modern/TreeItem/TreeItem.js +4 -4
- package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
- package/modern/TreeItemProvider/TreeItemProvider.js +26 -11
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItemModel.js +11 -0
- package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
- package/modern/index.js +1 -1
- 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/useInstanceEventHandler.js +1 -1
- package/modern/internals/hooks/useSelector.js +6 -0
- package/modern/internals/index.js +5 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -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 -98
- 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 +16 -17
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
- 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/useTreeItem.js +29 -16
- package/node/RichTreeView/RichTreeView.js +2 -4
- package/node/TreeItem/TreeItem.js +4 -4
- package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
- package/node/TreeItemProvider/TreeItemProvider.js +26 -10
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItemModel.js +17 -0
- package/node/hooks/useTreeItemUtils/useTreeItemUtils.js +32 -15
- package/node/index.js +1 -1
- 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/useInstanceEventHandler.js +1 -1
- package/node/internals/hooks/useSelector.js +13 -0
- package/node/internals/index.js +47 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -31
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +30 -0
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +27 -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 -100
- 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 +16 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +46 -35
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +24 -14
- 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/useTreeItem.js +29 -16
- package/package.json +8 -6
- package/useTreeItem/useTreeItem.js +29 -16
- package/useTreeItem/useTreeItem.types.d.ts +10 -1
|
@@ -9,46 +9,56 @@ exports.useTreeViewFocus = void 0;
|
|
|
9
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
11
|
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
12
|
-
var _ownerDocument = _interopRequireDefault(require("@mui/utils/ownerDocument"));
|
|
13
12
|
var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
|
|
14
|
-
var _utils = require("../../utils/utils");
|
|
15
13
|
var _tree = require("../../utils/tree");
|
|
16
14
|
var _useTreeViewSelection = require("../useTreeViewSelection/useTreeViewSelection.utils");
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
const itemMeta = instance.getItemMeta(itemId);
|
|
23
|
-
return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
|
|
24
|
-
});
|
|
25
|
-
if (tabbableItemId == null) {
|
|
26
|
-
tabbableItemId = (0, _tree.getFirstNavigableItem)(instance);
|
|
27
|
-
}
|
|
28
|
-
return tabbableItemId;
|
|
29
|
-
};
|
|
15
|
+
var _useTreeViewFocus = require("./useTreeViewFocus.selectors");
|
|
16
|
+
var _useTreeViewExpansion = require("../useTreeViewExpansion/useTreeViewExpansion.selectors");
|
|
17
|
+
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
|
|
30
18
|
const useTreeViewFocus = ({
|
|
31
19
|
instance,
|
|
32
20
|
params,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
models,
|
|
36
|
-
rootRef
|
|
21
|
+
store,
|
|
22
|
+
models
|
|
37
23
|
}) => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
React.useEffect(() => {
|
|
25
|
+
let defaultFocusableItemId = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value).find(itemId => {
|
|
26
|
+
if (!(0, _useTreeViewItems.selectorCanItemBeFocused)(store.value, itemId)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, itemId);
|
|
30
|
+
return itemMeta && (itemMeta.parentId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemMeta.parentId));
|
|
31
|
+
});
|
|
32
|
+
if (defaultFocusableItemId == null) {
|
|
33
|
+
defaultFocusableItemId = (0, _tree.getFirstNavigableItem)(store.value) ?? null;
|
|
45
34
|
}
|
|
35
|
+
store.update(prevState => {
|
|
36
|
+
if (defaultFocusableItemId === prevState.focus.defaultFocusableItemId) {
|
|
37
|
+
return prevState;
|
|
38
|
+
}
|
|
39
|
+
return (0, _extends2.default)({}, prevState, {
|
|
40
|
+
focus: (0, _extends2.default)({}, prevState.focus, {
|
|
41
|
+
defaultFocusableItemId
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}, [store, models.selectedItems.value]);
|
|
46
|
+
const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
|
|
47
|
+
store.update(prevState => {
|
|
48
|
+
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(prevState);
|
|
49
|
+
if (focusedItemId === itemId) {
|
|
50
|
+
return prevState;
|
|
51
|
+
}
|
|
52
|
+
return (0, _extends2.default)({}, prevState, {
|
|
53
|
+
focus: (0, _extends2.default)({}, prevState.focus, {
|
|
54
|
+
focusedItemId: itemId
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
});
|
|
46
58
|
});
|
|
47
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
|
|
48
|
-
const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
|
|
49
59
|
const isItemVisible = itemId => {
|
|
50
|
-
const itemMeta =
|
|
51
|
-
return itemMeta && (itemMeta.parentId == null ||
|
|
60
|
+
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, itemId);
|
|
61
|
+
return itemMeta && (itemMeta.parentId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemMeta.parentId));
|
|
52
62
|
};
|
|
53
63
|
const innerFocusItem = (event, itemId) => {
|
|
54
64
|
const itemElement = instance.getItemDOMElement(itemId);
|
|
@@ -67,23 +77,25 @@ const useTreeViewFocus = ({
|
|
|
67
77
|
}
|
|
68
78
|
});
|
|
69
79
|
const removeFocusedItem = (0, _useEventCallback.default)(() => {
|
|
70
|
-
|
|
80
|
+
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value);
|
|
81
|
+
if (focusedItemId == null) {
|
|
71
82
|
return;
|
|
72
83
|
}
|
|
73
|
-
const itemMeta =
|
|
84
|
+
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, focusedItemId);
|
|
74
85
|
if (itemMeta) {
|
|
75
|
-
const itemElement = instance.getItemDOMElement(
|
|
86
|
+
const itemElement = instance.getItemDOMElement(focusedItemId);
|
|
76
87
|
if (itemElement) {
|
|
77
88
|
itemElement.blur();
|
|
78
89
|
}
|
|
79
90
|
}
|
|
80
91
|
setFocusedItemId(null);
|
|
81
92
|
});
|
|
82
|
-
const canItemBeTabbed = itemId => itemId === defaultFocusableItemId;
|
|
83
93
|
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeItem', ({
|
|
84
94
|
id
|
|
85
95
|
}) => {
|
|
86
|
-
|
|
96
|
+
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value);
|
|
97
|
+
const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value);
|
|
98
|
+
if (focusedItemId === id && defaultFocusableItemId != null) {
|
|
87
99
|
innerFocusItem(null, defaultFocusableItemId);
|
|
88
100
|
}
|
|
89
101
|
});
|
|
@@ -94,20 +106,27 @@ const useTreeViewFocus = ({
|
|
|
94
106
|
}
|
|
95
107
|
|
|
96
108
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
97
|
-
|
|
109
|
+
const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value);
|
|
110
|
+
if (event.target === event.currentTarget && defaultFocusableItemId != null) {
|
|
98
111
|
innerFocusItem(event, defaultFocusableItemId);
|
|
99
112
|
}
|
|
100
113
|
};
|
|
114
|
+
const createRootHandleBlur = otherHandlers => event => {
|
|
115
|
+
otherHandlers.onBlur?.(event);
|
|
116
|
+
if (event.defaultMuiPrevented) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
setFocusedItemId(null);
|
|
120
|
+
};
|
|
101
121
|
return {
|
|
102
122
|
getRootProps: otherHandlers => ({
|
|
103
|
-
onFocus: createRootHandleFocus(otherHandlers)
|
|
123
|
+
onFocus: createRootHandleFocus(otherHandlers),
|
|
124
|
+
onBlur: createRootHandleBlur(otherHandlers)
|
|
104
125
|
}),
|
|
105
126
|
publicAPI: {
|
|
106
127
|
focusItem
|
|
107
128
|
},
|
|
108
129
|
instance: {
|
|
109
|
-
isItemFocused,
|
|
110
|
-
canItemBeTabbed,
|
|
111
130
|
focusItem,
|
|
112
131
|
removeFocusedItem
|
|
113
132
|
}
|
|
@@ -115,7 +134,10 @@ const useTreeViewFocus = ({
|
|
|
115
134
|
};
|
|
116
135
|
exports.useTreeViewFocus = useTreeViewFocus;
|
|
117
136
|
useTreeViewFocus.getInitialState = () => ({
|
|
118
|
-
|
|
137
|
+
focus: {
|
|
138
|
+
focusedItemId: null,
|
|
139
|
+
defaultFocusableItemId: null
|
|
140
|
+
}
|
|
119
141
|
});
|
|
120
142
|
useTreeViewFocus.params = {
|
|
121
143
|
onItemFocus: true
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.selectorIsItemTheDefaultFocusableItem = exports.selectorIsItemFocused = exports.selectorFocusedItemId = exports.selectorDefaultFocusableItemId = void 0;
|
|
7
|
+
var _selectors = require("../../utils/selectors");
|
|
8
|
+
const selectorTreeViewFocusState = state => state.focus;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get the item that should be sequentially focusable (usually with the Tab key).
|
|
12
|
+
* At any point in time, there is a single item that can be sequentially focused in the Tree View.
|
|
13
|
+
* This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected.
|
|
14
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
15
|
+
* @returns {TreeViewItemId | null} The id of the item that should be sequentially focusable.
|
|
16
|
+
*/
|
|
17
|
+
const selectorDefaultFocusableItemId = exports.selectorDefaultFocusableItemId = (0, _selectors.createSelector)(selectorTreeViewFocusState, focus => focus.defaultFocusableItemId);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Check if an item is the default focusable item.
|
|
21
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
22
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
23
|
+
* @returns {boolean} `true` if the item is the default focusable item, `false` otherwise.
|
|
24
|
+
*/
|
|
25
|
+
const selectorIsItemTheDefaultFocusableItem = exports.selectorIsItemTheDefaultFocusableItem = (0, _selectors.createSelector)([selectorDefaultFocusableItemId, (_, itemId) => itemId], (defaultFocusableItemId, itemId) => defaultFocusableItemId === itemId);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get the id of the item that is currently focused.
|
|
29
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
30
|
+
* @returns {TreeViewItemId | null} The id of the item that is currently focused.
|
|
31
|
+
*/
|
|
32
|
+
const selectorFocusedItemId = exports.selectorFocusedItemId = (0, _selectors.createSelector)(selectorTreeViewFocusState, focus => focus.focusedItemId);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Check if an item is focused.
|
|
36
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
37
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
38
|
+
* @returns {boolean} `true` if the item is focused, `false` otherwise.
|
|
39
|
+
*/
|
|
40
|
+
const selectorIsItemFocused = exports.selectorIsItemFocused = (0, _selectors.createSelector)([selectorFocusedItemId, (_, itemId) => itemId], (focusedItemId, itemId) => focusedItemId === itemId);
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.useTreeViewIcons = void 0;
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
7
9
|
const useTreeViewIcons = ({
|
|
8
10
|
slots,
|
|
9
11
|
slotProps
|
|
10
12
|
}) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
endIcon: slotProps.endIcon
|
|
23
|
-
}
|
|
13
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
14
|
+
icons: {
|
|
15
|
+
slots: {
|
|
16
|
+
collapseIcon: slots.collapseIcon,
|
|
17
|
+
expandIcon: slots.expandIcon,
|
|
18
|
+
endIcon: slots.endIcon
|
|
19
|
+
},
|
|
20
|
+
slotProps: {
|
|
21
|
+
collapseIcon: slotProps.collapseIcon,
|
|
22
|
+
expandIcon: slotProps.expandIcon,
|
|
23
|
+
endIcon: slotProps.endIcon
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
+
}), [slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
|
|
27
|
+
return {
|
|
28
|
+
contextValue: pluginContextValue
|
|
26
29
|
};
|
|
27
30
|
};
|
|
28
31
|
exports.useTreeViewIcons = useTreeViewIcons;
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
3
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.useTreeViewItems = void 0;
|
|
9
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
-
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
11
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
12
12
|
var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
|
|
13
13
|
var _useTreeViewItems = require("./useTreeViewItems.utils");
|
|
14
14
|
var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
|
|
15
|
-
var
|
|
15
|
+
var _useTreeViewItems2 = require("./useTreeViewItems.selectors");
|
|
16
|
+
var _useTreeViewId = require("../../corePlugins/useTreeViewId/useTreeViewId.selectors");
|
|
17
|
+
var _useTreeViewId2 = require("../../corePlugins/useTreeViewId/useTreeViewId.utils");
|
|
16
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
|
-
const _excluded = ["children"];
|
|
18
19
|
const updateItemsState = ({
|
|
20
|
+
disabledItemsFocusable,
|
|
19
21
|
items,
|
|
20
22
|
isItemDisabled,
|
|
21
23
|
getItemLabel,
|
|
22
24
|
getItemId
|
|
23
25
|
}) => {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
26
|
+
const itemMetaLookup = {};
|
|
27
|
+
const itemModelLookup = {};
|
|
28
|
+
const itemOrderedChildrenIdsLookup = {
|
|
27
29
|
[_useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID]: []
|
|
28
30
|
};
|
|
29
31
|
const processItem = (item, depth, parentId) => {
|
|
@@ -31,14 +33,14 @@ const updateItemsState = ({
|
|
|
31
33
|
if (id == null) {
|
|
32
34
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
33
35
|
}
|
|
34
|
-
if (
|
|
36
|
+
if (itemMetaLookup[id] != null) {
|
|
35
37
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
|
|
36
38
|
}
|
|
37
39
|
const label = getItemLabel ? getItemLabel(item) : item.label;
|
|
38
40
|
if (label == null) {
|
|
39
41
|
throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
40
42
|
}
|
|
41
|
-
|
|
43
|
+
itemMetaLookup[id] = {
|
|
42
44
|
id,
|
|
43
45
|
label,
|
|
44
46
|
parentId,
|
|
@@ -47,88 +49,58 @@ const updateItemsState = ({
|
|
|
47
49
|
disabled: isItemDisabled ? isItemDisabled(item) : false,
|
|
48
50
|
depth
|
|
49
51
|
};
|
|
50
|
-
|
|
52
|
+
itemModelLookup[id] = item;
|
|
51
53
|
const parentIdWithDefault = parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID;
|
|
52
|
-
if (!
|
|
53
|
-
|
|
54
|
+
if (!itemOrderedChildrenIdsLookup[parentIdWithDefault]) {
|
|
55
|
+
itemOrderedChildrenIdsLookup[parentIdWithDefault] = [];
|
|
54
56
|
}
|
|
55
|
-
|
|
57
|
+
itemOrderedChildrenIdsLookup[parentIdWithDefault].push(id);
|
|
56
58
|
item.children?.forEach(child => processItem(child, depth + 1, id));
|
|
57
59
|
};
|
|
58
60
|
items.forEach(item => processItem(item, 0, null));
|
|
59
|
-
const
|
|
60
|
-
Object.keys(
|
|
61
|
-
|
|
61
|
+
const itemChildrenIndexesLookup = {};
|
|
62
|
+
Object.keys(itemOrderedChildrenIdsLookup).forEach(parentId => {
|
|
63
|
+
itemChildrenIndexesLookup[parentId] = (0, _useTreeViewItems.buildSiblingIndexes)(itemOrderedChildrenIdsLookup[parentId]);
|
|
62
64
|
});
|
|
63
65
|
return {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
disabledItemsFocusable,
|
|
67
|
+
itemMetaLookup,
|
|
68
|
+
itemModelLookup,
|
|
69
|
+
itemOrderedChildrenIdsLookup,
|
|
70
|
+
itemChildrenIndexesLookup
|
|
68
71
|
};
|
|
69
72
|
};
|
|
70
73
|
const useTreeViewItems = ({
|
|
71
74
|
instance,
|
|
72
75
|
params,
|
|
73
|
-
|
|
74
|
-
setState
|
|
76
|
+
store
|
|
75
77
|
}) => {
|
|
76
|
-
const
|
|
77
|
-
const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
|
|
78
|
+
const getItem = React.useCallback(itemId => (0, _useTreeViewItems2.selectorItemModel)(store.value, itemId), [store]);
|
|
78
79
|
const getItemTree = React.useCallback(() => {
|
|
79
|
-
const getItemFromItemId =
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (newChildren) {
|
|
80
|
+
const getItemFromItemId = itemId => {
|
|
81
|
+
const item = (0, _useTreeViewItems2.selectorItemModel)(store.value, itemId);
|
|
82
|
+
const newChildren = (0, _useTreeViewItems2.selectorItemOrderedChildrenIds)(store.value, itemId);
|
|
83
|
+
if (newChildren.length > 0) {
|
|
84
84
|
item.children = newChildren.map(getItemFromItemId);
|
|
85
|
+
} else {
|
|
86
|
+
delete item.children;
|
|
85
87
|
}
|
|
86
88
|
return item;
|
|
87
89
|
};
|
|
88
|
-
return
|
|
89
|
-
}, [
|
|
90
|
-
const
|
|
91
|
-
if (itemId == null) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
let itemMeta = instance.getItemMeta(itemId);
|
|
95
|
-
|
|
96
|
-
// This can be called before the item has been added to the item map.
|
|
97
|
-
if (!itemMeta) {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
if (itemMeta.disabled) {
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
while (itemMeta.parentId != null) {
|
|
104
|
-
itemMeta = instance.getItemMeta(itemMeta.parentId);
|
|
105
|
-
if (itemMeta.disabled) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
}, [instance]);
|
|
111
|
-
const getItemIndex = React.useCallback(itemId => {
|
|
112
|
-
const parentId = instance.getItemMeta(itemId).parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID;
|
|
113
|
-
return state.items.itemChildrenIndexes[parentId][itemId];
|
|
114
|
-
}, [instance, state.items.itemChildrenIndexes]);
|
|
115
|
-
const getItemOrderedChildrenIds = React.useCallback(itemId => state.items.itemOrderedChildrenIds[itemId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID] ?? [], [state.items.itemOrderedChildrenIds]);
|
|
90
|
+
return (0, _useTreeViewItems2.selectorItemOrderedChildrenIds)(store.value, null).map(getItemFromItemId);
|
|
91
|
+
}, [store]);
|
|
92
|
+
const getItemOrderedChildrenIds = React.useCallback(itemId => (0, _useTreeViewItems2.selectorItemOrderedChildrenIds)(store.value, itemId), [store]);
|
|
116
93
|
const getItemDOMElement = itemId => {
|
|
117
|
-
const itemMeta =
|
|
94
|
+
const itemMeta = (0, _useTreeViewItems2.selectorItemMeta)(store.value, itemId);
|
|
118
95
|
if (itemMeta == null) {
|
|
119
96
|
return null;
|
|
120
97
|
}
|
|
121
|
-
|
|
122
|
-
treeId:
|
|
98
|
+
const idAttribute = (0, _useTreeViewId2.generateTreeItemIdAttribute)({
|
|
99
|
+
treeId: (0, _useTreeViewId.selectorTreeViewId)(store.value),
|
|
123
100
|
itemId,
|
|
124
101
|
id: itemMeta.idAttribute
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
const isItemNavigable = itemId => {
|
|
128
|
-
if (params.disabledItemsFocusable) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
return !instance.isItemDisabled(itemId);
|
|
102
|
+
});
|
|
103
|
+
return document.getElementById(idAttribute);
|
|
132
104
|
};
|
|
133
105
|
const areItemUpdatesPreventedRef = React.useRef(false);
|
|
134
106
|
const preventItemUpdates = React.useCallback(() => {
|
|
@@ -139,15 +111,16 @@ const useTreeViewItems = ({
|
|
|
139
111
|
if (instance.areItemUpdatesPrevented()) {
|
|
140
112
|
return;
|
|
141
113
|
}
|
|
142
|
-
|
|
114
|
+
store.update(prevState => {
|
|
143
115
|
const newState = updateItemsState({
|
|
116
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
144
117
|
items: params.items,
|
|
145
118
|
isItemDisabled: params.isItemDisabled,
|
|
146
119
|
getItemId: params.getItemId,
|
|
147
120
|
getItemLabel: params.getItemLabel
|
|
148
121
|
});
|
|
149
|
-
Object.values(prevState.items.
|
|
150
|
-
if (!newState.
|
|
122
|
+
Object.values(prevState.items.itemMetaLookup).forEach(item => {
|
|
123
|
+
if (!newState.itemMetaLookup[item.id]) {
|
|
151
124
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
|
|
152
125
|
id: item.id
|
|
153
126
|
});
|
|
@@ -157,19 +130,19 @@ const useTreeViewItems = ({
|
|
|
157
130
|
items: newState
|
|
158
131
|
});
|
|
159
132
|
});
|
|
160
|
-
}, [instance,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
};
|
|
133
|
+
}, [instance, store, params.items, params.disabledItemsFocusable, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
134
|
+
|
|
135
|
+
// Wrap `props.onItemClick` with `useEventCallback` to prevent unneeded context updates.
|
|
136
|
+
const handleItemClick = (0, _useEventCallback.default)((event, itemId) => {
|
|
137
|
+
if (params.onItemClick) {
|
|
138
|
+
params.onItemClick(event, itemId);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const pluginContextValue = React.useMemo(() => ({
|
|
142
|
+
items: {
|
|
143
|
+
onItemClick: handleItemClick
|
|
144
|
+
}
|
|
145
|
+
}), [handleItemClick]);
|
|
173
146
|
return {
|
|
174
147
|
getRootProps: () => ({
|
|
175
148
|
style: {
|
|
@@ -183,29 +156,17 @@ const useTreeViewItems = ({
|
|
|
183
156
|
getItemOrderedChildrenIds
|
|
184
157
|
},
|
|
185
158
|
instance: {
|
|
186
|
-
getItemMeta,
|
|
187
|
-
getItem,
|
|
188
|
-
getItemTree,
|
|
189
|
-
getItemsToRender,
|
|
190
|
-
getItemIndex,
|
|
191
159
|
getItemDOMElement,
|
|
192
|
-
getItemOrderedChildrenIds,
|
|
193
|
-
isItemDisabled,
|
|
194
|
-
isItemNavigable,
|
|
195
160
|
preventItemUpdates,
|
|
196
161
|
areItemUpdatesPrevented
|
|
197
162
|
},
|
|
198
|
-
contextValue:
|
|
199
|
-
items: {
|
|
200
|
-
onItemClick: params.onItemClick,
|
|
201
|
-
disabledItemsFocusable: params.disabledItemsFocusable
|
|
202
|
-
}
|
|
203
|
-
}
|
|
163
|
+
contextValue: pluginContextValue
|
|
204
164
|
};
|
|
205
165
|
};
|
|
206
166
|
exports.useTreeViewItems = useTreeViewItems;
|
|
207
167
|
useTreeViewItems.getInitialState = params => ({
|
|
208
168
|
items: updateItemsState({
|
|
169
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
209
170
|
items: params.items,
|
|
210
171
|
isItemDisabled: params.isItemDisabled,
|
|
211
172
|
getItemId: params.getItemId,
|
|
@@ -219,11 +180,10 @@ useTreeViewItems.getDefaultizedParams = ({
|
|
|
219
180
|
itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
|
|
220
181
|
});
|
|
221
182
|
useTreeViewItems.wrapRoot = ({
|
|
222
|
-
children
|
|
223
|
-
instance
|
|
183
|
+
children
|
|
224
184
|
}) => {
|
|
225
185
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewItemDepthContext.TreeViewItemDepthContext.Provider, {
|
|
226
|
-
value:
|
|
186
|
+
value: _useTreeViewItems2.selectorItemDepth,
|
|
227
187
|
children: children
|
|
228
188
|
});
|
|
229
189
|
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.selectorItemParentId = exports.selectorItemOrderedChildrenIds = exports.selectorItemModel = exports.selectorItemMetaLookup = exports.selectorItemMeta = exports.selectorItemIndex = exports.selectorItemDepth = exports.selectorIsItemDisabled = exports.selectorCanItemBeFocused = void 0;
|
|
7
|
+
var _selectors = require("../../utils/selectors");
|
|
8
|
+
var _useTreeViewItems = require("./useTreeViewItems.utils");
|
|
9
|
+
const selectorTreeViewItemsState = state => state.items;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get the meta-information of all items.
|
|
13
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
14
|
+
* @returns {TreeViewItemMetaLookup} The meta-information of all items.
|
|
15
|
+
*/
|
|
16
|
+
const selectorItemMetaLookup = exports.selectorItemMetaLookup = (0, _selectors.createSelector)(selectorTreeViewItemsState, items => items.itemMetaLookup);
|
|
17
|
+
const EMPTY_CHILDREN = [];
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Get the ordered children ids of a given item.
|
|
21
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
22
|
+
* @param {TreeViewItemId} itemId The id of the item to get the children of.
|
|
23
|
+
* @returns {TreeViewItemId[]} The ordered children ids of the item.
|
|
24
|
+
*/
|
|
25
|
+
const selectorItemOrderedChildrenIds = exports.selectorItemOrderedChildrenIds = (0, _selectors.createSelector)([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => itemsState.itemOrderedChildrenIdsLookup[itemId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID] ?? EMPTY_CHILDREN);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get the model of an item.
|
|
29
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
30
|
+
* @param {TreeViewItemId} itemId The id of the item to get the model of.
|
|
31
|
+
* @returns {R} The model of the item.
|
|
32
|
+
*/
|
|
33
|
+
const selectorItemModel = exports.selectorItemModel = (0, _selectors.createSelector)([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => {
|
|
34
|
+
const a = itemsState.itemModelLookup[itemId];
|
|
35
|
+
return a;
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Get the meta-information of an item.
|
|
40
|
+
* Check the `TreeViewItemMeta` type for more information.
|
|
41
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>}
|
|
42
|
+
* @param {TreeViewItemId} itemId The id of the item to get the meta-information of.
|
|
43
|
+
* @returns {TreeViewItemMeta | null} The meta-information of the item.
|
|
44
|
+
*/
|
|
45
|
+
const selectorItemMeta = exports.selectorItemMeta = (0, _selectors.createSelector)([selectorItemMetaLookup, (_, itemId) => itemId], (itemMetaLookup, itemId) => itemMetaLookup[itemId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID] ?? null);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check if an item is disabled.
|
|
49
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
50
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
51
|
+
* @returns {boolean} `true` if the item is disabled, `false` otherwise.
|
|
52
|
+
*/
|
|
53
|
+
const selectorIsItemDisabled = exports.selectorIsItemDisabled = (0, _selectors.createSelector)([selectorItemMetaLookup, (_, itemId) => itemId], (itemMetaLookup, itemId) => {
|
|
54
|
+
if (itemId == null) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
let itemMeta = itemMetaLookup[itemId];
|
|
58
|
+
|
|
59
|
+
// This can be called before the item has been added to the item map.
|
|
60
|
+
if (!itemMeta) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (itemMeta.disabled) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
while (itemMeta.parentId != null) {
|
|
67
|
+
itemMeta = itemMetaLookup[itemMeta.parentId];
|
|
68
|
+
if (itemMeta.disabled) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get the index of an item in its parent's children.
|
|
77
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
78
|
+
* @param {TreeViewItemId} itemId The id of the item to get the index of.
|
|
79
|
+
* @returns {number} The index of the item in its parent's children.
|
|
80
|
+
*/
|
|
81
|
+
const selectorItemIndex = exports.selectorItemIndex = (0, _selectors.createSelector)([selectorTreeViewItemsState, selectorItemMeta], (itemsState, itemMeta) => {
|
|
82
|
+
if (itemMeta == null) {
|
|
83
|
+
return -1;
|
|
84
|
+
}
|
|
85
|
+
const parentIndexes = itemsState.itemChildrenIndexesLookup[itemMeta.parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID];
|
|
86
|
+
return parentIndexes[itemMeta.id];
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get the id of the parent of an item.
|
|
91
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
92
|
+
* @param {TreeViewItemId} itemId The id of the item to get the parent id of.
|
|
93
|
+
* @returns {TreeViewItemId | null} The id of the parent of the item.
|
|
94
|
+
*/
|
|
95
|
+
const selectorItemParentId = exports.selectorItemParentId = (0, _selectors.createSelector)([selectorItemMeta], itemMeta => itemMeta?.parentId ?? null);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the depth of an item (items at the root level have a depth of 0).
|
|
99
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
100
|
+
* @param {TreeViewItemId} itemId The id of the item to get the depth of.
|
|
101
|
+
* @returns {number} The depth of the item.
|
|
102
|
+
*/
|
|
103
|
+
const selectorItemDepth = exports.selectorItemDepth = (0, _selectors.createSelector)([selectorItemMeta], itemMeta => itemMeta?.depth ?? 0);
|
|
104
|
+
const selectorCanItemBeFocused = exports.selectorCanItemBeFocused = (0, _selectors.createSelector)([selectorTreeViewItemsState, selectorIsItemDisabled], (itemsState, isItemDisabled) => {
|
|
105
|
+
if (itemsState.disabledItemsFocusable) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return !isItemDisabled;
|
|
109
|
+
});
|