@mui/x-tree-view 7.0.0-beta.6 → 7.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -1
- package/RichTreeView/RichTreeView.js +22 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +22 -22
- package/TreeItem/TreeItem.js +57 -53
- package/TreeItem/TreeItem.types.d.ts +10 -8
- package/TreeItem/useTreeItemState.js +2 -2
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +301 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +68 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.js +22 -22
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -5
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
- package/internals/useTreeView/useTreeView.js +27 -25
- package/modern/RichTreeView/RichTreeView.js +22 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +22 -22
- package/modern/TreeItem/TreeItem.js +57 -53
- package/modern/TreeItem/useTreeItemState.js +2 -2
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +22 -22
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +16 -16
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/useTreeView/useTreeView.js +27 -25
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +135 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +22 -22
- package/node/SimpleTreeView/SimpleTreeView.js +22 -22
- package/node/TreeItem/TreeItem.js +57 -53
- package/node/TreeItem/useTreeItemState.js +2 -2
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +22 -22
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +16 -16
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +2 -2
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/node/internals/useTreeView/useTreeView.js +27 -25
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +143 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +1 -1
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +138 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -69,7 +69,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
69
69
|
*/
|
|
70
70
|
apiRef: PropTypes.shape({
|
|
71
71
|
current: PropTypes.shape({
|
|
72
|
-
|
|
72
|
+
focusItem: PropTypes.func.isRequired,
|
|
73
73
|
getItem: PropTypes.func.isRequired
|
|
74
74
|
})
|
|
75
75
|
}),
|
|
@@ -83,17 +83,17 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
83
83
|
classes: PropTypes.object,
|
|
84
84
|
className: PropTypes.string,
|
|
85
85
|
/**
|
|
86
|
-
* Expanded
|
|
86
|
+
* Expanded item ids.
|
|
87
87
|
* Used when the item's expansion is not controlled.
|
|
88
88
|
* @default []
|
|
89
89
|
*/
|
|
90
|
-
|
|
90
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
91
91
|
/**
|
|
92
|
-
* Selected
|
|
92
|
+
* Selected item ids. (Uncontrolled)
|
|
93
93
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
94
94
|
* @default []
|
|
95
95
|
*/
|
|
96
|
-
|
|
96
|
+
defaultSelectedItems: PropTypes.any,
|
|
97
97
|
/**
|
|
98
98
|
* If `true`, will allow focus on disabled items.
|
|
99
99
|
* @default false
|
|
@@ -105,10 +105,10 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
105
105
|
*/
|
|
106
106
|
disableSelection: PropTypes.bool,
|
|
107
107
|
/**
|
|
108
|
-
* Expanded
|
|
108
|
+
* Expanded item ids.
|
|
109
109
|
* Used when the item's expansion is controlled.
|
|
110
110
|
*/
|
|
111
|
-
|
|
111
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
112
112
|
/**
|
|
113
113
|
* This prop is used to help implement the accessibility logic.
|
|
114
114
|
* If you don't provide this prop. It falls back to a randomly generated id.
|
|
@@ -122,42 +122,42 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
122
122
|
/**
|
|
123
123
|
* Callback fired when tree items are expanded/collapsed.
|
|
124
124
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
125
|
-
* @param {array}
|
|
125
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
126
126
|
*/
|
|
127
|
-
|
|
127
|
+
onExpandedItemsChange: PropTypes.func,
|
|
128
128
|
/**
|
|
129
129
|
* Callback fired when a tree item is expanded or collapsed.
|
|
130
130
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
131
|
-
* @param {array}
|
|
132
|
-
* @param {array} isExpanded `true` if the
|
|
131
|
+
* @param {array} itemId The itemId of the modified item.
|
|
132
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
133
133
|
*/
|
|
134
|
-
|
|
134
|
+
onItemExpansionToggle: PropTypes.func,
|
|
135
135
|
/**
|
|
136
136
|
* Callback fired when tree items are focused.
|
|
137
137
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
138
|
-
* @param {string}
|
|
139
|
-
* @param {string} value of the focused
|
|
138
|
+
* @param {string} itemId The id of the focused item.
|
|
139
|
+
* @param {string} value of the focused item.
|
|
140
140
|
*/
|
|
141
|
-
|
|
141
|
+
onItemFocus: PropTypes.func,
|
|
142
142
|
/**
|
|
143
143
|
* Callback fired when a tree item is selected or deselected.
|
|
144
144
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
145
|
-
* @param {array}
|
|
146
|
-
* @param {array} isSelected `true` if the
|
|
145
|
+
* @param {array} itemId The itemId of the modified item.
|
|
146
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
147
147
|
*/
|
|
148
|
-
|
|
148
|
+
onItemSelectionToggle: PropTypes.func,
|
|
149
149
|
/**
|
|
150
150
|
* Callback fired when tree items are selected/deselected.
|
|
151
151
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
152
|
-
* @param {string[] | string}
|
|
152
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
153
153
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
154
154
|
*/
|
|
155
|
-
|
|
155
|
+
onSelectedItemsChange: PropTypes.func,
|
|
156
156
|
/**
|
|
157
|
-
* Selected
|
|
157
|
+
* Selected item ids. (Controlled)
|
|
158
158
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
159
159
|
*/
|
|
160
|
-
|
|
160
|
+
selectedItems: PropTypes.any,
|
|
161
161
|
/**
|
|
162
162
|
* The props used for each component slot.
|
|
163
163
|
*/
|
package/modern/hooks/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useTreeViewApiRef } from './useTreeViewApiRef';
|
|
1
|
+
export { useTreeViewApiRef } from './useTreeViewApiRef';
|
|
2
|
+
export { useTreeItem2Utils } from './useTreeItem2Utils';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeItem2Utils } from './useTreeItem2Utils';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext';
|
|
2
|
+
export const useTreeItem2Utils = ({
|
|
3
|
+
nodeId,
|
|
4
|
+
children
|
|
5
|
+
}) => {
|
|
6
|
+
const {
|
|
7
|
+
instance,
|
|
8
|
+
selection: {
|
|
9
|
+
multiSelect
|
|
10
|
+
}
|
|
11
|
+
} = useTreeViewContext();
|
|
12
|
+
const status = {
|
|
13
|
+
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
14
|
+
expanded: instance.isNodeExpanded(nodeId),
|
|
15
|
+
focused: instance.isNodeFocused(nodeId),
|
|
16
|
+
selected: instance.isNodeSelected(nodeId),
|
|
17
|
+
disabled: instance.isNodeDisabled(nodeId)
|
|
18
|
+
};
|
|
19
|
+
const handleExpansion = event => {
|
|
20
|
+
if (status.disabled) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!status.focused) {
|
|
24
|
+
instance.focusItem(event, nodeId);
|
|
25
|
+
}
|
|
26
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
27
|
+
|
|
28
|
+
// If already expanded and trying to toggle selection don't close
|
|
29
|
+
if (status.expandable && !(multiple && instance.isNodeExpanded(nodeId))) {
|
|
30
|
+
instance.toggleNodeExpansion(event, nodeId);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const handleSelection = event => {
|
|
34
|
+
if (status.disabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!status.focused) {
|
|
38
|
+
instance.focusItem(event, nodeId);
|
|
39
|
+
}
|
|
40
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
41
|
+
if (multiple) {
|
|
42
|
+
if (event.shiftKey) {
|
|
43
|
+
instance.selectRange(event, {
|
|
44
|
+
end: nodeId
|
|
45
|
+
});
|
|
46
|
+
} else {
|
|
47
|
+
instance.selectNode(event, nodeId, true);
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
instance.selectNode(event, nodeId);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const interactions = {
|
|
54
|
+
handleExpansion,
|
|
55
|
+
handleSelection
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
interactions,
|
|
59
|
+
status
|
|
60
|
+
};
|
|
61
|
+
};
|
package/modern/index.js
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @mui/x-tree-view v7.0.0-beta.
|
|
2
|
+
* @mui/x-tree-view v7.0.0-beta.7
|
|
3
3
|
*
|
|
4
4
|
* @license MIT
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
// Tree View
|
|
9
9
|
export * from './TreeView';
|
|
10
10
|
export * from './SimpleTreeView';
|
|
11
11
|
export * from './RichTreeView';
|
|
12
|
+
|
|
13
|
+
// Tree Item
|
|
14
|
+
export * from './TreeItem';
|
|
15
|
+
export * from './TreeItem2';
|
|
16
|
+
export * from './useTreeItem2';
|
|
17
|
+
export * from './TreeItem2Icon';
|
|
18
|
+
export * from './TreeItem2Provider';
|
|
12
19
|
export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
|
|
13
20
|
export * from './models';
|
|
14
21
|
export * from './icons';
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const UNINITIALIZED = {};
|
|
3
|
-
|
|
4
|
-
// See https://github.com/facebook/react/issues/14490 for when to use this.
|
|
5
|
-
export function useLazyRef(init, initArg) {
|
|
6
|
-
const ref = React.useRef(UNINITIALIZED);
|
|
7
|
-
if (ref.current === UNINITIALIZED) {
|
|
8
|
-
ref.current = init(initArg);
|
|
9
|
-
}
|
|
10
|
-
return ref;
|
|
11
|
-
}
|
|
1
|
+
export { default as useLazyRef } from '@mui/utils/useLazyRef';
|
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const EMPTY = [];
|
|
3
|
-
export function useOnMount(fn) {
|
|
4
|
-
/* eslint-disable react-hooks/exhaustive-deps */
|
|
5
|
-
React.useEffect(fn, EMPTY);
|
|
6
|
-
/* eslint-enable react-hooks/exhaustive-deps */
|
|
7
|
-
}
|
|
1
|
+
export { default as useOnMount } from '@mui/utils/useOnMount';
|
|
@@ -1,36 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { useLazyRef } from './useLazyRef';
|
|
4
|
-
import { useOnMount } from './useOnMount';
|
|
5
|
-
export class Timeout {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.currentId = null;
|
|
8
|
-
this.clear = () => {
|
|
9
|
-
if (this.currentId !== null) {
|
|
10
|
-
clearTimeout(this.currentId);
|
|
11
|
-
this.currentId = null;
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
this.disposeEffect = () => {
|
|
15
|
-
return this.clear;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
static create() {
|
|
19
|
-
return new Timeout();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Executes `fn` after `delay`, clearing any previously scheduled call.
|
|
23
|
-
*/
|
|
24
|
-
start(delay, fn) {
|
|
25
|
-
this.clear();
|
|
26
|
-
this.currentId = setTimeout(() => {
|
|
27
|
-
this.currentId = null;
|
|
28
|
-
fn();
|
|
29
|
-
}, delay);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function useTimeout() {
|
|
33
|
-
const timeout = useLazyRef(Timeout.create).current;
|
|
34
|
-
useOnMount(timeout.disposeEffect);
|
|
35
|
-
return timeout;
|
|
36
|
-
}
|
|
1
|
+
export { default as useTimeout } from '@mui/utils/useTimeout';
|
|
@@ -7,42 +7,42 @@ export const useTreeViewExpansion = ({
|
|
|
7
7
|
params,
|
|
8
8
|
models
|
|
9
9
|
}) => {
|
|
10
|
-
const
|
|
11
|
-
params.
|
|
12
|
-
models.
|
|
10
|
+
const setExpandedItems = (event, value) => {
|
|
11
|
+
params.onExpandedItemsChange?.(event, value);
|
|
12
|
+
models.expandedItems.setControlledValue(value);
|
|
13
13
|
};
|
|
14
14
|
const isNodeExpanded = React.useCallback(nodeId => {
|
|
15
|
-
return Array.isArray(models.
|
|
16
|
-
}, [models.
|
|
15
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(nodeId) !== -1 : false;
|
|
16
|
+
}, [models.expandedItems.value]);
|
|
17
17
|
const isNodeExpandable = React.useCallback(nodeId => !!instance.getNode(nodeId)?.expandable, [instance]);
|
|
18
|
-
const toggleNodeExpansion = useEventCallback((event,
|
|
19
|
-
if (
|
|
18
|
+
const toggleNodeExpansion = useEventCallback((event, itemId) => {
|
|
19
|
+
if (itemId == null) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
|
-
const isExpandedBefore = models.
|
|
22
|
+
const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
|
|
23
23
|
let newExpanded;
|
|
24
24
|
if (isExpandedBefore) {
|
|
25
|
-
newExpanded = models.
|
|
25
|
+
newExpanded = models.expandedItems.value.filter(id => id !== itemId);
|
|
26
26
|
} else {
|
|
27
|
-
newExpanded = [
|
|
27
|
+
newExpanded = [itemId].concat(models.expandedItems.value);
|
|
28
28
|
}
|
|
29
|
-
if (params.
|
|
30
|
-
params.
|
|
29
|
+
if (params.onItemExpansionToggle) {
|
|
30
|
+
params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
setExpandedItems(event, newExpanded);
|
|
33
33
|
});
|
|
34
34
|
const expandAllSiblings = (event, nodeId) => {
|
|
35
35
|
const node = instance.getNode(nodeId);
|
|
36
36
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
37
37
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
38
|
-
const newExpanded = models.
|
|
38
|
+
const newExpanded = models.expandedItems.value.concat(diff);
|
|
39
39
|
if (diff.length > 0) {
|
|
40
|
-
if (params.
|
|
40
|
+
if (params.onItemExpansionToggle) {
|
|
41
41
|
diff.forEach(newlyExpandedNodeId => {
|
|
42
|
-
params.
|
|
42
|
+
params.onItemExpansionToggle(event, newlyExpandedNodeId, true);
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
setExpandedItems(event, newExpanded);
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
populateInstance(instance, {
|
|
@@ -53,17 +53,17 @@ export const useTreeViewExpansion = ({
|
|
|
53
53
|
});
|
|
54
54
|
};
|
|
55
55
|
useTreeViewExpansion.models = {
|
|
56
|
-
|
|
57
|
-
getDefaultValue: params => params.
|
|
56
|
+
expandedItems: {
|
|
57
|
+
getDefaultValue: params => params.defaultExpandedItems
|
|
58
58
|
}
|
|
59
59
|
};
|
|
60
60
|
const DEFAULT_EXPANDED_NODES = [];
|
|
61
61
|
useTreeViewExpansion.getDefaultizedParams = params => _extends({}, params, {
|
|
62
|
-
|
|
62
|
+
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
|
|
63
63
|
});
|
|
64
64
|
useTreeViewExpansion.params = {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
expandedItems: true,
|
|
66
|
+
defaultExpandedItems: true,
|
|
67
|
+
onExpandedItemsChange: true,
|
|
68
|
+
onItemExpansionToggle: true
|
|
69
69
|
};
|
|
@@ -28,31 +28,31 @@ export const useTreeViewFocus = ({
|
|
|
28
28
|
const node = instance.getNode(nodeId);
|
|
29
29
|
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
30
30
|
};
|
|
31
|
-
const
|
|
31
|
+
const focusItem = useEventCallback((event, nodeId) => {
|
|
32
32
|
// if we receive a nodeId, and it is visible, the focus will be set to it
|
|
33
33
|
if (nodeId && isNodeVisible(nodeId)) {
|
|
34
34
|
if (!isTreeViewFocused()) {
|
|
35
35
|
instance.focusRoot();
|
|
36
36
|
}
|
|
37
37
|
setFocusedNodeId(nodeId);
|
|
38
|
-
if (params.
|
|
39
|
-
params.
|
|
38
|
+
if (params.onItemFocus) {
|
|
39
|
+
params.onItemFocus(event, nodeId);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
const focusDefaultNode = useEventCallback(event => {
|
|
44
44
|
let nodeToFocusId;
|
|
45
|
-
if (Array.isArray(models.
|
|
46
|
-
nodeToFocusId = models.
|
|
47
|
-
} else if (models.
|
|
48
|
-
nodeToFocusId = models.
|
|
45
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
46
|
+
nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
|
|
47
|
+
} else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
|
|
48
|
+
nodeToFocusId = models.selectedItems.value;
|
|
49
49
|
}
|
|
50
50
|
if (nodeToFocusId == null) {
|
|
51
51
|
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
52
52
|
}
|
|
53
53
|
setFocusedNodeId(nodeToFocusId);
|
|
54
|
-
if (params.
|
|
55
|
-
params.
|
|
54
|
+
if (params.onItemFocus) {
|
|
55
|
+
params.onItemFocus(event, nodeToFocusId);
|
|
56
56
|
}
|
|
57
57
|
});
|
|
58
58
|
const focusRoot = useEventCallback(() => {
|
|
@@ -62,12 +62,12 @@ export const useTreeViewFocus = ({
|
|
|
62
62
|
});
|
|
63
63
|
populateInstance(instance, {
|
|
64
64
|
isNodeFocused,
|
|
65
|
-
|
|
65
|
+
focusItem,
|
|
66
66
|
focusRoot,
|
|
67
67
|
focusDefaultNode
|
|
68
68
|
});
|
|
69
69
|
populatePublicAPI(publicAPI, {
|
|
70
|
-
|
|
70
|
+
focusItem
|
|
71
71
|
});
|
|
72
72
|
useInstanceEventHandler(instance, 'removeNode', ({
|
|
73
73
|
id
|
|
@@ -104,5 +104,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
104
104
|
focusedNodeId: null
|
|
105
105
|
});
|
|
106
106
|
useTreeViewFocus.params = {
|
|
107
|
-
|
|
107
|
+
onItemFocus: true
|
|
108
108
|
};
|
|
@@ -70,15 +70,15 @@ export const useTreeViewJSXNodes = ({
|
|
|
70
70
|
};
|
|
71
71
|
const useTreeViewJSXNodesItemPlugin = ({
|
|
72
72
|
props,
|
|
73
|
-
|
|
73
|
+
rootRef,
|
|
74
|
+
contentRef
|
|
74
75
|
}) => {
|
|
75
76
|
const {
|
|
76
77
|
children,
|
|
77
78
|
disabled = false,
|
|
78
79
|
label,
|
|
79
80
|
nodeId,
|
|
80
|
-
id
|
|
81
|
-
ContentProps: inContentProps
|
|
81
|
+
id
|
|
82
82
|
} = props;
|
|
83
83
|
const {
|
|
84
84
|
instance
|
|
@@ -91,8 +91,9 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
91
91
|
};
|
|
92
92
|
const expandable = isExpandable(children);
|
|
93
93
|
const [treeItemElement, setTreeItemElement] = React.useState(null);
|
|
94
|
-
const
|
|
95
|
-
const
|
|
94
|
+
const pluginContentRef = React.useRef(null);
|
|
95
|
+
const handleRootRef = useForkRef(setTreeItemElement, rootRef);
|
|
96
|
+
const handleContentRef = useForkRef(pluginContentRef, contentRef);
|
|
96
97
|
const descendant = React.useMemo(() => ({
|
|
97
98
|
element: treeItemElement,
|
|
98
99
|
id: nodeId
|
|
@@ -118,22 +119,21 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
118
119
|
}, [instance, parentId, index, nodeId, expandable, disabled, id]);
|
|
119
120
|
React.useEffect(() => {
|
|
120
121
|
if (label) {
|
|
121
|
-
return instance.mapFirstCharFromJSX(nodeId, (
|
|
122
|
+
return instance.mapFirstCharFromJSX(nodeId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
122
123
|
}
|
|
123
124
|
return undefined;
|
|
124
125
|
}, [instance, nodeId, label]);
|
|
125
126
|
return {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
ref: contentRef
|
|
129
|
-
})
|
|
130
|
-
}),
|
|
131
|
-
ref: handleRef,
|
|
132
|
-
wrapItem: item => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
133
|
-
id: nodeId,
|
|
134
|
-
children: item
|
|
135
|
-
})
|
|
127
|
+
contentRef: handleContentRef,
|
|
128
|
+
rootRef: handleRootRef
|
|
136
129
|
};
|
|
137
130
|
};
|
|
138
131
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
132
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
133
|
+
children,
|
|
134
|
+
nodeId
|
|
135
|
+
}) => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
136
|
+
id: nodeId,
|
|
137
|
+
children: children
|
|
138
|
+
});
|
|
139
139
|
useTreeViewJSXNodes.params = {};
|
package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -81,7 +81,9 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
81
81
|
return null;
|
|
82
82
|
};
|
|
83
83
|
const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
|
|
84
|
-
const canToggleNodeExpansion = nodeId =>
|
|
84
|
+
const canToggleNodeExpansion = nodeId => {
|
|
85
|
+
return !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
|
|
86
|
+
};
|
|
85
87
|
|
|
86
88
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
87
89
|
const createHandleKeyDown = otherHandlers => event => {
|
|
@@ -90,7 +92,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
90
92
|
return;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
|
-
// If the tree is empty there will be no focused node
|
|
95
|
+
// If the tree is empty, there will be no focused node
|
|
94
96
|
if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
|
|
95
97
|
return;
|
|
96
98
|
}
|
|
@@ -140,7 +142,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
140
142
|
const nextNode = getNextNode(instance, state.focusedNodeId);
|
|
141
143
|
if (nextNode) {
|
|
142
144
|
event.preventDefault();
|
|
143
|
-
instance.
|
|
145
|
+
instance.focusItem(event, nextNode);
|
|
144
146
|
|
|
145
147
|
// Multi select behavior when pressing Shift + ArrowDown
|
|
146
148
|
// Toggles the selection state of the next node
|
|
@@ -160,7 +162,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
160
162
|
const previousNode = getPreviousNode(instance, state.focusedNodeId);
|
|
161
163
|
if (previousNode) {
|
|
162
164
|
event.preventDefault();
|
|
163
|
-
instance.
|
|
165
|
+
instance.focusItem(event, previousNode);
|
|
164
166
|
|
|
165
167
|
// Multi select behavior when pressing Shift + ArrowUp
|
|
166
168
|
// Toggles the selection state of the previous node
|
|
@@ -179,7 +181,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
179
181
|
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
180
182
|
{
|
|
181
183
|
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
182
|
-
instance.
|
|
184
|
+
instance.focusItem(event, getNextNode(instance, state.focusedNodeId));
|
|
183
185
|
event.preventDefault();
|
|
184
186
|
} else if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
185
187
|
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
@@ -198,7 +200,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
198
200
|
} else {
|
|
199
201
|
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
200
202
|
if (parent) {
|
|
201
|
-
instance.
|
|
203
|
+
instance.focusItem(event, parent);
|
|
202
204
|
event.preventDefault();
|
|
203
205
|
}
|
|
204
206
|
}
|
|
@@ -208,7 +210,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
208
210
|
// Focuses the first node in the tree
|
|
209
211
|
case key === 'Home':
|
|
210
212
|
{
|
|
211
|
-
instance.
|
|
213
|
+
instance.focusItem(event, getFirstNode(instance));
|
|
212
214
|
|
|
213
215
|
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
214
216
|
// Selects the focused node and all nodes up to the first node.
|
|
@@ -222,7 +224,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
222
224
|
// Focuses the last node in the tree
|
|
223
225
|
case key === 'End':
|
|
224
226
|
{
|
|
225
|
-
instance.
|
|
227
|
+
instance.focusItem(event, getLastNode(instance));
|
|
226
228
|
|
|
227
229
|
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
228
230
|
// Selects the focused node and all the nodes down to the last node.
|
|
@@ -259,7 +261,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
259
261
|
{
|
|
260
262
|
const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
|
|
261
263
|
if (matchingNode != null) {
|
|
262
|
-
instance.
|
|
264
|
+
instance.focusItem(event, matchingNode);
|
|
263
265
|
event.preventDefault();
|
|
264
266
|
}
|
|
265
267
|
break;
|
|
@@ -103,7 +103,7 @@ export const useTreeViewNodes = ({
|
|
|
103
103
|
});
|
|
104
104
|
});
|
|
105
105
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
106
|
-
const getNodesToRender =
|
|
106
|
+
const getNodesToRender = () => {
|
|
107
107
|
const getPropsFromNodeId = ({
|
|
108
108
|
id,
|
|
109
109
|
children
|
|
@@ -117,7 +117,7 @@ export const useTreeViewNodes = ({
|
|
|
117
117
|
};
|
|
118
118
|
};
|
|
119
119
|
return state.nodes.nodeTree.map(getPropsFromNodeId);
|
|
120
|
-
}
|
|
120
|
+
};
|
|
121
121
|
populateInstance(instance, {
|
|
122
122
|
getNode,
|
|
123
123
|
getItem,
|