@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.
Files changed (152) hide show
  1. package/CHANGELOG.md +311 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +34 -36
  4. package/RichTreeView/RichTreeView.types.d.ts +3 -2
  5. package/SimpleTreeView/SimpleTreeView.js +25 -26
  6. package/TreeItem/TreeItem.js +94 -82
  7. package/TreeItem/TreeItem.types.d.ts +13 -11
  8. package/TreeItem/TreeItemContent.d.ts +7 -7
  9. package/TreeItem/TreeItemContent.js +10 -10
  10. package/TreeItem/useTreeItemState.d.ts +1 -1
  11. package/TreeItem/useTreeItemState.js +13 -13
  12. package/TreeItem2/TreeItem2.d.ts +18 -0
  13. package/TreeItem2/TreeItem2.js +300 -0
  14. package/TreeItem2/TreeItem2.types.d.ts +64 -0
  15. package/TreeItem2/TreeItem2.types.js +1 -0
  16. package/TreeItem2/index.d.ts +2 -0
  17. package/TreeItem2/index.js +1 -0
  18. package/TreeItem2/package.json +6 -0
  19. package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
  20. package/TreeItem2Icon/TreeItem2Icon.js +67 -0
  21. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
  22. package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  23. package/TreeItem2Icon/index.d.ts +2 -0
  24. package/TreeItem2Icon/index.js +1 -0
  25. package/TreeItem2Icon/package.json +6 -0
  26. package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
  27. package/TreeItem2Provider/TreeItem2Provider.js +24 -0
  28. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
  29. package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  30. package/TreeItem2Provider/index.d.ts +2 -0
  31. package/TreeItem2Provider/index.js +1 -0
  32. package/TreeItem2Provider/package.json +6 -0
  33. package/TreeView/TreeView.d.ts +1 -1
  34. package/TreeView/TreeView.js +23 -23
  35. package/hooks/index.d.ts +1 -0
  36. package/hooks/index.js +2 -1
  37. package/hooks/useTreeItem2Utils/index.d.ts +1 -0
  38. package/hooks/useTreeItem2Utils/index.js +1 -0
  39. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
  40. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  41. package/index.d.ts +5 -1
  42. package/index.js +9 -2
  43. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  44. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  45. package/internals/hooks/useInstanceEventHandler.js +5 -10
  46. package/internals/hooks/useLazyRef.d.ts +1 -2
  47. package/internals/hooks/useLazyRef.js +1 -11
  48. package/internals/hooks/useOnMount.d.ts +1 -2
  49. package/internals/hooks/useOnMount.js +1 -7
  50. package/internals/hooks/useTimeout.d.ts +1 -11
  51. package/internals/hooks/useTimeout.js +1 -36
  52. package/internals/models/plugin.d.ts +19 -16
  53. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
  55. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
  56. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  57. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  58. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  59. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
  60. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  61. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
  62. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  63. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
  64. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
  67. package/internals/useTreeView/useTreeView.js +28 -27
  68. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  69. package/internals/useTreeView/useTreeView.utils.js +22 -22
  70. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  71. package/internals/utils/utils.js +1 -0
  72. package/modern/RichTreeView/RichTreeView.js +29 -29
  73. package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
  74. package/modern/TreeItem/TreeItem.js +83 -70
  75. package/modern/TreeItem/TreeItemContent.js +10 -10
  76. package/modern/TreeItem/useTreeItemState.js +13 -13
  77. package/modern/TreeItem2/TreeItem2.js +300 -0
  78. package/modern/TreeItem2/TreeItem2.types.js +1 -0
  79. package/modern/TreeItem2/index.js +1 -0
  80. package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
  81. package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  82. package/modern/TreeItem2Icon/index.js +1 -0
  83. package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
  84. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  85. package/modern/TreeItem2Provider/index.js +1 -0
  86. package/modern/TreeView/TreeView.js +23 -23
  87. package/modern/hooks/index.js +2 -1
  88. package/modern/hooks/useTreeItem2Utils/index.js +1 -0
  89. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  90. package/modern/index.js +9 -2
  91. package/modern/internals/hooks/useLazyRef.js +1 -11
  92. package/modern/internals/hooks/useOnMount.js +1 -7
  93. package/modern/internals/hooks/useTimeout.js +1 -36
  94. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  95. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  96. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  97. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  98. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  99. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  100. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  101. package/modern/internals/useTreeView/useTreeView.js +28 -27
  102. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  103. package/modern/internals/utils/utils.js +1 -0
  104. package/modern/useTreeItem2/index.js +1 -0
  105. package/modern/useTreeItem2/useTreeItem2.js +146 -0
  106. package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
  107. package/node/RichTreeView/RichTreeView.js +29 -29
  108. package/node/SimpleTreeView/SimpleTreeView.js +23 -23
  109. package/node/TreeItem/TreeItem.js +83 -70
  110. package/node/TreeItem/TreeItemContent.js +10 -10
  111. package/node/TreeItem/useTreeItemState.js +13 -13
  112. package/node/TreeItem2/TreeItem2.js +308 -0
  113. package/node/TreeItem2/TreeItem2.types.js +5 -0
  114. package/node/TreeItem2/index.js +42 -0
  115. package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
  116. package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
  117. package/node/TreeItem2Icon/index.js +12 -0
  118. package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
  119. package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
  120. package/node/TreeItem2Provider/index.js +12 -0
  121. package/node/TreeView/TreeView.js +23 -23
  122. package/node/hooks/index.js +8 -1
  123. package/node/hooks/useTreeItem2Utils/index.js +12 -0
  124. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
  125. package/node/index.js +61 -13
  126. package/node/internals/hooks/useLazyRef.js +7 -13
  127. package/node/internals/hooks/useOnMount.js +8 -10
  128. package/node/internals/hooks/useTimeout.js +7 -37
  129. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  130. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  131. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  132. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  133. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  134. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  135. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  136. package/node/internals/useTreeView/useTreeView.js +28 -27
  137. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  138. package/node/internals/utils/utils.js +1 -0
  139. package/node/useTreeItem2/index.js +12 -0
  140. package/node/useTreeItem2/useTreeItem2.js +154 -0
  141. package/node/useTreeItem2/useTreeItem2.types.js +5 -0
  142. package/package.json +5 -5
  143. package/themeAugmentation/components.d.ts +5 -0
  144. package/themeAugmentation/overrides.d.ts +1 -0
  145. package/themeAugmentation/props.d.ts +2 -0
  146. package/useTreeItem2/index.d.ts +2 -0
  147. package/useTreeItem2/index.js +1 -0
  148. package/useTreeItem2/package.json +6 -0
  149. package/useTreeItem2/useTreeItem2.d.ts +2 -0
  150. package/useTreeItem2/useTreeItem2.js +146 -0
  151. package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
  152. package/useTreeItem2/useTreeItem2.types.js +1 -0
@@ -7,42 +7,42 @@ export const useTreeViewExpansion = ({
7
7
  params,
8
8
  models
9
9
  }) => {
10
- const setExpandedNodes = (event, value) => {
11
- params.onExpandedNodesChange?.(event, value);
12
- models.expandedNodes.setControlledValue(value);
10
+ const setExpandedItems = (event, value) => {
11
+ params.onExpandedItemsChange?.(event, value);
12
+ models.expandedItems.setControlledValue(value);
13
13
  };
14
- const isNodeExpanded = React.useCallback(nodeId => {
15
- return Array.isArray(models.expandedNodes.value) ? models.expandedNodes.value.indexOf(nodeId) !== -1 : false;
16
- }, [models.expandedNodes.value]);
17
- const isNodeExpandable = React.useCallback(nodeId => !!instance.getNode(nodeId)?.expandable, [instance]);
18
- const toggleNodeExpansion = useEventCallback((event, nodeId) => {
19
- if (nodeId == null) {
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.expandedNodes.value.indexOf(nodeId) !== -1;
22
+ const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
23
23
  let newExpanded;
24
24
  if (isExpandedBefore) {
25
- newExpanded = models.expandedNodes.value.filter(id => id !== nodeId);
25
+ newExpanded = models.expandedItems.value.filter(id => id !== itemId);
26
26
  } else {
27
- newExpanded = [nodeId].concat(models.expandedNodes.value);
27
+ newExpanded = [itemId].concat(models.expandedItems.value);
28
28
  }
29
- if (params.onNodeExpansionToggle) {
30
- params.onNodeExpansionToggle(event, nodeId, !isExpandedBefore);
29
+ if (params.onItemExpansionToggle) {
30
+ params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
31
31
  }
32
- setExpandedNodes(event, newExpanded);
32
+ setExpandedItems(event, newExpanded);
33
33
  });
34
- const expandAllSiblings = (event, nodeId) => {
35
- const node = instance.getNode(nodeId);
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.expandedNodes.value.concat(diff);
38
+ const newExpanded = models.expandedItems.value.concat(diff);
39
39
  if (diff.length > 0) {
40
- if (params.onNodeExpansionToggle) {
41
- diff.forEach(newlyExpandedNodeId => {
42
- params.onNodeExpansionToggle(event, newlyExpandedNodeId, true);
40
+ if (params.onItemExpansionToggle) {
41
+ diff.forEach(newlyExpandedItemId => {
42
+ params.onItemExpansionToggle(event, newlyExpandedItemId, true);
43
43
  });
44
44
  }
45
- setExpandedNodes(event, newExpanded);
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
- expandedNodes: {
57
- getDefaultValue: params => params.defaultExpandedNodes
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
- defaultExpandedNodes: params.defaultExpandedNodes ?? DEFAULT_EXPANDED_NODES
62
+ defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
63
63
  });
64
64
  useTreeViewExpansion.params = {
65
- expandedNodes: true,
66
- defaultExpandedNodes: true,
67
- onExpandedNodesChange: true,
68
- onNodeExpansionToggle: true
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 setFocusedNodeId = useEventCallback(nodeId => {
18
- const cleanNodeId = typeof nodeId === 'function' ? nodeId(state.focusedNodeId) : nodeId;
19
- if (state.focusedNodeId !== cleanNodeId) {
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: cleanNodeId
38
+ focusedNodeId: cleanItemId
22
39
  }));
23
40
  }
24
41
  });
25
- const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current === getActiveElement(ownerDocument(rootRef.current)), [rootRef]);
26
- const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
27
- const isNodeVisible = nodeId => {
28
- const node = instance.getNode(nodeId);
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 focusNode = useEventCallback((event, nodeId) => {
32
- // if we receive a nodeId, and it is visible, the focus will be set to it
33
- if (nodeId && isNodeVisible(nodeId)) {
34
- if (!isTreeViewFocused()) {
35
- instance.focusRoot();
36
- }
37
- setFocusedNodeId(nodeId);
38
- if (params.onNodeFocus) {
39
- params.onNodeFocus(event, nodeId);
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.selectedNodes.value)) {
46
- nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
47
- } else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
48
- nodeToFocusId = models.selectedNodes.value;
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
- setFocusedNodeId(nodeToFocusId);
54
- if (params.onNodeFocus) {
55
- params.onNodeFocus(event, nodeToFocusId);
56
- }
75
+ innerFocusItem(event, nodeToFocusId);
57
76
  });
58
- const focusRoot = useEventCallback(() => {
59
- rootRef.current?.focus({
60
- preventScroll: true
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
- focusNode,
66
- focusRoot,
67
- focusDefaultNode
91
+ canItemBeTabbed,
92
+ focusItem,
93
+ focusDefaultNode,
94
+ removeFocusedItem
68
95
  });
69
96
  populatePublicAPI(publicAPI, {
70
- focusNode
97
+ focusItem
71
98
  });
72
99
  useInstanceEventHandler(instance, 'removeNode', ({
73
100
  id
74
101
  }) => {
75
- setFocusedNodeId(oldFocusedNodeId => {
76
- if (oldFocusedNodeId === id && rootRef.current === ownerDocument(rootRef.current).activeElement) {
77
- return instance.getChildrenIds(null)[0];
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
- onNodeFocus: true
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((nodeId, idAttribute) => idAttribute ?? `${treeId}-${nodeId}`, [treeId]);
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(nodeId => {
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[nodeId];
40
- delete newItemMap[nodeId];
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: nodeId
49
+ id: itemId
50
50
  });
51
51
  });
52
- const mapFirstCharFromJSX = useEventCallback((nodeId, firstChar) => {
52
+ const mapFirstCharFromJSX = useEventCallback((itemId, firstChar) => {
53
53
  instance.updateFirstCharMap(firstCharMap => {
54
- firstCharMap[nodeId] = firstChar;
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[nodeId];
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
- ref
73
+ rootRef,
74
+ contentRef
74
75
  }) => {
75
76
  const {
76
77
  children,
77
78
  disabled = false,
78
79
  label,
79
- nodeId,
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 contentRef = React.useRef(null);
95
- const handleRef = useForkRef(setTreeItemElement, ref);
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: nodeId
99
- }), [nodeId, treeItemElement]);
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: nodeId,
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(nodeId);
116
+ return () => instance.removeJSXNode(itemId);
116
117
  }
117
118
  return undefined;
118
- }, [instance, parentId, index, nodeId, expandable, disabled, id]);
119
+ }, [instance, parentId, index, itemId, expandable, disabled, id]);
119
120
  React.useEffect(() => {
120
121
  if (label) {
121
- return instance.mapFirstCharFromJSX(nodeId, (contentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
122
+ return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
122
123
  }
123
124
  return undefined;
124
- }, [instance, nodeId, label]);
125
+ }, [instance, itemId, label]);
125
126
  return {
126
- props: _extends({}, props, {
127
- ContentProps: _extends({}, inContentProps, {
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 = {};