@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
|
@@ -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,92 +30,92 @@ 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
|
-
|
|
62
|
-
|
|
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);
|
|
63
87
|
});
|
|
88
|
+
const canItemBeTabbed = itemId => itemId === tabbableItemId;
|
|
64
89
|
populateInstance(instance, {
|
|
65
90
|
isNodeFocused,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
focusDefaultNode
|
|
91
|
+
canItemBeTabbed,
|
|
92
|
+
focusItem,
|
|
93
|
+
focusDefaultNode,
|
|
94
|
+
removeFocusedItem
|
|
69
95
|
});
|
|
70
96
|
populatePublicAPI(publicAPI, {
|
|
71
|
-
|
|
97
|
+
focusItem
|
|
72
98
|
});
|
|
73
99
|
useInstanceEventHandler(instance, 'removeNode', ({
|
|
74
100
|
id
|
|
75
101
|
}) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
return oldFocusedNodeId;
|
|
81
|
-
});
|
|
102
|
+
if (state.focusedNodeId === id) {
|
|
103
|
+
instance.focusDefaultNode(null);
|
|
104
|
+
}
|
|
82
105
|
});
|
|
83
106
|
const createHandleFocus = otherHandlers => event => {
|
|
84
|
-
|
|
85
|
-
(_otherHandlers$onFocu = otherHandlers.onFocus) == null || _otherHandlers$onFocu.call(otherHandlers, event);
|
|
107
|
+
otherHandlers.onFocus?.(event);
|
|
86
108
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
87
109
|
if (event.target === event.currentTarget) {
|
|
88
110
|
instance.focusDefaultNode(event);
|
|
89
111
|
}
|
|
90
112
|
};
|
|
91
|
-
const createHandleBlur = otherHandlers => event => {
|
|
92
|
-
var _otherHandlers$onBlur;
|
|
93
|
-
(_otherHandlers$onBlur = otherHandlers.onBlur) == null || _otherHandlers$onBlur.call(otherHandlers, event);
|
|
94
|
-
setFocusedNodeId(null);
|
|
95
|
-
};
|
|
96
113
|
const focusedNode = instance.getNode(state.focusedNodeId);
|
|
97
114
|
const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
|
|
98
115
|
return {
|
|
99
116
|
getRootProps: otherHandlers => ({
|
|
100
117
|
onFocus: createHandleFocus(otherHandlers),
|
|
101
|
-
|
|
102
|
-
'aria-activedescendant': activeDescendant != null ? activeDescendant : undefined
|
|
118
|
+
'aria-activedescendant': activeDescendant ?? undefined
|
|
103
119
|
})
|
|
104
120
|
};
|
|
105
121
|
};
|
|
@@ -107,5 +123,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
107
123
|
focusedNodeId: null
|
|
108
124
|
});
|
|
109
125
|
useTreeViewFocus.params = {
|
|
110
|
-
|
|
126
|
+
onItemFocus: true
|
|
111
127
|
};
|
|
@@ -5,21 +5,22 @@ import type { UseTreeViewNodesSignature } from '../useTreeViewNodes';
|
|
|
5
5
|
import type { UseTreeViewSelectionSignature } from '../useTreeViewSelection';
|
|
6
6
|
import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
|
|
7
7
|
export interface UseTreeViewFocusInstance {
|
|
8
|
-
isNodeFocused: (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
isNodeFocused: (itemId: string) => boolean;
|
|
9
|
+
canItemBeTabbed: (itemId: string) => boolean;
|
|
10
|
+
focusItem: (event: React.SyntheticEvent, nodeId: string) => void;
|
|
11
|
+
focusDefaultNode: (event: React.SyntheticEvent | null) => void;
|
|
12
|
+
removeFocusedItem: () => void;
|
|
12
13
|
}
|
|
13
|
-
export interface UseTreeViewFocusPublicAPI extends Pick<UseTreeViewFocusInstance, '
|
|
14
|
+
export interface UseTreeViewFocusPublicAPI extends Pick<UseTreeViewFocusInstance, 'focusItem'> {
|
|
14
15
|
}
|
|
15
16
|
export interface UseTreeViewFocusParameters {
|
|
16
17
|
/**
|
|
17
18
|
* Callback fired when tree items are focused.
|
|
18
19
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
19
|
-
* @param {string}
|
|
20
|
-
* @param {string} value of the focused
|
|
20
|
+
* @param {string} itemId The id of the focused item.
|
|
21
|
+
* @param {string} value of the focused item.
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
+
onItemFocus?: (event: React.SyntheticEvent | null, itemId: string) => void;
|
|
23
24
|
}
|
|
24
25
|
export type UseTreeViewFocusDefaultizedParameters = UseTreeViewFocusParameters;
|
|
25
26
|
export interface UseTreeViewFocusState {
|
|
@@ -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
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TreeViewPluginSignature } from '../../models';
|
|
2
2
|
export interface UseTreeViewIdInstance {
|
|
3
|
-
getTreeItemId: (
|
|
3
|
+
getTreeItemId: (itemId: string, idAttribute: string | undefined) => string;
|
|
4
4
|
}
|
|
5
5
|
export interface UseTreeViewIdParameters {
|
|
6
6
|
/**
|
|
@@ -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,36 +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
|
-
|
|
122
|
-
return instance.mapFirstCharFromJSX(nodeId, ((_contentRef$current$t = (_contentRef$current = contentRef.current) == null ? void 0 : _contentRef$current.textContent) != null ? _contentRef$current$t : '').substring(0, 1).toLowerCase());
|
|
122
|
+
return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
123
123
|
}
|
|
124
124
|
return undefined;
|
|
125
|
-
}, [instance,
|
|
125
|
+
}, [instance, itemId, label]);
|
|
126
126
|
return {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
ref: contentRef
|
|
130
|
-
})
|
|
131
|
-
}),
|
|
132
|
-
ref: handleRef,
|
|
133
|
-
wrapItem: item => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
134
|
-
id: nodeId,
|
|
135
|
-
children: item
|
|
136
|
-
})
|
|
127
|
+
contentRef: handleContentRef,
|
|
128
|
+
rootRef: handleRootRef
|
|
137
129
|
};
|
|
138
130
|
};
|
|
139
131
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
132
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
133
|
+
children,
|
|
134
|
+
itemId
|
|
135
|
+
}) => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
136
|
+
id: itemId,
|
|
137
|
+
children: children
|
|
138
|
+
});
|
|
140
139
|
useTreeViewJSXNodes.params = {};
|
|
@@ -3,8 +3,8 @@ import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
|
|
|
3
3
|
import { UseTreeViewKeyboardNavigationSignature } from '../useTreeViewKeyboardNavigation';
|
|
4
4
|
export interface UseTreeViewNodesInstance {
|
|
5
5
|
insertJSXNode: (node: TreeViewNode) => void;
|
|
6
|
-
removeJSXNode: (
|
|
7
|
-
mapFirstCharFromJSX: (
|
|
6
|
+
removeJSXNode: (itemId: string) => void;
|
|
7
|
+
mapFirstCharFromJSX: (itemId: string, firstChar: string) => () => void;
|
|
8
8
|
}
|
|
9
9
|
export interface UseTreeViewNodesParameters {
|
|
10
10
|
}
|