@mui/x-tree-view 7.0.0-beta.7 → 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 (86) hide show
  1. package/CHANGELOG.md +195 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +12 -14
  4. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  5. package/SimpleTreeView/SimpleTreeView.js +3 -4
  6. package/TreeItem/TreeItem.js +43 -35
  7. package/TreeItem/TreeItem.types.d.ts +3 -3
  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.js +16 -17
  13. package/TreeItem2Icon/TreeItem2Icon.js +5 -6
  14. package/TreeItem2Provider/TreeItem2Provider.js +3 -3
  15. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
  16. package/TreeView/TreeView.d.ts +1 -1
  17. package/TreeView/TreeView.js +1 -1
  18. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
  19. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  20. package/index.js +1 -1
  21. package/internals/hooks/useInstanceEventHandler.js +5 -10
  22. package/internals/models/plugin.d.ts +1 -1
  23. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +11 -18
  24. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +3 -3
  25. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +59 -43
  26. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -5
  27. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  28. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  29. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -18
  30. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  31. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +70 -77
  32. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  33. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +24 -29
  34. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  35. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -21
  36. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +4 -4
  37. package/internals/useTreeView/useTreeView.js +5 -6
  38. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  39. package/internals/useTreeView/useTreeView.utils.js +22 -22
  40. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  41. package/internals/utils/utils.js +1 -0
  42. package/modern/RichTreeView/RichTreeView.js +7 -7
  43. package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
  44. package/modern/TreeItem/TreeItem.js +31 -22
  45. package/modern/TreeItem/TreeItemContent.js +10 -10
  46. package/modern/TreeItem/useTreeItemState.js +13 -13
  47. package/modern/TreeItem2/TreeItem2.js +11 -11
  48. package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
  49. package/modern/TreeView/TreeView.js +1 -1
  50. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  51. package/modern/index.js +1 -1
  52. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
  53. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
  54. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  55. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
  56. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
  57. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
  58. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
  59. package/modern/internals/useTreeView/useTreeView.js +3 -4
  60. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  61. package/modern/internals/utils/utils.js +1 -0
  62. package/modern/useTreeItem2/useTreeItem2.js +23 -12
  63. package/node/RichTreeView/RichTreeView.js +7 -7
  64. package/node/SimpleTreeView/SimpleTreeView.js +1 -1
  65. package/node/TreeItem/TreeItem.js +31 -22
  66. package/node/TreeItem/TreeItemContent.js +10 -10
  67. package/node/TreeItem/useTreeItemState.js +13 -13
  68. package/node/TreeItem2/TreeItem2.js +11 -11
  69. package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
  70. package/node/TreeView/TreeView.js +1 -1
  71. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  72. package/node/index.js +1 -1
  73. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
  74. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
  75. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  76. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
  77. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
  78. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
  79. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
  80. package/node/internals/useTreeView/useTreeView.js +3 -4
  81. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  82. package/node/internals/utils/utils.js +1 -0
  83. package/node/useTreeItem2/useTreeItem2.js +23 -12
  84. package/package.json +5 -5
  85. package/useTreeItem2/useTreeItem2.js +26 -18
  86. package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
@@ -40,7 +40,7 @@ const SimpleTreeViewRoot = exports.SimpleTreeViewRoot = (0, _styles.styled)('ul'
40
40
  outline: 0
41
41
  });
42
42
  const EMPTY_ITEMS = [];
43
- const itemsPropWarning = (0, _warning.buildWarning)(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/simple-tree-view/items/']);
43
+ const itemsPropWarning = (0, _warning.buildWarning)(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/']);
44
44
 
45
45
  /**
46
46
  *
@@ -23,7 +23,7 @@ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewCont
23
23
  var _icons = require("../icons");
24
24
  var _TreeItem2Provider = require("../TreeItem2Provider");
25
25
  var _jsxRuntime = require("react/jsx-runtime");
26
- const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown"],
26
+ const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
27
27
  _excluded2 = ["ownerState"],
28
28
  _excluded3 = ["ownerState"],
29
29
  _excluded4 = ["ownerState"];
@@ -165,11 +165,13 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
165
165
  slotProps: inSlotProps,
166
166
  ContentComponent = _TreeItemContent.TreeItemContent,
167
167
  ContentProps,
168
- nodeId,
168
+ itemId,
169
169
  id,
170
170
  label,
171
171
  onClick,
172
- onMouseDown
172
+ onMouseDown,
173
+ onBlur,
174
+ onKeyDown
173
175
  } = props,
174
176
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
175
177
  const {
@@ -192,10 +194,10 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
192
194
  return Boolean(reactChildren);
193
195
  };
194
196
  const expandable = isExpandable(children);
195
- const expanded = instance.isNodeExpanded(nodeId);
196
- const focused = instance.isNodeFocused(nodeId);
197
- const selected = instance.isNodeSelected(nodeId);
198
- const disabled = instance.isNodeDisabled(nodeId);
197
+ const expanded = instance.isNodeExpanded(itemId);
198
+ const focused = instance.isNodeFocused(itemId);
199
+ const selected = instance.isNodeSelected(itemId);
200
+ const disabled = instance.isNodeDisabled(itemId);
199
201
  const ownerState = (0, _extends2.default)({}, props, {
200
202
  expanded,
201
203
  focused,
@@ -257,24 +259,29 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
257
259
  /* single-selection trees unset aria-selected on un-selected items.
258
260
  *
259
261
  * If the tree does not support multiple selection, aria-selected
260
- * is set to true for the selected node and it is not present on any other node in the tree.
262
+ * is set to true for the selected item and it is not present on any other item in the tree.
261
263
  * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
262
264
  */
263
265
  ariaSelected = true;
264
266
  }
265
267
  function handleFocus(event) {
266
- // DOM focus stays on the tree which manages focus with aria-activedescendant
267
- if (event.target === event.currentTarget) {
268
- instance.focusRoot();
269
- }
270
268
  const canBeFocused = !disabled || disabledItemsFocusable;
271
269
  if (!focused && canBeFocused && event.currentTarget === event.target) {
272
- instance.focusItem(event, nodeId);
270
+ instance.focusItem(event, itemId);
273
271
  }
274
272
  }
275
- const idAttribute = instance.getTreeItemId(nodeId, id);
273
+ function handleBlur(event) {
274
+ onBlur?.(event);
275
+ instance.removeFocusedItem();
276
+ }
277
+ const handleKeyDown = event => {
278
+ onKeyDown?.(event);
279
+ instance.handleItemKeyDown(event, itemId);
280
+ };
281
+ const idAttribute = instance.getTreeItemId(itemId, id);
282
+ const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
276
283
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2Provider.TreeItem2Provider, {
277
- nodeId: nodeId,
284
+ itemId: itemId,
278
285
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(TreeItemRoot, (0, _extends2.default)({
279
286
  className: (0, _clsx.default)(classes.root, className),
280
287
  role: "treeitem",
@@ -282,10 +289,12 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
282
289
  "aria-selected": ariaSelected,
283
290
  "aria-disabled": disabled || undefined,
284
291
  id: idAttribute,
285
- tabIndex: -1
292
+ tabIndex: tabIndex
286
293
  }, other, {
287
294
  ownerState: ownerState,
288
295
  onFocus: handleFocus,
296
+ onBlur: handleBlur,
297
+ onKeyDown: handleKeyDown,
289
298
  ref: handleRootRef,
290
299
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(StyledTreeItemContent, (0, _extends2.default)({
291
300
  as: ContentComponent,
@@ -299,7 +308,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
299
308
  label: classes.label
300
309
  },
301
310
  label: label,
302
- nodeId: nodeId,
311
+ itemId: itemId,
303
312
  onClick: onClick,
304
313
  onMouseDown: onMouseDown,
305
314
  icon: icon,
@@ -331,7 +340,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
331
340
  classes: _propTypes.default.object,
332
341
  className: _propTypes.default.string,
333
342
  /**
334
- * The component used for the content node.
343
+ * The component used to render the content of the item.
335
344
  * @default TreeItemContent
336
345
  */
337
346
  ContentComponent: _elementTypeAcceptingRef.default,
@@ -345,13 +354,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
345
354
  */
346
355
  disabled: _propTypes.default.bool,
347
356
  /**
348
- * The tree item label.
357
+ * The id of the item.
349
358
  */
350
- label: _propTypes.default.node,
359
+ itemId: _propTypes.default.string.isRequired,
351
360
  /**
352
- * The id of the node.
361
+ * The tree item label.
353
362
  */
354
- nodeId: _propTypes.default.string.isRequired,
363
+ label: _propTypes.default.node,
355
364
  /**
356
365
  * This prop isn't supported.
357
366
  * Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
@@ -12,7 +12,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _useTreeItemState = require("./useTreeItemState");
14
14
  var _jsxRuntime = require("react/jsx-runtime");
15
- const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "nodeId", "onClick", "onMouseDown"];
15
+ const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
16
16
  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); }
17
17
  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; }
18
18
  /**
@@ -26,7 +26,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
26
26
  expansionIcon,
27
27
  icon: iconProp,
28
28
  label,
29
- nodeId,
29
+ itemId,
30
30
  onClick,
31
31
  onMouseDown
32
32
  } = props,
@@ -39,7 +39,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
39
39
  handleExpansion,
40
40
  handleSelection,
41
41
  preventSelection
42
- } = (0, _useTreeItemState.useTreeItemState)(nodeId);
42
+ } = (0, _useTreeItemState.useTreeItemState)(itemId);
43
43
  const icon = iconProp || expansionIcon || displayIcon;
44
44
  const handleMouseDown = event => {
45
45
  preventSelection(event);
@@ -83,23 +83,23 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
83
83
  classes: _propTypes.default.object.isRequired,
84
84
  className: _propTypes.default.string,
85
85
  /**
86
- * The icon to display next to the tree node's label. Either a parent or end icon.
86
+ * The icon to display next to the tree item's label. Either a parent or end icon.
87
87
  */
88
88
  displayIcon: _propTypes.default.node,
89
89
  /**
90
- * The icon to display next to the tree node's label. Either an expansion or collapse icon.
90
+ * The icon to display next to the tree item's label. Either an expansion or collapse icon.
91
91
  */
92
92
  expansionIcon: _propTypes.default.node,
93
93
  /**
94
- * The icon to display next to the tree node's label.
94
+ * The icon to display next to the tree item's label.
95
95
  */
96
96
  icon: _propTypes.default.node,
97
97
  /**
98
- * The tree node label.
98
+ * The id of the item.
99
99
  */
100
- label: _propTypes.default.node,
100
+ itemId: _propTypes.default.string.isRequired,
101
101
  /**
102
- * The id of the node.
102
+ * The tree item label.
103
103
  */
104
- nodeId: _propTypes.default.string.isRequired
104
+ label: _propTypes.default.node
105
105
  } : void 0;
@@ -5,47 +5,47 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useTreeItemState = useTreeItemState;
7
7
  var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
8
- function useTreeItemState(nodeId) {
8
+ function useTreeItemState(itemId) {
9
9
  const {
10
10
  instance,
11
11
  selection: {
12
12
  multiSelect
13
13
  }
14
14
  } = (0, _useTreeViewContext.useTreeViewContext)();
15
- const expandable = instance.isNodeExpandable(nodeId);
16
- const expanded = instance.isNodeExpanded(nodeId);
17
- const focused = instance.isNodeFocused(nodeId);
18
- const selected = instance.isNodeSelected(nodeId);
19
- const disabled = instance.isNodeDisabled(nodeId);
15
+ const expandable = instance.isNodeExpandable(itemId);
16
+ const expanded = instance.isNodeExpanded(itemId);
17
+ const focused = instance.isNodeFocused(itemId);
18
+ const selected = instance.isNodeSelected(itemId);
19
+ const disabled = instance.isNodeDisabled(itemId);
20
20
  const handleExpansion = event => {
21
21
  if (!disabled) {
22
22
  if (!focused) {
23
- instance.focusItem(event, nodeId);
23
+ instance.focusItem(event, itemId);
24
24
  }
25
25
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
26
26
 
27
27
  // If already expanded and trying to toggle selection don't close
28
- if (expandable && !(multiple && instance.isNodeExpanded(nodeId))) {
29
- instance.toggleNodeExpansion(event, nodeId);
28
+ if (expandable && !(multiple && instance.isNodeExpanded(itemId))) {
29
+ instance.toggleNodeExpansion(event, itemId);
30
30
  }
31
31
  }
32
32
  };
33
33
  const handleSelection = event => {
34
34
  if (!disabled) {
35
35
  if (!focused) {
36
- instance.focusItem(event, nodeId);
36
+ instance.focusItem(event, itemId);
37
37
  }
38
38
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
39
39
  if (multiple) {
40
40
  if (event.shiftKey) {
41
41
  instance.selectRange(event, {
42
- end: nodeId
42
+ end: itemId
43
43
  });
44
44
  } else {
45
- instance.selectNode(event, nodeId, true);
45
+ instance.selectNode(event, itemId, true);
46
46
  }
47
47
  } else {
48
- instance.selectNode(event, nodeId);
48
+ instance.selectNode(event, itemId);
49
49
  }
50
50
  }
51
51
  };
@@ -21,7 +21,7 @@ var _TreeItem = require("../TreeItem");
21
21
  var _TreeItem2Icon = require("../TreeItem2Icon");
22
22
  var _TreeItem2Provider = require("../TreeItem2Provider");
23
23
  var _jsxRuntime = require("react/jsx-runtime");
24
- const _excluded = ["id", "nodeId", "label", "disabled", "children", "slots", "slotProps"];
24
+ const _excluded = ["id", "itemId", "label", "disabled", "children", "slots", "slotProps"];
25
25
  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); }
26
26
  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; }
27
27
  const TreeItem2Root = exports.TreeItem2Root = (0, _styles.styled)('li', {
@@ -173,7 +173,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
173
173
  });
174
174
  const {
175
175
  id,
176
- nodeId,
176
+ itemId,
177
177
  label,
178
178
  disabled,
179
179
  children,
@@ -190,7 +190,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
190
190
  status
191
191
  } = (0, _useTreeItem.unstable_useTreeItem2)({
192
192
  id,
193
- nodeId,
193
+ itemId,
194
194
  children,
195
195
  label,
196
196
  disabled
@@ -242,7 +242,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
242
242
  className: classes.groupTransition
243
243
  });
244
244
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2Provider.TreeItem2Provider, {
245
- nodeId: nodeId,
245
+ itemId: itemId,
246
246
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, (0, _extends2.default)({}, rootProps, {
247
247
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Content, (0, _extends2.default)({}, contentProps, {
248
248
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(IconContainer, (0, _extends2.default)({}, iconContainerProps, {
@@ -273,23 +273,23 @@ process.env.NODE_ENV !== "production" ? TreeItem2.propTypes = {
273
273
  classes: _propTypes.default.object,
274
274
  className: _propTypes.default.string,
275
275
  /**
276
- * If `true`, the node is disabled.
276
+ * If `true`, the item is disabled.
277
277
  * @default false
278
278
  */
279
279
  disabled: _propTypes.default.bool,
280
280
  /**
281
- * The id attribute of the node. If not provided, it will be generated.
281
+ * The id attribute of the item. If not provided, it will be generated.
282
282
  */
283
283
  id: _propTypes.default.string,
284
284
  /**
285
- * The label of the node.
285
+ * The id of the item.
286
+ * Must be unique.
286
287
  */
287
- label: _propTypes.default.node,
288
+ itemId: _propTypes.default.string.isRequired,
288
289
  /**
289
- * The id of the node.
290
- * Must be unique.
290
+ * The label of the item.
291
291
  */
292
- nodeId: _propTypes.default.string.isRequired,
292
+ label: _propTypes.default.node,
293
293
  /**
294
294
  * This prop isn't supported.
295
295
  * Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
@@ -10,14 +10,14 @@ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewCont
10
10
  function TreeItem2Provider(props) {
11
11
  const {
12
12
  children,
13
- nodeId
13
+ itemId
14
14
  } = props;
15
15
  const {
16
16
  wrapItem
17
17
  } = (0, _useTreeViewContext.useTreeViewContext)();
18
18
  return wrapItem({
19
19
  children,
20
- nodeId
20
+ itemId
21
21
  });
22
22
  }
23
23
  TreeItem2Provider.propTypes = {
@@ -26,5 +26,5 @@ TreeItem2Provider.propTypes = {
26
26
  // | To update them edit the TypeScript types and run "yarn proptypes" |
27
27
  // ----------------------------------------------------------------------
28
28
  children: _propTypes.default.node,
29
- nodeId: _propTypes.default.string.isRequired
29
+ itemId: _propTypes.default.string.isRequired
30
30
  };
@@ -39,7 +39,7 @@ const warn = () => {
39
39
 
40
40
  /**
41
41
  * This component has been deprecated in favor of the new `SimpleTreeView` component.
42
- * You can have a look at how to migrate to the new component in the v7 [migration guide](https://next.mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
42
+ * You can have a look at how to migrate to the new component in the v7 [migration guide](https://mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
43
43
  *
44
44
  * Demos:
45
45
  *
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.useTreeItem2Utils = void 0;
7
7
  var _useTreeViewContext = require("../../internals/TreeViewProvider/useTreeViewContext");
8
8
  const useTreeItem2Utils = ({
9
- nodeId,
9
+ itemId,
10
10
  children
11
11
  }) => {
12
12
  const {
@@ -17,23 +17,23 @@ const useTreeItem2Utils = ({
17
17
  } = (0, _useTreeViewContext.useTreeViewContext)();
18
18
  const status = {
19
19
  expandable: Boolean(Array.isArray(children) ? children.length : children),
20
- expanded: instance.isNodeExpanded(nodeId),
21
- focused: instance.isNodeFocused(nodeId),
22
- selected: instance.isNodeSelected(nodeId),
23
- disabled: instance.isNodeDisabled(nodeId)
20
+ expanded: instance.isNodeExpanded(itemId),
21
+ focused: instance.isNodeFocused(itemId),
22
+ selected: instance.isNodeSelected(itemId),
23
+ disabled: instance.isNodeDisabled(itemId)
24
24
  };
25
25
  const handleExpansion = event => {
26
26
  if (status.disabled) {
27
27
  return;
28
28
  }
29
29
  if (!status.focused) {
30
- instance.focusItem(event, nodeId);
30
+ instance.focusItem(event, itemId);
31
31
  }
32
32
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
33
33
 
34
34
  // If already expanded and trying to toggle selection don't close
35
- if (status.expandable && !(multiple && instance.isNodeExpanded(nodeId))) {
36
- instance.toggleNodeExpansion(event, nodeId);
35
+ if (status.expandable && !(multiple && instance.isNodeExpanded(itemId))) {
36
+ instance.toggleNodeExpansion(event, itemId);
37
37
  }
38
38
  };
39
39
  const handleSelection = event => {
@@ -41,19 +41,19 @@ const useTreeItem2Utils = ({
41
41
  return;
42
42
  }
43
43
  if (!status.focused) {
44
- instance.focusItem(event, nodeId);
44
+ instance.focusItem(event, itemId);
45
45
  }
46
46
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
47
47
  if (multiple) {
48
48
  if (event.shiftKey) {
49
49
  instance.selectRange(event, {
50
- end: nodeId
50
+ end: itemId
51
51
  });
52
52
  } else {
53
- instance.selectNode(event, nodeId, true);
53
+ instance.selectNode(event, itemId, true);
54
54
  }
55
55
  } else {
56
- instance.selectNode(event, nodeId);
56
+ instance.selectNode(event, itemId);
57
57
  }
58
58
  };
59
59
  const interactions = {
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.0.0-beta.7
2
+ * @mui/x-tree-view v7.0.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -20,10 +20,10 @@ 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 isNodeExpanded = 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]);
26
+ const isNodeExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
27
27
  const toggleNodeExpansion = (0, _useEventCallback.default)((event, itemId) => {
28
28
  if (itemId == null) {
29
29
  return;
@@ -40,15 +40,15 @@ 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
46
  const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(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);
@@ -14,6 +14,22 @@ var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
14
14
  var _utils = require("../../utils/utils");
15
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
16
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
+ const useTabbableItemId = (instance, selectedItems) => {
18
+ const isItemVisible = itemId => {
19
+ const node = instance.getNode(itemId);
20
+ return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
21
+ };
22
+ let tabbableItemId;
23
+ if (Array.isArray(selectedItems)) {
24
+ tabbableItemId = selectedItems.find(isItemVisible);
25
+ } else if (selectedItems != null && isItemVisible(selectedItems)) {
26
+ tabbableItemId = selectedItems;
27
+ }
28
+ if (tabbableItemId == null) {
29
+ tabbableItemId = instance.getNavigableChildrenIds(null)[0];
30
+ }
31
+ return tabbableItemId;
32
+ };
17
33
  const useTreeViewFocus = ({
18
34
  instance,
19
35
  publicAPI,
@@ -23,30 +39,36 @@ 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.focusedNodeId) : itemId;
45
+ if (state.focusedNodeId !== cleanItemId) {
29
46
  setState(prevState => (0, _extends2.default)({}, prevState, {
30
- focusedNodeId: cleanNodeId
47
+ focusedNodeId: 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);
51
+ const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
52
+ const isNodeFocused = React.useCallback(itemId => state.focusedNodeId === itemId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
53
+ const isNodeVisible = itemId => {
54
+ const node = instance.getNode(itemId);
38
55
  return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
39
56
  };
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
+ };
40
68
  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
- }
69
+ // If we receive a nodeId, and it is visible, the focus will be set to it
70
+ if (isNodeVisible(nodeId)) {
71
+ innerFocusItem(event, nodeId);
50
72
  }
51
73
  });
52
74
  const focusDefaultNode = (0, _useEventCallback.default)(event => {
@@ -59,21 +81,26 @@ const useTreeViewFocus = ({
59
81
  if (nodeToFocusId == null) {
60
82
  nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
61
83
  }
62
- setFocusedNodeId(nodeToFocusId);
63
- if (params.onItemFocus) {
64
- params.onItemFocus(event, nodeToFocusId);
65
- }
84
+ innerFocusItem(event, nodeToFocusId);
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.focusedNodeId == null) {
88
+ return;
89
+ }
90
+ const node = instance.getNode(state.focusedNodeId);
91
+ const itemElement = document.getElementById(instance.getTreeItemId(state.focusedNodeId, node.idAttribute));
92
+ if (itemElement) {
93
+ itemElement.blur();
94
+ }
95
+ setFocusedItemId(null);
71
96
  });
97
+ const canItemBeTabbed = itemId => itemId === tabbableItemId;
72
98
  (0, _useTreeView.populateInstance)(instance, {
73
99
  isNodeFocused,
100
+ canItemBeTabbed,
74
101
  focusItem,
75
- focusRoot,
76
- focusDefaultNode
102
+ focusDefaultNode,
103
+ removeFocusedItem
77
104
  });
78
105
  (0, _useTreeView.populatePublicAPI)(publicAPI, {
79
106
  focusItem
@@ -81,12 +108,9 @@ const useTreeViewFocus = ({
81
108
  (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
82
109
  id
83
110
  }) => {
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
- });
111
+ if (state.focusedNodeId === id) {
112
+ instance.focusDefaultNode(null);
113
+ }
90
114
  });
91
115
  const createHandleFocus = otherHandlers => event => {
92
116
  otherHandlers.onFocus?.(event);
@@ -95,16 +119,11 @@ const useTreeViewFocus = ({
95
119
  instance.focusDefaultNode(event);
96
120
  }
97
121
  };
98
- const createHandleBlur = otherHandlers => event => {
99
- otherHandlers.onBlur?.(event);
100
- setFocusedNodeId(null);
101
- };
102
122
  const focusedNode = instance.getNode(state.focusedNodeId);
103
123
  const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
104
124
  return {
105
125
  getRootProps: otherHandlers => ({
106
126
  onFocus: createHandleFocus(otherHandlers),
107
- onBlur: createHandleBlur(otherHandlers),
108
127
  'aria-activedescendant': activeDescendant ?? undefined
109
128
  })
110
129
  };
@@ -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
  });