@mui/x-tree-view 7.0.0-beta.7 → 7.0.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 +195 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +12 -14
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +3 -4
- 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/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.js +16 -17
- package/TreeItem2Icon/TreeItem2Icon.js +5 -6
- 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/index.js +1 -1
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +11 -18
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +3 -3
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +59 -43
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -5
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -18
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +70 -77
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +24 -29
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -21
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +4 -4
- package/internals/useTreeView/useTreeView.js +5 -6
- package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
- package/internals/useTreeView/useTreeView.utils.js +22 -22
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +7 -7
- package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
- 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/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
- package/modern/internals/useTreeView/useTreeView.js +3 -4
- package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +23 -12
- package/node/RichTreeView/RichTreeView.js +7 -7
- package/node/SimpleTreeView/SimpleTreeView.js +1 -1
- 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/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
- package/node/internals/useTreeView/useTreeView.js +3 -4
- package/node/internals/useTreeView/useTreeView.utils.js +22 -22
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/useTreeItem2.js +23 -12
- package/package.json +5 -5
- package/useTreeItem2/useTreeItem2.js +26 -18
- package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
3
|
import { populateInstance, populatePublicAPI } from '../../useTreeView/useTreeView.utils';
|
|
5
4
|
import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
|
|
6
5
|
const updateNodesState = ({
|
|
@@ -12,7 +11,6 @@ const updateNodesState = ({
|
|
|
12
11
|
const nodeMap = {};
|
|
13
12
|
const itemMap = {};
|
|
14
13
|
const processItem = (item, index, parentId) => {
|
|
15
|
-
var _item$children, _item$children2;
|
|
16
14
|
const id = getItemId ? getItemId(item) : item.id;
|
|
17
15
|
if (id == null) {
|
|
18
16
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
@@ -30,13 +28,13 @@ const updateNodesState = ({
|
|
|
30
28
|
index,
|
|
31
29
|
parentId,
|
|
32
30
|
idAttribute: undefined,
|
|
33
|
-
expandable: !!
|
|
31
|
+
expandable: !!item.children?.length,
|
|
34
32
|
disabled: isItemDisabled ? isItemDisabled(item) : false
|
|
35
33
|
};
|
|
36
34
|
itemMap[id] = item;
|
|
37
35
|
return {
|
|
38
36
|
id,
|
|
39
|
-
children:
|
|
37
|
+
children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
|
|
40
38
|
};
|
|
41
39
|
};
|
|
42
40
|
const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
|
|
@@ -53,34 +51,34 @@ export const useTreeViewNodes = ({
|
|
|
53
51
|
state,
|
|
54
52
|
setState
|
|
55
53
|
}) => {
|
|
56
|
-
const getNode = React.useCallback(
|
|
57
|
-
const getItem = React.useCallback(
|
|
58
|
-
const isNodeDisabled = React.useCallback(
|
|
59
|
-
if (
|
|
54
|
+
const getNode = React.useCallback(itemId => state.nodes.nodeMap[itemId], [state.nodes.nodeMap]);
|
|
55
|
+
const getItem = React.useCallback(itemId => state.nodes.itemMap[itemId], [state.nodes.itemMap]);
|
|
56
|
+
const isNodeDisabled = React.useCallback(itemId => {
|
|
57
|
+
if (itemId == null) {
|
|
60
58
|
return false;
|
|
61
59
|
}
|
|
62
|
-
let
|
|
60
|
+
let item = instance.getNode(itemId);
|
|
63
61
|
|
|
64
|
-
// This can be called before the
|
|
65
|
-
if (!
|
|
62
|
+
// This can be called before the item has been added to the node map.
|
|
63
|
+
if (!item) {
|
|
66
64
|
return false;
|
|
67
65
|
}
|
|
68
|
-
if (
|
|
66
|
+
if (item.disabled) {
|
|
69
67
|
return true;
|
|
70
68
|
}
|
|
71
|
-
while (
|
|
72
|
-
|
|
73
|
-
if (
|
|
69
|
+
while (item.parentId != null) {
|
|
70
|
+
item = instance.getNode(item.parentId);
|
|
71
|
+
if (item.disabled) {
|
|
74
72
|
return true;
|
|
75
73
|
}
|
|
76
74
|
}
|
|
77
75
|
return false;
|
|
78
76
|
}, [instance]);
|
|
79
|
-
const getChildrenIds =
|
|
80
|
-
const getNavigableChildrenIds =
|
|
81
|
-
let childrenIds = instance.getChildrenIds(
|
|
77
|
+
const getChildrenIds = React.useCallback(itemId => Object.values(state.nodes.nodeMap).filter(item => item.parentId === itemId).sort((a, b) => a.index - b.index).map(child => child.id), [state.nodes.nodeMap]);
|
|
78
|
+
const getNavigableChildrenIds = itemId => {
|
|
79
|
+
let childrenIds = instance.getChildrenIds(itemId);
|
|
82
80
|
if (!params.disabledItemsFocusable) {
|
|
83
|
-
childrenIds = childrenIds.filter(
|
|
81
|
+
childrenIds = childrenIds.filter(item => !instance.isNodeDisabled(item));
|
|
84
82
|
}
|
|
85
83
|
return childrenIds;
|
|
86
84
|
};
|
|
@@ -105,19 +103,19 @@ export const useTreeViewNodes = ({
|
|
|
105
103
|
});
|
|
106
104
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
107
105
|
const getNodesToRender = () => {
|
|
108
|
-
const
|
|
106
|
+
const getPropsFromItemId = ({
|
|
109
107
|
id,
|
|
110
108
|
children
|
|
111
109
|
}) => {
|
|
112
110
|
const node = state.nodes.nodeMap[id];
|
|
113
111
|
return {
|
|
114
112
|
label: node.label,
|
|
115
|
-
|
|
113
|
+
itemId: node.id,
|
|
116
114
|
id: node.idAttribute,
|
|
117
|
-
children: children
|
|
115
|
+
children: children?.map(getPropsFromItemId)
|
|
118
116
|
};
|
|
119
117
|
};
|
|
120
|
-
return state.nodes.nodeTree.map(
|
|
118
|
+
return state.nodes.nodeTree.map(getPropsFromItemId);
|
|
121
119
|
};
|
|
122
120
|
populateInstance(instance, {
|
|
123
121
|
getNode,
|
|
@@ -144,12 +142,9 @@ useTreeViewNodes.getInitialState = params => ({
|
|
|
144
142
|
getItemLabel: params.getItemLabel
|
|
145
143
|
})
|
|
146
144
|
});
|
|
147
|
-
useTreeViewNodes.getDefaultizedParams = params => {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
disabledItemsFocusable: (_params$disabledItems = params.disabledItemsFocusable) != null ? _params$disabledItems : false
|
|
151
|
-
});
|
|
152
|
-
};
|
|
145
|
+
useTreeViewNodes.getDefaultizedParams = params => _extends({}, params, {
|
|
146
|
+
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
|
147
|
+
});
|
|
153
148
|
useTreeViewNodes.params = {
|
|
154
149
|
disabledItemsFocusable: true,
|
|
155
150
|
items: true,
|
|
@@ -2,17 +2,17 @@ import { TreeViewNode, DefaultizedProps, TreeViewPluginSignature } from '../../m
|
|
|
2
2
|
import { TreeViewItemId } from '../../../models';
|
|
3
3
|
interface TreeViewNodeProps {
|
|
4
4
|
label: string;
|
|
5
|
-
|
|
5
|
+
itemId: string;
|
|
6
6
|
id: string | undefined;
|
|
7
7
|
children?: TreeViewNodeProps[];
|
|
8
8
|
}
|
|
9
9
|
export interface UseTreeViewNodesInstance<R extends {}> {
|
|
10
|
-
getNode: (
|
|
11
|
-
getItem: (
|
|
10
|
+
getNode: (itemId: string) => TreeViewNode;
|
|
11
|
+
getItem: (itemId: string) => R;
|
|
12
12
|
getNodesToRender: () => TreeViewNodeProps[];
|
|
13
|
-
getChildrenIds: (
|
|
14
|
-
getNavigableChildrenIds: (
|
|
15
|
-
isNodeDisabled: (
|
|
13
|
+
getChildrenIds: (itemId: string | null) => string[];
|
|
14
|
+
getNavigableChildrenIds: (itemId: string | null) => string[];
|
|
15
|
+
isNodeDisabled: (itemId: string | null) => itemId is string;
|
|
16
16
|
}
|
|
17
17
|
export interface UseTreeViewNodesPublicAPI<R extends {}> extends Pick<UseTreeViewNodesInstance<R>, 'getItem'> {
|
|
18
18
|
}
|
|
@@ -57,13 +57,13 @@ interface UseTreeViewNodesEventLookup {
|
|
|
57
57
|
};
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
export interface
|
|
60
|
+
export interface TreeViewItemIdAndChildren {
|
|
61
61
|
id: TreeViewItemId;
|
|
62
|
-
children?:
|
|
62
|
+
children?: TreeViewItemIdAndChildren[];
|
|
63
63
|
}
|
|
64
64
|
export interface UseTreeViewNodesState<R extends {}> {
|
|
65
65
|
nodes: {
|
|
66
|
-
nodeTree:
|
|
66
|
+
nodeTree: TreeViewItemIdAndChildren[];
|
|
67
67
|
nodeMap: TreeViewNodeMap;
|
|
68
68
|
itemMap: TreeViewItemMap<R>;
|
|
69
69
|
};
|
|
@@ -80,9 +80,9 @@ export type UseTreeViewNodesSignature = TreeViewPluginSignature<{
|
|
|
80
80
|
contextValue: UseTreeViewNodesContextValue;
|
|
81
81
|
}>;
|
|
82
82
|
export type TreeViewNodeMap = {
|
|
83
|
-
[
|
|
83
|
+
[itemId: string]: TreeViewNode;
|
|
84
84
|
};
|
|
85
85
|
export type TreeViewItemMap<R extends {}> = {
|
|
86
|
-
[
|
|
86
|
+
[itemId: string]: R;
|
|
87
87
|
};
|
|
88
88
|
export {};
|
|
@@ -35,26 +35,26 @@ export const useTreeViewSelection = ({
|
|
|
35
35
|
}
|
|
36
36
|
models.selectedItems.setControlledValue(newSelectedItems);
|
|
37
37
|
};
|
|
38
|
-
const isNodeSelected =
|
|
39
|
-
const selectNode = (event,
|
|
38
|
+
const isNodeSelected = itemId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(itemId) !== -1 : models.selectedItems.value === itemId;
|
|
39
|
+
const selectNode = (event, itemId, multiple = false) => {
|
|
40
40
|
if (params.disableSelection) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
if (multiple) {
|
|
44
44
|
if (Array.isArray(models.selectedItems.value)) {
|
|
45
45
|
let newSelected;
|
|
46
|
-
if (models.selectedItems.value.indexOf(
|
|
47
|
-
newSelected = models.selectedItems.value.filter(id => id !==
|
|
46
|
+
if (models.selectedItems.value.indexOf(itemId) !== -1) {
|
|
47
|
+
newSelected = models.selectedItems.value.filter(id => id !== itemId);
|
|
48
48
|
} else {
|
|
49
|
-
newSelected = [
|
|
49
|
+
newSelected = [itemId].concat(models.selectedItems.value);
|
|
50
50
|
}
|
|
51
51
|
setSelectedItems(event, newSelected);
|
|
52
52
|
}
|
|
53
53
|
} else {
|
|
54
|
-
const newSelected = params.multiSelect ? [
|
|
54
|
+
const newSelected = params.multiSelect ? [itemId] : itemId;
|
|
55
55
|
setSelectedItems(event, newSelected);
|
|
56
56
|
}
|
|
57
|
-
lastSelectedNode.current =
|
|
57
|
+
lastSelectedNode.current = itemId;
|
|
58
58
|
lastSelectionWasRange.current = false;
|
|
59
59
|
currentRangeSelection.current = [];
|
|
60
60
|
};
|
|
@@ -135,21 +135,21 @@ export const useTreeViewSelection = ({
|
|
|
135
135
|
}
|
|
136
136
|
lastSelectionWasRange.current = true;
|
|
137
137
|
};
|
|
138
|
-
const rangeSelectToFirst = (event,
|
|
138
|
+
const rangeSelectToFirst = (event, itemId) => {
|
|
139
139
|
if (!lastSelectedNode.current) {
|
|
140
|
-
lastSelectedNode.current =
|
|
140
|
+
lastSelectedNode.current = itemId;
|
|
141
141
|
}
|
|
142
|
-
const start = lastSelectionWasRange.current ? lastSelectedNode.current :
|
|
142
|
+
const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
|
|
143
143
|
instance.selectRange(event, {
|
|
144
144
|
start,
|
|
145
145
|
end: getFirstNode(instance)
|
|
146
146
|
});
|
|
147
147
|
};
|
|
148
|
-
const rangeSelectToLast = (event,
|
|
148
|
+
const rangeSelectToLast = (event, itemId) => {
|
|
149
149
|
if (!lastSelectedNode.current) {
|
|
150
|
-
lastSelectedNode.current =
|
|
150
|
+
lastSelectedNode.current = itemId;
|
|
151
151
|
}
|
|
152
|
-
const start = lastSelectionWasRange.current ? lastSelectedNode.current :
|
|
152
|
+
const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
|
|
153
153
|
instance.selectRange(event, {
|
|
154
154
|
start,
|
|
155
155
|
end: getLastNode(instance)
|
|
@@ -179,14 +179,11 @@ useTreeViewSelection.models = {
|
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
181
|
const DEFAULT_SELECTED_NODES = [];
|
|
182
|
-
useTreeViewSelection.getDefaultizedParams = params => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
defaultSelectedItems: (_params$defaultSelect = params.defaultSelectedItems) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
|
|
188
|
-
});
|
|
189
|
-
};
|
|
182
|
+
useTreeViewSelection.getDefaultizedParams = params => _extends({}, params, {
|
|
183
|
+
disableSelection: params.disableSelection ?? false,
|
|
184
|
+
multiSelect: params.multiSelect ?? false,
|
|
185
|
+
defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
|
|
186
|
+
});
|
|
190
187
|
useTreeViewSelection.params = {
|
|
191
188
|
disableSelection: true,
|
|
192
189
|
multiSelect: true,
|
|
@@ -3,11 +3,11 @@ import type { DefaultizedProps, TreeViewItemRange, TreeViewPluginSignature } fro
|
|
|
3
3
|
import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
|
|
4
4
|
import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
|
|
5
5
|
export interface UseTreeViewSelectionInstance {
|
|
6
|
-
isNodeSelected: (
|
|
7
|
-
selectNode: (event: React.SyntheticEvent,
|
|
6
|
+
isNodeSelected: (itemId: string) => boolean;
|
|
7
|
+
selectNode: (event: React.SyntheticEvent, itemId: string, multiple?: boolean) => void;
|
|
8
8
|
selectRange: (event: React.SyntheticEvent, nodes: TreeViewItemRange, stacked?: boolean) => void;
|
|
9
|
-
rangeSelectToFirst: (event: React.KeyboardEvent
|
|
10
|
-
rangeSelectToLast: (event: React.KeyboardEvent
|
|
9
|
+
rangeSelectToFirst: (event: React.KeyboardEvent, itemId: string) => void;
|
|
10
|
+
rangeSelectToLast: (event: React.KeyboardEvent, itemId: string) => void;
|
|
11
11
|
}
|
|
12
12
|
type TreeViewSelectionValue<Multiple extends boolean | undefined> = Multiple extends true ? string[] : string | null;
|
|
13
13
|
export interface UseTreeViewSelectionParameters<Multiple extends boolean | undefined> {
|
|
@@ -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,8 +1,8 @@
|
|
|
1
1
|
import { TreeViewAnyPluginSignature, TreeViewInstance, TreeViewUsedInstance, TreeViewUsedPublicAPI } from '../models';
|
|
2
2
|
import type { UseTreeViewExpansionSignature } from '../plugins/useTreeViewExpansion';
|
|
3
3
|
import type { UseTreeViewNodesSignature } from '../plugins/useTreeViewNodes';
|
|
4
|
-
export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>,
|
|
5
|
-
export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>,
|
|
4
|
+
export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>, itemId: string) => string | null;
|
|
5
|
+
export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>, itemId: string) => string | null;
|
|
6
6
|
export declare const getLastNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>) => string;
|
|
7
7
|
export declare const getFirstNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature]>) => string;
|
|
8
8
|
export declare const populateInstance: <T extends TreeViewAnyPluginSignature>(instance: TreeViewUsedInstance<T>, methods: T["instance"]) => void;
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
export const getPreviousNode = (instance,
|
|
2
|
-
const
|
|
3
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
4
|
-
const
|
|
5
|
-
if (
|
|
6
|
-
return
|
|
1
|
+
export const getPreviousNode = (instance, itemId) => {
|
|
2
|
+
const item = instance.getNode(itemId);
|
|
3
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
4
|
+
const itemIndex = siblings.indexOf(itemId);
|
|
5
|
+
if (itemIndex === 0) {
|
|
6
|
+
return item.parentId;
|
|
7
7
|
}
|
|
8
|
-
let
|
|
9
|
-
while (instance.isNodeExpanded(
|
|
10
|
-
|
|
8
|
+
let currentItem = siblings[itemIndex - 1];
|
|
9
|
+
while (instance.isNodeExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
|
|
10
|
+
currentItem = instance.getNavigableChildrenIds(currentItem).pop();
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return currentItem;
|
|
13
13
|
};
|
|
14
|
-
export const getNextNode = (instance,
|
|
14
|
+
export const getNextNode = (instance, itemId) => {
|
|
15
15
|
// If expanded get first child
|
|
16
|
-
if (instance.isNodeExpanded(
|
|
17
|
-
return instance.getNavigableChildrenIds(
|
|
16
|
+
if (instance.isNodeExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
|
|
17
|
+
return instance.getNavigableChildrenIds(itemId)[0];
|
|
18
18
|
}
|
|
19
|
-
let
|
|
20
|
-
while (
|
|
19
|
+
let item = instance.getNode(itemId);
|
|
20
|
+
while (item != null) {
|
|
21
21
|
// Try to get next sibling
|
|
22
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
23
|
-
const nextSibling = siblings[siblings.indexOf(
|
|
22
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
23
|
+
const nextSibling = siblings[siblings.indexOf(item.id) + 1];
|
|
24
24
|
if (nextSibling) {
|
|
25
25
|
return nextSibling;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// If the sibling does not exist, go up a level to the parent and try again.
|
|
29
|
-
|
|
29
|
+
item = instance.getNode(item.parentId);
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
};
|
|
33
33
|
export const getLastNode = instance => {
|
|
34
|
-
let
|
|
35
|
-
while (instance.isNodeExpanded(
|
|
36
|
-
|
|
34
|
+
let lastItem = instance.getNavigableChildrenIds(null).pop();
|
|
35
|
+
while (instance.isNodeExpanded(lastItem)) {
|
|
36
|
+
lastItem = instance.getNavigableChildrenIds(lastItem).pop();
|
|
37
37
|
}
|
|
38
|
-
return
|
|
38
|
+
return lastItem;
|
|
39
39
|
};
|
|
40
40
|
export const getFirstNode = instance => instance.getNavigableChildrenIds(null)[0];
|
|
41
41
|
export const populateInstance = (instance, methods) => {
|
|
@@ -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
|
*
|
|
@@ -107,7 +107,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
107
107
|
const nodesToRender = instance.getNodesToRender();
|
|
108
108
|
const renderNode = ({
|
|
109
109
|
label,
|
|
110
|
-
|
|
110
|
+
itemId,
|
|
111
111
|
id,
|
|
112
112
|
children
|
|
113
113
|
}) => {
|
|
@@ -116,9 +116,9 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
116
116
|
slotProps: slotProps,
|
|
117
117
|
label: label,
|
|
118
118
|
id: id,
|
|
119
|
-
|
|
119
|
+
itemId: itemId,
|
|
120
120
|
children: children?.map(renderNode)
|
|
121
|
-
},
|
|
121
|
+
}, itemId);
|
|
122
122
|
};
|
|
123
123
|
return /*#__PURE__*/_jsx(TreeViewProvider, {
|
|
124
124
|
value: contextValue,
|
|
@@ -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,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.isNodeExpanded(
|
|
188
|
-
const focused = instance.isNodeFocused(
|
|
189
|
-
const selected = instance.isNodeSelected(
|
|
190
|
-
const disabled = instance.isNodeDisabled(
|
|
189
|
+
const expanded = instance.isNodeExpanded(itemId);
|
|
190
|
+
const focused = instance.isNodeFocused(itemId);
|
|
191
|
+
const selected = instance.isNodeSelected(itemId);
|
|
192
|
+
const disabled = instance.isNodeDisabled(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 };
|