@mui/x-tree-view 7.0.0-beta.6 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/CHANGELOG.md +311 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +34 -36
  4. package/RichTreeView/RichTreeView.types.d.ts +3 -2
  5. package/SimpleTreeView/SimpleTreeView.js +25 -26
  6. package/TreeItem/TreeItem.js +94 -82
  7. package/TreeItem/TreeItem.types.d.ts +13 -11
  8. package/TreeItem/TreeItemContent.d.ts +7 -7
  9. package/TreeItem/TreeItemContent.js +10 -10
  10. package/TreeItem/useTreeItemState.d.ts +1 -1
  11. package/TreeItem/useTreeItemState.js +13 -13
  12. package/TreeItem2/TreeItem2.d.ts +18 -0
  13. package/TreeItem2/TreeItem2.js +300 -0
  14. package/TreeItem2/TreeItem2.types.d.ts +64 -0
  15. package/TreeItem2/TreeItem2.types.js +1 -0
  16. package/TreeItem2/index.d.ts +2 -0
  17. package/TreeItem2/index.js +1 -0
  18. package/TreeItem2/package.json +6 -0
  19. package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
  20. package/TreeItem2Icon/TreeItem2Icon.js +67 -0
  21. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
  22. package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  23. package/TreeItem2Icon/index.d.ts +2 -0
  24. package/TreeItem2Icon/index.js +1 -0
  25. package/TreeItem2Icon/package.json +6 -0
  26. package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
  27. package/TreeItem2Provider/TreeItem2Provider.js +24 -0
  28. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
  29. package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  30. package/TreeItem2Provider/index.d.ts +2 -0
  31. package/TreeItem2Provider/index.js +1 -0
  32. package/TreeItem2Provider/package.json +6 -0
  33. package/TreeView/TreeView.d.ts +1 -1
  34. package/TreeView/TreeView.js +23 -23
  35. package/hooks/index.d.ts +1 -0
  36. package/hooks/index.js +2 -1
  37. package/hooks/useTreeItem2Utils/index.d.ts +1 -0
  38. package/hooks/useTreeItem2Utils/index.js +1 -0
  39. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
  40. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  41. package/index.d.ts +5 -1
  42. package/index.js +9 -2
  43. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  44. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  45. package/internals/hooks/useInstanceEventHandler.js +5 -10
  46. package/internals/hooks/useLazyRef.d.ts +1 -2
  47. package/internals/hooks/useLazyRef.js +1 -11
  48. package/internals/hooks/useOnMount.d.ts +1 -2
  49. package/internals/hooks/useOnMount.js +1 -7
  50. package/internals/hooks/useTimeout.d.ts +1 -11
  51. package/internals/hooks/useTimeout.js +1 -36
  52. package/internals/models/plugin.d.ts +19 -16
  53. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
  55. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
  56. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  57. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  58. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  59. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
  60. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  61. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
  62. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  63. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
  64. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
  67. package/internals/useTreeView/useTreeView.js +28 -27
  68. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  69. package/internals/useTreeView/useTreeView.utils.js +22 -22
  70. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  71. package/internals/utils/utils.js +1 -0
  72. package/modern/RichTreeView/RichTreeView.js +29 -29
  73. package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
  74. package/modern/TreeItem/TreeItem.js +83 -70
  75. package/modern/TreeItem/TreeItemContent.js +10 -10
  76. package/modern/TreeItem/useTreeItemState.js +13 -13
  77. package/modern/TreeItem2/TreeItem2.js +300 -0
  78. package/modern/TreeItem2/TreeItem2.types.js +1 -0
  79. package/modern/TreeItem2/index.js +1 -0
  80. package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
  81. package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  82. package/modern/TreeItem2Icon/index.js +1 -0
  83. package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
  84. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  85. package/modern/TreeItem2Provider/index.js +1 -0
  86. package/modern/TreeView/TreeView.js +23 -23
  87. package/modern/hooks/index.js +2 -1
  88. package/modern/hooks/useTreeItem2Utils/index.js +1 -0
  89. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  90. package/modern/index.js +9 -2
  91. package/modern/internals/hooks/useLazyRef.js +1 -11
  92. package/modern/internals/hooks/useOnMount.js +1 -7
  93. package/modern/internals/hooks/useTimeout.js +1 -36
  94. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  95. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  96. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  97. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  98. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  99. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  100. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  101. package/modern/internals/useTreeView/useTreeView.js +28 -27
  102. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  103. package/modern/internals/utils/utils.js +1 -0
  104. package/modern/useTreeItem2/index.js +1 -0
  105. package/modern/useTreeItem2/useTreeItem2.js +146 -0
  106. package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
  107. package/node/RichTreeView/RichTreeView.js +29 -29
  108. package/node/SimpleTreeView/SimpleTreeView.js +23 -23
  109. package/node/TreeItem/TreeItem.js +83 -70
  110. package/node/TreeItem/TreeItemContent.js +10 -10
  111. package/node/TreeItem/useTreeItemState.js +13 -13
  112. package/node/TreeItem2/TreeItem2.js +308 -0
  113. package/node/TreeItem2/TreeItem2.types.js +5 -0
  114. package/node/TreeItem2/index.js +42 -0
  115. package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
  116. package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
  117. package/node/TreeItem2Icon/index.js +12 -0
  118. package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
  119. package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
  120. package/node/TreeItem2Provider/index.js +12 -0
  121. package/node/TreeView/TreeView.js +23 -23
  122. package/node/hooks/index.js +8 -1
  123. package/node/hooks/useTreeItem2Utils/index.js +12 -0
  124. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
  125. package/node/index.js +61 -13
  126. package/node/internals/hooks/useLazyRef.js +7 -13
  127. package/node/internals/hooks/useOnMount.js +8 -10
  128. package/node/internals/hooks/useTimeout.js +7 -37
  129. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  130. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  131. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  132. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  133. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  134. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  135. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  136. package/node/internals/useTreeView/useTreeView.js +28 -27
  137. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  138. package/node/internals/utils/utils.js +1 -0
  139. package/node/useTreeItem2/index.js +12 -0
  140. package/node/useTreeItem2/useTreeItem2.js +154 -0
  141. package/node/useTreeItem2/useTreeItem2.types.js +5 -0
  142. package/package.json +5 -5
  143. package/themeAugmentation/components.d.ts +5 -0
  144. package/themeAugmentation/overrides.d.ts +1 -0
  145. package/themeAugmentation/props.d.ts +2 -0
  146. package/useTreeItem2/index.d.ts +2 -0
  147. package/useTreeItem2/index.js +1 -0
  148. package/useTreeItem2/package.json +6 -0
  149. package/useTreeItem2/useTreeItem2.d.ts +2 -0
  150. package/useTreeItem2/useTreeItem2.js +146 -0
  151. package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
  152. 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", "itemId", "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
+ itemId,
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
+ itemId,
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
+ itemId: itemId,
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 item is disabled.
269
+ * @default false
270
+ */
271
+ disabled: PropTypes.bool,
272
+ /**
273
+ * The id attribute of the item. If not provided, it will be generated.
274
+ */
275
+ id: PropTypes.string,
276
+ /**
277
+ * The id of the item.
278
+ * Must be unique.
279
+ */
280
+ itemId: PropTypes.string.isRequired,
281
+ /**
282
+ * The label of the item.
283
+ */
284
+ label: PropTypes.node,
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
+ itemId
7
+ } = props;
8
+ const {
9
+ wrapItem
10
+ } = useTreeViewContext();
11
+ return wrapItem({
12
+ children,
13
+ itemId
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
+ itemId: PropTypes.string.isRequired
23
+ };
24
+ export { TreeItem2Provider };
@@ -0,0 +1 @@
1
+ export { TreeItem2Provider } from './TreeItem2Provider';
@@ -30,7 +30,7 @@ const warn = () => {
30
30
 
31
31
  /**
32
32
  * This component has been deprecated in favor of the new `SimpleTreeView` component.
33
- * You can have a look at how to migrate to the new component in the v7 [migration guide](https://next.mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
33
+ * You can have a look at how to migrate to the new component in the v7 [migration guide](https://mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
34
34
  *
35
35
  * Demos:
36
36
  *
@@ -69,7 +69,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
69
69
  */
70
70
  apiRef: PropTypes.shape({
71
71
  current: PropTypes.shape({
72
- focusNode: PropTypes.func.isRequired,
72
+ focusItem: PropTypes.func.isRequired,
73
73
  getItem: PropTypes.func.isRequired
74
74
  })
75
75
  }),
@@ -83,17 +83,17 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
83
83
  classes: PropTypes.object,
84
84
  className: PropTypes.string,
85
85
  /**
86
- * Expanded node ids.
86
+ * Expanded item ids.
87
87
  * Used when the item's expansion is not controlled.
88
88
  * @default []
89
89
  */
90
- defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
90
+ defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
91
91
  /**
92
- * Selected node ids. (Uncontrolled)
92
+ * Selected item ids. (Uncontrolled)
93
93
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
94
94
  * @default []
95
95
  */
96
- defaultSelectedNodes: PropTypes.any,
96
+ defaultSelectedItems: PropTypes.any,
97
97
  /**
98
98
  * If `true`, will allow focus on disabled items.
99
99
  * @default false
@@ -105,10 +105,10 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
105
105
  */
106
106
  disableSelection: PropTypes.bool,
107
107
  /**
108
- * Expanded node ids.
108
+ * Expanded item ids.
109
109
  * Used when the item's expansion is controlled.
110
110
  */
111
- expandedNodes: PropTypes.arrayOf(PropTypes.string),
111
+ expandedItems: PropTypes.arrayOf(PropTypes.string),
112
112
  /**
113
113
  * This prop is used to help implement the accessibility logic.
114
114
  * If you don't provide this prop. It falls back to a randomly generated id.
@@ -122,42 +122,42 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
122
122
  /**
123
123
  * Callback fired when tree items are expanded/collapsed.
124
124
  * @param {React.SyntheticEvent} event The event source of the callback.
125
- * @param {array} nodeIds The ids of the expanded nodes.
125
+ * @param {array} itemIds The ids of the expanded items.
126
126
  */
127
- onExpandedNodesChange: PropTypes.func,
127
+ onExpandedItemsChange: PropTypes.func,
128
128
  /**
129
129
  * Callback fired when a tree item is expanded or collapsed.
130
130
  * @param {React.SyntheticEvent} event The event source of the callback.
131
- * @param {array} nodeId The nodeId of the modified node.
132
- * @param {array} isExpanded `true` if the node has just been expanded, `false` if it has just been collapsed.
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.
133
133
  */
134
- onNodeExpansionToggle: PropTypes.func,
134
+ onItemExpansionToggle: PropTypes.func,
135
135
  /**
136
136
  * Callback fired when tree items are focused.
137
137
  * @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
138
- * @param {string} nodeId The id of the node focused.
139
- * @param {string} value of the focused node.
138
+ * @param {string} itemId The id of the focused item.
139
+ * @param {string} value of the focused item.
140
140
  */
141
- onNodeFocus: PropTypes.func,
141
+ onItemFocus: PropTypes.func,
142
142
  /**
143
143
  * Callback fired when a tree item is selected or deselected.
144
144
  * @param {React.SyntheticEvent} event The event source of the callback.
145
- * @param {array} nodeId The nodeId of the modified node.
146
- * @param {array} isSelected `true` if the node has just been selected, `false` if it has just been deselected.
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.
147
147
  */
148
- onNodeSelectionToggle: PropTypes.func,
148
+ onItemSelectionToggle: PropTypes.func,
149
149
  /**
150
150
  * Callback fired when tree items are selected/deselected.
151
151
  * @param {React.SyntheticEvent} event The event source of the callback
152
- * @param {string[] | string} nodeIds The ids of the selected nodes.
152
+ * @param {string[] | string} itemIds The ids of the selected items.
153
153
  * When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
154
154
  */
155
- onSelectedNodesChange: PropTypes.func,
155
+ onSelectedItemsChange: PropTypes.func,
156
156
  /**
157
- * Selected node ids. (Controlled)
157
+ * Selected item ids. (Controlled)
158
158
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
159
159
  */
160
- selectedNodes: PropTypes.any,
160
+ selectedItems: PropTypes.any,
161
161
  /**
162
162
  * The props used for each component slot.
163
163
  */
@@ -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
+ itemId,
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(itemId),
15
+ focused: instance.isNodeFocused(itemId),
16
+ selected: instance.isNodeSelected(itemId),
17
+ disabled: instance.isNodeDisabled(itemId)
18
+ };
19
+ const handleExpansion = event => {
20
+ if (status.disabled) {
21
+ return;
22
+ }
23
+ if (!status.focused) {
24
+ instance.focusItem(event, itemId);
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(itemId))) {
30
+ instance.toggleNodeExpansion(event, itemId);
31
+ }
32
+ };
33
+ const handleSelection = event => {
34
+ if (status.disabled) {
35
+ return;
36
+ }
37
+ if (!status.focused) {
38
+ instance.focusItem(event, itemId);
39
+ }
40
+ const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
41
+ if (multiple) {
42
+ if (event.shiftKey) {
43
+ instance.selectRange(event, {
44
+ end: itemId
45
+ });
46
+ } else {
47
+ instance.selectNode(event, itemId, true);
48
+ }
49
+ } else {
50
+ instance.selectNode(event, itemId);
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.6
2
+ * @mui/x-tree-view v7.0.0
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
- export * from './TreeItem';
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
- import * as React from 'react';
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
- import * as React from 'react';
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
- 'use client';
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';