@mui/x-tree-view 7.0.0-beta.7 → 7.1.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 +266 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +15 -17
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +3 -4
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/TreeItem/TreeItem.js +43 -35
- package/TreeItem/TreeItem.types.d.ts +3 -3
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.js +16 -17
- package/TreeItem2Icon/TreeItem2Icon.js +5 -6
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
- package/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +1 -1
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
- package/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/index.d.ts +2 -2
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/defaultPlugins.d.ts +3 -3
- package/internals/plugins/defaultPlugins.js +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +17 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +76 -58
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +2 -2
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewItems/index.js +1 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js → internals/plugins/useTreeViewItems/useTreeViewItems.js} +42 -33
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +99 -0
- package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -40
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -96
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +6 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +44 -47
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +8 -8
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/internals/useTreeView/useTreeView.js +5 -6
- package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
- package/internals/useTreeView/useTreeView.utils.js +18 -18
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +11 -11
- package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/modern/TreeItem/TreeItem.js +31 -22
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +11 -11
- package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/modern/TreeView/TreeView.js +1 -1
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
- package/{internals/plugins/useTreeViewNodes/useTreeViewNodes.js → modern/internals/plugins/useTreeViewItems/useTreeViewItems.js} +46 -41
- package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -41
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -94
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +40 -40
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/modern/internals/useTreeView/useTreeView.js +3 -4
- package/modern/internals/useTreeView/useTreeView.utils.js +18 -18
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +23 -12
- package/node/RichTreeView/RichTreeView.js +11 -11
- package/node/SimpleTreeView/SimpleTreeView.js +1 -1
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/node/TreeItem/TreeItem.js +31 -22
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +11 -11
- package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/node/TreeView/TreeView.js +1 -1
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -35
- package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +43 -42
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +84 -93
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +39 -39
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/node/internals/useTreeView/useTreeView.js +3 -4
- package/node/internals/useTreeView/useTreeView.utils.js +23 -23
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/useTreeItem2.js +23 -12
- package/package.json +5 -5
- package/useTreeItem2/useTreeItem2.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +26 -18
- package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
- package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
- package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +0 -88
- package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
- package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
- /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
|
@@ -73,10 +73,10 @@ export const useTreeView = inParams => {
|
|
|
73
73
|
rootRef: finalRootRef,
|
|
74
74
|
contentRef: finalContentRef
|
|
75
75
|
});
|
|
76
|
-
if (itemPluginResponse
|
|
76
|
+
if (itemPluginResponse?.rootRef) {
|
|
77
77
|
finalRootRef = itemPluginResponse.rootRef;
|
|
78
78
|
}
|
|
79
|
-
if (itemPluginResponse
|
|
79
|
+
if (itemPluginResponse?.contentRef) {
|
|
80
80
|
finalContentRef = itemPluginResponse.contentRef;
|
|
81
81
|
}
|
|
82
82
|
});
|
|
@@ -87,13 +87,13 @@ export const useTreeView = inParams => {
|
|
|
87
87
|
};
|
|
88
88
|
const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
|
|
89
89
|
contextValue.wrapItem = ({
|
|
90
|
-
|
|
90
|
+
itemId,
|
|
91
91
|
children
|
|
92
92
|
}) => {
|
|
93
93
|
let finalChildren = children;
|
|
94
94
|
itemWrappers.forEach(itemWrapper => {
|
|
95
95
|
finalChildren = itemWrapper({
|
|
96
|
-
|
|
96
|
+
itemId,
|
|
97
97
|
children: finalChildren
|
|
98
98
|
});
|
|
99
99
|
});
|
|
@@ -101,8 +101,7 @@ export const useTreeView = inParams => {
|
|
|
101
101
|
};
|
|
102
102
|
const getRootProps = (otherHandlers = {}) => {
|
|
103
103
|
const rootProps = _extends({
|
|
104
|
-
role: 'tree'
|
|
105
|
-
tabIndex: 0
|
|
104
|
+
role: 'tree'
|
|
106
105
|
}, otherHandlers, {
|
|
107
106
|
ref: handleRootRef
|
|
108
107
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TreeViewAnyPluginSignature, TreeViewInstance, TreeViewUsedInstance, TreeViewUsedPublicAPI } from '../models';
|
|
2
2
|
import type { UseTreeViewExpansionSignature } from '../plugins/useTreeViewExpansion';
|
|
3
|
-
import type {
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
3
|
+
import type { UseTreeViewItemsSignature } from '../plugins/useTreeViewItems';
|
|
4
|
+
export declare const getPreviousItem: (instance: TreeViewInstance<[UseTreeViewItemsSignature, UseTreeViewExpansionSignature]>, itemId: string) => string | null;
|
|
5
|
+
export declare const getNextItem: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewItemsSignature]>, itemId: string) => string | null;
|
|
6
|
+
export declare const getLastItem: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewItemsSignature]>) => string;
|
|
7
|
+
export declare const getFirstItem: (instance: TreeViewInstance<[UseTreeViewItemsSignature]>) => string;
|
|
8
8
|
export declare const populateInstance: <T extends TreeViewAnyPluginSignature>(instance: TreeViewUsedInstance<T>, methods: T["instance"]) => void;
|
|
9
9
|
export declare const populatePublicAPI: <T extends TreeViewAnyPluginSignature>(publicAPI: TreeViewUsedPublicAPI<T>, methods: T["publicAPI"]) => void;
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export const
|
|
2
|
-
const node = instance.getNode(
|
|
1
|
+
export const getPreviousItem = (instance, itemId) => {
|
|
2
|
+
const node = instance.getNode(itemId);
|
|
3
3
|
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
4
|
-
const
|
|
5
|
-
if (
|
|
4
|
+
const itemIndex = siblings.indexOf(itemId);
|
|
5
|
+
if (itemIndex === 0) {
|
|
6
6
|
return node.parentId;
|
|
7
7
|
}
|
|
8
|
-
let
|
|
9
|
-
while (instance.
|
|
10
|
-
|
|
8
|
+
let currentItem = siblings[itemIndex - 1];
|
|
9
|
+
while (instance.isItemExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
|
|
10
|
+
currentItem = instance.getNavigableChildrenIds(currentItem).pop();
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return currentItem;
|
|
13
13
|
};
|
|
14
|
-
export const
|
|
14
|
+
export const getNextItem = (instance, itemId) => {
|
|
15
15
|
// If expanded get first child
|
|
16
|
-
if (instance.
|
|
17
|
-
return instance.getNavigableChildrenIds(
|
|
16
|
+
if (instance.isItemExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
|
|
17
|
+
return instance.getNavigableChildrenIds(itemId)[0];
|
|
18
18
|
}
|
|
19
|
-
let node = instance.getNode(
|
|
19
|
+
let node = instance.getNode(itemId);
|
|
20
20
|
while (node != null) {
|
|
21
21
|
// Try to get next sibling
|
|
22
22
|
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
@@ -30,14 +30,14 @@ export const getNextNode = (instance, nodeId) => {
|
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
};
|
|
33
|
-
export const
|
|
34
|
-
let
|
|
35
|
-
while (instance.
|
|
36
|
-
|
|
33
|
+
export const getLastItem = instance => {
|
|
34
|
+
let lastItem = instance.getNavigableChildrenIds(null).pop();
|
|
35
|
+
while (instance.isItemExpanded(lastItem)) {
|
|
36
|
+
lastItem = instance.getNavigableChildrenIds(lastItem).pop();
|
|
37
37
|
}
|
|
38
|
-
return
|
|
38
|
+
return lastItem;
|
|
39
39
|
};
|
|
40
|
-
export const
|
|
40
|
+
export const getFirstItem = instance => instance.getNavigableChildrenIds(null)[0];
|
|
41
41
|
export const populateInstance = (instance, methods) => {
|
|
42
42
|
Object.assign(instance, methods);
|
|
43
43
|
};
|
|
@@ -18,8 +18,8 @@ export const extractPluginParamsFromProps = _ref => {
|
|
|
18
18
|
const pluginParams = {
|
|
19
19
|
plugins,
|
|
20
20
|
rootRef,
|
|
21
|
-
slots: slots
|
|
22
|
-
slotProps: slotProps
|
|
21
|
+
slots: slots ?? {},
|
|
22
|
+
slotProps: slotProps ?? {},
|
|
23
23
|
apiRef
|
|
24
24
|
};
|
|
25
25
|
const otherProps = {};
|
package/internals/utils/utils.js
CHANGED
|
@@ -36,7 +36,7 @@ function WrappedTreeItem({
|
|
|
36
36
|
slotProps,
|
|
37
37
|
label,
|
|
38
38
|
id,
|
|
39
|
-
|
|
39
|
+
itemId,
|
|
40
40
|
children
|
|
41
41
|
}) {
|
|
42
42
|
const Item = slots?.item ?? TreeItem;
|
|
@@ -44,12 +44,12 @@ function WrappedTreeItem({
|
|
|
44
44
|
elementType: Item,
|
|
45
45
|
externalSlotProps: slotProps?.item,
|
|
46
46
|
additionalProps: {
|
|
47
|
-
|
|
47
|
+
itemId,
|
|
48
48
|
id,
|
|
49
49
|
label
|
|
50
50
|
},
|
|
51
51
|
ownerState: {
|
|
52
|
-
|
|
52
|
+
itemId,
|
|
53
53
|
label
|
|
54
54
|
}
|
|
55
55
|
});
|
|
@@ -57,7 +57,7 @@ function WrappedTreeItem({
|
|
|
57
57
|
children: children
|
|
58
58
|
}));
|
|
59
59
|
}
|
|
60
|
-
const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://
|
|
60
|
+
const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/items/']);
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
*
|
|
@@ -104,10 +104,10 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
104
104
|
getSlotProps: getRootProps,
|
|
105
105
|
ownerState: props
|
|
106
106
|
});
|
|
107
|
-
const
|
|
108
|
-
const
|
|
107
|
+
const itemsToRender = instance.getItemsToRender();
|
|
108
|
+
const renderItem = ({
|
|
109
109
|
label,
|
|
110
|
-
|
|
110
|
+
itemId,
|
|
111
111
|
id,
|
|
112
112
|
children
|
|
113
113
|
}) => {
|
|
@@ -116,14 +116,14 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
116
116
|
slotProps: slotProps,
|
|
117
117
|
label: label,
|
|
118
118
|
id: id,
|
|
119
|
-
|
|
120
|
-
children: children?.map(
|
|
121
|
-
},
|
|
119
|
+
itemId: itemId,
|
|
120
|
+
children: children?.map(renderItem)
|
|
121
|
+
}, itemId);
|
|
122
122
|
};
|
|
123
123
|
return /*#__PURE__*/_jsx(TreeViewProvider, {
|
|
124
124
|
value: contextValue,
|
|
125
125
|
children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {
|
|
126
|
-
children:
|
|
126
|
+
children: itemsToRender.map(renderItem)
|
|
127
127
|
}))
|
|
128
128
|
});
|
|
129
129
|
});
|
|
@@ -31,7 +31,7 @@ export const SimpleTreeViewRoot = styled('ul', {
|
|
|
31
31
|
outline: 0
|
|
32
32
|
});
|
|
33
33
|
const EMPTY_ITEMS = [];
|
|
34
|
-
const itemsPropWarning = buildWarning(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://
|
|
34
|
+
const itemsPropWarning = buildWarning(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/']);
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_TREE_VIEW_PLUGINS } from '../internals/plugins/defaultPlugins';
|
|
2
|
-
import {
|
|
3
|
-
export const SIMPLE_TREE_VIEW_PLUGINS = [...DEFAULT_TREE_VIEW_PLUGINS,
|
|
2
|
+
import { useTreeViewJSXItems } from '../internals/plugins/useTreeViewJSXItems';
|
|
3
|
+
export const SIMPLE_TREE_VIEW_PLUGINS = [...DEFAULT_TREE_VIEW_PLUGINS, useTreeViewJSXItems];
|
|
4
4
|
|
|
5
5
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
-
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "
|
|
3
|
+
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
|
|
4
4
|
_excluded2 = ["ownerState"],
|
|
5
5
|
_excluded3 = ["ownerState"],
|
|
6
6
|
_excluded4 = ["ownerState"];
|
|
@@ -157,11 +157,13 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
157
157
|
slotProps: inSlotProps,
|
|
158
158
|
ContentComponent = TreeItemContent,
|
|
159
159
|
ContentProps,
|
|
160
|
-
|
|
160
|
+
itemId,
|
|
161
161
|
id,
|
|
162
162
|
label,
|
|
163
163
|
onClick,
|
|
164
|
-
onMouseDown
|
|
164
|
+
onMouseDown,
|
|
165
|
+
onBlur,
|
|
166
|
+
onKeyDown
|
|
165
167
|
} = props,
|
|
166
168
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
167
169
|
const {
|
|
@@ -184,10 +186,10 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
184
186
|
return Boolean(reactChildren);
|
|
185
187
|
};
|
|
186
188
|
const expandable = isExpandable(children);
|
|
187
|
-
const expanded = instance.
|
|
188
|
-
const focused = instance.
|
|
189
|
-
const selected = instance.
|
|
190
|
-
const disabled = instance.
|
|
189
|
+
const expanded = instance.isItemExpanded(itemId);
|
|
190
|
+
const focused = instance.isItemFocused(itemId);
|
|
191
|
+
const selected = instance.isItemSelected(itemId);
|
|
192
|
+
const disabled = instance.isItemDisabled(itemId);
|
|
191
193
|
const ownerState = _extends({}, props, {
|
|
192
194
|
expanded,
|
|
193
195
|
focused,
|
|
@@ -249,24 +251,29 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
249
251
|
/* single-selection trees unset aria-selected on un-selected items.
|
|
250
252
|
*
|
|
251
253
|
* If the tree does not support multiple selection, aria-selected
|
|
252
|
-
* is set to true for the selected
|
|
254
|
+
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
253
255
|
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
254
256
|
*/
|
|
255
257
|
ariaSelected = true;
|
|
256
258
|
}
|
|
257
259
|
function handleFocus(event) {
|
|
258
|
-
// DOM focus stays on the tree which manages focus with aria-activedescendant
|
|
259
|
-
if (event.target === event.currentTarget) {
|
|
260
|
-
instance.focusRoot();
|
|
261
|
-
}
|
|
262
260
|
const canBeFocused = !disabled || disabledItemsFocusable;
|
|
263
261
|
if (!focused && canBeFocused && event.currentTarget === event.target) {
|
|
264
|
-
instance.focusItem(event,
|
|
262
|
+
instance.focusItem(event, itemId);
|
|
265
263
|
}
|
|
266
264
|
}
|
|
267
|
-
|
|
265
|
+
function handleBlur(event) {
|
|
266
|
+
onBlur?.(event);
|
|
267
|
+
instance.removeFocusedItem();
|
|
268
|
+
}
|
|
269
|
+
const handleKeyDown = event => {
|
|
270
|
+
onKeyDown?.(event);
|
|
271
|
+
instance.handleItemKeyDown(event, itemId);
|
|
272
|
+
};
|
|
273
|
+
const idAttribute = instance.getTreeItemId(itemId, id);
|
|
274
|
+
const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
|
|
268
275
|
return /*#__PURE__*/_jsx(TreeItem2Provider, {
|
|
269
|
-
|
|
276
|
+
itemId: itemId,
|
|
270
277
|
children: /*#__PURE__*/_jsxs(TreeItemRoot, _extends({
|
|
271
278
|
className: clsx(classes.root, className),
|
|
272
279
|
role: "treeitem",
|
|
@@ -274,10 +281,12 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
274
281
|
"aria-selected": ariaSelected,
|
|
275
282
|
"aria-disabled": disabled || undefined,
|
|
276
283
|
id: idAttribute,
|
|
277
|
-
tabIndex:
|
|
284
|
+
tabIndex: tabIndex
|
|
278
285
|
}, other, {
|
|
279
286
|
ownerState: ownerState,
|
|
280
287
|
onFocus: handleFocus,
|
|
288
|
+
onBlur: handleBlur,
|
|
289
|
+
onKeyDown: handleKeyDown,
|
|
281
290
|
ref: handleRootRef,
|
|
282
291
|
children: [/*#__PURE__*/_jsx(StyledTreeItemContent, _extends({
|
|
283
292
|
as: ContentComponent,
|
|
@@ -291,7 +300,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
291
300
|
label: classes.label
|
|
292
301
|
},
|
|
293
302
|
label: label,
|
|
294
|
-
|
|
303
|
+
itemId: itemId,
|
|
295
304
|
onClick: onClick,
|
|
296
305
|
onMouseDown: onMouseDown,
|
|
297
306
|
icon: icon,
|
|
@@ -323,7 +332,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
323
332
|
classes: PropTypes.object,
|
|
324
333
|
className: PropTypes.string,
|
|
325
334
|
/**
|
|
326
|
-
* The component used
|
|
335
|
+
* The component used to render the content of the item.
|
|
327
336
|
* @default TreeItemContent
|
|
328
337
|
*/
|
|
329
338
|
ContentComponent: elementTypeAcceptingRef,
|
|
@@ -337,13 +346,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
337
346
|
*/
|
|
338
347
|
disabled: PropTypes.bool,
|
|
339
348
|
/**
|
|
340
|
-
* The
|
|
349
|
+
* The id of the item.
|
|
341
350
|
*/
|
|
342
|
-
|
|
351
|
+
itemId: PropTypes.string.isRequired,
|
|
343
352
|
/**
|
|
344
|
-
* The
|
|
353
|
+
* The tree item label.
|
|
345
354
|
*/
|
|
346
|
-
|
|
355
|
+
label: PropTypes.node,
|
|
347
356
|
/**
|
|
348
357
|
* This prop isn't supported.
|
|
349
358
|
* Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "
|
|
3
|
+
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import clsx from 'clsx';
|
|
@@ -18,7 +18,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
18
18
|
expansionIcon,
|
|
19
19
|
icon: iconProp,
|
|
20
20
|
label,
|
|
21
|
-
|
|
21
|
+
itemId,
|
|
22
22
|
onClick,
|
|
23
23
|
onMouseDown
|
|
24
24
|
} = props,
|
|
@@ -31,7 +31,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
31
31
|
handleExpansion,
|
|
32
32
|
handleSelection,
|
|
33
33
|
preventSelection
|
|
34
|
-
} = useTreeItemState(
|
|
34
|
+
} = useTreeItemState(itemId);
|
|
35
35
|
const icon = iconProp || expansionIcon || displayIcon;
|
|
36
36
|
const handleMouseDown = event => {
|
|
37
37
|
preventSelection(event);
|
|
@@ -75,24 +75,24 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
75
75
|
classes: PropTypes.object.isRequired,
|
|
76
76
|
className: PropTypes.string,
|
|
77
77
|
/**
|
|
78
|
-
* The icon to display next to the tree
|
|
78
|
+
* The icon to display next to the tree item's label. Either a parent or end icon.
|
|
79
79
|
*/
|
|
80
80
|
displayIcon: PropTypes.node,
|
|
81
81
|
/**
|
|
82
|
-
* The icon to display next to the tree
|
|
82
|
+
* The icon to display next to the tree item's label. Either an expansion or collapse icon.
|
|
83
83
|
*/
|
|
84
84
|
expansionIcon: PropTypes.node,
|
|
85
85
|
/**
|
|
86
|
-
* The icon to display next to the tree
|
|
86
|
+
* The icon to display next to the tree item's label.
|
|
87
87
|
*/
|
|
88
88
|
icon: PropTypes.node,
|
|
89
89
|
/**
|
|
90
|
-
* The
|
|
90
|
+
* The id of the item.
|
|
91
91
|
*/
|
|
92
|
-
|
|
92
|
+
itemId: PropTypes.string.isRequired,
|
|
93
93
|
/**
|
|
94
|
-
* The
|
|
94
|
+
* The tree item label.
|
|
95
95
|
*/
|
|
96
|
-
|
|
96
|
+
label: PropTypes.node
|
|
97
97
|
} : void 0;
|
|
98
98
|
export { TreeItemContent };
|
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
|
|
2
|
-
export function useTreeItemState(
|
|
2
|
+
export function useTreeItemState(itemId) {
|
|
3
3
|
const {
|
|
4
4
|
instance,
|
|
5
5
|
selection: {
|
|
6
6
|
multiSelect
|
|
7
7
|
}
|
|
8
8
|
} = useTreeViewContext();
|
|
9
|
-
const expandable = instance.
|
|
10
|
-
const expanded = instance.
|
|
11
|
-
const focused = instance.
|
|
12
|
-
const selected = instance.
|
|
13
|
-
const disabled = instance.
|
|
9
|
+
const expandable = instance.isItemExpandable(itemId);
|
|
10
|
+
const expanded = instance.isItemExpanded(itemId);
|
|
11
|
+
const focused = instance.isItemFocused(itemId);
|
|
12
|
+
const selected = instance.isItemSelected(itemId);
|
|
13
|
+
const disabled = instance.isItemDisabled(itemId);
|
|
14
14
|
const handleExpansion = event => {
|
|
15
15
|
if (!disabled) {
|
|
16
16
|
if (!focused) {
|
|
17
|
-
instance.focusItem(event,
|
|
17
|
+
instance.focusItem(event, itemId);
|
|
18
18
|
}
|
|
19
19
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
20
20
|
|
|
21
21
|
// If already expanded and trying to toggle selection don't close
|
|
22
|
-
if (expandable && !(multiple && instance.
|
|
23
|
-
instance.
|
|
22
|
+
if (expandable && !(multiple && instance.isItemExpanded(itemId))) {
|
|
23
|
+
instance.toggleItemExpansion(event, itemId);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
const handleSelection = event => {
|
|
28
28
|
if (!disabled) {
|
|
29
29
|
if (!focused) {
|
|
30
|
-
instance.focusItem(event,
|
|
30
|
+
instance.focusItem(event, itemId);
|
|
31
31
|
}
|
|
32
32
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
33
33
|
if (multiple) {
|
|
34
34
|
if (event.shiftKey) {
|
|
35
35
|
instance.selectRange(event, {
|
|
36
|
-
end:
|
|
36
|
+
end: itemId
|
|
37
37
|
});
|
|
38
38
|
} else {
|
|
39
|
-
instance.
|
|
39
|
+
instance.selectItem(event, itemId, true);
|
|
40
40
|
}
|
|
41
41
|
} else {
|
|
42
|
-
instance.
|
|
42
|
+
instance.selectItem(event, itemId);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
-
const _excluded = ["id", "
|
|
3
|
+
const _excluded = ["id", "itemId", "label", "disabled", "children", "slots", "slotProps"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import clsx from 'clsx';
|
|
@@ -165,7 +165,7 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
|
|
|
165
165
|
});
|
|
166
166
|
const {
|
|
167
167
|
id,
|
|
168
|
-
|
|
168
|
+
itemId,
|
|
169
169
|
label,
|
|
170
170
|
disabled,
|
|
171
171
|
children,
|
|
@@ -182,7 +182,7 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
|
|
|
182
182
|
status
|
|
183
183
|
} = useTreeItem2({
|
|
184
184
|
id,
|
|
185
|
-
|
|
185
|
+
itemId,
|
|
186
186
|
children,
|
|
187
187
|
label,
|
|
188
188
|
disabled
|
|
@@ -234,7 +234,7 @@ export const TreeItem2 = /*#__PURE__*/React.forwardRef(function TreeItem2(inProp
|
|
|
234
234
|
className: classes.groupTransition
|
|
235
235
|
});
|
|
236
236
|
return /*#__PURE__*/_jsx(TreeItem2Provider, {
|
|
237
|
-
|
|
237
|
+
itemId: itemId,
|
|
238
238
|
children: /*#__PURE__*/_jsxs(Root, _extends({}, rootProps, {
|
|
239
239
|
children: [/*#__PURE__*/_jsxs(Content, _extends({}, contentProps, {
|
|
240
240
|
children: [/*#__PURE__*/_jsx(IconContainer, _extends({}, iconContainerProps, {
|
|
@@ -265,23 +265,23 @@ process.env.NODE_ENV !== "production" ? TreeItem2.propTypes = {
|
|
|
265
265
|
classes: PropTypes.object,
|
|
266
266
|
className: PropTypes.string,
|
|
267
267
|
/**
|
|
268
|
-
* If `true`, the
|
|
268
|
+
* If `true`, the item is disabled.
|
|
269
269
|
* @default false
|
|
270
270
|
*/
|
|
271
271
|
disabled: PropTypes.bool,
|
|
272
272
|
/**
|
|
273
|
-
* The id attribute of the
|
|
273
|
+
* The id attribute of the item. If not provided, it will be generated.
|
|
274
274
|
*/
|
|
275
275
|
id: PropTypes.string,
|
|
276
276
|
/**
|
|
277
|
-
* The
|
|
277
|
+
* The id of the item.
|
|
278
|
+
* Must be unique.
|
|
278
279
|
*/
|
|
279
|
-
|
|
280
|
+
itemId: PropTypes.string.isRequired,
|
|
280
281
|
/**
|
|
281
|
-
* The
|
|
282
|
-
* Must be unique.
|
|
282
|
+
* The label of the item.
|
|
283
283
|
*/
|
|
284
|
-
|
|
284
|
+
label: PropTypes.node,
|
|
285
285
|
/**
|
|
286
286
|
* This prop isn't supported.
|
|
287
287
|
* Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
|
|
@@ -3,14 +3,14 @@ import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewCon
|
|
|
3
3
|
function TreeItem2Provider(props) {
|
|
4
4
|
const {
|
|
5
5
|
children,
|
|
6
|
-
|
|
6
|
+
itemId
|
|
7
7
|
} = props;
|
|
8
8
|
const {
|
|
9
9
|
wrapItem
|
|
10
10
|
} = useTreeViewContext();
|
|
11
11
|
return wrapItem({
|
|
12
12
|
children,
|
|
13
|
-
|
|
13
|
+
itemId
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
TreeItem2Provider.propTypes = {
|
|
@@ -19,6 +19,6 @@ TreeItem2Provider.propTypes = {
|
|
|
19
19
|
// | To update them edit the TypeScript types and run "yarn proptypes" |
|
|
20
20
|
// ----------------------------------------------------------------------
|
|
21
21
|
children: PropTypes.node,
|
|
22
|
-
|
|
22
|
+
itemId: PropTypes.string.isRequired
|
|
23
23
|
};
|
|
24
24
|
export { TreeItem2Provider };
|
|
@@ -30,7 +30,7 @@ const warn = () => {
|
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* This component has been deprecated in favor of the new `SimpleTreeView` component.
|
|
33
|
-
* You can have a look at how to migrate to the new component in the v7 [migration guide](https://
|
|
33
|
+
* You can have a look at how to migrate to the new component in the v7 [migration guide](https://mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
|
|
34
34
|
*
|
|
35
35
|
* Demos:
|
|
36
36
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext';
|
|
2
2
|
export const useTreeItem2Utils = ({
|
|
3
|
-
|
|
3
|
+
itemId,
|
|
4
4
|
children
|
|
5
5
|
}) => {
|
|
6
6
|
const {
|
|
@@ -11,23 +11,23 @@ export const useTreeItem2Utils = ({
|
|
|
11
11
|
} = useTreeViewContext();
|
|
12
12
|
const status = {
|
|
13
13
|
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
14
|
-
expanded: instance.
|
|
15
|
-
focused: instance.
|
|
16
|
-
selected: instance.
|
|
17
|
-
disabled: instance.
|
|
14
|
+
expanded: instance.isItemExpanded(itemId),
|
|
15
|
+
focused: instance.isItemFocused(itemId),
|
|
16
|
+
selected: instance.isItemSelected(itemId),
|
|
17
|
+
disabled: instance.isItemDisabled(itemId)
|
|
18
18
|
};
|
|
19
19
|
const handleExpansion = event => {
|
|
20
20
|
if (status.disabled) {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
if (!status.focused) {
|
|
24
|
-
instance.focusItem(event,
|
|
24
|
+
instance.focusItem(event, itemId);
|
|
25
25
|
}
|
|
26
26
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
27
27
|
|
|
28
28
|
// If already expanded and trying to toggle selection don't close
|
|
29
|
-
if (status.expandable && !(multiple && instance.
|
|
30
|
-
instance.
|
|
29
|
+
if (status.expandable && !(multiple && instance.isItemExpanded(itemId))) {
|
|
30
|
+
instance.toggleItemExpansion(event, itemId);
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
const handleSelection = event => {
|
|
@@ -35,19 +35,19 @@ export const useTreeItem2Utils = ({
|
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
if (!status.focused) {
|
|
38
|
-
instance.focusItem(event,
|
|
38
|
+
instance.focusItem(event, itemId);
|
|
39
39
|
}
|
|
40
40
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
41
41
|
if (multiple) {
|
|
42
42
|
if (event.shiftKey) {
|
|
43
43
|
instance.selectRange(event, {
|
|
44
|
-
end:
|
|
44
|
+
end: itemId
|
|
45
45
|
});
|
|
46
46
|
} else {
|
|
47
|
-
instance.
|
|
47
|
+
instance.selectItem(event, itemId, true);
|
|
48
48
|
}
|
|
49
49
|
} else {
|
|
50
|
-
instance.
|
|
50
|
+
instance.selectItem(event, itemId);
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
const interactions = {
|
package/modern/index.js
CHANGED
|
@@ -46,7 +46,7 @@ const noop = () => {};
|
|
|
46
46
|
* We use this for focus management, keyboard navigation, and typeahead
|
|
47
47
|
* functionality for some components.
|
|
48
48
|
*
|
|
49
|
-
* The hook accepts the element
|
|
49
|
+
* The hook accepts the element item
|
|
50
50
|
*
|
|
51
51
|
* Our main goals with this are:
|
|
52
52
|
* 1) maximum composability,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useTreeViewId } from './useTreeViewId';
|
|
2
|
-
import {
|
|
2
|
+
import { useTreeViewItems } from './useTreeViewItems';
|
|
3
3
|
import { useTreeViewExpansion } from './useTreeViewExpansion';
|
|
4
4
|
import { useTreeViewSelection } from './useTreeViewSelection';
|
|
5
5
|
import { useTreeViewFocus } from './useTreeViewFocus';
|
|
6
6
|
import { useTreeViewKeyboardNavigation } from './useTreeViewKeyboardNavigation';
|
|
7
7
|
import { useTreeViewIcons } from './useTreeViewIcons';
|
|
8
|
-
export const DEFAULT_TREE_VIEW_PLUGINS = [useTreeViewId,
|
|
8
|
+
export const DEFAULT_TREE_VIEW_PLUGINS = [useTreeViewId, useTreeViewItems, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewIcons];
|
|
9
9
|
|
|
10
10
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|