@mui/x-tree-view 7.0.0-beta.6 → 7.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -1
- package/RichTreeView/RichTreeView.js +22 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +22 -22
- package/TreeItem/TreeItem.js +57 -53
- package/TreeItem/TreeItem.types.d.ts +10 -8
- package/TreeItem/useTreeItemState.js +2 -2
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +301 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +68 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.js +22 -22
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -5
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
- package/internals/useTreeView/useTreeView.js +27 -25
- package/modern/RichTreeView/RichTreeView.js +22 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +22 -22
- package/modern/TreeItem/TreeItem.js +57 -53
- package/modern/TreeItem/useTreeItemState.js +2 -2
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +22 -22
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +16 -16
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/useTreeView/useTreeView.js +27 -25
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +135 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +22 -22
- package/node/SimpleTreeView/SimpleTreeView.js +22 -22
- package/node/TreeItem/TreeItem.js +57 -53
- package/node/TreeItem/useTreeItemState.js +2 -2
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +22 -22
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +16 -16
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/node/internals/useTreeView/useTreeView.js +27 -25
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +143 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +1 -1
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +138 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -90,7 +90,9 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
90
90
|
return null;
|
|
91
91
|
};
|
|
92
92
|
const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
|
|
93
|
-
const canToggleNodeExpansion = nodeId =>
|
|
93
|
+
const canToggleNodeExpansion = nodeId => {
|
|
94
|
+
return !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
|
|
95
|
+
};
|
|
94
96
|
|
|
95
97
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
96
98
|
const createHandleKeyDown = otherHandlers => event => {
|
|
@@ -99,7 +101,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
99
101
|
return;
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
// If the tree is empty there will be no focused node
|
|
104
|
+
// If the tree is empty, there will be no focused node
|
|
103
105
|
if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
|
|
104
106
|
return;
|
|
105
107
|
}
|
|
@@ -149,7 +151,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
149
151
|
const nextNode = (0, _useTreeView.getNextNode)(instance, state.focusedNodeId);
|
|
150
152
|
if (nextNode) {
|
|
151
153
|
event.preventDefault();
|
|
152
|
-
instance.
|
|
154
|
+
instance.focusItem(event, nextNode);
|
|
153
155
|
|
|
154
156
|
// Multi select behavior when pressing Shift + ArrowDown
|
|
155
157
|
// Toggles the selection state of the next node
|
|
@@ -169,7 +171,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
169
171
|
const previousNode = (0, _useTreeView.getPreviousNode)(instance, state.focusedNodeId);
|
|
170
172
|
if (previousNode) {
|
|
171
173
|
event.preventDefault();
|
|
172
|
-
instance.
|
|
174
|
+
instance.focusItem(event, previousNode);
|
|
173
175
|
|
|
174
176
|
// Multi select behavior when pressing Shift + ArrowUp
|
|
175
177
|
// Toggles the selection state of the previous node
|
|
@@ -188,7 +190,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
188
190
|
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
189
191
|
{
|
|
190
192
|
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
191
|
-
instance.
|
|
193
|
+
instance.focusItem(event, (0, _useTreeView.getNextNode)(instance, state.focusedNodeId));
|
|
192
194
|
event.preventDefault();
|
|
193
195
|
} else if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
194
196
|
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
@@ -207,7 +209,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
207
209
|
} else {
|
|
208
210
|
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
209
211
|
if (parent) {
|
|
210
|
-
instance.
|
|
212
|
+
instance.focusItem(event, parent);
|
|
211
213
|
event.preventDefault();
|
|
212
214
|
}
|
|
213
215
|
}
|
|
@@ -217,7 +219,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
217
219
|
// Focuses the first node in the tree
|
|
218
220
|
case key === 'Home':
|
|
219
221
|
{
|
|
220
|
-
instance.
|
|
222
|
+
instance.focusItem(event, (0, _useTreeView.getFirstNode)(instance));
|
|
221
223
|
|
|
222
224
|
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
223
225
|
// Selects the focused node and all nodes up to the first node.
|
|
@@ -231,7 +233,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
231
233
|
// Focuses the last node in the tree
|
|
232
234
|
case key === 'End':
|
|
233
235
|
{
|
|
234
|
-
instance.
|
|
236
|
+
instance.focusItem(event, (0, _useTreeView.getLastNode)(instance));
|
|
235
237
|
|
|
236
238
|
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
237
239
|
// Selects the focused node and all the nodes down to the last node.
|
|
@@ -268,7 +270,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
268
270
|
{
|
|
269
271
|
const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
|
|
270
272
|
if (matchingNode != null) {
|
|
271
|
-
instance.
|
|
273
|
+
instance.focusItem(event, matchingNode);
|
|
272
274
|
event.preventDefault();
|
|
273
275
|
}
|
|
274
276
|
break;
|
|
@@ -112,7 +112,7 @@ const useTreeViewNodes = ({
|
|
|
112
112
|
});
|
|
113
113
|
});
|
|
114
114
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
115
|
-
const getNodesToRender = (
|
|
115
|
+
const getNodesToRender = () => {
|
|
116
116
|
const getPropsFromNodeId = ({
|
|
117
117
|
id,
|
|
118
118
|
children
|
|
@@ -126,7 +126,7 @@ const useTreeViewNodes = ({
|
|
|
126
126
|
};
|
|
127
127
|
};
|
|
128
128
|
return state.nodes.nodeTree.map(getPropsFromNodeId);
|
|
129
|
-
}
|
|
129
|
+
};
|
|
130
130
|
(0, _useTreeView.populateInstance)(instance, {
|
|
131
131
|
getNode,
|
|
132
132
|
getItem,
|
|
@@ -19,49 +19,49 @@ const useTreeViewSelection = ({
|
|
|
19
19
|
const lastSelectedNode = React.useRef(null);
|
|
20
20
|
const lastSelectionWasRange = React.useRef(false);
|
|
21
21
|
const currentRangeSelection = React.useRef([]);
|
|
22
|
-
const
|
|
23
|
-
if (params.
|
|
22
|
+
const setSelectedItems = (event, newSelectedItems) => {
|
|
23
|
+
if (params.onItemSelectionToggle) {
|
|
24
24
|
if (params.multiSelect) {
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
params.
|
|
25
|
+
const addedItems = newSelectedItems.filter(itemId => !instance.isNodeSelected(itemId));
|
|
26
|
+
const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
|
|
27
|
+
addedItems.forEach(itemId => {
|
|
28
|
+
params.onItemSelectionToggle(event, itemId, true);
|
|
29
29
|
});
|
|
30
|
-
|
|
31
|
-
params.
|
|
30
|
+
removedItems.forEach(itemId => {
|
|
31
|
+
params.onItemSelectionToggle(event, itemId, false);
|
|
32
32
|
});
|
|
33
|
-
} else if (
|
|
34
|
-
if (models.
|
|
35
|
-
params.
|
|
33
|
+
} else if (newSelectedItems !== models.selectedItems.value) {
|
|
34
|
+
if (models.selectedItems.value != null) {
|
|
35
|
+
params.onItemSelectionToggle(event, models.selectedItems.value, false);
|
|
36
36
|
}
|
|
37
|
-
if (
|
|
38
|
-
params.
|
|
37
|
+
if (newSelectedItems != null) {
|
|
38
|
+
params.onItemSelectionToggle(event, newSelectedItems, true);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
if (params.
|
|
43
|
-
params.
|
|
42
|
+
if (params.onSelectedItemsChange) {
|
|
43
|
+
params.onSelectedItemsChange(event, newSelectedItems);
|
|
44
44
|
}
|
|
45
|
-
models.
|
|
45
|
+
models.selectedItems.setControlledValue(newSelectedItems);
|
|
46
46
|
};
|
|
47
|
-
const isNodeSelected = nodeId => Array.isArray(models.
|
|
47
|
+
const isNodeSelected = nodeId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(nodeId) !== -1 : models.selectedItems.value === nodeId;
|
|
48
48
|
const selectNode = (event, nodeId, multiple = false) => {
|
|
49
49
|
if (params.disableSelection) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
if (multiple) {
|
|
53
|
-
if (Array.isArray(models.
|
|
53
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
54
54
|
let newSelected;
|
|
55
|
-
if (models.
|
|
56
|
-
newSelected = models.
|
|
55
|
+
if (models.selectedItems.value.indexOf(nodeId) !== -1) {
|
|
56
|
+
newSelected = models.selectedItems.value.filter(id => id !== nodeId);
|
|
57
57
|
} else {
|
|
58
|
-
newSelected = [nodeId].concat(models.
|
|
58
|
+
newSelected = [nodeId].concat(models.selectedItems.value);
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
setSelectedItems(event, newSelected);
|
|
61
61
|
}
|
|
62
62
|
} else {
|
|
63
63
|
const newSelected = params.multiSelect ? [nodeId] : nodeId;
|
|
64
|
-
|
|
64
|
+
setSelectedItems(event, newSelected);
|
|
65
65
|
}
|
|
66
66
|
lastSelectedNode.current = nodeId;
|
|
67
67
|
lastSelectionWasRange.current = false;
|
|
@@ -78,7 +78,7 @@ const useTreeViewSelection = ({
|
|
|
78
78
|
return nodes;
|
|
79
79
|
};
|
|
80
80
|
const handleRangeArrowSelect = (event, nodes) => {
|
|
81
|
-
let base = models.
|
|
81
|
+
let base = models.selectedItems.value.slice();
|
|
82
82
|
const {
|
|
83
83
|
start,
|
|
84
84
|
next,
|
|
@@ -102,10 +102,10 @@ const useTreeViewSelection = ({
|
|
|
102
102
|
base.push(next);
|
|
103
103
|
currentRangeSelection.current.push(current, next);
|
|
104
104
|
}
|
|
105
|
-
|
|
105
|
+
setSelectedItems(event, base);
|
|
106
106
|
};
|
|
107
107
|
const handleRangeSelect = (event, nodes) => {
|
|
108
|
-
let base = models.
|
|
108
|
+
let base = models.selectedItems.value.slice();
|
|
109
109
|
const {
|
|
110
110
|
start,
|
|
111
111
|
end
|
|
@@ -119,7 +119,7 @@ const useTreeViewSelection = ({
|
|
|
119
119
|
currentRangeSelection.current = range;
|
|
120
120
|
let newSelected = base.concat(range);
|
|
121
121
|
newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
|
|
122
|
-
|
|
122
|
+
setSelectedItems(event, newSelected);
|
|
123
123
|
};
|
|
124
124
|
const selectRange = (event, nodes, stacked = false) => {
|
|
125
125
|
if (params.disableSelection) {
|
|
@@ -184,21 +184,21 @@ const useTreeViewSelection = ({
|
|
|
184
184
|
};
|
|
185
185
|
exports.useTreeViewSelection = useTreeViewSelection;
|
|
186
186
|
useTreeViewSelection.models = {
|
|
187
|
-
|
|
188
|
-
getDefaultValue: params => params.
|
|
187
|
+
selectedItems: {
|
|
188
|
+
getDefaultValue: params => params.defaultSelectedItems
|
|
189
189
|
}
|
|
190
190
|
};
|
|
191
191
|
const DEFAULT_SELECTED_NODES = [];
|
|
192
192
|
useTreeViewSelection.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
193
193
|
disableSelection: params.disableSelection ?? false,
|
|
194
194
|
multiSelect: params.multiSelect ?? false,
|
|
195
|
-
|
|
195
|
+
defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
|
|
196
196
|
});
|
|
197
197
|
useTreeViewSelection.params = {
|
|
198
198
|
disableSelection: true,
|
|
199
199
|
multiSelect: true,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
200
|
+
defaultSelectedItems: true,
|
|
201
|
+
selectedItems: true,
|
|
202
|
+
onSelectedItemsChange: true,
|
|
203
|
+
onItemSelectionToggle: true
|
|
204
204
|
};
|
|
@@ -48,6 +48,7 @@ const useTreeView = inParams => {
|
|
|
48
48
|
});
|
|
49
49
|
const rootPropsGetters = [];
|
|
50
50
|
const contextValue = {
|
|
51
|
+
publicAPI,
|
|
51
52
|
instance: instance
|
|
52
53
|
};
|
|
53
54
|
const runPlugin = plugin => {
|
|
@@ -70,43 +71,44 @@ const useTreeView = inParams => {
|
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
73
|
plugins.forEach(runPlugin);
|
|
73
|
-
contextValue.runItemPlugins =
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}) => {
|
|
77
|
-
let finalProps = props;
|
|
78
|
-
let finalRef = ref;
|
|
79
|
-
const itemWrappers = [];
|
|
74
|
+
contextValue.runItemPlugins = itemPluginProps => {
|
|
75
|
+
let finalRootRef = null;
|
|
76
|
+
let finalContentRef = null;
|
|
80
77
|
plugins.forEach(plugin => {
|
|
81
78
|
if (!plugin.itemPlugin) {
|
|
82
79
|
return;
|
|
83
80
|
}
|
|
84
81
|
const itemPluginResponse = plugin.itemPlugin({
|
|
85
|
-
props:
|
|
86
|
-
|
|
82
|
+
props: itemPluginProps,
|
|
83
|
+
rootRef: finalRootRef,
|
|
84
|
+
contentRef: finalContentRef
|
|
87
85
|
});
|
|
88
|
-
if (itemPluginResponse?.
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
if (itemPluginResponse?.ref) {
|
|
92
|
-
finalRef = itemPluginResponse.ref;
|
|
86
|
+
if (itemPluginResponse?.rootRef) {
|
|
87
|
+
finalRootRef = itemPluginResponse.rootRef;
|
|
93
88
|
}
|
|
94
|
-
if (itemPluginResponse?.
|
|
95
|
-
|
|
89
|
+
if (itemPluginResponse?.contentRef) {
|
|
90
|
+
finalContentRef = itemPluginResponse.contentRef;
|
|
96
91
|
}
|
|
97
92
|
});
|
|
98
93
|
return {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
wrapItem: children => {
|
|
102
|
-
let finalChildren = children;
|
|
103
|
-
itemWrappers.forEach(itemWrapper => {
|
|
104
|
-
finalChildren = itemWrapper(finalChildren);
|
|
105
|
-
});
|
|
106
|
-
return finalChildren;
|
|
107
|
-
}
|
|
94
|
+
contentRef: finalContentRef,
|
|
95
|
+
rootRef: finalRootRef
|
|
108
96
|
};
|
|
109
97
|
};
|
|
98
|
+
const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
|
|
99
|
+
contextValue.wrapItem = ({
|
|
100
|
+
nodeId,
|
|
101
|
+
children
|
|
102
|
+
}) => {
|
|
103
|
+
let finalChildren = children;
|
|
104
|
+
itemWrappers.forEach(itemWrapper => {
|
|
105
|
+
finalChildren = itemWrapper({
|
|
106
|
+
nodeId,
|
|
107
|
+
children: finalChildren
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
return finalChildren;
|
|
111
|
+
};
|
|
110
112
|
const getRootProps = (otherHandlers = {}) => {
|
|
111
113
|
const rootProps = (0, _extends2.default)({
|
|
112
114
|
role: 'tree',
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "unstable_useTreeItem2", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeItem.useTreeItem2;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeItem = require("./useTreeItem2");
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.useTreeItem2 = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _utils = require("@mui/base/utils");
|
|
10
|
+
var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
|
|
11
|
+
var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
|
|
12
|
+
var _useTreeItem2Utils = require("../hooks/useTreeItem2Utils");
|
|
13
|
+
const useTreeItem2 = parameters => {
|
|
14
|
+
const {
|
|
15
|
+
runItemPlugins,
|
|
16
|
+
selection: {
|
|
17
|
+
multiSelect
|
|
18
|
+
},
|
|
19
|
+
disabledItemsFocusable,
|
|
20
|
+
instance,
|
|
21
|
+
publicAPI
|
|
22
|
+
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
23
|
+
const {
|
|
24
|
+
id,
|
|
25
|
+
nodeId,
|
|
26
|
+
label,
|
|
27
|
+
children,
|
|
28
|
+
rootRef
|
|
29
|
+
} = parameters;
|
|
30
|
+
const {
|
|
31
|
+
rootRef: pluginRootRef,
|
|
32
|
+
contentRef
|
|
33
|
+
} = runItemPlugins(parameters);
|
|
34
|
+
const {
|
|
35
|
+
interactions,
|
|
36
|
+
status
|
|
37
|
+
} = (0, _useTreeItem2Utils.useTreeItem2Utils)({
|
|
38
|
+
nodeId,
|
|
39
|
+
children
|
|
40
|
+
});
|
|
41
|
+
const idAttribute = instance.getTreeItemId(nodeId, id);
|
|
42
|
+
const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef);
|
|
43
|
+
const createRootHandleFocus = otherHandlers => event => {
|
|
44
|
+
otherHandlers.onFocus?.(event);
|
|
45
|
+
if (event.defaultMuiPrevented) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// DOM focus stays on the tree which manages focus with aria-activedescendant
|
|
50
|
+
if (event.target === event.currentTarget) {
|
|
51
|
+
instance.focusRoot();
|
|
52
|
+
}
|
|
53
|
+
const canBeFocused = !status.disabled || disabledItemsFocusable;
|
|
54
|
+
if (!status.focused && canBeFocused && event.currentTarget === event.target) {
|
|
55
|
+
instance.focusItem(event, nodeId);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const createContentHandleClick = otherHandlers => event => {
|
|
59
|
+
otherHandlers.onClick?.(event);
|
|
60
|
+
if (event.defaultMuiPrevented) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
interactions.handleExpansion(event);
|
|
64
|
+
interactions.handleSelection(event);
|
|
65
|
+
};
|
|
66
|
+
const createContentHandleMouseDown = otherHandlers => event => {
|
|
67
|
+
otherHandlers.onMouseDown?.(event);
|
|
68
|
+
if (event.defaultMuiPrevented) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Prevent text selection
|
|
73
|
+
if (event.shiftKey || event.ctrlKey || event.metaKey || status.disabled) {
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const getRootProps = (externalProps = {}) => {
|
|
78
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
79
|
+
let ariaSelected;
|
|
80
|
+
if (multiSelect) {
|
|
81
|
+
ariaSelected = status.selected;
|
|
82
|
+
} else if (status.selected) {
|
|
83
|
+
/* single-selection trees unset aria-selected on un-selected items.
|
|
84
|
+
*
|
|
85
|
+
* If the tree does not support multiple selection, aria-selected
|
|
86
|
+
* is set to true for the selected node and it is not present on any other node in the tree.
|
|
87
|
+
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
88
|
+
*/
|
|
89
|
+
ariaSelected = true;
|
|
90
|
+
}
|
|
91
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
92
|
+
ref: handleRootRef,
|
|
93
|
+
role: 'treeitem',
|
|
94
|
+
tabIndex: -1,
|
|
95
|
+
id: idAttribute,
|
|
96
|
+
'aria-expanded': status.expandable ? status.expanded : undefined,
|
|
97
|
+
'aria-selected': ariaSelected,
|
|
98
|
+
'aria-disabled': status.disabled || undefined
|
|
99
|
+
}, externalProps, {
|
|
100
|
+
onFocus: createRootHandleFocus(externalEventHandlers)
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
const getContentProps = (externalProps = {}) => {
|
|
104
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
105
|
+
return (0, _extends2.default)({}, externalEventHandlers, externalProps, {
|
|
106
|
+
ref: contentRef,
|
|
107
|
+
onClick: createContentHandleClick(externalEventHandlers),
|
|
108
|
+
onMouseDown: createContentHandleMouseDown(externalEventHandlers),
|
|
109
|
+
status
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
const getLabelProps = (externalProps = {}) => {
|
|
113
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
114
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
115
|
+
children: label
|
|
116
|
+
}, externalProps);
|
|
117
|
+
};
|
|
118
|
+
const getIconContainerProps = (externalProps = {}) => {
|
|
119
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
120
|
+
return (0, _extends2.default)({}, externalEventHandlers, externalProps);
|
|
121
|
+
};
|
|
122
|
+
const getGroupTransitionProps = (externalProps = {}) => {
|
|
123
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
124
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
125
|
+
unmountOnExit: true,
|
|
126
|
+
component: 'ul',
|
|
127
|
+
role: 'group',
|
|
128
|
+
in: status.expanded,
|
|
129
|
+
children
|
|
130
|
+
}, externalProps);
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
getRootProps,
|
|
134
|
+
getContentProps,
|
|
135
|
+
getGroupTransitionProps,
|
|
136
|
+
getIconContainerProps,
|
|
137
|
+
getLabelProps,
|
|
138
|
+
rootRef: handleRootRef,
|
|
139
|
+
status,
|
|
140
|
+
publicAPI
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
exports.useTreeItem2 = useTreeItem2;
|
package/package.json
CHANGED
|
@@ -21,6 +21,11 @@ export interface TreeViewComponents<Theme = unknown> {
|
|
|
21
21
|
styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem'];
|
|
22
22
|
variants?: ComponentsVariants<Theme>['MuiTreeItem'];
|
|
23
23
|
};
|
|
24
|
+
MuiTreeItem2?: {
|
|
25
|
+
defaultProps?: ComponentsProps['MuiTreeItem2'];
|
|
26
|
+
styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem2'];
|
|
27
|
+
variants?: ComponentsVariants<Theme>['MuiTreeItem2'];
|
|
28
|
+
};
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
declare module '@mui/material/styles' {
|
|
@@ -2,12 +2,14 @@ import { TreeItemProps } from '../TreeItem';
|
|
|
2
2
|
import { TreeViewProps } from '../TreeView';
|
|
3
3
|
import { SimpleTreeViewProps } from '../SimpleTreeView';
|
|
4
4
|
import { RichTreeViewProps } from '../RichTreeView';
|
|
5
|
+
import { TreeItem2Props } from '../TreeItem2';
|
|
5
6
|
|
|
6
7
|
export interface TreeViewComponentsPropsList {
|
|
7
8
|
MuiSimpleTreeView: SimpleTreeViewProps<any>;
|
|
8
9
|
MuiRichTreeView: RichTreeViewProps<any, any>;
|
|
9
10
|
MuiTreeView: TreeViewProps<any>;
|
|
10
11
|
MuiTreeItem: TreeItemProps;
|
|
12
|
+
MuiTreeItem2: TreeItem2Props;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
declare module '@mui/material/styles' {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeItem2 as unstable_useTreeItem2 } from './useTreeItem2';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { UseTreeItem2Parameters, UseTreeItem2ReturnValue } from './useTreeItem2.types';
|
|
2
|
+
export declare const useTreeItem2: <TPlugins extends [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature] = [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature]>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TPlugins>;
|