@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
|
@@ -70,15 +70,15 @@ export const useTreeViewJSXNodes = ({
|
|
|
70
70
|
};
|
|
71
71
|
const useTreeViewJSXNodesItemPlugin = ({
|
|
72
72
|
props,
|
|
73
|
-
|
|
73
|
+
rootRef,
|
|
74
|
+
contentRef
|
|
74
75
|
}) => {
|
|
75
76
|
const {
|
|
76
77
|
children,
|
|
77
78
|
disabled = false,
|
|
78
79
|
label,
|
|
79
80
|
nodeId,
|
|
80
|
-
id
|
|
81
|
-
ContentProps: inContentProps
|
|
81
|
+
id
|
|
82
82
|
} = props;
|
|
83
83
|
const {
|
|
84
84
|
instance
|
|
@@ -91,8 +91,9 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
91
91
|
};
|
|
92
92
|
const expandable = isExpandable(children);
|
|
93
93
|
const [treeItemElement, setTreeItemElement] = React.useState(null);
|
|
94
|
-
const
|
|
95
|
-
const
|
|
94
|
+
const pluginContentRef = React.useRef(null);
|
|
95
|
+
const handleRootRef = useForkRef(setTreeItemElement, rootRef);
|
|
96
|
+
const handleContentRef = useForkRef(pluginContentRef, contentRef);
|
|
96
97
|
const descendant = React.useMemo(() => ({
|
|
97
98
|
element: treeItemElement,
|
|
98
99
|
id: nodeId
|
|
@@ -118,23 +119,22 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
118
119
|
}, [instance, parentId, index, nodeId, expandable, disabled, id]);
|
|
119
120
|
React.useEffect(() => {
|
|
120
121
|
if (label) {
|
|
121
|
-
var
|
|
122
|
-
return instance.mapFirstCharFromJSX(nodeId, ((
|
|
122
|
+
var _pluginContentRef$cur, _pluginContentRef$cur2;
|
|
123
|
+
return instance.mapFirstCharFromJSX(nodeId, ((_pluginContentRef$cur = (_pluginContentRef$cur2 = pluginContentRef.current) == null ? void 0 : _pluginContentRef$cur2.textContent) != null ? _pluginContentRef$cur : '').substring(0, 1).toLowerCase());
|
|
123
124
|
}
|
|
124
125
|
return undefined;
|
|
125
126
|
}, [instance, nodeId, label]);
|
|
126
127
|
return {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
ref: contentRef
|
|
130
|
-
})
|
|
131
|
-
}),
|
|
132
|
-
ref: handleRef,
|
|
133
|
-
wrapItem: item => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
134
|
-
id: nodeId,
|
|
135
|
-
children: item
|
|
136
|
-
})
|
|
128
|
+
contentRef: handleContentRef,
|
|
129
|
+
rootRef: handleRootRef
|
|
137
130
|
};
|
|
138
131
|
};
|
|
139
132
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
133
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
134
|
+
children,
|
|
135
|
+
nodeId
|
|
136
|
+
}) => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
137
|
+
id: nodeId,
|
|
138
|
+
children: children
|
|
139
|
+
});
|
|
140
140
|
useTreeViewJSXNodes.params = {};
|
|
@@ -82,7 +82,9 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
82
82
|
return null;
|
|
83
83
|
};
|
|
84
84
|
const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
|
|
85
|
-
const canToggleNodeExpansion = nodeId =>
|
|
85
|
+
const canToggleNodeExpansion = nodeId => {
|
|
86
|
+
return !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
|
|
87
|
+
};
|
|
86
88
|
|
|
87
89
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
88
90
|
const createHandleKeyDown = otherHandlers => event => {
|
|
@@ -92,7 +94,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
92
94
|
return;
|
|
93
95
|
}
|
|
94
96
|
|
|
95
|
-
// If the tree is empty there will be no focused node
|
|
97
|
+
// If the tree is empty, there will be no focused node
|
|
96
98
|
if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
|
|
97
99
|
return;
|
|
98
100
|
}
|
|
@@ -142,7 +144,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
142
144
|
const nextNode = getNextNode(instance, state.focusedNodeId);
|
|
143
145
|
if (nextNode) {
|
|
144
146
|
event.preventDefault();
|
|
145
|
-
instance.
|
|
147
|
+
instance.focusItem(event, nextNode);
|
|
146
148
|
|
|
147
149
|
// Multi select behavior when pressing Shift + ArrowDown
|
|
148
150
|
// Toggles the selection state of the next node
|
|
@@ -162,7 +164,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
162
164
|
const previousNode = getPreviousNode(instance, state.focusedNodeId);
|
|
163
165
|
if (previousNode) {
|
|
164
166
|
event.preventDefault();
|
|
165
|
-
instance.
|
|
167
|
+
instance.focusItem(event, previousNode);
|
|
166
168
|
|
|
167
169
|
// Multi select behavior when pressing Shift + ArrowUp
|
|
168
170
|
// Toggles the selection state of the previous node
|
|
@@ -181,7 +183,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
181
183
|
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
182
184
|
{
|
|
183
185
|
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
184
|
-
instance.
|
|
186
|
+
instance.focusItem(event, getNextNode(instance, state.focusedNodeId));
|
|
185
187
|
event.preventDefault();
|
|
186
188
|
} else if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
187
189
|
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
@@ -200,7 +202,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
200
202
|
} else {
|
|
201
203
|
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
202
204
|
if (parent) {
|
|
203
|
-
instance.
|
|
205
|
+
instance.focusItem(event, parent);
|
|
204
206
|
event.preventDefault();
|
|
205
207
|
}
|
|
206
208
|
}
|
|
@@ -210,7 +212,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
210
212
|
// Focuses the first node in the tree
|
|
211
213
|
case key === 'Home':
|
|
212
214
|
{
|
|
213
|
-
instance.
|
|
215
|
+
instance.focusItem(event, getFirstNode(instance));
|
|
214
216
|
|
|
215
217
|
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
216
218
|
// Selects the focused node and all nodes up to the first node.
|
|
@@ -224,7 +226,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
224
226
|
// Focuses the last node in the tree
|
|
225
227
|
case key === 'End':
|
|
226
228
|
{
|
|
227
|
-
instance.
|
|
229
|
+
instance.focusItem(event, getLastNode(instance));
|
|
228
230
|
|
|
229
231
|
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
230
232
|
// Selects the focused node and all the nodes down to the last node.
|
|
@@ -261,7 +263,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
261
263
|
{
|
|
262
264
|
const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
|
|
263
265
|
if (matchingNode != null) {
|
|
264
|
-
instance.
|
|
266
|
+
instance.focusItem(event, matchingNode);
|
|
265
267
|
event.preventDefault();
|
|
266
268
|
}
|
|
267
269
|
break;
|
|
@@ -104,7 +104,7 @@ export const useTreeViewNodes = ({
|
|
|
104
104
|
});
|
|
105
105
|
});
|
|
106
106
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
107
|
-
const getNodesToRender =
|
|
107
|
+
const getNodesToRender = () => {
|
|
108
108
|
const getPropsFromNodeId = ({
|
|
109
109
|
id,
|
|
110
110
|
children
|
|
@@ -118,7 +118,7 @@ export const useTreeViewNodes = ({
|
|
|
118
118
|
};
|
|
119
119
|
};
|
|
120
120
|
return state.nodes.nodeTree.map(getPropsFromNodeId);
|
|
121
|
-
}
|
|
121
|
+
};
|
|
122
122
|
populateInstance(instance, {
|
|
123
123
|
getNode,
|
|
124
124
|
getItem,
|
|
@@ -10,49 +10,49 @@ export const useTreeViewSelection = ({
|
|
|
10
10
|
const lastSelectedNode = React.useRef(null);
|
|
11
11
|
const lastSelectionWasRange = React.useRef(false);
|
|
12
12
|
const currentRangeSelection = React.useRef([]);
|
|
13
|
-
const
|
|
14
|
-
if (params.
|
|
13
|
+
const setSelectedItems = (event, newSelectedItems) => {
|
|
14
|
+
if (params.onItemSelectionToggle) {
|
|
15
15
|
if (params.multiSelect) {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
params.
|
|
16
|
+
const addedItems = newSelectedItems.filter(itemId => !instance.isNodeSelected(itemId));
|
|
17
|
+
const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
|
|
18
|
+
addedItems.forEach(itemId => {
|
|
19
|
+
params.onItemSelectionToggle(event, itemId, true);
|
|
20
20
|
});
|
|
21
|
-
|
|
22
|
-
params.
|
|
21
|
+
removedItems.forEach(itemId => {
|
|
22
|
+
params.onItemSelectionToggle(event, itemId, false);
|
|
23
23
|
});
|
|
24
|
-
} else if (
|
|
25
|
-
if (models.
|
|
26
|
-
params.
|
|
24
|
+
} else if (newSelectedItems !== models.selectedItems.value) {
|
|
25
|
+
if (models.selectedItems.value != null) {
|
|
26
|
+
params.onItemSelectionToggle(event, models.selectedItems.value, false);
|
|
27
27
|
}
|
|
28
|
-
if (
|
|
29
|
-
params.
|
|
28
|
+
if (newSelectedItems != null) {
|
|
29
|
+
params.onItemSelectionToggle(event, newSelectedItems, true);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
if (params.
|
|
34
|
-
params.
|
|
33
|
+
if (params.onSelectedItemsChange) {
|
|
34
|
+
params.onSelectedItemsChange(event, newSelectedItems);
|
|
35
35
|
}
|
|
36
|
-
models.
|
|
36
|
+
models.selectedItems.setControlledValue(newSelectedItems);
|
|
37
37
|
};
|
|
38
|
-
const isNodeSelected = nodeId => Array.isArray(models.
|
|
38
|
+
const isNodeSelected = nodeId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(nodeId) !== -1 : models.selectedItems.value === nodeId;
|
|
39
39
|
const selectNode = (event, nodeId, multiple = false) => {
|
|
40
40
|
if (params.disableSelection) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
if (multiple) {
|
|
44
|
-
if (Array.isArray(models.
|
|
44
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
45
45
|
let newSelected;
|
|
46
|
-
if (models.
|
|
47
|
-
newSelected = models.
|
|
46
|
+
if (models.selectedItems.value.indexOf(nodeId) !== -1) {
|
|
47
|
+
newSelected = models.selectedItems.value.filter(id => id !== nodeId);
|
|
48
48
|
} else {
|
|
49
|
-
newSelected = [nodeId].concat(models.
|
|
49
|
+
newSelected = [nodeId].concat(models.selectedItems.value);
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
setSelectedItems(event, newSelected);
|
|
52
52
|
}
|
|
53
53
|
} else {
|
|
54
54
|
const newSelected = params.multiSelect ? [nodeId] : nodeId;
|
|
55
|
-
|
|
55
|
+
setSelectedItems(event, newSelected);
|
|
56
56
|
}
|
|
57
57
|
lastSelectedNode.current = nodeId;
|
|
58
58
|
lastSelectionWasRange.current = false;
|
|
@@ -69,7 +69,7 @@ export const useTreeViewSelection = ({
|
|
|
69
69
|
return nodes;
|
|
70
70
|
};
|
|
71
71
|
const handleRangeArrowSelect = (event, nodes) => {
|
|
72
|
-
let base = models.
|
|
72
|
+
let base = models.selectedItems.value.slice();
|
|
73
73
|
const {
|
|
74
74
|
start,
|
|
75
75
|
next,
|
|
@@ -93,10 +93,10 @@ export const useTreeViewSelection = ({
|
|
|
93
93
|
base.push(next);
|
|
94
94
|
currentRangeSelection.current.push(current, next);
|
|
95
95
|
}
|
|
96
|
-
|
|
96
|
+
setSelectedItems(event, base);
|
|
97
97
|
};
|
|
98
98
|
const handleRangeSelect = (event, nodes) => {
|
|
99
|
-
let base = models.
|
|
99
|
+
let base = models.selectedItems.value.slice();
|
|
100
100
|
const {
|
|
101
101
|
start,
|
|
102
102
|
end
|
|
@@ -110,7 +110,7 @@ export const useTreeViewSelection = ({
|
|
|
110
110
|
currentRangeSelection.current = range;
|
|
111
111
|
let newSelected = base.concat(range);
|
|
112
112
|
newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
|
|
113
|
-
|
|
113
|
+
setSelectedItems(event, newSelected);
|
|
114
114
|
};
|
|
115
115
|
const selectRange = (event, nodes, stacked = false) => {
|
|
116
116
|
if (params.disableSelection) {
|
|
@@ -174,8 +174,8 @@ export const useTreeViewSelection = ({
|
|
|
174
174
|
};
|
|
175
175
|
};
|
|
176
176
|
useTreeViewSelection.models = {
|
|
177
|
-
|
|
178
|
-
getDefaultValue: params => params.
|
|
177
|
+
selectedItems: {
|
|
178
|
+
getDefaultValue: params => params.defaultSelectedItems
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
181
|
const DEFAULT_SELECTED_NODES = [];
|
|
@@ -184,14 +184,14 @@ useTreeViewSelection.getDefaultizedParams = params => {
|
|
|
184
184
|
return _extends({}, params, {
|
|
185
185
|
disableSelection: (_params$disableSelect = params.disableSelection) != null ? _params$disableSelect : false,
|
|
186
186
|
multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
|
|
187
|
-
|
|
187
|
+
defaultSelectedItems: (_params$defaultSelect = params.defaultSelectedItems) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
|
|
188
188
|
});
|
|
189
189
|
};
|
|
190
190
|
useTreeViewSelection.params = {
|
|
191
191
|
disableSelection: true,
|
|
192
192
|
multiSelect: true,
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
defaultSelectedItems: true,
|
|
194
|
+
selectedItems: true,
|
|
195
|
+
onSelectedItemsChange: true,
|
|
196
|
+
onItemSelectionToggle: true
|
|
197
197
|
};
|
|
@@ -17,16 +17,16 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
17
17
|
*/
|
|
18
18
|
disableSelection?: boolean;
|
|
19
19
|
/**
|
|
20
|
-
* Selected
|
|
20
|
+
* Selected item ids. (Uncontrolled)
|
|
21
21
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
22
22
|
* @default []
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
defaultSelectedItems?: TreeViewSelectionValue<Multiple>;
|
|
25
25
|
/**
|
|
26
|
-
* Selected
|
|
26
|
+
* Selected item ids. (Controlled)
|
|
27
27
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
selectedItems?: TreeViewSelectionValue<Multiple>;
|
|
30
30
|
/**
|
|
31
31
|
* If true `ctrl` and `shift` will trigger multiselect.
|
|
32
32
|
* @default false
|
|
@@ -35,19 +35,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
35
35
|
/**
|
|
36
36
|
* Callback fired when tree items are selected/deselected.
|
|
37
37
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
38
|
-
* @param {string[] | string}
|
|
38
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
39
39
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
onSelectedItemsChange?: (event: React.SyntheticEvent, itemIds: TreeViewSelectionValue<Multiple>) => void;
|
|
42
42
|
/**
|
|
43
43
|
* Callback fired when a tree item is selected or deselected.
|
|
44
44
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
45
|
-
* @param {array}
|
|
46
|
-
* @param {array} isSelected `true` if the
|
|
45
|
+
* @param {array} itemId The itemId of the modified item.
|
|
46
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
47
47
|
*/
|
|
48
|
-
|
|
48
|
+
onItemSelectionToggle?: (event: React.SyntheticEvent, itemId: string, isSelected: boolean) => void;
|
|
49
49
|
}
|
|
50
|
-
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | '
|
|
50
|
+
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect'>;
|
|
51
51
|
interface UseTreeViewSelectionContextValue {
|
|
52
52
|
selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect'>;
|
|
53
53
|
}
|
|
@@ -56,7 +56,7 @@ export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
|
|
|
56
56
|
defaultizedParams: UseTreeViewSelectionDefaultizedParameters<any>;
|
|
57
57
|
instance: UseTreeViewSelectionInstance;
|
|
58
58
|
contextValue: UseTreeViewSelectionContextValue;
|
|
59
|
-
modelNames: '
|
|
59
|
+
modelNames: 'selectedItems';
|
|
60
60
|
dependantPlugins: [
|
|
61
61
|
UseTreeViewNodesSignature,
|
|
62
62
|
UseTreeViewExpansionSignature,
|
|
@@ -38,6 +38,7 @@ export const useTreeView = inParams => {
|
|
|
38
38
|
});
|
|
39
39
|
const rootPropsGetters = [];
|
|
40
40
|
const contextValue = {
|
|
41
|
+
publicAPI,
|
|
41
42
|
instance: instance
|
|
42
43
|
};
|
|
43
44
|
const runPlugin = plugin => {
|
|
@@ -60,43 +61,44 @@ export const useTreeView = inParams => {
|
|
|
60
61
|
}
|
|
61
62
|
};
|
|
62
63
|
plugins.forEach(runPlugin);
|
|
63
|
-
contextValue.runItemPlugins =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}) => {
|
|
67
|
-
let finalProps = props;
|
|
68
|
-
let finalRef = ref;
|
|
69
|
-
const itemWrappers = [];
|
|
64
|
+
contextValue.runItemPlugins = itemPluginProps => {
|
|
65
|
+
let finalRootRef = null;
|
|
66
|
+
let finalContentRef = null;
|
|
70
67
|
plugins.forEach(plugin => {
|
|
71
68
|
if (!plugin.itemPlugin) {
|
|
72
69
|
return;
|
|
73
70
|
}
|
|
74
71
|
const itemPluginResponse = plugin.itemPlugin({
|
|
75
|
-
props:
|
|
76
|
-
|
|
72
|
+
props: itemPluginProps,
|
|
73
|
+
rootRef: finalRootRef,
|
|
74
|
+
contentRef: finalContentRef
|
|
77
75
|
});
|
|
78
|
-
if (itemPluginResponse != null && itemPluginResponse.
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
if (itemPluginResponse != null && itemPluginResponse.ref) {
|
|
82
|
-
finalRef = itemPluginResponse.ref;
|
|
76
|
+
if (itemPluginResponse != null && itemPluginResponse.rootRef) {
|
|
77
|
+
finalRootRef = itemPluginResponse.rootRef;
|
|
83
78
|
}
|
|
84
|
-
if (itemPluginResponse != null && itemPluginResponse.
|
|
85
|
-
|
|
79
|
+
if (itemPluginResponse != null && itemPluginResponse.contentRef) {
|
|
80
|
+
finalContentRef = itemPluginResponse.contentRef;
|
|
86
81
|
}
|
|
87
82
|
});
|
|
88
83
|
return {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
wrapItem: children => {
|
|
92
|
-
let finalChildren = children;
|
|
93
|
-
itemWrappers.forEach(itemWrapper => {
|
|
94
|
-
finalChildren = itemWrapper(finalChildren);
|
|
95
|
-
});
|
|
96
|
-
return finalChildren;
|
|
97
|
-
}
|
|
84
|
+
contentRef: finalContentRef,
|
|
85
|
+
rootRef: finalRootRef
|
|
98
86
|
};
|
|
99
87
|
};
|
|
88
|
+
const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
|
|
89
|
+
contextValue.wrapItem = ({
|
|
90
|
+
nodeId,
|
|
91
|
+
children
|
|
92
|
+
}) => {
|
|
93
|
+
let finalChildren = children;
|
|
94
|
+
itemWrappers.forEach(itemWrapper => {
|
|
95
|
+
finalChildren = itemWrapper({
|
|
96
|
+
nodeId,
|
|
97
|
+
children: finalChildren
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
return finalChildren;
|
|
101
|
+
};
|
|
100
102
|
const getRootProps = (otherHandlers = {}) => {
|
|
101
103
|
const rootProps = _extends({
|
|
102
104
|
role: 'tree',
|
|
@@ -137,7 +137,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
137
137
|
*/
|
|
138
138
|
apiRef: PropTypes.shape({
|
|
139
139
|
current: PropTypes.shape({
|
|
140
|
-
|
|
140
|
+
focusItem: PropTypes.func.isRequired,
|
|
141
141
|
getItem: PropTypes.func.isRequired
|
|
142
142
|
})
|
|
143
143
|
}),
|
|
@@ -147,17 +147,17 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
147
147
|
classes: PropTypes.object,
|
|
148
148
|
className: PropTypes.string,
|
|
149
149
|
/**
|
|
150
|
-
* Expanded
|
|
150
|
+
* Expanded item ids.
|
|
151
151
|
* Used when the item's expansion is not controlled.
|
|
152
152
|
* @default []
|
|
153
153
|
*/
|
|
154
|
-
|
|
154
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
155
155
|
/**
|
|
156
|
-
* Selected
|
|
156
|
+
* Selected item ids. (Uncontrolled)
|
|
157
157
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
158
158
|
* @default []
|
|
159
159
|
*/
|
|
160
|
-
|
|
160
|
+
defaultSelectedItems: PropTypes.any,
|
|
161
161
|
/**
|
|
162
162
|
* If `true`, will allow focus on disabled items.
|
|
163
163
|
* @default false
|
|
@@ -169,10 +169,10 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
169
169
|
*/
|
|
170
170
|
disableSelection: PropTypes.bool,
|
|
171
171
|
/**
|
|
172
|
-
* Expanded
|
|
172
|
+
* Expanded item ids.
|
|
173
173
|
* Used when the item's expansion is controlled.
|
|
174
174
|
*/
|
|
175
|
-
|
|
175
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
176
176
|
/**
|
|
177
177
|
* Used to determine the string label for a given item.
|
|
178
178
|
*
|
|
@@ -212,42 +212,42 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
212
212
|
/**
|
|
213
213
|
* Callback fired when tree items are expanded/collapsed.
|
|
214
214
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
215
|
-
* @param {array}
|
|
215
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
216
216
|
*/
|
|
217
|
-
|
|
217
|
+
onExpandedItemsChange: PropTypes.func,
|
|
218
218
|
/**
|
|
219
219
|
* Callback fired when a tree item is expanded or collapsed.
|
|
220
220
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
221
|
-
* @param {array}
|
|
222
|
-
* @param {array} isExpanded `true` if the
|
|
221
|
+
* @param {array} itemId The itemId of the modified item.
|
|
222
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
223
223
|
*/
|
|
224
|
-
|
|
224
|
+
onItemExpansionToggle: PropTypes.func,
|
|
225
225
|
/**
|
|
226
226
|
* Callback fired when tree items are focused.
|
|
227
227
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
228
|
-
* @param {string}
|
|
229
|
-
* @param {string} value of the focused
|
|
228
|
+
* @param {string} itemId The id of the focused item.
|
|
229
|
+
* @param {string} value of the focused item.
|
|
230
230
|
*/
|
|
231
|
-
|
|
231
|
+
onItemFocus: PropTypes.func,
|
|
232
232
|
/**
|
|
233
233
|
* Callback fired when a tree item is selected or deselected.
|
|
234
234
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
235
|
-
* @param {array}
|
|
236
|
-
* @param {array} isSelected `true` if the
|
|
235
|
+
* @param {array} itemId The itemId of the modified item.
|
|
236
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
237
237
|
*/
|
|
238
|
-
|
|
238
|
+
onItemSelectionToggle: PropTypes.func,
|
|
239
239
|
/**
|
|
240
240
|
* Callback fired when tree items are selected/deselected.
|
|
241
241
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
242
|
-
* @param {string[] | string}
|
|
242
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
243
243
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
244
244
|
*/
|
|
245
|
-
|
|
245
|
+
onSelectedItemsChange: PropTypes.func,
|
|
246
246
|
/**
|
|
247
|
-
* Selected
|
|
247
|
+
* Selected item ids. (Controlled)
|
|
248
248
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
249
249
|
*/
|
|
250
|
-
|
|
250
|
+
selectedItems: PropTypes.any,
|
|
251
251
|
/**
|
|
252
252
|
* The props used for each component slot.
|
|
253
253
|
* @default {}
|
|
@@ -95,7 +95,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
95
95
|
*/
|
|
96
96
|
apiRef: PropTypes.shape({
|
|
97
97
|
current: PropTypes.shape({
|
|
98
|
-
|
|
98
|
+
focusItem: PropTypes.func.isRequired,
|
|
99
99
|
getItem: PropTypes.func.isRequired
|
|
100
100
|
})
|
|
101
101
|
}),
|
|
@@ -109,17 +109,17 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
109
109
|
classes: PropTypes.object,
|
|
110
110
|
className: PropTypes.string,
|
|
111
111
|
/**
|
|
112
|
-
* Expanded
|
|
112
|
+
* Expanded item ids.
|
|
113
113
|
* Used when the item's expansion is not controlled.
|
|
114
114
|
* @default []
|
|
115
115
|
*/
|
|
116
|
-
|
|
116
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
117
117
|
/**
|
|
118
|
-
* Selected
|
|
118
|
+
* Selected item ids. (Uncontrolled)
|
|
119
119
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
120
120
|
* @default []
|
|
121
121
|
*/
|
|
122
|
-
|
|
122
|
+
defaultSelectedItems: PropTypes.any,
|
|
123
123
|
/**
|
|
124
124
|
* If `true`, will allow focus on disabled items.
|
|
125
125
|
* @default false
|
|
@@ -131,10 +131,10 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
131
131
|
*/
|
|
132
132
|
disableSelection: PropTypes.bool,
|
|
133
133
|
/**
|
|
134
|
-
* Expanded
|
|
134
|
+
* Expanded item ids.
|
|
135
135
|
* Used when the item's expansion is controlled.
|
|
136
136
|
*/
|
|
137
|
-
|
|
137
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
138
138
|
/**
|
|
139
139
|
* This prop is used to help implement the accessibility logic.
|
|
140
140
|
* If you don't provide this prop. It falls back to a randomly generated id.
|
|
@@ -148,42 +148,42 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
148
148
|
/**
|
|
149
149
|
* Callback fired when tree items are expanded/collapsed.
|
|
150
150
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
151
|
-
* @param {array}
|
|
151
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
152
152
|
*/
|
|
153
|
-
|
|
153
|
+
onExpandedItemsChange: PropTypes.func,
|
|
154
154
|
/**
|
|
155
155
|
* Callback fired when a tree item is expanded or collapsed.
|
|
156
156
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
157
|
-
* @param {array}
|
|
158
|
-
* @param {array} isExpanded `true` if the
|
|
157
|
+
* @param {array} itemId The itemId of the modified item.
|
|
158
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
159
159
|
*/
|
|
160
|
-
|
|
160
|
+
onItemExpansionToggle: PropTypes.func,
|
|
161
161
|
/**
|
|
162
162
|
* Callback fired when tree items are focused.
|
|
163
163
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
164
|
-
* @param {string}
|
|
165
|
-
* @param {string} value of the focused
|
|
164
|
+
* @param {string} itemId The id of the focused item.
|
|
165
|
+
* @param {string} value of the focused item.
|
|
166
166
|
*/
|
|
167
|
-
|
|
167
|
+
onItemFocus: PropTypes.func,
|
|
168
168
|
/**
|
|
169
169
|
* Callback fired when a tree item is selected or deselected.
|
|
170
170
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
171
|
-
* @param {array}
|
|
172
|
-
* @param {array} isSelected `true` if the
|
|
171
|
+
* @param {array} itemId The itemId of the modified item.
|
|
172
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
173
173
|
*/
|
|
174
|
-
|
|
174
|
+
onItemSelectionToggle: PropTypes.func,
|
|
175
175
|
/**
|
|
176
176
|
* Callback fired when tree items are selected/deselected.
|
|
177
177
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
178
|
-
* @param {string[] | string}
|
|
178
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
179
179
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
180
180
|
*/
|
|
181
|
-
|
|
181
|
+
onSelectedItemsChange: PropTypes.func,
|
|
182
182
|
/**
|
|
183
|
-
* Selected
|
|
183
|
+
* Selected item ids. (Controlled)
|
|
184
184
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
185
185
|
*/
|
|
186
|
-
|
|
186
|
+
selectedItems: PropTypes.any,
|
|
187
187
|
/**
|
|
188
188
|
* The props used for each component slot.
|
|
189
189
|
*/
|