@mui/x-tree-view 7.0.0-beta.7 → 7.1.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 (136) hide show
  1. package/CHANGELOG.md +266 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +15 -17
  4. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  5. package/SimpleTreeView/SimpleTreeView.js +3 -4
  6. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  7. package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  8. package/TreeItem/TreeItem.js +43 -35
  9. package/TreeItem/TreeItem.types.d.ts +3 -3
  10. package/TreeItem/TreeItemContent.d.ts +7 -7
  11. package/TreeItem/TreeItemContent.js +10 -10
  12. package/TreeItem/treeItemClasses.d.ts +1 -1
  13. package/TreeItem/useTreeItemState.d.ts +1 -1
  14. package/TreeItem/useTreeItemState.js +13 -13
  15. package/TreeItem2/TreeItem2.js +16 -17
  16. package/TreeItem2Icon/TreeItem2Icon.js +5 -6
  17. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
  18. package/TreeItem2Provider/TreeItem2Provider.js +3 -3
  19. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
  20. package/TreeView/TreeView.d.ts +1 -1
  21. package/TreeView/TreeView.js +1 -1
  22. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
  23. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  24. package/hooks/useTreeViewApiRef.d.ts +1 -1
  25. package/index.js +1 -1
  26. package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
  27. package/internals/TreeViewProvider/DescendantProvider.js +1 -1
  28. package/internals/hooks/useInstanceEventHandler.js +5 -10
  29. package/internals/index.d.ts +2 -2
  30. package/internals/models/plugin.d.ts +1 -1
  31. package/internals/plugins/defaultPlugins.d.ts +3 -3
  32. package/internals/plugins/defaultPlugins.js +2 -2
  33. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +17 -24
  34. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -6
  35. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +76 -58
  36. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  37. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
  38. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  39. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +2 -2
  40. package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
  41. package/internals/plugins/useTreeViewItems/index.js +1 -0
  42. package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
  43. package/{modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js → internals/plugins/useTreeViewItems/useTreeViewItems.js} +42 -33
  44. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +99 -0
  45. package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
  46. package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  47. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
  48. package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -40
  49. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
  50. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -96
  51. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +6 -3
  52. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +44 -47
  53. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +8 -8
  54. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
  55. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  56. package/internals/useTreeView/useTreeView.js +5 -6
  57. package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
  58. package/internals/useTreeView/useTreeView.utils.js +18 -18
  59. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  60. package/internals/utils/utils.js +1 -0
  61. package/modern/RichTreeView/RichTreeView.js +11 -11
  62. package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
  63. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  64. package/modern/TreeItem/TreeItem.js +31 -22
  65. package/modern/TreeItem/TreeItemContent.js +10 -10
  66. package/modern/TreeItem/useTreeItemState.js +13 -13
  67. package/modern/TreeItem2/TreeItem2.js +11 -11
  68. package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
  69. package/modern/TreeView/TreeView.js +1 -1
  70. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  71. package/modern/index.js +1 -1
  72. package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
  73. package/modern/internals/plugins/defaultPlugins.js +2 -2
  74. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
  75. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
  76. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  77. package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
  78. package/{internals/plugins/useTreeViewNodes/useTreeViewNodes.js → modern/internals/plugins/useTreeViewItems/useTreeViewItems.js} +46 -41
  79. package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  80. package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -41
  81. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -94
  82. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +40 -40
  83. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  84. package/modern/internals/useTreeView/useTreeView.js +3 -4
  85. package/modern/internals/useTreeView/useTreeView.utils.js +18 -18
  86. package/modern/internals/utils/utils.js +1 -0
  87. package/modern/useTreeItem2/useTreeItem2.js +23 -12
  88. package/node/RichTreeView/RichTreeView.js +11 -11
  89. package/node/SimpleTreeView/SimpleTreeView.js +1 -1
  90. package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  91. package/node/TreeItem/TreeItem.js +31 -22
  92. package/node/TreeItem/TreeItemContent.js +10 -10
  93. package/node/TreeItem/useTreeItemState.js +13 -13
  94. package/node/TreeItem2/TreeItem2.js +11 -11
  95. package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
  96. package/node/TreeView/TreeView.js +1 -1
  97. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  98. package/node/index.js +1 -1
  99. package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
  100. package/node/internals/plugins/defaultPlugins.js +2 -2
  101. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
  102. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
  103. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  104. package/node/internals/plugins/useTreeViewItems/index.js +12 -0
  105. package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -35
  106. package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
  107. package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +43 -42
  108. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +84 -93
  109. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +39 -39
  110. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  111. package/node/internals/useTreeView/useTreeView.js +3 -4
  112. package/node/internals/useTreeView/useTreeView.utils.js +23 -23
  113. package/node/internals/utils/utils.js +1 -0
  114. package/node/useTreeItem2/useTreeItem2.js +23 -12
  115. package/package.json +5 -5
  116. package/useTreeItem2/useTreeItem2.d.ts +1 -1
  117. package/useTreeItem2/useTreeItem2.js +26 -18
  118. package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
  119. package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
  120. package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  121. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
  122. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
  123. package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
  124. package/internals/plugins/useTreeViewNodes/index.js +0 -1
  125. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
  126. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +0 -88
  127. package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  128. package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
  129. package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
  130. package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
  131. /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  132. /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  133. /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  134. /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  135. /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  136. /package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
@@ -20,11 +20,11 @@ const useTreeViewExpansion = ({
20
20
  params.onExpandedItemsChange?.(event, value);
21
21
  models.expandedItems.setControlledValue(value);
22
22
  };
23
- const isNodeExpanded = React.useCallback(nodeId => {
24
- return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(nodeId) !== -1 : false;
23
+ const isItemExpanded = React.useCallback(itemId => {
24
+ return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
25
25
  }, [models.expandedItems.value]);
26
- const isNodeExpandable = React.useCallback(nodeId => !!instance.getNode(nodeId)?.expandable, [instance]);
27
- const toggleNodeExpansion = (0, _useEventCallback.default)((event, itemId) => {
26
+ const isItemExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
27
+ const toggleItemExpansion = (0, _useEventCallback.default)((event, itemId) => {
28
28
  if (itemId == null) {
29
29
  return;
30
30
  }
@@ -40,24 +40,24 @@ const useTreeViewExpansion = ({
40
40
  }
41
41
  setExpandedItems(event, newExpanded);
42
42
  });
43
- const expandAllSiblings = (event, nodeId) => {
44
- const node = instance.getNode(nodeId);
43
+ const expandAllSiblings = (event, itemId) => {
44
+ const node = instance.getNode(itemId);
45
45
  const siblings = instance.getChildrenIds(node.parentId);
46
- const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
46
+ const diff = siblings.filter(child => instance.isItemExpandable(child) && !instance.isItemExpanded(child));
47
47
  const newExpanded = models.expandedItems.value.concat(diff);
48
48
  if (diff.length > 0) {
49
49
  if (params.onItemExpansionToggle) {
50
- diff.forEach(newlyExpandedNodeId => {
51
- params.onItemExpansionToggle(event, newlyExpandedNodeId, true);
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, {
58
- isNodeExpanded,
59
- isNodeExpandable,
60
- toggleNodeExpansion,
58
+ isItemExpanded,
59
+ isItemExpandable,
60
+ toggleItemExpansion,
61
61
  expandAllSiblings
62
62
  });
63
63
  };
@@ -67,9 +67,9 @@ useTreeViewExpansion.models = {
67
67
  getDefaultValue: params => params.defaultExpandedItems
68
68
  }
69
69
  };
70
- const DEFAULT_EXPANDED_NODES = [];
70
+ const DEFAULT_EXPANDED_ITEMS = [];
71
71
  useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
72
- defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
72
+ defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
73
73
  });
74
74
  useTreeViewExpansion.params = {
75
75
  expandedItems: true,
@@ -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.isItemExpanded(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,95 +39,100 @@ const useTreeViewFocus = ({
23
39
  models,
24
40
  rootRef
25
41
  }) => {
26
- const setFocusedNodeId = (0, _useEventCallback.default)(nodeId => {
27
- const cleanNodeId = typeof nodeId === 'function' ? nodeId(state.focusedNodeId) : nodeId;
28
- if (state.focusedNodeId !== cleanNodeId) {
42
+ const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
43
+ const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
44
+ const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedItemId) : itemId;
45
+ if (state.focusedItemId !== cleanItemId) {
29
46
  setState(prevState => (0, _extends2.default)({}, prevState, {
30
- focusedNodeId: cleanNodeId
47
+ focusedItemId: cleanItemId
31
48
  }));
32
49
  }
33
50
  });
34
- const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current === (0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current)), [rootRef]);
35
- const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
36
- const isNodeVisible = nodeId => {
37
- const node = instance.getNode(nodeId);
38
- return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
51
+ const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
52
+ const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
53
+ const isItemVisible = itemId => {
54
+ const node = instance.getNode(itemId);
55
+ return node && (node.parentId == null || instance.isItemExpanded(node.parentId));
39
56
  };
40
- const focusItem = (0, _useEventCallback.default)((event, nodeId) => {
41
- // if we receive a nodeId, and it is visible, the focus will be set to it
42
- if (nodeId && isNodeVisible(nodeId)) {
43
- if (!isTreeViewFocused()) {
44
- instance.focusRoot();
45
- }
46
- setFocusedNodeId(nodeId);
47
- if (params.onItemFocus) {
48
- params.onItemFocus(event, nodeId);
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, itemId) => {
69
+ // If we receive an itemId, and it is visible, the focus will be set to it
70
+ if (isItemVisible(itemId)) {
71
+ innerFocusItem(event, itemId);
50
72
  }
51
73
  });
52
- const focusDefaultNode = (0, _useEventCallback.default)(event => {
53
- let nodeToFocusId;
74
+ const focusDefaultItem = (0, _useEventCallback.default)(event => {
75
+ let itemToFocusId;
54
76
  if (Array.isArray(models.selectedItems.value)) {
55
- nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
56
- } else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
57
- nodeToFocusId = models.selectedItems.value;
77
+ itemToFocusId = models.selectedItems.value.find(isItemVisible);
78
+ } else if (models.selectedItems.value != null && isItemVisible(models.selectedItems.value)) {
79
+ itemToFocusId = models.selectedItems.value;
58
80
  }
59
- if (nodeToFocusId == null) {
60
- nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
61
- }
62
- setFocusedNodeId(nodeToFocusId);
63
- if (params.onItemFocus) {
64
- params.onItemFocus(event, nodeToFocusId);
81
+ if (itemToFocusId == null) {
82
+ itemToFocusId = instance.getNavigableChildrenIds(null)[0];
65
83
  }
84
+ innerFocusItem(event, itemToFocusId);
66
85
  });
67
- const focusRoot = (0, _useEventCallback.default)(() => {
68
- rootRef.current?.focus({
69
- preventScroll: true
70
- });
86
+ const removeFocusedItem = (0, _useEventCallback.default)(() => {
87
+ if (state.focusedItemId == null) {
88
+ return;
89
+ }
90
+ const node = instance.getNode(state.focusedItemId);
91
+ if (node) {
92
+ const itemElement = document.getElementById(instance.getTreeItemId(state.focusedItemId, node.idAttribute));
93
+ if (itemElement) {
94
+ itemElement.blur();
95
+ }
96
+ }
97
+ setFocusedItemId(null);
71
98
  });
99
+ const canItemBeTabbed = itemId => itemId === tabbableItemId;
72
100
  (0, _useTreeView.populateInstance)(instance, {
73
- isNodeFocused,
101
+ isItemFocused,
102
+ canItemBeTabbed,
74
103
  focusItem,
75
- focusRoot,
76
- focusDefaultNode
104
+ focusDefaultItem,
105
+ removeFocusedItem
77
106
  });
78
107
  (0, _useTreeView.populatePublicAPI)(publicAPI, {
79
108
  focusItem
80
109
  });
81
- (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
110
+ (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeItem', ({
82
111
  id
83
112
  }) => {
84
- setFocusedNodeId(oldFocusedNodeId => {
85
- if (oldFocusedNodeId === id && rootRef.current === (0, _ownerDocument.default)(rootRef.current).activeElement) {
86
- return instance.getChildrenIds(null)[0];
87
- }
88
- return oldFocusedNodeId;
89
- });
113
+ if (state.focusedItemId === id) {
114
+ instance.focusDefaultItem(null);
115
+ }
90
116
  });
91
117
  const createHandleFocus = otherHandlers => event => {
92
118
  otherHandlers.onFocus?.(event);
93
119
  // if the event bubbled (which is React specific) we don't want to steal focus
94
120
  if (event.target === event.currentTarget) {
95
- instance.focusDefaultNode(event);
121
+ instance.focusDefaultItem(event);
96
122
  }
97
123
  };
98
- const createHandleBlur = otherHandlers => event => {
99
- otherHandlers.onBlur?.(event);
100
- setFocusedNodeId(null);
101
- };
102
- const focusedNode = instance.getNode(state.focusedNodeId);
103
- const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
124
+ const focusedItem = instance.getNode(state.focusedItemId);
125
+ const activeDescendant = focusedItem ? instance.getTreeItemId(focusedItem.id, focusedItem.idAttribute) : null;
104
126
  return {
105
127
  getRootProps: otherHandlers => ({
106
128
  onFocus: createHandleFocus(otherHandlers),
107
- onBlur: createHandleBlur(otherHandlers),
108
129
  'aria-activedescendant': activeDescendant ?? undefined
109
130
  })
110
131
  };
111
132
  };
112
133
  exports.useTreeViewFocus = useTreeViewFocus;
113
134
  useTreeViewFocus.getInitialState = () => ({
114
- focusedNodeId: null
135
+ focusedItemId: null
115
136
  });
116
137
  useTreeViewFocus.params = {
117
138
  onItemFocus: true
@@ -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((nodeId, idAttribute) => idAttribute ?? `${treeId}-${nodeId}`, [treeId]);
18
+ const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
19
19
  (0, _useTreeView.populateInstance)(instance, {
20
20
  getTreeItemId
21
21
  });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewItems", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewItems.useTreeViewItems;
10
+ }
11
+ });
12
+ var _useTreeViewItems = require("./useTreeViewItems");
@@ -4,15 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useTreeViewNodes = void 0;
7
+ exports.useTreeViewItems = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
- var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
10
  var _useTreeView = require("../../useTreeView/useTreeView.utils");
12
11
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
13
12
  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); }
14
13
  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; }
15
- const updateNodesState = ({
14
+ const updateItemsState = ({
16
15
  items,
17
16
  isItemDisabled,
18
17
  getItemLabel,
@@ -54,22 +53,22 @@ const updateNodesState = ({
54
53
  itemMap
55
54
  };
56
55
  };
57
- const useTreeViewNodes = ({
56
+ const useTreeViewItems = ({
58
57
  instance,
59
58
  publicAPI,
60
59
  params,
61
60
  state,
62
61
  setState
63
62
  }) => {
64
- const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
65
- const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
66
- const isNodeDisabled = React.useCallback(nodeId => {
67
- if (nodeId == null) {
63
+ const getNode = React.useCallback(itemId => state.items.nodeMap[itemId], [state.items.nodeMap]);
64
+ const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
65
+ const isItemDisabled = React.useCallback(itemId => {
66
+ if (itemId == null) {
68
67
  return false;
69
68
  }
70
- let node = instance.getNode(nodeId);
69
+ let node = instance.getNode(itemId);
71
70
 
72
- // This can be called before the node has been added to the node map.
71
+ // This can be called before the item has been added to the item map.
73
72
  if (!node) {
74
73
  return false;
75
74
  }
@@ -84,56 +83,66 @@ const useTreeViewNodes = ({
84
83
  }
85
84
  return false;
86
85
  }, [instance]);
87
- const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodes.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
88
- const getNavigableChildrenIds = nodeId => {
89
- let childrenIds = instance.getChildrenIds(nodeId);
86
+ const getChildrenIds = React.useCallback(itemId => Object.values(state.items.nodeMap).filter(item => item.parentId === itemId).sort((a, b) => a.index - b.index).map(child => child.id), [state.items.nodeMap]);
87
+ const getNavigableChildrenIds = itemId => {
88
+ let childrenIds = instance.getChildrenIds(itemId);
90
89
  if (!params.disabledItemsFocusable) {
91
- childrenIds = childrenIds.filter(node => !instance.isNodeDisabled(node));
90
+ childrenIds = childrenIds.filter(item => !instance.isItemDisabled(item));
92
91
  }
93
92
  return childrenIds;
94
93
  };
94
+ const areItemUpdatesPreventedRef = React.useRef(false);
95
+ const preventItemUpdates = React.useCallback(() => {
96
+ areItemUpdatesPreventedRef.current = true;
97
+ }, []);
98
+ const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
95
99
  React.useEffect(() => {
100
+ if (instance.areItemUpdatesPrevented()) {
101
+ return;
102
+ }
96
103
  setState(prevState => {
97
- const newState = updateNodesState({
104
+ const newState = updateItemsState({
98
105
  items: params.items,
99
106
  isItemDisabled: params.isItemDisabled,
100
107
  getItemId: params.getItemId,
101
108
  getItemLabel: params.getItemLabel
102
109
  });
103
- Object.values(prevState.nodes.nodeMap).forEach(node => {
104
- if (!newState.nodeMap[node.id]) {
105
- (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
106
- id: node.id
110
+ Object.values(prevState.items.nodeMap).forEach(item => {
111
+ if (!newState.nodeMap[item.id]) {
112
+ (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
113
+ id: item.id
107
114
  });
108
115
  }
109
116
  });
110
117
  return (0, _extends2.default)({}, prevState, {
111
- nodes: newState
118
+ items: newState
112
119
  });
113
120
  });
114
121
  }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
115
- const getNodesToRender = () => {
116
- const getPropsFromNodeId = ({
122
+ const getItemsToRender = () => {
123
+ const getPropsFromItemId = ({
117
124
  id,
118
125
  children
119
126
  }) => {
120
- const node = state.nodes.nodeMap[id];
127
+ const item = state.items.nodeMap[id];
121
128
  return {
122
- label: node.label,
123
- nodeId: node.id,
124
- id: node.idAttribute,
125
- children: children?.map(getPropsFromNodeId)
129
+ label: item.label,
130
+ itemId: item.id,
131
+ id: item.idAttribute,
132
+ children: children?.map(getPropsFromItemId)
126
133
  };
127
134
  };
128
- return state.nodes.nodeTree.map(getPropsFromNodeId);
135
+ return state.items.nodeTree.map(getPropsFromItemId);
129
136
  };
130
137
  (0, _useTreeView.populateInstance)(instance, {
131
138
  getNode,
132
139
  getItem,
133
- getNodesToRender,
140
+ getItemsToRender,
134
141
  getChildrenIds,
135
142
  getNavigableChildrenIds,
136
- isNodeDisabled
143
+ isItemDisabled,
144
+ preventItemUpdates,
145
+ areItemUpdatesPrevented
137
146
  });
138
147
  (0, _useTreeView.populatePublicAPI)(publicAPI, {
139
148
  getItem
@@ -144,19 +153,19 @@ const useTreeViewNodes = ({
144
153
  }
145
154
  };
146
155
  };
147
- exports.useTreeViewNodes = useTreeViewNodes;
148
- useTreeViewNodes.getInitialState = params => ({
149
- nodes: updateNodesState({
156
+ exports.useTreeViewItems = useTreeViewItems;
157
+ useTreeViewItems.getInitialState = params => ({
158
+ items: updateItemsState({
150
159
  items: params.items,
151
160
  isItemDisabled: params.isItemDisabled,
152
161
  getItemId: params.getItemId,
153
162
  getItemLabel: params.getItemLabel
154
163
  })
155
164
  });
156
- useTreeViewNodes.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
165
+ useTreeViewItems.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
157
166
  disabledItemsFocusable: params.disabledItemsFocusable ?? false
158
167
  });
159
- useTreeViewNodes.params = {
168
+ useTreeViewItems.params = {
160
169
  disabledItemsFocusable: true,
161
170
  items: true,
162
171
  isItemDisabled: true,
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewJSXItems", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewJSXItems.useTreeViewJSXItems;
10
+ }
11
+ });
12
+ var _useTreeViewJSXItems = require("./useTreeViewJSXItems");
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useTreeViewJSXNodes = void 0;
7
+ exports.useTreeViewJSXItems = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
@@ -16,69 +16,70 @@ var _DescendantProvider = require("../../TreeViewProvider/DescendantProvider");
16
16
  var _jsxRuntime = require("react/jsx-runtime");
17
17
  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); }
18
18
  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; }
19
- const useTreeViewJSXNodes = ({
19
+ const useTreeViewJSXItems = ({
20
20
  instance,
21
21
  setState
22
22
  }) => {
23
- const insertJSXNode = (0, _useEventCallback.default)(node => {
23
+ instance.preventItemUpdates();
24
+ const insertJSXItem = (0, _useEventCallback.default)(item => {
24
25
  setState(prevState => {
25
- if (prevState.nodes.nodeMap[node.id] != null) {
26
- throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${node.id}"`].join('\n'));
26
+ if (prevState.items.nodeMap[item.id] != null) {
27
+ throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${item.id}"`].join('\n'));
27
28
  }
28
29
  return (0, _extends2.default)({}, prevState, {
29
- nodes: (0, _extends2.default)({}, prevState.nodes, {
30
- nodeMap: (0, _extends2.default)({}, prevState.nodes.nodeMap, {
31
- [node.id]: node
30
+ items: (0, _extends2.default)({}, prevState.items, {
31
+ nodeMap: (0, _extends2.default)({}, prevState.items.nodeMap, {
32
+ [item.id]: item
32
33
  }),
33
34
  // For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
34
- itemMap: (0, _extends2.default)({}, prevState.nodes.itemMap, {
35
- [node.id]: {
36
- id: node.id,
37
- label: node.label
35
+ itemMap: (0, _extends2.default)({}, prevState.items.itemMap, {
36
+ [item.id]: {
37
+ id: item.id,
38
+ label: item.label
38
39
  }
39
40
  })
40
41
  })
41
42
  });
42
43
  });
43
44
  });
44
- const removeJSXNode = (0, _useEventCallback.default)(nodeId => {
45
+ const removeJSXItem = (0, _useEventCallback.default)(itemId => {
45
46
  setState(prevState => {
46
- const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
47
- const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
48
- delete newNodeMap[nodeId];
49
- delete newItemMap[nodeId];
47
+ const newNodeMap = (0, _extends2.default)({}, prevState.items.nodeMap);
48
+ const newItemMap = (0, _extends2.default)({}, prevState.items.itemMap);
49
+ delete newNodeMap[itemId];
50
+ delete newItemMap[itemId];
50
51
  return (0, _extends2.default)({}, prevState, {
51
- nodes: (0, _extends2.default)({}, prevState.nodes, {
52
+ items: (0, _extends2.default)({}, prevState.items, {
52
53
  nodeMap: newNodeMap,
53
54
  itemMap: newItemMap
54
55
  })
55
56
  });
56
57
  });
57
- (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
58
- id: nodeId
58
+ (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
59
+ id: itemId
59
60
  });
60
61
  });
61
- const mapFirstCharFromJSX = (0, _useEventCallback.default)((nodeId, firstChar) => {
62
+ const mapFirstCharFromJSX = (0, _useEventCallback.default)((itemId, firstChar) => {
62
63
  instance.updateFirstCharMap(firstCharMap => {
63
- firstCharMap[nodeId] = firstChar;
64
+ firstCharMap[itemId] = firstChar;
64
65
  return firstCharMap;
65
66
  });
66
67
  return () => {
67
68
  instance.updateFirstCharMap(firstCharMap => {
68
69
  const newMap = (0, _extends2.default)({}, firstCharMap);
69
- delete newMap[nodeId];
70
+ delete newMap[itemId];
70
71
  return newMap;
71
72
  });
72
73
  };
73
74
  });
74
75
  (0, _useTreeView.populateInstance)(instance, {
75
- insertJSXNode,
76
- removeJSXNode,
76
+ insertJSXItem,
77
+ removeJSXItem,
77
78
  mapFirstCharFromJSX
78
79
  });
79
80
  };
80
- exports.useTreeViewJSXNodes = useTreeViewJSXNodes;
81
- const useTreeViewJSXNodesItemPlugin = ({
81
+ exports.useTreeViewJSXItems = useTreeViewJSXItems;
82
+ const useTreeViewJSXItemsItemPlugin = ({
82
83
  props,
83
84
  rootRef,
84
85
  contentRef
@@ -87,7 +88,7 @@ const useTreeViewJSXNodesItemPlugin = ({
87
88
  children,
88
89
  disabled = false,
89
90
  label,
90
- nodeId,
91
+ itemId,
91
92
  id
92
93
  } = props;
93
94
  const {
@@ -106,44 +107,44 @@ const useTreeViewJSXNodesItemPlugin = ({
106
107
  const handleContentRef = (0, _useForkRef.default)(pluginContentRef, contentRef);
107
108
  const descendant = React.useMemo(() => ({
108
109
  element: treeItemElement,
109
- id: nodeId
110
- }), [nodeId, treeItemElement]);
110
+ id: itemId
111
+ }), [itemId, treeItemElement]);
111
112
  const {
112
113
  index,
113
114
  parentId
114
115
  } = (0, _DescendantProvider.useDescendant)(descendant);
115
116
  React.useEffect(() => {
116
- // On the first render a node's index will be -1. We want to wait for the real index.
117
+ // On the first render a item's index will be -1. We want to wait for the real index.
117
118
  if (index !== -1) {
118
- instance.insertJSXNode({
119
- id: nodeId,
119
+ instance.insertJSXItem({
120
+ id: itemId,
120
121
  idAttribute: id,
121
122
  index,
122
123
  parentId,
123
124
  expandable,
124
125
  disabled
125
126
  });
126
- return () => instance.removeJSXNode(nodeId);
127
+ return () => instance.removeJSXItem(itemId);
127
128
  }
128
129
  return undefined;
129
- }, [instance, parentId, index, nodeId, expandable, disabled, id]);
130
+ }, [instance, parentId, index, itemId, expandable, disabled, id]);
130
131
  React.useEffect(() => {
131
132
  if (label) {
132
- return instance.mapFirstCharFromJSX(nodeId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
133
+ return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
133
134
  }
134
135
  return undefined;
135
- }, [instance, nodeId, label]);
136
+ }, [instance, itemId, label]);
136
137
  return {
137
138
  contentRef: handleContentRef,
138
139
  rootRef: handleRootRef
139
140
  };
140
141
  };
141
- useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
142
- useTreeViewJSXNodes.wrapItem = ({
142
+ useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
143
+ useTreeViewJSXItems.wrapItem = ({
143
144
  children,
144
- nodeId
145
+ itemId
145
146
  }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
146
- id: nodeId,
147
+ id: itemId,
147
148
  children: children
148
149
  });
149
- useTreeViewJSXNodes.params = {};
150
+ useTreeViewJSXItems.params = {};