@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.
- package/CHANGELOG.md +110 -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 +3 -4
- package/useTreeItem2/index.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +43 -15
- package/useTreeItem2/useTreeItem2.types.d.ts +17 -4
|
@@ -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
|
|
@@ -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
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
/**
|