@mui/x-tree-view 7.0.0-beta.5 → 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 +252 -50
- package/RichTreeView/RichTreeView.js +23 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +23 -22
- package/TreeItem/TreeItem.js +79 -79
- package/TreeItem/TreeItem.types.d.ts +17 -19
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/treeItemClasses.js +1 -1
- 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 +23 -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/hooks/useTreeViewApiRef.d.ts +2 -2
- 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/helpers.d.ts +1 -0
- 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 -6
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +37 -23
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
- 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 +23 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -22
- package/modern/TreeItem/TreeItem.js +78 -78
- package/modern/TreeItem/treeItemClasses.js +1 -1
- 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 +23 -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 +36 -22
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- 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 +23 -22
- package/node/SimpleTreeView/SimpleTreeView.js +23 -22
- package/node/TreeItem/TreeItem.js +78 -78
- package/node/TreeItem/treeItemClasses.js +1 -1
- 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 +23 -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 +36 -22
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +30 -17
- 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 +2 -2
- 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
|
@@ -12,13 +12,14 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
|
|
|
12
12
|
var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
|
|
13
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
-
const
|
|
15
|
+
const updateNodesState = ({
|
|
16
16
|
items,
|
|
17
17
|
isItemDisabled,
|
|
18
18
|
getItemLabel,
|
|
19
19
|
getItemId
|
|
20
20
|
}) => {
|
|
21
21
|
const nodeMap = {};
|
|
22
|
+
const itemMap = {};
|
|
22
23
|
const processItem = (item, index, parentId) => {
|
|
23
24
|
const id = getItemId ? getItemId(item) : item.id;
|
|
24
25
|
if (id == null) {
|
|
@@ -36,10 +37,11 @@ const updateState = ({
|
|
|
36
37
|
label,
|
|
37
38
|
index,
|
|
38
39
|
parentId,
|
|
39
|
-
idAttribute:
|
|
40
|
+
idAttribute: undefined,
|
|
40
41
|
expandable: !!item.children?.length,
|
|
41
42
|
disabled: isItemDisabled ? isItemDisabled(item) : false
|
|
42
43
|
};
|
|
44
|
+
itemMap[id] = item;
|
|
43
45
|
return {
|
|
44
46
|
id,
|
|
45
47
|
children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
|
|
@@ -48,16 +50,19 @@ const updateState = ({
|
|
|
48
50
|
const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
|
|
49
51
|
return {
|
|
50
52
|
nodeMap,
|
|
51
|
-
nodeTree
|
|
53
|
+
nodeTree,
|
|
54
|
+
itemMap
|
|
52
55
|
};
|
|
53
56
|
};
|
|
54
57
|
const useTreeViewNodes = ({
|
|
55
58
|
instance,
|
|
59
|
+
publicAPI,
|
|
56
60
|
params,
|
|
57
61
|
state,
|
|
58
62
|
setState
|
|
59
63
|
}) => {
|
|
60
|
-
const getNode = React.useCallback(nodeId => state.nodeMap[nodeId], [state.nodeMap]);
|
|
64
|
+
const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
|
|
65
|
+
const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
|
|
61
66
|
const isNodeDisabled = React.useCallback(nodeId => {
|
|
62
67
|
if (nodeId == null) {
|
|
63
68
|
return false;
|
|
@@ -79,7 +84,7 @@ const useTreeViewNodes = ({
|
|
|
79
84
|
}
|
|
80
85
|
return false;
|
|
81
86
|
}, [instance]);
|
|
82
|
-
const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
|
|
87
|
+
const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodes.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
|
|
83
88
|
const getNavigableChildrenIds = nodeId => {
|
|
84
89
|
let childrenIds = instance.getChildrenIds(nodeId);
|
|
85
90
|
if (!params.disabledItemsFocusable) {
|
|
@@ -89,28 +94,30 @@ const useTreeViewNodes = ({
|
|
|
89
94
|
};
|
|
90
95
|
React.useEffect(() => {
|
|
91
96
|
setState(prevState => {
|
|
92
|
-
const newState =
|
|
97
|
+
const newState = updateNodesState({
|
|
93
98
|
items: params.items,
|
|
94
99
|
isItemDisabled: params.isItemDisabled,
|
|
95
100
|
getItemId: params.getItemId,
|
|
96
101
|
getItemLabel: params.getItemLabel
|
|
97
102
|
});
|
|
98
|
-
Object.values(prevState.nodeMap).forEach(node => {
|
|
103
|
+
Object.values(prevState.nodes.nodeMap).forEach(node => {
|
|
99
104
|
if (!newState.nodeMap[node.id]) {
|
|
100
105
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
|
|
101
106
|
id: node.id
|
|
102
107
|
});
|
|
103
108
|
}
|
|
104
109
|
});
|
|
105
|
-
return (0, _extends2.default)({}, prevState,
|
|
110
|
+
return (0, _extends2.default)({}, prevState, {
|
|
111
|
+
nodes: newState
|
|
112
|
+
});
|
|
106
113
|
});
|
|
107
114
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
108
|
-
const getNodesToRender = (
|
|
115
|
+
const getNodesToRender = () => {
|
|
109
116
|
const getPropsFromNodeId = ({
|
|
110
117
|
id,
|
|
111
118
|
children
|
|
112
119
|
}) => {
|
|
113
|
-
const node = state.nodeMap[id];
|
|
120
|
+
const node = state.nodes.nodeMap[id];
|
|
114
121
|
return {
|
|
115
122
|
label: node.label,
|
|
116
123
|
nodeId: node.id,
|
|
@@ -118,15 +125,19 @@ const useTreeViewNodes = ({
|
|
|
118
125
|
children: children?.map(getPropsFromNodeId)
|
|
119
126
|
};
|
|
120
127
|
};
|
|
121
|
-
return state.nodeTree.map(getPropsFromNodeId);
|
|
122
|
-
}
|
|
128
|
+
return state.nodes.nodeTree.map(getPropsFromNodeId);
|
|
129
|
+
};
|
|
123
130
|
(0, _useTreeView.populateInstance)(instance, {
|
|
124
131
|
getNode,
|
|
132
|
+
getItem,
|
|
125
133
|
getNodesToRender,
|
|
126
134
|
getChildrenIds,
|
|
127
135
|
getNavigableChildrenIds,
|
|
128
136
|
isNodeDisabled
|
|
129
137
|
});
|
|
138
|
+
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
139
|
+
getItem
|
|
140
|
+
});
|
|
130
141
|
return {
|
|
131
142
|
contextValue: {
|
|
132
143
|
disabledItemsFocusable: params.disabledItemsFocusable
|
|
@@ -134,11 +145,13 @@ const useTreeViewNodes = ({
|
|
|
134
145
|
};
|
|
135
146
|
};
|
|
136
147
|
exports.useTreeViewNodes = useTreeViewNodes;
|
|
137
|
-
useTreeViewNodes.getInitialState = params =>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
148
|
+
useTreeViewNodes.getInitialState = params => ({
|
|
149
|
+
nodes: updateNodesState({
|
|
150
|
+
items: params.items,
|
|
151
|
+
isItemDisabled: params.isItemDisabled,
|
|
152
|
+
getItemId: params.getItemId,
|
|
153
|
+
getItemLabel: params.getItemLabel
|
|
154
|
+
})
|
|
142
155
|
});
|
|
143
156
|
useTreeViewNodes.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
144
157
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "7.0.0-beta.
|
|
3
|
+
"version": "7.0.0-beta.7",
|
|
4
4
|
"description": "The community edition of the tree view components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"directory": "packages/x-tree-view"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@babel/runtime": "^7.
|
|
35
|
+
"@babel/runtime": "^7.24.0",
|
|
36
36
|
"@mui/base": "^5.0.0-beta.36",
|
|
37
37
|
"@mui/system": "^5.15.9",
|
|
38
38
|
"@mui/utils": "^5.15.9",
|
|
@@ -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>;
|