@mui/x-tree-view 8.0.0-alpha.0 → 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 +429 -5
- package/README.md +2 -2
- package/RichTreeView/RichTreeView.js +2 -4
- package/RichTreeView/RichTreeView.types.d.ts +3 -16
- package/TreeItem/TreeItem.js +4 -4
- package/TreeItem/TreeItem.types.d.ts +3 -1
- package/TreeItemProvider/TreeItemProvider.js +16 -3
- 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 +2 -1
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
- 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 +4 -2
- package/internals/components/RichTreeViewItems.d.ts +2 -4
- 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/itemPlugin.d.ts +4 -4
- package/internals/models/plugin.d.ts +19 -7
- 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 +6 -14
- 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 -98
- 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 +15 -52
- 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 +8 -6
- 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.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 +3 -2
- package/modern/RichTreeView/RichTreeView.js +2 -4
- package/modern/TreeItem/TreeItem.js +4 -4
- package/modern/TreeItemProvider/TreeItemProvider.js +16 -3
- 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/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 -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 +8 -6
- 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 +26 -11
- package/node/RichTreeView/RichTreeView.js +2 -4
- package/node/TreeItem/TreeItem.js +4 -4
- package/node/TreeItemProvider/TreeItemProvider.js +16 -3
- 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/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 -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 +8 -6
- 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 +26 -11
- package/package.json +6 -4
- package/useTreeItem/useTreeItem.js +26 -11
- package/useTreeItem/useTreeItem.types.d.ts +9 -0
|
@@ -1,16 +1,19 @@
|
|
|
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.useTreeViewBuildContext = void 0;
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
7
9
|
const useTreeViewBuildContext = ({
|
|
8
10
|
plugins,
|
|
9
11
|
instance,
|
|
10
12
|
publicAPI,
|
|
13
|
+
store,
|
|
11
14
|
rootRef
|
|
12
15
|
}) => {
|
|
13
|
-
const runItemPlugins = itemPluginProps => {
|
|
16
|
+
const runItemPlugins = React.useCallback(itemPluginProps => {
|
|
14
17
|
let finalRootRef = null;
|
|
15
18
|
let finalContentRef = null;
|
|
16
19
|
const pluginPropEnhancers = [];
|
|
@@ -55,10 +58,11 @@ const useTreeViewBuildContext = ({
|
|
|
55
58
|
rootRef: finalRootRef,
|
|
56
59
|
propsEnhancers
|
|
57
60
|
};
|
|
58
|
-
};
|
|
59
|
-
const wrapItem = ({
|
|
61
|
+
}, [plugins]);
|
|
62
|
+
const wrapItem = React.useCallback(({
|
|
60
63
|
itemId,
|
|
61
|
-
children
|
|
64
|
+
children,
|
|
65
|
+
idAttribute
|
|
62
66
|
}) => {
|
|
63
67
|
let finalChildren = children;
|
|
64
68
|
// The wrappers are reversed to ensure that the first wrapper is the outermost one.
|
|
@@ -66,15 +70,16 @@ const useTreeViewBuildContext = ({
|
|
|
66
70
|
const plugin = plugins[i];
|
|
67
71
|
if (plugin.wrapItem) {
|
|
68
72
|
finalChildren = plugin.wrapItem({
|
|
73
|
+
instance,
|
|
69
74
|
itemId,
|
|
70
75
|
children: finalChildren,
|
|
71
|
-
|
|
76
|
+
idAttribute
|
|
72
77
|
});
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
80
|
return finalChildren;
|
|
76
|
-
};
|
|
77
|
-
const wrapRoot = ({
|
|
81
|
+
}, [plugins, instance]);
|
|
82
|
+
const wrapRoot = React.useCallback(({
|
|
78
83
|
children
|
|
79
84
|
}) => {
|
|
80
85
|
let finalChildren = children;
|
|
@@ -83,20 +88,22 @@ const useTreeViewBuildContext = ({
|
|
|
83
88
|
const plugin = plugins[i];
|
|
84
89
|
if (plugin.wrapRoot) {
|
|
85
90
|
finalChildren = plugin.wrapRoot({
|
|
86
|
-
children: finalChildren
|
|
87
|
-
instance
|
|
91
|
+
children: finalChildren
|
|
88
92
|
});
|
|
89
93
|
}
|
|
90
94
|
}
|
|
91
95
|
return finalChildren;
|
|
92
|
-
};
|
|
93
|
-
return {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
}, [plugins]);
|
|
97
|
+
return React.useMemo(() => {
|
|
98
|
+
return {
|
|
99
|
+
runItemPlugins,
|
|
100
|
+
wrapItem,
|
|
101
|
+
wrapRoot,
|
|
102
|
+
instance,
|
|
103
|
+
publicAPI,
|
|
104
|
+
store,
|
|
105
|
+
rootRef
|
|
106
|
+
};
|
|
107
|
+
}, [runItemPlugins, wrapItem, wrapRoot, instance, publicAPI, store, rootRef]);
|
|
101
108
|
};
|
|
102
109
|
exports.useTreeViewBuildContext = useTreeViewBuildContext;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.TreeViewStore = void 0;
|
|
7
|
+
class TreeViewStore {
|
|
8
|
+
constructor(value) {
|
|
9
|
+
this.value = void 0;
|
|
10
|
+
this.listeners = void 0;
|
|
11
|
+
this.subscribe = fn => {
|
|
12
|
+
this.listeners.add(fn);
|
|
13
|
+
return () => {
|
|
14
|
+
this.listeners.delete(fn);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
this.getSnapshot = () => {
|
|
18
|
+
return this.value;
|
|
19
|
+
};
|
|
20
|
+
this.update = updater => {
|
|
21
|
+
const newState = updater(this.value);
|
|
22
|
+
if (newState !== this.value) {
|
|
23
|
+
this.value = newState;
|
|
24
|
+
this.listeners.forEach(l => l(newState));
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
this.value = value;
|
|
28
|
+
this.listeners = new Set();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.TreeViewStore = TreeViewStore;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createSelector = void 0;
|
|
7
|
+
var _reselect = require("reselect");
|
|
8
|
+
const reselectCreateSelector = (0, _reselect.createSelectorCreator)({
|
|
9
|
+
memoize: _reselect.lruMemoize,
|
|
10
|
+
memoizeOptions: {
|
|
11
|
+
maxSize: 1,
|
|
12
|
+
equalityCheck: Object.is
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const cache = new WeakMap();
|
|
16
|
+
/**
|
|
17
|
+
* Method wrapping reselect's createSelector to provide caching for tree view instances.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
const createSelector = (...createSelectorArgs) => {
|
|
21
|
+
const selector = (state, selectorArgs) => {
|
|
22
|
+
const cacheKey = state.cacheKey;
|
|
23
|
+
|
|
24
|
+
// If there is no cache for the current tree view instance, create one.
|
|
25
|
+
let cacheForCurrentTreeViewInstance = cache.get(cacheKey);
|
|
26
|
+
if (!cacheForCurrentTreeViewInstance) {
|
|
27
|
+
cacheForCurrentTreeViewInstance = new Map();
|
|
28
|
+
cache.set(cacheKey, cacheForCurrentTreeViewInstance);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// If there is a cached selector, execute it.
|
|
32
|
+
const cachedSelector = cacheForCurrentTreeViewInstance.get(createSelectorArgs);
|
|
33
|
+
if (cachedSelector) {
|
|
34
|
+
return cachedSelector(state, selectorArgs);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Otherwise, create a new selector and cache it and execute it.
|
|
38
|
+
const fn = reselectCreateSelector(...createSelectorArgs);
|
|
39
|
+
cacheForCurrentTreeViewInstance.set(createSelectorArgs, fn);
|
|
40
|
+
return fn(state, selectorArgs);
|
|
41
|
+
};
|
|
42
|
+
return selector;
|
|
43
|
+
};
|
|
44
|
+
exports.createSelector = createSelector;
|
|
@@ -4,10 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.isTargetInDescendants = exports.getPreviousNavigableItem = exports.getNonDisabledItemsInRange = exports.getNextNavigableItem = exports.getLastNavigableItem = exports.getFirstNavigableItem = exports.getAllNavigableItems = exports.findOrderInTremauxTree = void 0;
|
|
7
|
-
|
|
7
|
+
var _useTreeViewExpansion = require("../plugins/useTreeViewExpansion/useTreeViewExpansion.selectors");
|
|
8
|
+
var _useTreeViewItems = require("../plugins/useTreeViewItems/useTreeViewItems.selectors");
|
|
9
|
+
const getLastNavigableItemInArray = (state, items) => {
|
|
8
10
|
// Equivalent to Array.prototype.findLastIndex
|
|
9
11
|
let itemIndex = items.length - 1;
|
|
10
|
-
while (itemIndex >= 0 && !
|
|
12
|
+
while (itemIndex >= 0 && !(0, _useTreeViewItems.selectorCanItemBeFocused)(state, items[itemIndex])) {
|
|
11
13
|
itemIndex -= 1;
|
|
12
14
|
}
|
|
13
15
|
if (itemIndex === -1) {
|
|
@@ -15,10 +17,13 @@ const getLastNavigableItemInArray = (instance, items) => {
|
|
|
15
17
|
}
|
|
16
18
|
return items[itemIndex];
|
|
17
19
|
};
|
|
18
|
-
const getPreviousNavigableItem = (
|
|
19
|
-
const itemMeta =
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const getPreviousNavigableItem = (state, itemId) => {
|
|
21
|
+
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
|
|
22
|
+
if (!itemMeta) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
|
|
26
|
+
const itemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemId);
|
|
22
27
|
|
|
23
28
|
// TODO: What should we do if the parent is not navigable?
|
|
24
29
|
if (itemIndex === 0) {
|
|
@@ -27,7 +32,7 @@ const getPreviousNavigableItem = (instance, itemId) => {
|
|
|
27
32
|
|
|
28
33
|
// Finds the previous navigable sibling.
|
|
29
34
|
let previousNavigableSiblingIndex = itemIndex - 1;
|
|
30
|
-
while (!
|
|
35
|
+
while (!(0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[previousNavigableSiblingIndex]) && previousNavigableSiblingIndex >= 0) {
|
|
31
36
|
previousNavigableSiblingIndex -= 1;
|
|
32
37
|
}
|
|
33
38
|
if (previousNavigableSiblingIndex === -1) {
|
|
@@ -37,53 +42,53 @@ const getPreviousNavigableItem = (instance, itemId) => {
|
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
// Otherwise, we can try to go up a level and find the previous navigable item.
|
|
40
|
-
return getPreviousNavigableItem(
|
|
45
|
+
return getPreviousNavigableItem(state, itemMeta.parentId);
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
// Finds the last navigable ancestor of the previous navigable sibling.
|
|
44
49
|
let currentItemId = siblings[previousNavigableSiblingIndex];
|
|
45
|
-
let lastNavigableChild = getLastNavigableItemInArray(
|
|
46
|
-
while (
|
|
50
|
+
let lastNavigableChild = getLastNavigableItemInArray(state, (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, currentItemId));
|
|
51
|
+
while ((0, _useTreeViewExpansion.selectorIsItemExpanded)(state, currentItemId) && lastNavigableChild != null) {
|
|
47
52
|
currentItemId = lastNavigableChild;
|
|
48
|
-
lastNavigableChild =
|
|
53
|
+
lastNavigableChild = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, currentItemId).find(childId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, childId));
|
|
49
54
|
}
|
|
50
55
|
return currentItemId;
|
|
51
56
|
};
|
|
52
57
|
exports.getPreviousNavigableItem = getPreviousNavigableItem;
|
|
53
|
-
const getNextNavigableItem = (
|
|
58
|
+
const getNextNavigableItem = (state, itemId) => {
|
|
54
59
|
// If the item is expanded and has some navigable children, return the first of them.
|
|
55
|
-
if (
|
|
56
|
-
const firstNavigableChild =
|
|
60
|
+
if ((0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
|
|
61
|
+
const firstNavigableChild = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId).find(childId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, childId));
|
|
57
62
|
if (firstNavigableChild != null) {
|
|
58
63
|
return firstNavigableChild;
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
|
-
let itemMeta =
|
|
66
|
+
let itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
|
|
62
67
|
while (itemMeta != null) {
|
|
63
68
|
// Try to find the first navigable sibling after the current item.
|
|
64
|
-
const siblings =
|
|
65
|
-
const currentItemIndex =
|
|
69
|
+
const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
|
|
70
|
+
const currentItemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemMeta.id);
|
|
66
71
|
if (currentItemIndex < siblings.length - 1) {
|
|
67
72
|
let nextItemIndex = currentItemIndex + 1;
|
|
68
|
-
while (!
|
|
73
|
+
while (!(0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[nextItemIndex]) && nextItemIndex < siblings.length - 1) {
|
|
69
74
|
nextItemIndex += 1;
|
|
70
75
|
}
|
|
71
|
-
if (
|
|
76
|
+
if ((0, _useTreeViewItems.selectorCanItemBeFocused)(state, siblings[nextItemIndex])) {
|
|
72
77
|
return siblings[nextItemIndex];
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
// If the sibling does not exist, go up a level to the parent and try again.
|
|
77
|
-
itemMeta =
|
|
82
|
+
itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemMeta.parentId);
|
|
78
83
|
}
|
|
79
84
|
return null;
|
|
80
85
|
};
|
|
81
86
|
exports.getNextNavigableItem = getNextNavigableItem;
|
|
82
|
-
const getLastNavigableItem =
|
|
87
|
+
const getLastNavigableItem = state => {
|
|
83
88
|
let itemId = null;
|
|
84
|
-
while (itemId == null ||
|
|
85
|
-
const children =
|
|
86
|
-
const lastNavigableChild = getLastNavigableItemInArray(
|
|
89
|
+
while (itemId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
|
|
90
|
+
const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId);
|
|
91
|
+
const lastNavigableChild = getLastNavigableItemInArray(state, children);
|
|
87
92
|
|
|
88
93
|
// The item has no navigable children.
|
|
89
94
|
if (lastNavigableChild == null) {
|
|
@@ -94,7 +99,7 @@ const getLastNavigableItem = instance => {
|
|
|
94
99
|
return itemId;
|
|
95
100
|
};
|
|
96
101
|
exports.getLastNavigableItem = getLastNavigableItem;
|
|
97
|
-
const getFirstNavigableItem =
|
|
102
|
+
const getFirstNavigableItem = state => (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, null).find(itemId => (0, _useTreeViewItems.selectorCanItemBeFocused)(state, itemId));
|
|
98
103
|
|
|
99
104
|
/**
|
|
100
105
|
* This is used to determine the start and end of a selection range so
|
|
@@ -111,12 +116,15 @@ const getFirstNavigableItem = instance => instance.getItemOrderedChildrenIds(nul
|
|
|
111
116
|
* https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree
|
|
112
117
|
*/
|
|
113
118
|
exports.getFirstNavigableItem = getFirstNavigableItem;
|
|
114
|
-
const findOrderInTremauxTree = (
|
|
119
|
+
const findOrderInTremauxTree = (state, itemAId, itemBId) => {
|
|
115
120
|
if (itemAId === itemBId) {
|
|
116
121
|
return [itemAId, itemBId];
|
|
117
122
|
}
|
|
118
|
-
const itemMetaA =
|
|
119
|
-
const itemMetaB =
|
|
123
|
+
const itemMetaA = (0, _useTreeViewItems.selectorItemMeta)(state, itemAId);
|
|
124
|
+
const itemMetaB = (0, _useTreeViewItems.selectorItemMeta)(state, itemBId);
|
|
125
|
+
if (!itemMetaA || !itemMetaB) {
|
|
126
|
+
return [itemAId, itemBId];
|
|
127
|
+
}
|
|
120
128
|
if (itemMetaA.parentId === itemMetaB.id || itemMetaB.parentId === itemMetaA.id) {
|
|
121
129
|
return itemMetaB.parentId === itemMetaA.id ? [itemMetaA.id, itemMetaB.id] : [itemMetaB.id, itemMetaA.id];
|
|
122
130
|
}
|
|
@@ -134,7 +142,7 @@ const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
|
|
|
134
142
|
aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
|
|
135
143
|
continueA = aAncestor !== null;
|
|
136
144
|
if (!aAncestorIsCommon && continueA) {
|
|
137
|
-
aAncestor =
|
|
145
|
+
aAncestor = (0, _useTreeViewItems.selectorItemParentId)(state, aAncestor);
|
|
138
146
|
}
|
|
139
147
|
}
|
|
140
148
|
if (continueB && !aAncestorIsCommon) {
|
|
@@ -142,55 +150,55 @@ const findOrderInTremauxTree = (instance, itemAId, itemBId) => {
|
|
|
142
150
|
bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
|
|
143
151
|
continueB = bAncestor !== null;
|
|
144
152
|
if (!bAncestorIsCommon && continueB) {
|
|
145
|
-
bAncestor =
|
|
153
|
+
bAncestor = (0, _useTreeViewItems.selectorItemParentId)(state, bAncestor);
|
|
146
154
|
}
|
|
147
155
|
}
|
|
148
156
|
}
|
|
149
157
|
const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
|
|
150
|
-
const ancestorFamily =
|
|
158
|
+
const ancestorFamily = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, commonAncestor);
|
|
151
159
|
const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
|
|
152
160
|
const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
|
|
153
161
|
return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [itemAId, itemBId] : [itemBId, itemAId];
|
|
154
162
|
};
|
|
155
163
|
exports.findOrderInTremauxTree = findOrderInTremauxTree;
|
|
156
|
-
const getNonDisabledItemsInRange = (
|
|
164
|
+
const getNonDisabledItemsInRange = (state, itemAId, itemBId) => {
|
|
157
165
|
const getNextItem = itemId => {
|
|
158
166
|
// If the item is expanded and has some children, return the first of them.
|
|
159
|
-
if (
|
|
160
|
-
return
|
|
167
|
+
if ((0, _useTreeViewExpansion.selectorIsItemExpandable)(state, itemId) && (0, _useTreeViewExpansion.selectorIsItemExpanded)(state, itemId)) {
|
|
168
|
+
return (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId)[0];
|
|
161
169
|
}
|
|
162
|
-
let itemMeta =
|
|
170
|
+
let itemMeta = (0, _useTreeViewItems.selectorItemMeta)(state, itemId);
|
|
163
171
|
while (itemMeta != null) {
|
|
164
172
|
// Try to find the first navigable sibling after the current item.
|
|
165
|
-
const siblings =
|
|
166
|
-
const currentItemIndex =
|
|
173
|
+
const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemMeta.parentId);
|
|
174
|
+
const currentItemIndex = (0, _useTreeViewItems.selectorItemIndex)(state, itemMeta.id);
|
|
167
175
|
if (currentItemIndex < siblings.length - 1) {
|
|
168
176
|
return siblings[currentItemIndex + 1];
|
|
169
177
|
}
|
|
170
178
|
|
|
171
179
|
// If the item is the last of its siblings, go up a level to the parent and try again.
|
|
172
|
-
itemMeta =
|
|
180
|
+
itemMeta = itemMeta.parentId ? (0, _useTreeViewItems.selectorItemMeta)(state, itemMeta.parentId) : null;
|
|
173
181
|
}
|
|
174
182
|
throw new Error('Invalid range');
|
|
175
183
|
};
|
|
176
|
-
const [first, last] = findOrderInTremauxTree(
|
|
184
|
+
const [first, last] = findOrderInTremauxTree(state, itemAId, itemBId);
|
|
177
185
|
const items = [first];
|
|
178
186
|
let current = first;
|
|
179
187
|
while (current !== last) {
|
|
180
188
|
current = getNextItem(current);
|
|
181
|
-
if (!
|
|
189
|
+
if (!(0, _useTreeViewItems.selectorIsItemDisabled)(state, current)) {
|
|
182
190
|
items.push(current);
|
|
183
191
|
}
|
|
184
192
|
}
|
|
185
193
|
return items;
|
|
186
194
|
};
|
|
187
195
|
exports.getNonDisabledItemsInRange = getNonDisabledItemsInRange;
|
|
188
|
-
const getAllNavigableItems =
|
|
189
|
-
let item = getFirstNavigableItem(
|
|
196
|
+
const getAllNavigableItems = state => {
|
|
197
|
+
let item = getFirstNavigableItem(state);
|
|
190
198
|
const navigableItems = [];
|
|
191
199
|
while (item != null) {
|
|
192
200
|
navigableItems.push(item);
|
|
193
|
-
item = getNextNavigableItem(
|
|
201
|
+
item = getNextNavigableItem(state, item);
|
|
194
202
|
}
|
|
195
203
|
return navigableItems;
|
|
196
204
|
};
|
|
@@ -15,13 +15,16 @@ var _TreeViewProvider = require("../internals/TreeViewProvider");
|
|
|
15
15
|
var _useTreeItemUtils = require("../hooks/useTreeItemUtils");
|
|
16
16
|
var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
|
|
17
17
|
var _tree = require("../internals/utils/tree");
|
|
18
|
+
var _useSelector = require("../internals/hooks/useSelector");
|
|
19
|
+
var _useTreeViewFocus = require("../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors");
|
|
18
20
|
var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
|
|
21
|
+
var _useTreeViewItems = require("../internals/plugins/useTreeViewItems/useTreeViewItems.selectors");
|
|
22
|
+
var _useTreeViewId2 = require("../internals/corePlugins/useTreeViewId/useTreeViewId.selectors");
|
|
19
23
|
const useTreeItem = parameters => {
|
|
20
24
|
const {
|
|
21
25
|
runItemPlugins,
|
|
22
26
|
items: {
|
|
23
|
-
onItemClick
|
|
24
|
-
disabledItemsFocusable
|
|
27
|
+
onItemClick
|
|
25
28
|
},
|
|
26
29
|
selection: {
|
|
27
30
|
disableSelection,
|
|
@@ -30,11 +33,18 @@ const useTreeItem = parameters => {
|
|
|
30
33
|
expansion: {
|
|
31
34
|
expansionTrigger
|
|
32
35
|
},
|
|
33
|
-
|
|
36
|
+
label: labelContext,
|
|
34
37
|
instance,
|
|
35
|
-
publicAPI
|
|
38
|
+
publicAPI,
|
|
39
|
+
store
|
|
36
40
|
} = (0, _TreeViewProvider.useTreeViewContext)();
|
|
37
41
|
const depthContext = React.useContext(_TreeViewItemDepthContext.TreeViewItemDepthContext);
|
|
42
|
+
const depth = (0, _useSelector.useSelector)(store, (...params) => {
|
|
43
|
+
if (typeof depthContext === 'function') {
|
|
44
|
+
return depthContext(...params);
|
|
45
|
+
}
|
|
46
|
+
return depthContext;
|
|
47
|
+
}, parameters.itemId);
|
|
38
48
|
const {
|
|
39
49
|
id,
|
|
40
50
|
itemId,
|
|
@@ -59,12 +69,13 @@ const useTreeItem = parameters => {
|
|
|
59
69
|
const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef, rootRefObject);
|
|
60
70
|
const handleContentRef = (0, _useForkRef.default)(contentRef, contentRefObject);
|
|
61
71
|
const checkboxRef = React.useRef(null);
|
|
72
|
+
const treeId = (0, _useSelector.useSelector)(store, _useTreeViewId2.selectorTreeViewId);
|
|
62
73
|
const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
|
|
63
74
|
itemId,
|
|
64
75
|
treeId,
|
|
65
76
|
id
|
|
66
77
|
});
|
|
67
|
-
const
|
|
78
|
+
const shouldBeAccessibleWithTab = (0, _useSelector.useSelector)(store, _useTreeViewFocus.selectorIsItemTheDefaultFocusableItem, itemId);
|
|
68
79
|
const sharedPropsEnhancerParams = {
|
|
69
80
|
rootRefObject,
|
|
70
81
|
contentRefObject,
|
|
@@ -76,8 +87,7 @@ const useTreeItem = parameters => {
|
|
|
76
87
|
if (event.defaultMuiPrevented) {
|
|
77
88
|
return;
|
|
78
89
|
}
|
|
79
|
-
|
|
80
|
-
if (!status.focused && canBeFocused && event.currentTarget === event.target) {
|
|
90
|
+
if (!status.focused && (0, _useTreeViewItems.selectorCanItemBeFocused)(store.value, itemId) && event.currentTarget === event.target) {
|
|
81
91
|
instance.focusItem(event, itemId);
|
|
82
92
|
}
|
|
83
93
|
};
|
|
@@ -115,7 +125,7 @@ const useTreeItem = parameters => {
|
|
|
115
125
|
};
|
|
116
126
|
const createContentHandleClick = otherHandlers => event => {
|
|
117
127
|
otherHandlers.onClick?.(event);
|
|
118
|
-
onItemClick
|
|
128
|
+
onItemClick(event, itemId);
|
|
119
129
|
if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
|
|
120
130
|
return;
|
|
121
131
|
}
|
|
@@ -146,6 +156,10 @@ const useTreeItem = parameters => {
|
|
|
146
156
|
interactions.handleExpansion(event);
|
|
147
157
|
}
|
|
148
158
|
};
|
|
159
|
+
const getContextProviderProps = () => ({
|
|
160
|
+
itemId,
|
|
161
|
+
id
|
|
162
|
+
});
|
|
149
163
|
const getRootProps = (externalProps = {}) => {
|
|
150
164
|
const externalEventHandlers = (0, _extends2.default)({}, (0, _extractEventHandlers.default)(parameters), (0, _extractEventHandlers.default)(externalProps));
|
|
151
165
|
|
|
@@ -164,14 +178,14 @@ const useTreeItem = parameters => {
|
|
|
164
178
|
const props = (0, _extends2.default)({}, externalEventHandlers, {
|
|
165
179
|
ref: handleRootRef,
|
|
166
180
|
role: 'treeitem',
|
|
167
|
-
tabIndex:
|
|
181
|
+
tabIndex: shouldBeAccessibleWithTab ? 0 : -1,
|
|
168
182
|
id: idAttribute,
|
|
169
183
|
'aria-expanded': status.expandable ? status.expanded : undefined,
|
|
170
184
|
'aria-selected': ariaSelected,
|
|
171
185
|
'aria-disabled': status.disabled || undefined
|
|
172
186
|
}, externalProps, {
|
|
173
187
|
style: (0, _extends2.default)({}, externalProps.style ?? {}, {
|
|
174
|
-
'--TreeView-itemDepth':
|
|
188
|
+
'--TreeView-itemDepth': depth
|
|
175
189
|
}),
|
|
176
190
|
onFocus: createRootHandleFocus(externalEventHandlers),
|
|
177
191
|
onBlur: createRootHandleBlur(externalEventHandlers),
|
|
@@ -212,7 +226,7 @@ const useTreeItem = parameters => {
|
|
|
212
226
|
}, externalProps, {
|
|
213
227
|
onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
|
|
214
228
|
});
|
|
215
|
-
if (
|
|
229
|
+
if (labelContext?.isItemEditable) {
|
|
216
230
|
props.editable = status.editable;
|
|
217
231
|
}
|
|
218
232
|
return props;
|
|
@@ -249,6 +263,7 @@ const useTreeItem = parameters => {
|
|
|
249
263
|
return (0, _extends2.default)({}, externalProps, enhancedDragAndDropOverlayProps);
|
|
250
264
|
};
|
|
251
265
|
return {
|
|
266
|
+
getContextProviderProps,
|
|
252
267
|
getRootProps,
|
|
253
268
|
getContentProps,
|
|
254
269
|
getGroupTransitionProps,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "8.0.0-alpha.
|
|
3
|
+
"version": "8.0.0-alpha.1",
|
|
4
4
|
"description": "The community edition of the Tree View components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -39,15 +39,17 @@
|
|
|
39
39
|
"clsx": "^2.1.1",
|
|
40
40
|
"prop-types": "^15.8.1",
|
|
41
41
|
"react-transition-group": "^4.4.5",
|
|
42
|
-
"
|
|
42
|
+
"reselect": "^5.1.1",
|
|
43
|
+
"use-sync-external-store": "^1.2.2",
|
|
44
|
+
"@mui/x-internals": "8.0.0-alpha.1"
|
|
43
45
|
},
|
|
44
46
|
"peerDependencies": {
|
|
45
47
|
"@emotion/react": "^11.9.0",
|
|
46
48
|
"@emotion/styled": "^11.8.1",
|
|
47
49
|
"@mui/material": "^5.15.14 || ^6.0.0",
|
|
48
50
|
"@mui/system": "^5.15.14 || ^6.0.0",
|
|
49
|
-
"react": "^17.0.0 || ^18.0.0",
|
|
50
|
-
"react-dom": "^17.0.0 || ^18.0.0"
|
|
51
|
+
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
52
|
+
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
|
|
51
53
|
},
|
|
52
54
|
"peerDependenciesMeta": {
|
|
53
55
|
"@emotion/react": {
|
|
@@ -8,13 +8,16 @@ import { useTreeViewContext } from "../internals/TreeViewProvider/index.js";
|
|
|
8
8
|
import { useTreeItemUtils } from "../hooks/useTreeItemUtils/index.js";
|
|
9
9
|
import { TreeViewItemDepthContext } from "../internals/TreeViewItemDepthContext/index.js";
|
|
10
10
|
import { isTargetInDescendants } from "../internals/utils/tree.js";
|
|
11
|
+
import { useSelector } from "../internals/hooks/useSelector.js";
|
|
12
|
+
import { selectorIsItemTheDefaultFocusableItem } from "../internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js";
|
|
11
13
|
import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
14
|
+
import { selectorCanItemBeFocused } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
|
|
15
|
+
import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
12
16
|
export const useTreeItem = parameters => {
|
|
13
17
|
const {
|
|
14
18
|
runItemPlugins,
|
|
15
19
|
items: {
|
|
16
|
-
onItemClick
|
|
17
|
-
disabledItemsFocusable
|
|
20
|
+
onItemClick
|
|
18
21
|
},
|
|
19
22
|
selection: {
|
|
20
23
|
disableSelection,
|
|
@@ -23,11 +26,18 @@ export const useTreeItem = parameters => {
|
|
|
23
26
|
expansion: {
|
|
24
27
|
expansionTrigger
|
|
25
28
|
},
|
|
26
|
-
|
|
29
|
+
label: labelContext,
|
|
27
30
|
instance,
|
|
28
|
-
publicAPI
|
|
31
|
+
publicAPI,
|
|
32
|
+
store
|
|
29
33
|
} = useTreeViewContext();
|
|
30
34
|
const depthContext = React.useContext(TreeViewItemDepthContext);
|
|
35
|
+
const depth = useSelector(store, (...params) => {
|
|
36
|
+
if (typeof depthContext === 'function') {
|
|
37
|
+
return depthContext(...params);
|
|
38
|
+
}
|
|
39
|
+
return depthContext;
|
|
40
|
+
}, parameters.itemId);
|
|
31
41
|
const {
|
|
32
42
|
id,
|
|
33
43
|
itemId,
|
|
@@ -52,12 +62,13 @@ export const useTreeItem = parameters => {
|
|
|
52
62
|
const handleRootRef = useForkRef(rootRef, pluginRootRef, rootRefObject);
|
|
53
63
|
const handleContentRef = useForkRef(contentRef, contentRefObject);
|
|
54
64
|
const checkboxRef = React.useRef(null);
|
|
65
|
+
const treeId = useSelector(store, selectorTreeViewId);
|
|
55
66
|
const idAttribute = generateTreeItemIdAttribute({
|
|
56
67
|
itemId,
|
|
57
68
|
treeId,
|
|
58
69
|
id
|
|
59
70
|
});
|
|
60
|
-
const
|
|
71
|
+
const shouldBeAccessibleWithTab = useSelector(store, selectorIsItemTheDefaultFocusableItem, itemId);
|
|
61
72
|
const sharedPropsEnhancerParams = {
|
|
62
73
|
rootRefObject,
|
|
63
74
|
contentRefObject,
|
|
@@ -69,8 +80,7 @@ export const useTreeItem = parameters => {
|
|
|
69
80
|
if (event.defaultMuiPrevented) {
|
|
70
81
|
return;
|
|
71
82
|
}
|
|
72
|
-
|
|
73
|
-
if (!status.focused && canBeFocused && event.currentTarget === event.target) {
|
|
83
|
+
if (!status.focused && selectorCanItemBeFocused(store.value, itemId) && event.currentTarget === event.target) {
|
|
74
84
|
instance.focusItem(event, itemId);
|
|
75
85
|
}
|
|
76
86
|
};
|
|
@@ -108,7 +118,7 @@ export const useTreeItem = parameters => {
|
|
|
108
118
|
};
|
|
109
119
|
const createContentHandleClick = otherHandlers => event => {
|
|
110
120
|
otherHandlers.onClick?.(event);
|
|
111
|
-
onItemClick
|
|
121
|
+
onItemClick(event, itemId);
|
|
112
122
|
if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
|
|
113
123
|
return;
|
|
114
124
|
}
|
|
@@ -139,6 +149,10 @@ export const useTreeItem = parameters => {
|
|
|
139
149
|
interactions.handleExpansion(event);
|
|
140
150
|
}
|
|
141
151
|
};
|
|
152
|
+
const getContextProviderProps = () => ({
|
|
153
|
+
itemId,
|
|
154
|
+
id
|
|
155
|
+
});
|
|
142
156
|
const getRootProps = (externalProps = {}) => {
|
|
143
157
|
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
144
158
|
|
|
@@ -157,14 +171,14 @@ export const useTreeItem = parameters => {
|
|
|
157
171
|
const props = _extends({}, externalEventHandlers, {
|
|
158
172
|
ref: handleRootRef,
|
|
159
173
|
role: 'treeitem',
|
|
160
|
-
tabIndex:
|
|
174
|
+
tabIndex: shouldBeAccessibleWithTab ? 0 : -1,
|
|
161
175
|
id: idAttribute,
|
|
162
176
|
'aria-expanded': status.expandable ? status.expanded : undefined,
|
|
163
177
|
'aria-selected': ariaSelected,
|
|
164
178
|
'aria-disabled': status.disabled || undefined
|
|
165
179
|
}, externalProps, {
|
|
166
180
|
style: _extends({}, externalProps.style ?? {}, {
|
|
167
|
-
'--TreeView-itemDepth':
|
|
181
|
+
'--TreeView-itemDepth': depth
|
|
168
182
|
}),
|
|
169
183
|
onFocus: createRootHandleFocus(externalEventHandlers),
|
|
170
184
|
onBlur: createRootHandleBlur(externalEventHandlers),
|
|
@@ -205,7 +219,7 @@ export const useTreeItem = parameters => {
|
|
|
205
219
|
}, externalProps, {
|
|
206
220
|
onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
|
|
207
221
|
});
|
|
208
|
-
if (
|
|
222
|
+
if (labelContext?.isItemEditable) {
|
|
209
223
|
props.editable = status.editable;
|
|
210
224
|
}
|
|
211
225
|
return props;
|
|
@@ -242,6 +256,7 @@ export const useTreeItem = parameters => {
|
|
|
242
256
|
return _extends({}, externalProps, enhancedDragAndDropOverlayProps);
|
|
243
257
|
};
|
|
244
258
|
return {
|
|
259
|
+
getContextProviderProps,
|
|
245
260
|
getRootProps,
|
|
246
261
|
getContentProps,
|
|
247
262
|
getGroupTransitionProps,
|
|
@@ -32,6 +32,10 @@ export interface UseTreeItemParameters {
|
|
|
32
32
|
*/
|
|
33
33
|
children?: React.ReactNode;
|
|
34
34
|
}
|
|
35
|
+
export interface UseTreeItemContextProviderProps {
|
|
36
|
+
itemId: string;
|
|
37
|
+
id: string | undefined;
|
|
38
|
+
}
|
|
35
39
|
export interface UseTreeItemRootSlotPropsFromUseTreeItem {
|
|
36
40
|
role: 'treeitem';
|
|
37
41
|
tabIndex: 0 | -1;
|
|
@@ -98,6 +102,11 @@ export interface UseTreeItemStatus {
|
|
|
98
102
|
editable: boolean;
|
|
99
103
|
}
|
|
100
104
|
export interface UseTreeItemReturnValue<TSignatures extends UseTreeItemMinimalPlugins, TOptionalSignatures extends UseTreeItemOptionalPlugins> {
|
|
105
|
+
/**
|
|
106
|
+
* Resolver for the context provider's props.
|
|
107
|
+
* @returns {UseTreeItemContextProviderProps} Props that should be spread on the context provider slot.
|
|
108
|
+
*/
|
|
109
|
+
getContextProviderProps: () => UseTreeItemContextProviderProps;
|
|
101
110
|
/**
|
|
102
111
|
* Resolver for the root slot's props.
|
|
103
112
|
* @param {ExternalProps} externalProps Additional props for the root slot.
|