@mui/x-tree-view 7.0.0-alpha.7 → 7.0.0-alpha.8
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 +175 -49
- package/RichTreeView/RichTreeView.js +18 -57
- package/SimpleTreeView/SimpleTreeView.js +20 -53
- package/TreeView/TreeView.js +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/useTreeViewContext.js +1 -1
- package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
- package/internals/models/MuiCancellableEvent.d.ts +4 -0
- package/internals/models/MuiCancellableEvent.js +1 -0
- package/internals/models/plugin.d.ts +1 -0
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +8 -0
- package/internals/useTreeView/useTreeViewModels.js +2 -2
- package/internals/utils/extractPluginParamsFromProps.d.ts +13 -0
- package/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/legacy/RichTreeView/RichTreeView.js +17 -55
- package/legacy/SimpleTreeView/SimpleTreeView.js +15 -47
- package/legacy/TreeView/TreeView.js +1 -1
- package/legacy/index.js +1 -1
- package/legacy/internals/TreeViewProvider/useTreeViewContext.js +1 -1
- package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
- package/legacy/internals/models/MuiCancellableEvent.js +1 -0
- package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
- package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -0
- package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -0
- package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
- package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
- package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +157 -110
- package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +9 -2
- package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +8 -0
- package/legacy/internals/useTreeView/useTreeViewModels.js +2 -2
- package/legacy/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/modern/RichTreeView/RichTreeView.js +18 -57
- package/modern/SimpleTreeView/SimpleTreeView.js +20 -53
- package/modern/TreeView/TreeView.js +1 -1
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/useTreeViewContext.js +1 -1
- package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
- package/modern/internals/models/MuiCancellableEvent.js +1 -0
- package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -1
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -1
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -1
- package/modern/internals/useTreeView/useTreeViewModels.js +2 -2
- package/modern/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/node/RichTreeView/RichTreeView.js +18 -57
- package/node/SimpleTreeView/SimpleTreeView.js +20 -53
- package/node/TreeView/TreeView.js +1 -1
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/useTreeViewContext.js +1 -1
- package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
- package/node/internals/models/MuiCancellableEvent.js +5 -0
- package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +7 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -1
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -1
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +4 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -1
- package/node/internals/useTreeView/useTreeViewModels.js +2 -2
- package/node/internals/utils/extractPluginParamsFromProps.js +34 -0
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { useTheme } from '@mui/material/styles';
|
|
|
3
3
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
4
|
import { getFirstNode, getLastNode, getNextNode, getPreviousNode, populateInstance } from '../../useTreeView/useTreeView.utils';
|
|
5
5
|
function isPrintableCharacter(string) {
|
|
6
|
-
return string && string.length === 1 && string.match(/\S/);
|
|
6
|
+
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
7
7
|
}
|
|
8
8
|
function findNextFirstChar(firstChars, startIndex, char) {
|
|
9
9
|
for (let i = startIndex; i < firstChars.length; i += 1) {
|
|
@@ -19,7 +19,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
19
19
|
state
|
|
20
20
|
}) => {
|
|
21
21
|
const theme = useTheme();
|
|
22
|
-
const
|
|
22
|
+
const isRTL = theme.direction === 'rtl';
|
|
23
23
|
const firstCharMap = React.useRef({});
|
|
24
24
|
const hasFirstCharMapBeenUpdatedImperatively = React.useRef(false);
|
|
25
25
|
const updateFirstCharMap = useEventCallback(callback => {
|
|
@@ -44,32 +44,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
44
44
|
populateInstance(instance, {
|
|
45
45
|
updateFirstCharMap
|
|
46
46
|
});
|
|
47
|
-
const
|
|
48
|
-
if (state.focusedNodeId != null && instance.isNodeExpandable(state.focusedNodeId)) {
|
|
49
|
-
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
50
|
-
instance.focusNode(event, getNextNode(instance, state.focusedNodeId));
|
|
51
|
-
} else if (!instance.isNodeDisabled(state.focusedNodeId)) {
|
|
52
|
-
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return true;
|
|
56
|
-
};
|
|
57
|
-
const handlePreviousArrow = event => {
|
|
58
|
-
if (state.focusedNodeId == null) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
if (instance.isNodeExpanded(state.focusedNodeId) && !instance.isNodeDisabled(state.focusedNodeId)) {
|
|
62
|
-
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
66
|
-
if (parent) {
|
|
67
|
-
instance.focusNode(event, parent);
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
return false;
|
|
71
|
-
};
|
|
72
|
-
const focusByFirstCharacter = (event, nodeId, firstChar) => {
|
|
47
|
+
const getFirstMatchingNode = (nodeId, firstChar) => {
|
|
73
48
|
let start;
|
|
74
49
|
let index;
|
|
75
50
|
const lowercaseChar = firstChar.toLowerCase();
|
|
@@ -100,42 +75,36 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
100
75
|
index = findNextFirstChar(firstChars, 0, lowercaseChar);
|
|
101
76
|
}
|
|
102
77
|
|
|
103
|
-
// If match was found...
|
|
78
|
+
// If a match was found...
|
|
104
79
|
if (index > -1) {
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
const selectNextNode = (event, id) => {
|
|
109
|
-
if (!instance.isNodeDisabled(getNextNode(instance, id))) {
|
|
110
|
-
instance.selectRange(event, {
|
|
111
|
-
end: getNextNode(instance, id),
|
|
112
|
-
current: id
|
|
113
|
-
}, true);
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
const selectPreviousNode = (event, nodeId) => {
|
|
117
|
-
if (!instance.isNodeDisabled(getPreviousNode(instance, nodeId))) {
|
|
118
|
-
instance.selectRange(event, {
|
|
119
|
-
end: getPreviousNode(instance, nodeId),
|
|
120
|
-
current: nodeId
|
|
121
|
-
}, true);
|
|
80
|
+
return firstCharIds[index];
|
|
122
81
|
}
|
|
82
|
+
return null;
|
|
123
83
|
};
|
|
84
|
+
const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
|
|
85
|
+
const canToggleNodeExpansion = nodeId => !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
|
|
86
|
+
|
|
87
|
+
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
124
88
|
const createHandleKeyDown = otherHandlers => event => {
|
|
125
89
|
var _otherHandlers$onKeyD;
|
|
126
90
|
(_otherHandlers$onKeyD = otherHandlers.onKeyDown) == null || _otherHandlers$onKeyD.call(otherHandlers, event);
|
|
127
|
-
|
|
128
|
-
|
|
91
|
+
if (event.defaultMuiPrevented) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
129
94
|
|
|
130
95
|
// If the tree is empty there will be no focused node
|
|
131
96
|
if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
|
|
132
97
|
return;
|
|
133
98
|
}
|
|
134
99
|
const ctrlPressed = event.ctrlKey || event.metaKey;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
100
|
+
const key = event.key;
|
|
101
|
+
|
|
102
|
+
// eslint-disable-next-line default-case
|
|
103
|
+
switch (true) {
|
|
104
|
+
// Select the node when pressing "Space"
|
|
105
|
+
case key === ' ' && canToggleNodeSelection(state.focusedNodeId):
|
|
106
|
+
{
|
|
107
|
+
event.preventDefault();
|
|
139
108
|
if (params.multiSelect && event.shiftKey) {
|
|
140
109
|
instance.selectRange(event, {
|
|
141
110
|
end: state.focusedNodeId
|
|
@@ -145,85 +114,158 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
145
114
|
} else {
|
|
146
115
|
instance.selectNode(event, state.focusedNodeId);
|
|
147
116
|
}
|
|
117
|
+
break;
|
|
148
118
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
119
|
+
|
|
120
|
+
// If the focused node has children, we expand it.
|
|
121
|
+
// If the focused node has no children, we select it.
|
|
122
|
+
case key === 'Enter':
|
|
123
|
+
{
|
|
124
|
+
if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
154
125
|
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
155
|
-
|
|
156
|
-
} else if (
|
|
157
|
-
flag = true;
|
|
126
|
+
event.preventDefault();
|
|
127
|
+
} else if (canToggleNodeSelection(state.focusedNodeId)) {
|
|
158
128
|
if (params.multiSelect) {
|
|
129
|
+
event.preventDefault();
|
|
159
130
|
instance.selectNode(event, state.focusedNodeId, true);
|
|
160
|
-
} else {
|
|
131
|
+
} else if (!instance.isNodeSelected(state.focusedNodeId)) {
|
|
161
132
|
instance.selectNode(event, state.focusedNodeId);
|
|
133
|
+
event.preventDefault();
|
|
162
134
|
}
|
|
163
135
|
}
|
|
136
|
+
break;
|
|
164
137
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
case 'ArrowDown':
|
|
168
|
-
|
|
169
|
-
|
|
138
|
+
|
|
139
|
+
// Focus the next focusable node
|
|
140
|
+
case key === 'ArrowDown':
|
|
141
|
+
{
|
|
142
|
+
const nextNode = getNextNode(instance, state.focusedNodeId);
|
|
143
|
+
if (nextNode) {
|
|
144
|
+
event.preventDefault();
|
|
145
|
+
instance.focusNode(event, nextNode);
|
|
146
|
+
|
|
147
|
+
// Multi select behavior when pressing Shift + ArrowDown
|
|
148
|
+
// Toggles the selection state of the next node
|
|
149
|
+
if (params.multiSelect && event.shiftKey && canToggleNodeSelection(nextNode)) {
|
|
150
|
+
instance.selectRange(event, {
|
|
151
|
+
end: nextNode,
|
|
152
|
+
current: state.focusedNodeId
|
|
153
|
+
}, true);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
170
157
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
158
|
+
|
|
159
|
+
// Focuses the previous focusable node
|
|
160
|
+
case key === 'ArrowUp':
|
|
161
|
+
{
|
|
162
|
+
const previousNode = getPreviousNode(instance, state.focusedNodeId);
|
|
163
|
+
if (previousNode) {
|
|
164
|
+
event.preventDefault();
|
|
165
|
+
instance.focusNode(event, previousNode);
|
|
166
|
+
|
|
167
|
+
// Multi select behavior when pressing Shift + ArrowUp
|
|
168
|
+
// Toggles the selection state of the previous node
|
|
169
|
+
if (params.multiSelect && event.shiftKey && canToggleNodeSelection(previousNode)) {
|
|
170
|
+
instance.selectRange(event, {
|
|
171
|
+
end: previousNode,
|
|
172
|
+
current: state.focusedNodeId
|
|
173
|
+
}, true);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
177
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
case 'ArrowRight':
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
|
|
179
|
+
// If the focused node is expanded, we move the focus to its first child
|
|
180
|
+
// If the focused node is collapsed and has children, we expand it
|
|
181
|
+
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
182
|
+
{
|
|
183
|
+
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
184
|
+
instance.focusNode(event, getNextNode(instance, state.focusedNodeId));
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
} else if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
187
|
+
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
188
|
+
event.preventDefault();
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
186
191
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
192
|
+
|
|
193
|
+
// If the focused node is expanded, we collapse it
|
|
194
|
+
// If the focused node is collapsed and has a parent, we move the focus to this parent
|
|
195
|
+
case key === 'ArrowLeft' && !isRTL || key === 'ArrowRight' && isRTL:
|
|
196
|
+
{
|
|
197
|
+
if (canToggleNodeExpansion(state.focusedNodeId) && instance.isNodeExpanded(state.focusedNodeId)) {
|
|
198
|
+
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
199
|
+
event.preventDefault();
|
|
200
|
+
} else {
|
|
201
|
+
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
202
|
+
if (parent) {
|
|
203
|
+
instance.focusNode(event, parent);
|
|
204
|
+
event.preventDefault();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
193
208
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
209
|
+
|
|
210
|
+
// Focuses the first node in the tree
|
|
211
|
+
case key === 'Home':
|
|
212
|
+
{
|
|
213
|
+
instance.focusNode(event, getFirstNode(instance));
|
|
214
|
+
|
|
215
|
+
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
216
|
+
// Selects the focused node and all nodes up to the first node.
|
|
217
|
+
if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
|
|
218
|
+
instance.rangeSelectToFirst(event, state.focusedNodeId);
|
|
219
|
+
}
|
|
220
|
+
event.preventDefault();
|
|
221
|
+
break;
|
|
198
222
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
223
|
+
|
|
224
|
+
// Focuses the last node in the tree
|
|
225
|
+
case key === 'End':
|
|
226
|
+
{
|
|
227
|
+
instance.focusNode(event, getLastNode(instance));
|
|
228
|
+
|
|
229
|
+
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
230
|
+
// Selects the focused node and all the nodes down to the last node.
|
|
231
|
+
if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
|
|
232
|
+
instance.rangeSelectToLast(event, state.focusedNodeId);
|
|
233
|
+
}
|
|
234
|
+
event.preventDefault();
|
|
235
|
+
break;
|
|
205
236
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
if (key === '*') {
|
|
237
|
+
|
|
238
|
+
// Expand all siblings that are at the same level as the focused node
|
|
239
|
+
case key === '*':
|
|
240
|
+
{
|
|
211
241
|
instance.expandAllSiblings(event, state.focusedNodeId);
|
|
212
|
-
|
|
213
|
-
|
|
242
|
+
event.preventDefault();
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Multi select behavior when pressing Ctrl + a
|
|
247
|
+
// Selects all the nodes
|
|
248
|
+
case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
|
|
249
|
+
{
|
|
214
250
|
instance.selectRange(event, {
|
|
215
251
|
start: getFirstNode(instance),
|
|
216
252
|
end: getLastNode(instance)
|
|
217
253
|
});
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
254
|
+
event.preventDefault();
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Type-ahead
|
|
259
|
+
// TODO: Support typing multiple characters
|
|
260
|
+
case !ctrlPressed && !event.shiftKey && isPrintableCharacter(key):
|
|
261
|
+
{
|
|
262
|
+
const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
|
|
263
|
+
if (matchingNode != null) {
|
|
264
|
+
instance.focusNode(event, matchingNode);
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
}
|
|
267
|
+
break;
|
|
222
268
|
}
|
|
223
|
-
}
|
|
224
|
-
if (flag) {
|
|
225
|
-
event.preventDefault();
|
|
226
|
-
event.stopPropagation();
|
|
227
269
|
}
|
|
228
270
|
};
|
|
229
271
|
return {
|
|
@@ -231,4 +273,5 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
231
273
|
onKeyDown: createHandleKeyDown(otherHandlers)
|
|
232
274
|
})
|
|
233
275
|
};
|
|
234
|
-
};
|
|
276
|
+
};
|
|
277
|
+
useTreeViewKeyboardNavigation.params = {};
|
|
@@ -14,11 +14,11 @@ const updateState = ({
|
|
|
14
14
|
var _item$children, _item$children2;
|
|
15
15
|
const id = getItemId ? getItemId(item) : item.id;
|
|
16
16
|
if (id == null) {
|
|
17
|
-
throw new Error(['MUI: 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.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
17
|
+
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.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
18
18
|
}
|
|
19
19
|
const label = getItemLabel ? getItemLabel(item) : item.label;
|
|
20
20
|
if (label == null) {
|
|
21
|
-
throw new Error(['MUI: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
21
|
+
throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
22
22
|
}
|
|
23
23
|
nodeMap[id] = {
|
|
24
24
|
id,
|
|
@@ -122,4 +122,11 @@ useTreeViewNodes.getInitialState = params => updateState({
|
|
|
122
122
|
isItemDisabled: params.isItemDisabled,
|
|
123
123
|
getItemId: params.getItemId,
|
|
124
124
|
getItemLabel: params.getItemLabel
|
|
125
|
-
});
|
|
125
|
+
});
|
|
126
|
+
useTreeViewNodes.params = {
|
|
127
|
+
disabledItemsFocusable: true,
|
|
128
|
+
items: true,
|
|
129
|
+
isItemDisabled: true,
|
|
130
|
+
getItemLabel: true,
|
|
131
|
+
getItemId: true
|
|
132
|
+
};
|
|
@@ -182,4 +182,12 @@ useTreeViewSelection.getDefaultizedParams = params => {
|
|
|
182
182
|
multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
|
|
183
183
|
defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
|
|
184
184
|
});
|
|
185
|
+
};
|
|
186
|
+
useTreeViewSelection.params = {
|
|
187
|
+
disableSelection: true,
|
|
188
|
+
multiSelect: true,
|
|
189
|
+
defaultSelectedNodes: true,
|
|
190
|
+
selectedNodes: true,
|
|
191
|
+
onSelectedNodesChange: true,
|
|
192
|
+
onNodeSelectionToggle: true
|
|
185
193
|
};
|
|
@@ -44,7 +44,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
44
44
|
const defaultProp = props[model.defaultProp];
|
|
45
45
|
React.useEffect(() => {
|
|
46
46
|
if (model.isControlled !== (controlled !== undefined)) {
|
|
47
|
-
console.error([`MUI: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
|
|
47
|
+
console.error([`MUI X: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
|
|
48
48
|
}
|
|
49
49
|
}, [controlled]);
|
|
50
50
|
const {
|
|
@@ -52,7 +52,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
52
52
|
} = React.useRef(defaultProp);
|
|
53
53
|
React.useEffect(() => {
|
|
54
54
|
if (!model.isControlled && defaultValue !== defaultProp) {
|
|
55
|
-
console.error([`MUI: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
|
|
55
|
+
console.error([`MUI X: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
|
|
56
56
|
}
|
|
57
57
|
}, [JSON.stringify(defaultValue)]);
|
|
58
58
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewPlugin } from '../models';
|
|
3
|
+
export declare const extractPluginParamsFromProps: <TProps extends {}, TPlugins extends readonly TreeViewPlugin<any>[]>({ props, plugins, rootRef, }: {
|
|
4
|
+
props: TProps;
|
|
5
|
+
plugins: TPlugins;
|
|
6
|
+
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
7
|
+
}) => {
|
|
8
|
+
pluginParams: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params"> & {
|
|
9
|
+
plugins: TPlugins;
|
|
10
|
+
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
11
|
+
};
|
|
12
|
+
otherProps: Omit<TProps, keyof MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params">>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const extractPluginParamsFromProps = ({
|
|
2
|
+
props,
|
|
3
|
+
plugins,
|
|
4
|
+
rootRef
|
|
5
|
+
}) => {
|
|
6
|
+
const paramsLookup = {};
|
|
7
|
+
plugins.forEach(plugin => {
|
|
8
|
+
Object.assign(paramsLookup, plugin.params);
|
|
9
|
+
});
|
|
10
|
+
const pluginParams = {
|
|
11
|
+
plugins,
|
|
12
|
+
rootRef
|
|
13
|
+
};
|
|
14
|
+
const otherProps = {};
|
|
15
|
+
Object.keys(props).forEach(propName => {
|
|
16
|
+
const prop = props[propName];
|
|
17
|
+
if (paramsLookup[propName]) {
|
|
18
|
+
pluginParams[propName] = prop;
|
|
19
|
+
} else {
|
|
20
|
+
otherProps[propName] = prop;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
pluginParams,
|
|
25
|
+
otherProps
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
-
var _excluded = ["
|
|
3
|
+
var _excluded = ["slots", "slotProps"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { styled, useThemeProps } from '@mui/material/styles';
|
|
@@ -12,6 +12,7 @@ import { TreeViewProvider } from '../internals/TreeViewProvider';
|
|
|
12
12
|
import { DEFAULT_TREE_VIEW_PLUGINS } from '../internals/plugins';
|
|
13
13
|
import { TreeItem } from '../TreeItem';
|
|
14
14
|
import { buildWarning } from '../internals/utils/warning';
|
|
15
|
+
import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps';
|
|
15
16
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
17
|
var useUtilityClasses = function useUtilityClasses(ownerState) {
|
|
17
18
|
var classes = ownerState.classes;
|
|
@@ -58,7 +59,7 @@ function WrappedTreeItem(_ref) {
|
|
|
58
59
|
children: children
|
|
59
60
|
}));
|
|
60
61
|
}
|
|
61
|
-
var childrenWarning = buildWarning(['MUI: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
|
|
62
|
+
var childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
|
|
62
63
|
|
|
63
64
|
/**
|
|
64
65
|
*
|
|
@@ -76,61 +77,22 @@ var RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps,
|
|
|
76
77
|
props: inProps,
|
|
77
78
|
name: 'MuiRichTreeView'
|
|
78
79
|
});
|
|
79
|
-
var _ref2 = props,
|
|
80
|
-
disabledItemsFocusable = _ref2.disabledItemsFocusable,
|
|
81
|
-
expandedNodes = _ref2.expandedNodes,
|
|
82
|
-
defaultExpandedNodes = _ref2.defaultExpandedNodes,
|
|
83
|
-
onExpandedNodesChange = _ref2.onExpandedNodesChange,
|
|
84
|
-
onNodeExpansionToggle = _ref2.onNodeExpansionToggle,
|
|
85
|
-
onNodeFocus = _ref2.onNodeFocus,
|
|
86
|
-
disableSelection = _ref2.disableSelection,
|
|
87
|
-
defaultSelectedNodes = _ref2.defaultSelectedNodes,
|
|
88
|
-
selectedNodes = _ref2.selectedNodes,
|
|
89
|
-
multiSelect = _ref2.multiSelect,
|
|
90
|
-
onSelectedNodesChange = _ref2.onSelectedNodesChange,
|
|
91
|
-
onNodeSelectionToggle = _ref2.onNodeSelectionToggle,
|
|
92
|
-
treeId = _ref2.id,
|
|
93
|
-
defaultCollapseIcon = _ref2.defaultCollapseIcon,
|
|
94
|
-
defaultEndIcon = _ref2.defaultEndIcon,
|
|
95
|
-
defaultExpandIcon = _ref2.defaultExpandIcon,
|
|
96
|
-
defaultParentIcon = _ref2.defaultParentIcon,
|
|
97
|
-
items = _ref2.items,
|
|
98
|
-
getItemId = _ref2.getItemId,
|
|
99
|
-
getItemLabel = _ref2.getItemLabel,
|
|
100
|
-
isItemDisabled = _ref2.isItemDisabled,
|
|
101
|
-
slots = _ref2.slots,
|
|
102
|
-
slotProps = _ref2.slotProps,
|
|
103
|
-
other = _objectWithoutProperties(_ref2, _excluded);
|
|
104
80
|
if (process.env.NODE_ENV !== 'production') {
|
|
105
81
|
if (props.children != null) {
|
|
106
82
|
childrenWarning();
|
|
107
83
|
}
|
|
108
84
|
}
|
|
109
|
-
var
|
|
110
|
-
|
|
111
|
-
expandedNodes: expandedNodes,
|
|
112
|
-
defaultExpandedNodes: defaultExpandedNodes,
|
|
113
|
-
onExpandedNodesChange: onExpandedNodesChange,
|
|
114
|
-
onNodeExpansionToggle: onNodeExpansionToggle,
|
|
115
|
-
onNodeFocus: onNodeFocus,
|
|
116
|
-
disableSelection: disableSelection,
|
|
117
|
-
defaultSelectedNodes: defaultSelectedNodes,
|
|
118
|
-
selectedNodes: selectedNodes,
|
|
119
|
-
multiSelect: multiSelect,
|
|
120
|
-
onSelectedNodesChange: onSelectedNodesChange,
|
|
121
|
-
onNodeSelectionToggle: onNodeSelectionToggle,
|
|
122
|
-
id: treeId,
|
|
123
|
-
defaultCollapseIcon: defaultCollapseIcon,
|
|
124
|
-
defaultEndIcon: defaultEndIcon,
|
|
125
|
-
defaultExpandIcon: defaultExpandIcon,
|
|
126
|
-
defaultParentIcon: defaultParentIcon,
|
|
127
|
-
items: items,
|
|
128
|
-
getItemId: getItemId,
|
|
129
|
-
getItemLabel: getItemLabel,
|
|
130
|
-
isItemDisabled: isItemDisabled,
|
|
85
|
+
var _extractPluginParamsF = extractPluginParamsFromProps({
|
|
86
|
+
props: props,
|
|
131
87
|
plugins: DEFAULT_TREE_VIEW_PLUGINS,
|
|
132
88
|
rootRef: ref
|
|
133
89
|
}),
|
|
90
|
+
pluginParams = _extractPluginParamsF.pluginParams,
|
|
91
|
+
_extractPluginParamsF2 = _extractPluginParamsF.otherProps,
|
|
92
|
+
slots = _extractPluginParamsF2.slots,
|
|
93
|
+
slotProps = _extractPluginParamsF2.slotProps,
|
|
94
|
+
otherProps = _objectWithoutProperties(_extractPluginParamsF2, _excluded);
|
|
95
|
+
var _useTreeView = useTreeView(pluginParams),
|
|
134
96
|
getRootProps = _useTreeView.getRootProps,
|
|
135
97
|
contextValue = _useTreeView.contextValue,
|
|
136
98
|
instance = _useTreeView.instance;
|
|
@@ -139,17 +101,17 @@ var RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps,
|
|
|
139
101
|
var rootProps = useSlotProps({
|
|
140
102
|
elementType: Root,
|
|
141
103
|
externalSlotProps: slotProps == null ? void 0 : slotProps.root,
|
|
142
|
-
externalForwardedProps:
|
|
104
|
+
externalForwardedProps: otherProps,
|
|
143
105
|
className: classes.root,
|
|
144
106
|
getSlotProps: getRootProps,
|
|
145
107
|
ownerState: props
|
|
146
108
|
});
|
|
147
109
|
var nodesToRender = instance.getNodesToRender();
|
|
148
|
-
var renderNode = function renderNode(
|
|
149
|
-
var label =
|
|
150
|
-
nodeId =
|
|
151
|
-
id =
|
|
152
|
-
children =
|
|
110
|
+
var renderNode = function renderNode(_ref2) {
|
|
111
|
+
var label = _ref2.label,
|
|
112
|
+
nodeId = _ref2.nodeId,
|
|
113
|
+
id = _ref2.id,
|
|
114
|
+
children = _ref2.children;
|
|
153
115
|
return /*#__PURE__*/_jsx(WrappedTreeItem, {
|
|
154
116
|
slots: slots,
|
|
155
117
|
slotProps: slotProps,
|