@mui/x-tree-view 7.0.0-alpha.8 → 7.0.0-alpha.9
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 +379 -2
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +10 -36
- package/RichTreeView/RichTreeView.types.d.ts +6 -9
- package/RichTreeView/index.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +12 -37
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +4 -2
- package/SimpleTreeView/SimpleTreeView.types.d.ts +8 -7
- package/SimpleTreeView/index.d.ts +1 -1
- package/TreeItem/TreeItem.js +62 -39
- package/TreeItem/TreeItem.types.d.ts +33 -17
- package/TreeItem/TreeItemContent.d.ts +0 -3
- package/TreeItem/TreeItemContent.js +2 -5
- package/TreeItem/index.d.ts +2 -2
- package/TreeItem/index.js +1 -1
- package/TreeItem/{useTreeItem.d.ts → useTreeItemState.d.ts} +1 -1
- package/{modern/TreeItem/useTreeItem.js → TreeItem/useTreeItemState.js} +4 -2
- package/TreeView/TreeView.js +0 -21
- package/TreeView/TreeView.types.d.ts +5 -1
- package/TreeView/index.d.ts +1 -1
- package/icons/icons.d.ts +6 -0
- package/icons/icons.js +9 -0
- package/icons/index.d.ts +1 -0
- package/icons/index.js +1 -0
- package/icons/package.json +6 -0
- package/index.d.ts +1 -0
- package/index.js +3 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +4 -2
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -11
- package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.types.d.ts +3 -2
- package/internals/index.d.ts +15 -0
- package/internals/index.js +4 -0
- package/internals/models/helpers.d.ts +7 -1
- package/internals/models/plugin.d.ts +64 -20
- package/internals/models/treeView.d.ts +1 -2
- package/internals/package.json +6 -0
- package/internals/plugins/defaultPlugins.d.ts +6 -4
- package/internals/plugins/defaultPlugins.js +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +8 -10
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -3
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +12 -6
- package/internals/plugins/useTreeViewIcons/index.d.ts +2 -0
- package/internals/plugins/useTreeViewIcons/index.js +1 -0
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.d.ts +3 -0
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +43 -0
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +6 -2
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +6 -4
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +9 -6
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +10 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -5
- package/internals/useTreeView/useTreeView.js +7 -3
- package/internals/useTreeView/useTreeView.types.d.ts +6 -6
- package/internals/useTreeView/useTreeViewModels.js +10 -11
- package/internals/utils/extractPluginParamsFromProps.d.ts +8 -5
- package/internals/utils/extractPluginParamsFromProps.js +17 -6
- package/legacy/RichTreeView/RichTreeView.js +3 -27
- package/legacy/SimpleTreeView/SimpleTreeView.js +4 -28
- package/legacy/TreeItem/TreeItem.js +63 -39
- package/legacy/TreeItem/TreeItemContent.js +9 -12
- package/legacy/TreeItem/index.js +1 -1
- package/legacy/TreeItem/{useTreeItem.js → useTreeItemState.js} +2 -2
- package/legacy/TreeView/TreeView.js +0 -21
- package/legacy/icons/icons.js +9 -0
- package/legacy/icons/index.js +1 -0
- package/legacy/index.js +3 -2
- package/legacy/internals/index.js +4 -0
- package/legacy/internals/plugins/defaultPlugins.js +2 -2
- package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +10 -10
- package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -6
- package/legacy/internals/plugins/useTreeViewIcons/index.js +1 -0
- package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +21 -0
- package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
- package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -6
- package/legacy/internals/useTreeView/useTreeView.js +6 -2
- package/legacy/internals/useTreeView/useTreeViewModels.js +10 -11
- package/legacy/internals/utils/extractPluginParamsFromProps.js +11 -2
- package/modern/RichTreeView/RichTreeView.js +10 -36
- package/modern/SimpleTreeView/SimpleTreeView.js +12 -37
- package/modern/TreeItem/TreeItem.js +61 -39
- package/modern/TreeItem/TreeItemContent.js +2 -5
- package/modern/TreeItem/index.js +1 -1
- package/{TreeItem/useTreeItem.js → modern/TreeItem/useTreeItemState.js} +4 -2
- package/modern/TreeView/TreeView.js +0 -21
- package/modern/icons/icons.js +9 -0
- package/modern/icons/index.js +1 -0
- package/modern/index.js +3 -2
- package/modern/internals/index.js +4 -0
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
- package/modern/internals/plugins/useTreeViewIcons/index.js +1 -0
- package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +8 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
- package/modern/internals/useTreeView/useTreeView.js +7 -3
- package/modern/internals/useTreeView/useTreeViewModels.js +10 -11
- package/modern/internals/utils/extractPluginParamsFromProps.js +17 -6
- package/node/RichTreeView/RichTreeView.js +10 -36
- package/node/SimpleTreeView/SimpleTreeView.js +12 -37
- package/node/TreeItem/TreeItem.js +61 -39
- package/node/TreeItem/TreeItemContent.js +2 -5
- package/node/TreeItem/index.js +4 -4
- package/node/TreeItem/{useTreeItem.js → useTreeItemState.js} +5 -3
- package/node/TreeView/TreeView.js +0 -21
- package/node/icons/icons.js +17 -0
- package/node/icons/index.js +16 -0
- package/node/index.js +13 -1
- package/node/internals/index.js +33 -0
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
- package/node/internals/plugins/useTreeViewIcons/index.js +12 -0
- package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +29 -0
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +8 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
- package/node/internals/useTreeView/useTreeView.js +7 -3
- package/node/internals/useTreeView/useTreeViewModels.js +10 -11
- package/node/internals/utils/extractPluginParamsFromProps.js +18 -6
- package/package.json +7 -7
- package/themeAugmentation/components.d.ts +4 -4
- package/internals/plugins/useTreeViewContextValueBuilder/index.d.ts +0 -2
- package/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.d.ts +0 -3
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
- package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +0 -29
- package/legacy/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
- package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -34
- package/modern/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
- package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
- package/node/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -12
- package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -39
- /package/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
- /package/legacy/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { EventHandlers } from '@mui/base/utils';
|
|
3
3
|
import { TreeViewModel } from './treeView';
|
|
4
|
-
import type {
|
|
5
|
-
import type { MergePluginsProperty } from './helpers';
|
|
4
|
+
import type { MergePluginsProperty, OptionalIfEmpty } from './helpers';
|
|
6
5
|
import { TreeViewEventLookupElement } from './events';
|
|
7
6
|
import type { TreeViewCorePluginsSignature } from '../corePlugins';
|
|
8
7
|
import type { TreeItemProps } from '../../TreeItem';
|
|
@@ -10,32 +9,71 @@ export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSigna
|
|
|
10
9
|
instance: TreeViewUsedInstance<TSignature>;
|
|
11
10
|
params: TreeViewUsedDefaultizedParams<TSignature>;
|
|
12
11
|
state: TreeViewUsedState<TSignature>;
|
|
12
|
+
slots: TSignature['slots'];
|
|
13
|
+
slotProps: TSignature['slotProps'];
|
|
13
14
|
models: TreeViewUsedModels<TSignature>;
|
|
14
15
|
setState: React.Dispatch<React.SetStateAction<TreeViewUsedState<TSignature>>>;
|
|
15
16
|
rootRef: React.RefObject<HTMLUListElement>;
|
|
16
17
|
}
|
|
17
18
|
type TreeViewModelsInitializer<TSignature extends TreeViewAnyPluginSignature> = {
|
|
18
19
|
[TControlled in keyof TSignature['models']]: {
|
|
19
|
-
|
|
20
|
-
defaultProp: keyof TSignature['params'];
|
|
20
|
+
getDefaultValue: (params: TSignature['defaultizedParams']) => Exclude<TSignature['defaultizedParams'][TControlled], undefined>;
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
|
-
|
|
23
|
+
type TreeViewResponse<TSignature extends TreeViewAnyPluginSignature> = {
|
|
24
24
|
getRootProps?: <TOther extends EventHandlers = {}>(otherHandlers: TOther) => React.HTMLAttributes<HTMLUListElement>;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
state
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
} & OptionalIfEmpty<'contextValue', TSignature['contextValue']>;
|
|
26
|
+
export type TreeViewPluginSignature<T extends {
|
|
27
|
+
params?: {};
|
|
28
|
+
defaultizedParams?: {};
|
|
29
|
+
instance?: {};
|
|
30
|
+
events?: {
|
|
31
|
+
[key in keyof T['events']]: TreeViewEventLookupElement;
|
|
32
|
+
};
|
|
33
|
+
state?: {};
|
|
34
|
+
contextValue?: {};
|
|
35
|
+
slots?: {
|
|
36
|
+
[key in keyof T['slots']]: React.ElementType;
|
|
36
37
|
};
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
slotProps?: {
|
|
39
|
+
[key in keyof T['slotProps']]: {} | (() => {});
|
|
40
|
+
};
|
|
41
|
+
modelNames?: keyof T['defaultizedParams'];
|
|
42
|
+
dependantPlugins?: readonly TreeViewAnyPluginSignature[];
|
|
43
|
+
}> = {
|
|
44
|
+
params: T extends {
|
|
45
|
+
params: {};
|
|
46
|
+
} ? T['params'] : {};
|
|
47
|
+
defaultizedParams: T extends {
|
|
48
|
+
defaultizedParams: {};
|
|
49
|
+
} ? T['defaultizedParams'] : {};
|
|
50
|
+
instance: T extends {
|
|
51
|
+
instance: {};
|
|
52
|
+
} ? T['instance'] : {};
|
|
53
|
+
events: T extends {
|
|
54
|
+
events: {};
|
|
55
|
+
} ? T['events'] : {};
|
|
56
|
+
state: T extends {
|
|
57
|
+
state: {};
|
|
58
|
+
} ? T['state'] : {};
|
|
59
|
+
contextValue: T extends {
|
|
60
|
+
contextValue: {};
|
|
61
|
+
} ? T['contextValue'] : {};
|
|
62
|
+
slots: T extends {
|
|
63
|
+
slots: {};
|
|
64
|
+
} ? T['slots'] : {};
|
|
65
|
+
slotProps: T extends {
|
|
66
|
+
slotProps: {};
|
|
67
|
+
} ? T['slotProps'] : {};
|
|
68
|
+
models: T extends {
|
|
69
|
+
defaultizedParams: {};
|
|
70
|
+
modelNames: keyof T['defaultizedParams'];
|
|
71
|
+
} ? {
|
|
72
|
+
[TControlled in T['modelNames']]-?: TreeViewModel<Exclude<T['defaultizedParams'][TControlled], undefined>>;
|
|
73
|
+
} : {};
|
|
74
|
+
dependantPlugins: T extends {
|
|
75
|
+
dependantPlugins: Array<any>;
|
|
76
|
+
} ? T['dependantPlugins'] : [];
|
|
39
77
|
};
|
|
40
78
|
export type TreeViewAnyPluginSignature = {
|
|
41
79
|
state: any;
|
|
@@ -44,6 +82,9 @@ export type TreeViewAnyPluginSignature = {
|
|
|
44
82
|
defaultizedParams: any;
|
|
45
83
|
dependantPlugins: any;
|
|
46
84
|
events: any;
|
|
85
|
+
contextValue: any;
|
|
86
|
+
slots: any;
|
|
87
|
+
slotProps: any;
|
|
47
88
|
models: any;
|
|
48
89
|
};
|
|
49
90
|
type TreeViewUsedPlugins<TSignature extends TreeViewAnyPluginSignature> = [
|
|
@@ -59,7 +100,10 @@ export type TreeViewUsedInstance<TSignature extends TreeViewAnyPluginSignature>
|
|
|
59
100
|
$$signature: TSignature;
|
|
60
101
|
};
|
|
61
102
|
type TreeViewUsedState<TSignature extends TreeViewAnyPluginSignature> = TSignature['state'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'state'>;
|
|
62
|
-
|
|
103
|
+
type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = {
|
|
104
|
+
[K in keyof Models]: Omit<Models[K], 'setValue'>;
|
|
105
|
+
};
|
|
106
|
+
export type TreeViewUsedModels<TSignature extends TreeViewAnyPluginSignature> = TSignature['models'] & RemoveSetValue<MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'models'>>;
|
|
63
107
|
export type TreeViewUsedEvents<TSignature extends TreeViewAnyPluginSignature> = TSignature['events'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'events'>;
|
|
64
108
|
export interface TreeViewItemPluginOptions {
|
|
65
109
|
props: TreeItemProps;
|
|
@@ -83,7 +127,7 @@ export interface TreeViewItemPluginResponse {
|
|
|
83
127
|
}
|
|
84
128
|
export type TreeViewItemPlugin = (options: TreeViewItemPluginOptions) => void | TreeViewItemPluginResponse;
|
|
85
129
|
export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
|
|
86
|
-
(options: TreeViewPluginOptions<TSignature>): void | TreeViewResponse
|
|
130
|
+
(options: TreeViewPluginOptions<TSignature>): void | TreeViewResponse<TSignature>;
|
|
87
131
|
getDefaultizedParams?: (params: TreeViewUsedParams<TSignature>) => TSignature['defaultizedParams'];
|
|
88
132
|
getInitialState?: (params: TreeViewUsedDefaultizedParams<TSignature>) => TSignature['state'];
|
|
89
133
|
models?: TreeViewModelsInitializer<TSignature>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import type { TreeViewAnyPluginSignature } from './plugin';
|
|
3
2
|
import type { MergePluginsProperty } from './helpers';
|
|
4
3
|
export interface TreeViewNode {
|
|
@@ -22,6 +21,6 @@ export interface TreeViewItemRange {
|
|
|
22
21
|
export interface TreeViewModel<TValue> {
|
|
23
22
|
name: string;
|
|
24
23
|
value: TValue;
|
|
25
|
-
|
|
24
|
+
setControlledValue: (value: TValue | ((prevValue: TValue) => TValue)) => void;
|
|
26
25
|
}
|
|
27
26
|
export type TreeViewInstance<TSignatures extends readonly TreeViewAnyPluginSignature[]> = MergePluginsProperty<TSignatures, 'instance'>;
|
|
@@ -3,9 +3,11 @@ import { UseTreeViewNodesParameters } from './useTreeViewNodes';
|
|
|
3
3
|
import { UseTreeViewExpansionParameters } from './useTreeViewExpansion';
|
|
4
4
|
import { UseTreeViewSelectionParameters } from './useTreeViewSelection';
|
|
5
5
|
import { UseTreeViewFocusParameters } from './useTreeViewFocus';
|
|
6
|
-
import {
|
|
7
|
-
import { ConvertPluginsIntoSignatures } from '../models';
|
|
8
|
-
export declare const DEFAULT_TREE_VIEW_PLUGINS: readonly [import("../models").TreeViewPlugin<import("./useTreeViewId").UseTreeViewIdSignature>, import("../models").TreeViewPlugin<import("./useTreeViewNodes").UseTreeViewNodesSignature>, import("../models").TreeViewPlugin<import("./useTreeViewExpansion").UseTreeViewExpansionSignature>, import("../models").TreeViewPlugin<import("./useTreeViewSelection").UseTreeViewSelectionSignature>, import("../models").TreeViewPlugin<import("./useTreeViewFocus").UseTreeViewFocusSignature>, import("../models").TreeViewPlugin<import("./useTreeViewKeyboardNavigation").UseTreeViewKeyboardNavigationSignature>, import("../models").TreeViewPlugin<import("./
|
|
6
|
+
import { UseTreeViewIconsParameters } from './useTreeViewIcons';
|
|
7
|
+
import { ConvertPluginsIntoSignatures, MergePluginsProperty } from '../models';
|
|
8
|
+
export declare const DEFAULT_TREE_VIEW_PLUGINS: readonly [import("../models").TreeViewPlugin<import("./useTreeViewId").UseTreeViewIdSignature>, import("../models").TreeViewPlugin<import("./useTreeViewNodes").UseTreeViewNodesSignature>, import("../models").TreeViewPlugin<import("./useTreeViewExpansion").UseTreeViewExpansionSignature>, import("../models").TreeViewPlugin<import("./useTreeViewSelection").UseTreeViewSelectionSignature>, import("../models").TreeViewPlugin<import("./useTreeViewFocus").UseTreeViewFocusSignature>, import("../models").TreeViewPlugin<import("./useTreeViewKeyboardNavigation").UseTreeViewKeyboardNavigationSignature>, import("../models").TreeViewPlugin<import("./useTreeViewIcons").UseTreeViewIconsSignature>];
|
|
9
9
|
export type DefaultTreeViewPlugins = ConvertPluginsIntoSignatures<typeof DEFAULT_TREE_VIEW_PLUGINS>;
|
|
10
|
-
export
|
|
10
|
+
export type DefaultTreeViewPluginSlots = MergePluginsProperty<DefaultTreeViewPlugins, 'slots'>;
|
|
11
|
+
export type DefaultTreeViewPluginSlotProps = MergePluginsProperty<DefaultTreeViewPlugins, 'slotProps'>;
|
|
12
|
+
export interface DefaultTreeViewPluginParameters<R extends {}, Multiple extends boolean | undefined> extends UseTreeViewIdParameters, UseTreeViewNodesParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewIconsParameters {
|
|
11
13
|
}
|
|
@@ -4,7 +4,7 @@ import { useTreeViewExpansion } from './useTreeViewExpansion';
|
|
|
4
4
|
import { useTreeViewSelection } from './useTreeViewSelection';
|
|
5
5
|
import { useTreeViewFocus } from './useTreeViewFocus';
|
|
6
6
|
import { useTreeViewKeyboardNavigation } from './useTreeViewKeyboardNavigation';
|
|
7
|
-
import {
|
|
8
|
-
export const DEFAULT_TREE_VIEW_PLUGINS = [useTreeViewId, useTreeViewNodes, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation,
|
|
7
|
+
import { useTreeViewIcons } from './useTreeViewIcons';
|
|
8
|
+
export const DEFAULT_TREE_VIEW_PLUGINS = [useTreeViewId, useTreeViewNodes, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewIcons];
|
|
9
9
|
|
|
10
10
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|
|
@@ -7,6 +7,11 @@ export const useTreeViewExpansion = ({
|
|
|
7
7
|
params,
|
|
8
8
|
models
|
|
9
9
|
}) => {
|
|
10
|
+
const setExpandedNodes = (event, value) => {
|
|
11
|
+
var _params$onExpandedNod;
|
|
12
|
+
(_params$onExpandedNod = params.onExpandedNodesChange) == null || _params$onExpandedNod.call(params, event, value);
|
|
13
|
+
models.expandedNodes.setControlledValue(value);
|
|
14
|
+
};
|
|
10
15
|
const isNodeExpanded = React.useCallback(nodeId => {
|
|
11
16
|
return Array.isArray(models.expandedNodes.value) ? models.expandedNodes.value.indexOf(nodeId) !== -1 : false;
|
|
12
17
|
}, [models.expandedNodes.value]);
|
|
@@ -28,10 +33,7 @@ export const useTreeViewExpansion = ({
|
|
|
28
33
|
if (params.onNodeExpansionToggle) {
|
|
29
34
|
params.onNodeExpansionToggle(event, nodeId, !isExpandedBefore);
|
|
30
35
|
}
|
|
31
|
-
|
|
32
|
-
params.onExpandedNodesChange(event, newExpanded);
|
|
33
|
-
}
|
|
34
|
-
models.expandedNodes.setValue(newExpanded);
|
|
36
|
+
setExpandedNodes(event, newExpanded);
|
|
35
37
|
});
|
|
36
38
|
const expandAllSiblings = (event, nodeId) => {
|
|
37
39
|
const node = instance.getNode(nodeId);
|
|
@@ -44,10 +46,7 @@ export const useTreeViewExpansion = ({
|
|
|
44
46
|
params.onNodeExpansionToggle(event, newlyExpandedNodeId, true);
|
|
45
47
|
});
|
|
46
48
|
}
|
|
47
|
-
|
|
48
|
-
params.onExpandedNodesChange(event, newExpanded);
|
|
49
|
-
}
|
|
50
|
-
models.expandedNodes.setValue(newExpanded);
|
|
49
|
+
setExpandedNodes(event, newExpanded);
|
|
51
50
|
}
|
|
52
51
|
};
|
|
53
52
|
populateInstance(instance, {
|
|
@@ -59,8 +58,7 @@ export const useTreeViewExpansion = ({
|
|
|
59
58
|
};
|
|
60
59
|
useTreeViewExpansion.models = {
|
|
61
60
|
expandedNodes: {
|
|
62
|
-
|
|
63
|
-
defaultProp: 'defaultExpandedNodes'
|
|
61
|
+
getDefaultValue: params => params.defaultExpandedNodes
|
|
64
62
|
}
|
|
65
63
|
};
|
|
66
64
|
const DEFAULT_EXPANDED_NODES = [];
|
|
@@ -34,6 +34,10 @@ export interface UseTreeViewExpansionParameters {
|
|
|
34
34
|
onNodeExpansionToggle?: (event: React.SyntheticEvent, nodeId: string, isExpanded: boolean) => void;
|
|
35
35
|
}
|
|
36
36
|
export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedNodes'>;
|
|
37
|
-
export type UseTreeViewExpansionSignature = TreeViewPluginSignature<
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
|
|
38
|
+
params: UseTreeViewExpansionParameters;
|
|
39
|
+
defaultizedParams: UseTreeViewExpansionDefaultizedParameters;
|
|
40
|
+
instance: UseTreeViewExpansionInstance;
|
|
41
|
+
modelNames: 'expandedNodes';
|
|
42
|
+
dependantPlugins: [UseTreeViewNodesSignature];
|
|
43
|
+
}>;
|
|
@@ -88,12 +88,6 @@ export const useTreeViewFocus = ({
|
|
|
88
88
|
useTreeViewFocus.getInitialState = () => ({
|
|
89
89
|
focusedNodeId: null
|
|
90
90
|
});
|
|
91
|
-
useTreeViewFocus.getDefaultizedParams = params => {
|
|
92
|
-
var _params$disabledItems;
|
|
93
|
-
return _extends({}, params, {
|
|
94
|
-
disabledItemsFocusable: (_params$disabledItems = params.disabledItemsFocusable) != null ? _params$disabledItems : false
|
|
95
|
-
});
|
|
96
|
-
};
|
|
97
91
|
useTreeViewFocus.params = {
|
|
98
92
|
onNodeFocus: true
|
|
99
93
|
};
|
|
@@ -22,9 +22,15 @@ export type UseTreeViewFocusDefaultizedParameters = UseTreeViewFocusParameters;
|
|
|
22
22
|
export interface UseTreeViewFocusState {
|
|
23
23
|
focusedNodeId: string | null;
|
|
24
24
|
}
|
|
25
|
-
export type UseTreeViewFocusSignature = TreeViewPluginSignature<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
export type UseTreeViewFocusSignature = TreeViewPluginSignature<{
|
|
26
|
+
params: UseTreeViewFocusParameters;
|
|
27
|
+
defaultizedParams: UseTreeViewFocusDefaultizedParameters;
|
|
28
|
+
instance: UseTreeViewFocusInstance;
|
|
29
|
+
state: UseTreeViewFocusState;
|
|
30
|
+
dependantPlugins: [
|
|
31
|
+
UseTreeViewIdSignature,
|
|
32
|
+
UseTreeViewNodesSignature,
|
|
33
|
+
UseTreeViewSelectionSignature,
|
|
34
|
+
UseTreeViewExpansionSignature
|
|
35
|
+
];
|
|
36
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeViewIcons } from './useTreeViewIcons';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const useTreeViewIcons = ({
|
|
2
|
+
slots,
|
|
3
|
+
slotProps
|
|
4
|
+
}) => {
|
|
5
|
+
return {
|
|
6
|
+
contextValue: {
|
|
7
|
+
icons: {
|
|
8
|
+
slots: {
|
|
9
|
+
collapseIcon: slots.collapseIcon,
|
|
10
|
+
expandIcon: slots.expandIcon,
|
|
11
|
+
endIcon: slots.endIcon
|
|
12
|
+
},
|
|
13
|
+
slotProps: {
|
|
14
|
+
collapseIcon: slotProps.collapseIcon,
|
|
15
|
+
expandIcon: slotProps.expandIcon,
|
|
16
|
+
endIcon: slotProps.endIcon
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
useTreeViewIcons.params = {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SlotComponentProps } from '@mui/base/utils';
|
|
3
|
+
import { TreeViewPluginSignature } from '../../models';
|
|
4
|
+
import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
|
|
5
|
+
import { UseTreeViewSelectionSignature } from '../useTreeViewSelection';
|
|
6
|
+
export interface UseTreeViewIconsParameters {
|
|
7
|
+
}
|
|
8
|
+
export type UseTreeViewIconsDefaultizedParameters = UseTreeViewIconsParameters;
|
|
9
|
+
interface UseTreeViewIconsSlots {
|
|
10
|
+
/**
|
|
11
|
+
* The default icon used to collapse the node.
|
|
12
|
+
*/
|
|
13
|
+
collapseIcon?: React.ElementType;
|
|
14
|
+
/**
|
|
15
|
+
* The default icon used to expand the node.
|
|
16
|
+
*/
|
|
17
|
+
expandIcon?: React.ElementType;
|
|
18
|
+
/**
|
|
19
|
+
* The default icon displayed next to an end node.
|
|
20
|
+
* This is applied to all tree nodes and can be overridden by the TreeItem `icon` slot prop.
|
|
21
|
+
*/
|
|
22
|
+
endIcon?: React.ElementType;
|
|
23
|
+
}
|
|
24
|
+
interface UseTreeViewIconsSlotProps {
|
|
25
|
+
collapseIcon?: SlotComponentProps<'svg', {}, {}>;
|
|
26
|
+
expandIcon?: SlotComponentProps<'svg', {}, {}>;
|
|
27
|
+
endIcon?: SlotComponentProps<'svg', {}, {}>;
|
|
28
|
+
}
|
|
29
|
+
interface UseTreeViewIconsContextValue {
|
|
30
|
+
icons: {
|
|
31
|
+
slots: UseTreeViewIconsSlots;
|
|
32
|
+
slotProps: UseTreeViewIconsSlotProps;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export type UseTreeViewIconsSignature = TreeViewPluginSignature<{
|
|
36
|
+
params: UseTreeViewIconsParameters;
|
|
37
|
+
defaultizedParams: UseTreeViewIconsDefaultizedParameters;
|
|
38
|
+
contextValue: UseTreeViewIconsContextValue;
|
|
39
|
+
slots: UseTreeViewIconsSlots;
|
|
40
|
+
slotProps: UseTreeViewIconsSlotProps;
|
|
41
|
+
dependantPlugins: [UseTreeViewNodesSignature, UseTreeViewSelectionSignature];
|
|
42
|
+
}>;
|
|
43
|
+
export {};
|
|
@@ -13,5 +13,9 @@ export type UseTreeViewIdDefaultizedParameters = UseTreeViewIdParameters;
|
|
|
13
13
|
export interface UseTreeViewIdState {
|
|
14
14
|
focusedNodeId: string | null;
|
|
15
15
|
}
|
|
16
|
-
export type UseTreeViewIdSignature = TreeViewPluginSignature<
|
|
17
|
-
|
|
16
|
+
export type UseTreeViewIdSignature = TreeViewPluginSignature<{
|
|
17
|
+
params: UseTreeViewIdParameters;
|
|
18
|
+
defaultizedParams: UseTreeViewIdDefaultizedParameters;
|
|
19
|
+
instance: UseTreeViewIdInstance;
|
|
20
|
+
state: UseTreeViewIdState;
|
|
21
|
+
}>;
|
|
@@ -10,7 +10,9 @@ export interface UseTreeViewNodesParameters {
|
|
|
10
10
|
}
|
|
11
11
|
export interface UseTreeViewNodesDefaultizedParameters {
|
|
12
12
|
}
|
|
13
|
-
export type UseTreeViewJSXNodesSignature = TreeViewPluginSignature<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
export type UseTreeViewJSXNodesSignature = TreeViewPluginSignature<{
|
|
14
|
+
params: UseTreeViewNodesParameters;
|
|
15
|
+
defaultizedParams: UseTreeViewNodesDefaultizedParameters;
|
|
16
|
+
instance: UseTreeViewNodesInstance;
|
|
17
|
+
dependantPlugins: [UseTreeViewNodesSignature, UseTreeViewKeyboardNavigationSignature];
|
|
18
|
+
}>;
|
package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts
CHANGED
|
@@ -6,12 +6,15 @@ import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
|
|
|
6
6
|
export interface UseTreeViewKeyboardNavigationInstance {
|
|
7
7
|
updateFirstCharMap: (updater: (map: TreeViewFirstCharMap) => TreeViewFirstCharMap) => void;
|
|
8
8
|
}
|
|
9
|
-
export type UseTreeViewKeyboardNavigationSignature = TreeViewPluginSignature<{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
export type UseTreeViewKeyboardNavigationSignature = TreeViewPluginSignature<{
|
|
10
|
+
instance: UseTreeViewKeyboardNavigationInstance;
|
|
11
|
+
dependantPlugins: [
|
|
12
|
+
UseTreeViewNodesSignature,
|
|
13
|
+
UseTreeViewSelectionSignature,
|
|
14
|
+
UseTreeViewFocusSignature,
|
|
15
|
+
UseTreeViewExpansionSignature
|
|
16
|
+
];
|
|
17
|
+
}>;
|
|
15
18
|
export type TreeViewFirstCharMap = {
|
|
16
19
|
[nodeId: string]: string;
|
|
17
20
|
};
|
|
@@ -116,6 +116,11 @@ export const useTreeViewNodes = ({
|
|
|
116
116
|
getNavigableChildrenIds,
|
|
117
117
|
isNodeDisabled
|
|
118
118
|
});
|
|
119
|
+
return {
|
|
120
|
+
contextValue: {
|
|
121
|
+
disabledItemsFocusable: params.disabledItemsFocusable
|
|
122
|
+
}
|
|
123
|
+
};
|
|
119
124
|
};
|
|
120
125
|
useTreeViewNodes.getInitialState = params => updateState({
|
|
121
126
|
items: params.items,
|
|
@@ -123,6 +128,12 @@ useTreeViewNodes.getInitialState = params => updateState({
|
|
|
123
128
|
getItemId: params.getItemId,
|
|
124
129
|
getItemLabel: params.getItemLabel
|
|
125
130
|
});
|
|
131
|
+
useTreeViewNodes.getDefaultizedParams = params => {
|
|
132
|
+
var _params$disabledItems;
|
|
133
|
+
return _extends({}, params, {
|
|
134
|
+
disabledItemsFocusable: (_params$disabledItems = params.disabledItemsFocusable) != null ? _params$disabledItems : false
|
|
135
|
+
});
|
|
136
|
+
};
|
|
126
137
|
useTreeViewNodes.params = {
|
|
127
138
|
disabledItemsFocusable: true,
|
|
128
139
|
items: true,
|
|
@@ -62,8 +62,16 @@ export interface UseTreeViewNodesState {
|
|
|
62
62
|
nodeTree: TreeViewNodeIdAndChildren[];
|
|
63
63
|
nodeMap: TreeViewNodeMap;
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
interface UseTreeViewNodesContextValue extends Pick<UseTreeViewNodesDefaultizedParameters<any>, 'disabledItemsFocusable'> {
|
|
66
|
+
}
|
|
67
|
+
export type UseTreeViewNodesSignature = TreeViewPluginSignature<{
|
|
68
|
+
params: UseTreeViewNodesParameters<any>;
|
|
69
|
+
defaultizedParams: UseTreeViewNodesDefaultizedParameters<any>;
|
|
70
|
+
instance: UseTreeViewNodesInstance;
|
|
71
|
+
events: UseTreeViewNodesEventLookup;
|
|
72
|
+
state: UseTreeViewNodesState;
|
|
73
|
+
contextValue: UseTreeViewNodesContextValue;
|
|
74
|
+
}>;
|
|
67
75
|
export type TreeViewNodeMap = {
|
|
68
76
|
[nodeId: string]: TreeViewNode;
|
|
69
77
|
};
|
|
@@ -10,7 +10,6 @@ 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.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
|
|
14
13
|
const setSelectedNodes = (event, newSelectedNodes) => {
|
|
15
14
|
if (params.onNodeSelectionToggle) {
|
|
16
15
|
if (params.multiSelect) {
|
|
@@ -34,8 +33,9 @@ export const useTreeViewSelection = ({
|
|
|
34
33
|
if (params.onSelectedNodesChange) {
|
|
35
34
|
params.onSelectedNodesChange(event, newSelectedNodes);
|
|
36
35
|
}
|
|
37
|
-
models.selectedNodes.
|
|
36
|
+
models.selectedNodes.setControlledValue(newSelectedNodes);
|
|
38
37
|
};
|
|
38
|
+
const isNodeSelected = nodeId => Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
|
|
39
39
|
const selectNode = (event, nodeId, multiple = false) => {
|
|
40
40
|
if (params.disableSelection) {
|
|
41
41
|
return;
|
|
@@ -165,13 +165,17 @@ export const useTreeViewSelection = ({
|
|
|
165
165
|
return {
|
|
166
166
|
getRootProps: () => ({
|
|
167
167
|
'aria-multiselectable': params.multiSelect
|
|
168
|
-
})
|
|
168
|
+
}),
|
|
169
|
+
contextValue: {
|
|
170
|
+
selection: {
|
|
171
|
+
multiSelect: params.multiSelect
|
|
172
|
+
}
|
|
173
|
+
}
|
|
169
174
|
};
|
|
170
175
|
};
|
|
171
176
|
useTreeViewSelection.models = {
|
|
172
177
|
selectedNodes: {
|
|
173
|
-
|
|
174
|
-
defaultProp: 'defaultSelectedNodes'
|
|
178
|
+
getDefaultValue: params => params.defaultSelectedNodes
|
|
175
179
|
}
|
|
176
180
|
};
|
|
177
181
|
const DEFAULT_SELECTED_NODES = [];
|
|
@@ -48,9 +48,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
48
48
|
onNodeSelectionToggle?: (event: React.SyntheticEvent, nodeId: string, isSelected: boolean) => void;
|
|
49
49
|
}
|
|
50
50
|
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedNodes' | 'multiSelect'>;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
interface UseTreeViewSelectionContextValue {
|
|
52
|
+
selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect'>;
|
|
53
|
+
}
|
|
54
|
+
export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
|
|
55
|
+
params: UseTreeViewSelectionParameters<any>;
|
|
56
|
+
defaultizedParams: UseTreeViewSelectionDefaultizedParameters<any>;
|
|
57
|
+
instance: UseTreeViewSelectionInstance;
|
|
58
|
+
contextValue: UseTreeViewSelectionContextValue;
|
|
59
|
+
modelNames: 'selectedNodes';
|
|
60
|
+
dependantPlugins: [
|
|
61
|
+
UseTreeViewNodesSignature,
|
|
62
|
+
UseTreeViewExpansionSignature,
|
|
63
|
+
UseTreeViewNodesSignature
|
|
64
|
+
];
|
|
65
|
+
}>;
|
|
56
66
|
export {};
|
|
@@ -26,11 +26,15 @@ export const useTreeView = inParams => {
|
|
|
26
26
|
return temp;
|
|
27
27
|
});
|
|
28
28
|
const rootPropsGetters = [];
|
|
29
|
-
|
|
29
|
+
const contextValue = {
|
|
30
|
+
instance: instance
|
|
31
|
+
};
|
|
30
32
|
const runPlugin = plugin => {
|
|
31
33
|
const pluginResponse = plugin({
|
|
32
34
|
instance,
|
|
33
35
|
params,
|
|
36
|
+
slots: params.slots,
|
|
37
|
+
slotProps: params.slotProps,
|
|
34
38
|
state,
|
|
35
39
|
setState,
|
|
36
40
|
rootRef: innerRootRef,
|
|
@@ -40,7 +44,7 @@ export const useTreeView = inParams => {
|
|
|
40
44
|
rootPropsGetters.push(pluginResponse.getRootProps);
|
|
41
45
|
}
|
|
42
46
|
if (pluginResponse.contextValue) {
|
|
43
|
-
contextValue
|
|
47
|
+
Object.assign(contextValue, pluginResponse.contextValue);
|
|
44
48
|
}
|
|
45
49
|
};
|
|
46
50
|
plugins.forEach(runPlugin);
|
|
@@ -96,7 +100,7 @@ export const useTreeView = inParams => {
|
|
|
96
100
|
return {
|
|
97
101
|
getRootProps,
|
|
98
102
|
rootRef: handleRootRef,
|
|
99
|
-
contextValue,
|
|
103
|
+
contextValue: contextValue,
|
|
100
104
|
instance: instance
|
|
101
105
|
};
|
|
102
106
|
};
|
|
@@ -2,14 +2,14 @@ import * as React from 'react';
|
|
|
2
2
|
import { EventHandlers } from '@mui/base/utils';
|
|
3
3
|
import type { TreeViewContextValue } from '../TreeViewProvider';
|
|
4
4
|
import { TreeViewAnyPluginSignature, TreeViewPlugin, ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewInstance } from '../models';
|
|
5
|
-
export type UseTreeViewParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> =
|
|
5
|
+
export type UseTreeViewParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> = UseTreeViewBaseParameters<TPlugins> & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'params'>;
|
|
6
|
+
export interface UseTreeViewBaseParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> {
|
|
6
7
|
rootRef?: React.Ref<HTMLUListElement> | undefined;
|
|
7
8
|
plugins: TPlugins;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'defaultizedParams'>;
|
|
9
|
+
slots: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'slots'>;
|
|
10
|
+
slotProps: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'slotProps'>;
|
|
11
|
+
}
|
|
12
|
+
export type UseTreeViewDefaultizedParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> = UseTreeViewBaseParameters<TPlugins> & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'defaultizedParams'>;
|
|
13
13
|
export interface UseTreeViewRootSlotProps extends Pick<React.HTMLAttributes<HTMLUListElement>, 'onFocus' | 'onBlur' | 'onKeyDown' | 'id' | 'aria-activedescendant' | 'aria-multiselectable' | 'role' | 'tabIndex'> {
|
|
14
14
|
ref: React.Ref<HTMLUListElement>;
|
|
15
15
|
}
|
|
@@ -10,23 +10,22 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
10
10
|
const initialState = {};
|
|
11
11
|
plugins.forEach(plugin => {
|
|
12
12
|
if (plugin.models) {
|
|
13
|
-
Object.entries(plugin.models).forEach(([modelName,
|
|
13
|
+
Object.entries(plugin.models).forEach(([modelName, modelInitializer]) => {
|
|
14
14
|
modelsRef.current[modelName] = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
isControlled: props[model.controlledProp] !== undefined
|
|
15
|
+
isControlled: props[modelName] !== undefined,
|
|
16
|
+
getDefaultValue: modelInitializer.getDefaultValue
|
|
18
17
|
};
|
|
19
|
-
initialState[modelName] = props
|
|
18
|
+
initialState[modelName] = modelInitializer.getDefaultValue(props);
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
});
|
|
23
22
|
return initialState;
|
|
24
23
|
});
|
|
25
24
|
const models = Object.fromEntries(Object.entries(modelsRef.current).map(([modelName, model]) => {
|
|
26
|
-
const value = model.isControlled ? props[
|
|
25
|
+
const value = model.isControlled ? props[modelName] : modelsState[modelName];
|
|
27
26
|
return [modelName, {
|
|
28
27
|
value,
|
|
29
|
-
|
|
28
|
+
setControlledValue: newValue => {
|
|
30
29
|
if (!model.isControlled) {
|
|
31
30
|
setModelsState(prevState => _extends({}, prevState, {
|
|
32
31
|
[modelName]: newValue
|
|
@@ -40,8 +39,8 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
40
39
|
/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */
|
|
41
40
|
if (process.env.NODE_ENV !== 'production') {
|
|
42
41
|
Object.entries(modelsRef.current).forEach(([modelName, model]) => {
|
|
43
|
-
const controlled = props[
|
|
44
|
-
const
|
|
42
|
+
const controlled = props[modelName];
|
|
43
|
+
const newDefaultValue = model.getDefaultValue(props);
|
|
45
44
|
React.useEffect(() => {
|
|
46
45
|
if (model.isControlled !== (controlled !== undefined)) {
|
|
47
46
|
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'));
|
|
@@ -49,9 +48,9 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
49
48
|
}, [controlled]);
|
|
50
49
|
const {
|
|
51
50
|
current: defaultValue
|
|
52
|
-
} = React.useRef(
|
|
51
|
+
} = React.useRef(newDefaultValue);
|
|
53
52
|
React.useEffect(() => {
|
|
54
|
-
if (!model.isControlled && defaultValue !==
|
|
53
|
+
if (!model.isControlled && defaultValue !== newDefaultValue) {
|
|
55
54
|
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
55
|
}
|
|
57
56
|
}, [JSON.stringify(defaultValue)]);
|