@mui/x-tree-view 7.7.1 → 7.9.0
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 +166 -1
- package/RichTreeView/RichTreeView.js +12 -5
- package/SimpleTreeView/SimpleTreeView.js +12 -5
- package/TreeItem/TreeItem.js +19 -4
- package/TreeItem/TreeItemContent.js +5 -2
- package/TreeItem/useTreeItemState.d.ts +1 -0
- package/TreeItem/useTreeItemState.js +21 -4
- package/TreeItem2/TreeItem2.d.ts +3 -3
- package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -1
- package/TreeView/TreeView.js +12 -5
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
- package/index.js +1 -1
- package/internals/hooks/useInstanceEventHandler.d.ts +2 -2
- package/internals/models/plugin.d.ts +5 -1
- package/internals/models/treeView.d.ts +1 -3
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +17 -7
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -2
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +25 -16
- package/internals/useTreeView/useTreeViewModels.d.ts +1 -1
- package/internals/utils/cleanupTracking/TimerBasedCleanupTracking.d.ts +0 -1
- package/internals/utils/publishTreeViewEvent.d.ts +1 -1
- package/internals/utils/warning.d.ts +1 -1
- package/modern/RichTreeView/RichTreeView.js +12 -5
- package/modern/SimpleTreeView/SimpleTreeView.js +12 -5
- package/modern/TreeItem/TreeItem.js +19 -4
- package/modern/TreeItem/TreeItemContent.js +5 -2
- package/modern/TreeItem/useTreeItemState.js +21 -4
- package/modern/TreeView/TreeView.js +12 -5
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
- package/modern/index.js +1 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
- package/modern/useTreeItem2/useTreeItem2.js +18 -2
- package/node/RichTreeView/RichTreeView.js +12 -5
- package/node/SimpleTreeView/SimpleTreeView.js +12 -5
- package/node/TreeItem/TreeItem.js +19 -4
- package/node/TreeItem/TreeItemContent.js +5 -2
- package/node/TreeItem/useTreeItemState.js +21 -4
- package/node/TreeView/TreeView.js +12 -5
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
- package/node/index.js +1 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
- package/node/useTreeItem2/useTreeItem2.js +18 -2
- package/package.json +3 -3
- package/useTreeItem2/useTreeItem2.d.ts +2 -2
- package/useTreeItem2/useTreeItem2.js +18 -2
- package/useTreeItem2/useTreeItem2.types.d.ts +3 -0
package/node/index.js
CHANGED
|
@@ -62,6 +62,12 @@ const useTreeViewExpansion = ({
|
|
|
62
62
|
setExpandedItems(event, newExpanded);
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
|
+
const expansionTrigger = React.useMemo(() => {
|
|
66
|
+
if (params.expansionTrigger) {
|
|
67
|
+
return params.expansionTrigger;
|
|
68
|
+
}
|
|
69
|
+
return 'content';
|
|
70
|
+
}, [params.expansionTrigger]);
|
|
65
71
|
return {
|
|
66
72
|
publicAPI: {
|
|
67
73
|
setItemExpansion
|
|
@@ -72,6 +78,11 @@ const useTreeViewExpansion = ({
|
|
|
72
78
|
setItemExpansion,
|
|
73
79
|
toggleItemExpansion,
|
|
74
80
|
expandAllSiblings
|
|
81
|
+
},
|
|
82
|
+
contextValue: {
|
|
83
|
+
expansion: {
|
|
84
|
+
expansionTrigger
|
|
85
|
+
}
|
|
75
86
|
}
|
|
76
87
|
};
|
|
77
88
|
};
|
|
@@ -89,5 +100,6 @@ useTreeViewExpansion.params = {
|
|
|
89
100
|
expandedItems: true,
|
|
90
101
|
defaultExpandedItems: true,
|
|
91
102
|
onExpandedItemsChange: true,
|
|
92
|
-
onItemExpansionToggle: true
|
|
103
|
+
onItemExpansionToggle: true,
|
|
104
|
+
expansionTrigger: true
|
|
93
105
|
};
|
|
@@ -52,8 +52,7 @@ const useTreeViewFocus = ({
|
|
|
52
52
|
return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
|
|
53
53
|
};
|
|
54
54
|
const innerFocusItem = (event, itemId) => {
|
|
55
|
-
const
|
|
56
|
-
const itemElement = document.getElementById(instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute));
|
|
55
|
+
const itemElement = instance.getItemDOMElement(itemId);
|
|
57
56
|
if (itemElement) {
|
|
58
57
|
itemElement.focus();
|
|
59
58
|
}
|
|
@@ -101,6 +101,13 @@ const useTreeViewItems = ({
|
|
|
101
101
|
return state.items.itemChildrenIndexes[parentId][itemId];
|
|
102
102
|
}, [instance, state.items.itemChildrenIndexes]);
|
|
103
103
|
const getItemOrderedChildrenIds = React.useCallback(itemId => state.items.itemOrderedChildrenIds[itemId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID] ?? [], [state.items.itemOrderedChildrenIds]);
|
|
104
|
+
const getItemDOMElement = itemId => {
|
|
105
|
+
const itemMeta = instance.getItemMeta(itemId);
|
|
106
|
+
if (itemMeta == null) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return document.getElementById(instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute));
|
|
110
|
+
};
|
|
104
111
|
const isItemNavigable = itemId => {
|
|
105
112
|
if (params.disabledItemsFocusable) {
|
|
106
113
|
return true;
|
|
@@ -154,13 +161,15 @@ const useTreeViewItems = ({
|
|
|
154
161
|
}
|
|
155
162
|
}),
|
|
156
163
|
publicAPI: {
|
|
157
|
-
getItem
|
|
164
|
+
getItem,
|
|
165
|
+
getItemDOMElement
|
|
158
166
|
},
|
|
159
167
|
instance: {
|
|
160
168
|
getItemMeta,
|
|
161
169
|
getItem,
|
|
162
170
|
getItemsToRender,
|
|
163
171
|
getItemIndex,
|
|
172
|
+
getItemDOMElement,
|
|
164
173
|
getItemOrderedChildrenIds,
|
|
165
174
|
isItemDisabled,
|
|
166
175
|
isItemNavigable,
|
package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -83,10 +83,13 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
83
83
|
event.preventDefault();
|
|
84
84
|
if (params.multiSelect && event.shiftKey) {
|
|
85
85
|
instance.expandSelectionRange(event, itemId);
|
|
86
|
-
} else if (params.multiSelect) {
|
|
87
|
-
instance.selectItem(event, itemId, true);
|
|
88
86
|
} else {
|
|
89
|
-
instance.selectItem(
|
|
87
|
+
instance.selectItem({
|
|
88
|
+
event,
|
|
89
|
+
itemId,
|
|
90
|
+
keepExistingSelection: params.multiSelect,
|
|
91
|
+
shouldBeSelected: params.multiSelect ? undefined : true
|
|
92
|
+
});
|
|
90
93
|
}
|
|
91
94
|
break;
|
|
92
95
|
}
|
|
@@ -101,9 +104,16 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
101
104
|
} else if (canToggleItemSelection(itemId)) {
|
|
102
105
|
if (params.multiSelect) {
|
|
103
106
|
event.preventDefault();
|
|
104
|
-
instance.selectItem(
|
|
107
|
+
instance.selectItem({
|
|
108
|
+
event,
|
|
109
|
+
itemId,
|
|
110
|
+
keepExistingSelection: true
|
|
111
|
+
});
|
|
105
112
|
} else if (!instance.isItemSelected(itemId)) {
|
|
106
|
-
instance.selectItem(
|
|
113
|
+
instance.selectItem({
|
|
114
|
+
event,
|
|
115
|
+
itemId
|
|
116
|
+
});
|
|
107
117
|
event.preventDefault();
|
|
108
118
|
}
|
|
109
119
|
}
|
|
@@ -55,7 +55,12 @@ const useTreeViewSelection = ({
|
|
|
55
55
|
models.selectedItems.setControlledValue(newSelectedItems);
|
|
56
56
|
};
|
|
57
57
|
const isItemSelected = itemId => selectedItemsMap.has(itemId);
|
|
58
|
-
const selectItem = (
|
|
58
|
+
const selectItem = ({
|
|
59
|
+
event,
|
|
60
|
+
itemId,
|
|
61
|
+
keepExistingSelection = false,
|
|
62
|
+
shouldBeSelected
|
|
63
|
+
}) => {
|
|
59
64
|
if (params.disableSelection) {
|
|
60
65
|
return;
|
|
61
66
|
}
|
|
@@ -63,16 +68,16 @@ const useTreeViewSelection = ({
|
|
|
63
68
|
if (keepExistingSelection) {
|
|
64
69
|
const cleanSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value);
|
|
65
70
|
const isSelectedBefore = instance.isItemSelected(itemId);
|
|
66
|
-
if (isSelectedBefore && (
|
|
71
|
+
if (isSelectedBefore && (shouldBeSelected === false || shouldBeSelected == null)) {
|
|
67
72
|
newSelected = cleanSelectedItems.filter(id => id !== itemId);
|
|
68
|
-
} else if (!isSelectedBefore && (
|
|
73
|
+
} else if (!isSelectedBefore && (shouldBeSelected === true || shouldBeSelected == null)) {
|
|
69
74
|
newSelected = [itemId].concat(cleanSelectedItems);
|
|
70
75
|
} else {
|
|
71
76
|
newSelected = cleanSelectedItems;
|
|
72
77
|
}
|
|
73
78
|
} else {
|
|
74
79
|
// eslint-disable-next-line no-lonely-if
|
|
75
|
-
if (
|
|
80
|
+
if (shouldBeSelected === false || shouldBeSelected == null && instance.isItemSelected(itemId)) {
|
|
76
81
|
newSelected = params.multiSelect ? [] : null;
|
|
77
82
|
} else {
|
|
78
83
|
newSelected = params.multiSelect ? [itemId] : itemId;
|
|
@@ -151,6 +156,9 @@ const useTreeViewSelection = ({
|
|
|
151
156
|
getRootProps: () => ({
|
|
152
157
|
'aria-multiselectable': params.multiSelect
|
|
153
158
|
}),
|
|
159
|
+
publicAPI: {
|
|
160
|
+
selectItem
|
|
161
|
+
},
|
|
154
162
|
instance: {
|
|
155
163
|
isItemSelected,
|
|
156
164
|
selectItem,
|
|
@@ -22,6 +22,9 @@ const useTreeItem2 = parameters => {
|
|
|
22
22
|
disableSelection,
|
|
23
23
|
checkboxSelection
|
|
24
24
|
},
|
|
25
|
+
expansion: {
|
|
26
|
+
expansionTrigger
|
|
27
|
+
},
|
|
25
28
|
disabledItemsFocusable,
|
|
26
29
|
indentationAtItemLevel,
|
|
27
30
|
instance,
|
|
@@ -78,7 +81,9 @@ const useTreeItem2 = parameters => {
|
|
|
78
81
|
if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
|
|
79
82
|
return;
|
|
80
83
|
}
|
|
81
|
-
|
|
84
|
+
if (expansionTrigger === 'content') {
|
|
85
|
+
interactions.handleExpansion(event);
|
|
86
|
+
}
|
|
82
87
|
if (!checkboxSelection) {
|
|
83
88
|
interactions.handleSelection(event);
|
|
84
89
|
}
|
|
@@ -104,6 +109,15 @@ const useTreeItem2 = parameters => {
|
|
|
104
109
|
}
|
|
105
110
|
interactions.handleCheckboxSelection(event);
|
|
106
111
|
};
|
|
112
|
+
const createIconContainerHandleClick = otherHandlers => event => {
|
|
113
|
+
otherHandlers.onClick?.(event);
|
|
114
|
+
if (event.defaultMuiPrevented) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (expansionTrigger === 'iconContainer') {
|
|
118
|
+
interactions.handleExpansion(event);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
107
121
|
const getRootProps = (externalProps = {}) => {
|
|
108
122
|
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
109
123
|
let ariaSelected;
|
|
@@ -171,7 +185,9 @@ const useTreeItem2 = parameters => {
|
|
|
171
185
|
};
|
|
172
186
|
const getIconContainerProps = (externalProps = {}) => {
|
|
173
187
|
const externalEventHandlers = (0, _utils.extractEventHandlers)(externalProps);
|
|
174
|
-
return (0, _extends2.default)({}, externalEventHandlers, externalProps
|
|
188
|
+
return (0, _extends2.default)({}, externalEventHandlers, externalProps, {
|
|
189
|
+
onClick: createIconContainerHandleClick(externalEventHandlers)
|
|
190
|
+
});
|
|
175
191
|
};
|
|
176
192
|
const getGroupTransitionProps = (externalProps = {}) => {
|
|
177
193
|
const externalEventHandlers = (0, _utils.extractEventHandlers)(externalProps);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.9.0",
|
|
4
4
|
"description": "The community edition of the Tree View components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@babel/runtime": "^7.24.7",
|
|
37
37
|
"@mui/base": "^5.0.0-beta.40",
|
|
38
|
-
"@mui/system": "^5.
|
|
39
|
-
"@mui/utils": "^5.
|
|
38
|
+
"@mui/system": "^5.16.0",
|
|
39
|
+
"@mui/utils": "^5.16.0",
|
|
40
40
|
"@types/react-transition-group": "^4.4.10",
|
|
41
41
|
"clsx": "^2.1.1",
|
|
42
42
|
"prop-types": "^15.8.1",
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2MinimalPlugins } from './useTreeItem2.types';
|
|
2
|
-
export declare const useTreeItem2: <TSignatures extends UseTreeItem2MinimalPlugins = UseTreeItem2MinimalPlugins, TOptionalSignatures extends
|
|
1
|
+
import { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2MinimalPlugins, UseTreeItem2OptionalPlugins } from './useTreeItem2.types';
|
|
2
|
+
export declare const useTreeItem2: <TSignatures extends UseTreeItem2MinimalPlugins = UseTreeItem2MinimalPlugins, TOptionalSignatures extends UseTreeItem2OptionalPlugins = readonly []>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TSignatures, TOptionalSignatures>;
|
|
@@ -13,6 +13,9 @@ export const useTreeItem2 = parameters => {
|
|
|
13
13
|
disableSelection,
|
|
14
14
|
checkboxSelection
|
|
15
15
|
},
|
|
16
|
+
expansion: {
|
|
17
|
+
expansionTrigger
|
|
18
|
+
},
|
|
16
19
|
disabledItemsFocusable,
|
|
17
20
|
indentationAtItemLevel,
|
|
18
21
|
instance,
|
|
@@ -69,7 +72,9 @@ export const useTreeItem2 = parameters => {
|
|
|
69
72
|
if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
|
|
70
73
|
return;
|
|
71
74
|
}
|
|
72
|
-
|
|
75
|
+
if (expansionTrigger === 'content') {
|
|
76
|
+
interactions.handleExpansion(event);
|
|
77
|
+
}
|
|
73
78
|
if (!checkboxSelection) {
|
|
74
79
|
interactions.handleSelection(event);
|
|
75
80
|
}
|
|
@@ -95,6 +100,15 @@ export const useTreeItem2 = parameters => {
|
|
|
95
100
|
}
|
|
96
101
|
interactions.handleCheckboxSelection(event);
|
|
97
102
|
};
|
|
103
|
+
const createIconContainerHandleClick = otherHandlers => event => {
|
|
104
|
+
otherHandlers.onClick?.(event);
|
|
105
|
+
if (event.defaultMuiPrevented) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (expansionTrigger === 'iconContainer') {
|
|
109
|
+
interactions.handleExpansion(event);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
98
112
|
const getRootProps = (externalProps = {}) => {
|
|
99
113
|
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
100
114
|
let ariaSelected;
|
|
@@ -162,7 +176,9 @@ export const useTreeItem2 = parameters => {
|
|
|
162
176
|
};
|
|
163
177
|
const getIconContainerProps = (externalProps = {}) => {
|
|
164
178
|
const externalEventHandlers = extractEventHandlers(externalProps);
|
|
165
|
-
return _extends({}, externalEventHandlers, externalProps
|
|
179
|
+
return _extends({}, externalEventHandlers, externalProps, {
|
|
180
|
+
onClick: createIconContainerHandleClick(externalEventHandlers)
|
|
181
|
+
});
|
|
166
182
|
};
|
|
167
183
|
const getGroupTransitionProps = (externalProps = {}) => {
|
|
168
184
|
const externalEventHandlers = extractEventHandlers(externalProps);
|
|
@@ -6,6 +6,7 @@ import { UseTreeViewSelectionSignature } from '../internals/plugins/useTreeViewS
|
|
|
6
6
|
import { UseTreeViewItemsSignature } from '../internals/plugins/useTreeViewItems';
|
|
7
7
|
import { UseTreeViewFocusSignature } from '../internals/plugins/useTreeViewFocus';
|
|
8
8
|
import { UseTreeViewKeyboardNavigationSignature } from '../internals/plugins/useTreeViewKeyboardNavigation';
|
|
9
|
+
import { UseTreeViewExpansionSignature } from '../internals/plugins/useTreeViewExpansion';
|
|
9
10
|
export interface UseTreeItem2Parameters {
|
|
10
11
|
/**
|
|
11
12
|
* The id attribute of the item. If not provided, it will be generated.
|
|
@@ -60,6 +61,7 @@ export interface UseTreeItem2ContentSlotOwnProps {
|
|
|
60
61
|
}
|
|
61
62
|
export type UseTreeItem2ContentSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2ContentSlotOwnProps;
|
|
62
63
|
export interface UseTreeItem2IconContainerSlotOwnProps {
|
|
64
|
+
onClick: MuiCancellableEventHandler<React.MouseEvent>;
|
|
63
65
|
}
|
|
64
66
|
export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2IconContainerSlotOwnProps;
|
|
65
67
|
export interface UseTreeItem2LabelSlotOwnProps {
|
|
@@ -149,6 +151,7 @@ export interface UseTreeItem2ReturnValue<TSignatures extends UseTreeItem2Minimal
|
|
|
149
151
|
*/
|
|
150
152
|
export type UseTreeItem2MinimalPlugins = readonly [
|
|
151
153
|
UseTreeViewSelectionSignature,
|
|
154
|
+
UseTreeViewExpansionSignature,
|
|
152
155
|
UseTreeViewItemsSignature,
|
|
153
156
|
UseTreeViewFocusSignature,
|
|
154
157
|
UseTreeViewKeyboardNavigationSignature
|