@mui/x-tree-view 7.11.1 → 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 (101) hide show
  1. package/CHANGELOG.md +110 -4
  2. package/RichTreeView/RichTreeView.js +9 -4
  3. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  4. package/SimpleTreeView/SimpleTreeView.js +9 -4
  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 +5 -4
  32. package/internals/index.js +3 -2
  33. package/internals/models/index.d.ts +1 -0
  34. package/internals/models/index.js +2 -1
  35. package/internals/models/itemPlugin.d.ts +3 -2
  36. package/internals/models/plugin.d.ts +1 -1
  37. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -3
  38. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  39. package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
  40. package/internals/plugins/useTreeViewItems/index.js +2 -1
  41. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  42. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +18 -4
  43. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  44. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
  45. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +1 -2
  46. package/internals/useTreeView/useTreeView.types.d.ts +1 -1
  47. package/internals/utils/tree.d.ts +8 -0
  48. package/internals/utils/tree.js +11 -0
  49. package/models/items.d.ts +1 -0
  50. package/modern/RichTreeView/RichTreeView.js +9 -4
  51. package/modern/SimpleTreeView/SimpleTreeView.js +9 -4
  52. package/modern/TreeItem/TreeItem.js +36 -10
  53. package/modern/TreeItem/TreeItemContent.js +11 -3
  54. package/modern/TreeItem/treeItemClasses.js +1 -1
  55. package/modern/TreeItem/useTreeItemState.js +5 -1
  56. package/modern/TreeItem2/TreeItem2.js +15 -3
  57. package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
  58. package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
  59. package/modern/TreeItem2DragAndDropOverlay/index.js +1 -0
  60. package/modern/TreeItem2Icon/TreeItem2Icon.js +3 -2
  61. package/modern/TreeItem2Provider/TreeItem2Provider.js +1 -1
  62. package/modern/TreeView/TreeView.js +8 -3
  63. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
  64. package/modern/index.js +1 -1
  65. package/modern/internals/TreeViewProvider/index.js +2 -1
  66. package/modern/internals/index.js +3 -2
  67. package/modern/internals/models/index.js +2 -1
  68. package/modern/internals/plugins/useTreeViewItems/index.js +2 -1
  69. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  70. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
  71. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
  72. package/modern/internals/utils/tree.js +11 -0
  73. package/modern/useTreeItem2/useTreeItem2.js +43 -15
  74. package/node/RichTreeView/RichTreeView.js +11 -6
  75. package/node/SimpleTreeView/SimpleTreeView.js +10 -5
  76. package/node/TreeItem/TreeItem.js +45 -19
  77. package/node/TreeItem/TreeItemContent.js +11 -3
  78. package/node/TreeItem/treeItemClasses.js +1 -1
  79. package/node/TreeItem/useTreeItemState.js +6 -2
  80. package/node/TreeItem2/TreeItem2.js +21 -9
  81. package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +77 -0
  82. package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +5 -0
  83. package/node/TreeItem2DragAndDropOverlay/index.js +12 -0
  84. package/node/TreeItem2Icon/TreeItem2Icon.js +6 -5
  85. package/node/TreeItem2Provider/TreeItem2Provider.js +2 -2
  86. package/node/TreeView/TreeView.js +8 -3
  87. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +2 -2
  88. package/node/index.js +1 -1
  89. package/node/internals/TreeViewProvider/index.js +8 -1
  90. package/node/internals/index.js +25 -0
  91. package/node/internals/models/index.js +11 -0
  92. package/node/internals/plugins/useTreeViewItems/index.js +14 -1
  93. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
  94. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
  95. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +1 -1
  96. package/node/internals/utils/tree.js +14 -2
  97. package/node/useTreeItem2/useTreeItem2.js +49 -21
  98. package/package.json +3 -4
  99. package/useTreeItem2/index.d.ts +1 -1
  100. package/useTreeItem2/useTreeItem2.js +43 -15
  101. package/useTreeItem2/useTreeItem2.types.d.ts +17 -4
@@ -1,7 +1,10 @@
1
- import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
1
+ import { useTreeViewContext } from '../internals/TreeViewProvider';
2
2
  export function useTreeItemState(itemId) {
3
3
  const {
4
4
  instance,
5
+ items: {
6
+ onItemClick
7
+ },
5
8
  selection: {
6
9
  multiSelect,
7
10
  checkboxSelection,
@@ -86,6 +89,7 @@ export function useTreeItemState(itemId) {
86
89
  handleExpansion,
87
90
  handleSelection,
88
91
  handleCheckboxSelection,
92
+ handleContentClick: onItemClick,
89
93
  preventSelection,
90
94
  expansionTrigger
91
95
  };
@@ -9,13 +9,14 @@ import unsupportedProp from '@mui/utils/unsupportedProp';
9
9
  import { alpha } from '@mui/material/styles';
10
10
  import Collapse from '@mui/material/Collapse';
11
11
  import MuiCheckbox from '@mui/material/Checkbox';
12
- import { useSlotProps } from '@mui/base/utils';
12
+ import useSlotProps from '@mui/utils/useSlotProps';
13
13
  import { shouldForwardProp } from '@mui/system/createStyled';
14
14
  import composeClasses from '@mui/utils/composeClasses';
15
15
  import { styled, createUseThemeProps } from '../internals/zero-styled';
16
16
  import { unstable_useTreeItem2 as useTreeItem2 } from '../useTreeItem2';
17
17
  import { getTreeItemUtilityClass } from '../TreeItem';
18
18
  import { TreeItem2Icon } from '../TreeItem2Icon';
19
+ import { TreeItem2DragAndDropOverlay } from '../TreeItem2DragAndDropOverlay';
19
20
  import { TreeItem2Provider } from '../TreeItem2Provider';
20
21
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
22
  const useThemeProps = createUseThemeProps('MuiTreeItem2');
@@ -42,6 +43,7 @@ export const TreeItem2Content = styled('div', {
42
43
  width: '100%',
43
44
  boxSizing: 'border-box',
44
45
  // prevent width + padding to overflow
46
+ position: 'relative',
45
47
  display: 'flex',
46
48
  alignItems: 'center',
47
49
  gap: theme.spacing(1),
@@ -176,7 +178,8 @@ const useUtilityClasses = ownerState => {
176
178
  iconContainer: ['iconContainer'],
177
179
  checkbox: ['checkbox'],
178
180
  label: ['label'],
179
- groupTransition: ['groupTransition']
181
+ groupTransition: ['groupTransition'],
182
+ dragAndDropOverlay: ['dragAndDropOverlay']
180
183
  };
181
184
  return composeClasses(slots, getTreeItemUtilityClass, classes);
182
185
  };
@@ -212,6 +215,7 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
212
215
  getCheckboxProps,
213
216
  getLabelProps,
214
217
  getGroupTransitionProps,
218
+ getDragAndDropOverlayProps,
215
219
  status
216
220
  } = useTreeItem2({
217
221
  id,
@@ -274,6 +278,14 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
274
278
  ownerState: {},
275
279
  className: classes.groupTransition
276
280
  });
281
+ const DragAndDropOverlay = slots.dragAndDropOverlay ?? TreeItem2DragAndDropOverlay;
282
+ const dragAndDropOverlayProps = useSlotProps({
283
+ elementType: DragAndDropOverlay,
284
+ getSlotProps: getDragAndDropOverlayProps,
285
+ externalSlotProps: slotProps.dragAndDropOverlay,
286
+ ownerState: {},
287
+ className: classes.dragAndDropOverlay
288
+ });
277
289
  return /*#__PURE__*/_jsx(TreeItem2Provider, {
278
290
  itemId: itemId,
279
291
  children: /*#__PURE__*/_jsxs(Root, _extends({}, rootProps, {
@@ -284,7 +296,7 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
284
296
  slots: slots,
285
297
  slotProps: slotProps
286
298
  })
287
- })), /*#__PURE__*/_jsx(Checkbox, _extends({}, checkboxProps)), /*#__PURE__*/_jsx(Label, _extends({}, labelProps))]
299
+ })), /*#__PURE__*/_jsx(Checkbox, _extends({}, checkboxProps)), /*#__PURE__*/_jsx(Label, _extends({}, labelProps)), /*#__PURE__*/_jsx(DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
288
300
  })), children && /*#__PURE__*/_jsx(TreeItem2GroupTransition, _extends({
289
301
  as: GroupTransition
290
302
  }, groupTransitionProps))]
@@ -0,0 +1,69 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { alpha } from '@mui/material/styles';
4
+ import { shouldForwardProp } from '@mui/system';
5
+ import { styled } from '../internals/zero-styled';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const TreeItem2DragAndDropOverlayRoot = styled('div', {
8
+ name: 'MuiTreeItem2DragAndDropOverlay',
9
+ slot: 'Root',
10
+ overridesResolver: (props, styles) => styles.root,
11
+ shouldForwardProp: prop => shouldForwardProp(prop) && prop !== 'action'
12
+ })(({
13
+ theme
14
+ }) => ({
15
+ position: 'absolute',
16
+ left: 0,
17
+ display: 'flex',
18
+ top: 0,
19
+ bottom: 0,
20
+ right: 0,
21
+ pointerEvents: 'none',
22
+ variants: [{
23
+ props: {
24
+ action: 'make-child'
25
+ },
26
+ style: {
27
+ marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
28
+ borderRadius: theme.shape.borderRadius,
29
+ backgroundColor: alpha((theme.vars || theme).palette.primary.dark, 0.15)
30
+ }
31
+ }, {
32
+ props: {
33
+ action: 'reorder-above'
34
+ },
35
+ style: _extends({
36
+ marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
37
+ borderTop: `1px solid ${alpha((theme.vars || theme).palette.grey[900], 0.6)}`
38
+ }, theme.palette.mode === 'dark' && {
39
+ borderTop: `1px solid ${alpha((theme.vars || theme).palette.grey[100], 0.6)}`
40
+ })
41
+ }, {
42
+ props: {
43
+ action: 'reorder-below'
44
+ },
45
+ style: _extends({
46
+ marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
47
+ borderBottom: `1px solid ${alpha((theme.vars || theme).palette.grey[900], 0.6)}`
48
+ }, theme.palette.mode === 'dark' && {
49
+ borderBottom: `1px solid ${alpha((theme.vars || theme).palette.grey[100], 0.6)}`
50
+ })
51
+ }, {
52
+ props: {
53
+ action: 'move-to-parent'
54
+ },
55
+ style: _extends({
56
+ marginLeft: 'calc(var(--TreeView-indentMultiplier) * calc(var(--TreeView-itemDepth) - 1))',
57
+ borderBottom: `1px solid ${alpha((theme.vars || theme).palette.grey[900], 0.6)}`
58
+ }, theme.palette.mode === 'dark' && {
59
+ borderBottom: `1px solid ${alpha((theme.vars || theme).palette.grey[900], 0.6)}`
60
+ })
61
+ }]
62
+ }));
63
+ function TreeItem2DragAndDropOverlay(props) {
64
+ if (props.action == null) {
65
+ return null;
66
+ }
67
+ return /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlayRoot, _extends({}, props));
68
+ }
69
+ export { TreeItem2DragAndDropOverlay };
@@ -0,0 +1 @@
1
+ export { TreeItem2DragAndDropOverlay } from './TreeItem2DragAndDropOverlay';
@@ -1,8 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
5
- import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
4
+ import resolveComponentProps from '@mui/utils/resolveComponentProps';
5
+ import useSlotProps from '@mui/utils/useSlotProps';
6
+ import { useTreeViewContext } from '../internals/TreeViewProvider';
6
7
  import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
8
9
  function TreeItem2Icon(props) {
@@ -1,5 +1,5 @@
1
1
  import PropTypes from 'prop-types';
2
- import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
2
+ import { useTreeViewContext } from '../internals/TreeViewProvider';
3
3
  function TreeItem2Provider(props) {
4
4
  const {
5
5
  children,
@@ -155,6 +155,12 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
155
155
  * @param {array} itemIds The ids of the expanded items.
156
156
  */
157
157
  onExpandedItemsChange: PropTypes.func,
158
+ /**
159
+ * Callback fired when the `content` slot of a given tree item is clicked.
160
+ * @param {React.MouseEvent} event The DOM event that triggered the change.
161
+ * @param {string} itemId The id of the focused item.
162
+ */
163
+ onItemClick: PropTypes.func,
158
164
  /**
159
165
  * Callback fired when a tree item is expanded or collapsed.
160
166
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -163,10 +169,9 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
163
169
  */
164
170
  onItemExpansionToggle: PropTypes.func,
165
171
  /**
166
- * Callback fired when tree items are focused.
167
- * @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
172
+ * Callback fired when a given tree item is focused.
173
+ * @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
168
174
  * @param {string} itemId The id of the focused item.
169
- * @param {string} value of the focused item.
170
175
  */
171
176
  onItemFocus: PropTypes.func,
172
177
  /**
@@ -1,4 +1,4 @@
1
- import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext';
1
+ import { useTreeViewContext } from '../../internals/TreeViewProvider';
2
2
  const isItemExpandable = reactChildren => {
3
3
  if (Array.isArray(reactChildren)) {
4
4
  return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.11.1
2
+ * @mui/x-tree-view v7.12.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1 +1,2 @@
1
- export { TreeViewProvider } from './TreeViewProvider';
1
+ export { TreeViewProvider } from './TreeViewProvider';
2
+ export { useTreeViewContext } from './useTreeViewContext';
@@ -1,5 +1,5 @@
1
1
  export { useTreeView } from './useTreeView';
2
- export { TreeViewProvider } from './TreeViewProvider';
2
+ export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
3
3
  export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
4
4
 
5
5
  // Core plugins
@@ -10,6 +10,7 @@ export { useTreeViewSelection } from './plugins/useTreeViewSelection';
10
10
  export { useTreeViewFocus } from './plugins/useTreeViewFocus';
11
11
  export { useTreeViewKeyboardNavigation } from './plugins/useTreeViewKeyboardNavigation';
12
12
  export { useTreeViewIcons } from './plugins/useTreeViewIcons';
13
- export { useTreeViewItems } from './plugins/useTreeViewItems';
13
+ export { useTreeViewItems, buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './plugins/useTreeViewItems';
14
14
  export { useTreeViewJSXItems } from './plugins/useTreeViewJSXItems';
15
+ export { isTargetInDescendants } from './utils/tree';
15
16
  export { warnOnce } from './utils/warning';
@@ -1,4 +1,5 @@
1
1
  export * from './helpers';
2
2
  export * from './plugin';
3
3
  export * from './itemPlugin';
4
- export * from './treeView';
4
+ export * from './treeView';
5
+ export * from './MuiCancellableEvent';
@@ -1 +1,2 @@
1
- export { useTreeViewItems } from './useTreeViewItems';
1
+ export { useTreeViewItems } from './useTreeViewItems';
2
+ export { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils';
@@ -184,8 +184,11 @@ export const useTreeViewItems = ({
184
184
  areItemUpdatesPrevented
185
185
  },
186
186
  contextValue: {
187
- disabledItemsFocusable: params.disabledItemsFocusable,
188
- indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
187
+ items: {
188
+ onItemClick: params.onItemClick,
189
+ disabledItemsFocusable: params.disabledItemsFocusable,
190
+ indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
191
+ }
189
192
  }
190
193
  };
191
194
  };
@@ -216,5 +219,6 @@ useTreeViewItems.params = {
216
219
  isItemDisabled: true,
217
220
  getItemLabel: true,
218
221
  getItemId: true,
222
+ onItemClick: true,
219
223
  itemChildrenIndentation: true
220
224
  };
@@ -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;
@@ -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,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: {
@@ -103,7 +103,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
103
103
  } = props;
104
104
  const classes = useUtilityClasses(props);
105
105
  const Root = slots?.root ?? RichTreeViewRoot;
106
- const rootProps = (0, _utils.useSlotProps)({
106
+ const rootProps = (0, _useSlotProps.default)({
107
107
  elementType: Root,
108
108
  externalSlotProps: slotProps?.root,
109
109
  className: classes.root,
@@ -250,6 +250,12 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
250
250
  * @param {array} itemIds The ids of the expanded items.
251
251
  */
252
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,
253
259
  /**
254
260
  * Callback fired when a tree item is expanded or collapsed.
255
261
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -258,10 +264,9 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
258
264
  */
259
265
  onItemExpansionToggle: _propTypes.default.func,
260
266
  /**
261
- * Callback fired when tree items are focused.
262
- * @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.
263
269
  * @param {string} itemId The id of the focused item.
264
- * @param {string} value of the focused item.
265
270
  */
266
271
  onItemFocus: _propTypes.default.func,
267
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");
@@ -79,7 +79,7 @@ const SimpleTreeView = exports.SimpleTreeView = /*#__PURE__*/React.forwardRef(fu
79
79
  } = props;
80
80
  const classes = useUtilityClasses(props);
81
81
  const Root = slots?.root ?? SimpleTreeViewRoot;
82
- const rootProps = (0, _utils.useSlotProps)({
82
+ const rootProps = (0, _useSlotProps.default)({
83
83
  elementType: Root,
84
84
  externalSlotProps: slotProps?.root,
85
85
  className: classes.root,
@@ -186,6 +186,12 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
186
186
  * @param {array} itemIds The ids of the expanded items.
187
187
  */
188
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,
189
195
  /**
190
196
  * Callback fired when a tree item is expanded or collapsed.
191
197
  * @param {React.SyntheticEvent} event The DOM event that triggered the change.
@@ -194,10 +200,9 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
194
200
  */
195
201
  onItemExpansionToggle: _propTypes.default.func,
196
202
  /**
197
- * Callback fired when tree items are focused.
198
- * @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.
199
205
  * @param {string} itemId The id of the focused item.
200
- * @param {string} value of the focused item.
201
206
  */
202
207
  onItemFocus: _propTypes.default.func,
203
208
  /**