@mui/x-tree-view 7.0.0-beta.5 → 7.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +252 -50
- package/RichTreeView/RichTreeView.js +23 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +23 -22
- package/TreeItem/TreeItem.js +79 -79
- package/TreeItem/TreeItem.types.d.ts +17 -19
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeItem/useTreeItemState.js +2 -2
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +301 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +68 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.js +23 -22
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/hooks/useTreeViewApiRef.d.ts +2 -2
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/helpers.d.ts +1 -0
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -6
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +37 -23
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
- package/internals/useTreeView/useTreeView.js +27 -25
- package/modern/RichTreeView/RichTreeView.js +23 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -22
- package/modern/TreeItem/TreeItem.js +78 -78
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeItem/useTreeItemState.js +2 -2
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +23 -22
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/useTreeView/useTreeView.js +27 -25
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +135 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +23 -22
- package/node/SimpleTreeView/SimpleTreeView.js +23 -22
- package/node/TreeItem/TreeItem.js +78 -78
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeItem/useTreeItemState.js +2 -2
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +23 -22
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +30 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/node/internals/useTreeView/useTreeView.js +27 -25
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +143 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +2 -2
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +138 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
package/TreeView/TreeView.js
CHANGED
|
@@ -69,7 +69,8 @@ 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
|
+
getItem: PropTypes.func.isRequired
|
|
73
74
|
})
|
|
74
75
|
}),
|
|
75
76
|
/**
|
|
@@ -82,17 +83,17 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
82
83
|
classes: PropTypes.object,
|
|
83
84
|
className: PropTypes.string,
|
|
84
85
|
/**
|
|
85
|
-
* Expanded
|
|
86
|
+
* Expanded item ids.
|
|
86
87
|
* Used when the item's expansion is not controlled.
|
|
87
88
|
* @default []
|
|
88
89
|
*/
|
|
89
|
-
|
|
90
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
90
91
|
/**
|
|
91
|
-
* Selected
|
|
92
|
+
* Selected item ids. (Uncontrolled)
|
|
92
93
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
93
94
|
* @default []
|
|
94
95
|
*/
|
|
95
|
-
|
|
96
|
+
defaultSelectedItems: PropTypes.any,
|
|
96
97
|
/**
|
|
97
98
|
* If `true`, will allow focus on disabled items.
|
|
98
99
|
* @default false
|
|
@@ -104,10 +105,10 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
104
105
|
*/
|
|
105
106
|
disableSelection: PropTypes.bool,
|
|
106
107
|
/**
|
|
107
|
-
* Expanded
|
|
108
|
+
* Expanded item ids.
|
|
108
109
|
* Used when the item's expansion is controlled.
|
|
109
110
|
*/
|
|
110
|
-
|
|
111
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
111
112
|
/**
|
|
112
113
|
* This prop is used to help implement the accessibility logic.
|
|
113
114
|
* If you don't provide this prop. It falls back to a randomly generated id.
|
|
@@ -121,42 +122,42 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
121
122
|
/**
|
|
122
123
|
* Callback fired when tree items are expanded/collapsed.
|
|
123
124
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
124
|
-
* @param {array}
|
|
125
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
125
126
|
*/
|
|
126
|
-
|
|
127
|
+
onExpandedItemsChange: PropTypes.func,
|
|
127
128
|
/**
|
|
128
129
|
* Callback fired when a tree item is expanded or collapsed.
|
|
129
130
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
130
|
-
* @param {array}
|
|
131
|
-
* @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.
|
|
132
133
|
*/
|
|
133
|
-
|
|
134
|
+
onItemExpansionToggle: PropTypes.func,
|
|
134
135
|
/**
|
|
135
136
|
* Callback fired when tree items are focused.
|
|
136
137
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
137
|
-
* @param {string}
|
|
138
|
-
* @param {string} value of the focused
|
|
138
|
+
* @param {string} itemId The id of the focused item.
|
|
139
|
+
* @param {string} value of the focused item.
|
|
139
140
|
*/
|
|
140
|
-
|
|
141
|
+
onItemFocus: PropTypes.func,
|
|
141
142
|
/**
|
|
142
143
|
* Callback fired when a tree item is selected or deselected.
|
|
143
144
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
144
|
-
* @param {array}
|
|
145
|
-
* @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.
|
|
146
147
|
*/
|
|
147
|
-
|
|
148
|
+
onItemSelectionToggle: PropTypes.func,
|
|
148
149
|
/**
|
|
149
150
|
* Callback fired when tree items are selected/deselected.
|
|
150
151
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
151
|
-
* @param {string[] | string}
|
|
152
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
152
153
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
153
154
|
*/
|
|
154
|
-
|
|
155
|
+
onSelectedItemsChange: PropTypes.func,
|
|
155
156
|
/**
|
|
156
|
-
* Selected
|
|
157
|
+
* Selected item ids. (Controlled)
|
|
157
158
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
158
159
|
*/
|
|
159
|
-
|
|
160
|
+
selectedItems: PropTypes.any,
|
|
160
161
|
/**
|
|
161
162
|
* The props used for each component slot.
|
|
162
163
|
*/
|
package/hooks/index.d.ts
CHANGED
package/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 @@
|
|
|
1
|
+
export { useTreeItem2Utils } from './useTreeItem2Utils';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { UseTreeItem2Status } from '../../useTreeItem2';
|
|
3
|
+
interface UseTreeItem2Interactions {
|
|
4
|
+
handleExpansion: (event: React.MouseEvent) => void;
|
|
5
|
+
handleSelection: (event: React.MouseEvent) => void;
|
|
6
|
+
}
|
|
7
|
+
interface UseTreeItem2UtilsReturnValue {
|
|
8
|
+
interactions: UseTreeItem2Interactions;
|
|
9
|
+
status: UseTreeItem2Status;
|
|
10
|
+
}
|
|
11
|
+
export declare const useTreeItem2Utils: ({ nodeId, children, }: {
|
|
12
|
+
nodeId: string;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}) => UseTreeItem2UtilsReturnValue;
|
|
15
|
+
export {};
|
|
@@ -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
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { TreeViewAnyPluginSignature,
|
|
2
|
+
import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '../internals/models';
|
|
3
3
|
/**
|
|
4
4
|
* Hook that instantiates a [[TreeViewApiRef]].
|
|
5
5
|
*/
|
|
6
|
-
export declare const useTreeViewApiRef: <
|
|
6
|
+
export declare const useTreeViewApiRef: <TPlugins extends readonly TreeViewAnyPluginSignature[] = [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature]>() => React.MutableRefObject<TreeViewPublicAPI<TPlugins> | undefined>;
|
package/index.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
export * from './TreeItem';
|
|
2
1
|
export * from './TreeView';
|
|
3
2
|
export * from './SimpleTreeView';
|
|
4
3
|
export * from './RichTreeView';
|
|
4
|
+
export * from './TreeItem';
|
|
5
|
+
export * from './TreeItem2';
|
|
6
|
+
export * from './useTreeItem2';
|
|
7
|
+
export * from './TreeItem2Icon';
|
|
8
|
+
export * from './TreeItem2Provider';
|
|
5
9
|
export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
|
|
6
10
|
export * from './models';
|
|
7
11
|
export * from './icons';
|
package/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';
|
|
@@ -4,5 +4,7 @@ import * as React from 'react';
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const TreeViewContext: React.Context<{
|
|
6
6
|
instance: {};
|
|
7
|
-
|
|
7
|
+
publicAPI: {};
|
|
8
|
+
wrapItem: import("../models").TreeItemWrapper;
|
|
9
|
+
runItemPlugins: <TProps extends {}>(props: TProps) => Required<import("../models").TreeViewItemPluginResponse>;
|
|
8
10
|
} | null>;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { MergePluginsProperty, TreeViewAnyPluginSignature, TreeViewInstance,
|
|
2
|
+
import { MergePluginsProperty, TreeItemWrapper, TreeViewAnyPluginSignature, TreeViewInstance, TreeViewItemPluginResponse, TreeViewPublicAPI } from '../models';
|
|
3
3
|
export type TreeViewContextValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> = MergePluginsProperty<TPlugins, 'contextValue'> & {
|
|
4
4
|
instance: TreeViewInstance<TPlugins>;
|
|
5
|
-
|
|
5
|
+
publicAPI: TreeViewPublicAPI<TPlugins>;
|
|
6
|
+
wrapItem: TreeItemWrapper;
|
|
7
|
+
runItemPlugins: <TProps extends {}>(props: TProps) => Required<TreeViewItemPluginResponse>;
|
|
6
8
|
};
|
|
7
9
|
export interface TreeViewProviderProps<TPlugins extends readonly TreeViewAnyPluginSignature[]> {
|
|
8
10
|
value: TreeViewContextValue<TPlugins>;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function useLazyRef<T, U>(init: (arg?: U) => T, initArg?: U): React.MutableRefObject<T>;
|
|
1
|
+
export { default as useLazyRef } from '@mui/utils/useLazyRef';
|
|
@@ -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,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function useOnMount(fn: React.EffectCallback): void;
|
|
1
|
+
export { default as useOnMount } from '@mui/utils/useOnMount';
|
|
@@ -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,11 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
static create(): Timeout;
|
|
3
|
-
currentId: ReturnType<typeof setTimeout> | null;
|
|
4
|
-
/**
|
|
5
|
-
* Executes `fn` after `delay`, clearing any previously scheduled call.
|
|
6
|
-
*/
|
|
7
|
-
start(delay: number, fn: Function): void;
|
|
8
|
-
clear: () => void;
|
|
9
|
-
disposeEffect: () => () => void;
|
|
10
|
-
}
|
|
11
|
-
export declare function useTimeout(): Timeout;
|
|
1
|
+
export { default as useTimeout } from '@mui/utils/useTimeout';
|
|
@@ -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';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { TreeViewAnyPluginSignature, TreeViewPlugin } from './plugin';
|
|
2
2
|
export type DefaultizedProps<P extends {}, RequiredProps extends keyof P, AdditionalProps extends {} = {}> = Omit<P, RequiredProps | keyof AdditionalProps> & Required<Pick<P, RequiredProps>> & AdditionalProps;
|
|
3
|
+
export type SlotComponentPropsFromProps<TProps extends {}, TOverrides extends {}, TOwnerState extends {}> = (Partial<TProps> & TOverrides) | ((ownerState: TOwnerState) => Partial<TProps> & TOverrides);
|
|
3
4
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
4
5
|
export type OptionalIfEmpty<A extends string, B> = keyof B extends never ? Partial<Record<A, B>> : IsAny<B> extends true ? Partial<Record<A, B>> : Record<A, B>;
|
|
5
6
|
export type MergePluginsProperty<TPlugins extends readonly any[], TProperty extends keyof TreeViewAnyPluginSignature> = TPlugins extends readonly [plugin: infer P, ...otherPlugin: infer R] ? P extends TreeViewAnyPluginSignature ? P[TProperty] & MergePluginsProperty<R, TProperty> : {} : {};
|
|
@@ -4,7 +4,7 @@ import { TreeViewModel } from './treeView';
|
|
|
4
4
|
import type { MergePluginsProperty, OptionalIfEmpty } from './helpers';
|
|
5
5
|
import { TreeViewEventLookupElement } from './events';
|
|
6
6
|
import type { TreeViewCorePluginsSignature } from '../corePlugins';
|
|
7
|
-
import
|
|
7
|
+
import { TreeViewItemId } from '../../models';
|
|
8
8
|
export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSignature> {
|
|
9
9
|
instance: TreeViewUsedInstance<TSignature>;
|
|
10
10
|
publicAPI: TreeViewUsedPublicAPI<TSignature>;
|
|
@@ -117,33 +117,36 @@ type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = {
|
|
|
117
117
|
};
|
|
118
118
|
export type TreeViewUsedModels<TSignature extends TreeViewAnyPluginSignature> = TSignature['models'] & RemoveSetValue<MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'models'>>;
|
|
119
119
|
export type TreeViewUsedEvents<TSignature extends TreeViewAnyPluginSignature> = TSignature['events'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'events'>;
|
|
120
|
-
export interface TreeViewItemPluginOptions {
|
|
121
|
-
props:
|
|
122
|
-
ref: React.Ref<HTMLLIElement>;
|
|
120
|
+
export interface TreeViewItemPluginOptions<TProps extends {}> extends TreeViewItemPluginResponse {
|
|
121
|
+
props: TProps;
|
|
123
122
|
}
|
|
124
123
|
export interface TreeViewItemPluginResponse {
|
|
125
124
|
/**
|
|
126
|
-
*
|
|
125
|
+
* Root of the `content` slot enriched by the plugin.
|
|
127
126
|
*/
|
|
128
|
-
|
|
127
|
+
contentRef?: React.RefCallback<HTMLElement> | null;
|
|
129
128
|
/**
|
|
130
|
-
* Ref enriched by the plugin
|
|
129
|
+
* Ref of the `root` slot enriched by the plugin
|
|
131
130
|
*/
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Render function used to add React wrappers around the TreeItem.
|
|
135
|
-
* @param {React.ReactNode} children The TreeItem node before this plugin execution.
|
|
136
|
-
* @returns {React.ReactNode} The wrapped TreeItem.
|
|
137
|
-
*/
|
|
138
|
-
wrapItem?: (children: React.ReactNode) => React.ReactNode;
|
|
131
|
+
rootRef?: React.RefCallback<HTMLLIElement> | null;
|
|
139
132
|
}
|
|
140
|
-
export type TreeViewItemPlugin = (options: TreeViewItemPluginOptions) => void | TreeViewItemPluginResponse;
|
|
133
|
+
export type TreeViewItemPlugin<TProps extends {}> = (options: TreeViewItemPluginOptions<TProps>) => void | TreeViewItemPluginResponse;
|
|
134
|
+
export type TreeItemWrapper = (params: {
|
|
135
|
+
nodeId: TreeViewItemId;
|
|
136
|
+
children: React.ReactNode;
|
|
137
|
+
}) => React.ReactNode;
|
|
141
138
|
export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
|
|
142
139
|
(options: TreeViewPluginOptions<TSignature>): void | TreeViewResponse<TSignature>;
|
|
143
140
|
getDefaultizedParams?: (params: TreeViewUsedParams<TSignature>) => TSignature['defaultizedParams'];
|
|
144
141
|
getInitialState?: (params: TreeViewUsedDefaultizedParams<TSignature>) => TSignature['state'];
|
|
145
142
|
models?: TreeViewModelsInitializer<TSignature>;
|
|
146
143
|
params: Record<keyof TSignature['params'], true>;
|
|
147
|
-
itemPlugin?: TreeViewItemPlugin
|
|
144
|
+
itemPlugin?: TreeViewItemPlugin<any>;
|
|
145
|
+
/**
|
|
146
|
+
* Render function used to add React wrappers around the TreeItem.
|
|
147
|
+
* @param {TreeItemWrapperParams} params The params of the item.
|
|
148
|
+
* @returns {React.ReactNode} The wrapped items.
|
|
149
|
+
*/
|
|
150
|
+
wrapItem?: TreeItemWrapper;
|
|
148
151
|
};
|
|
149
152
|
export {};
|
|
@@ -7,46 +7,46 @@ export const useTreeViewExpansion = ({
|
|
|
7
7
|
params,
|
|
8
8
|
models
|
|
9
9
|
}) => {
|
|
10
|
-
const
|
|
11
|
-
var _params$
|
|
12
|
-
(_params$
|
|
13
|
-
models.
|
|
10
|
+
const setExpandedItems = (event, value) => {
|
|
11
|
+
var _params$onExpandedIte;
|
|
12
|
+
(_params$onExpandedIte = params.onExpandedItemsChange) == null || _params$onExpandedIte.call(params, event, value);
|
|
13
|
+
models.expandedItems.setControlledValue(value);
|
|
14
14
|
};
|
|
15
15
|
const isNodeExpanded = React.useCallback(nodeId => {
|
|
16
|
-
return Array.isArray(models.
|
|
17
|
-
}, [models.
|
|
16
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(nodeId) !== -1 : false;
|
|
17
|
+
}, [models.expandedItems.value]);
|
|
18
18
|
const isNodeExpandable = React.useCallback(nodeId => {
|
|
19
19
|
var _instance$getNode;
|
|
20
20
|
return !!((_instance$getNode = instance.getNode(nodeId)) != null && _instance$getNode.expandable);
|
|
21
21
|
}, [instance]);
|
|
22
|
-
const toggleNodeExpansion = useEventCallback((event,
|
|
23
|
-
if (
|
|
22
|
+
const toggleNodeExpansion = useEventCallback((event, itemId) => {
|
|
23
|
+
if (itemId == null) {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
|
-
const isExpandedBefore = models.
|
|
26
|
+
const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
|
|
27
27
|
let newExpanded;
|
|
28
28
|
if (isExpandedBefore) {
|
|
29
|
-
newExpanded = models.
|
|
29
|
+
newExpanded = models.expandedItems.value.filter(id => id !== itemId);
|
|
30
30
|
} else {
|
|
31
|
-
newExpanded = [
|
|
31
|
+
newExpanded = [itemId].concat(models.expandedItems.value);
|
|
32
32
|
}
|
|
33
|
-
if (params.
|
|
34
|
-
params.
|
|
33
|
+
if (params.onItemExpansionToggle) {
|
|
34
|
+
params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
setExpandedItems(event, newExpanded);
|
|
37
37
|
});
|
|
38
38
|
const expandAllSiblings = (event, nodeId) => {
|
|
39
39
|
const node = instance.getNode(nodeId);
|
|
40
40
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
41
41
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
42
|
-
const newExpanded = models.
|
|
42
|
+
const newExpanded = models.expandedItems.value.concat(diff);
|
|
43
43
|
if (diff.length > 0) {
|
|
44
|
-
if (params.
|
|
44
|
+
if (params.onItemExpansionToggle) {
|
|
45
45
|
diff.forEach(newlyExpandedNodeId => {
|
|
46
|
-
params.
|
|
46
|
+
params.onItemExpansionToggle(event, newlyExpandedNodeId, true);
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
setExpandedItems(event, newExpanded);
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
populateInstance(instance, {
|
|
@@ -57,20 +57,20 @@ export const useTreeViewExpansion = ({
|
|
|
57
57
|
});
|
|
58
58
|
};
|
|
59
59
|
useTreeViewExpansion.models = {
|
|
60
|
-
|
|
61
|
-
getDefaultValue: params => params.
|
|
60
|
+
expandedItems: {
|
|
61
|
+
getDefaultValue: params => params.defaultExpandedItems
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
const DEFAULT_EXPANDED_NODES = [];
|
|
65
65
|
useTreeViewExpansion.getDefaultizedParams = params => {
|
|
66
66
|
var _params$defaultExpand;
|
|
67
67
|
return _extends({}, params, {
|
|
68
|
-
|
|
68
|
+
defaultExpandedItems: (_params$defaultExpand = params.defaultExpandedItems) != null ? _params$defaultExpand : DEFAULT_EXPANDED_NODES
|
|
69
69
|
});
|
|
70
70
|
};
|
|
71
71
|
useTreeViewExpansion.params = {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
expandedItems: true,
|
|
73
|
+
defaultExpandedItems: true,
|
|
74
|
+
onExpandedItemsChange: true,
|
|
75
|
+
onItemExpansionToggle: true
|
|
76
76
|
};
|
|
@@ -9,35 +9,35 @@ export interface UseTreeViewExpansionInstance {
|
|
|
9
9
|
}
|
|
10
10
|
export interface UseTreeViewExpansionParameters {
|
|
11
11
|
/**
|
|
12
|
-
* Expanded
|
|
12
|
+
* Expanded item ids.
|
|
13
13
|
* Used when the item's expansion is controlled.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
expandedItems?: string[];
|
|
16
16
|
/**
|
|
17
|
-
* Expanded
|
|
17
|
+
* Expanded item ids.
|
|
18
18
|
* Used when the item's expansion is not controlled.
|
|
19
19
|
* @default []
|
|
20
20
|
*/
|
|
21
|
-
|
|
21
|
+
defaultExpandedItems?: string[];
|
|
22
22
|
/**
|
|
23
23
|
* Callback fired when tree items are expanded/collapsed.
|
|
24
24
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
25
|
-
* @param {array}
|
|
25
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
26
26
|
*/
|
|
27
|
-
|
|
27
|
+
onExpandedItemsChange?: (event: React.SyntheticEvent, itemIds: string[]) => void;
|
|
28
28
|
/**
|
|
29
29
|
* Callback fired when a tree item is expanded or collapsed.
|
|
30
30
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
31
|
-
* @param {array}
|
|
32
|
-
* @param {array} isExpanded `true` if the
|
|
31
|
+
* @param {array} itemId The itemId of the modified item.
|
|
32
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
33
33
|
*/
|
|
34
|
-
|
|
34
|
+
onItemExpansionToggle?: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
|
|
35
35
|
}
|
|
36
|
-
export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, '
|
|
36
|
+
export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedItems'>;
|
|
37
37
|
export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
|
|
38
38
|
params: UseTreeViewExpansionParameters;
|
|
39
39
|
defaultizedParams: UseTreeViewExpansionDefaultizedParameters;
|
|
40
40
|
instance: UseTreeViewExpansionInstance;
|
|
41
|
-
modelNames: '
|
|
41
|
+
modelNames: 'expandedItems';
|
|
42
42
|
dependantPlugins: [UseTreeViewNodesSignature];
|
|
43
43
|
}>;
|
|
@@ -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(() => {
|
|
@@ -63,12 +63,12 @@ export const useTreeViewFocus = ({
|
|
|
63
63
|
});
|
|
64
64
|
populateInstance(instance, {
|
|
65
65
|
isNodeFocused,
|
|
66
|
-
|
|
66
|
+
focusItem,
|
|
67
67
|
focusRoot,
|
|
68
68
|
focusDefaultNode
|
|
69
69
|
});
|
|
70
70
|
populatePublicAPI(publicAPI, {
|
|
71
|
-
|
|
71
|
+
focusItem
|
|
72
72
|
});
|
|
73
73
|
useInstanceEventHandler(instance, 'removeNode', ({
|
|
74
74
|
id
|
|
@@ -107,5 +107,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
107
107
|
focusedNodeId: null
|
|
108
108
|
});
|
|
109
109
|
useTreeViewFocus.params = {
|
|
110
|
-
|
|
110
|
+
onItemFocus: true
|
|
111
111
|
};
|