@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
@@ -22,7 +22,7 @@ const useTreeItem2 = parameters => {
22
22
  } = (0, _useTreeViewContext.useTreeViewContext)();
23
23
  const {
24
24
  id,
25
- nodeId,
25
+ itemId,
26
26
  label,
27
27
  children,
28
28
  rootRef
@@ -35,25 +35,34 @@ const useTreeItem2 = parameters => {
35
35
  interactions,
36
36
  status
37
37
  } = (0, _useTreeItem2Utils.useTreeItem2Utils)({
38
- nodeId,
38
+ itemId,
39
39
  children
40
40
  });
41
- const idAttribute = instance.getTreeItemId(nodeId, id);
41
+ const idAttribute = instance.getTreeItemId(itemId, id);
42
42
  const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef);
43
43
  const createRootHandleFocus = otherHandlers => event => {
44
44
  otherHandlers.onFocus?.(event);
45
45
  if (event.defaultMuiPrevented) {
46
46
  return;
47
47
  }
48
-
49
- // DOM focus stays on the tree which manages focus with aria-activedescendant
50
- if (event.target === event.currentTarget) {
51
- instance.focusRoot();
52
- }
53
48
  const canBeFocused = !status.disabled || disabledItemsFocusable;
54
49
  if (!status.focused && canBeFocused && event.currentTarget === event.target) {
55
- instance.focusItem(event, nodeId);
50
+ instance.focusItem(event, itemId);
51
+ }
52
+ };
53
+ const createRootHandleBlur = otherHandlers => event => {
54
+ otherHandlers.onBlur?.(event);
55
+ if (event.defaultMuiPrevented) {
56
+ return;
57
+ }
58
+ instance.removeFocusedItem();
59
+ };
60
+ const createRootHandleKeyDown = otherHandlers => event => {
61
+ otherHandlers.onKeyDown?.(event);
62
+ if (event.defaultMuiPrevented) {
63
+ return;
56
64
  }
65
+ instance.handleItemKeyDown(event, itemId);
57
66
  };
58
67
  const createContentHandleClick = otherHandlers => event => {
59
68
  otherHandlers.onClick?.(event);
@@ -83,7 +92,7 @@ const useTreeItem2 = parameters => {
83
92
  /* single-selection trees unset aria-selected on un-selected items.
84
93
  *
85
94
  * If the tree does not support multiple selection, aria-selected
86
- * is set to true for the selected node and it is not present on any other node in the tree.
95
+ * is set to true for the selected item and it is not present on any other item in the tree.
87
96
  * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
88
97
  */
89
98
  ariaSelected = true;
@@ -91,13 +100,15 @@ const useTreeItem2 = parameters => {
91
100
  return (0, _extends2.default)({}, externalEventHandlers, {
92
101
  ref: handleRootRef,
93
102
  role: 'treeitem',
94
- tabIndex: -1,
103
+ tabIndex: instance.canItemBeTabbed(itemId) ? 0 : -1,
95
104
  id: idAttribute,
96
105
  'aria-expanded': status.expandable ? status.expanded : undefined,
97
106
  'aria-selected': ariaSelected,
98
107
  'aria-disabled': status.disabled || undefined
99
108
  }, externalProps, {
100
- onFocus: createRootHandleFocus(externalEventHandlers)
109
+ onFocus: createRootHandleFocus(externalEventHandlers),
110
+ onBlur: createRootHandleBlur(externalEventHandlers),
111
+ onKeyDown: createRootHandleKeyDown(externalEventHandlers)
101
112
  });
102
113
  };
103
114
  const getContentProps = (externalProps = {}) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.0.0-beta.7",
3
+ "version": "7.0.0",
4
4
  "description": "The community edition of the tree view components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -33,9 +33,9 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@babel/runtime": "^7.24.0",
36
- "@mui/base": "^5.0.0-beta.36",
37
- "@mui/system": "^5.15.9",
38
- "@mui/utils": "^5.15.9",
36
+ "@mui/base": "^5.0.0-beta.40",
37
+ "@mui/system": "^5.15.14",
38
+ "@mui/utils": "^5.15.14",
39
39
  "@types/react-transition-group": "^4.4.10",
40
40
  "clsx": "^2.1.0",
41
41
  "prop-types": "^15.8.1",
@@ -44,7 +44,7 @@
44
44
  "peerDependencies": {
45
45
  "@emotion/react": "^11.9.0",
46
46
  "@emotion/styled": "^11.8.1",
47
- "@mui/material": "^5.15.0",
47
+ "@mui/material": "^5.15.14",
48
48
  "react": "^17.0.0 || ^18.0.0",
49
49
  "react-dom": "^17.0.0 || ^18.0.0"
50
50
  },
@@ -15,7 +15,7 @@ export const useTreeItem2 = parameters => {
15
15
  } = useTreeViewContext();
16
16
  const {
17
17
  id,
18
- nodeId,
18
+ itemId,
19
19
  label,
20
20
  children,
21
21
  rootRef
@@ -28,30 +28,37 @@ export const useTreeItem2 = parameters => {
28
28
  interactions,
29
29
  status
30
30
  } = useTreeItem2Utils({
31
- nodeId,
31
+ itemId,
32
32
  children
33
33
  });
34
- const idAttribute = instance.getTreeItemId(nodeId, id);
34
+ const idAttribute = instance.getTreeItemId(itemId, id);
35
35
  const handleRootRef = useForkRef(rootRef, pluginRootRef);
36
36
  const createRootHandleFocus = otherHandlers => event => {
37
- var _otherHandlers$onFocu;
38
- (_otherHandlers$onFocu = otherHandlers.onFocus) == null || _otherHandlers$onFocu.call(otherHandlers, event);
37
+ otherHandlers.onFocus?.(event);
39
38
  if (event.defaultMuiPrevented) {
40
39
  return;
41
40
  }
42
-
43
- // DOM focus stays on the tree which manages focus with aria-activedescendant
44
- if (event.target === event.currentTarget) {
45
- instance.focusRoot();
46
- }
47
41
  const canBeFocused = !status.disabled || disabledItemsFocusable;
48
42
  if (!status.focused && canBeFocused && event.currentTarget === event.target) {
49
- instance.focusItem(event, nodeId);
43
+ instance.focusItem(event, itemId);
44
+ }
45
+ };
46
+ const createRootHandleBlur = otherHandlers => event => {
47
+ otherHandlers.onBlur?.(event);
48
+ if (event.defaultMuiPrevented) {
49
+ return;
50
+ }
51
+ instance.removeFocusedItem();
52
+ };
53
+ const createRootHandleKeyDown = otherHandlers => event => {
54
+ otherHandlers.onKeyDown?.(event);
55
+ if (event.defaultMuiPrevented) {
56
+ return;
50
57
  }
58
+ instance.handleItemKeyDown(event, itemId);
51
59
  };
52
60
  const createContentHandleClick = otherHandlers => event => {
53
- var _otherHandlers$onClic;
54
- (_otherHandlers$onClic = otherHandlers.onClick) == null || _otherHandlers$onClic.call(otherHandlers, event);
61
+ otherHandlers.onClick?.(event);
55
62
  if (event.defaultMuiPrevented) {
56
63
  return;
57
64
  }
@@ -59,8 +66,7 @@ export const useTreeItem2 = parameters => {
59
66
  interactions.handleSelection(event);
60
67
  };
61
68
  const createContentHandleMouseDown = otherHandlers => event => {
62
- var _otherHandlers$onMous;
63
- (_otherHandlers$onMous = otherHandlers.onMouseDown) == null || _otherHandlers$onMous.call(otherHandlers, event);
69
+ otherHandlers.onMouseDown?.(event);
64
70
  if (event.defaultMuiPrevented) {
65
71
  return;
66
72
  }
@@ -79,7 +85,7 @@ export const useTreeItem2 = parameters => {
79
85
  /* single-selection trees unset aria-selected on un-selected items.
80
86
  *
81
87
  * If the tree does not support multiple selection, aria-selected
82
- * is set to true for the selected node and it is not present on any other node in the tree.
88
+ * is set to true for the selected item and it is not present on any other item in the tree.
83
89
  * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
84
90
  */
85
91
  ariaSelected = true;
@@ -87,13 +93,15 @@ export const useTreeItem2 = parameters => {
87
93
  return _extends({}, externalEventHandlers, {
88
94
  ref: handleRootRef,
89
95
  role: 'treeitem',
90
- tabIndex: -1,
96
+ tabIndex: instance.canItemBeTabbed(itemId) ? 0 : -1,
91
97
  id: idAttribute,
92
98
  'aria-expanded': status.expandable ? status.expanded : undefined,
93
99
  'aria-selected': ariaSelected,
94
100
  'aria-disabled': status.disabled || undefined
95
101
  }, externalProps, {
96
- onFocus: createRootHandleFocus(externalEventHandlers)
102
+ onFocus: createRootHandleFocus(externalEventHandlers),
103
+ onBlur: createRootHandleBlur(externalEventHandlers),
104
+ onKeyDown: createRootHandleKeyDown(externalEventHandlers)
97
105
  });
98
106
  };
99
107
  const getContentProps = (externalProps = {}) => {
@@ -4,21 +4,21 @@ import { MuiCancellableEventHandler } from '../internals/models/MuiCancellableEv
4
4
  import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '../internals/models';
5
5
  export interface UseTreeItem2Parameters {
6
6
  /**
7
- * The id attribute of the node. If not provided, it will be generated.
7
+ * The id attribute of the item. If not provided, it will be generated.
8
8
  */
9
9
  id?: string;
10
10
  /**
11
- * If `true`, the node is disabled.
11
+ * If `true`, the item is disabled.
12
12
  * @default false
13
13
  */
14
14
  disabled?: boolean;
15
15
  /**
16
- * The id of the node.
16
+ * The id of the item.
17
17
  * Must be unique.
18
18
  */
19
- nodeId: TreeViewItemId;
19
+ itemId: TreeViewItemId;
20
20
  /**
21
- * The label of the node.
21
+ * The label of the item.
22
22
  */
23
23
  label?: React.ReactNode;
24
24
  rootRef?: React.Ref<HTMLLIElement>;
@@ -29,12 +29,14 @@ export interface UseTreeItem2Parameters {
29
29
  }
30
30
  export interface UseTreeItem2RootSlotOwnProps {
31
31
  role: 'treeitem';
32
- tabIndex: -1;
32
+ tabIndex: 0 | -1;
33
33
  id: string;
34
34
  'aria-expanded': React.AriaAttributes['aria-expanded'];
35
35
  'aria-selected': React.AriaAttributes['aria-selected'];
36
36
  'aria-disabled': React.AriaAttributes['aria-disabled'];
37
- onFocus: MuiCancellableEventHandler<React.FocusEvent>;
37
+ onFocus: MuiCancellableEventHandler<React.FocusEvent<HTMLElement>>;
38
+ onBlur: MuiCancellableEventHandler<React.FocusEvent<HTMLElement>>;
39
+ onKeyDown: MuiCancellableEventHandler<React.KeyboardEvent<HTMLElement>>;
38
40
  ref: React.RefCallback<HTMLLIElement>;
39
41
  }
40
42
  export type UseTreeItem2RootSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2RootSlotOwnProps;