@mui/x-tree-view 7.0.0-beta.5 → 7.0.0-beta.6
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 +135 -49
- package/RichTreeView/RichTreeView.js +2 -1
- package/SimpleTreeView/SimpleTreeView.js +2 -1
- package/TreeItem/TreeItem.js +24 -28
- package/TreeItem/TreeItem.types.d.ts +7 -11
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeView/TreeView.js +2 -1
- package/hooks/useTreeViewApiRef.d.ts +2 -2
- package/index.js +1 -1
- package/internals/models/helpers.d.ts +1 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -2
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +29 -16
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
- package/modern/RichTreeView/RichTreeView.js +2 -1
- package/modern/SimpleTreeView/SimpleTreeView.js +2 -1
- package/modern/TreeItem/TreeItem.js +23 -27
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeView/TreeView.js +2 -1
- package/modern/index.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +29 -16
- package/node/RichTreeView/RichTreeView.js +2 -1
- package/node/SimpleTreeView/SimpleTreeView.js +2 -1
- package/node/TreeItem/TreeItem.js +23 -27
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeView/TreeView.js +2 -1
- package/node/index.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +28 -15
- package/package.json +2 -2
|
@@ -21,7 +21,7 @@ var _treeItemClasses = require("./treeItemClasses");
|
|
|
21
21
|
var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
|
|
22
22
|
var _icons = require("../icons");
|
|
23
23
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
24
|
-
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown"
|
|
24
|
+
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown"],
|
|
25
25
|
_excluded2 = ["ownerState"],
|
|
26
26
|
_excluded3 = ["ownerState"],
|
|
27
27
|
_excluded4 = ["ownerState"];
|
|
@@ -40,7 +40,7 @@ const useUtilityClasses = ownerState => {
|
|
|
40
40
|
disabled: ['disabled'],
|
|
41
41
|
iconContainer: ['iconContainer'],
|
|
42
42
|
label: ['label'],
|
|
43
|
-
|
|
43
|
+
groupTransition: ['groupTransition']
|
|
44
44
|
};
|
|
45
45
|
return (0, _base.unstable_composeClasses)(slots, _treeItemClasses.getTreeItemUtilityClass, classes);
|
|
46
46
|
};
|
|
@@ -124,8 +124,8 @@ const StyledTreeItemContent = (0, _styles.styled)(_TreeItemContent.TreeItemConte
|
|
|
124
124
|
}));
|
|
125
125
|
const TreeItemGroup = (0, _styles.styled)(_Collapse.default, {
|
|
126
126
|
name: 'MuiTreeItem',
|
|
127
|
-
slot: '
|
|
128
|
-
overridesResolver: (props, styles) => styles.
|
|
127
|
+
slot: 'GroupTransition',
|
|
128
|
+
overridesResolver: (props, styles) => styles.groupTransition
|
|
129
129
|
})({
|
|
130
130
|
margin: 0,
|
|
131
131
|
padding: 0,
|
|
@@ -175,16 +175,15 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
175
175
|
id,
|
|
176
176
|
label,
|
|
177
177
|
onClick,
|
|
178
|
-
onMouseDown
|
|
179
|
-
TransitionComponent = _Collapse.default,
|
|
180
|
-
TransitionProps
|
|
178
|
+
onMouseDown
|
|
181
179
|
} = props,
|
|
182
180
|
other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
|
|
183
181
|
const slots = {
|
|
184
182
|
expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? _icons.TreeViewExpandIcon,
|
|
185
183
|
collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? _icons.TreeViewCollapseIcon,
|
|
186
184
|
endIcon: inSlots?.endIcon ?? contextIcons.slots.endIcon,
|
|
187
|
-
icon: inSlots?.icon
|
|
185
|
+
icon: inSlots?.icon,
|
|
186
|
+
groupTransition: inSlots?.groupTransition
|
|
188
187
|
};
|
|
189
188
|
const isExpandable = reactChildren => {
|
|
190
189
|
if (Array.isArray(reactChildren)) {
|
|
@@ -204,6 +203,19 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
204
203
|
disabled
|
|
205
204
|
});
|
|
206
205
|
const classes = useUtilityClasses(ownerState);
|
|
206
|
+
const GroupTransition = slots.groupTransition ?? undefined;
|
|
207
|
+
const groupTransitionProps = (0, _utils.useSlotProps)({
|
|
208
|
+
elementType: GroupTransition,
|
|
209
|
+
ownerState: {},
|
|
210
|
+
externalSlotProps: inSlotProps?.groupTransition,
|
|
211
|
+
additionalProps: {
|
|
212
|
+
unmountOnExit: true,
|
|
213
|
+
in: expanded,
|
|
214
|
+
component: 'ul',
|
|
215
|
+
role: 'group'
|
|
216
|
+
},
|
|
217
|
+
className: classes.groupTransition
|
|
218
|
+
});
|
|
207
219
|
const ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
|
|
208
220
|
const _useSlotProps = (0, _utils.useSlotProps)({
|
|
209
221
|
elementType: ExpansionIcon,
|
|
@@ -293,13 +305,8 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
293
305
|
displayIcon: displayIcon,
|
|
294
306
|
ownerState: ownerState
|
|
295
307
|
}, ContentProps)), children && /*#__PURE__*/(0, _jsxRuntime.jsx)(TreeItemGroup, (0, _extends2.default)({
|
|
296
|
-
as:
|
|
297
|
-
|
|
298
|
-
className: classes.group,
|
|
299
|
-
in: expanded,
|
|
300
|
-
component: "ul",
|
|
301
|
-
role: "group"
|
|
302
|
-
}, TransitionProps, {
|
|
308
|
+
as: GroupTransition
|
|
309
|
+
}, groupTransitionProps, {
|
|
303
310
|
children: children
|
|
304
311
|
}))]
|
|
305
312
|
}));
|
|
@@ -359,16 +366,5 @@ TreeItem.propTypes = {
|
|
|
359
366
|
/**
|
|
360
367
|
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
361
368
|
*/
|
|
362
|
-
sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object])
|
|
363
|
-
/**
|
|
364
|
-
* The component used for the transition.
|
|
365
|
-
* [Follow this guide](/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
|
|
366
|
-
* @default Collapse
|
|
367
|
-
*/
|
|
368
|
-
TransitionComponent: _propTypes.default.elementType,
|
|
369
|
-
/**
|
|
370
|
-
* Props applied to the transition element.
|
|
371
|
-
* By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
|
|
372
|
-
*/
|
|
373
|
-
TransitionProps: _propTypes.default.object
|
|
369
|
+
sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object])
|
|
374
370
|
};
|
|
@@ -11,4 +11,4 @@ var _generateUtilityClasses = _interopRequireDefault(require("@mui/utils/generat
|
|
|
11
11
|
function getTreeItemUtilityClass(slot) {
|
|
12
12
|
return (0, _generateUtilityClass.default)('MuiTreeItem', slot);
|
|
13
13
|
}
|
|
14
|
-
const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', '
|
|
14
|
+
const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label']);
|
|
@@ -78,7 +78,8 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
78
78
|
*/
|
|
79
79
|
apiRef: _propTypes.default.shape({
|
|
80
80
|
current: _propTypes.default.shape({
|
|
81
|
-
focusNode: _propTypes.default.func.isRequired
|
|
81
|
+
focusNode: _propTypes.default.func.isRequired,
|
|
82
|
+
getItem: _propTypes.default.func.isRequired
|
|
82
83
|
})
|
|
83
84
|
}),
|
|
84
85
|
/**
|
package/node/index.js
CHANGED
|
@@ -22,22 +22,36 @@ const useTreeViewJSXNodes = ({
|
|
|
22
22
|
}) => {
|
|
23
23
|
const insertJSXNode = (0, _useEventCallback.default)(node => {
|
|
24
24
|
setState(prevState => {
|
|
25
|
-
if (prevState.nodeMap[node.id] != null) {
|
|
25
|
+
if (prevState.nodes.nodeMap[node.id] != null) {
|
|
26
26
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${node.id}"`].join('\n'));
|
|
27
27
|
}
|
|
28
28
|
return (0, _extends2.default)({}, prevState, {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
nodes: (0, _extends2.default)({}, prevState.nodes, {
|
|
30
|
+
nodeMap: (0, _extends2.default)({}, prevState.nodes.nodeMap, {
|
|
31
|
+
[node.id]: node
|
|
32
|
+
}),
|
|
33
|
+
// For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
|
|
34
|
+
itemMap: (0, _extends2.default)({}, prevState.nodes.itemMap, {
|
|
35
|
+
[node.id]: {
|
|
36
|
+
id: node.id,
|
|
37
|
+
label: node.label
|
|
38
|
+
}
|
|
39
|
+
})
|
|
31
40
|
})
|
|
32
41
|
});
|
|
33
42
|
});
|
|
34
43
|
});
|
|
35
44
|
const removeJSXNode = (0, _useEventCallback.default)(nodeId => {
|
|
36
45
|
setState(prevState => {
|
|
37
|
-
const
|
|
38
|
-
|
|
46
|
+
const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
|
|
47
|
+
const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
|
|
48
|
+
delete newNodeMap[nodeId];
|
|
49
|
+
delete newItemMap[nodeId];
|
|
39
50
|
return (0, _extends2.default)({}, prevState, {
|
|
40
|
-
|
|
51
|
+
nodes: (0, _extends2.default)({}, prevState.nodes, {
|
|
52
|
+
nodeMap: newNodeMap,
|
|
53
|
+
itemMap: newItemMap
|
|
54
|
+
})
|
|
41
55
|
});
|
|
42
56
|
});
|
|
43
57
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
|
|
@@ -12,13 +12,14 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
|
|
|
12
12
|
var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
|
|
13
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
-
const
|
|
15
|
+
const updateNodesState = ({
|
|
16
16
|
items,
|
|
17
17
|
isItemDisabled,
|
|
18
18
|
getItemLabel,
|
|
19
19
|
getItemId
|
|
20
20
|
}) => {
|
|
21
21
|
const nodeMap = {};
|
|
22
|
+
const itemMap = {};
|
|
22
23
|
const processItem = (item, index, parentId) => {
|
|
23
24
|
const id = getItemId ? getItemId(item) : item.id;
|
|
24
25
|
if (id == null) {
|
|
@@ -36,10 +37,11 @@ const updateState = ({
|
|
|
36
37
|
label,
|
|
37
38
|
index,
|
|
38
39
|
parentId,
|
|
39
|
-
idAttribute:
|
|
40
|
+
idAttribute: undefined,
|
|
40
41
|
expandable: !!item.children?.length,
|
|
41
42
|
disabled: isItemDisabled ? isItemDisabled(item) : false
|
|
42
43
|
};
|
|
44
|
+
itemMap[id] = item;
|
|
43
45
|
return {
|
|
44
46
|
id,
|
|
45
47
|
children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
|
|
@@ -48,16 +50,19 @@ const updateState = ({
|
|
|
48
50
|
const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
|
|
49
51
|
return {
|
|
50
52
|
nodeMap,
|
|
51
|
-
nodeTree
|
|
53
|
+
nodeTree,
|
|
54
|
+
itemMap
|
|
52
55
|
};
|
|
53
56
|
};
|
|
54
57
|
const useTreeViewNodes = ({
|
|
55
58
|
instance,
|
|
59
|
+
publicAPI,
|
|
56
60
|
params,
|
|
57
61
|
state,
|
|
58
62
|
setState
|
|
59
63
|
}) => {
|
|
60
|
-
const getNode = React.useCallback(nodeId => state.nodeMap[nodeId], [state.nodeMap]);
|
|
64
|
+
const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
|
|
65
|
+
const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
|
|
61
66
|
const isNodeDisabled = React.useCallback(nodeId => {
|
|
62
67
|
if (nodeId == null) {
|
|
63
68
|
return false;
|
|
@@ -79,7 +84,7 @@ const useTreeViewNodes = ({
|
|
|
79
84
|
}
|
|
80
85
|
return false;
|
|
81
86
|
}, [instance]);
|
|
82
|
-
const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
|
|
87
|
+
const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodes.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
|
|
83
88
|
const getNavigableChildrenIds = nodeId => {
|
|
84
89
|
let childrenIds = instance.getChildrenIds(nodeId);
|
|
85
90
|
if (!params.disabledItemsFocusable) {
|
|
@@ -89,20 +94,22 @@ const useTreeViewNodes = ({
|
|
|
89
94
|
};
|
|
90
95
|
React.useEffect(() => {
|
|
91
96
|
setState(prevState => {
|
|
92
|
-
const newState =
|
|
97
|
+
const newState = updateNodesState({
|
|
93
98
|
items: params.items,
|
|
94
99
|
isItemDisabled: params.isItemDisabled,
|
|
95
100
|
getItemId: params.getItemId,
|
|
96
101
|
getItemLabel: params.getItemLabel
|
|
97
102
|
});
|
|
98
|
-
Object.values(prevState.nodeMap).forEach(node => {
|
|
103
|
+
Object.values(prevState.nodes.nodeMap).forEach(node => {
|
|
99
104
|
if (!newState.nodeMap[node.id]) {
|
|
100
105
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
|
|
101
106
|
id: node.id
|
|
102
107
|
});
|
|
103
108
|
}
|
|
104
109
|
});
|
|
105
|
-
return (0, _extends2.default)({}, prevState,
|
|
110
|
+
return (0, _extends2.default)({}, prevState, {
|
|
111
|
+
nodes: newState
|
|
112
|
+
});
|
|
106
113
|
});
|
|
107
114
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
108
115
|
const getNodesToRender = (0, _useEventCallback.default)(() => {
|
|
@@ -110,7 +117,7 @@ const useTreeViewNodes = ({
|
|
|
110
117
|
id,
|
|
111
118
|
children
|
|
112
119
|
}) => {
|
|
113
|
-
const node = state.nodeMap[id];
|
|
120
|
+
const node = state.nodes.nodeMap[id];
|
|
114
121
|
return {
|
|
115
122
|
label: node.label,
|
|
116
123
|
nodeId: node.id,
|
|
@@ -118,15 +125,19 @@ const useTreeViewNodes = ({
|
|
|
118
125
|
children: children?.map(getPropsFromNodeId)
|
|
119
126
|
};
|
|
120
127
|
};
|
|
121
|
-
return state.nodeTree.map(getPropsFromNodeId);
|
|
128
|
+
return state.nodes.nodeTree.map(getPropsFromNodeId);
|
|
122
129
|
});
|
|
123
130
|
(0, _useTreeView.populateInstance)(instance, {
|
|
124
131
|
getNode,
|
|
132
|
+
getItem,
|
|
125
133
|
getNodesToRender,
|
|
126
134
|
getChildrenIds,
|
|
127
135
|
getNavigableChildrenIds,
|
|
128
136
|
isNodeDisabled
|
|
129
137
|
});
|
|
138
|
+
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
139
|
+
getItem
|
|
140
|
+
});
|
|
130
141
|
return {
|
|
131
142
|
contextValue: {
|
|
132
143
|
disabledItemsFocusable: params.disabledItemsFocusable
|
|
@@ -134,11 +145,13 @@ const useTreeViewNodes = ({
|
|
|
134
145
|
};
|
|
135
146
|
};
|
|
136
147
|
exports.useTreeViewNodes = useTreeViewNodes;
|
|
137
|
-
useTreeViewNodes.getInitialState = params =>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
148
|
+
useTreeViewNodes.getInitialState = params => ({
|
|
149
|
+
nodes: updateNodesState({
|
|
150
|
+
items: params.items,
|
|
151
|
+
isItemDisabled: params.isItemDisabled,
|
|
152
|
+
getItemId: params.getItemId,
|
|
153
|
+
getItemLabel: params.getItemLabel
|
|
154
|
+
})
|
|
142
155
|
});
|
|
143
156
|
useTreeViewNodes.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
144
157
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "7.0.0-beta.
|
|
3
|
+
"version": "7.0.0-beta.6",
|
|
4
4
|
"description": "The community edition of the tree view components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"directory": "packages/x-tree-view"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@babel/runtime": "^7.
|
|
35
|
+
"@babel/runtime": "^7.24.0",
|
|
36
36
|
"@mui/base": "^5.0.0-beta.36",
|
|
37
37
|
"@mui/system": "^5.15.9",
|
|
38
38
|
"@mui/utils": "^5.15.9",
|