@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.
Files changed (139) hide show
  1. package/CHANGELOG.md +379 -2
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +10 -36
  4. package/RichTreeView/RichTreeView.types.d.ts +6 -9
  5. package/RichTreeView/index.d.ts +1 -1
  6. package/SimpleTreeView/SimpleTreeView.js +12 -37
  7. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +4 -2
  8. package/SimpleTreeView/SimpleTreeView.types.d.ts +8 -7
  9. package/SimpleTreeView/index.d.ts +1 -1
  10. package/TreeItem/TreeItem.js +62 -39
  11. package/TreeItem/TreeItem.types.d.ts +33 -17
  12. package/TreeItem/TreeItemContent.d.ts +0 -3
  13. package/TreeItem/TreeItemContent.js +2 -5
  14. package/TreeItem/index.d.ts +2 -2
  15. package/TreeItem/index.js +1 -1
  16. package/TreeItem/{useTreeItem.d.ts → useTreeItemState.d.ts} +1 -1
  17. package/{modern/TreeItem/useTreeItem.js → TreeItem/useTreeItemState.js} +4 -2
  18. package/TreeView/TreeView.js +0 -21
  19. package/TreeView/TreeView.types.d.ts +5 -1
  20. package/TreeView/index.d.ts +1 -1
  21. package/icons/icons.d.ts +6 -0
  22. package/icons/icons.js +9 -0
  23. package/icons/index.d.ts +1 -0
  24. package/icons/index.js +1 -0
  25. package/icons/package.json +6 -0
  26. package/index.d.ts +1 -0
  27. package/index.js +3 -2
  28. package/internals/TreeViewProvider/TreeViewContext.d.ts +4 -2
  29. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -11
  30. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.types.d.ts +3 -2
  31. package/internals/index.d.ts +15 -0
  32. package/internals/index.js +4 -0
  33. package/internals/models/helpers.d.ts +7 -1
  34. package/internals/models/plugin.d.ts +64 -20
  35. package/internals/models/treeView.d.ts +1 -2
  36. package/internals/package.json +6 -0
  37. package/internals/plugins/defaultPlugins.d.ts +6 -4
  38. package/internals/plugins/defaultPlugins.js +2 -2
  39. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +8 -10
  40. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -3
  41. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -6
  42. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +12 -6
  43. package/internals/plugins/useTreeViewIcons/index.d.ts +2 -0
  44. package/internals/plugins/useTreeViewIcons/index.js +1 -0
  45. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.d.ts +3 -0
  46. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
  47. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +43 -0
  48. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +6 -2
  49. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +6 -4
  50. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +9 -6
  51. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
  52. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +10 -2
  53. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  54. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -5
  55. package/internals/useTreeView/useTreeView.js +7 -3
  56. package/internals/useTreeView/useTreeView.types.d.ts +6 -6
  57. package/internals/useTreeView/useTreeViewModels.js +10 -11
  58. package/internals/utils/extractPluginParamsFromProps.d.ts +8 -5
  59. package/internals/utils/extractPluginParamsFromProps.js +17 -6
  60. package/legacy/RichTreeView/RichTreeView.js +3 -27
  61. package/legacy/SimpleTreeView/SimpleTreeView.js +4 -28
  62. package/legacy/TreeItem/TreeItem.js +63 -39
  63. package/legacy/TreeItem/TreeItemContent.js +9 -12
  64. package/legacy/TreeItem/index.js +1 -1
  65. package/legacy/TreeItem/{useTreeItem.js → useTreeItemState.js} +2 -2
  66. package/legacy/TreeView/TreeView.js +0 -21
  67. package/legacy/icons/icons.js +9 -0
  68. package/legacy/icons/index.js +1 -0
  69. package/legacy/index.js +3 -2
  70. package/legacy/internals/index.js +4 -0
  71. package/legacy/internals/plugins/defaultPlugins.js +2 -2
  72. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +10 -10
  73. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -6
  74. package/legacy/internals/plugins/useTreeViewIcons/index.js +1 -0
  75. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +21 -0
  76. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
  77. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -6
  78. package/legacy/internals/useTreeView/useTreeView.js +6 -2
  79. package/legacy/internals/useTreeView/useTreeViewModels.js +10 -11
  80. package/legacy/internals/utils/extractPluginParamsFromProps.js +11 -2
  81. package/modern/RichTreeView/RichTreeView.js +10 -36
  82. package/modern/SimpleTreeView/SimpleTreeView.js +12 -37
  83. package/modern/TreeItem/TreeItem.js +61 -39
  84. package/modern/TreeItem/TreeItemContent.js +2 -5
  85. package/modern/TreeItem/index.js +1 -1
  86. package/{TreeItem/useTreeItem.js → modern/TreeItem/useTreeItemState.js} +4 -2
  87. package/modern/TreeView/TreeView.js +0 -21
  88. package/modern/icons/icons.js +9 -0
  89. package/modern/icons/index.js +1 -0
  90. package/modern/index.js +3 -2
  91. package/modern/internals/index.js +4 -0
  92. package/modern/internals/plugins/defaultPlugins.js +2 -2
  93. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
  94. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
  95. package/modern/internals/plugins/useTreeViewIcons/index.js +1 -0
  96. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
  97. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +8 -0
  98. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  99. package/modern/internals/useTreeView/useTreeView.js +7 -3
  100. package/modern/internals/useTreeView/useTreeViewModels.js +10 -11
  101. package/modern/internals/utils/extractPluginParamsFromProps.js +17 -6
  102. package/node/RichTreeView/RichTreeView.js +10 -36
  103. package/node/SimpleTreeView/SimpleTreeView.js +12 -37
  104. package/node/TreeItem/TreeItem.js +61 -39
  105. package/node/TreeItem/TreeItemContent.js +2 -5
  106. package/node/TreeItem/index.js +4 -4
  107. package/node/TreeItem/{useTreeItem.js → useTreeItemState.js} +5 -3
  108. package/node/TreeView/TreeView.js +0 -21
  109. package/node/icons/icons.js +17 -0
  110. package/node/icons/index.js +16 -0
  111. package/node/index.js +13 -1
  112. package/node/internals/index.js +33 -0
  113. package/node/internals/plugins/defaultPlugins.js +2 -2
  114. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
  115. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
  116. package/node/internals/plugins/useTreeViewIcons/index.js +12 -0
  117. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +29 -0
  118. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +8 -0
  119. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  120. package/node/internals/useTreeView/useTreeView.js +7 -3
  121. package/node/internals/useTreeView/useTreeViewModels.js +10 -11
  122. package/node/internals/utils/extractPluginParamsFromProps.js +18 -6
  123. package/package.json +7 -7
  124. package/themeAugmentation/components.d.ts +4 -4
  125. package/internals/plugins/useTreeViewContextValueBuilder/index.d.ts +0 -2
  126. package/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  127. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.d.ts +0 -3
  128. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
  129. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +0 -29
  130. package/legacy/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  131. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -34
  132. package/modern/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  133. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
  134. package/node/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -12
  135. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -39
  136. /package/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  137. /package/legacy/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  138. /package/modern/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  139. /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 { TreeViewContextValue } from '../TreeViewProvider';
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
- controlledProp: TControlled;
20
- defaultProp: keyof TSignature['params'];
20
+ getDefaultValue: (params: TSignature['defaultizedParams']) => Exclude<TSignature['defaultizedParams'][TControlled], undefined>;
21
21
  };
22
22
  };
23
- interface TreeViewResponse {
23
+ type TreeViewResponse<TSignature extends TreeViewAnyPluginSignature> = {
24
24
  getRootProps?: <TOther extends EventHandlers = {}>(otherHandlers: TOther) => React.HTMLAttributes<HTMLUListElement>;
25
- contextValue?: TreeViewContextValue<any>;
26
- }
27
- export type TreeViewPluginSignature<TParams extends {}, TDefaultizedParams extends {}, TInstance extends {}, TEvents extends {
28
- [key in keyof TEvents]: TreeViewEventLookupElement;
29
- }, TState extends {}, TModelNames extends keyof TDefaultizedParams, TDependantPlugins extends readonly TreeViewAnyPluginSignature[]> = {
30
- params: TParams;
31
- defaultizedParams: TDefaultizedParams;
32
- instance: TInstance;
33
- state: TState;
34
- models: {
35
- [TControlled in TModelNames]-?: TreeViewModel<Exclude<TDefaultizedParams[TControlled], undefined>>;
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
- events: TEvents;
38
- dependantPlugins: TDependantPlugins;
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
- export type TreeViewUsedModels<TSignature extends TreeViewAnyPluginSignature> = TSignature['models'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'models'>;
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
- setValue: React.Dispatch<React.SetStateAction<TValue>>;
24
+ setControlledValue: (value: TValue | ((prevValue: TValue) => TValue)) => void;
26
25
  }
27
26
  export type TreeViewInstance<TSignatures extends readonly TreeViewAnyPluginSignature[]> = MergePluginsProperty<TSignatures, 'instance'>;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/internals/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -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 { UseTreeViewContextValueBuilderParameters } from './useTreeViewContextValueBuilder';
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("./useTreeViewContextValueBuilder").UseTreeViewContextValueBuilderSignature>];
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 interface DefaultTreeViewPluginParameters<R extends {}, Multiple extends boolean | undefined> extends UseTreeViewIdParameters, UseTreeViewNodesParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewContextValueBuilderParameters {
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 { useTreeViewContextValueBuilder } from './useTreeViewContextValueBuilder';
8
- export const DEFAULT_TREE_VIEW_PLUGINS = [useTreeViewId, useTreeViewNodes, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewContextValueBuilder];
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
- if (params.onExpandedNodesChange) {
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
- if (params.onExpandedNodesChange) {
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
- controlledProp: 'expandedNodes',
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<UseTreeViewExpansionParameters, UseTreeViewExpansionDefaultizedParameters, UseTreeViewExpansionInstance, {}, {}, 'expandedNodes', [
38
- UseTreeViewNodesSignature
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<UseTreeViewFocusParameters, UseTreeViewFocusParameters, UseTreeViewFocusInstance, {}, UseTreeViewFocusState, never, [
26
- UseTreeViewIdSignature,
27
- UseTreeViewNodesSignature,
28
- UseTreeViewSelectionSignature,
29
- UseTreeViewExpansionSignature
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,2 @@
1
+ export { useTreeViewIcons } from './useTreeViewIcons';
2
+ export type { UseTreeViewIconsSignature, UseTreeViewIconsParameters, UseTreeViewIconsDefaultizedParameters, } from './useTreeViewIcons.types';
@@ -0,0 +1 @@
1
+ export { useTreeViewIcons } from './useTreeViewIcons';
@@ -0,0 +1,3 @@
1
+ import { TreeViewPlugin } from '../../models';
2
+ import { UseTreeViewIconsSignature } from './useTreeViewIcons.types';
3
+ export declare const useTreeViewIcons: TreeViewPlugin<UseTreeViewIconsSignature>;
@@ -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<UseTreeViewIdParameters, UseTreeViewIdDefaultizedParameters, UseTreeViewIdInstance, {}, UseTreeViewIdState, never, [
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<UseTreeViewNodesParameters, UseTreeViewNodesDefaultizedParameters, UseTreeViewNodesInstance, {}, {}, never, [
14
- UseTreeViewNodesSignature,
15
- UseTreeViewKeyboardNavigationSignature
16
- ]>;
13
+ export type UseTreeViewJSXNodesSignature = TreeViewPluginSignature<{
14
+ params: UseTreeViewNodesParameters;
15
+ defaultizedParams: UseTreeViewNodesDefaultizedParameters;
16
+ instance: UseTreeViewNodesInstance;
17
+ dependantPlugins: [UseTreeViewNodesSignature, UseTreeViewKeyboardNavigationSignature];
18
+ }>;
@@ -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<{}, {}, UseTreeViewKeyboardNavigationInstance, {}, {}, never, [
10
- UseTreeViewNodesSignature,
11
- UseTreeViewSelectionSignature,
12
- UseTreeViewFocusSignature,
13
- UseTreeViewExpansionSignature
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
- export type UseTreeViewNodesSignature = TreeViewPluginSignature<UseTreeViewNodesParameters<any>, UseTreeViewNodesDefaultizedParameters<any>, UseTreeViewNodesInstance, UseTreeViewNodesEventLookup, UseTreeViewNodesState, never, [
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.setValue(newSelectedNodes);
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
- controlledProp: 'selectedNodes',
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
- export type UseTreeViewSelectionSignature = TreeViewPluginSignature<UseTreeViewSelectionParameters<any>, UseTreeViewSelectionDefaultizedParameters<any>, UseTreeViewSelectionInstance, {}, {}, 'selectedNodes', [
52
- UseTreeViewNodesSignature,
53
- UseTreeViewExpansionSignature,
54
- UseTreeViewNodesSignature
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
- let contextValue = {};
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 = pluginResponse.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
- } & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'params'>;
9
- export type UseTreeViewDefaultizedParameters<TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]> = {
10
- rootRef?: React.Ref<HTMLUListElement> | undefined;
11
- plugins: TPlugins;
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, model]) => {
13
+ Object.entries(plugin.models).forEach(([modelName, modelInitializer]) => {
14
14
  modelsRef.current[modelName] = {
15
- controlledProp: model.controlledProp,
16
- defaultProp: model.defaultProp,
17
- isControlled: props[model.controlledProp] !== undefined
15
+ isControlled: props[modelName] !== undefined,
16
+ getDefaultValue: modelInitializer.getDefaultValue
18
17
  };
19
- initialState[modelName] = props[model.defaultProp];
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[model.controlledProp] : modelsState[modelName];
25
+ const value = model.isControlled ? props[modelName] : modelsState[modelName];
27
26
  return [modelName, {
28
27
  value,
29
- setValue: newValue => {
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[model.controlledProp];
44
- const defaultProp = props[model.defaultProp];
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(defaultProp);
51
+ } = React.useRef(newDefaultValue);
53
52
  React.useEffect(() => {
54
- if (!model.isControlled && defaultValue !== defaultProp) {
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)]);