@mui/x-tree-view 7.18.0 → 7.20.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 (81) hide show
  1. package/CHANGELOG.md +213 -11
  2. package/RichTreeView/RichTreeView.js +6 -45
  3. package/RichTreeView/RichTreeView.plugins.d.ts +1 -1
  4. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  5. package/TreeItem/TreeItem.js +19 -1
  6. package/TreeItem/TreeItem.types.d.ts +2 -0
  7. package/TreeItem/TreeItemContent.js +25 -29
  8. package/TreeItem2/TreeItem2.d.ts +6 -6
  9. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +24 -6
  10. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +10 -8
  11. package/index.js +1 -1
  12. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +7 -1
  13. package/internals/TreeViewProvider/TreeViewProvider.js +2 -1
  14. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +2 -1
  15. package/internals/TreeViewProvider/useTreeViewContext.d.ts +1 -1
  16. package/internals/components/RichTreeViewItems.d.ts +35 -0
  17. package/internals/components/RichTreeViewItems.js +56 -0
  18. package/internals/corePlugins/corePlugins.d.ts +1 -1
  19. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +28 -7
  20. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +11 -13
  21. package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.d.ts +17 -0
  22. package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +26 -0
  23. package/internals/index.d.ts +1 -0
  24. package/internals/index.js +1 -0
  25. package/internals/models/plugin.d.ts +4 -1
  26. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +3 -1
  27. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -1
  28. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  29. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +9 -2
  30. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  31. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +11 -5
  32. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +6 -0
  33. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -8
  34. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +3 -2
  35. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -1
  36. package/internals/useTreeView/extractPluginParamsFromProps.d.ts +1 -1
  37. package/internals/useTreeView/extractPluginParamsFromProps.js +7 -3
  38. package/modern/RichTreeView/RichTreeView.js +6 -45
  39. package/modern/TreeItem/TreeItem.js +19 -1
  40. package/modern/TreeItem/TreeItemContent.js +25 -29
  41. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +10 -8
  42. package/modern/index.js +1 -1
  43. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +7 -1
  44. package/modern/internals/TreeViewProvider/TreeViewProvider.js +2 -1
  45. package/modern/internals/components/RichTreeViewItems.js +56 -0
  46. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +28 -7
  47. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +26 -0
  48. package/modern/internals/index.js +1 -0
  49. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +3 -1
  50. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -1
  51. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +9 -2
  52. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +11 -5
  53. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +6 -0
  54. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -8
  55. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -1
  56. package/modern/internals/useTreeView/extractPluginParamsFromProps.js +7 -3
  57. package/modern/useTreeItem2/useTreeItem2.js +7 -1
  58. package/node/RichTreeView/RichTreeView.js +6 -45
  59. package/node/TreeItem/TreeItem.js +19 -1
  60. package/node/TreeItem/TreeItemContent.js +25 -29
  61. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +10 -9
  62. package/node/index.js +1 -1
  63. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +7 -1
  64. package/node/internals/TreeViewProvider/TreeViewProvider.js +2 -1
  65. package/node/internals/components/RichTreeViewItems.js +64 -0
  66. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +29 -8
  67. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +34 -0
  68. package/node/internals/index.js +7 -0
  69. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +3 -1
  70. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -1
  71. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +9 -2
  72. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +11 -5
  73. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +6 -0
  74. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -8
  75. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -1
  76. package/node/internals/useTreeView/extractPluginParamsFromProps.js +7 -3
  77. package/node/useTreeItem2/useTreeItem2.js +7 -1
  78. package/package.json +4 -4
  79. package/useTreeItem2/index.d.ts +3 -3
  80. package/useTreeItem2/useTreeItem2.js +7 -1
  81. package/useTreeItem2/useTreeItem2.types.d.ts +1 -1
@@ -6,7 +6,7 @@ export const extractPluginParamsFromProps = _ref => {
6
6
  slots,
7
7
  slotProps,
8
8
  apiRef,
9
- experimentalFeatures
9
+ experimentalFeatures: inExperimentalFeatures
10
10
  },
11
11
  plugins
12
12
  } = _ref,
@@ -25,9 +25,13 @@ export const extractPluginParamsFromProps = _ref => {
25
25
  forwardedProps[propName] = prop;
26
26
  }
27
27
  });
28
+ const experimentalFeatures = inExperimentalFeatures ?? {};
28
29
  const defaultizedPluginParams = plugins.reduce((acc, plugin) => {
29
30
  if (plugin.getDefaultizedParams) {
30
- return plugin.getDefaultizedParams(acc);
31
+ return plugin.getDefaultizedParams({
32
+ params: acc,
33
+ experimentalFeatures
34
+ });
31
35
  }
32
36
  return acc;
33
37
  }, pluginParams);
@@ -37,6 +41,6 @@ export const extractPluginParamsFromProps = _ref => {
37
41
  pluginParams: defaultizedPluginParams,
38
42
  slots: slots ?? {},
39
43
  slotProps: slotProps ?? {},
40
- experimentalFeatures: experimentalFeatures ?? {}
44
+ experimentalFeatures
41
45
  };
42
46
  };
@@ -6,6 +6,7 @@ import { useTreeViewContext } from "../internals/TreeViewProvider/index.js";
6
6
  import { useTreeItem2Utils } from "../hooks/useTreeItem2Utils/index.js";
7
7
  import { TreeViewItemDepthContext } from "../internals/TreeViewItemDepthContext/index.js";
8
8
  import { isTargetInDescendants } from "../internals/utils/tree.js";
9
+ import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
9
10
  export const useTreeItem2 = parameters => {
10
11
  const {
11
12
  runItemPlugins,
@@ -22,6 +23,7 @@ export const useTreeItem2 = parameters => {
22
23
  expansion: {
23
24
  expansionTrigger
24
25
  },
26
+ treeId,
25
27
  instance,
26
28
  publicAPI
27
29
  } = useTreeViewContext();
@@ -47,10 +49,14 @@ export const useTreeItem2 = parameters => {
47
49
  });
48
50
  const rootRefObject = React.useRef(null);
49
51
  const contentRefObject = React.useRef(null);
50
- const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
51
52
  const handleRootRef = useForkRef(rootRef, pluginRootRef, rootRefObject);
52
53
  const handleContentRef = useForkRef(contentRef, contentRefObject);
53
54
  const checkboxRef = React.useRef(null);
55
+ const idAttribute = generateTreeItemIdAttribute({
56
+ itemId,
57
+ treeId,
58
+ id
59
+ });
54
60
  const rootTabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
55
61
  const sharedPropsEnhancerParams = {
56
62
  rootRefObject,
@@ -18,7 +18,7 @@ var _zeroStyled = require("../internals/zero-styled");
18
18
  var _useTreeView = require("../internals/useTreeView");
19
19
  var _TreeViewProvider = require("../internals/TreeViewProvider");
20
20
  var _RichTreeView = require("./RichTreeView.plugins");
21
- var _TreeItem = require("../TreeItem");
21
+ var _RichTreeViewItems = require("../internals/components/RichTreeViewItems");
22
22
  var _jsxRuntime = require("react/jsx-runtime");
23
23
  const useThemeProps = (0, _zeroStyled.createUseThemeProps)('MuiRichTreeView');
24
24
  const useUtilityClasses = ownerState => {
@@ -41,33 +41,6 @@ const RichTreeViewRoot = exports.RichTreeViewRoot = (0, _zeroStyled.styled)('ul'
41
41
  outline: 0,
42
42
  position: 'relative'
43
43
  });
44
- function WrappedTreeItem({
45
- slots,
46
- slotProps,
47
- label,
48
- id,
49
- itemId,
50
- children
51
- }) {
52
- const Item = slots?.item ?? _TreeItem.TreeItem;
53
- const itemProps = (0, _useSlotProps.default)({
54
- elementType: Item,
55
- externalSlotProps: slotProps?.item,
56
- additionalProps: {
57
- itemId,
58
- id,
59
- label
60
- },
61
- ownerState: {
62
- itemId,
63
- label
64
- }
65
- });
66
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(Item, (0, _extends2.default)({}, itemProps, {
67
- children: children
68
- }));
69
- }
70
-
71
44
  /**
72
45
  *
73
46
  * Demos:
@@ -110,26 +83,14 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
110
83
  getSlotProps: getRootProps,
111
84
  ownerState: props
112
85
  });
113
- const itemsToRender = instance.getItemsToRender();
114
- const renderItem = ({
115
- label,
116
- itemId,
117
- id,
118
- children
119
- }) => {
120
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedTreeItem, {
121
- slots: slots,
122
- slotProps: slotProps,
123
- label: label,
124
- id: id,
125
- itemId: itemId,
126
- children: children?.map(renderItem)
127
- }, itemId);
128
- };
129
86
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewProvider.TreeViewProvider, {
130
87
  value: contextValue,
131
88
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Root, (0, _extends2.default)({}, rootProps, {
132
- children: itemsToRender.map(renderItem)
89
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RichTreeViewItems.RichTreeViewItems, {
90
+ slots: slots,
91
+ slotProps: slotProps,
92
+ itemsToRender: instance.getItemsToRender()
93
+ })
133
94
  }))
134
95
  });
135
96
  });
@@ -22,6 +22,7 @@ var _resolveComponentProps = _interopRequireDefault(require("@mui/utils/resolveC
22
22
  var _useSlotProps4 = _interopRequireDefault(require("@mui/utils/useSlotProps"));
23
23
  var _unsupportedProp = _interopRequireDefault(require("@mui/utils/unsupportedProp"));
24
24
  var _elementTypeAcceptingRef = _interopRequireDefault(require("@mui/utils/elementTypeAcceptingRef"));
25
+ var _warning = require("@mui/x-internals/warning");
25
26
  var _zeroStyled = require("../internals/zero-styled");
26
27
  var _TreeItemContent = require("./TreeItemContent");
27
28
  var _treeItemClasses = require("./treeItemClasses");
@@ -31,6 +32,7 @@ var _TreeItem2Provider = require("../TreeItem2Provider");
31
32
  var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
32
33
  var _useTreeItemState = require("./useTreeItemState");
33
34
  var _tree = require("../internals/utils/tree");
35
+ var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
34
36
  var _jsxRuntime = require("react/jsx-runtime");
35
37
  const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
36
38
  _excluded2 = ["ownerState"],
@@ -192,6 +194,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
192
194
  expansion: {
193
195
  expansionTrigger
194
196
  },
197
+ treeId,
195
198
  instance
196
199
  } = (0, _TreeViewProvider.useTreeViewContext)();
197
200
  const depthContext = React.useContext(_TreeViewItemDepthContext.TreeViewItemDepthContext);
@@ -225,6 +228,15 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
225
228
  handleCancelItemLabelEditing,
226
229
  handleSaveItemLabel
227
230
  } = (0, _useTreeItemState.useTreeItemState)(itemId);
231
+ if (process.env.NODE_ENV !== 'production') {
232
+ // Checking directly the `props` to avoid having the default value applied
233
+ if (props.ContentComponent) {
234
+ (0, _warning.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/.']);
235
+ }
236
+ if (props.ContentProps) {
237
+ (0, _warning.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/.']);
238
+ }
239
+ }
228
240
  const {
229
241
  contentRef,
230
242
  rootRef,
@@ -348,7 +360,11 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
348
360
  }
349
361
  instance.handleItemKeyDown(event, itemId);
350
362
  };
351
- const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
363
+ const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
364
+ itemId,
365
+ treeId,
366
+ id
367
+ });
352
368
  const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
353
369
  const sharedPropsEnhancerParams = {
354
370
  rootRefObject,
@@ -443,11 +459,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
443
459
  className: _propTypes.default.string,
444
460
  /**
445
461
  * The component used to render the content of the item.
462
+ * @deprecated Consider using the `TreeItem2` component or the `useTreeItem2` hook instead. For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.
446
463
  * @default TreeItemContent
447
464
  */
448
465
  ContentComponent: _elementTypeAcceptingRef.default,
449
466
  /**
450
467
  * Props applied to ContentComponent.
468
+ * @deprecated Consider using the `TreeItem2` component or the `useTreeItem2` hook instead. For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.
451
469
  */
452
470
  ContentProps: _propTypes.default.object,
453
471
  /**
@@ -81,35 +81,31 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
81
81
  }
82
82
  toggleItemEditing();
83
83
  };
84
- return (
85
- /*#__PURE__*/
86
- /* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions -- Key event is handled by the TreeView */
87
- (0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({}, other, {
88
- className: (0, _clsx.default)(className, classes.root, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
89
- onClick: handleClick,
90
- onMouseDown: handleMouseDown,
91
- ref: ref,
92
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
93
- className: classes.iconContainer,
94
- children: icon
95
- }), checkboxSelection && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
96
- className: classes.checkbox,
97
- checked: selected,
98
- onChange: handleCheckboxSelection,
99
- disabled: disabled || disableSelection,
100
- ref: checkboxRef,
101
- tabIndex: -1
102
- }), editing ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2LabelInput.TreeItem2LabelInput, (0, _extends2.default)({}, labelInputProps, {
103
- className: classes.labelInput
104
- })) : /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
105
- className: classes.label
106
- }, editable && {
107
- onDoubleClick: handleLabelDoubleClick
108
- }, {
109
- children: label
110
- })), dragAndDropOverlayProps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2DragAndDropOverlay.TreeItem2DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
111
- }))
112
- );
84
+ 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 */(0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({}, other, {
85
+ className: (0, _clsx.default)(classes.root, className, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
86
+ onClick: handleClick,
87
+ onMouseDown: handleMouseDown,
88
+ ref: ref,
89
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
90
+ className: classes.iconContainer,
91
+ children: icon
92
+ }), checkboxSelection && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
93
+ className: classes.checkbox,
94
+ checked: selected,
95
+ onChange: handleCheckboxSelection,
96
+ disabled: disabled || disableSelection,
97
+ ref: checkboxRef,
98
+ tabIndex: -1
99
+ }), editing ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2LabelInput.TreeItem2LabelInput, (0, _extends2.default)({}, labelInputProps, {
100
+ className: classes.labelInput
101
+ })) : /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
102
+ className: classes.label
103
+ }, editable && {
104
+ onDoubleClick: handleLabelDoubleClick
105
+ }, {
106
+ children: label
107
+ })), dragAndDropOverlayProps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2DragAndDropOverlay.TreeItem2DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
108
+ }));
113
109
  });
114
110
  process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
115
111
  // ----------------------------- Warning --------------------------------
@@ -7,13 +7,6 @@ exports.useTreeItem2Utils = void 0;
7
7
  var _TreeViewProvider = require("../../internals/TreeViewProvider");
8
8
  var _useTreeViewLabel = require("../../internals/plugins/useTreeViewLabel");
9
9
  var _plugins = require("../../internals/utils/plugins");
10
- const isItemExpandable = reactChildren => {
11
- if (Array.isArray(reactChildren)) {
12
- return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
13
- }
14
- return Boolean(reactChildren);
15
- };
16
-
17
10
  /**
18
11
  * Plugins that need to be present in the Tree View in order for `useTreeItem2Utils` to work correctly.
19
12
  */
@@ -22,6 +15,12 @@ const isItemExpandable = reactChildren => {
22
15
  * Plugins that `useTreeItem2Utils` can use if they are present, but are not required.
23
16
  */
24
17
 
18
+ const isItemExpandable = reactChildren => {
19
+ if (Array.isArray(reactChildren)) {
20
+ return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
21
+ }
22
+ return Boolean(reactChildren);
23
+ };
25
24
  const useTreeItem2Utils = ({
26
25
  itemId,
27
26
  children
@@ -30,7 +29,8 @@ const useTreeItem2Utils = ({
30
29
  instance,
31
30
  selection: {
32
31
  multiSelect
33
- }
32
+ },
33
+ publicAPI
34
34
  } = (0, _TreeViewProvider.useTreeViewContext)();
35
35
  const status = {
36
36
  expandable: isItemExpandable(children),
@@ -140,7 +140,8 @@ const useTreeItem2Utils = ({
140
140
  };
141
141
  return {
142
142
  interactions,
143
- status
143
+ status,
144
+ publicAPI
144
145
  };
145
146
  };
146
147
  exports.useTreeItem2Utils = useTreeItem2Utils;
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.18.0
2
+ * @mui/x-tree-view v7.20.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -11,6 +11,7 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _useTreeViewContext = require("./useTreeViewContext");
13
13
  var _utils = require("../utils/utils");
14
+ var _useTreeViewId = require("../corePlugins/useTreeViewId/useTreeViewId.utils");
14
15
  var _jsxRuntime = require("react/jsx-runtime");
15
16
  const TreeViewChildrenItemContext = exports.TreeViewChildrenItemContext = /*#__PURE__*/React.createContext(null);
16
17
  if (process.env.NODE_ENV !== 'production') {
@@ -23,6 +24,7 @@ function TreeViewChildrenItemProvider(props) {
23
24
  } = props;
24
25
  const {
25
26
  instance,
27
+ treeId,
26
28
  rootRef
27
29
  } = (0, _useTreeViewContext.useTreeViewContext)();
28
30
  const childrenIdAttrToIdRef = React.useRef(new Map());
@@ -37,7 +39,11 @@ function TreeViewChildrenItemProvider(props) {
37
39
  // Undefined during 1st render
38
40
  const itemMeta = instance.getItemMeta(itemId);
39
41
  if (itemMeta !== undefined) {
40
- idAttr = instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute);
42
+ idAttr = (0, _useTreeViewId.generateTreeItemIdAttribute)({
43
+ itemId,
44
+ treeId,
45
+ id: itemMeta.idAttribute
46
+ });
41
47
  }
42
48
  }
43
49
  if (idAttr == null) {
@@ -21,7 +21,8 @@ function TreeViewProvider(props) {
21
21
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewContext.TreeViewContext.Provider, {
22
22
  value: value,
23
23
  children: value.wrapRoot({
24
- children
24
+ children,
25
+ instance: value.instance
25
26
  })
26
27
  });
27
28
  }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.RichTreeViewItems = RichTreeViewItems;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
+ var React = _interopRequireWildcard(require("react"));
12
+ var _useSlotProps2 = _interopRequireDefault(require("@mui/utils/useSlotProps"));
13
+ var _TreeItem = require("../../TreeItem");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ const _excluded = ["ownerState"];
16
+ function WrappedTreeItem({
17
+ slots,
18
+ slotProps,
19
+ label,
20
+ id,
21
+ itemId,
22
+ itemsToRender
23
+ }) {
24
+ const Item = slots?.item ?? _TreeItem.TreeItem;
25
+ const _useSlotProps = (0, _useSlotProps2.default)({
26
+ elementType: Item,
27
+ externalSlotProps: slotProps?.item,
28
+ additionalProps: {
29
+ itemId,
30
+ id,
31
+ label
32
+ },
33
+ ownerState: {
34
+ itemId,
35
+ label
36
+ }
37
+ }),
38
+ itemProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded);
39
+ const children = React.useMemo(() => itemsToRender ? /*#__PURE__*/(0, _jsxRuntime.jsx)(RichTreeViewItems, {
40
+ itemsToRender: itemsToRender,
41
+ slots: slots,
42
+ slotProps: slotProps
43
+ }) : null, [itemsToRender, slots, slotProps]);
44
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Item, (0, _extends2.default)({}, itemProps, {
45
+ children: children
46
+ }));
47
+ }
48
+ function RichTreeViewItems(props) {
49
+ const {
50
+ itemsToRender,
51
+ slots,
52
+ slotProps
53
+ } = props;
54
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
55
+ children: itemsToRender.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedTreeItem, {
56
+ slots: slots,
57
+ slotProps: slotProps,
58
+ label: item.label,
59
+ id: item.id,
60
+ itemId: item.itemId,
61
+ itemsToRender: item.children
62
+ }, item.itemId))
63
+ });
64
+ }
@@ -1,28 +1,49 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
3
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.useTreeViewId = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10
  var React = _interopRequireWildcard(require("react"));
10
- var _useId = _interopRequireDefault(require("@mui/utils/useId"));
11
+ var _useTreeViewId = require("./useTreeViewId.utils");
11
12
  const useTreeViewId = ({
12
- params
13
+ params,
14
+ state,
15
+ setState
13
16
  }) => {
14
- const treeId = (0, _useId.default)(params.id);
15
- const getTreeItemIdAttribute = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
17
+ const treeId = state.id.treeId;
18
+ React.useEffect(() => {
19
+ setState(prevState => {
20
+ if (prevState.id.treeId === params.id) {
21
+ return prevState;
22
+ }
23
+ return (0, _extends2.default)({}, prevState, {
24
+ id: (0, _extends2.default)({}, prevState.id, {
25
+ treeId: params.id ?? (0, _useTreeViewId.createTreeViewDefaultId)()
26
+ })
27
+ });
28
+ });
29
+ }, [setState, params.id]);
16
30
  return {
17
31
  getRootProps: () => ({
18
32
  id: treeId
19
33
  }),
20
- instance: {
21
- getTreeItemIdAttribute
34
+ contextValue: {
35
+ treeId
22
36
  }
23
37
  };
24
38
  };
25
39
  exports.useTreeViewId = useTreeViewId;
26
40
  useTreeViewId.params = {
27
41
  id: true
28
- };
42
+ };
43
+ useTreeViewId.getInitialState = ({
44
+ id
45
+ }) => ({
46
+ id: {
47
+ treeId: id ?? (0, _useTreeViewId.createTreeViewDefaultId)()
48
+ }
49
+ });
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateTreeItemIdAttribute = exports.createTreeViewDefaultId = void 0;
7
+ let globalTreeViewDefaultId = 0;
8
+ const createTreeViewDefaultId = () => {
9
+ globalTreeViewDefaultId += 1;
10
+ return `mui-tree-view-${globalTreeViewDefaultId}`;
11
+ };
12
+
13
+ /**
14
+ * Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a tree item.
15
+ * If the user explicitly defined an id attribute, it will be returned.
16
+ * Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
17
+ * @param {object} params The parameters to determine the id attribute of the item.
18
+ * @param {TreeViewItemId} params.itemId The id of the item to get the id attribute of.
19
+ * @param {string | undefined} params.idAttribute The id attribute of the item if explicitly defined by the user.
20
+ * @param {string} params.treeId The id attribute of the Tree View.
21
+ * @returns {string} The id attribute of the item.
22
+ */
23
+ exports.createTreeViewDefaultId = createTreeViewDefaultId;
24
+ const generateTreeItemIdAttribute = ({
25
+ id,
26
+ treeId = '',
27
+ itemId
28
+ }) => {
29
+ if (id != null) {
30
+ return id;
31
+ }
32
+ return `${treeId}-${itemId}`;
33
+ };
34
+ exports.generateTreeItemIdAttribute = generateTreeItemIdAttribute;
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "RichTreeViewItems", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _RichTreeViewItems.RichTreeViewItems;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "TREE_VIEW_ROOT_PARENT_ID", {
7
13
  enumerable: true,
8
14
  get: function () {
@@ -95,6 +101,7 @@ Object.defineProperty(exports, "useTreeViewSelection", {
95
101
  });
96
102
  var _useTreeView = require("./useTreeView");
97
103
  var _TreeViewProvider = require("./TreeViewProvider");
104
+ var _RichTreeViewItems = require("./components/RichTreeViewItems");
98
105
  var _useInstanceEventHandler = require("./hooks/useInstanceEventHandler");
99
106
  var _useTreeViewExpansion = require("./plugins/useTreeViewExpansion");
100
107
  var _useTreeViewSelection = require("./plugins/useTreeViewSelection");
@@ -95,7 +95,9 @@ useTreeViewExpansion.models = {
95
95
  }
96
96
  };
97
97
  const DEFAULT_EXPANDED_ITEMS = [];
98
- useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
98
+ useTreeViewExpansion.getDefaultizedParams = ({
99
+ params
100
+ }) => (0, _extends2.default)({}, params, {
99
101
  defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
100
102
  });
101
103
  useTreeViewExpansion.params = {
@@ -72,7 +72,7 @@ const useTreeViewFocus = ({
72
72
  }
73
73
  const itemMeta = instance.getItemMeta(state.focusedItemId);
74
74
  if (itemMeta) {
75
- const itemElement = document.getElementById(instance.getTreeItemIdAttribute(state.focusedItemId, itemMeta.idAttribute));
75
+ const itemElement = instance.getItemDOMElement(state.focusedItemId);
76
76
  if (itemElement) {
77
77
  itemElement.blur();
78
78
  }
@@ -12,6 +12,7 @@ var React = _interopRequireWildcard(require("react"));
12
12
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
13
13
  var _useTreeViewItems = require("./useTreeViewItems.utils");
14
14
  var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
15
+ var _useTreeViewId = require("../../corePlugins/useTreeViewId/useTreeViewId.utils");
15
16
  var _jsxRuntime = require("react/jsx-runtime");
16
17
  const _excluded = ["children"];
17
18
  const updateItemsState = ({
@@ -118,7 +119,11 @@ const useTreeViewItems = ({
118
119
  if (itemMeta == null) {
119
120
  return null;
120
121
  }
121
- return document.getElementById(instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute));
122
+ return document.getElementById((0, _useTreeViewId.generateTreeItemIdAttribute)({
123
+ treeId: state.id.treeId,
124
+ itemId,
125
+ id: itemMeta.idAttribute
126
+ }));
122
127
  };
123
128
  const isItemNavigable = itemId => {
124
129
  if (params.disabledItemsFocusable) {
@@ -209,7 +214,9 @@ useTreeViewItems.getInitialState = params => ({
209
214
  getItemLabel: params.getItemLabel
210
215
  })
211
216
  });
212
- useTreeViewItems.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
217
+ useTreeViewItems.getDefaultizedParams = ({
218
+ params
219
+ }) => (0, _extends2.default)({}, params, {
213
220
  disabledItemsFocusable: params.disabledItemsFocusable ?? false,
214
221
  itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
215
222
  });
@@ -16,6 +16,7 @@ var _TreeViewProvider = require("../../TreeViewProvider");
16
16
  var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
17
17
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.utils");
18
18
  var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
19
+ var _useTreeViewId = require("../../corePlugins/useTreeViewId/useTreeViewId.utils");
19
20
  var _jsxRuntime = require("react/jsx-runtime");
20
21
  const useTreeViewJSXItems = ({
21
22
  instance,
@@ -107,7 +108,8 @@ const useTreeViewJSXItemsItemPlugin = ({
107
108
  contentRef
108
109
  }) => {
109
110
  const {
110
- instance
111
+ instance,
112
+ treeId
111
113
  } = (0, _TreeViewProvider.useTreeViewContext)();
112
114
  const {
113
115
  children,
@@ -131,12 +133,16 @@ const useTreeViewJSXItemsItemPlugin = ({
131
133
 
132
134
  // Prevent any flashing
133
135
  (0, _useEnhancedEffect.default)(() => {
134
- const idAttributeWithDefault = instance.getTreeItemIdAttribute(itemId, id);
135
- registerChild(idAttributeWithDefault, itemId);
136
+ const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
137
+ itemId,
138
+ treeId,
139
+ id
140
+ });
141
+ registerChild(idAttribute, itemId);
136
142
  return () => {
137
- unregisterChild(idAttributeWithDefault);
143
+ unregisterChild(idAttribute);
138
144
  };
139
- }, [instance, registerChild, unregisterChild, itemId, id]);
145
+ }, [registerChild, unregisterChild, itemId, id, treeId]);
140
146
  React.useEffect(() => {
141
147
  return instance.insertJSXItem({
142
148
  id: itemId,
@@ -161,6 +161,9 @@ const useTreeViewKeyboardNavigation = ({
161
161
  // If the focused item is collapsed and has children, we expand it
162
162
  case key === 'ArrowRight' && !isRtl || key === 'ArrowLeft' && isRtl:
163
163
  {
164
+ if (ctrlPressed) {
165
+ return;
166
+ }
164
167
  if (instance.isItemExpanded(itemId)) {
165
168
  const nextItemId = (0, _tree.getNextNavigableItem)(instance, itemId);
166
169
  if (nextItemId) {
@@ -178,6 +181,9 @@ const useTreeViewKeyboardNavigation = ({
178
181
  // If the focused item is collapsed and has a parent, we move the focus to this parent
179
182
  case key === 'ArrowLeft' && !isRtl || key === 'ArrowRight' && isRtl:
180
183
  {
184
+ if (ctrlPressed) {
185
+ return;
186
+ }
181
187
  if (canToggleItemExpansion(itemId) && instance.isItemExpanded(itemId)) {
182
188
  instance.toggleItemExpansion(event, itemId);
183
189
  event.preventDefault();