@mui/x-tree-view 7.11.1 → 7.12.1
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.
- package/CHANGELOG.md +178 -4
- package/RichTreeView/RichTreeView.js +9 -4
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +9 -4
- package/SimpleTreeView/SimpleTreeView.types.d.ts +1 -1
- package/TreeItem/TreeItem.js +36 -10
- package/TreeItem/TreeItem.types.d.ts +1 -1
- package/TreeItem/TreeItemContent.d.ts +2 -0
- package/TreeItem/TreeItemContent.js +11 -3
- package/TreeItem/treeItemClasses.d.ts +2 -0
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeItem/useTreeItemState.d.ts +1 -0
- package/TreeItem/useTreeItemState.js +5 -1
- package/TreeItem2/TreeItem2.js +15 -3
- package/TreeItem2/TreeItem2.types.d.ts +8 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +4 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts +6 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
- package/TreeItem2DragAndDropOverlay/index.d.ts +2 -0
- package/TreeItem2DragAndDropOverlay/index.js +1 -0
- package/TreeItem2DragAndDropOverlay/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.js +3 -2
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
- package/TreeItem2Provider/TreeItem2Provider.js +1 -1
- package/TreeView/TreeView.js +8 -3
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/index.d.ts +1 -0
- package/internals/TreeViewProvider/index.js +2 -1
- package/internals/index.d.ts +5 -4
- package/internals/index.js +3 -2
- package/internals/models/index.d.ts +1 -0
- package/internals/models/index.js +2 -1
- package/internals/models/itemPlugin.d.ts +3 -2
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -3
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
- package/internals/plugins/useTreeViewItems/index.js +2 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +18 -4
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +1 -2
- package/internals/useTreeView/useTreeView.types.d.ts +1 -1
- package/internals/utils/tree.d.ts +8 -0
- package/internals/utils/tree.js +11 -0
- package/models/items.d.ts +1 -0
- package/modern/RichTreeView/RichTreeView.js +9 -4
- package/modern/SimpleTreeView/SimpleTreeView.js +9 -4
- package/modern/TreeItem/TreeItem.js +36 -10
- package/modern/TreeItem/TreeItemContent.js +11 -3
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeItem/useTreeItemState.js +5 -1
- package/modern/TreeItem2/TreeItem2.js +15 -3
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
- package/modern/TreeItem2DragAndDropOverlay/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +3 -2
- package/modern/TreeItem2Provider/TreeItem2Provider.js +1 -1
- package/modern/TreeView/TreeView.js +8 -3
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/index.js +2 -1
- package/modern/internals/index.js +3 -2
- package/modern/internals/models/index.js +2 -1
- package/modern/internals/plugins/useTreeViewItems/index.js +2 -1
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
- package/modern/internals/utils/tree.js +11 -0
- package/modern/useTreeItem2/useTreeItem2.js +43 -15
- package/node/RichTreeView/RichTreeView.js +11 -6
- package/node/SimpleTreeView/SimpleTreeView.js +10 -5
- package/node/TreeItem/TreeItem.js +45 -19
- package/node/TreeItem/TreeItemContent.js +11 -3
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeItem/useTreeItemState.js +6 -2
- package/node/TreeItem2/TreeItem2.js +21 -9
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +77 -0
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +5 -0
- package/node/TreeItem2DragAndDropOverlay/index.js +12 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +6 -5
- package/node/TreeItem2Provider/TreeItem2Provider.js +2 -2
- package/node/TreeView/TreeView.js +8 -3
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +2 -2
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/index.js +8 -1
- package/node/internals/index.js +25 -0
- package/node/internals/models/index.js +11 -0
- package/node/internals/plugins/useTreeViewItems/index.js +14 -1
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +1 -1
- package/node/internals/utils/tree.js +14 -2
- package/node/useTreeItem2/useTreeItem2.js +49 -21
- package/package.json +11 -4
- package/useTreeItem2/index.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +43 -15
- package/useTreeItem2/useTreeItem2.types.d.ts +17 -4
|
@@ -8,17 +8,19 @@ import * as React from 'react';
|
|
|
8
8
|
import PropTypes from 'prop-types';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
10
|
import Collapse from '@mui/material/Collapse';
|
|
11
|
-
import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
|
|
12
11
|
import useForkRef from '@mui/utils/useForkRef';
|
|
13
12
|
import { shouldForwardProp } from '@mui/system/createStyled';
|
|
14
13
|
import { alpha } from '@mui/material/styles';
|
|
14
|
+
import composeClasses from '@mui/utils/composeClasses';
|
|
15
|
+
import extractEventHandlers from '@mui/utils/extractEventHandlers';
|
|
16
|
+
import resolveComponentProps from '@mui/utils/resolveComponentProps';
|
|
17
|
+
import useSlotProps from '@mui/utils/useSlotProps';
|
|
15
18
|
import unsupportedProp from '@mui/utils/unsupportedProp';
|
|
16
19
|
import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
|
|
17
|
-
import { unstable_composeClasses as composeClasses } from '@mui/base';
|
|
18
20
|
import { styled, createUseThemeProps } from '../internals/zero-styled';
|
|
19
21
|
import { TreeItemContent } from './TreeItemContent';
|
|
20
22
|
import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses';
|
|
21
|
-
import { useTreeViewContext } from '../internals/TreeViewProvider
|
|
23
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider';
|
|
22
24
|
import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
|
|
23
25
|
import { TreeItem2Provider } from '../TreeItem2Provider';
|
|
24
26
|
import { TreeViewItemDepthContext } from '../internals/TreeViewItemDepthContext';
|
|
@@ -72,6 +74,7 @@ const StyledTreeItemContent = styled(TreeItemContent, {
|
|
|
72
74
|
width: '100%',
|
|
73
75
|
boxSizing: 'border-box',
|
|
74
76
|
// prevent width + padding to overflow
|
|
77
|
+
position: 'relative',
|
|
75
78
|
display: 'flex',
|
|
76
79
|
alignItems: 'center',
|
|
77
80
|
gap: theme.spacing(1),
|
|
@@ -166,14 +169,16 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
166
169
|
const {
|
|
167
170
|
icons: contextIcons,
|
|
168
171
|
runItemPlugins,
|
|
172
|
+
items: {
|
|
173
|
+
disabledItemsFocusable,
|
|
174
|
+
indentationAtItemLevel
|
|
175
|
+
},
|
|
169
176
|
selection: {
|
|
170
177
|
multiSelect
|
|
171
178
|
},
|
|
172
179
|
expansion: {
|
|
173
180
|
expansionTrigger
|
|
174
181
|
},
|
|
175
|
-
disabledItemsFocusable,
|
|
176
|
-
indentationAtItemLevel,
|
|
177
182
|
instance
|
|
178
183
|
} = useTreeViewContext();
|
|
179
184
|
const depthContext = React.useContext(TreeViewItemDepthContext);
|
|
@@ -206,10 +211,13 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
206
211
|
} = useTreeItemState(itemId);
|
|
207
212
|
const {
|
|
208
213
|
contentRef,
|
|
209
|
-
rootRef
|
|
214
|
+
rootRef,
|
|
215
|
+
propsEnhancers
|
|
210
216
|
} = runItemPlugins(props);
|
|
211
|
-
const
|
|
212
|
-
const
|
|
217
|
+
const rootRefObject = React.useRef(null);
|
|
218
|
+
const contentRefObject = React.useRef(null);
|
|
219
|
+
const handleRootRef = useForkRef(inRef, rootRef, rootRefObject);
|
|
220
|
+
const handleContentRef = useForkRef(ContentProps?.ref, contentRef, contentRefObject);
|
|
213
221
|
const slots = {
|
|
214
222
|
expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? TreeViewExpandIcon,
|
|
215
223
|
collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? TreeViewCollapseIcon,
|
|
@@ -317,6 +325,21 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
317
325
|
};
|
|
318
326
|
const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
|
|
319
327
|
const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
|
|
328
|
+
const enhancedRootProps = propsEnhancers.root?.({
|
|
329
|
+
rootRefObject,
|
|
330
|
+
contentRefObject,
|
|
331
|
+
externalEventHandlers: extractEventHandlers(other)
|
|
332
|
+
}) ?? {};
|
|
333
|
+
const enhancedContentProps = propsEnhancers.content?.({
|
|
334
|
+
rootRefObject,
|
|
335
|
+
contentRefObject,
|
|
336
|
+
externalEventHandlers: extractEventHandlers(ContentProps)
|
|
337
|
+
}) ?? {};
|
|
338
|
+
const enhancedDragAndDropOverlayProps = propsEnhancers.dragAndDropOverlay?.({
|
|
339
|
+
rootRefObject,
|
|
340
|
+
contentRefObject,
|
|
341
|
+
externalEventHandlers: {}
|
|
342
|
+
}) ?? {};
|
|
320
343
|
return /*#__PURE__*/_jsx(TreeItem2Provider, {
|
|
321
344
|
itemId: itemId,
|
|
322
345
|
children: /*#__PURE__*/_jsxs(TreeItemRoot, _extends({
|
|
@@ -335,7 +358,8 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
335
358
|
ref: handleRootRef,
|
|
336
359
|
style: indentationAtItemLevel ? _extends({}, other.style, {
|
|
337
360
|
'--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
|
|
338
|
-
}) : other.style
|
|
361
|
+
}) : other.style
|
|
362
|
+
}, enhancedRootProps, {
|
|
339
363
|
children: [/*#__PURE__*/_jsx(StyledTreeItemContent, _extends({
|
|
340
364
|
as: ContentComponent,
|
|
341
365
|
classes: {
|
|
@@ -356,7 +380,9 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
356
380
|
expansionIcon: expansionIcon,
|
|
357
381
|
displayIcon: displayIcon,
|
|
358
382
|
ownerState: ownerState
|
|
359
|
-
}, ContentProps, {
|
|
383
|
+
}, ContentProps, enhancedContentProps, enhancedDragAndDropOverlayProps.action == null ? {} : {
|
|
384
|
+
dragAndDropOverlayProps: enhancedDragAndDropOverlayProps
|
|
385
|
+
}, {
|
|
360
386
|
ref: handleContentRef
|
|
361
387
|
})), children && /*#__PURE__*/_jsx(TreeItemGroup, _extends({
|
|
362
388
|
as: GroupTransition
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
|
|
3
|
+
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown", "dragAndDropOverlayProps"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import clsx from 'clsx';
|
|
7
7
|
import Checkbox from '@mui/material/Checkbox';
|
|
8
8
|
import { useTreeItemState } from './useTreeItemState';
|
|
9
|
+
import { TreeItem2DragAndDropOverlay } from '../TreeItem2DragAndDropOverlay';
|
|
9
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
11
|
/**
|
|
11
12
|
* @ignore - internal component.
|
|
@@ -20,7 +21,8 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
20
21
|
label,
|
|
21
22
|
itemId,
|
|
22
23
|
onClick,
|
|
23
|
-
onMouseDown
|
|
24
|
+
onMouseDown,
|
|
25
|
+
dragAndDropOverlayProps
|
|
24
26
|
} = props,
|
|
25
27
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
26
28
|
const {
|
|
@@ -33,6 +35,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
33
35
|
handleExpansion,
|
|
34
36
|
handleSelection,
|
|
35
37
|
handleCheckboxSelection,
|
|
38
|
+
handleContentClick,
|
|
36
39
|
preventSelection,
|
|
37
40
|
expansionTrigger
|
|
38
41
|
} = useTreeItemState(itemId);
|
|
@@ -45,6 +48,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
45
48
|
}
|
|
46
49
|
};
|
|
47
50
|
const handleClick = event => {
|
|
51
|
+
handleContentClick?.(event, itemId);
|
|
48
52
|
if (checkboxRef.current?.contains(event.target)) {
|
|
49
53
|
return;
|
|
50
54
|
}
|
|
@@ -79,7 +83,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
79
83
|
}), /*#__PURE__*/_jsx("div", {
|
|
80
84
|
className: classes.label,
|
|
81
85
|
children: label
|
|
82
|
-
})]
|
|
86
|
+
}), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
|
|
83
87
|
}))
|
|
84
88
|
);
|
|
85
89
|
});
|
|
@@ -97,6 +101,10 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
97
101
|
* The icon to display next to the tree item's label. Either a parent or end icon.
|
|
98
102
|
*/
|
|
99
103
|
displayIcon: PropTypes.node,
|
|
104
|
+
dragAndDropOverlayProps: PropTypes.shape({
|
|
105
|
+
action: PropTypes.oneOf(['make-child', 'move-to-parent', 'reorder-above', 'reorder-below']),
|
|
106
|
+
style: PropTypes.object
|
|
107
|
+
}),
|
|
100
108
|
/**
|
|
101
109
|
* The icon to display next to the tree item's label. Either an expansion or collapse icon.
|
|
102
110
|
*/
|
|
@@ -3,4 +3,4 @@ import generateUtilityClasses from '@mui/utils/generateUtilityClasses';
|
|
|
3
3
|
export function getTreeItemUtilityClass(slot) {
|
|
4
4
|
return generateUtilityClass('MuiTreeItem', slot);
|
|
5
5
|
}
|
|
6
|
-
export const treeItemClasses = generateUtilityClasses('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox']);
|
|
6
|
+
export const treeItemClasses = generateUtilityClasses('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox', 'dragAndDropOverlay']);
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { useTreeViewContext } from '../internals/TreeViewProvider
|
|
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
|
|
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 {};
|
|
@@ -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
|
|
5
|
-
import
|
|
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) {
|
|
@@ -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
|
|
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
|
|
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 +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 +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
|
-
|
|
188
|
-
|
|
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
|
|
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';
|
package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -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.
|
|
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
|
|
3
|
+
import extractEventHandlers from '@mui/utils/extractEventHandlers';
|
|
4
4
|
import useForkRef from '@mui/utils/useForkRef';
|
|
5
|
-
import { useTreeViewContext } from '../internals/TreeViewProvider
|
|
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
|
|
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
|
-
|
|
148
|
+
props.style = {
|
|
141
149
|
'--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
|
|
142
150
|
};
|
|
143
151
|
}
|
|
144
|
-
|
|
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
|
|
149
|
-
ref:
|
|
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
|
-
|
|
156
|
-
}
|
|
157
|
-
|
|
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(
|
|
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
|