@mui/x-tree-view 7.0.0-beta.5 → 7.0.0-beta.7
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 +252 -50
- package/RichTreeView/RichTreeView.js +23 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +23 -22
- package/TreeItem/TreeItem.js +79 -79
- package/TreeItem/TreeItem.types.d.ts +17 -19
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeItem/useTreeItemState.js +2 -2
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +301 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +68 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.js +23 -22
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/hooks/useTreeViewApiRef.d.ts +2 -2
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/helpers.d.ts +1 -0
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -6
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +37 -23
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
- package/internals/useTreeView/useTreeView.js +27 -25
- package/modern/RichTreeView/RichTreeView.js +23 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -22
- package/modern/TreeItem/TreeItem.js +78 -78
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeItem/useTreeItemState.js +2 -2
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +23 -22
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/useTreeView/useTreeView.js +27 -25
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +135 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +23 -22
- package/node/SimpleTreeView/SimpleTreeView.js +23 -22
- package/node/TreeItem/TreeItem.js +78 -78
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeItem/useTreeItemState.js +2 -2
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +23 -22
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +30 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/node/internals/useTreeView/useTreeView.js +27 -25
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +143 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +2 -2
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +138 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
2
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
+
const _excluded = ["id", "nodeId", "label", "disabled", "children", "slots", "slotProps"];
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
import clsx from 'clsx';
|
|
7
|
+
import unsupportedProp from '@mui/utils/unsupportedProp';
|
|
8
|
+
import { alpha, styled, useThemeProps } from '@mui/material/styles';
|
|
9
|
+
import Collapse from '@mui/material/Collapse';
|
|
10
|
+
import { useSlotProps } from '@mui/base/utils';
|
|
11
|
+
import { shouldForwardProp } from '@mui/system';
|
|
12
|
+
import composeClasses from '@mui/utils/composeClasses';
|
|
13
|
+
import { unstable_useTreeItem2 as useTreeItem2 } from '../useTreeItem2';
|
|
14
|
+
import { getTreeItemUtilityClass, treeItemClasses } from '../TreeItem';
|
|
15
|
+
import { TreeItem2Icon } from '../TreeItem2Icon';
|
|
16
|
+
import { TreeItem2Provider } from '../TreeItem2Provider';
|
|
17
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
export const TreeItem2Root = styled('li', {
|
|
20
|
+
name: 'MuiTreeItem2',
|
|
21
|
+
slot: 'Root',
|
|
22
|
+
overridesResolver: (props, styles) => styles.root
|
|
23
|
+
})({
|
|
24
|
+
listStyle: 'none',
|
|
25
|
+
margin: 0,
|
|
26
|
+
padding: 0,
|
|
27
|
+
outline: 0
|
|
28
|
+
});
|
|
29
|
+
export const TreeItem2Content = styled('div', {
|
|
30
|
+
name: 'MuiTreeItem2',
|
|
31
|
+
slot: 'Content',
|
|
32
|
+
overridesResolver: (props, styles) => styles.content,
|
|
33
|
+
shouldForwardProp: prop => shouldForwardProp(prop) && prop !== 'status'
|
|
34
|
+
})(({
|
|
35
|
+
theme
|
|
36
|
+
}) => ({
|
|
37
|
+
padding: theme.spacing(0.5, 1),
|
|
38
|
+
borderRadius: theme.shape.borderRadius,
|
|
39
|
+
width: '100%',
|
|
40
|
+
boxSizing: 'border-box',
|
|
41
|
+
// prevent width + padding to overflow
|
|
42
|
+
display: 'flex',
|
|
43
|
+
alignItems: 'center',
|
|
44
|
+
gap: theme.spacing(1),
|
|
45
|
+
cursor: 'pointer',
|
|
46
|
+
WebkitTapHighlightColor: 'transparent',
|
|
47
|
+
'&:hover': {
|
|
48
|
+
backgroundColor: (theme.vars || theme).palette.action.hover,
|
|
49
|
+
// Reset on touch devices, it doesn't add specificity
|
|
50
|
+
'@media (hover: none)': {
|
|
51
|
+
backgroundColor: 'transparent'
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
[`& .${treeItemClasses.groupTransition}`]: {
|
|
55
|
+
margin: 0,
|
|
56
|
+
padding: 0,
|
|
57
|
+
paddingLeft: 12
|
|
58
|
+
},
|
|
59
|
+
variants: [{
|
|
60
|
+
props: ({
|
|
61
|
+
status
|
|
62
|
+
}) => status.disabled,
|
|
63
|
+
style: {
|
|
64
|
+
opacity: (theme.vars || theme).palette.action.disabledOpacity,
|
|
65
|
+
backgroundColor: 'transparent'
|
|
66
|
+
}
|
|
67
|
+
}, {
|
|
68
|
+
props: ({
|
|
69
|
+
status
|
|
70
|
+
}) => status.focused,
|
|
71
|
+
style: {
|
|
72
|
+
backgroundColor: (theme.vars || theme).palette.action.focus
|
|
73
|
+
}
|
|
74
|
+
}, {
|
|
75
|
+
props: ({
|
|
76
|
+
status
|
|
77
|
+
}) => status.selected,
|
|
78
|
+
style: {
|
|
79
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.selectedOpacity})` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),
|
|
80
|
+
'&:hover': {
|
|
81
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / calc(${theme.vars.palette.action.selectedOpacity} + ${theme.vars.palette.action.hoverOpacity}))` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity + theme.palette.action.hoverOpacity),
|
|
82
|
+
// Reset on touch devices, it doesn't add specificity
|
|
83
|
+
'@media (hover: none)': {
|
|
84
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.selectedOpacity})` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}, {
|
|
89
|
+
props: ({
|
|
90
|
+
status
|
|
91
|
+
}) => status.selected && status.focused,
|
|
92
|
+
style: {
|
|
93
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / calc(${theme.vars.palette.action.selectedOpacity} + ${theme.vars.palette.action.focusOpacity}))` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity + theme.palette.action.focusOpacity)
|
|
94
|
+
}
|
|
95
|
+
}]
|
|
96
|
+
}));
|
|
97
|
+
export const TreeItem2Label = styled('div', {
|
|
98
|
+
name: 'MuiTreeItem2',
|
|
99
|
+
slot: 'Label',
|
|
100
|
+
overridesResolver: (props, styles) => styles.label
|
|
101
|
+
})(({
|
|
102
|
+
theme
|
|
103
|
+
}) => _extends({
|
|
104
|
+
width: '100%',
|
|
105
|
+
boxSizing: 'border-box',
|
|
106
|
+
// prevent width + padding to overflow
|
|
107
|
+
// fixes overflow - see https://github.com/mui/material-ui/issues/27372
|
|
108
|
+
minWidth: 0,
|
|
109
|
+
position: 'relative'
|
|
110
|
+
}, theme.typography.body1));
|
|
111
|
+
export const TreeItem2IconContainer = styled('div', {
|
|
112
|
+
name: 'MuiTreeItem2',
|
|
113
|
+
slot: 'IconContainer',
|
|
114
|
+
overridesResolver: (props, styles) => styles.iconContainer
|
|
115
|
+
})({
|
|
116
|
+
width: 16,
|
|
117
|
+
display: 'flex',
|
|
118
|
+
flexShrink: 0,
|
|
119
|
+
justifyContent: 'center',
|
|
120
|
+
'& svg': {
|
|
121
|
+
fontSize: 18
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
export const TreeItem2GroupTransition = styled(Collapse, {
|
|
125
|
+
name: 'MuiTreeItem2GroupTransition',
|
|
126
|
+
slot: 'GroupTransition',
|
|
127
|
+
overridesResolver: (props, styles) => styles.groupTransition
|
|
128
|
+
})({
|
|
129
|
+
margin: 0,
|
|
130
|
+
padding: 0,
|
|
131
|
+
paddingLeft: 12
|
|
132
|
+
});
|
|
133
|
+
const useUtilityClasses = ownerState => {
|
|
134
|
+
const {
|
|
135
|
+
classes
|
|
136
|
+
} = ownerState;
|
|
137
|
+
const slots = {
|
|
138
|
+
root: ['root'],
|
|
139
|
+
content: ['content'],
|
|
140
|
+
expanded: ['expanded'],
|
|
141
|
+
selected: ['selected'],
|
|
142
|
+
focused: ['focused'],
|
|
143
|
+
disabled: ['disabled'],
|
|
144
|
+
iconContainer: ['iconContainer'],
|
|
145
|
+
label: ['label'],
|
|
146
|
+
groupTransition: ['groupTransition']
|
|
147
|
+
};
|
|
148
|
+
return composeClasses(slots, getTreeItemUtilityClass, classes);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
*
|
|
153
|
+
* Demos:
|
|
154
|
+
*
|
|
155
|
+
* - [Tree View](https://mui.com/x/react-tree-view/)
|
|
156
|
+
*
|
|
157
|
+
* API:
|
|
158
|
+
*
|
|
159
|
+
* - [TreeItem2 API](https://mui.com/x/api/tree-view/tree-item-2/)
|
|
160
|
+
*/
|
|
161
|
+
export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProps, forwardedRef) {
|
|
162
|
+
const props = useThemeProps({
|
|
163
|
+
props: inProps,
|
|
164
|
+
name: 'MuiTreeItem2'
|
|
165
|
+
});
|
|
166
|
+
const {
|
|
167
|
+
id,
|
|
168
|
+
nodeId,
|
|
169
|
+
label,
|
|
170
|
+
disabled,
|
|
171
|
+
children,
|
|
172
|
+
slots = {},
|
|
173
|
+
slotProps = {}
|
|
174
|
+
} = props,
|
|
175
|
+
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
176
|
+
const {
|
|
177
|
+
getRootProps,
|
|
178
|
+
getContentProps,
|
|
179
|
+
getIconContainerProps,
|
|
180
|
+
getLabelProps,
|
|
181
|
+
getGroupTransitionProps,
|
|
182
|
+
status
|
|
183
|
+
} = useTreeItem2({
|
|
184
|
+
id,
|
|
185
|
+
nodeId,
|
|
186
|
+
children,
|
|
187
|
+
label,
|
|
188
|
+
disabled
|
|
189
|
+
});
|
|
190
|
+
const ownerState = _extends({}, props, status);
|
|
191
|
+
const classes = useUtilityClasses(ownerState);
|
|
192
|
+
const Root = slots.root ?? TreeItem2Root;
|
|
193
|
+
const rootProps = useSlotProps({
|
|
194
|
+
elementType: Root,
|
|
195
|
+
getSlotProps: getRootProps,
|
|
196
|
+
externalForwardedProps: other,
|
|
197
|
+
externalSlotProps: slotProps.root,
|
|
198
|
+
additionalProps: {
|
|
199
|
+
ref: forwardedRef
|
|
200
|
+
},
|
|
201
|
+
ownerState: {},
|
|
202
|
+
className: classes.root
|
|
203
|
+
});
|
|
204
|
+
const Content = slots.content ?? TreeItem2Content;
|
|
205
|
+
const contentProps = useSlotProps({
|
|
206
|
+
elementType: Content,
|
|
207
|
+
getSlotProps: getContentProps,
|
|
208
|
+
externalSlotProps: slotProps.content,
|
|
209
|
+
ownerState: {},
|
|
210
|
+
className: clsx(classes.content, status.expanded && classes.expanded, status.selected && classes.selected, status.focused && classes.focused, status.disabled && classes.disabled)
|
|
211
|
+
});
|
|
212
|
+
const IconContainer = slots.iconContainer ?? TreeItem2IconContainer;
|
|
213
|
+
const iconContainerProps = useSlotProps({
|
|
214
|
+
elementType: IconContainer,
|
|
215
|
+
getSlotProps: getIconContainerProps,
|
|
216
|
+
externalSlotProps: slotProps.iconContainer,
|
|
217
|
+
ownerState: {},
|
|
218
|
+
className: classes.iconContainer
|
|
219
|
+
});
|
|
220
|
+
const Label = slots.label ?? TreeItem2Label;
|
|
221
|
+
const labelProps = useSlotProps({
|
|
222
|
+
elementType: Label,
|
|
223
|
+
getSlotProps: getLabelProps,
|
|
224
|
+
externalSlotProps: slotProps.label,
|
|
225
|
+
ownerState: {},
|
|
226
|
+
className: classes.label
|
|
227
|
+
});
|
|
228
|
+
const GroupTransition = slots.groupTransition ?? undefined;
|
|
229
|
+
const groupTransitionProps = useSlotProps({
|
|
230
|
+
elementType: GroupTransition,
|
|
231
|
+
getSlotProps: getGroupTransitionProps,
|
|
232
|
+
externalSlotProps: slotProps.groupTransition,
|
|
233
|
+
ownerState: {},
|
|
234
|
+
className: classes.groupTransition
|
|
235
|
+
});
|
|
236
|
+
return /*#__PURE__*/_jsx(TreeItem2Provider, {
|
|
237
|
+
nodeId: nodeId,
|
|
238
|
+
children: /*#__PURE__*/_jsxs(Root, _extends({}, rootProps, {
|
|
239
|
+
children: [/*#__PURE__*/_jsxs(Content, _extends({}, contentProps, {
|
|
240
|
+
children: [/*#__PURE__*/_jsx(IconContainer, _extends({}, iconContainerProps, {
|
|
241
|
+
children: /*#__PURE__*/_jsx(TreeItem2Icon, {
|
|
242
|
+
status: status,
|
|
243
|
+
slots: slots,
|
|
244
|
+
slotProps: slotProps
|
|
245
|
+
})
|
|
246
|
+
})), /*#__PURE__*/_jsx(Label, _extends({}, labelProps))]
|
|
247
|
+
})), children && /*#__PURE__*/_jsx(TreeItem2GroupTransition, _extends({
|
|
248
|
+
as: GroupTransition
|
|
249
|
+
}, groupTransitionProps))]
|
|
250
|
+
}))
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
process.env.NODE_ENV !== "production" ? TreeItem2.propTypes = {
|
|
254
|
+
// ----------------------------- Warning --------------------------------
|
|
255
|
+
// | These PropTypes are generated from the TypeScript type definitions |
|
|
256
|
+
// | To update them edit the TypeScript types and run "yarn proptypes" |
|
|
257
|
+
// ----------------------------------------------------------------------
|
|
258
|
+
/**
|
|
259
|
+
* The content of the component.
|
|
260
|
+
*/
|
|
261
|
+
children: PropTypes.node,
|
|
262
|
+
/**
|
|
263
|
+
* Override or extend the styles applied to the component.
|
|
264
|
+
*/
|
|
265
|
+
classes: PropTypes.object,
|
|
266
|
+
className: PropTypes.string,
|
|
267
|
+
/**
|
|
268
|
+
* If `true`, the node is disabled.
|
|
269
|
+
* @default false
|
|
270
|
+
*/
|
|
271
|
+
disabled: PropTypes.bool,
|
|
272
|
+
/**
|
|
273
|
+
* The id attribute of the node. If not provided, it will be generated.
|
|
274
|
+
*/
|
|
275
|
+
id: PropTypes.string,
|
|
276
|
+
/**
|
|
277
|
+
* The label of the node.
|
|
278
|
+
*/
|
|
279
|
+
label: PropTypes.node,
|
|
280
|
+
/**
|
|
281
|
+
* The id of the node.
|
|
282
|
+
* Must be unique.
|
|
283
|
+
*/
|
|
284
|
+
nodeId: PropTypes.string.isRequired,
|
|
285
|
+
/**
|
|
286
|
+
* This prop isn't supported.
|
|
287
|
+
* Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
|
|
288
|
+
*/
|
|
289
|
+
onFocus: unsupportedProp,
|
|
290
|
+
/**
|
|
291
|
+
* The props used for each component slot.
|
|
292
|
+
* @default {}
|
|
293
|
+
*/
|
|
294
|
+
slotProps: PropTypes.object,
|
|
295
|
+
/**
|
|
296
|
+
* Overridable component slots.
|
|
297
|
+
* @default {}
|
|
298
|
+
*/
|
|
299
|
+
slots: PropTypes.object
|
|
300
|
+
} : void 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TreeItem2, TreeItem2Root, TreeItem2Content, TreeItem2IconContainer, TreeItem2GroupTransition, TreeItem2Label } from './TreeItem2';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
|
|
5
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
|
|
6
|
+
import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
function TreeItem2Icon(props) {
|
|
9
|
+
const {
|
|
10
|
+
slots,
|
|
11
|
+
slotProps,
|
|
12
|
+
status
|
|
13
|
+
} = props;
|
|
14
|
+
const context = useTreeViewContext();
|
|
15
|
+
const contextIcons = _extends({}, context.icons.slots, {
|
|
16
|
+
expandIcon: context.icons.slots.expandIcon ?? TreeViewExpandIcon,
|
|
17
|
+
collapseIcon: context.icons.slots.collapseIcon ?? TreeViewCollapseIcon
|
|
18
|
+
});
|
|
19
|
+
const contextIconProps = context.icons.slotProps;
|
|
20
|
+
let iconName;
|
|
21
|
+
if (slots?.icon) {
|
|
22
|
+
iconName = 'icon';
|
|
23
|
+
} else if (status.expandable) {
|
|
24
|
+
if (status.expanded) {
|
|
25
|
+
iconName = 'collapseIcon';
|
|
26
|
+
} else {
|
|
27
|
+
iconName = 'expandIcon';
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
iconName = 'endIcon';
|
|
31
|
+
}
|
|
32
|
+
const Icon = slots?.[iconName] ?? contextIcons[iconName];
|
|
33
|
+
const iconProps = useSlotProps({
|
|
34
|
+
elementType: Icon,
|
|
35
|
+
externalSlotProps: tempOwnerState => _extends({}, resolveComponentProps(contextIconProps[iconName], tempOwnerState), resolveComponentProps(slotProps?.[iconName], tempOwnerState)),
|
|
36
|
+
// TODO: Add proper ownerState
|
|
37
|
+
ownerState: {}
|
|
38
|
+
});
|
|
39
|
+
if (!Icon) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return /*#__PURE__*/_jsx(Icon, _extends({}, iconProps));
|
|
43
|
+
}
|
|
44
|
+
process.env.NODE_ENV !== "production" ? TreeItem2Icon.propTypes = {
|
|
45
|
+
// ----------------------------- Warning --------------------------------
|
|
46
|
+
// | These PropTypes are generated from the TypeScript type definitions |
|
|
47
|
+
// | To update them edit the TypeScript types and run "yarn proptypes" |
|
|
48
|
+
// ----------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* The props used for each component slot.
|
|
51
|
+
* @default {}
|
|
52
|
+
*/
|
|
53
|
+
slotProps: PropTypes.object,
|
|
54
|
+
/**
|
|
55
|
+
* Overridable component slots.
|
|
56
|
+
* @default {}
|
|
57
|
+
*/
|
|
58
|
+
slots: PropTypes.object,
|
|
59
|
+
status: PropTypes.shape({
|
|
60
|
+
disabled: PropTypes.bool.isRequired,
|
|
61
|
+
expandable: PropTypes.bool.isRequired,
|
|
62
|
+
expanded: PropTypes.bool.isRequired,
|
|
63
|
+
focused: PropTypes.bool.isRequired,
|
|
64
|
+
selected: PropTypes.bool.isRequired
|
|
65
|
+
}).isRequired
|
|
66
|
+
} : void 0;
|
|
67
|
+
export { TreeItem2Icon };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TreeItem2Icon } from './TreeItem2Icon';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import PropTypes from 'prop-types';
|
|
2
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
|
|
3
|
+
function TreeItem2Provider(props) {
|
|
4
|
+
const {
|
|
5
|
+
children,
|
|
6
|
+
nodeId
|
|
7
|
+
} = props;
|
|
8
|
+
const {
|
|
9
|
+
wrapItem
|
|
10
|
+
} = useTreeViewContext();
|
|
11
|
+
return wrapItem({
|
|
12
|
+
children,
|
|
13
|
+
nodeId
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
TreeItem2Provider.propTypes = {
|
|
17
|
+
// ----------------------------- Warning --------------------------------
|
|
18
|
+
// | These PropTypes are generated from the TypeScript type definitions |
|
|
19
|
+
// | To update them edit the TypeScript types and run "yarn proptypes" |
|
|
20
|
+
// ----------------------------------------------------------------------
|
|
21
|
+
children: PropTypes.node,
|
|
22
|
+
nodeId: PropTypes.string.isRequired
|
|
23
|
+
};
|
|
24
|
+
export { TreeItem2Provider };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TreeItem2Provider } from './TreeItem2Provider';
|
|
@@ -69,7 +69,8 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
69
69
|
*/
|
|
70
70
|
apiRef: PropTypes.shape({
|
|
71
71
|
current: PropTypes.shape({
|
|
72
|
-
|
|
72
|
+
focusItem: PropTypes.func.isRequired,
|
|
73
|
+
getItem: PropTypes.func.isRequired
|
|
73
74
|
})
|
|
74
75
|
}),
|
|
75
76
|
/**
|
|
@@ -82,17 +83,17 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
82
83
|
classes: PropTypes.object,
|
|
83
84
|
className: PropTypes.string,
|
|
84
85
|
/**
|
|
85
|
-
* Expanded
|
|
86
|
+
* Expanded item ids.
|
|
86
87
|
* Used when the item's expansion is not controlled.
|
|
87
88
|
* @default []
|
|
88
89
|
*/
|
|
89
|
-
|
|
90
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
90
91
|
/**
|
|
91
|
-
* Selected
|
|
92
|
+
* Selected item ids. (Uncontrolled)
|
|
92
93
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
93
94
|
* @default []
|
|
94
95
|
*/
|
|
95
|
-
|
|
96
|
+
defaultSelectedItems: PropTypes.any,
|
|
96
97
|
/**
|
|
97
98
|
* If `true`, will allow focus on disabled items.
|
|
98
99
|
* @default false
|
|
@@ -104,10 +105,10 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
104
105
|
*/
|
|
105
106
|
disableSelection: PropTypes.bool,
|
|
106
107
|
/**
|
|
107
|
-
* Expanded
|
|
108
|
+
* Expanded item ids.
|
|
108
109
|
* Used when the item's expansion is controlled.
|
|
109
110
|
*/
|
|
110
|
-
|
|
111
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
111
112
|
/**
|
|
112
113
|
* This prop is used to help implement the accessibility logic.
|
|
113
114
|
* If you don't provide this prop. It falls back to a randomly generated id.
|
|
@@ -121,42 +122,42 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
121
122
|
/**
|
|
122
123
|
* Callback fired when tree items are expanded/collapsed.
|
|
123
124
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
124
|
-
* @param {array}
|
|
125
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
125
126
|
*/
|
|
126
|
-
|
|
127
|
+
onExpandedItemsChange: PropTypes.func,
|
|
127
128
|
/**
|
|
128
129
|
* Callback fired when a tree item is expanded or collapsed.
|
|
129
130
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
130
|
-
* @param {array}
|
|
131
|
-
* @param {array} isExpanded `true` if the
|
|
131
|
+
* @param {array} itemId The itemId of the modified item.
|
|
132
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
132
133
|
*/
|
|
133
|
-
|
|
134
|
+
onItemExpansionToggle: PropTypes.func,
|
|
134
135
|
/**
|
|
135
136
|
* Callback fired when tree items are focused.
|
|
136
137
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
137
|
-
* @param {string}
|
|
138
|
-
* @param {string} value of the focused
|
|
138
|
+
* @param {string} itemId The id of the focused item.
|
|
139
|
+
* @param {string} value of the focused item.
|
|
139
140
|
*/
|
|
140
|
-
|
|
141
|
+
onItemFocus: PropTypes.func,
|
|
141
142
|
/**
|
|
142
143
|
* Callback fired when a tree item is selected or deselected.
|
|
143
144
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
144
|
-
* @param {array}
|
|
145
|
-
* @param {array} isSelected `true` if the
|
|
145
|
+
* @param {array} itemId The itemId of the modified item.
|
|
146
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
146
147
|
*/
|
|
147
|
-
|
|
148
|
+
onItemSelectionToggle: PropTypes.func,
|
|
148
149
|
/**
|
|
149
150
|
* Callback fired when tree items are selected/deselected.
|
|
150
151
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
151
|
-
* @param {string[] | string}
|
|
152
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
152
153
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
153
154
|
*/
|
|
154
|
-
|
|
155
|
+
onSelectedItemsChange: PropTypes.func,
|
|
155
156
|
/**
|
|
156
|
-
* Selected
|
|
157
|
+
* Selected item ids. (Controlled)
|
|
157
158
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
158
159
|
*/
|
|
159
|
-
|
|
160
|
+
selectedItems: PropTypes.any,
|
|
160
161
|
/**
|
|
161
162
|
* The props used for each component slot.
|
|
162
163
|
*/
|
package/modern/hooks/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useTreeViewApiRef } from './useTreeViewApiRef';
|
|
1
|
+
export { useTreeViewApiRef } from './useTreeViewApiRef';
|
|
2
|
+
export { useTreeItem2Utils } from './useTreeItem2Utils';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeItem2Utils } from './useTreeItem2Utils';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext';
|
|
2
|
+
export const useTreeItem2Utils = ({
|
|
3
|
+
nodeId,
|
|
4
|
+
children
|
|
5
|
+
}) => {
|
|
6
|
+
const {
|
|
7
|
+
instance,
|
|
8
|
+
selection: {
|
|
9
|
+
multiSelect
|
|
10
|
+
}
|
|
11
|
+
} = useTreeViewContext();
|
|
12
|
+
const status = {
|
|
13
|
+
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
14
|
+
expanded: instance.isNodeExpanded(nodeId),
|
|
15
|
+
focused: instance.isNodeFocused(nodeId),
|
|
16
|
+
selected: instance.isNodeSelected(nodeId),
|
|
17
|
+
disabled: instance.isNodeDisabled(nodeId)
|
|
18
|
+
};
|
|
19
|
+
const handleExpansion = event => {
|
|
20
|
+
if (status.disabled) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!status.focused) {
|
|
24
|
+
instance.focusItem(event, nodeId);
|
|
25
|
+
}
|
|
26
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
27
|
+
|
|
28
|
+
// If already expanded and trying to toggle selection don't close
|
|
29
|
+
if (status.expandable && !(multiple && instance.isNodeExpanded(nodeId))) {
|
|
30
|
+
instance.toggleNodeExpansion(event, nodeId);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const handleSelection = event => {
|
|
34
|
+
if (status.disabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!status.focused) {
|
|
38
|
+
instance.focusItem(event, nodeId);
|
|
39
|
+
}
|
|
40
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
41
|
+
if (multiple) {
|
|
42
|
+
if (event.shiftKey) {
|
|
43
|
+
instance.selectRange(event, {
|
|
44
|
+
end: nodeId
|
|
45
|
+
});
|
|
46
|
+
} else {
|
|
47
|
+
instance.selectNode(event, nodeId, true);
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
instance.selectNode(event, nodeId);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const interactions = {
|
|
54
|
+
handleExpansion,
|
|
55
|
+
handleSelection
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
interactions,
|
|
59
|
+
status
|
|
60
|
+
};
|
|
61
|
+
};
|
package/modern/index.js
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @mui/x-tree-view v7.0.0-beta.
|
|
2
|
+
* @mui/x-tree-view v7.0.0-beta.7
|
|
3
3
|
*
|
|
4
4
|
* @license MIT
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
// Tree View
|
|
9
9
|
export * from './TreeView';
|
|
10
10
|
export * from './SimpleTreeView';
|
|
11
11
|
export * from './RichTreeView';
|
|
12
|
+
|
|
13
|
+
// Tree Item
|
|
14
|
+
export * from './TreeItem';
|
|
15
|
+
export * from './TreeItem2';
|
|
16
|
+
export * from './useTreeItem2';
|
|
17
|
+
export * from './TreeItem2Icon';
|
|
18
|
+
export * from './TreeItem2Provider';
|
|
12
19
|
export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
|
|
13
20
|
export * from './models';
|
|
14
21
|
export * from './icons';
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const UNINITIALIZED = {};
|
|
3
|
-
|
|
4
|
-
// See https://github.com/facebook/react/issues/14490 for when to use this.
|
|
5
|
-
export function useLazyRef(init, initArg) {
|
|
6
|
-
const ref = React.useRef(UNINITIALIZED);
|
|
7
|
-
if (ref.current === UNINITIALIZED) {
|
|
8
|
-
ref.current = init(initArg);
|
|
9
|
-
}
|
|
10
|
-
return ref;
|
|
11
|
-
}
|
|
1
|
+
export { default as useLazyRef } from '@mui/utils/useLazyRef';
|
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const EMPTY = [];
|
|
3
|
-
export function useOnMount(fn) {
|
|
4
|
-
/* eslint-disable react-hooks/exhaustive-deps */
|
|
5
|
-
React.useEffect(fn, EMPTY);
|
|
6
|
-
/* eslint-enable react-hooks/exhaustive-deps */
|
|
7
|
-
}
|
|
1
|
+
export { default as useOnMount } from '@mui/utils/useOnMount';
|
|
@@ -1,36 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { useLazyRef } from './useLazyRef';
|
|
4
|
-
import { useOnMount } from './useOnMount';
|
|
5
|
-
export class Timeout {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.currentId = null;
|
|
8
|
-
this.clear = () => {
|
|
9
|
-
if (this.currentId !== null) {
|
|
10
|
-
clearTimeout(this.currentId);
|
|
11
|
-
this.currentId = null;
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
this.disposeEffect = () => {
|
|
15
|
-
return this.clear;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
static create() {
|
|
19
|
-
return new Timeout();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Executes `fn` after `delay`, clearing any previously scheduled call.
|
|
23
|
-
*/
|
|
24
|
-
start(delay, fn) {
|
|
25
|
-
this.clear();
|
|
26
|
-
this.currentId = setTimeout(() => {
|
|
27
|
-
this.currentId = null;
|
|
28
|
-
fn();
|
|
29
|
-
}, delay);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function useTimeout() {
|
|
33
|
-
const timeout = useLazyRef(Timeout.create).current;
|
|
34
|
-
useOnMount(timeout.disposeEffect);
|
|
35
|
-
return timeout;
|
|
36
|
-
}
|
|
1
|
+
export { default as useTimeout } from '@mui/utils/useTimeout';
|