@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
|
@@ -7,42 +7,42 @@ export const useTreeViewExpansion = ({
|
|
|
7
7
|
params,
|
|
8
8
|
models
|
|
9
9
|
}) => {
|
|
10
|
-
const
|
|
11
|
-
params.
|
|
12
|
-
models.
|
|
10
|
+
const setExpandedItems = (event, value) => {
|
|
11
|
+
params.onExpandedItemsChange?.(event, value);
|
|
12
|
+
models.expandedItems.setControlledValue(value);
|
|
13
13
|
};
|
|
14
|
-
const isNodeExpanded = React.useCallback(
|
|
15
|
-
return Array.isArray(models.
|
|
16
|
-
}, [models.
|
|
17
|
-
const isNodeExpandable = React.useCallback(
|
|
18
|
-
const toggleNodeExpansion = useEventCallback((event,
|
|
19
|
-
if (
|
|
14
|
+
const isNodeExpanded = React.useCallback(itemId => {
|
|
15
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
|
|
16
|
+
}, [models.expandedItems.value]);
|
|
17
|
+
const isNodeExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
|
|
18
|
+
const toggleNodeExpansion = useEventCallback((event, itemId) => {
|
|
19
|
+
if (itemId == null) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
|
-
const isExpandedBefore = models.
|
|
22
|
+
const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
|
|
23
23
|
let newExpanded;
|
|
24
24
|
if (isExpandedBefore) {
|
|
25
|
-
newExpanded = models.
|
|
25
|
+
newExpanded = models.expandedItems.value.filter(id => id !== itemId);
|
|
26
26
|
} else {
|
|
27
|
-
newExpanded = [
|
|
27
|
+
newExpanded = [itemId].concat(models.expandedItems.value);
|
|
28
28
|
}
|
|
29
|
-
if (params.
|
|
30
|
-
params.
|
|
29
|
+
if (params.onItemExpansionToggle) {
|
|
30
|
+
params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
setExpandedItems(event, newExpanded);
|
|
33
33
|
});
|
|
34
|
-
const expandAllSiblings = (event,
|
|
35
|
-
const node = instance.getNode(
|
|
34
|
+
const expandAllSiblings = (event, itemId) => {
|
|
35
|
+
const node = instance.getNode(itemId);
|
|
36
36
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
37
37
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
38
|
-
const newExpanded = models.
|
|
38
|
+
const newExpanded = models.expandedItems.value.concat(diff);
|
|
39
39
|
if (diff.length > 0) {
|
|
40
|
-
if (params.
|
|
41
|
-
diff.forEach(
|
|
42
|
-
params.
|
|
40
|
+
if (params.onItemExpansionToggle) {
|
|
41
|
+
diff.forEach(newlyExpandedItemId => {
|
|
42
|
+
params.onItemExpansionToggle(event, newlyExpandedItemId, true);
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
setExpandedItems(event, newExpanded);
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
populateInstance(instance, {
|
|
@@ -53,17 +53,17 @@ export const useTreeViewExpansion = ({
|
|
|
53
53
|
});
|
|
54
54
|
};
|
|
55
55
|
useTreeViewExpansion.models = {
|
|
56
|
-
|
|
57
|
-
getDefaultValue: params => params.
|
|
56
|
+
expandedItems: {
|
|
57
|
+
getDefaultValue: params => params.defaultExpandedItems
|
|
58
58
|
}
|
|
59
59
|
};
|
|
60
60
|
const DEFAULT_EXPANDED_NODES = [];
|
|
61
61
|
useTreeViewExpansion.getDefaultizedParams = params => _extends({}, params, {
|
|
62
|
-
|
|
62
|
+
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
|
|
63
63
|
});
|
|
64
64
|
useTreeViewExpansion.params = {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
expandedItems: true,
|
|
66
|
+
defaultExpandedItems: true,
|
|
67
|
+
onExpandedItemsChange: true,
|
|
68
|
+
onItemExpansionToggle: true
|
|
69
69
|
};
|
|
@@ -5,6 +5,22 @@ import ownerDocument from '@mui/utils/ownerDocument';
|
|
|
5
5
|
import { populateInstance, populatePublicAPI } from '../../useTreeView/useTreeView.utils';
|
|
6
6
|
import { useInstanceEventHandler } from '../../hooks/useInstanceEventHandler';
|
|
7
7
|
import { getActiveElement } from '../../utils/utils';
|
|
8
|
+
const useTabbableItemId = (instance, selectedItems) => {
|
|
9
|
+
const isItemVisible = itemId => {
|
|
10
|
+
const node = instance.getNode(itemId);
|
|
11
|
+
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
12
|
+
};
|
|
13
|
+
let tabbableItemId;
|
|
14
|
+
if (Array.isArray(selectedItems)) {
|
|
15
|
+
tabbableItemId = selectedItems.find(isItemVisible);
|
|
16
|
+
} else if (selectedItems != null && isItemVisible(selectedItems)) {
|
|
17
|
+
tabbableItemId = selectedItems;
|
|
18
|
+
}
|
|
19
|
+
if (tabbableItemId == null) {
|
|
20
|
+
tabbableItemId = instance.getNavigableChildrenIds(null)[0];
|
|
21
|
+
}
|
|
22
|
+
return tabbableItemId;
|
|
23
|
+
};
|
|
8
24
|
export const useTreeViewFocus = ({
|
|
9
25
|
instance,
|
|
10
26
|
publicAPI,
|
|
@@ -14,70 +30,78 @@ export const useTreeViewFocus = ({
|
|
|
14
30
|
models,
|
|
15
31
|
rootRef
|
|
16
32
|
}) => {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
33
|
+
const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
|
|
34
|
+
const setFocusedItemId = useEventCallback(itemId => {
|
|
35
|
+
const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedNodeId) : itemId;
|
|
36
|
+
if (state.focusedNodeId !== cleanItemId) {
|
|
20
37
|
setState(prevState => _extends({}, prevState, {
|
|
21
|
-
focusedNodeId:
|
|
38
|
+
focusedNodeId: cleanItemId
|
|
22
39
|
}));
|
|
23
40
|
}
|
|
24
41
|
});
|
|
25
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current
|
|
26
|
-
const isNodeFocused = React.useCallback(
|
|
27
|
-
const isNodeVisible =
|
|
28
|
-
const node = instance.getNode(
|
|
42
|
+
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains(getActiveElement(ownerDocument(rootRef.current))), [rootRef]);
|
|
43
|
+
const isNodeFocused = React.useCallback(itemId => state.focusedNodeId === itemId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
|
|
44
|
+
const isNodeVisible = itemId => {
|
|
45
|
+
const node = instance.getNode(itemId);
|
|
29
46
|
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
30
47
|
};
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
const innerFocusItem = (event, itemId) => {
|
|
49
|
+
const node = instance.getNode(itemId);
|
|
50
|
+
const itemElement = document.getElementById(instance.getTreeItemId(itemId, node.idAttribute));
|
|
51
|
+
if (itemElement) {
|
|
52
|
+
itemElement.focus();
|
|
53
|
+
}
|
|
54
|
+
setFocusedItemId(itemId);
|
|
55
|
+
if (params.onItemFocus) {
|
|
56
|
+
params.onItemFocus(event, itemId);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const focusItem = useEventCallback((event, nodeId) => {
|
|
60
|
+
// If we receive a nodeId, and it is visible, the focus will be set to it
|
|
61
|
+
if (isNodeVisible(nodeId)) {
|
|
62
|
+
innerFocusItem(event, nodeId);
|
|
41
63
|
}
|
|
42
64
|
});
|
|
43
65
|
const focusDefaultNode = useEventCallback(event => {
|
|
44
66
|
let nodeToFocusId;
|
|
45
|
-
if (Array.isArray(models.
|
|
46
|
-
nodeToFocusId = models.
|
|
47
|
-
} else if (models.
|
|
48
|
-
nodeToFocusId = models.
|
|
67
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
68
|
+
nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
|
|
69
|
+
} else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
|
|
70
|
+
nodeToFocusId = models.selectedItems.value;
|
|
49
71
|
}
|
|
50
72
|
if (nodeToFocusId == null) {
|
|
51
73
|
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
52
74
|
}
|
|
53
|
-
|
|
54
|
-
if (params.onNodeFocus) {
|
|
55
|
-
params.onNodeFocus(event, nodeToFocusId);
|
|
56
|
-
}
|
|
75
|
+
innerFocusItem(event, nodeToFocusId);
|
|
57
76
|
});
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
77
|
+
const removeFocusedItem = useEventCallback(() => {
|
|
78
|
+
if (state.focusedNodeId == null) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const node = instance.getNode(state.focusedNodeId);
|
|
82
|
+
const itemElement = document.getElementById(instance.getTreeItemId(state.focusedNodeId, node.idAttribute));
|
|
83
|
+
if (itemElement) {
|
|
84
|
+
itemElement.blur();
|
|
85
|
+
}
|
|
86
|
+
setFocusedItemId(null);
|
|
62
87
|
});
|
|
88
|
+
const canItemBeTabbed = itemId => itemId === tabbableItemId;
|
|
63
89
|
populateInstance(instance, {
|
|
64
90
|
isNodeFocused,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
focusDefaultNode
|
|
91
|
+
canItemBeTabbed,
|
|
92
|
+
focusItem,
|
|
93
|
+
focusDefaultNode,
|
|
94
|
+
removeFocusedItem
|
|
68
95
|
});
|
|
69
96
|
populatePublicAPI(publicAPI, {
|
|
70
|
-
|
|
97
|
+
focusItem
|
|
71
98
|
});
|
|
72
99
|
useInstanceEventHandler(instance, 'removeNode', ({
|
|
73
100
|
id
|
|
74
101
|
}) => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
return oldFocusedNodeId;
|
|
80
|
-
});
|
|
102
|
+
if (state.focusedNodeId === id) {
|
|
103
|
+
instance.focusDefaultNode(null);
|
|
104
|
+
}
|
|
81
105
|
});
|
|
82
106
|
const createHandleFocus = otherHandlers => event => {
|
|
83
107
|
otherHandlers.onFocus?.(event);
|
|
@@ -86,16 +110,11 @@ export const useTreeViewFocus = ({
|
|
|
86
110
|
instance.focusDefaultNode(event);
|
|
87
111
|
}
|
|
88
112
|
};
|
|
89
|
-
const createHandleBlur = otherHandlers => event => {
|
|
90
|
-
otherHandlers.onBlur?.(event);
|
|
91
|
-
setFocusedNodeId(null);
|
|
92
|
-
};
|
|
93
113
|
const focusedNode = instance.getNode(state.focusedNodeId);
|
|
94
114
|
const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
|
|
95
115
|
return {
|
|
96
116
|
getRootProps: otherHandlers => ({
|
|
97
117
|
onFocus: createHandleFocus(otherHandlers),
|
|
98
|
-
onBlur: createHandleBlur(otherHandlers),
|
|
99
118
|
'aria-activedescendant': activeDescendant ?? undefined
|
|
100
119
|
})
|
|
101
120
|
};
|
|
@@ -104,5 +123,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
104
123
|
focusedNodeId: null
|
|
105
124
|
});
|
|
106
125
|
useTreeViewFocus.params = {
|
|
107
|
-
|
|
126
|
+
onItemFocus: true
|
|
108
127
|
};
|
|
@@ -6,7 +6,7 @@ export const useTreeViewId = ({
|
|
|
6
6
|
params
|
|
7
7
|
}) => {
|
|
8
8
|
const treeId = useId(params.id);
|
|
9
|
-
const getTreeItemId = React.useCallback((
|
|
9
|
+
const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
|
|
10
10
|
populateInstance(instance, {
|
|
11
11
|
getTreeItemId
|
|
12
12
|
});
|
|
@@ -32,12 +32,12 @@ export const useTreeViewJSXNodes = ({
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
});
|
|
35
|
-
const removeJSXNode = useEventCallback(
|
|
35
|
+
const removeJSXNode = useEventCallback(itemId => {
|
|
36
36
|
setState(prevState => {
|
|
37
37
|
const newNodeMap = _extends({}, prevState.nodes.nodeMap);
|
|
38
38
|
const newItemMap = _extends({}, prevState.nodes.itemMap);
|
|
39
|
-
delete newNodeMap[
|
|
40
|
-
delete newItemMap[
|
|
39
|
+
delete newNodeMap[itemId];
|
|
40
|
+
delete newItemMap[itemId];
|
|
41
41
|
return _extends({}, prevState, {
|
|
42
42
|
nodes: _extends({}, prevState.nodes, {
|
|
43
43
|
nodeMap: newNodeMap,
|
|
@@ -46,18 +46,18 @@ export const useTreeViewJSXNodes = ({
|
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
48
|
publishTreeViewEvent(instance, 'removeNode', {
|
|
49
|
-
id:
|
|
49
|
+
id: itemId
|
|
50
50
|
});
|
|
51
51
|
});
|
|
52
|
-
const mapFirstCharFromJSX = useEventCallback((
|
|
52
|
+
const mapFirstCharFromJSX = useEventCallback((itemId, firstChar) => {
|
|
53
53
|
instance.updateFirstCharMap(firstCharMap => {
|
|
54
|
-
firstCharMap[
|
|
54
|
+
firstCharMap[itemId] = firstChar;
|
|
55
55
|
return firstCharMap;
|
|
56
56
|
});
|
|
57
57
|
return () => {
|
|
58
58
|
instance.updateFirstCharMap(firstCharMap => {
|
|
59
59
|
const newMap = _extends({}, firstCharMap);
|
|
60
|
-
delete newMap[
|
|
60
|
+
delete newMap[itemId];
|
|
61
61
|
return newMap;
|
|
62
62
|
});
|
|
63
63
|
};
|
|
@@ -70,15 +70,15 @@ export const useTreeViewJSXNodes = ({
|
|
|
70
70
|
};
|
|
71
71
|
const useTreeViewJSXNodesItemPlugin = ({
|
|
72
72
|
props,
|
|
73
|
-
|
|
73
|
+
rootRef,
|
|
74
|
+
contentRef
|
|
74
75
|
}) => {
|
|
75
76
|
const {
|
|
76
77
|
children,
|
|
77
78
|
disabled = false,
|
|
78
79
|
label,
|
|
79
|
-
|
|
80
|
-
id
|
|
81
|
-
ContentProps: inContentProps
|
|
80
|
+
itemId,
|
|
81
|
+
id
|
|
82
82
|
} = props;
|
|
83
83
|
const {
|
|
84
84
|
instance
|
|
@@ -91,12 +91,13 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
91
91
|
};
|
|
92
92
|
const expandable = isExpandable(children);
|
|
93
93
|
const [treeItemElement, setTreeItemElement] = React.useState(null);
|
|
94
|
-
const
|
|
95
|
-
const
|
|
94
|
+
const pluginContentRef = React.useRef(null);
|
|
95
|
+
const handleRootRef = useForkRef(setTreeItemElement, rootRef);
|
|
96
|
+
const handleContentRef = useForkRef(pluginContentRef, contentRef);
|
|
96
97
|
const descendant = React.useMemo(() => ({
|
|
97
98
|
element: treeItemElement,
|
|
98
|
-
id:
|
|
99
|
-
}), [
|
|
99
|
+
id: itemId
|
|
100
|
+
}), [itemId, treeItemElement]);
|
|
100
101
|
const {
|
|
101
102
|
index,
|
|
102
103
|
parentId
|
|
@@ -105,35 +106,34 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
105
106
|
// On the first render a node's index will be -1. We want to wait for the real index.
|
|
106
107
|
if (index !== -1) {
|
|
107
108
|
instance.insertJSXNode({
|
|
108
|
-
id:
|
|
109
|
+
id: itemId,
|
|
109
110
|
idAttribute: id,
|
|
110
111
|
index,
|
|
111
112
|
parentId,
|
|
112
113
|
expandable,
|
|
113
114
|
disabled
|
|
114
115
|
});
|
|
115
|
-
return () => instance.removeJSXNode(
|
|
116
|
+
return () => instance.removeJSXNode(itemId);
|
|
116
117
|
}
|
|
117
118
|
return undefined;
|
|
118
|
-
}, [instance, parentId, index,
|
|
119
|
+
}, [instance, parentId, index, itemId, expandable, disabled, id]);
|
|
119
120
|
React.useEffect(() => {
|
|
120
121
|
if (label) {
|
|
121
|
-
return instance.mapFirstCharFromJSX(
|
|
122
|
+
return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
122
123
|
}
|
|
123
124
|
return undefined;
|
|
124
|
-
}, [instance,
|
|
125
|
+
}, [instance, itemId, label]);
|
|
125
126
|
return {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
ref: contentRef
|
|
129
|
-
})
|
|
130
|
-
}),
|
|
131
|
-
ref: handleRef,
|
|
132
|
-
wrapItem: item => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
133
|
-
id: nodeId,
|
|
134
|
-
children: item
|
|
135
|
-
})
|
|
127
|
+
contentRef: handleContentRef,
|
|
128
|
+
rootRef: handleRootRef
|
|
136
129
|
};
|
|
137
130
|
};
|
|
138
131
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
132
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
133
|
+
children,
|
|
134
|
+
itemId
|
|
135
|
+
}) => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
136
|
+
id: itemId,
|
|
137
|
+
children: children
|
|
138
|
+
});
|
|
139
139
|
useTreeViewJSXNodes.params = {};
|