@mui/x-tree-view 7.0.0-alpha.8 → 7.0.0-beta.0

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 (143) hide show
  1. package/CHANGELOG.md +508 -30
  2. package/README.md +3 -3
  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 -55
  7. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +5 -3
  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 -39
  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.js +10 -5
  50. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +6 -4
  51. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +9 -6
  52. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +14 -0
  53. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +10 -2
  54. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  55. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -5
  56. package/internals/useTreeView/useTreeView.js +7 -3
  57. package/internals/useTreeView/useTreeView.types.d.ts +6 -6
  58. package/internals/useTreeView/useTreeViewModels.js +10 -11
  59. package/internals/utils/extractPluginParamsFromProps.d.ts +8 -5
  60. package/internals/utils/extractPluginParamsFromProps.js +17 -6
  61. package/legacy/RichTreeView/RichTreeView.js +3 -27
  62. package/legacy/SimpleTreeView/SimpleTreeView.js +4 -46
  63. package/legacy/TreeItem/TreeItem.js +63 -39
  64. package/legacy/TreeItem/TreeItemContent.js +9 -12
  65. package/legacy/TreeItem/index.js +1 -1
  66. package/legacy/TreeItem/{useTreeItem.js → useTreeItemState.js} +2 -2
  67. package/legacy/TreeView/TreeView.js +0 -39
  68. package/legacy/icons/icons.js +9 -0
  69. package/legacy/icons/index.js +1 -0
  70. package/legacy/index.js +3 -2
  71. package/legacy/internals/index.js +4 -0
  72. package/legacy/internals/plugins/defaultPlugins.js +2 -2
  73. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +10 -10
  74. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -6
  75. package/legacy/internals/plugins/useTreeViewIcons/index.js +1 -0
  76. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +21 -0
  77. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +3 -0
  78. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +14 -0
  79. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -6
  80. package/legacy/internals/useTreeView/useTreeView.js +6 -2
  81. package/legacy/internals/useTreeView/useTreeViewModels.js +10 -11
  82. package/legacy/internals/utils/extractPluginParamsFromProps.js +11 -2
  83. package/modern/RichTreeView/RichTreeView.js +10 -36
  84. package/modern/SimpleTreeView/SimpleTreeView.js +12 -55
  85. package/modern/TreeItem/TreeItem.js +61 -39
  86. package/modern/TreeItem/TreeItemContent.js +2 -5
  87. package/modern/TreeItem/index.js +1 -1
  88. package/{TreeItem/useTreeItem.js → modern/TreeItem/useTreeItemState.js} +4 -2
  89. package/modern/TreeView/TreeView.js +0 -39
  90. package/modern/icons/icons.js +9 -0
  91. package/modern/icons/index.js +1 -0
  92. package/modern/index.js +3 -2
  93. package/modern/internals/index.js +4 -0
  94. package/modern/internals/plugins/defaultPlugins.js +2 -2
  95. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
  96. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
  97. package/modern/internals/plugins/useTreeViewIcons/index.js +1 -0
  98. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
  99. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +10 -5
  100. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
  101. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  102. package/modern/internals/useTreeView/useTreeView.js +7 -3
  103. package/modern/internals/useTreeView/useTreeViewModels.js +10 -11
  104. package/modern/internals/utils/extractPluginParamsFromProps.js +17 -6
  105. package/node/RichTreeView/RichTreeView.js +10 -36
  106. package/node/SimpleTreeView/SimpleTreeView.js +12 -55
  107. package/node/TreeItem/TreeItem.js +61 -39
  108. package/node/TreeItem/TreeItemContent.js +2 -5
  109. package/node/TreeItem/index.js +4 -4
  110. package/node/TreeItem/{useTreeItem.js → useTreeItemState.js} +5 -3
  111. package/node/TreeView/TreeView.js +0 -39
  112. package/node/icons/icons.js +17 -0
  113. package/node/icons/index.js +16 -0
  114. package/node/index.js +13 -1
  115. package/node/internals/index.js +33 -0
  116. package/node/internals/plugins/defaultPlugins.js +2 -2
  117. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -10
  118. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -3
  119. package/node/internals/plugins/useTreeViewIcons/index.js +12 -0
  120. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +29 -0
  121. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +10 -5
  122. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +11 -0
  123. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -5
  124. package/node/internals/useTreeView/useTreeView.js +7 -3
  125. package/node/internals/useTreeView/useTreeViewModels.js +10 -11
  126. package/node/internals/utils/extractPluginParamsFromProps.js +18 -6
  127. package/package.json +7 -7
  128. package/themeAugmentation/components.d.ts +4 -4
  129. package/internals/plugins/useTreeViewContextValueBuilder/index.d.ts +0 -2
  130. package/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  131. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.d.ts +0 -3
  132. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
  133. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +0 -29
  134. package/legacy/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  135. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -34
  136. package/modern/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  137. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -32
  138. package/node/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -12
  139. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -39
  140. /package/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  141. /package/legacy/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  142. /package/modern/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  143. /package/node/internals/plugins/{useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
@@ -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
  };
@@ -16,6 +16,9 @@ const updateState = ({
16
16
  if (id == null) {
17
17
  throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
18
18
  }
19
+ if (nodeMap[id] != null) {
20
+ throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
21
+ }
19
22
  const label = getItemLabel ? getItemLabel(item) : item.label;
20
23
  if (label == null) {
21
24
  throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
@@ -116,6 +119,11 @@ export const useTreeViewNodes = ({
116
119
  getNavigableChildrenIds,
117
120
  isNodeDisabled
118
121
  });
122
+ return {
123
+ contextValue: {
124
+ disabledItemsFocusable: params.disabledItemsFocusable
125
+ }
126
+ };
119
127
  };
120
128
  useTreeViewNodes.getInitialState = params => updateState({
121
129
  items: params.items,
@@ -123,6 +131,12 @@ useTreeViewNodes.getInitialState = params => updateState({
123
131
  getItemId: params.getItemId,
124
132
  getItemLabel: params.getItemLabel
125
133
  });
134
+ useTreeViewNodes.getDefaultizedParams = params => {
135
+ var _params$disabledItems;
136
+ return _extends({}, params, {
137
+ disabledItemsFocusable: (_params$disabledItems = params.disabledItemsFocusable) != null ? _params$disabledItems : false
138
+ });
139
+ };
126
140
  useTreeViewNodes.params = {
127
141
  disabledItemsFocusable: true,
128
142
  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)]);
@@ -1,13 +1,16 @@
1
1
  import * as React from 'react';
2
2
  import { ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewPlugin } from '../models';
3
- export declare const extractPluginParamsFromProps: <TProps extends {}, TPlugins extends readonly TreeViewPlugin<any>[]>({ props, plugins, rootRef, }: {
3
+ import { UseTreeViewBaseParameters } from '../useTreeView/useTreeView.types';
4
+ export declare const extractPluginParamsFromProps: <TPlugins extends readonly TreeViewPlugin<any>[], TSlots extends MergePluginsProperty<TPlugins, "slots">, TSlotProps extends MergePluginsProperty<TPlugins, "slotProps">, TProps extends {
5
+ slots?: TSlots | undefined;
6
+ slotProps?: TSlotProps | undefined;
7
+ }>({ props: { slots, slotProps, ...props }, plugins, rootRef, }: {
4
8
  props: TProps;
5
9
  plugins: TPlugins;
6
10
  rootRef?: React.Ref<HTMLUListElement> | undefined;
7
11
  }) => {
8
- pluginParams: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params"> & {
9
- plugins: TPlugins;
10
- rootRef?: React.Ref<HTMLUListElement> | undefined;
11
- };
12
+ pluginParams: UseTreeViewBaseParameters<TPlugins> & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params">;
13
+ slots: TSlots | undefined;
14
+ slotProps: TSlotProps | undefined;
12
15
  otherProps: Omit<TProps, keyof MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params">>;
13
16
  };
@@ -1,15 +1,24 @@
1
- export const extractPluginParamsFromProps = ({
2
- props,
3
- plugins,
4
- rootRef
5
- }) => {
1
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
+ const _excluded = ["slots", "slotProps"];
3
+ export const extractPluginParamsFromProps = _ref => {
4
+ let {
5
+ props: {
6
+ slots,
7
+ slotProps
8
+ },
9
+ plugins,
10
+ rootRef
11
+ } = _ref,
12
+ props = _objectWithoutPropertiesLoose(_ref.props, _excluded);
6
13
  const paramsLookup = {};
7
14
  plugins.forEach(plugin => {
8
15
  Object.assign(paramsLookup, plugin.params);
9
16
  });
10
17
  const pluginParams = {
11
18
  plugins,
12
- rootRef
19
+ rootRef,
20
+ slots: slots != null ? slots : {},
21
+ slotProps: slotProps != null ? slotProps : {}
13
22
  };
14
23
  const otherProps = {};
15
24
  Object.keys(props).forEach(propName => {
@@ -22,6 +31,8 @@ export const extractPluginParamsFromProps = ({
22
31
  });
23
32
  return {
24
33
  pluginParams,
34
+ slots,
35
+ slotProps,
25
36
  otherProps
26
37
  };
27
38
  };
@@ -1,6 +1,4 @@
1
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
1
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- var _excluded = ["slots", "slotProps"];
4
2
  import * as React from 'react';
5
3
  import PropTypes from 'prop-types';
6
4
  import { styled, useThemeProps } from '@mui/material/styles';
@@ -88,10 +86,9 @@ var RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps,
88
86
  rootRef: ref
89
87
  }),
90
88
  pluginParams = _extractPluginParamsF.pluginParams,
91
- _extractPluginParamsF2 = _extractPluginParamsF.otherProps,
92
- slots = _extractPluginParamsF2.slots,
93
- slotProps = _extractPluginParamsF2.slotProps,
94
- otherProps = _objectWithoutProperties(_extractPluginParamsF2, _excluded);
89
+ slots = _extractPluginParamsF.slots,
90
+ slotProps = _extractPluginParamsF.slotProps,
91
+ otherProps = _extractPluginParamsF.otherProps;
95
92
  var _useTreeView = useTreeView(pluginParams),
96
93
  getRootProps = _useTreeView.getRootProps,
97
94
  contextValue = _useTreeView.contextValue,
@@ -137,34 +134,13 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
137
134
  * Override or extend the styles applied to the component.
138
135
  */
139
136
  classes: PropTypes.object,
140
- /**
141
- * className applied to the root element.
142
- */
143
137
  className: PropTypes.string,
144
- /**
145
- * The default icon used to collapse the node.
146
- */
147
- defaultCollapseIcon: PropTypes.node,
148
- /**
149
- * The default icon displayed next to a end node. This is applied to all
150
- * tree nodes and can be overridden by the TreeItem `icon` prop.
151
- */
152
- defaultEndIcon: PropTypes.node,
153
138
  /**
154
139
  * Expanded node ids.
155
140
  * Used when the item's expansion is not controlled.
156
141
  * @default []
157
142
  */
158
143
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
159
- /**
160
- * The default icon used to expand the node.
161
- */
162
- defaultExpandIcon: PropTypes.node,
163
- /**
164
- * The default icon displayed next to a parent node. This is applied to all
165
- * parent nodes and can be overridden by the TreeItem `icon` prop.
166
- */
167
- defaultParentIcon: PropTypes.node,
168
144
  /**
169
145
  * Selected node ids. (Uncontrolled)
170
146
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
@@ -1,6 +1,4 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- var _excluded = ["slots", "slotProps"];
4
2
  import * as React from 'react';
5
3
  import PropTypes from 'prop-types';
6
4
  import { styled, useThemeProps } from '@mui/material/styles';
@@ -65,10 +63,9 @@ var SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inPro
65
63
  rootRef: ref
66
64
  }),
67
65
  pluginParams = _extractPluginParamsF.pluginParams,
68
- _extractPluginParamsF2 = _extractPluginParamsF.otherProps,
69
- slots = _extractPluginParamsF2.slots,
70
- slotProps = _extractPluginParamsF2.slotProps,
71
- otherProps = _objectWithoutProperties(_extractPluginParamsF2, _excluded);
66
+ slots = _extractPluginParamsF.slots,
67
+ slotProps = _extractPluginParamsF.slotProps,
68
+ otherProps = _extractPluginParamsF.otherProps;
72
69
  var _useTreeView = useTreeView(pluginParams),
73
70
  getRootProps = _useTreeView.getRootProps,
74
71
  contextValue = _useTreeView.contextValue;
@@ -76,7 +73,7 @@ var SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inPro
76
73
  var Root = (_slots$root = slots == null ? void 0 : slots.root) != null ? _slots$root : SimpleTreeViewRoot;
77
74
  var rootProps = useSlotProps({
78
75
  elementType: Root,
79
- externalSlotProps: {},
76
+ externalSlotProps: slotProps == null ? void 0 : slotProps.root,
80
77
  externalForwardedProps: otherProps,
81
78
  className: classes.root,
82
79
  getSlotProps: getRootProps,
@@ -100,34 +97,13 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
100
97
  * Override or extend the styles applied to the component.
101
98
  */
102
99
  classes: PropTypes.object,
103
- /**
104
- * className applied to the root element.
105
- */
106
100
  className: PropTypes.string,
107
- /**
108
- * The default icon used to collapse the node.
109
- */
110
- defaultCollapseIcon: PropTypes.node,
111
- /**
112
- * The default icon displayed next to a end node. This is applied to all
113
- * tree nodes and can be overridden by the TreeItem `icon` prop.
114
- */
115
- defaultEndIcon: PropTypes.node,
116
101
  /**
117
102
  * Expanded node ids.
118
103
  * Used when the item's expansion is not controlled.
119
104
  * @default []
120
105
  */
121
106
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
122
- /**
123
- * The default icon used to expand the node.
124
- */
125
- defaultExpandIcon: PropTypes.node,
126
- /**
127
- * The default icon displayed next to a parent node. This is applied to all
128
- * parent nodes and can be overridden by the TreeItem `icon` prop.
129
- */
130
- defaultParentIcon: PropTypes.node,
131
107
  /**
132
108
  * Selected node ids. (Uncontrolled)
133
109
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
@@ -149,24 +125,6 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
149
125
  * Used when the item's expansion is controlled.
150
126
  */
151
127
  expandedNodes: PropTypes.arrayOf(PropTypes.string),
152
- /**
153
- * Used to determine the string label for a given item.
154
- *
155
- * @template R
156
- * @param {R} item The item to check.
157
- * @returns {string} The id of the item.
158
- * @default `(item) => item.id`
159
- */
160
- getItemId: PropTypes.func,
161
- /**
162
- * Used to determine the string label for a given item.
163
- *
164
- * @template R
165
- * @param {R} item The item to check.
166
- * @returns {string} The label of the item.
167
- * @default `(item) => item.label`
168
- */
169
- getItemLabel: PropTypes.func,
170
128
  /**
171
129
  * This prop is used to help implement the accessibility logic.
172
130
  * If you don't provide this prop. It falls back to a randomly generated id.
@@ -1,11 +1,15 @@
1
1
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
- var _excluded = ["children", "className", "collapseIcon", "ContentComponent", "ContentProps", "endIcon", "expandIcon", "icon", "nodeId", "id", "label", "onClick", "onMouseDown", "TransitionComponent", "TransitionProps"];
4
+ var _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown", "TransitionComponent", "TransitionProps"],
5
+ _excluded2 = ["ownerState"],
6
+ _excluded3 = ["ownerState"],
7
+ _excluded4 = ["ownerState"];
5
8
  import * as React from 'react';
6
9
  import PropTypes from 'prop-types';
7
10
  import clsx from 'clsx';
8
11
  import Collapse from '@mui/material/Collapse';
12
+ import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
9
13
  import { alpha, styled, useThemeProps } from '@mui/material/styles';
10
14
  import unsupportedProp from '@mui/utils/unsupportedProp';
11
15
  import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
@@ -13,6 +17,7 @@ import { unstable_composeClasses as composeClasses } from '@mui/base';
13
17
  import { TreeItemContent } from './TreeItemContent';
14
18
  import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses';
15
19
  import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
20
+ import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
16
21
  import { jsx as _jsx } from "react/jsx-runtime";
17
22
  import { jsxs as _jsxs } from "react/jsx-runtime";
18
23
  var useUtilityClasses = function useUtilityClasses(ownerState) {
@@ -124,10 +129,11 @@ var TreeItemGroup = styled(Collapse, {
124
129
  * - [TreeItem API](https://mui.com/x/api/tree-view/tree-item/)
125
130
  */
126
131
  export var TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps, inRef) {
132
+ var _ref5, _inSlots$expandIcon, _ref6, _inSlots$collapseIcon, _inSlots$endIcon;
127
133
  var _useTreeViewContext = useTreeViewContext(),
128
134
  contextIcons = _useTreeViewContext.icons,
129
135
  runItemPlugins = _useTreeViewContext.runItemPlugins,
130
- multiSelect = _useTreeViewContext.multiSelect,
136
+ multiSelect = _useTreeViewContext.selection.multiSelect,
131
137
  disabledItemsFocusable = _useTreeViewContext.disabledItemsFocusable,
132
138
  instance = _useTreeViewContext.instance;
133
139
  var inPropsWithTheme = useThemeProps({
@@ -143,13 +149,11 @@ export var TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps, i
143
149
  wrapItem = _runItemPlugins.wrapItem;
144
150
  var children = props.children,
145
151
  className = props.className,
146
- collapseIcon = props.collapseIcon,
152
+ inSlots = props.slots,
153
+ inSlotProps = props.slotProps,
147
154
  _props$ContentCompone = props.ContentComponent,
148
155
  ContentComponent = _props$ContentCompone === void 0 ? TreeItemContent : _props$ContentCompone,
149
156
  ContentProps = props.ContentProps,
150
- endIcon = props.endIcon,
151
- expandIcon = props.expandIcon,
152
- icon = props.icon,
153
157
  nodeId = props.nodeId,
154
158
  id = props.id,
155
159
  label = props.label,
@@ -159,6 +163,12 @@ export var TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps, i
159
163
  TransitionComponent = _props$TransitionComp === void 0 ? Collapse : _props$TransitionComp,
160
164
  TransitionProps = props.TransitionProps,
161
165
  other = _objectWithoutProperties(props, _excluded);
166
+ var slots = {
167
+ expandIcon: (_ref5 = (_inSlots$expandIcon = inSlots == null ? void 0 : inSlots.expandIcon) != null ? _inSlots$expandIcon : contextIcons.slots.expandIcon) != null ? _ref5 : TreeViewExpandIcon,
168
+ collapseIcon: (_ref6 = (_inSlots$collapseIcon = inSlots == null ? void 0 : inSlots.collapseIcon) != null ? _inSlots$collapseIcon : contextIcons.slots.collapseIcon) != null ? _ref6 : TreeViewCollapseIcon,
169
+ endIcon: (_inSlots$endIcon = inSlots == null ? void 0 : inSlots.endIcon) != null ? _inSlots$endIcon : contextIcons.slots.endIcon,
170
+ icon: inSlots == null ? void 0 : inSlots.icon
171
+ };
162
172
  var expandable = Boolean(Array.isArray(children) ? children.length : children);
163
173
  var expanded = instance.isNodeExpanded(nodeId);
164
174
  var focused = instance.isNodeFocused(nodeId);
@@ -171,20 +181,43 @@ export var TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps, i
171
181
  disabled: disabled
172
182
  });
173
183
  var classes = useUtilityClasses(ownerState);
174
- var displayIcon;
175
- var expansionIcon;
176
- if (expandable) {
177
- if (!expanded) {
178
- expansionIcon = expandIcon || contextIcons.defaultExpandIcon;
179
- } else {
180
- expansionIcon = collapseIcon || contextIcons.defaultCollapseIcon;
181
- }
182
- }
183
- if (expandable) {
184
- displayIcon = contextIcons.defaultParentIcon;
185
- } else {
186
- displayIcon = endIcon || contextIcons.defaultEndIcon;
187
- }
184
+ var ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
185
+ var _useSlotProps = useSlotProps({
186
+ elementType: ExpansionIcon,
187
+ ownerState: {},
188
+ externalSlotProps: function externalSlotProps(tempOwnerState) {
189
+ if (expanded) {
190
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.collapseIcon, tempOwnerState), resolveComponentProps(inSlotProps == null ? void 0 : inSlotProps.collapseIcon, tempOwnerState));
191
+ }
192
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.expandIcon, tempOwnerState), resolveComponentProps(inSlotProps == null ? void 0 : inSlotProps.expandIcon, tempOwnerState));
193
+ }
194
+ }),
195
+ expansionIconOwnerState = _useSlotProps.ownerState,
196
+ expansionIconProps = _objectWithoutProperties(_useSlotProps, _excluded2);
197
+ var expansionIcon = expandable && !!ExpansionIcon ? /*#__PURE__*/_jsx(ExpansionIcon, _extends({}, expansionIconProps)) : null;
198
+ var DisplayIcon = expandable ? undefined : slots.endIcon;
199
+ var _useSlotProps2 = useSlotProps({
200
+ elementType: DisplayIcon,
201
+ ownerState: {},
202
+ externalSlotProps: function externalSlotProps(tempOwnerState) {
203
+ if (expandable) {
204
+ return {};
205
+ }
206
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.endIcon, tempOwnerState), resolveComponentProps(inSlotProps == null ? void 0 : inSlotProps.endIcon, tempOwnerState));
207
+ }
208
+ }),
209
+ displayIconOwnerState = _useSlotProps2.ownerState,
210
+ displayIconProps = _objectWithoutProperties(_useSlotProps2, _excluded3);
211
+ var displayIcon = DisplayIcon ? /*#__PURE__*/_jsx(DisplayIcon, _extends({}, displayIconProps)) : null;
212
+ var Icon = slots.icon;
213
+ var _useSlotProps3 = useSlotProps({
214
+ elementType: Icon,
215
+ ownerState: {},
216
+ externalSlotProps: inSlotProps == null ? void 0 : inSlotProps.icon
217
+ }),
218
+ iconOwnerState = _useSlotProps3.ownerState,
219
+ iconProps = _objectWithoutProperties(_useSlotProps3, _excluded4);
220
+ var icon = Icon ? /*#__PURE__*/_jsx(Icon, _extends({}, iconProps)) : null;
188
221
  var ariaSelected;
189
222
  if (multiSelect) {
190
223
  ariaSelected = selected;
@@ -265,14 +298,7 @@ TreeItem.propTypes = {
265
298
  * Override or extend the styles applied to the component.
266
299
  */
267
300
  classes: PropTypes.object,
268
- /**
269
- * className applied to the root element.
270
- */
271
301
  className: PropTypes.string,
272
- /**
273
- * The icon used to collapse the node.
274
- */
275
- collapseIcon: PropTypes.node,
276
302
  /**
277
303
  * The component used for the content node.
278
304
  * @default TreeItemContent
@@ -287,18 +313,6 @@ TreeItem.propTypes = {
287
313
  * @default false
288
314
  */
289
315
  disabled: PropTypes.bool,
290
- /**
291
- * The icon displayed next to an end node.
292
- */
293
- endIcon: PropTypes.node,
294
- /**
295
- * The icon used to expand the node.
296
- */
297
- expandIcon: PropTypes.node,
298
- /**
299
- * The icon to display next to the tree node's label.
300
- */
301
- icon: PropTypes.node,
302
316
  /**
303
317
  * The tree node label.
304
318
  */
@@ -312,6 +326,16 @@ TreeItem.propTypes = {
312
326
  * Use the `onNodeFocus` callback on the tree if you need to monitor a node's focus.
313
327
  */
314
328
  onFocus: unsupportedProp,
329
+ /**
330
+ * The props used for each component slot.
331
+ * @default {}
332
+ */
333
+ slotProps: PropTypes.object,
334
+ /**
335
+ * Overridable component slots.
336
+ * @default {}
337
+ */
338
+ slots: PropTypes.object,
315
339
  /**
316
340
  * The system prop that allows defining system overrides as well as additional CSS styles.
317
341
  */