@mui/x-tree-view 7.19.0 → 7.21.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 (71) hide show
  1. package/CHANGELOG.md +224 -43
  2. package/RichTreeView/RichTreeView.js +14 -53
  3. package/SimpleTreeView/SimpleTreeView.js +8 -8
  4. package/TreeItem/TreeItem.js +25 -12
  5. package/TreeItem/TreeItem.types.d.ts +6 -4
  6. package/TreeItem/TreeItemContent.d.ts +5 -5
  7. package/TreeItem/TreeItemContent.js +29 -33
  8. package/TreeItem/treeItemClasses.d.ts +1 -1
  9. package/TreeItem2/TreeItem2.types.d.ts +1 -1
  10. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
  11. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
  12. package/TreeView/TreeView.d.ts +1 -1
  13. package/TreeView/TreeView.js +8 -8
  14. package/index.js +1 -1
  15. package/internals/components/RichTreeViewItems.d.ts +35 -0
  16. package/internals/components/RichTreeViewItems.js +56 -0
  17. package/internals/corePlugins/corePlugins.d.ts +1 -1
  18. package/internals/corePlugins/corePlugins.js +1 -1
  19. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
  20. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  21. package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.d.ts +1 -1
  22. package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
  23. package/internals/index.d.ts +1 -0
  24. package/internals/index.js +1 -0
  25. package/internals/models/treeView.d.ts +2 -2
  26. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -2
  27. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -1
  28. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  29. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  30. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +8 -8
  31. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  32. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  33. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
  34. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +1 -1
  35. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +3 -3
  36. package/modern/RichTreeView/RichTreeView.js +14 -53
  37. package/modern/SimpleTreeView/SimpleTreeView.js +8 -8
  38. package/modern/TreeItem/TreeItem.js +25 -12
  39. package/modern/TreeItem/TreeItemContent.js +29 -33
  40. package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
  41. package/modern/TreeView/TreeView.js +8 -8
  42. package/modern/index.js +1 -1
  43. package/modern/internals/components/RichTreeViewItems.js +56 -0
  44. package/modern/internals/corePlugins/corePlugins.js +1 -1
  45. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
  46. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
  47. package/modern/internals/index.js +1 -0
  48. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  49. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  50. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
  51. package/modern/useTreeItem2/useTreeItem2.js +11 -11
  52. package/node/RichTreeView/RichTreeView.js +14 -53
  53. package/node/SimpleTreeView/SimpleTreeView.js +8 -8
  54. package/node/TreeItem/TreeItem.js +25 -12
  55. package/node/TreeItem/TreeItemContent.js +29 -33
  56. package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
  57. package/node/TreeView/TreeView.js +8 -8
  58. package/node/index.js +1 -1
  59. package/node/internals/components/RichTreeViewItems.js +64 -0
  60. package/node/internals/corePlugins/corePlugins.js +1 -1
  61. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
  62. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
  63. package/node/internals/index.js +7 -0
  64. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  65. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  66. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
  67. package/node/useTreeItem2/useTreeItem2.js +11 -11
  68. package/package.json +4 -4
  69. package/useTreeItem2/index.d.ts +1 -1
  70. package/useTreeItem2/useTreeItem2.js +11 -11
  71. package/useTreeItem2/useTreeItem2.types.d.ts +2 -2
@@ -1,7 +1,7 @@
1
1
  import { TreeViewItemId } from '../../../models';
2
2
  export declare const createTreeViewDefaultId: () => string;
3
3
  /**
4
- * Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a tree item.
4
+ * Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
5
5
  * If the user explicitly defined an id attribute, it will be returned.
6
6
  * Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
7
7
  * @param {object} params The parameters to determine the id attribute of the item.
@@ -5,7 +5,7 @@ export const createTreeViewDefaultId = () => {
5
5
  };
6
6
 
7
7
  /**
8
- * Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a tree item.
8
+ * Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
9
9
  * If the user explicitly defined an id attribute, it will be returned.
10
10
  * Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
11
11
  * @param {object} params The parameters to determine the id attribute of the item.
@@ -1,5 +1,6 @@
1
1
  export { useTreeView } from './useTreeView';
2
2
  export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
3
+ export { RichTreeViewItems } from './components/RichTreeViewItems';
3
4
  export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
4
5
  export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, DefaultizedProps, TreeViewItemPlugin, MuiCancellableEvent, MuiCancellableEventHandler, } from './models';
5
6
  export type { TreeViewCorePluginParameters } from './corePlugins';
@@ -1,5 +1,6 @@
1
1
  export { useTreeView } from "./useTreeView/index.js";
2
2
  export { TreeViewProvider, useTreeViewContext } from "./TreeViewProvider/index.js";
3
+ export { RichTreeViewItems } from "./components/RichTreeViewItems.js";
3
4
  export { unstable_resetCleanupTracking } from "./hooks/useInstanceEventHandler.js";
4
5
 
5
6
  // Core plugins
@@ -8,11 +8,11 @@ export interface TreeViewItemMeta {
8
8
  expandable: boolean;
9
9
  disabled: boolean;
10
10
  /**
11
- * Only defined for `RichTreeView` and `RichTreeViewPro`.
11
+ * Only defined for `<RichTreeView />` and `<RichTreeViewPro />`.
12
12
  */
13
13
  depth?: number;
14
14
  /**
15
- * Only defined for `RichTreeView` and `RichTreeViewPro`.
15
+ * Only defined for `<RichTreeView />` and `<RichTreeViewPro />`.
16
16
  */
17
17
  label?: string;
18
18
  }
@@ -54,13 +54,13 @@ export interface UseTreeViewExpansionParameters {
54
54
  */
55
55
  defaultExpandedItems?: string[];
56
56
  /**
57
- * Callback fired when tree items are expanded/collapsed.
57
+ * Callback fired when Tree Items are expanded/collapsed.
58
58
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
59
59
  * @param {array} itemIds The ids of the expanded items.
60
60
  */
61
61
  onExpandedItemsChange?: (event: React.SyntheticEvent, itemIds: string[]) => void;
62
62
  /**
63
- * Callback fired when a tree item is expanded or collapsed.
63
+ * Callback fired when a Tree Item is expanded or collapsed.
64
64
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
65
65
  * @param {array} itemId The itemId of the modified item.
66
66
  * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
@@ -37,7 +37,7 @@ export interface UseTreeViewFocusInstance extends UseTreeViewFocusPublicAPI {
37
37
  }
38
38
  export interface UseTreeViewFocusParameters {
39
39
  /**
40
- * Callback fired when a given tree item is focused.
40
+ * Callback fired when a given Tree Item is focused.
41
41
  * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
42
42
  * @param {string} itemId The id of the focused item.
43
43
  */
@@ -17,7 +17,7 @@ interface UseTreeViewIconsSlots {
17
17
  expandIcon?: React.ElementType;
18
18
  /**
19
19
  * The default icon displayed next to an end item.
20
- * This is applied to all tree items and can be overridden by the TreeItem `icon` slot prop.
20
+ * This is applied to all Tree Items and can be overridden by the TreeItem `icon` slot prop.
21
21
  */
22
22
  endIcon?: React.ElementType;
23
23
  }
@@ -1,3 +1,3 @@
1
1
  export { useTreeViewItems } from './useTreeViewItems';
2
- export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, UseTreeViewItemsState, } from './useTreeViewItems.types';
2
+ export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, UseTreeViewItemsState, TreeViewItemToRenderProps, } from './useTreeViewItems.types';
3
3
  export { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils';
@@ -1,16 +1,16 @@
1
1
  import * as React from 'react';
2
2
  import { TreeViewItemMeta, DefaultizedProps, TreeViewPluginSignature } from '../../models';
3
3
  import { TreeViewBaseItem, TreeViewItemId } from '../../../models';
4
- interface TreeViewItemProps {
4
+ export interface TreeViewItemToRenderProps {
5
5
  label: string;
6
6
  itemId: string;
7
7
  id: string | undefined;
8
- children?: TreeViewItemProps[];
8
+ children?: TreeViewItemToRenderProps[];
9
9
  }
10
10
  export interface UseTreeViewItemsPublicAPI<R extends {}> {
11
11
  /**
12
12
  * Get the item with the given id.
13
- * When used in the `SimpleTreeView`, it returns an object with the `id` and `label` properties.
13
+ * When used in the Simple Tree View, it returns an object with the `id` and `label` properties.
14
14
  * @param {string} itemId The id of the item to retrieve.
15
15
  * @returns {R} The item with the given id.
16
16
  */
@@ -31,7 +31,7 @@ export interface UseTreeViewItemsPublicAPI<R extends {}> {
31
31
  getItemOrderedChildrenIds: (itemId: TreeViewItemId | null) => TreeViewItemId[];
32
32
  /**
33
33
  * Get all the items in the same format as provided by `props.items`.
34
- * @returns {TreeViewItemProps[]} The items in the tree.
34
+ * @returns {TreeViewItemToRenderProps[]} The items in the tree.
35
35
  */
36
36
  getItemTree: () => TreeViewBaseItem[];
37
37
  }
@@ -46,10 +46,10 @@ export interface UseTreeViewItemsInstance<R extends {}> extends UseTreeViewItems
46
46
  /**
47
47
  * Get the item that should be rendered.
48
48
  * This method is only used on Rich Tree View components.
49
- * Check the `TreeViewItemProps` type for more information.
50
- * @returns {TreeViewItemProps[]} The items to render.
49
+ * Check the `TreeViewItemToRenderProps` type for more information.
50
+ * @returns {TreeViewItemToRenderProps[]} The items to render.
51
51
  */
52
- getItemsToRender: () => TreeViewItemProps[];
52
+ getItemsToRender: () => TreeViewItemToRenderProps[];
53
53
  /**
54
54
  * Check if a given item is disabled.
55
55
  * An item is disabled if it was marked as disabled or if one of its ancestors is disabled.
@@ -117,7 +117,7 @@ export interface UseTreeViewItemsParameters<R extends {
117
117
  */
118
118
  getItemId?: (item: R) => TreeViewItemId;
119
119
  /**
120
- * Callback fired when the `content` slot of a given tree item is clicked.
120
+ * Callback fired when the `content` slot of a given Tree Item is clicked.
121
121
  * @param {React.MouseEvent} event The DOM event that triggered the change.
122
122
  * @param {string} itemId The id of the focused item.
123
123
  */
@@ -25,7 +25,7 @@ export const useTreeViewJSXItems = ({
25
25
  itemMetaMap: _extends({}, prevState.items.itemMetaMap, {
26
26
  [item.id]: item
27
27
  }),
28
- // For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
28
+ // For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
29
29
  itemMap: _extends({}, prevState.items.itemMap, {
30
30
  [item.id]: {
31
31
  id: item.id,
@@ -4,7 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
5
5
  import { hasPlugin } from "../../utils/plugins.js";
6
6
  import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
7
- function isPrintableCharacter(string) {
7
+ function isPrintableKey(string) {
8
8
  return !!string && string.length === 1 && !!string.match(/\S/);
9
9
  }
10
10
  export const useTreeViewKeyboardNavigation = ({
@@ -227,7 +227,7 @@ export const useTreeViewKeyboardNavigation = ({
227
227
 
228
228
  // Multi select behavior when pressing Ctrl + a
229
229
  // Selects all the items
230
- case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
230
+ case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && params.multiSelect && !params.disableSelection:
231
231
  {
232
232
  instance.selectAllNavigableItems(event);
233
233
  event.preventDefault();
@@ -236,7 +236,7 @@ export const useTreeViewKeyboardNavigation = ({
236
236
 
237
237
  // Type-ahead
238
238
  // TODO: Support typing multiple characters
239
- case !ctrlPressed && !event.shiftKey && isPrintableCharacter(key):
239
+ case !ctrlPressed && !event.shiftKey && isPrintableKey(key):
240
240
  {
241
241
  const matchingItem = getFirstMatchingItem(itemId, key);
242
242
  if (matchingItem != null) {
@@ -73,7 +73,7 @@ useTreeViewLabel.getDefaultizedParams = ({
73
73
  const canUseFeature = experimentalFeatures?.labelEditing;
74
74
  if (process.env.NODE_ENV !== 'production') {
75
75
  if (params.isItemEditable && !canUseFeature) {
76
- warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the `RichTreeViewPro` component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/editing/']);
76
+ warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/editing/']);
77
77
  }
78
78
  }
79
79
  return _extends({}, params, {
@@ -37,7 +37,7 @@ export interface UseTreeViewLabelInstance extends UseTreeViewLabelPublicAPI {
37
37
  */
38
38
  isItemEditable: (itemId: TreeViewItemId) => boolean;
39
39
  /**
40
- * Set to `true` if the tree view is editable.
40
+ * Set to `true` if the Tree View is editable.
41
41
  */
42
42
  isTreeViewEditable: boolean;
43
43
  }
@@ -80,19 +80,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
80
80
  */
81
81
  multiSelect?: Multiple;
82
82
  /**
83
- * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
83
+ * If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
84
84
  * @default false
85
85
  */
86
86
  checkboxSelection?: boolean;
87
87
  /**
88
- * Callback fired when tree items are selected/deselected.
88
+ * Callback fired when Tree Items are selected/deselected.
89
89
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
90
90
  * @param {string[] | string} itemIds The ids of the selected items.
91
91
  * When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
92
92
  */
93
93
  onSelectedItemsChange?: (event: React.SyntheticEvent, itemIds: TreeViewSelectionValue<Multiple>) => void;
94
94
  /**
95
- * Callback fired when a tree item is selected or deselected.
95
+ * Callback fired when a Tree Item is selected or deselected.
96
96
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
97
97
  * @param {array} itemId The itemId of the modified item.
98
98
  * @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
@@ -11,7 +11,7 @@ import { styled, createUseThemeProps } from "../internals/zero-styled/index.js";
11
11
  import { useTreeView } from "../internals/useTreeView/index.js";
12
12
  import { TreeViewProvider } from "../internals/TreeViewProvider/index.js";
13
13
  import { RICH_TREE_VIEW_PLUGINS } from "./RichTreeView.plugins.js";
14
- import { TreeItem } from "../TreeItem/index.js";
14
+ import { RichTreeViewItems } from "../internals/components/RichTreeViewItems.js";
15
15
  import { jsx as _jsx } from "react/jsx-runtime";
16
16
  const useThemeProps = createUseThemeProps('MuiRichTreeView');
17
17
  const useUtilityClasses = ownerState => {
@@ -34,33 +34,6 @@ export const RichTreeViewRoot = styled('ul', {
34
34
  outline: 0,
35
35
  position: 'relative'
36
36
  });
37
- function WrappedTreeItem({
38
- slots,
39
- slotProps,
40
- label,
41
- id,
42
- itemId,
43
- children
44
- }) {
45
- const Item = slots?.item ?? TreeItem;
46
- const itemProps = useSlotProps({
47
- elementType: Item,
48
- externalSlotProps: slotProps?.item,
49
- additionalProps: {
50
- itemId,
51
- id,
52
- label
53
- },
54
- ownerState: {
55
- itemId,
56
- label
57
- }
58
- });
59
- return /*#__PURE__*/_jsx(Item, _extends({}, itemProps, {
60
- children: children
61
- }));
62
- }
63
-
64
37
  /**
65
38
  *
66
39
  * Demos:
@@ -78,7 +51,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
78
51
  });
79
52
  if (process.env.NODE_ENV !== 'production') {
80
53
  if (props.children != null) {
81
- warnOnce(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/items/.']);
54
+ warnOnce(['MUI X: The Rich Tree View component does not support JSX children.', 'If you want to add items, you need to use the `items` prop.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/items/.']);
82
55
  }
83
56
  }
84
57
  const {
@@ -103,26 +76,14 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
103
76
  getSlotProps: getRootProps,
104
77
  ownerState: props
105
78
  });
106
- const itemsToRender = instance.getItemsToRender();
107
- const renderItem = ({
108
- label,
109
- itemId,
110
- id,
111
- children
112
- }) => {
113
- return /*#__PURE__*/_jsx(WrappedTreeItem, {
114
- slots: slots,
115
- slotProps: slotProps,
116
- label: label,
117
- id: id,
118
- itemId: itemId,
119
- children: children?.map(renderItem)
120
- }, itemId);
121
- };
122
79
  return /*#__PURE__*/_jsx(TreeViewProvider, {
123
80
  value: contextValue,
124
81
  children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {
125
- children: itemsToRender.map(renderItem)
82
+ children: /*#__PURE__*/_jsx(RichTreeViewItems, {
83
+ slots: slots,
84
+ slotProps: slotProps,
85
+ itemsToRender: instance.getItemsToRender()
86
+ })
126
87
  }))
127
88
  });
128
89
  });
@@ -147,7 +108,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
147
108
  })
148
109
  }),
149
110
  /**
150
- * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
111
+ * If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
151
112
  * @default false
152
113
  */
153
114
  checkboxSelection: PropTypes.bool,
@@ -250,26 +211,26 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
250
211
  */
251
212
  multiSelect: PropTypes.bool,
252
213
  /**
253
- * Callback fired when tree items are expanded/collapsed.
214
+ * Callback fired when Tree Items are expanded/collapsed.
254
215
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
255
216
  * @param {array} itemIds The ids of the expanded items.
256
217
  */
257
218
  onExpandedItemsChange: PropTypes.func,
258
219
  /**
259
- * Callback fired when the `content` slot of a given tree item is clicked.
220
+ * Callback fired when the `content` slot of a given Tree Item is clicked.
260
221
  * @param {React.MouseEvent} event The DOM event that triggered the change.
261
222
  * @param {string} itemId The id of the focused item.
262
223
  */
263
224
  onItemClick: PropTypes.func,
264
225
  /**
265
- * Callback fired when a tree item is expanded or collapsed.
226
+ * Callback fired when a Tree Item is expanded or collapsed.
266
227
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
267
228
  * @param {array} itemId The itemId of the modified item.
268
229
  * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
269
230
  */
270
231
  onItemExpansionToggle: PropTypes.func,
271
232
  /**
272
- * Callback fired when a given tree item is focused.
233
+ * Callback fired when a given Tree Item is focused.
273
234
  * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
274
235
  * @param {string} itemId The id of the focused item.
275
236
  */
@@ -281,14 +242,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
281
242
  */
282
243
  onItemLabelChange: PropTypes.func,
283
244
  /**
284
- * Callback fired when a tree item is selected or deselected.
245
+ * Callback fired when a Tree Item is selected or deselected.
285
246
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
286
247
  * @param {array} itemId The itemId of the modified item.
287
248
  * @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
288
249
  */
289
250
  onItemSelectionToggle: PropTypes.func,
290
251
  /**
291
- * Callback fired when tree items are selected/deselected.
252
+ * Callback fired when Tree Items are selected/deselected.
292
253
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
293
254
  * @param {string[] | string} itemIds The ids of the selected items.
294
255
  * When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
@@ -53,7 +53,7 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
53
53
  const ownerState = props;
54
54
  if (process.env.NODE_ENV !== 'production') {
55
55
  if (props.items != null) {
56
- warnOnce(['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/.']);
56
+ warnOnce(['MUI X: The Simple Tree View 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/.']);
57
57
  }
58
58
  }
59
59
  const {
@@ -104,7 +104,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
104
104
  })
105
105
  }),
106
106
  /**
107
- * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
107
+ * If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
108
108
  * @default false
109
109
  */
110
110
  checkboxSelection: PropTypes.bool,
@@ -174,39 +174,39 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
174
174
  */
175
175
  multiSelect: PropTypes.bool,
176
176
  /**
177
- * Callback fired when tree items are expanded/collapsed.
177
+ * Callback fired when Tree Items are expanded/collapsed.
178
178
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
179
179
  * @param {array} itemIds The ids of the expanded items.
180
180
  */
181
181
  onExpandedItemsChange: PropTypes.func,
182
182
  /**
183
- * Callback fired when the `content` slot of a given tree item is clicked.
183
+ * Callback fired when the `content` slot of a given Tree Item is clicked.
184
184
  * @param {React.MouseEvent} event The DOM event that triggered the change.
185
185
  * @param {string} itemId The id of the focused item.
186
186
  */
187
187
  onItemClick: PropTypes.func,
188
188
  /**
189
- * Callback fired when a tree item is expanded or collapsed.
189
+ * Callback fired when a Tree Item is expanded or collapsed.
190
190
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
191
191
  * @param {array} itemId The itemId of the modified item.
192
192
  * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
193
193
  */
194
194
  onItemExpansionToggle: PropTypes.func,
195
195
  /**
196
- * Callback fired when a given tree item is focused.
196
+ * Callback fired when a given Tree Item is focused.
197
197
  * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
198
198
  * @param {string} itemId The id of the focused item.
199
199
  */
200
200
  onItemFocus: PropTypes.func,
201
201
  /**
202
- * Callback fired when a tree item is selected or deselected.
202
+ * Callback fired when a Tree Item is selected or deselected.
203
203
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
204
204
  * @param {array} itemId The itemId of the modified item.
205
205
  * @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
206
206
  */
207
207
  onItemSelectionToggle: PropTypes.func,
208
208
  /**
209
- * Callback fired when tree items are selected/deselected.
209
+ * Callback fired when Tree Items are selected/deselected.
210
210
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
211
211
  * @param {string[] | string} itemIds The ids of the selected items.
212
212
  * When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
@@ -19,6 +19,7 @@ import resolveComponentProps from '@mui/utils/resolveComponentProps';
19
19
  import useSlotProps from '@mui/utils/useSlotProps';
20
20
  import unsupportedProp from '@mui/utils/unsupportedProp';
21
21
  import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
22
+ import { warnOnce } from '@mui/x-internals/warning';
22
23
  import { styled, createUseThemeProps } from "../internals/zero-styled/index.js";
23
24
  import { TreeItemContent } from "./TreeItemContent.js";
24
25
  import { treeItemClasses, getTreeItemUtilityClass } from "./treeItemClasses.js";
@@ -181,7 +182,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
181
182
  indentationAtItemLevel
182
183
  },
183
184
  selection: {
184
- multiSelect
185
+ disableSelection
185
186
  },
186
187
  expansion: {
187
188
  expansionTrigger
@@ -220,6 +221,15 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
220
221
  handleCancelItemLabelEditing,
221
222
  handleSaveItemLabel
222
223
  } = useTreeItemState(itemId);
224
+ if (process.env.NODE_ENV !== 'production') {
225
+ // Checking directly the `props` to avoid having the default value applied
226
+ if (props.ContentComponent) {
227
+ warnOnce(['MUI X: The ContentComponent prop of the TreeItem component is deprecated and will be removed in the next major release.', 'You can use the new TreeItem2 component or the new useTreeItem2 hook to customize the rendering of the content.', 'For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.']);
228
+ }
229
+ if (props.ContentProps) {
230
+ warnOnce(['MUI X: The ContentProps prop of the TreeItem component is deprecated and will be removed in the next major release.', 'You can use the new TreeItem2 component or the new useTreeItem2 hook to customize the rendering of the content.', 'For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.']);
231
+ }
232
+ }
223
233
  const {
224
234
  contentRef,
225
235
  rootRef,
@@ -308,17 +318,18 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
308
318
  }),
309
319
  iconProps = _objectWithoutPropertiesLoose(_useSlotProps3, _excluded4);
310
320
  const icon = Icon ? /*#__PURE__*/_jsx(Icon, _extends({}, iconProps)) : null;
321
+
322
+ // https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
311
323
  let ariaSelected;
312
- if (multiSelect) {
313
- ariaSelected = selected;
314
- } else if (selected) {
315
- /* single-selection trees unset aria-selected on un-selected items.
316
- *
317
- * If the tree does not support multiple selection, aria-selected
318
- * is set to true for the selected item and it is not present on any other item in the tree.
319
- * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
320
- */
324
+ if (selected) {
325
+ // - each selected node has aria-selected set to true.
321
326
  ariaSelected = true;
327
+ } else if (disableSelection || disabled) {
328
+ // - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
329
+ ariaSelected = undefined;
330
+ } else {
331
+ // - all nodes that are selectable but not selected have aria-selected set to false.
332
+ ariaSelected = false;
322
333
  }
323
334
  function handleFocus(event) {
324
335
  const canBeFocused = !disabled || disabledItemsFocusable;
@@ -329,7 +340,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
329
340
  function handleBlur(event) {
330
341
  onBlur?.(event);
331
342
  if (editing ||
332
- // we can exit the editing state by clicking outside the input (within the tree item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
343
+ // we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
333
344
  // we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
334
345
  event.relatedTarget && isTargetInDescendants(event.relatedTarget, rootRefObject.current) && (event.target && event.target?.dataset?.element === 'labelInput' && isTargetInDescendants(event.target, rootRefObject.current) || event.relatedTarget?.dataset?.element === 'labelInput')) {
335
346
  return;
@@ -442,11 +453,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
442
453
  className: PropTypes.string,
443
454
  /**
444
455
  * The component used to render the content of the item.
456
+ * @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
445
457
  * @default TreeItemContent
446
458
  */
447
459
  ContentComponent: elementTypeAcceptingRef,
448
460
  /**
449
461
  * Props applied to ContentComponent.
462
+ * @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
450
463
  */
451
464
  ContentProps: PropTypes.object,
452
465
  /**
@@ -459,7 +472,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
459
472
  */
460
473
  itemId: PropTypes.string.isRequired,
461
474
  /**
462
- * The tree item label.
475
+ * The Tree Item label.
463
476
  */
464
477
  label: PropTypes.node,
465
478
  /**
@@ -73,35 +73,31 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
73
73
  }
74
74
  toggleItemEditing();
75
75
  };
76
- return (
77
- /*#__PURE__*/
78
- /* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions -- Key event is handled by the TreeView */
79
- _jsxs("div", _extends({}, other, {
80
- className: clsx(classes.root, className, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
81
- onClick: handleClick,
82
- onMouseDown: handleMouseDown,
83
- ref: ref,
84
- children: [/*#__PURE__*/_jsx("div", {
85
- className: classes.iconContainer,
86
- children: icon
87
- }), checkboxSelection && /*#__PURE__*/_jsx(Checkbox, {
88
- className: classes.checkbox,
89
- checked: selected,
90
- onChange: handleCheckboxSelection,
91
- disabled: disabled || disableSelection,
92
- ref: checkboxRef,
93
- tabIndex: -1
94
- }), editing ? /*#__PURE__*/_jsx(TreeItem2LabelInput, _extends({}, labelInputProps, {
95
- className: classes.labelInput
96
- })) : /*#__PURE__*/_jsx("div", _extends({
97
- className: classes.label
98
- }, editable && {
99
- onDoubleClick: handleLabelDoubleClick
100
- }, {
101
- children: label
102
- })), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
103
- }))
104
- );
76
+ return /*#__PURE__*/ /* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions -- Key event is handled by the TreeView */_jsxs("div", _extends({}, other, {
77
+ className: clsx(classes.root, className, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
78
+ onClick: handleClick,
79
+ onMouseDown: handleMouseDown,
80
+ ref: ref,
81
+ children: [/*#__PURE__*/_jsx("div", {
82
+ className: classes.iconContainer,
83
+ children: icon
84
+ }), checkboxSelection && /*#__PURE__*/_jsx(Checkbox, {
85
+ className: classes.checkbox,
86
+ checked: selected,
87
+ onChange: handleCheckboxSelection,
88
+ disabled: disabled || disableSelection,
89
+ ref: checkboxRef,
90
+ tabIndex: -1
91
+ }), editing ? /*#__PURE__*/_jsx(TreeItem2LabelInput, _extends({}, labelInputProps, {
92
+ className: classes.labelInput
93
+ })) : /*#__PURE__*/_jsx("div", _extends({
94
+ className: classes.label
95
+ }, editable && {
96
+ onDoubleClick: handleLabelDoubleClick
97
+ }, {
98
+ children: label
99
+ })), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
100
+ }));
105
101
  });
106
102
  process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
107
103
  // ----------------------------- Warning --------------------------------
@@ -114,7 +110,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
114
110
  classes: PropTypes.object.isRequired,
115
111
  className: PropTypes.string,
116
112
  /**
117
- * The icon to display next to the tree item's label. Either a parent or end icon.
113
+ * The icon to display next to the Tree Item's label. Either a parent or end icon.
118
114
  */
119
115
  displayIcon: PropTypes.node,
120
116
  dragAndDropOverlayProps: PropTypes.shape({
@@ -122,11 +118,11 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
122
118
  style: PropTypes.object
123
119
  }),
124
120
  /**
125
- * The icon to display next to the tree item's label. Either an expansion or collapse icon.
121
+ * The icon to display next to the Tree Item's label. Either an expansion or collapse icon.
126
122
  */
127
123
  expansionIcon: PropTypes.node,
128
124
  /**
129
- * The icon to display next to the tree item's label.
125
+ * The icon to display next to the Tree Item's label.
130
126
  */
131
127
  icon: PropTypes.node,
132
128
  /**
@@ -134,7 +130,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
134
130
  */
135
131
  itemId: PropTypes.string.isRequired,
136
132
  /**
137
- * The tree item label.
133
+ * The Tree Item label.
138
134
  */
139
135
  label: PropTypes.node,
140
136
  labelInputProps: PropTypes.shape({