@mui/x-tree-view 7.0.0-beta.6 → 7.0.0
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 +311 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +34 -36
- package/RichTreeView/RichTreeView.types.d.ts +3 -2
- package/SimpleTreeView/SimpleTreeView.js +25 -26
- package/TreeItem/TreeItem.js +94 -82
- package/TreeItem/TreeItem.types.d.ts +13 -11
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +300 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +23 -23
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
- package/internals/useTreeView/useTreeView.js +28 -27
- package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
- package/internals/useTreeView/useTreeView.utils.js +22 -22
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +29 -29
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
- package/modern/TreeItem/TreeItem.js +83 -70
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +23 -23
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/modern/internals/useTreeView/useTreeView.js +28 -27
- package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +146 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +29 -29
- package/node/SimpleTreeView/SimpleTreeView.js +23 -23
- package/node/TreeItem/TreeItem.js +83 -70
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +23 -23
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/node/internals/useTreeView/useTreeView.js +28 -27
- package/node/internals/useTreeView/useTreeView.utils.js +22 -22
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +154 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +5 -5
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +146 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -16,42 +16,42 @@ const useTreeViewExpansion = ({
|
|
|
16
16
|
params,
|
|
17
17
|
models
|
|
18
18
|
}) => {
|
|
19
|
-
const
|
|
20
|
-
params.
|
|
21
|
-
models.
|
|
19
|
+
const setExpandedItems = (event, value) => {
|
|
20
|
+
params.onExpandedItemsChange?.(event, value);
|
|
21
|
+
models.expandedItems.setControlledValue(value);
|
|
22
22
|
};
|
|
23
|
-
const isNodeExpanded = React.useCallback(
|
|
24
|
-
return Array.isArray(models.
|
|
25
|
-
}, [models.
|
|
26
|
-
const isNodeExpandable = React.useCallback(
|
|
27
|
-
const toggleNodeExpansion = (0, _useEventCallback.default)((event,
|
|
28
|
-
if (
|
|
23
|
+
const isNodeExpanded = React.useCallback(itemId => {
|
|
24
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
|
|
25
|
+
}, [models.expandedItems.value]);
|
|
26
|
+
const isNodeExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
|
|
27
|
+
const toggleNodeExpansion = (0, _useEventCallback.default)((event, itemId) => {
|
|
28
|
+
if (itemId == null) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
const isExpandedBefore = models.
|
|
31
|
+
const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
|
|
32
32
|
let newExpanded;
|
|
33
33
|
if (isExpandedBefore) {
|
|
34
|
-
newExpanded = models.
|
|
34
|
+
newExpanded = models.expandedItems.value.filter(id => id !== itemId);
|
|
35
35
|
} else {
|
|
36
|
-
newExpanded = [
|
|
36
|
+
newExpanded = [itemId].concat(models.expandedItems.value);
|
|
37
37
|
}
|
|
38
|
-
if (params.
|
|
39
|
-
params.
|
|
38
|
+
if (params.onItemExpansionToggle) {
|
|
39
|
+
params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
setExpandedItems(event, newExpanded);
|
|
42
42
|
});
|
|
43
|
-
const expandAllSiblings = (event,
|
|
44
|
-
const node = instance.getNode(
|
|
43
|
+
const expandAllSiblings = (event, itemId) => {
|
|
44
|
+
const node = instance.getNode(itemId);
|
|
45
45
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
46
46
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
47
|
-
const newExpanded = models.
|
|
47
|
+
const newExpanded = models.expandedItems.value.concat(diff);
|
|
48
48
|
if (diff.length > 0) {
|
|
49
|
-
if (params.
|
|
50
|
-
diff.forEach(
|
|
51
|
-
params.
|
|
49
|
+
if (params.onItemExpansionToggle) {
|
|
50
|
+
diff.forEach(newlyExpandedItemId => {
|
|
51
|
+
params.onItemExpansionToggle(event, newlyExpandedItemId, true);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
setExpandedItems(event, newExpanded);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
(0, _useTreeView.populateInstance)(instance, {
|
|
@@ -63,17 +63,17 @@ const useTreeViewExpansion = ({
|
|
|
63
63
|
};
|
|
64
64
|
exports.useTreeViewExpansion = useTreeViewExpansion;
|
|
65
65
|
useTreeViewExpansion.models = {
|
|
66
|
-
|
|
67
|
-
getDefaultValue: params => params.
|
|
66
|
+
expandedItems: {
|
|
67
|
+
getDefaultValue: params => params.defaultExpandedItems
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
const DEFAULT_EXPANDED_NODES = [];
|
|
71
71
|
useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
72
|
-
|
|
72
|
+
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
|
|
73
73
|
});
|
|
74
74
|
useTreeViewExpansion.params = {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
expandedItems: true,
|
|
76
|
+
defaultExpandedItems: true,
|
|
77
|
+
onExpandedItemsChange: true,
|
|
78
|
+
onItemExpansionToggle: true
|
|
79
79
|
};
|
|
@@ -14,6 +14,22 @@ var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
|
|
|
14
14
|
var _utils = require("../../utils/utils");
|
|
15
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
|
+
const useTabbableItemId = (instance, selectedItems) => {
|
|
18
|
+
const isItemVisible = itemId => {
|
|
19
|
+
const node = instance.getNode(itemId);
|
|
20
|
+
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
21
|
+
};
|
|
22
|
+
let tabbableItemId;
|
|
23
|
+
if (Array.isArray(selectedItems)) {
|
|
24
|
+
tabbableItemId = selectedItems.find(isItemVisible);
|
|
25
|
+
} else if (selectedItems != null && isItemVisible(selectedItems)) {
|
|
26
|
+
tabbableItemId = selectedItems;
|
|
27
|
+
}
|
|
28
|
+
if (tabbableItemId == null) {
|
|
29
|
+
tabbableItemId = instance.getNavigableChildrenIds(null)[0];
|
|
30
|
+
}
|
|
31
|
+
return tabbableItemId;
|
|
32
|
+
};
|
|
17
33
|
const useTreeViewFocus = ({
|
|
18
34
|
instance,
|
|
19
35
|
publicAPI,
|
|
@@ -23,70 +39,78 @@ const useTreeViewFocus = ({
|
|
|
23
39
|
models,
|
|
24
40
|
rootRef
|
|
25
41
|
}) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
|
|
43
|
+
const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
|
|
44
|
+
const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedNodeId) : itemId;
|
|
45
|
+
if (state.focusedNodeId !== cleanItemId) {
|
|
29
46
|
setState(prevState => (0, _extends2.default)({}, prevState, {
|
|
30
|
-
focusedNodeId:
|
|
47
|
+
focusedNodeId: cleanItemId
|
|
31
48
|
}));
|
|
32
49
|
}
|
|
33
50
|
});
|
|
34
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current
|
|
35
|
-
const isNodeFocused = React.useCallback(
|
|
36
|
-
const isNodeVisible =
|
|
37
|
-
const node = instance.getNode(
|
|
51
|
+
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
|
|
52
|
+
const isNodeFocused = React.useCallback(itemId => state.focusedNodeId === itemId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
|
|
53
|
+
const isNodeVisible = itemId => {
|
|
54
|
+
const node = instance.getNode(itemId);
|
|
38
55
|
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
39
56
|
};
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
const innerFocusItem = (event, itemId) => {
|
|
58
|
+
const node = instance.getNode(itemId);
|
|
59
|
+
const itemElement = document.getElementById(instance.getTreeItemId(itemId, node.idAttribute));
|
|
60
|
+
if (itemElement) {
|
|
61
|
+
itemElement.focus();
|
|
62
|
+
}
|
|
63
|
+
setFocusedItemId(itemId);
|
|
64
|
+
if (params.onItemFocus) {
|
|
65
|
+
params.onItemFocus(event, itemId);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const focusItem = (0, _useEventCallback.default)((event, nodeId) => {
|
|
69
|
+
// If we receive a nodeId, and it is visible, the focus will be set to it
|
|
70
|
+
if (isNodeVisible(nodeId)) {
|
|
71
|
+
innerFocusItem(event, nodeId);
|
|
50
72
|
}
|
|
51
73
|
});
|
|
52
74
|
const focusDefaultNode = (0, _useEventCallback.default)(event => {
|
|
53
75
|
let nodeToFocusId;
|
|
54
|
-
if (Array.isArray(models.
|
|
55
|
-
nodeToFocusId = models.
|
|
56
|
-
} else if (models.
|
|
57
|
-
nodeToFocusId = models.
|
|
76
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
77
|
+
nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
|
|
78
|
+
} else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
|
|
79
|
+
nodeToFocusId = models.selectedItems.value;
|
|
58
80
|
}
|
|
59
81
|
if (nodeToFocusId == null) {
|
|
60
82
|
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
61
83
|
}
|
|
62
|
-
|
|
63
|
-
if (params.onNodeFocus) {
|
|
64
|
-
params.onNodeFocus(event, nodeToFocusId);
|
|
65
|
-
}
|
|
84
|
+
innerFocusItem(event, nodeToFocusId);
|
|
66
85
|
});
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
86
|
+
const removeFocusedItem = (0, _useEventCallback.default)(() => {
|
|
87
|
+
if (state.focusedNodeId == null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const node = instance.getNode(state.focusedNodeId);
|
|
91
|
+
const itemElement = document.getElementById(instance.getTreeItemId(state.focusedNodeId, node.idAttribute));
|
|
92
|
+
if (itemElement) {
|
|
93
|
+
itemElement.blur();
|
|
94
|
+
}
|
|
95
|
+
setFocusedItemId(null);
|
|
71
96
|
});
|
|
97
|
+
const canItemBeTabbed = itemId => itemId === tabbableItemId;
|
|
72
98
|
(0, _useTreeView.populateInstance)(instance, {
|
|
73
99
|
isNodeFocused,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
focusDefaultNode
|
|
100
|
+
canItemBeTabbed,
|
|
101
|
+
focusItem,
|
|
102
|
+
focusDefaultNode,
|
|
103
|
+
removeFocusedItem
|
|
77
104
|
});
|
|
78
105
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
79
|
-
|
|
106
|
+
focusItem
|
|
80
107
|
});
|
|
81
108
|
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
|
|
82
109
|
id
|
|
83
110
|
}) => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
return oldFocusedNodeId;
|
|
89
|
-
});
|
|
111
|
+
if (state.focusedNodeId === id) {
|
|
112
|
+
instance.focusDefaultNode(null);
|
|
113
|
+
}
|
|
90
114
|
});
|
|
91
115
|
const createHandleFocus = otherHandlers => event => {
|
|
92
116
|
otherHandlers.onFocus?.(event);
|
|
@@ -95,16 +119,11 @@ const useTreeViewFocus = ({
|
|
|
95
119
|
instance.focusDefaultNode(event);
|
|
96
120
|
}
|
|
97
121
|
};
|
|
98
|
-
const createHandleBlur = otherHandlers => event => {
|
|
99
|
-
otherHandlers.onBlur?.(event);
|
|
100
|
-
setFocusedNodeId(null);
|
|
101
|
-
};
|
|
102
122
|
const focusedNode = instance.getNode(state.focusedNodeId);
|
|
103
123
|
const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
|
|
104
124
|
return {
|
|
105
125
|
getRootProps: otherHandlers => ({
|
|
106
126
|
onFocus: createHandleFocus(otherHandlers),
|
|
107
|
-
onBlur: createHandleBlur(otherHandlers),
|
|
108
127
|
'aria-activedescendant': activeDescendant ?? undefined
|
|
109
128
|
})
|
|
110
129
|
};
|
|
@@ -114,5 +133,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
114
133
|
focusedNodeId: null
|
|
115
134
|
});
|
|
116
135
|
useTreeViewFocus.params = {
|
|
117
|
-
|
|
136
|
+
onItemFocus: true
|
|
118
137
|
};
|
|
@@ -15,7 +15,7 @@ const useTreeViewId = ({
|
|
|
15
15
|
params
|
|
16
16
|
}) => {
|
|
17
17
|
const treeId = (0, _useId.default)(params.id);
|
|
18
|
-
const getTreeItemId = React.useCallback((
|
|
18
|
+
const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
|
|
19
19
|
(0, _useTreeView.populateInstance)(instance, {
|
|
20
20
|
getTreeItemId
|
|
21
21
|
});
|
|
@@ -41,12 +41,12 @@ const useTreeViewJSXNodes = ({
|
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
-
const removeJSXNode = (0, _useEventCallback.default)(
|
|
44
|
+
const removeJSXNode = (0, _useEventCallback.default)(itemId => {
|
|
45
45
|
setState(prevState => {
|
|
46
46
|
const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
|
|
47
47
|
const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
|
|
48
|
-
delete newNodeMap[
|
|
49
|
-
delete newItemMap[
|
|
48
|
+
delete newNodeMap[itemId];
|
|
49
|
+
delete newItemMap[itemId];
|
|
50
50
|
return (0, _extends2.default)({}, prevState, {
|
|
51
51
|
nodes: (0, _extends2.default)({}, prevState.nodes, {
|
|
52
52
|
nodeMap: newNodeMap,
|
|
@@ -55,18 +55,18 @@ const useTreeViewJSXNodes = ({
|
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
57
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
|
|
58
|
-
id:
|
|
58
|
+
id: itemId
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
-
const mapFirstCharFromJSX = (0, _useEventCallback.default)((
|
|
61
|
+
const mapFirstCharFromJSX = (0, _useEventCallback.default)((itemId, firstChar) => {
|
|
62
62
|
instance.updateFirstCharMap(firstCharMap => {
|
|
63
|
-
firstCharMap[
|
|
63
|
+
firstCharMap[itemId] = firstChar;
|
|
64
64
|
return firstCharMap;
|
|
65
65
|
});
|
|
66
66
|
return () => {
|
|
67
67
|
instance.updateFirstCharMap(firstCharMap => {
|
|
68
68
|
const newMap = (0, _extends2.default)({}, firstCharMap);
|
|
69
|
-
delete newMap[
|
|
69
|
+
delete newMap[itemId];
|
|
70
70
|
return newMap;
|
|
71
71
|
});
|
|
72
72
|
};
|
|
@@ -80,15 +80,15 @@ const useTreeViewJSXNodes = ({
|
|
|
80
80
|
exports.useTreeViewJSXNodes = useTreeViewJSXNodes;
|
|
81
81
|
const useTreeViewJSXNodesItemPlugin = ({
|
|
82
82
|
props,
|
|
83
|
-
|
|
83
|
+
rootRef,
|
|
84
|
+
contentRef
|
|
84
85
|
}) => {
|
|
85
86
|
const {
|
|
86
87
|
children,
|
|
87
88
|
disabled = false,
|
|
88
89
|
label,
|
|
89
|
-
|
|
90
|
-
id
|
|
91
|
-
ContentProps: inContentProps
|
|
90
|
+
itemId,
|
|
91
|
+
id
|
|
92
92
|
} = props;
|
|
93
93
|
const {
|
|
94
94
|
instance
|
|
@@ -101,12 +101,13 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
101
101
|
};
|
|
102
102
|
const expandable = isExpandable(children);
|
|
103
103
|
const [treeItemElement, setTreeItemElement] = React.useState(null);
|
|
104
|
-
const
|
|
105
|
-
const
|
|
104
|
+
const pluginContentRef = React.useRef(null);
|
|
105
|
+
const handleRootRef = (0, _useForkRef.default)(setTreeItemElement, rootRef);
|
|
106
|
+
const handleContentRef = (0, _useForkRef.default)(pluginContentRef, contentRef);
|
|
106
107
|
const descendant = React.useMemo(() => ({
|
|
107
108
|
element: treeItemElement,
|
|
108
|
-
id:
|
|
109
|
-
}), [
|
|
109
|
+
id: itemId
|
|
110
|
+
}), [itemId, treeItemElement]);
|
|
110
111
|
const {
|
|
111
112
|
index,
|
|
112
113
|
parentId
|
|
@@ -115,35 +116,34 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
115
116
|
// On the first render a node's index will be -1. We want to wait for the real index.
|
|
116
117
|
if (index !== -1) {
|
|
117
118
|
instance.insertJSXNode({
|
|
118
|
-
id:
|
|
119
|
+
id: itemId,
|
|
119
120
|
idAttribute: id,
|
|
120
121
|
index,
|
|
121
122
|
parentId,
|
|
122
123
|
expandable,
|
|
123
124
|
disabled
|
|
124
125
|
});
|
|
125
|
-
return () => instance.removeJSXNode(
|
|
126
|
+
return () => instance.removeJSXNode(itemId);
|
|
126
127
|
}
|
|
127
128
|
return undefined;
|
|
128
|
-
}, [instance, parentId, index,
|
|
129
|
+
}, [instance, parentId, index, itemId, expandable, disabled, id]);
|
|
129
130
|
React.useEffect(() => {
|
|
130
131
|
if (label) {
|
|
131
|
-
return instance.mapFirstCharFromJSX(
|
|
132
|
+
return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
132
133
|
}
|
|
133
134
|
return undefined;
|
|
134
|
-
}, [instance,
|
|
135
|
+
}, [instance, itemId, label]);
|
|
135
136
|
return {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
ref: contentRef
|
|
139
|
-
})
|
|
140
|
-
}),
|
|
141
|
-
ref: handleRef,
|
|
142
|
-
wrapItem: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
143
|
-
id: nodeId,
|
|
144
|
-
children: item
|
|
145
|
-
})
|
|
137
|
+
contentRef: handleContentRef,
|
|
138
|
+
rootRef: handleRootRef
|
|
146
139
|
};
|
|
147
140
|
};
|
|
148
141
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
142
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
143
|
+
children,
|
|
144
|
+
itemId
|
|
145
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
146
|
+
id: itemId,
|
|
147
|
+
children: children
|
|
148
|
+
});
|
|
149
149
|
useTreeViewJSXNodes.params = {};
|