@mui/x-tree-view 7.11.0 → 7.12.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 (111) hide show
  1. package/CHANGELOG.md +194 -4
  2. package/RichTreeView/RichTreeView.js +11 -7
  3. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  4. package/SimpleTreeView/SimpleTreeView.js +11 -7
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +1 -1
  6. package/TreeItem/TreeItem.js +36 -10
  7. package/TreeItem/TreeItem.types.d.ts +1 -1
  8. package/TreeItem/TreeItemContent.d.ts +2 -0
  9. package/TreeItem/TreeItemContent.js +11 -3
  10. package/TreeItem/treeItemClasses.d.ts +2 -0
  11. package/TreeItem/treeItemClasses.js +1 -1
  12. package/TreeItem/useTreeItemState.d.ts +1 -0
  13. package/TreeItem/useTreeItemState.js +5 -1
  14. package/TreeItem2/TreeItem2.js +15 -3
  15. package/TreeItem2/TreeItem2.types.d.ts +8 -1
  16. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +4 -0
  17. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
  18. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts +6 -0
  19. package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
  20. package/TreeItem2DragAndDropOverlay/index.d.ts +2 -0
  21. package/TreeItem2DragAndDropOverlay/index.js +1 -0
  22. package/TreeItem2DragAndDropOverlay/package.json +6 -0
  23. package/TreeItem2Icon/TreeItem2Icon.js +3 -2
  24. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
  25. package/TreeItem2Provider/TreeItem2Provider.js +1 -1
  26. package/TreeView/TreeView.js +8 -3
  27. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
  28. package/index.js +1 -1
  29. package/internals/TreeViewProvider/index.d.ts +1 -0
  30. package/internals/TreeViewProvider/index.js +2 -1
  31. package/internals/index.d.ts +6 -5
  32. package/internals/index.js +4 -3
  33. package/internals/models/index.d.ts +2 -0
  34. package/internals/models/index.js +3 -1
  35. package/internals/models/itemPlugin.d.ts +37 -0
  36. package/internals/models/itemPlugin.js +1 -0
  37. package/internals/models/plugin.d.ts +2 -15
  38. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -3
  39. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  40. package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  41. package/internals/plugins/useTreeViewItems/index.js +2 -1
  42. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  43. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +18 -4
  44. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  45. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
  46. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +1 -2
  47. package/internals/useTreeView/useTreeView.types.d.ts +1 -1
  48. package/internals/useTreeView/useTreeViewBuildContext.js +23 -1
  49. package/internals/utils/tree.d.ts +8 -0
  50. package/internals/utils/tree.js +11 -0
  51. package/internals/utils/warning.d.ts +2 -1
  52. package/internals/utils/warning.js +19 -12
  53. package/models/items.d.ts +1 -0
  54. package/modern/RichTreeView/RichTreeView.js +11 -7
  55. package/modern/SimpleTreeView/SimpleTreeView.js +11 -7
  56. package/modern/TreeItem/TreeItem.js +36 -10
  57. package/modern/TreeItem/TreeItemContent.js +11 -3
  58. package/modern/TreeItem/treeItemClasses.js +1 -1
  59. package/modern/TreeItem/useTreeItemState.js +5 -1
  60. package/modern/TreeItem2/TreeItem2.js +15 -3
  61. package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
  62. package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
  63. package/modern/TreeItem2DragAndDropOverlay/index.js +1 -0
  64. package/modern/TreeItem2Icon/TreeItem2Icon.js +3 -2
  65. package/modern/TreeItem2Provider/TreeItem2Provider.js +1 -1
  66. package/modern/TreeView/TreeView.js +8 -3
  67. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
  68. package/modern/index.js +1 -1
  69. package/modern/internals/TreeViewProvider/index.js +2 -1
  70. package/modern/internals/index.js +4 -3
  71. package/modern/internals/models/index.js +3 -1
  72. package/modern/internals/models/itemPlugin.js +1 -0
  73. package/modern/internals/plugins/useTreeViewItems/index.js +2 -1
  74. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  75. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  76. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
  77. package/modern/internals/useTreeView/useTreeViewBuildContext.js +23 -1
  78. package/modern/internals/utils/tree.js +11 -0
  79. package/modern/internals/utils/warning.js +19 -12
  80. package/modern/useTreeItem2/useTreeItem2.js +43 -15
  81. package/node/RichTreeView/RichTreeView.js +12 -8
  82. package/node/SimpleTreeView/SimpleTreeView.js +11 -7
  83. package/node/TreeItem/TreeItem.js +45 -19
  84. package/node/TreeItem/TreeItemContent.js +11 -3
  85. package/node/TreeItem/treeItemClasses.js +1 -1
  86. package/node/TreeItem/useTreeItemState.js +6 -2
  87. package/node/TreeItem2/TreeItem2.js +21 -9
  88. package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +77 -0
  89. package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +5 -0
  90. package/node/TreeItem2DragAndDropOverlay/index.js +12 -0
  91. package/node/TreeItem2Icon/TreeItem2Icon.js +6 -5
  92. package/node/TreeItem2Provider/TreeItem2Provider.js +2 -2
  93. package/node/TreeView/TreeView.js +8 -3
  94. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +2 -2
  95. package/node/index.js +1 -1
  96. package/node/internals/TreeViewProvider/index.js +8 -1
  97. package/node/internals/index.js +27 -2
  98. package/node/internals/models/index.js +22 -0
  99. package/node/internals/models/itemPlugin.js +5 -0
  100. package/node/internals/plugins/useTreeViewItems/index.js +14 -1
  101. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  102. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
  103. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +1 -1
  104. package/node/internals/useTreeView/useTreeViewBuildContext.js +23 -1
  105. package/node/internals/utils/tree.js +14 -2
  106. package/node/internals/utils/warning.js +21 -14
  107. package/node/useTreeItem2/useTreeItem2.js +49 -21
  108. package/package.json +5 -6
  109. package/useTreeItem2/index.d.ts +1 -1
  110. package/useTreeItem2/useTreeItem2.js +43 -15
  111. package/useTreeItem2/useTreeItem2.types.d.ts +17 -4
@@ -4,7 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import useForkRef from '@mui/utils/useForkRef';
5
5
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
6
6
  import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
7
- import { useTreeViewContext } from '../../TreeViewProvider/useTreeViewContext';
7
+ import { useTreeViewContext } from '../../TreeViewProvider';
8
8
  import { TreeViewChildrenItemContext, TreeViewChildrenItemProvider } from '../../TreeViewProvider/TreeViewChildrenItemProvider';
9
9
  import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from '../useTreeViewItems/useTreeViewItems.utils';
10
10
  import { TreeViewItemDepthContext } from '../../TreeViewItemDepthContext';
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { useRtl } from '@mui/system/RtlProvider';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
- import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem } from '../../utils/tree';
4
+ import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from '../../utils/tree';
5
5
  function isPrintableCharacter(string) {
6
6
  return !!string && string.length === 1 && !!string.match(/\S/);
7
7
  }
@@ -60,7 +60,7 @@ export const useTreeViewKeyboardNavigation = ({
60
60
  if (event.defaultMuiPrevented) {
61
61
  return;
62
62
  }
63
- if (event.altKey || event.currentTarget !== event.target.closest('*[role="treeitem"]')) {
63
+ if (event.altKey || isTargetInDescendants(event.target, event.currentTarget)) {
64
64
  return;
65
65
  }
66
66
  const ctrlPressed = event.ctrlKey || event.metaKey;
@@ -7,6 +7,8 @@ export const useTreeViewBuildContext = ({
7
7
  const runItemPlugins = itemPluginProps => {
8
8
  let finalRootRef = null;
9
9
  let finalContentRef = null;
10
+ const pluginPropEnhancers = [];
11
+ const pluginPropEnhancersNames = {};
10
12
  plugins.forEach(plugin => {
11
13
  if (!plugin.itemPlugin) {
12
14
  return;
@@ -22,10 +24,30 @@ export const useTreeViewBuildContext = ({
22
24
  if (itemPluginResponse?.contentRef) {
23
25
  finalContentRef = itemPluginResponse.contentRef;
24
26
  }
27
+ if (itemPluginResponse?.propsEnhancers) {
28
+ pluginPropEnhancers.push(itemPluginResponse.propsEnhancers);
29
+
30
+ // Prepare a list of all the slots which are enhanced by at least one plugin
31
+ Object.keys(itemPluginResponse.propsEnhancers).forEach(propsEnhancerName => {
32
+ pluginPropEnhancersNames[propsEnhancerName] = true;
33
+ });
34
+ }
25
35
  });
36
+ const resolvePropsEnhancer = currentSlotName => currentSlotParams => {
37
+ const enhancedProps = {};
38
+ pluginPropEnhancers.forEach(propsEnhancersForCurrentPlugin => {
39
+ const propsEnhancerForCurrentPluginAndSlot = propsEnhancersForCurrentPlugin[currentSlotName];
40
+ if (propsEnhancerForCurrentPluginAndSlot != null) {
41
+ Object.assign(enhancedProps, propsEnhancerForCurrentPluginAndSlot(currentSlotParams));
42
+ }
43
+ });
44
+ return enhancedProps;
45
+ };
46
+ const propsEnhancers = Object.fromEntries(Object.keys(pluginPropEnhancersNames).map(propEnhancerName => [propEnhancerName, resolvePropsEnhancer(propEnhancerName)]));
26
47
  return {
27
48
  contentRef: finalContentRef,
28
- rootRef: finalRootRef
49
+ rootRef: finalRootRef,
50
+ propsEnhancers
29
51
  };
30
52
  };
31
53
  const wrapItem = ({
@@ -181,4 +181,15 @@ export const getAllNavigableItems = instance => {
181
181
  item = getNextNavigableItem(instance, item);
182
182
  }
183
183
  return navigableItems;
184
+ };
185
+
186
+ /**
187
+ * Checks if the target is in a descendant of this item.
188
+ * This can prevent from firing some logic on the ancestors on the interacted item when the event handler is on the root.
189
+ * @param {HTMLElement} target The target to check
190
+ * @param {HTMLElement | null} itemRoot The root of the item to check if the event target is in its descendants
191
+ * @returns {boolean} Whether the target is in a descendant of this item
192
+ */
193
+ export const isTargetInDescendants = (target, itemRoot) => {
194
+ return itemRoot !== target.closest('*[role="treeitem"]');
184
195
  };
@@ -1,14 +1,21 @@
1
- export const buildWarning = (message, gravity = 'warning') => {
2
- let alreadyWarned = false;
1
+ const warnedOnceCache = new Set();
2
+
3
+ // TODO move to @mui/x-internals
4
+ // TODO eventually move to @base_ui/internals. Base UI, etc. too need this helper.
5
+ export function warnOnce(message, gravity = 'warning') {
6
+ if (process.env.NODE_ENV === 'production') {
7
+ return;
8
+ }
3
9
  const cleanMessage = Array.isArray(message) ? message.join('\n') : message;
4
- return () => {
5
- if (!alreadyWarned) {
6
- alreadyWarned = true;
7
- if (gravity === 'error') {
8
- console.error(cleanMessage);
9
- } else {
10
- console.warn(cleanMessage);
11
- }
10
+ if (!warnedOnceCache.has(cleanMessage)) {
11
+ warnedOnceCache.add(cleanMessage);
12
+ if (gravity === 'error') {
13
+ console.error(cleanMessage);
14
+ } else {
15
+ console.warn(cleanMessage);
12
16
  }
13
- };
14
- };
17
+ }
18
+ }
19
+ export function clearWarningsCache() {
20
+ warnedOnceCache.clear();
21
+ }
@@ -1,13 +1,18 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import { extractEventHandlers } from '@mui/base/utils';
3
+ import extractEventHandlers from '@mui/utils/extractEventHandlers';
4
4
  import useForkRef from '@mui/utils/useForkRef';
5
- import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
5
+ import { useTreeViewContext } from '../internals/TreeViewProvider';
6
6
  import { useTreeItem2Utils } from '../hooks/useTreeItem2Utils';
7
7
  import { TreeViewItemDepthContext } from '../internals/TreeViewItemDepthContext';
8
8
  export const useTreeItem2 = parameters => {
9
9
  const {
10
10
  runItemPlugins,
11
+ items: {
12
+ onItemClick,
13
+ disabledItemsFocusable,
14
+ indentationAtItemLevel
15
+ },
11
16
  selection: {
12
17
  multiSelect,
13
18
  disableSelection,
@@ -16,8 +21,6 @@ export const useTreeItem2 = parameters => {
16
21
  expansion: {
17
22
  expansionTrigger
18
23
  },
19
- disabledItemsFocusable,
20
- indentationAtItemLevel,
21
24
  instance,
22
25
  publicAPI
23
26
  } = useTreeViewContext();
@@ -31,7 +34,8 @@ export const useTreeItem2 = parameters => {
31
34
  } = parameters;
32
35
  const {
33
36
  rootRef: pluginRootRef,
34
- contentRef
37
+ contentRef,
38
+ propsEnhancers
35
39
  } = runItemPlugins(parameters);
36
40
  const {
37
41
  interactions,
@@ -40,8 +44,11 @@ export const useTreeItem2 = parameters => {
40
44
  itemId,
41
45
  children
42
46
  });
47
+ const rootRefObject = React.useRef(null);
48
+ const contentRefObject = React.useRef(null);
43
49
  const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
44
- const handleRootRef = useForkRef(rootRef, pluginRootRef);
50
+ const handleRootRef = useForkRef(rootRef, pluginRootRef, rootRefObject);
51
+ const handleContentRef = useForkRef(contentRef, contentRefObject);
45
52
  const checkboxRef = React.useRef(null);
46
53
  const createRootHandleFocus = otherHandlers => event => {
47
54
  otherHandlers.onFocus?.(event);
@@ -69,6 +76,7 @@ export const useTreeItem2 = parameters => {
69
76
  };
70
77
  const createContentHandleClick = otherHandlers => event => {
71
78
  otherHandlers.onClick?.(event);
79
+ onItemClick?.(event, itemId);
72
80
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
73
81
  return;
74
82
  }
@@ -123,7 +131,7 @@ export const useTreeItem2 = parameters => {
123
131
  */
124
132
  ariaSelected = true;
125
133
  }
126
- const response = _extends({}, externalEventHandlers, {
134
+ const props = _extends({}, externalEventHandlers, {
127
135
  ref: handleRootRef,
128
136
  role: 'treeitem',
129
137
  tabIndex: instance.canItemBeTabbed(itemId) ? 0 : -1,
@@ -137,24 +145,34 @@ export const useTreeItem2 = parameters => {
137
145
  onKeyDown: createRootHandleKeyDown(externalEventHandlers)
138
146
  });
139
147
  if (indentationAtItemLevel) {
140
- response.style = {
148
+ props.style = {
141
149
  '--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
142
150
  };
143
151
  }
144
- return response;
152
+ const enhancedRootProps = propsEnhancers.root?.({
153
+ rootRefObject,
154
+ contentRefObject,
155
+ externalEventHandlers
156
+ }) ?? {};
157
+ return _extends({}, props, enhancedRootProps);
145
158
  };
146
159
  const getContentProps = (externalProps = {}) => {
147
160
  const externalEventHandlers = extractEventHandlers(externalProps);
148
- const response = _extends({}, externalEventHandlers, externalProps, {
149
- ref: contentRef,
161
+ const props = _extends({}, externalEventHandlers, externalProps, {
162
+ ref: handleContentRef,
150
163
  onClick: createContentHandleClick(externalEventHandlers),
151
164
  onMouseDown: createContentHandleMouseDown(externalEventHandlers),
152
165
  status
153
166
  });
154
167
  if (indentationAtItemLevel) {
155
- response.indentationAtItemLevel = true;
156
- }
157
- return response;
168
+ props.indentationAtItemLevel = true;
169
+ }
170
+ const enhancedContentProps = propsEnhancers.content?.({
171
+ rootRefObject,
172
+ contentRefObject,
173
+ externalEventHandlers
174
+ }) ?? {};
175
+ return _extends({}, props, enhancedContentProps);
158
176
  };
159
177
  const getCheckboxProps = (externalProps = {}) => {
160
178
  const externalEventHandlers = extractEventHandlers(externalProps);
@@ -169,7 +187,7 @@ export const useTreeItem2 = parameters => {
169
187
  });
170
188
  };
171
189
  const getLabelProps = (externalProps = {}) => {
172
- const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
190
+ const externalEventHandlers = _extends({}, extractEventHandlers(externalProps));
173
191
  return _extends({}, externalEventHandlers, {
174
192
  children: label
175
193
  }, externalProps);
@@ -194,6 +212,15 @@ export const useTreeItem2 = parameters => {
194
212
  }
195
213
  return response;
196
214
  };
215
+ const getDragAndDropOverlayProps = (externalProps = {}) => {
216
+ const externalEventHandlers = _extends({}, extractEventHandlers(externalProps));
217
+ const enhancedDragAndDropOverlayProps = propsEnhancers.dragAndDropOverlay?.({
218
+ rootRefObject,
219
+ contentRefObject,
220
+ externalEventHandlers
221
+ }) ?? {};
222
+ return _extends({}, externalProps, enhancedDragAndDropOverlayProps);
223
+ };
197
224
  return {
198
225
  getRootProps,
199
226
  getContentProps,
@@ -201,6 +228,7 @@ export const useTreeItem2 = parameters => {
201
228
  getIconContainerProps,
202
229
  getCheckboxProps,
203
230
  getLabelProps,
231
+ getDragAndDropOverlayProps,
204
232
  rootRef: handleRootRef,
205
233
  status,
206
234
  publicAPI
@@ -9,7 +9,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
12
- var _utils = require("@mui/base/utils");
12
+ var _useSlotProps = _interopRequireDefault(require("@mui/utils/useSlotProps"));
13
13
  var _richTreeViewClasses = require("./richTreeViewClasses");
14
14
  var _zeroStyled = require("../internals/zero-styled");
15
15
  var _useTreeView = require("../internals/useTreeView");
@@ -50,7 +50,7 @@ function WrappedTreeItem({
50
50
  children
51
51
  }) {
52
52
  const Item = slots?.item ?? _TreeItem.TreeItem;
53
- const itemProps = (0, _utils.useSlotProps)({
53
+ const itemProps = (0, _useSlotProps.default)({
54
54
  elementType: Item,
55
55
  externalSlotProps: slotProps?.item,
56
56
  additionalProps: {
@@ -67,7 +67,6 @@ function WrappedTreeItem({
67
67
  children: children
68
68
  }));
69
69
  }
70
- const childrenWarning = (0, _warning.buildWarning)(['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/']);
71
70
 
72
71
  /**
73
72
  *
@@ -86,7 +85,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
86
85
  });
87
86
  if (process.env.NODE_ENV !== 'production') {
88
87
  if (props.children != null) {
89
- childrenWarning();
88
+ (0, _warning.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/.']);
90
89
  }
91
90
  }
92
91
  const {
@@ -104,7 +103,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
104
103
  } = props;
105
104
  const classes = useUtilityClasses(props);
106
105
  const Root = slots?.root ?? RichTreeViewRoot;
107
- const rootProps = (0, _utils.useSlotProps)({
106
+ const rootProps = (0, _useSlotProps.default)({
108
107
  elementType: Root,
109
108
  externalSlotProps: slotProps?.root,
110
109
  className: classes.root,
@@ -251,6 +250,12 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
251
250
  * @param {array} itemIds The ids of the expanded items.
252
251
  */
253
252
  onExpandedItemsChange: _propTypes.default.func,
253
+ /**
254
+ * Callback fired when the `content` slot of a given tree item is clicked.
255
+ * @param {React.MouseEvent} event The DOM event that triggered the change.
256
+ * @param {string} itemId The id of the focused item.
257
+ */
258
+ onItemClick: _propTypes.default.func,
254
259
  /**
255
260
  * Callback fired when a tree item is expanded or collapsed.
256
261
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -259,10 +264,9 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
259
264
  */
260
265
  onItemExpansionToggle: _propTypes.default.func,
261
266
  /**
262
- * Callback fired when tree items are focused.
263
- * @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
267
+ * Callback fired when a given tree item is focused.
268
+ * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
264
269
  * @param {string} itemId The id of the focused item.
265
- * @param {string} value of the focused item.
266
270
  */
267
271
  onItemFocus: _propTypes.default.func,
268
272
  /**
@@ -9,7 +9,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
12
- var _utils = require("@mui/base/utils");
12
+ var _useSlotProps = _interopRequireDefault(require("@mui/utils/useSlotProps"));
13
13
  var _zeroStyled = require("../internals/zero-styled");
14
14
  var _simpleTreeViewClasses = require("./simpleTreeViewClasses");
15
15
  var _useTreeView = require("../internals/useTreeView");
@@ -41,7 +41,6 @@ const SimpleTreeViewRoot = exports.SimpleTreeViewRoot = (0, _zeroStyled.styled)(
41
41
  position: 'relative'
42
42
  });
43
43
  const EMPTY_ITEMS = [];
44
- 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/']);
45
44
 
46
45
  /**
47
46
  *
@@ -61,7 +60,7 @@ const SimpleTreeView = exports.SimpleTreeView = /*#__PURE__*/React.forwardRef(fu
61
60
  const ownerState = props;
62
61
  if (process.env.NODE_ENV !== 'production') {
63
62
  if (props.items != null) {
64
- itemsPropWarning();
63
+ (0, _warning.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/.']);
65
64
  }
66
65
  }
67
66
  const {
@@ -80,7 +79,7 @@ const SimpleTreeView = exports.SimpleTreeView = /*#__PURE__*/React.forwardRef(fu
80
79
  } = props;
81
80
  const classes = useUtilityClasses(props);
82
81
  const Root = slots?.root ?? SimpleTreeViewRoot;
83
- const rootProps = (0, _utils.useSlotProps)({
82
+ const rootProps = (0, _useSlotProps.default)({
84
83
  elementType: Root,
85
84
  externalSlotProps: slotProps?.root,
86
85
  className: classes.root,
@@ -187,6 +186,12 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
187
186
  * @param {array} itemIds The ids of the expanded items.
188
187
  */
189
188
  onExpandedItemsChange: _propTypes.default.func,
189
+ /**
190
+ * Callback fired when the `content` slot of a given tree item is clicked.
191
+ * @param {React.MouseEvent} event The DOM event that triggered the change.
192
+ * @param {string} itemId The id of the focused item.
193
+ */
194
+ onItemClick: _propTypes.default.func,
190
195
  /**
191
196
  * Callback fired when a tree item is expanded or collapsed.
192
197
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -195,10 +200,9 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
195
200
  */
196
201
  onItemExpansionToggle: _propTypes.default.func,
197
202
  /**
198
- * Callback fired when tree items are focused.
199
- * @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
203
+ * Callback fired when a given tree item is focused.
204
+ * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
200
205
  * @param {string} itemId The id of the focused item.
201
- * @param {string} value of the focused item.
202
206
  */
203
207
  onItemFocus: _propTypes.default.func,
204
208
  /**
@@ -11,17 +11,19 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _Collapse = _interopRequireDefault(require("@mui/material/Collapse"));
14
- var _utils = require("@mui/base/utils");
15
14
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
16
15
  var _createStyled = require("@mui/system/createStyled");
17
16
  var _styles = require("@mui/material/styles");
17
+ var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
18
+ var _extractEventHandlers = _interopRequireDefault(require("@mui/utils/extractEventHandlers"));
19
+ var _resolveComponentProps = _interopRequireDefault(require("@mui/utils/resolveComponentProps"));
20
+ var _useSlotProps4 = _interopRequireDefault(require("@mui/utils/useSlotProps"));
18
21
  var _unsupportedProp = _interopRequireDefault(require("@mui/utils/unsupportedProp"));
19
22
  var _elementTypeAcceptingRef = _interopRequireDefault(require("@mui/utils/elementTypeAcceptingRef"));
20
- var _base = require("@mui/base");
21
23
  var _zeroStyled = require("../internals/zero-styled");
22
24
  var _TreeItemContent = require("./TreeItemContent");
23
25
  var _treeItemClasses = require("./treeItemClasses");
24
- var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
26
+ var _TreeViewProvider = require("../internals/TreeViewProvider");
25
27
  var _icons = require("../icons");
26
28
  var _TreeItem2Provider = require("../TreeItem2Provider");
27
29
  var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
@@ -50,7 +52,7 @@ const useUtilityClasses = ownerState => {
50
52
  label: ['label'],
51
53
  groupTransition: ['groupTransition']
52
54
  };
53
- return (0, _base.unstable_composeClasses)(slots, _treeItemClasses.getTreeItemUtilityClass, classes);
55
+ return (0, _composeClasses.default)(slots, _treeItemClasses.getTreeItemUtilityClass, classes);
54
56
  };
55
57
  const TreeItemRoot = (0, _zeroStyled.styled)('li', {
56
58
  name: 'MuiTreeItem',
@@ -81,6 +83,7 @@ const StyledTreeItemContent = (0, _zeroStyled.styled)(_TreeItemContent.TreeItemC
81
83
  width: '100%',
82
84
  boxSizing: 'border-box',
83
85
  // prevent width + padding to overflow
86
+ position: 'relative',
84
87
  display: 'flex',
85
88
  alignItems: 'center',
86
89
  gap: theme.spacing(1),
@@ -175,16 +178,18 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
175
178
  const {
176
179
  icons: contextIcons,
177
180
  runItemPlugins,
181
+ items: {
182
+ disabledItemsFocusable,
183
+ indentationAtItemLevel
184
+ },
178
185
  selection: {
179
186
  multiSelect
180
187
  },
181
188
  expansion: {
182
189
  expansionTrigger
183
190
  },
184
- disabledItemsFocusable,
185
- indentationAtItemLevel,
186
191
  instance
187
- } = (0, _useTreeViewContext.useTreeViewContext)();
192
+ } = (0, _TreeViewProvider.useTreeViewContext)();
188
193
  const depthContext = React.useContext(_TreeViewItemDepthContext.TreeViewItemDepthContext);
189
194
  const props = useThemeProps({
190
195
  props: inProps,
@@ -215,10 +220,13 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
215
220
  } = (0, _useTreeItemState.useTreeItemState)(itemId);
216
221
  const {
217
222
  contentRef,
218
- rootRef
223
+ rootRef,
224
+ propsEnhancers
219
225
  } = runItemPlugins(props);
220
- const handleRootRef = (0, _useForkRef.default)(inRef, rootRef);
221
- const handleContentRef = (0, _useForkRef.default)(ContentProps?.ref, contentRef);
226
+ const rootRefObject = React.useRef(null);
227
+ const contentRefObject = React.useRef(null);
228
+ const handleRootRef = (0, _useForkRef.default)(inRef, rootRef, rootRefObject);
229
+ const handleContentRef = (0, _useForkRef.default)(ContentProps?.ref, contentRef, contentRefObject);
222
230
  const slots = {
223
231
  expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? _icons.TreeViewExpandIcon,
224
232
  collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? _icons.TreeViewCollapseIcon,
@@ -242,7 +250,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
242
250
  });
243
251
  const classes = useUtilityClasses(ownerState);
244
252
  const GroupTransition = slots.groupTransition ?? undefined;
245
- const groupTransitionProps = (0, _utils.useSlotProps)({
253
+ const groupTransitionProps = (0, _useSlotProps4.default)({
246
254
  elementType: GroupTransition,
247
255
  ownerState: {},
248
256
  externalSlotProps: inSlotProps?.groupTransition,
@@ -262,14 +270,14 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
262
270
  }
263
271
  };
264
272
  const ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
265
- const _useSlotProps = (0, _utils.useSlotProps)({
273
+ const _useSlotProps = (0, _useSlotProps4.default)({
266
274
  elementType: ExpansionIcon,
267
275
  ownerState: {},
268
276
  externalSlotProps: tempOwnerState => {
269
277
  if (expanded) {
270
- return (0, _extends2.default)({}, (0, _utils.resolveComponentProps)(contextIcons.slotProps.collapseIcon, tempOwnerState), (0, _utils.resolveComponentProps)(inSlotProps?.collapseIcon, tempOwnerState));
278
+ return (0, _extends2.default)({}, (0, _resolveComponentProps.default)(contextIcons.slotProps.collapseIcon, tempOwnerState), (0, _resolveComponentProps.default)(inSlotProps?.collapseIcon, tempOwnerState));
271
279
  }
272
- return (0, _extends2.default)({}, (0, _utils.resolveComponentProps)(contextIcons.slotProps.expandIcon, tempOwnerState), (0, _utils.resolveComponentProps)(inSlotProps?.expandIcon, tempOwnerState));
280
+ return (0, _extends2.default)({}, (0, _resolveComponentProps.default)(contextIcons.slotProps.expandIcon, tempOwnerState), (0, _resolveComponentProps.default)(inSlotProps?.expandIcon, tempOwnerState));
273
281
  },
274
282
  additionalProps: {
275
283
  onClick: handleIconContainerClick
@@ -278,20 +286,20 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
278
286
  expansionIconProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded2);
279
287
  const expansionIcon = expandable && !!ExpansionIcon ? /*#__PURE__*/(0, _jsxRuntime.jsx)(ExpansionIcon, (0, _extends2.default)({}, expansionIconProps)) : null;
280
288
  const DisplayIcon = expandable ? undefined : slots.endIcon;
281
- const _useSlotProps2 = (0, _utils.useSlotProps)({
289
+ const _useSlotProps2 = (0, _useSlotProps4.default)({
282
290
  elementType: DisplayIcon,
283
291
  ownerState: {},
284
292
  externalSlotProps: tempOwnerState => {
285
293
  if (expandable) {
286
294
  return {};
287
295
  }
288
- return (0, _extends2.default)({}, (0, _utils.resolveComponentProps)(contextIcons.slotProps.endIcon, tempOwnerState), (0, _utils.resolveComponentProps)(inSlotProps?.endIcon, tempOwnerState));
296
+ return (0, _extends2.default)({}, (0, _resolveComponentProps.default)(contextIcons.slotProps.endIcon, tempOwnerState), (0, _resolveComponentProps.default)(inSlotProps?.endIcon, tempOwnerState));
289
297
  }
290
298
  }),
291
299
  displayIconProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps2, _excluded3);
292
300
  const displayIcon = DisplayIcon ? /*#__PURE__*/(0, _jsxRuntime.jsx)(DisplayIcon, (0, _extends2.default)({}, displayIconProps)) : null;
293
301
  const Icon = slots.icon;
294
- const _useSlotProps3 = (0, _utils.useSlotProps)({
302
+ const _useSlotProps3 = (0, _useSlotProps4.default)({
295
303
  elementType: Icon,
296
304
  ownerState: {},
297
305
  externalSlotProps: inSlotProps?.icon
@@ -326,6 +334,21 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
326
334
  };
327
335
  const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
328
336
  const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
337
+ const enhancedRootProps = propsEnhancers.root?.({
338
+ rootRefObject,
339
+ contentRefObject,
340
+ externalEventHandlers: (0, _extractEventHandlers.default)(other)
341
+ }) ?? {};
342
+ const enhancedContentProps = propsEnhancers.content?.({
343
+ rootRefObject,
344
+ contentRefObject,
345
+ externalEventHandlers: (0, _extractEventHandlers.default)(ContentProps)
346
+ }) ?? {};
347
+ const enhancedDragAndDropOverlayProps = propsEnhancers.dragAndDropOverlay?.({
348
+ rootRefObject,
349
+ contentRefObject,
350
+ externalEventHandlers: {}
351
+ }) ?? {};
329
352
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2Provider.TreeItem2Provider, {
330
353
  itemId: itemId,
331
354
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(TreeItemRoot, (0, _extends2.default)({
@@ -344,7 +367,8 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
344
367
  ref: handleRootRef,
345
368
  style: indentationAtItemLevel ? (0, _extends2.default)({}, other.style, {
346
369
  '--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
347
- }) : other.style,
370
+ }) : other.style
371
+ }, enhancedRootProps, {
348
372
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(StyledTreeItemContent, (0, _extends2.default)({
349
373
  as: ContentComponent,
350
374
  classes: {
@@ -365,7 +389,9 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
365
389
  expansionIcon: expansionIcon,
366
390
  displayIcon: displayIcon,
367
391
  ownerState: ownerState
368
- }, ContentProps, {
392
+ }, ContentProps, enhancedContentProps, enhancedDragAndDropOverlayProps.action == null ? {} : {
393
+ dragAndDropOverlayProps: enhancedDragAndDropOverlayProps
394
+ }, {
369
395
  ref: handleContentRef
370
396
  })), children && /*#__PURE__*/(0, _jsxRuntime.jsx)(TreeItemGroup, (0, _extends2.default)({
371
397
  as: GroupTransition
@@ -12,8 +12,9 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
14
14
  var _useTreeItemState = require("./useTreeItemState");
15
+ var _TreeItem2DragAndDropOverlay = require("../TreeItem2DragAndDropOverlay");
15
16
  var _jsxRuntime = require("react/jsx-runtime");
16
- const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
17
+ const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown", "dragAndDropOverlayProps"];
17
18
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
18
19
  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 && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
20
  /**
@@ -29,7 +30,8 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
29
30
  label,
30
31
  itemId,
31
32
  onClick,
32
- onMouseDown
33
+ onMouseDown,
34
+ dragAndDropOverlayProps
33
35
  } = props,
34
36
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
35
37
  const {
@@ -42,6 +44,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
42
44
  handleExpansion,
43
45
  handleSelection,
44
46
  handleCheckboxSelection,
47
+ handleContentClick,
45
48
  preventSelection,
46
49
  expansionTrigger
47
50
  } = (0, _useTreeItemState.useTreeItemState)(itemId);
@@ -54,6 +57,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
54
57
  }
55
58
  };
56
59
  const handleClick = event => {
60
+ handleContentClick?.(event, itemId);
57
61
  if (checkboxRef.current?.contains(event.target)) {
58
62
  return;
59
63
  }
@@ -88,7 +92,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
88
92
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
89
93
  className: classes.label,
90
94
  children: label
91
- })]
95
+ }), dragAndDropOverlayProps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2DragAndDropOverlay.TreeItem2DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
92
96
  }))
93
97
  );
94
98
  });
@@ -106,6 +110,10 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
106
110
  * The icon to display next to the tree item's label. Either a parent or end icon.
107
111
  */
108
112
  displayIcon: _propTypes.default.node,
113
+ dragAndDropOverlayProps: _propTypes.default.shape({
114
+ action: _propTypes.default.oneOf(['make-child', 'move-to-parent', 'reorder-above', 'reorder-below']),
115
+ style: _propTypes.default.object
116
+ }),
109
117
  /**
110
118
  * The icon to display next to the tree item's label. Either an expansion or collapse icon.
111
119
  */
@@ -11,4 +11,4 @@ var _generateUtilityClasses = _interopRequireDefault(require("@mui/utils/generat
11
11
  function getTreeItemUtilityClass(slot) {
12
12
  return (0, _generateUtilityClass.default)('MuiTreeItem', slot);
13
13
  }
14
- const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox']);
14
+ const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox', 'dragAndDropOverlay']);
@@ -4,10 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useTreeItemState = useTreeItemState;
7
- var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
7
+ var _TreeViewProvider = require("../internals/TreeViewProvider");
8
8
  function useTreeItemState(itemId) {
9
9
  const {
10
10
  instance,
11
+ items: {
12
+ onItemClick
13
+ },
11
14
  selection: {
12
15
  multiSelect,
13
16
  checkboxSelection,
@@ -16,7 +19,7 @@ function useTreeItemState(itemId) {
16
19
  expansion: {
17
20
  expansionTrigger
18
21
  }
19
- } = (0, _useTreeViewContext.useTreeViewContext)();
22
+ } = (0, _TreeViewProvider.useTreeViewContext)();
20
23
  const expandable = instance.isItemExpandable(itemId);
21
24
  const expanded = instance.isItemExpanded(itemId);
22
25
  const focused = instance.isItemFocused(itemId);
@@ -92,6 +95,7 @@ function useTreeItemState(itemId) {
92
95
  handleExpansion,
93
96
  handleSelection,
94
97
  handleCheckboxSelection,
98
+ handleContentClick: onItemClick,
95
99
  preventSelection,
96
100
  expansionTrigger
97
101
  };