@mui/x-tree-view 7.19.0 → 7.21.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 +224 -43
- package/RichTreeView/RichTreeView.js +14 -53
- package/SimpleTreeView/SimpleTreeView.js +8 -8
- package/TreeItem/TreeItem.js +25 -12
- package/TreeItem/TreeItem.types.d.ts +6 -4
- package/TreeItem/TreeItemContent.d.ts +5 -5
- package/TreeItem/TreeItemContent.js +29 -33
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem2/TreeItem2.types.d.ts +1 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +8 -8
- package/index.js +1 -1
- package/internals/components/RichTreeViewItems.d.ts +35 -0
- package/internals/components/RichTreeViewItems.js +56 -0
- package/internals/corePlugins/corePlugins.d.ts +1 -1
- package/internals/corePlugins/corePlugins.js +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/internals/index.d.ts +1 -0
- package/internals/index.js +1 -0
- package/internals/models/treeView.d.ts +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -2
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -1
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +8 -8
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +1 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +3 -3
- package/modern/RichTreeView/RichTreeView.js +14 -53
- package/modern/SimpleTreeView/SimpleTreeView.js +8 -8
- package/modern/TreeItem/TreeItem.js +25 -12
- package/modern/TreeItem/TreeItemContent.js +29 -33
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/modern/TreeView/TreeView.js +8 -8
- package/modern/index.js +1 -1
- package/modern/internals/components/RichTreeViewItems.js +56 -0
- package/modern/internals/corePlugins/corePlugins.js +1 -1
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/modern/useTreeItem2/useTreeItem2.js +11 -11
- package/node/RichTreeView/RichTreeView.js +14 -53
- package/node/SimpleTreeView/SimpleTreeView.js +8 -8
- package/node/TreeItem/TreeItem.js +25 -12
- package/node/TreeItem/TreeItemContent.js +29 -33
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/node/TreeView/TreeView.js +8 -8
- package/node/index.js +1 -1
- package/node/internals/components/RichTreeViewItems.js +64 -0
- package/node/internals/corePlugins/corePlugins.js +1 -1
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/node/internals/index.js +7 -0
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/node/useTreeItem2/useTreeItem2.js +11 -11
- package/package.json +4 -4
- package/useTreeItem2/index.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +11 -11
- package/useTreeItem2/useTreeItem2.types.d.ts +2 -2
|
@@ -81,35 +81,31 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
|
|
|
81
81
|
}
|
|
82
82
|
toggleItemEditing();
|
|
83
83
|
};
|
|
84
|
-
return (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
children: label
|
|
110
|
-
})), dragAndDropOverlayProps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2DragAndDropOverlay.TreeItem2DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
|
|
111
|
-
}))
|
|
112
|
-
);
|
|
84
|
+
return /*#__PURE__*/ /* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions -- Key event is handled by the TreeView */(0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({}, other, {
|
|
85
|
+
className: (0, _clsx.default)(classes.root, className, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
|
|
86
|
+
onClick: handleClick,
|
|
87
|
+
onMouseDown: handleMouseDown,
|
|
88
|
+
ref: ref,
|
|
89
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
90
|
+
className: classes.iconContainer,
|
|
91
|
+
children: icon
|
|
92
|
+
}), checkboxSelection && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
|
|
93
|
+
className: classes.checkbox,
|
|
94
|
+
checked: selected,
|
|
95
|
+
onChange: handleCheckboxSelection,
|
|
96
|
+
disabled: disabled || disableSelection,
|
|
97
|
+
ref: checkboxRef,
|
|
98
|
+
tabIndex: -1
|
|
99
|
+
}), editing ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2LabelInput.TreeItem2LabelInput, (0, _extends2.default)({}, labelInputProps, {
|
|
100
|
+
className: classes.labelInput
|
|
101
|
+
})) : /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
|
|
102
|
+
className: classes.label
|
|
103
|
+
}, editable && {
|
|
104
|
+
onDoubleClick: handleLabelDoubleClick
|
|
105
|
+
}, {
|
|
106
|
+
children: label
|
|
107
|
+
})), dragAndDropOverlayProps && /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2DragAndDropOverlay.TreeItem2DragAndDropOverlay, (0, _extends2.default)({}, dragAndDropOverlayProps))]
|
|
108
|
+
}));
|
|
113
109
|
});
|
|
114
110
|
process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
115
111
|
// ----------------------------- Warning --------------------------------
|
|
@@ -122,7 +118,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
122
118
|
classes: _propTypes.default.object.isRequired,
|
|
123
119
|
className: _propTypes.default.string,
|
|
124
120
|
/**
|
|
125
|
-
* The icon to display next to the
|
|
121
|
+
* The icon to display next to the Tree Item's label. Either a parent or end icon.
|
|
126
122
|
*/
|
|
127
123
|
displayIcon: _propTypes.default.node,
|
|
128
124
|
dragAndDropOverlayProps: _propTypes.default.shape({
|
|
@@ -130,11 +126,11 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
130
126
|
style: _propTypes.default.object
|
|
131
127
|
}),
|
|
132
128
|
/**
|
|
133
|
-
* The icon to display next to the
|
|
129
|
+
* The icon to display next to the Tree Item's label. Either an expansion or collapse icon.
|
|
134
130
|
*/
|
|
135
131
|
expansionIcon: _propTypes.default.node,
|
|
136
132
|
/**
|
|
137
|
-
* The icon to display next to the
|
|
133
|
+
* The icon to display next to the Tree Item's label.
|
|
138
134
|
*/
|
|
139
135
|
icon: _propTypes.default.node,
|
|
140
136
|
/**
|
|
@@ -142,7 +138,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
142
138
|
*/
|
|
143
139
|
itemId: _propTypes.default.string.isRequired,
|
|
144
140
|
/**
|
|
145
|
-
* The
|
|
141
|
+
* The Tree Item label.
|
|
146
142
|
*/
|
|
147
143
|
label: _propTypes.default.node,
|
|
148
144
|
labelInputProps: _propTypes.default.shape({
|
|
@@ -34,7 +34,7 @@ const TreeItem2DragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
|
|
|
34
34
|
style: {
|
|
35
35
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
36
36
|
borderRadius: theme.shape.borderRadius,
|
|
37
|
-
backgroundColor: (0, _styles.alpha)(
|
|
37
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.dark} / ${0.15})` : (0, _styles.alpha)(theme.palette.primary.dark, 0.15)
|
|
38
38
|
}
|
|
39
39
|
}, {
|
|
40
40
|
props: {
|
|
@@ -42,9 +42,9 @@ const TreeItem2DragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
|
|
|
42
42
|
},
|
|
43
43
|
style: (0, _extends2.default)({
|
|
44
44
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
45
|
-
borderTop: `1px solid ${(0, _styles.alpha)(
|
|
45
|
+
borderTop: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${(0, _styles.alpha)(theme.palette.grey[900], 0.6)}`
|
|
46
46
|
}, theme.applyStyles('dark', {
|
|
47
|
-
borderTopColor: (0, _styles.alpha)(
|
|
47
|
+
borderTopColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : (0, _styles.alpha)(theme.palette.grey[100], 0.6)
|
|
48
48
|
}))
|
|
49
49
|
}, {
|
|
50
50
|
props: {
|
|
@@ -52,9 +52,9 @@ const TreeItem2DragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
|
|
|
52
52
|
},
|
|
53
53
|
style: (0, _extends2.default)({
|
|
54
54
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
55
|
-
borderBottom: `1px solid ${(0, _styles.alpha)(
|
|
55
|
+
borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${(0, _styles.alpha)(theme.palette.grey[900], 0.6)}`
|
|
56
56
|
}, theme.applyStyles('dark', {
|
|
57
|
-
borderBottomColor: (0, _styles.alpha)(
|
|
57
|
+
borderBottomColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : (0, _styles.alpha)(theme.palette.grey[100], 0.6)
|
|
58
58
|
}))
|
|
59
59
|
}, {
|
|
60
60
|
props: {
|
|
@@ -62,9 +62,9 @@ const TreeItem2DragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
|
|
|
62
62
|
},
|
|
63
63
|
style: (0, _extends2.default)({
|
|
64
64
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * calc(var(--TreeView-itemDepth) - 1))',
|
|
65
|
-
borderBottom: `1px solid ${(0, _styles.alpha)(
|
|
65
|
+
borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${(0, _styles.alpha)(theme.palette.grey[900], 0.6)}`
|
|
66
66
|
}, theme.applyStyles('dark', {
|
|
67
|
-
borderBottomColor: (0, _styles.alpha)(
|
|
67
|
+
borderBottomColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : (0, _styles.alpha)(theme.palette.grey[100], 0.6)
|
|
68
68
|
}))
|
|
69
69
|
}]
|
|
70
70
|
}));
|
|
@@ -39,7 +39,7 @@ const warn = () => {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
|
-
* This component has been deprecated in favor of the new
|
|
42
|
+
* This component has been deprecated in favor of the new Simple Tree View component.
|
|
43
43
|
* 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)
|
|
44
44
|
*
|
|
45
45
|
* Demos:
|
|
@@ -89,7 +89,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
89
89
|
})
|
|
90
90
|
}),
|
|
91
91
|
/**
|
|
92
|
-
* If `true`, the
|
|
92
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
93
93
|
* @default false
|
|
94
94
|
*/
|
|
95
95
|
checkboxSelection: _propTypes.default.bool,
|
|
@@ -159,39 +159,39 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
159
159
|
*/
|
|
160
160
|
multiSelect: _propTypes.default.bool,
|
|
161
161
|
/**
|
|
162
|
-
* Callback fired when
|
|
162
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
163
163
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
164
164
|
* @param {array} itemIds The ids of the expanded items.
|
|
165
165
|
*/
|
|
166
166
|
onExpandedItemsChange: _propTypes.default.func,
|
|
167
167
|
/**
|
|
168
|
-
* Callback fired when the `content` slot of a given
|
|
168
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
169
169
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
170
170
|
* @param {string} itemId The id of the focused item.
|
|
171
171
|
*/
|
|
172
172
|
onItemClick: _propTypes.default.func,
|
|
173
173
|
/**
|
|
174
|
-
* Callback fired when a
|
|
174
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
175
175
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
176
176
|
* @param {array} itemId The itemId of the modified item.
|
|
177
177
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
178
178
|
*/
|
|
179
179
|
onItemExpansionToggle: _propTypes.default.func,
|
|
180
180
|
/**
|
|
181
|
-
* Callback fired when a given
|
|
181
|
+
* Callback fired when a given Tree Item is focused.
|
|
182
182
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
183
183
|
* @param {string} itemId The id of the focused item.
|
|
184
184
|
*/
|
|
185
185
|
onItemFocus: _propTypes.default.func,
|
|
186
186
|
/**
|
|
187
|
-
* Callback fired when a
|
|
187
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
188
188
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
189
189
|
* @param {array} itemId The itemId of the modified item.
|
|
190
190
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
191
191
|
*/
|
|
192
192
|
onItemSelectionToggle: _propTypes.default.func,
|
|
193
193
|
/**
|
|
194
|
-
* Callback fired when
|
|
194
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
195
195
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
196
196
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
197
197
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
package/node/index.js
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.RichTreeViewItems = RichTreeViewItems;
|
|
9
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
11
|
+
var React = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _useSlotProps2 = _interopRequireDefault(require("@mui/utils/useSlotProps"));
|
|
13
|
+
var _TreeItem = require("../../TreeItem");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
const _excluded = ["ownerState"];
|
|
16
|
+
function WrappedTreeItem({
|
|
17
|
+
slots,
|
|
18
|
+
slotProps,
|
|
19
|
+
label,
|
|
20
|
+
id,
|
|
21
|
+
itemId,
|
|
22
|
+
itemsToRender
|
|
23
|
+
}) {
|
|
24
|
+
const Item = slots?.item ?? _TreeItem.TreeItem;
|
|
25
|
+
const _useSlotProps = (0, _useSlotProps2.default)({
|
|
26
|
+
elementType: Item,
|
|
27
|
+
externalSlotProps: slotProps?.item,
|
|
28
|
+
additionalProps: {
|
|
29
|
+
itemId,
|
|
30
|
+
id,
|
|
31
|
+
label
|
|
32
|
+
},
|
|
33
|
+
ownerState: {
|
|
34
|
+
itemId,
|
|
35
|
+
label
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
itemProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded);
|
|
39
|
+
const children = React.useMemo(() => itemsToRender ? /*#__PURE__*/(0, _jsxRuntime.jsx)(RichTreeViewItems, {
|
|
40
|
+
itemsToRender: itemsToRender,
|
|
41
|
+
slots: slots,
|
|
42
|
+
slotProps: slotProps
|
|
43
|
+
}) : null, [itemsToRender, slots, slotProps]);
|
|
44
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Item, (0, _extends2.default)({}, itemProps, {
|
|
45
|
+
children: children
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
function RichTreeViewItems(props) {
|
|
49
|
+
const {
|
|
50
|
+
itemsToRender,
|
|
51
|
+
slots,
|
|
52
|
+
slotProps
|
|
53
|
+
} = props;
|
|
54
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
|
|
55
|
+
children: itemsToRender.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedTreeItem, {
|
|
56
|
+
slots: slots,
|
|
57
|
+
slotProps: slotProps,
|
|
58
|
+
label: item.label,
|
|
59
|
+
id: item.id,
|
|
60
|
+
itemId: item.itemId,
|
|
61
|
+
itemsToRender: item.children
|
|
62
|
+
}, item.itemId))
|
|
63
|
+
});
|
|
64
|
+
}
|
|
@@ -9,6 +9,6 @@ var _useTreeViewOptionalPlugins = require("./useTreeViewOptionalPlugins");
|
|
|
9
9
|
var _useTreeViewId = require("./useTreeViewId");
|
|
10
10
|
/**
|
|
11
11
|
* Internal plugins that create the tools used by the other plugins.
|
|
12
|
-
* These plugins are used by the
|
|
12
|
+
* These plugins are used by the Tree View components.
|
|
13
13
|
*/
|
|
14
14
|
const TREE_VIEW_CORE_PLUGINS = exports.TREE_VIEW_CORE_PLUGINS = [_useTreeViewInstanceEvents.useTreeViewInstanceEvents, _useTreeViewOptionalPlugins.useTreeViewOptionalPlugins, _useTreeViewId.useTreeViewId];
|
|
@@ -14,10 +14,9 @@ const useTreeViewId = ({
|
|
|
14
14
|
state,
|
|
15
15
|
setState
|
|
16
16
|
}) => {
|
|
17
|
-
const treeId = state.id.treeId;
|
|
18
17
|
React.useEffect(() => {
|
|
19
18
|
setState(prevState => {
|
|
20
|
-
if (prevState.id.treeId === params.id) {
|
|
19
|
+
if (prevState.id.treeId === params.id && prevState.id.treeId !== undefined) {
|
|
21
20
|
return prevState;
|
|
22
21
|
}
|
|
23
22
|
return (0, _extends2.default)({}, prevState, {
|
|
@@ -27,6 +26,7 @@ const useTreeViewId = ({
|
|
|
27
26
|
});
|
|
28
27
|
});
|
|
29
28
|
}, [setState, params.id]);
|
|
29
|
+
const treeId = params.id ?? state.id.treeId;
|
|
30
30
|
return {
|
|
31
31
|
getRootProps: () => ({
|
|
32
32
|
id: treeId
|
|
@@ -44,6 +44,6 @@ useTreeViewId.getInitialState = ({
|
|
|
44
44
|
id
|
|
45
45
|
}) => ({
|
|
46
46
|
id: {
|
|
47
|
-
treeId: id ??
|
|
47
|
+
treeId: id ?? undefined
|
|
48
48
|
}
|
|
49
49
|
});
|
|
@@ -11,7 +11,7 @@ const createTreeViewDefaultId = () => {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a
|
|
14
|
+
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
|
|
15
15
|
* If the user explicitly defined an id attribute, it will be returned.
|
|
16
16
|
* Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
|
|
17
17
|
* @param {object} params The parameters to determine the id attribute of the item.
|
package/node/internals/index.js
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "RichTreeViewItems", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _RichTreeViewItems.RichTreeViewItems;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "TREE_VIEW_ROOT_PARENT_ID", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function () {
|
|
@@ -95,6 +101,7 @@ Object.defineProperty(exports, "useTreeViewSelection", {
|
|
|
95
101
|
});
|
|
96
102
|
var _useTreeView = require("./useTreeView");
|
|
97
103
|
var _TreeViewProvider = require("./TreeViewProvider");
|
|
104
|
+
var _RichTreeViewItems = require("./components/RichTreeViewItems");
|
|
98
105
|
var _useInstanceEventHandler = require("./hooks/useInstanceEventHandler");
|
|
99
106
|
var _useTreeViewExpansion = require("./plugins/useTreeViewExpansion");
|
|
100
107
|
var _useTreeViewSelection = require("./plugins/useTreeViewSelection");
|
|
@@ -33,7 +33,7 @@ const useTreeViewJSXItems = ({
|
|
|
33
33
|
itemMetaMap: (0, _extends2.default)({}, prevState.items.itemMetaMap, {
|
|
34
34
|
[item.id]: item
|
|
35
35
|
}),
|
|
36
|
-
// For
|
|
36
|
+
// For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
|
|
37
37
|
itemMap: (0, _extends2.default)({}, prevState.items.itemMap, {
|
|
38
38
|
[item.id]: {
|
|
39
39
|
id: item.id,
|
package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -12,7 +12,7 @@ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallb
|
|
|
12
12
|
var _tree = require("../../utils/tree");
|
|
13
13
|
var _plugins = require("../../utils/plugins");
|
|
14
14
|
var _useTreeViewLabel = require("../useTreeViewLabel");
|
|
15
|
-
function
|
|
15
|
+
function isPrintableKey(string) {
|
|
16
16
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
17
17
|
}
|
|
18
18
|
const useTreeViewKeyboardNavigation = ({
|
|
@@ -235,7 +235,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
235
235
|
|
|
236
236
|
// Multi select behavior when pressing Ctrl + a
|
|
237
237
|
// Selects all the items
|
|
238
|
-
case
|
|
238
|
+
case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && params.multiSelect && !params.disableSelection:
|
|
239
239
|
{
|
|
240
240
|
instance.selectAllNavigableItems(event);
|
|
241
241
|
event.preventDefault();
|
|
@@ -244,7 +244,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
244
244
|
|
|
245
245
|
// Type-ahead
|
|
246
246
|
// TODO: Support typing multiple characters
|
|
247
|
-
case !ctrlPressed && !event.shiftKey &&
|
|
247
|
+
case !ctrlPressed && !event.shiftKey && isPrintableKey(key):
|
|
248
248
|
{
|
|
249
249
|
const matchingItem = getFirstMatchingItem(itemId, key);
|
|
250
250
|
if (matchingItem != null) {
|
|
@@ -82,7 +82,7 @@ useTreeViewLabel.getDefaultizedParams = ({
|
|
|
82
82
|
const canUseFeature = experimentalFeatures?.labelEditing;
|
|
83
83
|
if (process.env.NODE_ENV !== 'production') {
|
|
84
84
|
if (params.isItemEditable && !canUseFeature) {
|
|
85
|
-
(0, _warning.warnOnce)(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the
|
|
85
|
+
(0, _warning.warnOnce)(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/editing/']);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
return (0, _extends2.default)({}, params, {
|
|
@@ -24,7 +24,6 @@ const useTreeItem2 = parameters => {
|
|
|
24
24
|
indentationAtItemLevel
|
|
25
25
|
},
|
|
26
26
|
selection: {
|
|
27
|
-
multiSelect,
|
|
28
27
|
disableSelection,
|
|
29
28
|
checkboxSelection
|
|
30
29
|
},
|
|
@@ -92,7 +91,7 @@ const useTreeItem2 = parameters => {
|
|
|
92
91
|
// the input that triggers the root blur can be either the relatedTarget (when entering editing state) or the target (when exiting editing state)
|
|
93
92
|
// when we enter the editing state, we focus the input -> we don't want to remove the focused item from the state
|
|
94
93
|
if (status.editing ||
|
|
95
|
-
// we can exit the editing state by clicking outside the input (within the
|
|
94
|
+
// we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
|
|
96
95
|
// we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
|
|
97
96
|
event.relatedTarget && (0, _tree.isTargetInDescendants)(event.relatedTarget, rootElement) && (event.target && event.target?.dataset?.element === 'labelInput' && (0, _tree.isTargetInDescendants)(event.target, rootElement) || event.relatedTarget?.dataset?.element === 'labelInput')) {
|
|
98
97
|
return;
|
|
@@ -158,17 +157,18 @@ const useTreeItem2 = parameters => {
|
|
|
158
157
|
};
|
|
159
158
|
const getRootProps = (externalProps = {}) => {
|
|
160
159
|
const externalEventHandlers = (0, _extends2.default)({}, (0, _extractEventHandlers.default)(parameters), (0, _extractEventHandlers.default)(externalProps));
|
|
160
|
+
|
|
161
|
+
// https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
161
162
|
let ariaSelected;
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
} else if (status.selected) {
|
|
165
|
-
/* single-selection trees unset aria-selected on un-selected items.
|
|
166
|
-
*
|
|
167
|
-
* If the tree does not support multiple selection, aria-selected
|
|
168
|
-
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
169
|
-
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
170
|
-
*/
|
|
163
|
+
if (status.selected) {
|
|
164
|
+
// - each selected node has aria-selected set to true.
|
|
171
165
|
ariaSelected = true;
|
|
166
|
+
} else if (disableSelection || status.disabled) {
|
|
167
|
+
// - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
|
|
168
|
+
ariaSelected = undefined;
|
|
169
|
+
} else {
|
|
170
|
+
// - all nodes that are selectable but not selected have aria-selected set to false.
|
|
171
|
+
ariaSelected = false;
|
|
172
172
|
}
|
|
173
173
|
const props = (0, _extends2.default)({}, externalEventHandlers, {
|
|
174
174
|
ref: handleRootRef,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.21.0",
|
|
4
4
|
"description": "The community edition of the Tree View components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"directory": "packages/x-tree-view"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@babel/runtime": "^7.25.
|
|
37
|
-
"@mui/utils": "^5.16.6",
|
|
36
|
+
"@babel/runtime": "^7.25.7",
|
|
37
|
+
"@mui/utils": "^5.16.6 || ^6.0.0",
|
|
38
38
|
"@types/react-transition-group": "^4.4.11",
|
|
39
39
|
"clsx": "^2.1.1",
|
|
40
40
|
"prop-types": "^15.8.1",
|
|
41
41
|
"react-transition-group": "^4.4.5",
|
|
42
|
-
"@mui/x-internals": "7.
|
|
42
|
+
"@mui/x-internals": "7.21.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@emotion/react": "^11.9.0",
|
package/useTreeItem2/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const useTreeItem2: <TSignatures extends import("./useTreeItem2.types").UseTreeItem2MinimalPlugins = import("./useTreeItem2.types").UseTreeItem2MinimalPlugins, TOptionalSignatures extends import("./useTreeItem2.types").UseTreeItem2OptionalPlugins = readonly []>(parameters: import("@mui/x-tree-view/useTreeItem2").UseTreeItem2Parameters) => import("@mui/x-tree-view/useTreeItem2").UseTreeItem2ReturnValue<TSignatures, TOptionalSignatures>;
|
|
2
2
|
export declare const unstable_useTreeItem2: <TSignatures extends import("./useTreeItem2.types").UseTreeItem2MinimalPlugins = import("./useTreeItem2.types").UseTreeItem2MinimalPlugins, TOptionalSignatures extends import("./useTreeItem2.types").UseTreeItem2OptionalPlugins = readonly []>(parameters: import("@mui/x-tree-view/useTreeItem2").UseTreeItem2Parameters) => import("@mui/x-tree-view/useTreeItem2").UseTreeItem2ReturnValue<TSignatures, TOptionalSignatures>;
|
|
3
|
-
export type { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2Status, UseTreeItem2RootSlotOwnProps, UseTreeItem2ContentSlotOwnProps, UseTreeItem2LabelInputSlotOwnProps, UseTreeItem2LabelSlotOwnProps, UseTreeItem2IconContainerSlotOwnProps, UseTreeItem2GroupTransitionSlotOwnProps, UseTreeItem2DragAndDropOverlaySlotOwnProps, } from './useTreeItem2.types';
|
|
3
|
+
export type { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2Status, UseTreeItem2RootSlotOwnProps, UseTreeItem2ContentSlotOwnProps, UseTreeItem2LabelInputSlotOwnProps, UseTreeItem2LabelSlotOwnProps, UseTreeItem2CheckboxSlotOwnProps, UseTreeItem2IconContainerSlotOwnProps, UseTreeItem2GroupTransitionSlotOwnProps, UseTreeItem2DragAndDropOverlaySlotOwnProps, } from './useTreeItem2.types';
|
|
@@ -16,7 +16,6 @@ export const useTreeItem2 = parameters => {
|
|
|
16
16
|
indentationAtItemLevel
|
|
17
17
|
},
|
|
18
18
|
selection: {
|
|
19
|
-
multiSelect,
|
|
20
19
|
disableSelection,
|
|
21
20
|
checkboxSelection
|
|
22
21
|
},
|
|
@@ -84,7 +83,7 @@ export const useTreeItem2 = parameters => {
|
|
|
84
83
|
// the input that triggers the root blur can be either the relatedTarget (when entering editing state) or the target (when exiting editing state)
|
|
85
84
|
// when we enter the editing state, we focus the input -> we don't want to remove the focused item from the state
|
|
86
85
|
if (status.editing ||
|
|
87
|
-
// we can exit the editing state by clicking outside the input (within the
|
|
86
|
+
// we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
|
|
88
87
|
// we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
|
|
89
88
|
event.relatedTarget && isTargetInDescendants(event.relatedTarget, rootElement) && (event.target && event.target?.dataset?.element === 'labelInput' && isTargetInDescendants(event.target, rootElement) || event.relatedTarget?.dataset?.element === 'labelInput')) {
|
|
90
89
|
return;
|
|
@@ -150,17 +149,18 @@ export const useTreeItem2 = parameters => {
|
|
|
150
149
|
};
|
|
151
150
|
const getRootProps = (externalProps = {}) => {
|
|
152
151
|
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
152
|
+
|
|
153
|
+
// https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
153
154
|
let ariaSelected;
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
} else if (status.selected) {
|
|
157
|
-
/* single-selection trees unset aria-selected on un-selected items.
|
|
158
|
-
*
|
|
159
|
-
* If the tree does not support multiple selection, aria-selected
|
|
160
|
-
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
161
|
-
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
162
|
-
*/
|
|
155
|
+
if (status.selected) {
|
|
156
|
+
// - each selected node has aria-selected set to true.
|
|
163
157
|
ariaSelected = true;
|
|
158
|
+
} else if (disableSelection || status.disabled) {
|
|
159
|
+
// - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
|
|
160
|
+
ariaSelected = undefined;
|
|
161
|
+
} else {
|
|
162
|
+
// - all nodes that are selectable but not selected have aria-selected set to false.
|
|
163
|
+
ariaSelected = false;
|
|
164
164
|
}
|
|
165
165
|
const props = _extends({}, externalEventHandlers, {
|
|
166
166
|
ref: handleRootRef,
|
|
@@ -83,7 +83,7 @@ export type UseTreeItem2LabelInputSlotProps<ExternalProps = {}> = ExternalProps
|
|
|
83
83
|
export interface UseTreeItem2CheckboxSlotOwnProps {
|
|
84
84
|
visible: boolean;
|
|
85
85
|
checked: boolean;
|
|
86
|
-
onChange: React.
|
|
86
|
+
onChange: MuiCancellableEventHandler<React.ChangeEvent<HTMLInputElement>>;
|
|
87
87
|
disabled: boolean;
|
|
88
88
|
ref: React.RefObject<HTMLButtonElement>;
|
|
89
89
|
tabIndex: -1;
|
|
@@ -158,7 +158,7 @@ export interface UseTreeItem2ReturnValue<TSignatures extends UseTreeItem2Minimal
|
|
|
158
158
|
getGroupTransitionProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItem2GroupTransitionSlotProps<ExternalProps>;
|
|
159
159
|
/**
|
|
160
160
|
* Resolver for the DragAndDropOverlay slot's props.
|
|
161
|
-
* Warning: This slot is only useful when using the
|
|
161
|
+
* Warning: This slot is only useful when using the `<RichTreeViewPro />` component.
|
|
162
162
|
* @param {ExternalProps} externalProps Additional props for the DragAndDropOverlay slot.
|
|
163
163
|
* @returns {UseTreeItem2DragAndDropOverlaySlotProps<ExternalProps>} Props that should be spread on the DragAndDropOverlay slot.
|
|
164
164
|
*/
|