@mui/x-tree-view 7.0.0-alpha.1 → 7.0.0-alpha.8
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 +1380 -188
- package/README.md +0 -1
- package/RichTreeView/RichTreeView.d.ts +20 -0
- package/RichTreeView/RichTreeView.js +285 -0
- package/RichTreeView/RichTreeView.types.d.ts +55 -0
- package/RichTreeView/RichTreeView.types.js +1 -0
- package/RichTreeView/index.d.ts +3 -0
- package/RichTreeView/index.js +3 -0
- package/RichTreeView/package.json +6 -0
- package/RichTreeView/richTreeViewClasses.d.ts +7 -0
- package/RichTreeView/richTreeViewClasses.js +6 -0
- package/SimpleTreeView/SimpleTreeView.d.ts +20 -0
- package/SimpleTreeView/SimpleTreeView.js +235 -0
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +6 -0
- package/SimpleTreeView/SimpleTreeView.plugins.js +5 -0
- package/SimpleTreeView/SimpleTreeView.types.d.ts +38 -0
- package/SimpleTreeView/SimpleTreeView.types.js +1 -0
- package/SimpleTreeView/index.d.ts +3 -0
- package/SimpleTreeView/index.js +3 -0
- package/SimpleTreeView/package.json +6 -0
- package/SimpleTreeView/simpleTreeViewClasses.d.ts +7 -0
- package/SimpleTreeView/simpleTreeViewClasses.js +6 -0
- package/TreeItem/TreeItem.js +44 -89
- package/TreeItem/TreeItem.types.d.ts +2 -1
- package/TreeItem/index.d.ts +2 -2
- package/TreeItem/index.js +2 -2
- package/TreeItem/useTreeItem.js +5 -5
- package/TreeView/TreeView.d.ts +4 -0
- package/TreeView/TreeView.js +80 -87
- package/TreeView/TreeView.types.d.ts +4 -26
- package/TreeView/index.d.ts +1 -1
- package/index.d.ts +3 -0
- package/index.js +5 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +1 -2
- package/internals/TreeViewProvider/TreeViewContext.js +1 -14
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
- package/internals/TreeViewProvider/useTreeViewContext.js +7 -1
- package/internals/corePlugins/corePlugins.d.ts +1 -1
- package/internals/corePlugins/corePlugins.js +1 -1
- package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.d.ts +0 -5
- package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
- package/internals/hooks/useLazyRef.d.ts +2 -0
- package/internals/hooks/useLazyRef.js +11 -0
- package/internals/hooks/useOnMount.d.ts +2 -0
- package/internals/hooks/useOnMount.js +7 -0
- package/internals/hooks/useTimeout.d.ts +9 -0
- package/internals/hooks/useTimeout.js +28 -0
- package/internals/models/MuiCancellableEvent.d.ts +4 -0
- package/internals/models/MuiCancellableEvent.js +1 -0
- package/internals/models/plugin.d.ts +24 -0
- package/internals/models/treeView.d.ts +5 -1
- package/internals/plugins/defaultPlugins.d.ts +3 -2
- package/internals/plugins/defaultPlugins.js +2 -1
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +14 -6
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +1 -6
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +32 -17
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +12 -5
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -1
- package/internals/plugins/useTreeViewId/index.d.ts +2 -0
- package/internals/plugins/useTreeViewId/index.js +1 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.d.ts +3 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.js +21 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +17 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
- package/internals/plugins/useTreeViewJSXNodes/index.d.ts +2 -0
- package/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +3 -0
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +115 -0
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +16 -0
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +175 -121
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +5 -2
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +89 -17
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +48 -5
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.d.ts +1 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +49 -28
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -8
- package/internals/useTreeView/useTreeView.js +40 -3
- package/internals/useTreeView/useTreeView.types.d.ts +2 -1
- package/internals/useTreeView/useTreeViewModels.js +2 -2
- package/internals/utils/extractPluginParamsFromProps.d.ts +13 -0
- package/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/internals/utils/warning.d.ts +1 -0
- package/internals/utils/warning.js +14 -0
- package/legacy/RichTreeView/RichTreeView.js +279 -0
- package/legacy/RichTreeView/RichTreeView.types.js +1 -0
- package/legacy/RichTreeView/index.js +3 -0
- package/legacy/RichTreeView/richTreeViewClasses.js +6 -0
- package/legacy/SimpleTreeView/SimpleTreeView.js +232 -0
- package/legacy/SimpleTreeView/SimpleTreeView.plugins.js +6 -0
- package/legacy/SimpleTreeView/SimpleTreeView.types.js +1 -0
- package/legacy/SimpleTreeView/index.js +3 -0
- package/legacy/SimpleTreeView/simpleTreeViewClasses.js +6 -0
- package/legacy/TreeItem/TreeItem.js +49 -103
- package/legacy/TreeItem/index.js +2 -2
- package/legacy/TreeItem/useTreeItem.js +5 -5
- package/legacy/TreeView/TreeView.js +80 -82
- package/legacy/index.js +5 -2
- package/legacy/internals/TreeViewProvider/TreeViewContext.js +1 -14
- package/legacy/internals/TreeViewProvider/useTreeViewContext.js +5 -1
- package/legacy/internals/corePlugins/corePlugins.js +1 -1
- package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
- package/legacy/internals/hooks/useLazyRef.js +11 -0
- package/legacy/internals/hooks/useOnMount.js +7 -0
- package/legacy/internals/hooks/useTimeout.js +38 -0
- package/legacy/internals/models/MuiCancellableEvent.js +1 -0
- package/legacy/internals/plugins/defaultPlugins.js +2 -1
- package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +17 -8
- package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +32 -17
- package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -6
- package/legacy/internals/plugins/useTreeViewId/index.js +1 -0
- package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +24 -0
- package/legacy/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
- package/legacy/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
- package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +121 -0
- package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
- package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +177 -119
- package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +96 -20
- package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +53 -28
- package/legacy/internals/useTreeView/useTreeView.js +39 -3
- package/legacy/internals/useTreeView/useTreeViewModels.js +2 -2
- package/legacy/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/legacy/internals/utils/warning.js +15 -0
- package/legacy/models/index.js +1 -0
- package/legacy/models/items.js +1 -0
- package/models/index.d.ts +1 -0
- package/models/index.js +1 -0
- package/models/items.d.ts +7 -0
- package/models/items.js +1 -0
- package/models/package.json +6 -0
- package/modern/RichTreeView/RichTreeView.js +283 -0
- package/modern/RichTreeView/RichTreeView.types.js +1 -0
- package/modern/RichTreeView/index.js +3 -0
- package/modern/RichTreeView/richTreeViewClasses.js +6 -0
- package/modern/SimpleTreeView/SimpleTreeView.js +234 -0
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +5 -0
- package/modern/SimpleTreeView/SimpleTreeView.types.js +1 -0
- package/modern/SimpleTreeView/index.js +3 -0
- package/modern/SimpleTreeView/simpleTreeViewClasses.js +6 -0
- package/modern/TreeItem/TreeItem.js +44 -88
- package/modern/TreeItem/index.js +2 -2
- package/modern/TreeItem/useTreeItem.js +5 -5
- package/modern/TreeView/TreeView.js +80 -87
- package/modern/index.js +5 -2
- package/modern/internals/TreeViewProvider/TreeViewContext.js +1 -14
- package/modern/internals/TreeViewProvider/useTreeViewContext.js +7 -1
- package/modern/internals/corePlugins/corePlugins.js +1 -1
- package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
- package/modern/internals/hooks/useLazyRef.js +11 -0
- package/modern/internals/hooks/useOnMount.js +7 -0
- package/modern/internals/hooks/useTimeout.js +28 -0
- package/modern/internals/models/MuiCancellableEvent.js +1 -0
- package/modern/internals/plugins/defaultPlugins.js +2 -1
- package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +14 -6
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +33 -18
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -7
- package/modern/internals/plugins/useTreeViewId/index.js +1 -0
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +21 -0
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
- package/modern/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +114 -0
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +174 -121
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +88 -17
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +50 -29
- package/modern/internals/useTreeView/useTreeView.js +40 -3
- package/modern/internals/useTreeView/useTreeViewModels.js +2 -2
- package/modern/internals/utils/extractPluginParamsFromProps.js +27 -0
- package/modern/internals/utils/warning.js +14 -0
- package/modern/models/index.js +1 -0
- package/modern/models/items.js +1 -0
- package/node/RichTreeView/RichTreeView.js +291 -0
- package/node/RichTreeView/RichTreeView.types.js +5 -0
- package/node/RichTreeView/index.js +27 -0
- package/node/RichTreeView/richTreeViewClasses.js +14 -0
- package/node/SimpleTreeView/SimpleTreeView.js +242 -0
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +11 -0
- package/node/SimpleTreeView/SimpleTreeView.types.js +5 -0
- package/node/SimpleTreeView/index.js +27 -0
- package/node/SimpleTreeView/simpleTreeViewClasses.js +14 -0
- package/node/TreeItem/TreeItem.js +44 -88
- package/node/TreeItem/index.js +11 -15
- package/node/TreeItem/useTreeItem.js +5 -5
- package/node/TreeView/TreeView.js +80 -87
- package/node/index.js +38 -2
- package/node/internals/TreeViewProvider/TreeViewContext.js +2 -15
- package/node/internals/TreeViewProvider/useTreeViewContext.js +7 -1
- package/node/internals/corePlugins/corePlugins.js +1 -1
- package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
- package/node/internals/hooks/useLazyRef.js +19 -0
- package/node/internals/hooks/useOnMount.js +15 -0
- package/node/internals/hooks/useTimeout.js +34 -0
- package/node/internals/models/MuiCancellableEvent.js +5 -0
- package/node/internals/plugins/defaultPlugins.js +2 -1
- package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +15 -8
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +33 -18
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -7
- package/node/internals/plugins/useTreeViewId/index.js +12 -0
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +31 -0
- package/node/internals/plugins/useTreeViewId/useTreeViewId.types.js +5 -0
- package/node/internals/plugins/useTreeViewJSXNodes/index.js +12 -0
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +124 -0
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +5 -0
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +174 -121
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +89 -18
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +50 -29
- package/node/internals/useTreeView/useTreeView.js +40 -3
- package/node/internals/useTreeView/useTreeViewModels.js +2 -2
- package/node/internals/utils/extractPluginParamsFromProps.js +34 -0
- package/node/internals/utils/warning.js +21 -0
- package/node/models/index.js +16 -0
- package/node/models/items.js +5 -0
- package/package.json +8 -7
- package/themeAugmentation/components.d.ts +14 -4
- package/themeAugmentation/overrides.d.ts +8 -4
- package/themeAugmentation/props.d.ts +7 -3
|
@@ -1,20 +1,52 @@
|
|
|
1
1
|
import { TreeViewNode, DefaultizedProps, TreeViewPluginSignature } from '../../models';
|
|
2
|
+
import { TreeViewItemId } from '../../../models';
|
|
3
|
+
interface TreeViewNodeProps {
|
|
4
|
+
label: string;
|
|
5
|
+
nodeId: string;
|
|
6
|
+
id: string | undefined;
|
|
7
|
+
children?: TreeViewNodeProps[];
|
|
8
|
+
}
|
|
2
9
|
export interface UseTreeViewNodesInstance {
|
|
3
10
|
getNode: (nodeId: string) => TreeViewNode;
|
|
4
|
-
|
|
5
|
-
removeNode: (nodeId: string) => void;
|
|
11
|
+
getNodesToRender: () => TreeViewNodeProps[];
|
|
6
12
|
getChildrenIds: (nodeId: string | null) => string[];
|
|
7
13
|
getNavigableChildrenIds: (nodeId: string | null) => string[];
|
|
8
14
|
isNodeDisabled: (nodeId: string | null) => nodeId is string;
|
|
9
15
|
}
|
|
10
|
-
export interface UseTreeViewNodesParameters {
|
|
16
|
+
export interface UseTreeViewNodesParameters<R extends {}> {
|
|
11
17
|
/**
|
|
12
18
|
* If `true`, will allow focus on disabled items.
|
|
13
19
|
* @default false
|
|
14
20
|
*/
|
|
15
21
|
disabledItemsFocusable?: boolean;
|
|
22
|
+
items: readonly R[];
|
|
23
|
+
/**
|
|
24
|
+
* Used to determine if a given item should be disabled.
|
|
25
|
+
* @template R
|
|
26
|
+
* @param {R} item The item to check.
|
|
27
|
+
* @returns {boolean} `true` if the item should be disabled.
|
|
28
|
+
*/
|
|
29
|
+
isItemDisabled?: (item: R) => boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Used to determine the string label for a given item.
|
|
32
|
+
*
|
|
33
|
+
* @template R
|
|
34
|
+
* @param {R} item The item to check.
|
|
35
|
+
* @returns {string} The label of the item.
|
|
36
|
+
* @default `(item) => item.label`
|
|
37
|
+
*/
|
|
38
|
+
getItemLabel?: (item: R) => string;
|
|
39
|
+
/**
|
|
40
|
+
* Used to determine the string label for a given item.
|
|
41
|
+
*
|
|
42
|
+
* @template R
|
|
43
|
+
* @param {R} item The item to check.
|
|
44
|
+
* @returns {string} The id of the item.
|
|
45
|
+
* @default `(item) => item.id`
|
|
46
|
+
*/
|
|
47
|
+
getItemId?: (item: R) => TreeViewItemId;
|
|
16
48
|
}
|
|
17
|
-
export type UseTreeViewNodesDefaultizedParameters = DefaultizedProps<UseTreeViewNodesParameters
|
|
49
|
+
export type UseTreeViewNodesDefaultizedParameters<R extends {}> = DefaultizedProps<UseTreeViewNodesParameters<R>, 'disabledItemsFocusable'>;
|
|
18
50
|
interface UseTreeViewNodesEventLookup {
|
|
19
51
|
removeNode: {
|
|
20
52
|
params: {
|
|
@@ -22,6 +54,17 @@ interface UseTreeViewNodesEventLookup {
|
|
|
22
54
|
};
|
|
23
55
|
};
|
|
24
56
|
}
|
|
25
|
-
export
|
|
57
|
+
export interface TreeViewNodeIdAndChildren {
|
|
58
|
+
id: TreeViewItemId;
|
|
59
|
+
children?: TreeViewNodeIdAndChildren[];
|
|
60
|
+
}
|
|
61
|
+
export interface UseTreeViewNodesState {
|
|
62
|
+
nodeTree: TreeViewNodeIdAndChildren[];
|
|
63
|
+
nodeMap: TreeViewNodeMap;
|
|
64
|
+
}
|
|
65
|
+
export type UseTreeViewNodesSignature = TreeViewPluginSignature<UseTreeViewNodesParameters<any>, UseTreeViewNodesDefaultizedParameters<any>, UseTreeViewNodesInstance, UseTreeViewNodesEventLookup, UseTreeViewNodesState, never, [
|
|
26
66
|
]>;
|
|
67
|
+
export type TreeViewNodeMap = {
|
|
68
|
+
[nodeId: string]: TreeViewNode;
|
|
69
|
+
};
|
|
27
70
|
export {};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TreeViewPlugin } from '../../models';
|
|
2
2
|
import { UseTreeViewSelectionSignature } from './useTreeViewSelection.types';
|
|
3
|
-
export declare const useTreeViewSelection: TreeViewPlugin<UseTreeViewSelectionSignature
|
|
3
|
+
export declare const useTreeViewSelection: TreeViewPlugin<UseTreeViewSelectionSignature>;
|
|
@@ -10,30 +10,49 @@ export const useTreeViewSelection = ({
|
|
|
10
10
|
const lastSelectedNode = React.useRef(null);
|
|
11
11
|
const lastSelectionWasRange = React.useRef(false);
|
|
12
12
|
const currentRangeSelection = React.useRef([]);
|
|
13
|
-
const isNodeSelected = nodeId => Array.isArray(models.
|
|
13
|
+
const isNodeSelected = nodeId => Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
|
|
14
|
+
const setSelectedNodes = (event, newSelectedNodes) => {
|
|
15
|
+
if (params.onNodeSelectionToggle) {
|
|
16
|
+
if (params.multiSelect) {
|
|
17
|
+
const addedNodes = newSelectedNodes.filter(nodeId => !instance.isNodeSelected(nodeId));
|
|
18
|
+
const removedNodes = models.selectedNodes.value.filter(nodeId => !newSelectedNodes.includes(nodeId));
|
|
19
|
+
addedNodes.forEach(nodeId => {
|
|
20
|
+
params.onNodeSelectionToggle(event, nodeId, true);
|
|
21
|
+
});
|
|
22
|
+
removedNodes.forEach(nodeId => {
|
|
23
|
+
params.onNodeSelectionToggle(event, nodeId, false);
|
|
24
|
+
});
|
|
25
|
+
} else if (newSelectedNodes !== models.selectedNodes.value) {
|
|
26
|
+
if (models.selectedNodes.value != null) {
|
|
27
|
+
params.onNodeSelectionToggle(event, models.selectedNodes.value, false);
|
|
28
|
+
}
|
|
29
|
+
if (newSelectedNodes != null) {
|
|
30
|
+
params.onNodeSelectionToggle(event, newSelectedNodes, true);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (params.onSelectedNodesChange) {
|
|
35
|
+
params.onSelectedNodesChange(event, newSelectedNodes);
|
|
36
|
+
}
|
|
37
|
+
models.selectedNodes.setValue(newSelectedNodes);
|
|
38
|
+
};
|
|
14
39
|
const selectNode = (event, nodeId, multiple = false) => {
|
|
15
40
|
if (params.disableSelection) {
|
|
16
41
|
return;
|
|
17
42
|
}
|
|
18
43
|
if (multiple) {
|
|
19
|
-
if (Array.isArray(models.
|
|
44
|
+
if (Array.isArray(models.selectedNodes.value)) {
|
|
20
45
|
let newSelected;
|
|
21
|
-
if (models.
|
|
22
|
-
newSelected = models.
|
|
46
|
+
if (models.selectedNodes.value.indexOf(nodeId) !== -1) {
|
|
47
|
+
newSelected = models.selectedNodes.value.filter(id => id !== nodeId);
|
|
23
48
|
} else {
|
|
24
|
-
newSelected = [nodeId].concat(models.
|
|
49
|
+
newSelected = [nodeId].concat(models.selectedNodes.value);
|
|
25
50
|
}
|
|
26
|
-
|
|
27
|
-
params.onNodeSelect(event, newSelected);
|
|
28
|
-
}
|
|
29
|
-
models.selected.setValue(newSelected);
|
|
51
|
+
setSelectedNodes(event, newSelected);
|
|
30
52
|
}
|
|
31
53
|
} else {
|
|
32
54
|
const newSelected = params.multiSelect ? [nodeId] : nodeId;
|
|
33
|
-
|
|
34
|
-
params.onNodeSelect(event, newSelected);
|
|
35
|
-
}
|
|
36
|
-
models.selected.setValue(newSelected);
|
|
55
|
+
setSelectedNodes(event, newSelected);
|
|
37
56
|
}
|
|
38
57
|
lastSelectedNode.current = nodeId;
|
|
39
58
|
lastSelectionWasRange.current = false;
|
|
@@ -50,7 +69,7 @@ export const useTreeViewSelection = ({
|
|
|
50
69
|
return nodes;
|
|
51
70
|
};
|
|
52
71
|
const handleRangeArrowSelect = (event, nodes) => {
|
|
53
|
-
let base = models.
|
|
72
|
+
let base = models.selectedNodes.value.slice();
|
|
54
73
|
const {
|
|
55
74
|
start,
|
|
56
75
|
next,
|
|
@@ -74,13 +93,10 @@ export const useTreeViewSelection = ({
|
|
|
74
93
|
base.push(next);
|
|
75
94
|
currentRangeSelection.current.push(current, next);
|
|
76
95
|
}
|
|
77
|
-
|
|
78
|
-
params.onNodeSelect(event, base);
|
|
79
|
-
}
|
|
80
|
-
models.selected.setValue(base);
|
|
96
|
+
setSelectedNodes(event, base);
|
|
81
97
|
};
|
|
82
98
|
const handleRangeSelect = (event, nodes) => {
|
|
83
|
-
let base = models.
|
|
99
|
+
let base = models.selectedNodes.value.slice();
|
|
84
100
|
const {
|
|
85
101
|
start,
|
|
86
102
|
end
|
|
@@ -94,10 +110,7 @@ export const useTreeViewSelection = ({
|
|
|
94
110
|
currentRangeSelection.current = range;
|
|
95
111
|
let newSelected = base.concat(range);
|
|
96
112
|
newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
|
|
97
|
-
|
|
98
|
-
params.onNodeSelect(event, newSelected);
|
|
99
|
-
}
|
|
100
|
-
models.selected.setValue(newSelected);
|
|
113
|
+
setSelectedNodes(event, newSelected);
|
|
101
114
|
};
|
|
102
115
|
const selectRange = (event, nodes, stacked = false) => {
|
|
103
116
|
if (params.disableSelection) {
|
|
@@ -156,17 +169,25 @@ export const useTreeViewSelection = ({
|
|
|
156
169
|
};
|
|
157
170
|
};
|
|
158
171
|
useTreeViewSelection.models = {
|
|
159
|
-
|
|
160
|
-
controlledProp: '
|
|
161
|
-
defaultProp: '
|
|
172
|
+
selectedNodes: {
|
|
173
|
+
controlledProp: 'selectedNodes',
|
|
174
|
+
defaultProp: 'defaultSelectedNodes'
|
|
162
175
|
}
|
|
163
176
|
};
|
|
164
|
-
const
|
|
177
|
+
const DEFAULT_SELECTED_NODES = [];
|
|
165
178
|
useTreeViewSelection.getDefaultizedParams = params => {
|
|
166
179
|
var _params$disableSelect, _params$multiSelect, _params$defaultSelect;
|
|
167
180
|
return _extends({}, params, {
|
|
168
181
|
disableSelection: (_params$disableSelect = params.disableSelection) != null ? _params$disableSelect : false,
|
|
169
182
|
multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
|
|
170
|
-
|
|
183
|
+
defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
|
|
171
184
|
});
|
|
185
|
+
};
|
|
186
|
+
useTreeViewSelection.params = {
|
|
187
|
+
disableSelection: true,
|
|
188
|
+
multiSelect: true,
|
|
189
|
+
defaultSelectedNodes: true,
|
|
190
|
+
selectedNodes: true,
|
|
191
|
+
onSelectedNodesChange: true,
|
|
192
|
+
onNodeSelectionToggle: true
|
|
172
193
|
};
|
|
@@ -21,27 +21,34 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
21
21
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
22
22
|
* @default []
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
defaultSelectedNodes?: TreeViewSelectionValue<Multiple>;
|
|
25
25
|
/**
|
|
26
26
|
* Selected node ids. (Controlled)
|
|
27
27
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
selectedNodes?: TreeViewSelectionValue<Multiple>;
|
|
30
30
|
/**
|
|
31
31
|
* If true `ctrl` and `shift` will trigger multiselect.
|
|
32
32
|
* @default false
|
|
33
33
|
*/
|
|
34
34
|
multiSelect?: Multiple;
|
|
35
35
|
/**
|
|
36
|
-
* Callback fired when tree items are selected/
|
|
36
|
+
* Callback fired when tree items are selected/deselected.
|
|
37
37
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
38
|
-
* @param {string[] | string} nodeIds
|
|
39
|
-
* this is an array of strings; when false (default) a string.
|
|
38
|
+
* @param {string[] | string} nodeIds The ids of the selected nodes.
|
|
39
|
+
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
onSelectedNodesChange?: (event: React.SyntheticEvent, nodeIds: TreeViewSelectionValue<Multiple>) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Callback fired when a tree item is selected or deselected.
|
|
44
|
+
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
45
|
+
* @param {array} nodeId The nodeId of the modified node.
|
|
46
|
+
* @param {array} isSelected `true` if the node has just been selected, `false` if it has just been deselected.
|
|
47
|
+
*/
|
|
48
|
+
onNodeSelectionToggle?: (event: React.SyntheticEvent, nodeId: string, isSelected: boolean) => void;
|
|
42
49
|
}
|
|
43
|
-
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | '
|
|
44
|
-
export type UseTreeViewSelectionSignature
|
|
50
|
+
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedNodes' | 'multiSelect'>;
|
|
51
|
+
export type UseTreeViewSelectionSignature = TreeViewPluginSignature<UseTreeViewSelectionParameters<any>, UseTreeViewSelectionDefaultizedParameters<any>, UseTreeViewSelectionInstance, {}, {}, 'selectedNodes', [
|
|
45
52
|
UseTreeViewNodesSignature,
|
|
46
53
|
UseTreeViewExpansionSignature,
|
|
47
54
|
UseTreeViewNodesSignature
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import useForkRef from '@mui/utils/useForkRef';
|
|
4
|
-
import { DEFAULT_TREE_VIEW_CONTEXT_VALUE } from '../TreeViewProvider/TreeViewContext';
|
|
5
4
|
import { useTreeViewModels } from './useTreeViewModels';
|
|
6
5
|
import { TREE_VIEW_CORE_PLUGINS } from '../corePlugins';
|
|
7
6
|
export const useTreeView = inParams => {
|
|
@@ -27,7 +26,7 @@ export const useTreeView = inParams => {
|
|
|
27
26
|
return temp;
|
|
28
27
|
});
|
|
29
28
|
const rootPropsGetters = [];
|
|
30
|
-
let contextValue =
|
|
29
|
+
let contextValue = {};
|
|
31
30
|
const runPlugin = plugin => {
|
|
32
31
|
const pluginResponse = plugin({
|
|
33
32
|
instance,
|
|
@@ -45,6 +44,43 @@ export const useTreeView = inParams => {
|
|
|
45
44
|
}
|
|
46
45
|
};
|
|
47
46
|
plugins.forEach(runPlugin);
|
|
47
|
+
contextValue.runItemPlugins = ({
|
|
48
|
+
props,
|
|
49
|
+
ref
|
|
50
|
+
}) => {
|
|
51
|
+
let finalProps = props;
|
|
52
|
+
let finalRef = ref;
|
|
53
|
+
const itemWrappers = [];
|
|
54
|
+
plugins.forEach(plugin => {
|
|
55
|
+
if (!plugin.itemPlugin) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const itemPluginResponse = plugin.itemPlugin({
|
|
59
|
+
props: finalProps,
|
|
60
|
+
ref: finalRef
|
|
61
|
+
});
|
|
62
|
+
if (itemPluginResponse != null && itemPluginResponse.props) {
|
|
63
|
+
finalProps = itemPluginResponse.props;
|
|
64
|
+
}
|
|
65
|
+
if (itemPluginResponse != null && itemPluginResponse.ref) {
|
|
66
|
+
finalRef = itemPluginResponse.ref;
|
|
67
|
+
}
|
|
68
|
+
if (itemPluginResponse != null && itemPluginResponse.wrapItem) {
|
|
69
|
+
itemWrappers.push(itemPluginResponse.wrapItem);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
props: finalProps,
|
|
74
|
+
ref: finalRef,
|
|
75
|
+
wrapItem: children => {
|
|
76
|
+
let finalChildren = children;
|
|
77
|
+
itemWrappers.forEach(itemWrapper => {
|
|
78
|
+
finalChildren = itemWrapper(finalChildren);
|
|
79
|
+
});
|
|
80
|
+
return finalChildren;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
};
|
|
48
84
|
const getRootProps = (otherHandlers = {}) => {
|
|
49
85
|
const rootProps = _extends({
|
|
50
86
|
role: 'tree',
|
|
@@ -60,6 +96,7 @@ export const useTreeView = inParams => {
|
|
|
60
96
|
return {
|
|
61
97
|
getRootProps,
|
|
62
98
|
rootRef: handleRootRef,
|
|
63
|
-
contextValue
|
|
99
|
+
contextValue,
|
|
100
|
+
instance: instance
|
|
64
101
|
};
|
|
65
102
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { EventHandlers } from '@mui/base/utils';
|
|
3
3
|
import type { TreeViewContextValue } from '../TreeViewProvider';
|
|
4
|
-
import { TreeViewAnyPluginSignature, TreeViewPlugin, ConvertPluginsIntoSignatures, MergePluginsProperty } from '../models';
|
|
4
|
+
import { TreeViewAnyPluginSignature, TreeViewPlugin, ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewInstance } from '../models';
|
|
5
5
|
export type UseTreeViewParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> = {
|
|
6
6
|
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
7
7
|
plugins: TPlugins;
|
|
@@ -17,4 +17,5 @@ export interface UseTreeViewReturnValue<TPlugins extends readonly TreeViewAnyPlu
|
|
|
17
17
|
getRootProps: <TOther extends EventHandlers = {}>(otherHandlers?: TOther) => UseTreeViewRootSlotProps;
|
|
18
18
|
rootRef: React.RefCallback<HTMLUListElement> | null;
|
|
19
19
|
contextValue: TreeViewContextValue<TPlugins>;
|
|
20
|
+
instance: TreeViewInstance<TPlugins>;
|
|
20
21
|
}
|
|
@@ -44,7 +44,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
44
44
|
const defaultProp = props[model.defaultProp];
|
|
45
45
|
React.useEffect(() => {
|
|
46
46
|
if (model.isControlled !== (controlled !== undefined)) {
|
|
47
|
-
console.error([`MUI: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
|
|
47
|
+
console.error([`MUI X: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
|
|
48
48
|
}
|
|
49
49
|
}, [controlled]);
|
|
50
50
|
const {
|
|
@@ -52,7 +52,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
52
52
|
} = React.useRef(defaultProp);
|
|
53
53
|
React.useEffect(() => {
|
|
54
54
|
if (!model.isControlled && defaultValue !== defaultProp) {
|
|
55
|
-
console.error([`MUI: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
|
|
55
|
+
console.error([`MUI X: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
|
|
56
56
|
}
|
|
57
57
|
}, [JSON.stringify(defaultValue)]);
|
|
58
58
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewPlugin } from '../models';
|
|
3
|
+
export declare const extractPluginParamsFromProps: <TProps extends {}, TPlugins extends readonly TreeViewPlugin<any>[]>({ props, plugins, rootRef, }: {
|
|
4
|
+
props: TProps;
|
|
5
|
+
plugins: TPlugins;
|
|
6
|
+
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
7
|
+
}) => {
|
|
8
|
+
pluginParams: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params"> & {
|
|
9
|
+
plugins: TPlugins;
|
|
10
|
+
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
11
|
+
};
|
|
12
|
+
otherProps: Omit<TProps, keyof MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params">>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const extractPluginParamsFromProps = ({
|
|
2
|
+
props,
|
|
3
|
+
plugins,
|
|
4
|
+
rootRef
|
|
5
|
+
}) => {
|
|
6
|
+
const paramsLookup = {};
|
|
7
|
+
plugins.forEach(plugin => {
|
|
8
|
+
Object.assign(paramsLookup, plugin.params);
|
|
9
|
+
});
|
|
10
|
+
const pluginParams = {
|
|
11
|
+
plugins,
|
|
12
|
+
rootRef
|
|
13
|
+
};
|
|
14
|
+
const otherProps = {};
|
|
15
|
+
Object.keys(props).forEach(propName => {
|
|
16
|
+
const prop = props[propName];
|
|
17
|
+
if (paramsLookup[propName]) {
|
|
18
|
+
pluginParams[propName] = prop;
|
|
19
|
+
} else {
|
|
20
|
+
otherProps[propName] = prop;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
pluginParams,
|
|
25
|
+
otherProps
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const buildWarning: (message: string | string[], gravity?: 'warning' | 'error') => () => void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const buildWarning = (message, gravity = 'warning') => {
|
|
2
|
+
let alreadyWarned = false;
|
|
3
|
+
const cleanMessage = Array.isArray(message) ? message.join('\n') : message;
|
|
4
|
+
return () => {
|
|
5
|
+
if (!alreadyWarned) {
|
|
6
|
+
alreadyWarned = true;
|
|
7
|
+
if (gravity === 'error') {
|
|
8
|
+
console.error(cleanMessage);
|
|
9
|
+
} else {
|
|
10
|
+
console.warn(cleanMessage);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
};
|