@mui/x-tree-view 7.0.0-alpha.7 → 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 (164) hide show
  1. package/CHANGELOG.md +554 -51
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +14 -79
  4. package/RichTreeView/RichTreeView.types.d.ts +6 -9
  5. package/RichTreeView/index.d.ts +1 -1
  6. package/SimpleTreeView/SimpleTreeView.js +17 -75
  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/TreeItem/{useTreeItem.js → useTreeItemState.js} +4 -2
  18. package/TreeView/TreeView.js +1 -22
  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/TreeViewProvider/useTreeViewContext.js +1 -1
  31. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  32. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.types.d.ts +3 -2
  33. package/internals/index.d.ts +15 -0
  34. package/internals/index.js +4 -0
  35. package/internals/models/MuiCancellableEvent.d.ts +4 -0
  36. package/internals/models/helpers.d.ts +7 -1
  37. package/internals/models/plugin.d.ts +65 -20
  38. package/internals/models/treeView.d.ts +1 -2
  39. package/internals/package.json +6 -0
  40. package/internals/plugins/defaultPlugins.d.ts +6 -4
  41. package/internals/plugins/defaultPlugins.js +2 -2
  42. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -10
  43. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +7 -3
  44. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +2 -5
  45. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +12 -6
  46. package/internals/plugins/useTreeViewIcons/index.d.ts +2 -0
  47. package/internals/plugins/useTreeViewIcons/index.js +1 -0
  48. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.d.ts +3 -0
  49. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
  50. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +43 -0
  51. package/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  52. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +6 -2
  53. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  54. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +6 -4
  55. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  56. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +9 -6
  57. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -3
  58. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +10 -2
  59. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +17 -5
  60. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -5
  61. package/internals/useTreeView/useTreeView.js +7 -3
  62. package/internals/useTreeView/useTreeView.types.d.ts +6 -6
  63. package/internals/useTreeView/useTreeViewModels.js +12 -13
  64. package/internals/utils/extractPluginParamsFromProps.d.ts +16 -0
  65. package/internals/utils/extractPluginParamsFromProps.js +38 -0
  66. package/legacy/RichTreeView/RichTreeView.js +15 -77
  67. package/legacy/SimpleTreeView/SimpleTreeView.js +14 -70
  68. package/legacy/TreeItem/TreeItem.js +63 -39
  69. package/legacy/TreeItem/TreeItemContent.js +9 -12
  70. package/legacy/TreeItem/index.js +1 -1
  71. package/legacy/TreeItem/{useTreeItem.js → useTreeItemState.js} +2 -2
  72. package/legacy/TreeView/TreeView.js +1 -22
  73. package/legacy/icons/icons.js +9 -0
  74. package/legacy/icons/index.js +1 -0
  75. package/legacy/index.js +3 -2
  76. package/legacy/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  77. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  78. package/legacy/internals/index.js +4 -0
  79. package/legacy/internals/plugins/defaultPlugins.js +2 -2
  80. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +16 -10
  81. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +2 -5
  82. package/legacy/internals/plugins/useTreeViewIcons/index.js +1 -0
  83. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +21 -0
  84. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.js +1 -0
  85. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  86. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  87. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +157 -110
  88. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +20 -2
  89. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +20 -6
  90. package/legacy/internals/useTreeView/useTreeView.js +6 -2
  91. package/legacy/internals/useTreeView/useTreeViewModels.js +12 -13
  92. package/legacy/internals/utils/extractPluginParamsFromProps.js +36 -0
  93. package/modern/RichTreeView/RichTreeView.js +14 -79
  94. package/modern/SimpleTreeView/SimpleTreeView.js +17 -75
  95. package/modern/TreeItem/TreeItem.js +61 -39
  96. package/modern/TreeItem/TreeItemContent.js +2 -5
  97. package/modern/TreeItem/index.js +1 -1
  98. package/modern/TreeItem/{useTreeItem.js → useTreeItemState.js} +4 -2
  99. package/modern/TreeView/TreeView.js +1 -22
  100. package/modern/icons/icons.js +9 -0
  101. package/modern/icons/index.js +1 -0
  102. package/modern/index.js +3 -2
  103. package/modern/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  104. package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  105. package/modern/internals/index.js +4 -0
  106. package/modern/internals/models/MuiCancellableEvent.js +1 -0
  107. package/modern/internals/plugins/defaultPlugins.js +2 -2
  108. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -11
  109. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -3
  110. package/modern/internals/plugins/useTreeViewIcons/index.js +1 -0
  111. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +22 -0
  112. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.js +1 -0
  113. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  114. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  115. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  116. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +18 -3
  117. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -6
  118. package/modern/internals/useTreeView/useTreeView.js +7 -3
  119. package/modern/internals/useTreeView/useTreeViewModels.js +12 -13
  120. package/modern/internals/utils/extractPluginParamsFromProps.js +38 -0
  121. package/node/RichTreeView/RichTreeView.js +14 -79
  122. package/node/SimpleTreeView/SimpleTreeView.js +17 -75
  123. package/node/TreeItem/TreeItem.js +61 -39
  124. package/node/TreeItem/TreeItemContent.js +2 -5
  125. package/node/TreeItem/index.js +4 -4
  126. package/node/TreeItem/{useTreeItem.js → useTreeItemState.js} +5 -3
  127. package/node/TreeView/TreeView.js +1 -22
  128. package/node/icons/icons.js +17 -0
  129. package/node/icons/index.js +16 -0
  130. package/node/index.js +13 -1
  131. package/node/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  132. package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  133. package/node/internals/index.js +33 -0
  134. package/node/internals/plugins/defaultPlugins.js +2 -2
  135. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -11
  136. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -3
  137. package/node/internals/plugins/useTreeViewIcons/index.js +12 -0
  138. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +29 -0
  139. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.js +5 -0
  140. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +4 -1
  141. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  142. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  143. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +18 -3
  144. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -6
  145. package/node/internals/useTreeView/useTreeView.js +7 -3
  146. package/node/internals/useTreeView/useTreeViewModels.js +12 -13
  147. package/node/internals/utils/extractPluginParamsFromProps.js +46 -0
  148. package/package.json +7 -7
  149. package/themeAugmentation/components.d.ts +4 -4
  150. package/internals/plugins/useTreeViewContextValueBuilder/index.d.ts +0 -2
  151. package/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  152. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.d.ts +0 -3
  153. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -26
  154. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +0 -29
  155. package/legacy/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  156. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -28
  157. package/modern/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -1
  158. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -26
  159. package/node/internals/plugins/useTreeViewContextValueBuilder/index.js +0 -12
  160. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +0 -33
  161. /package/internals/{plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → models/MuiCancellableEvent.js} +0 -0
  162. /package/{legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → internals/plugins/useTreeViewIcons/useTreeViewIcons.types.js} +0 -0
  163. /package/{modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → legacy/internals/models/MuiCancellableEvent.js} +0 -0
  164. /package/node/internals/{plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.js → models/MuiCancellableEvent.js} +0 -0
@@ -10,9 +10,6 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
10
10
  var lastSelectedNode = React.useRef(null);
11
11
  var lastSelectionWasRange = React.useRef(false);
12
12
  var currentRangeSelection = React.useRef([]);
13
- var isNodeSelected = function isNodeSelected(nodeId) {
14
- return Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
15
- };
16
13
  var setSelectedNodes = function setSelectedNodes(event, newSelectedNodes) {
17
14
  if (params.onNodeSelectionToggle) {
18
15
  if (params.multiSelect) {
@@ -40,7 +37,10 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
40
37
  if (params.onSelectedNodesChange) {
41
38
  params.onSelectedNodesChange(event, newSelectedNodes);
42
39
  }
43
- models.selectedNodes.setValue(newSelectedNodes);
40
+ models.selectedNodes.setControlledValue(newSelectedNodes);
41
+ };
42
+ var isNodeSelected = function isNodeSelected(nodeId) {
43
+ return Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
44
44
  };
45
45
  var selectNode = function selectNode(event, nodeId) {
46
46
  var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
@@ -185,13 +185,19 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
185
185
  return {
186
186
  'aria-multiselectable': params.multiSelect
187
187
  };
188
+ },
189
+ contextValue: {
190
+ selection: {
191
+ multiSelect: params.multiSelect
192
+ }
188
193
  }
189
194
  };
190
195
  };
191
196
  useTreeViewSelection.models = {
192
197
  selectedNodes: {
193
- controlledProp: 'selectedNodes',
194
- defaultProp: 'defaultSelectedNodes'
198
+ getDefaultValue: function getDefaultValue(params) {
199
+ return params.defaultSelectedNodes;
200
+ }
195
201
  }
196
202
  };
197
203
  var DEFAULT_SELECTED_NODES = [];
@@ -202,4 +208,12 @@ useTreeViewSelection.getDefaultizedParams = function (params) {
202
208
  multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
203
209
  defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
204
210
  });
211
+ };
212
+ useTreeViewSelection.params = {
213
+ disableSelection: true,
214
+ multiSelect: true,
215
+ defaultSelectedNodes: true,
216
+ selectedNodes: true,
217
+ onSelectedNodesChange: true,
218
+ onNodeSelectionToggle: true
205
219
  };
@@ -31,11 +31,15 @@ export var useTreeView = function useTreeView(inParams) {
31
31
  state = _React$useState2[0],
32
32
  setState = _React$useState2[1];
33
33
  var rootPropsGetters = [];
34
- var contextValue = {};
34
+ var contextValue = {
35
+ instance: instance
36
+ };
35
37
  var runPlugin = function runPlugin(plugin) {
36
38
  var pluginResponse = plugin({
37
39
  instance: instance,
38
40
  params: params,
41
+ slots: params.slots,
42
+ slotProps: params.slotProps,
39
43
  state: state,
40
44
  setState: setState,
41
45
  rootRef: innerRootRef,
@@ -45,7 +49,7 @@ export var useTreeView = function useTreeView(inParams) {
45
49
  rootPropsGetters.push(pluginResponse.getRootProps);
46
50
  }
47
51
  if (pluginResponse.contextValue) {
48
- contextValue = pluginResponse.contextValue;
52
+ _extends(contextValue, pluginResponse.contextValue);
49
53
  }
50
54
  };
51
55
  plugins.forEach(runPlugin);
@@ -15,13 +15,12 @@ export var useTreeViewModels = function useTreeViewModels(plugins, props) {
15
15
  Object.entries(plugin.models).forEach(function (_ref) {
16
16
  var _ref2 = _slicedToArray(_ref, 2),
17
17
  modelName = _ref2[0],
18
- model = _ref2[1];
18
+ modelInitializer = _ref2[1];
19
19
  modelsRef.current[modelName] = {
20
- controlledProp: model.controlledProp,
21
- defaultProp: model.defaultProp,
22
- isControlled: props[model.controlledProp] !== undefined
20
+ isControlled: props[modelName] !== undefined,
21
+ getDefaultValue: modelInitializer.getDefaultValue
23
22
  };
24
- initialState[modelName] = props[model.defaultProp];
23
+ initialState[modelName] = modelInitializer.getDefaultValue(props);
25
24
  });
26
25
  }
27
26
  });
@@ -34,10 +33,10 @@ export var useTreeViewModels = function useTreeViewModels(plugins, props) {
34
33
  var _ref4 = _slicedToArray(_ref3, 2),
35
34
  modelName = _ref4[0],
36
35
  model = _ref4[1];
37
- var value = model.isControlled ? props[model.controlledProp] : modelsState[modelName];
36
+ var value = model.isControlled ? props[modelName] : modelsState[modelName];
38
37
  return [modelName, {
39
38
  value: value,
40
- setValue: function setValue(newValue) {
39
+ setControlledValue: function setControlledValue(newValue) {
41
40
  if (!model.isControlled) {
42
41
  setModelsState(function (prevState) {
43
42
  return _extends({}, prevState, _defineProperty({}, modelName, newValue));
@@ -54,18 +53,18 @@ export var useTreeViewModels = function useTreeViewModels(plugins, props) {
54
53
  var _ref6 = _slicedToArray(_ref5, 2),
55
54
  modelName = _ref6[0],
56
55
  model = _ref6[1];
57
- var controlled = props[model.controlledProp];
58
- var defaultProp = props[model.defaultProp];
56
+ var controlled = props[modelName];
57
+ var newDefaultValue = model.getDefaultValue(props);
59
58
  React.useEffect(function () {
60
59
  if (model.isControlled !== (controlled !== undefined)) {
61
- console.error(["MUI: A component is changing the ".concat(model.isControlled ? '' : 'un', "controlled ").concat(modelName, " state of TreeView to be ").concat(model.isControlled ? 'un' : '', "controlled."), 'Elements should not switch from uncontrolled to controlled (or vice versa).', "Decide between using a controlled or uncontrolled ".concat(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'));
60
+ console.error(["MUI X: A component is changing the ".concat(model.isControlled ? '' : 'un', "controlled ").concat(modelName, " state of TreeView to be ").concat(model.isControlled ? 'un' : '', "controlled."), 'Elements should not switch from uncontrolled to controlled (or vice versa).', "Decide between using a controlled or uncontrolled ".concat(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'));
62
61
  }
63
62
  }, [controlled]);
64
- var _React$useRef = React.useRef(defaultProp),
63
+ var _React$useRef = React.useRef(newDefaultValue),
65
64
  defaultValue = _React$useRef.current;
66
65
  React.useEffect(function () {
67
- if (!model.isControlled && defaultValue !== defaultProp) {
68
- console.error(["MUI: A component is changing the default ".concat(modelName, " state of an uncontrolled TreeView after being initialized. ") + "To suppress this warning opt to use a controlled TreeView."].join('\n'));
66
+ if (!model.isControlled && defaultValue !== newDefaultValue) {
67
+ console.error(["MUI X: A component is changing the default ".concat(modelName, " state of an uncontrolled TreeView after being initialized. ") + "To suppress this warning opt to use a controlled TreeView."].join('\n'));
69
68
  }
70
69
  }, [JSON.stringify(defaultValue)]);
71
70
  });
@@ -0,0 +1,36 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["slots", "slotProps"];
4
+ export var extractPluginParamsFromProps = function extractPluginParamsFromProps(_ref) {
5
+ var _ref$props = _ref.props,
6
+ slots = _ref$props.slots,
7
+ slotProps = _ref$props.slotProps,
8
+ props = _objectWithoutProperties(_ref$props, _excluded),
9
+ plugins = _ref.plugins,
10
+ rootRef = _ref.rootRef;
11
+ var paramsLookup = {};
12
+ plugins.forEach(function (plugin) {
13
+ _extends(paramsLookup, plugin.params);
14
+ });
15
+ var pluginParams = {
16
+ plugins: plugins,
17
+ rootRef: rootRef,
18
+ slots: slots != null ? slots : {},
19
+ slotProps: slotProps != null ? slotProps : {}
20
+ };
21
+ var otherProps = {};
22
+ Object.keys(props).forEach(function (propName) {
23
+ var prop = props[propName];
24
+ if (paramsLookup[propName]) {
25
+ pluginParams[propName] = prop;
26
+ } else {
27
+ otherProps[propName] = prop;
28
+ }
29
+ });
30
+ return {
31
+ pluginParams: pluginParams,
32
+ slots: slots,
33
+ slotProps: slotProps,
34
+ otherProps: otherProps
35
+ };
36
+ };
@@ -1,6 +1,4 @@
1
- import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
1
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["disabledItemsFocusable", "expandedNodes", "defaultExpandedNodes", "onExpandedNodesChange", "onNodeExpansionToggle", "onNodeFocus", "disableSelection", "defaultSelectedNodes", "selectedNodes", "multiSelect", "onSelectedNodesChange", "onNodeSelectionToggle", "id", "defaultCollapseIcon", "defaultEndIcon", "defaultExpandIcon", "defaultParentIcon", "items", "getItemId", "getItemLabel", "isItemDisabled", "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';
@@ -12,6 +10,7 @@ import { TreeViewProvider } from '../internals/TreeViewProvider';
12
10
  import { DEFAULT_TREE_VIEW_PLUGINS } from '../internals/plugins';
13
11
  import { TreeItem } from '../TreeItem';
14
12
  import { buildWarning } from '../internals/utils/warning';
13
+ import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps';
15
14
  import { jsx as _jsx } from "react/jsx-runtime";
16
15
  const useUtilityClasses = ownerState => {
17
16
  const {
@@ -58,7 +57,7 @@ function WrappedTreeItem({
58
57
  children: children
59
58
  }));
60
59
  }
61
- const childrenWarning = buildWarning(['MUI: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
60
+ const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
62
61
 
63
62
  /**
64
63
  *
@@ -75,75 +74,32 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
75
74
  props: inProps,
76
75
  name: 'MuiRichTreeView'
77
76
  });
78
- const _ref = props,
79
- {
80
- // Headless implementation
81
- disabledItemsFocusable,
82
- expandedNodes,
83
- defaultExpandedNodes,
84
- onExpandedNodesChange,
85
- onNodeExpansionToggle,
86
- onNodeFocus,
87
- disableSelection,
88
- defaultSelectedNodes,
89
- selectedNodes,
90
- multiSelect,
91
- onSelectedNodesChange,
92
- onNodeSelectionToggle,
93
- id: treeId,
94
- defaultCollapseIcon,
95
- defaultEndIcon,
96
- defaultExpandIcon,
97
- defaultParentIcon,
98
- items,
99
- getItemId,
100
- getItemLabel,
101
- isItemDisabled,
102
- // Component implementation
103
- slots,
104
- slotProps
105
- } = _ref,
106
- other = _objectWithoutPropertiesLoose(_ref, _excluded);
107
77
  if (process.env.NODE_ENV !== 'production') {
108
78
  if (props.children != null) {
109
79
  childrenWarning();
110
80
  }
111
81
  }
112
82
  const {
113
- getRootProps,
114
- contextValue,
115
- instance
116
- } = useTreeView({
117
- disabledItemsFocusable,
118
- expandedNodes,
119
- defaultExpandedNodes,
120
- onExpandedNodesChange,
121
- onNodeExpansionToggle,
122
- onNodeFocus,
123
- disableSelection,
124
- defaultSelectedNodes,
125
- selectedNodes,
126
- multiSelect,
127
- onSelectedNodesChange,
128
- onNodeSelectionToggle,
129
- id: treeId,
130
- defaultCollapseIcon,
131
- defaultEndIcon,
132
- defaultExpandIcon,
133
- defaultParentIcon,
134
- items,
135
- getItemId,
136
- getItemLabel,
137
- isItemDisabled,
83
+ pluginParams,
84
+ slots,
85
+ slotProps,
86
+ otherProps
87
+ } = extractPluginParamsFromProps({
88
+ props,
138
89
  plugins: DEFAULT_TREE_VIEW_PLUGINS,
139
90
  rootRef: ref
140
91
  });
92
+ const {
93
+ getRootProps,
94
+ contextValue,
95
+ instance
96
+ } = useTreeView(pluginParams);
141
97
  const classes = useUtilityClasses(props);
142
98
  const Root = slots?.root ?? RichTreeViewRoot;
143
99
  const rootProps = useSlotProps({
144
100
  elementType: Root,
145
101
  externalSlotProps: slotProps?.root,
146
- externalForwardedProps: other,
102
+ externalForwardedProps: otherProps,
147
103
  className: classes.root,
148
104
  getSlotProps: getRootProps,
149
105
  ownerState: props
@@ -180,34 +136,13 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
180
136
  * Override or extend the styles applied to the component.
181
137
  */
182
138
  classes: PropTypes.object,
183
- /**
184
- * className applied to the root element.
185
- */
186
139
  className: PropTypes.string,
187
- /**
188
- * The default icon used to collapse the node.
189
- */
190
- defaultCollapseIcon: PropTypes.node,
191
- /**
192
- * The default icon displayed next to a end node. This is applied to all
193
- * tree nodes and can be overridden by the TreeItem `icon` prop.
194
- */
195
- defaultEndIcon: PropTypes.node,
196
140
  /**
197
141
  * Expanded node ids.
198
142
  * Used when the item's expansion is not controlled.
199
143
  * @default []
200
144
  */
201
145
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
202
- /**
203
- * The default icon used to expand the node.
204
- */
205
- defaultExpandIcon: PropTypes.node,
206
- /**
207
- * The default icon displayed next to a parent node. This is applied to all
208
- * parent nodes and can be overridden by the TreeItem `icon` prop.
209
- */
210
- defaultParentIcon: PropTypes.node,
211
146
  /**
212
147
  * Selected node ids. (Uncontrolled)
213
148
  * 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 _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["disabledItemsFocusable", "expandedNodes", "defaultExpandedNodes", "onExpandedNodesChange", "onNodeExpansionToggle", "onNodeFocus", "disableSelection", "defaultSelectedNodes", "selectedNodes", "multiSelect", "onSelectedNodesChange", "onNodeSelectionToggle", "id", "defaultCollapseIcon", "defaultEndIcon", "defaultExpandIcon", "defaultParentIcon", "children", "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';
@@ -11,6 +9,7 @@ import { useTreeView } from '../internals/useTreeView';
11
9
  import { TreeViewProvider } from '../internals/TreeViewProvider';
12
10
  import { SIMPLE_TREE_VIEW_PLUGINS } from './SimpleTreeView.plugins';
13
11
  import { buildWarning } from '../internals/utils/warning';
12
+ import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps';
14
13
  import { jsx as _jsx } from "react/jsx-runtime";
15
14
  const useUtilityClasses = ownerState => {
16
15
  const {
@@ -32,7 +31,7 @@ export const SimpleTreeViewRoot = styled('ul', {
32
31
  outline: 0
33
32
  });
34
33
  const EMPTY_ITEMS = [];
35
- const itemsPropWarning = buildWarning(['MUI: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/simple-tree-view/items/']);
34
+ const itemsPropWarning = buildWarning(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/simple-tree-view/items/']);
36
35
 
37
36
  /**
38
37
  *
@@ -50,76 +49,40 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
50
49
  name: 'MuiSimpleTreeView'
51
50
  });
52
51
  const ownerState = props;
53
- const _ref = props,
54
- {
55
- // Headless implementation
56
- disabledItemsFocusable,
57
- expandedNodes,
58
- defaultExpandedNodes,
59
- onExpandedNodesChange,
60
- onNodeExpansionToggle,
61
- onNodeFocus,
62
- disableSelection,
63
- defaultSelectedNodes,
64
- selectedNodes,
65
- multiSelect,
66
- onSelectedNodesChange,
67
- onNodeSelectionToggle,
68
- id,
69
- defaultCollapseIcon,
70
- defaultEndIcon,
71
- defaultExpandIcon,
72
- defaultParentIcon,
73
- // Component implementation
74
- children,
75
- slots
76
- } = _ref,
77
- other = _objectWithoutPropertiesLoose(_ref, _excluded);
78
52
  if (process.env.NODE_ENV !== 'production') {
79
53
  if (props.items != null) {
80
54
  itemsPropWarning();
81
55
  }
82
56
  }
83
57
  const {
84
- getRootProps,
85
- contextValue
86
- } = useTreeView({
87
- disabledItemsFocusable,
88
- expandedNodes,
89
- defaultExpandedNodes,
90
- onExpandedNodesChange,
91
- onNodeExpansionToggle,
92
- onNodeFocus,
93
- disableSelection,
94
- defaultSelectedNodes,
95
- selectedNodes,
96
- multiSelect,
97
- onSelectedNodesChange,
98
- onNodeSelectionToggle,
99
- id,
100
- defaultCollapseIcon,
101
- defaultEndIcon,
102
- defaultExpandIcon,
103
- defaultParentIcon,
104
- items: EMPTY_ITEMS,
58
+ pluginParams,
59
+ slots,
60
+ slotProps,
61
+ otherProps
62
+ } = extractPluginParamsFromProps({
63
+ props: _extends({}, props, {
64
+ items: EMPTY_ITEMS
65
+ }),
105
66
  plugins: SIMPLE_TREE_VIEW_PLUGINS,
106
67
  rootRef: ref
107
68
  });
69
+ const {
70
+ getRootProps,
71
+ contextValue
72
+ } = useTreeView(pluginParams);
108
73
  const classes = useUtilityClasses(props);
109
74
  const Root = slots?.root ?? SimpleTreeViewRoot;
110
75
  const rootProps = useSlotProps({
111
76
  elementType: Root,
112
- externalSlotProps: {},
113
- externalForwardedProps: other,
77
+ externalSlotProps: slotProps?.root,
78
+ externalForwardedProps: otherProps,
114
79
  className: classes.root,
115
80
  getSlotProps: getRootProps,
116
81
  ownerState
117
82
  });
118
83
  return /*#__PURE__*/_jsx(TreeViewProvider, {
119
84
  value: contextValue,
120
- children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {
121
- children: children
122
- }))
85
+ children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps))
123
86
  });
124
87
  });
125
88
  process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
@@ -135,34 +98,13 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
135
98
  * Override or extend the styles applied to the component.
136
99
  */
137
100
  classes: PropTypes.object,
138
- /**
139
- * className applied to the root element.
140
- */
141
101
  className: PropTypes.string,
142
- /**
143
- * The default icon used to collapse the node.
144
- */
145
- defaultCollapseIcon: PropTypes.node,
146
- /**
147
- * The default icon displayed next to a end node. This is applied to all
148
- * tree nodes and can be overridden by the TreeItem `icon` prop.
149
- */
150
- defaultEndIcon: PropTypes.node,
151
102
  /**
152
103
  * Expanded node ids.
153
104
  * Used when the item's expansion is not controlled.
154
105
  * @default []
155
106
  */
156
107
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
157
- /**
158
- * The default icon used to expand the node.
159
- */
160
- defaultExpandIcon: PropTypes.node,
161
- /**
162
- * The default icon displayed next to a parent node. This is applied to all
163
- * parent nodes and can be overridden by the TreeItem `icon` prop.
164
- */
165
- defaultParentIcon: PropTypes.node,
166
108
  /**
167
109
  * Selected node ids. (Uncontrolled)
168
110
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
@@ -1,10 +1,14 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["children", "className", "collapseIcon", "ContentComponent", "ContentProps", "endIcon", "expandIcon", "icon", "nodeId", "id", "label", "onClick", "onMouseDown", "TransitionComponent", "TransitionProps"];
3
+ const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown", "TransitionComponent", "TransitionProps"],
4
+ _excluded2 = ["ownerState"],
5
+ _excluded3 = ["ownerState"],
6
+ _excluded4 = ["ownerState"];
4
7
  import * as React from 'react';
5
8
  import PropTypes from 'prop-types';
6
9
  import clsx from 'clsx';
7
10
  import Collapse from '@mui/material/Collapse';
11
+ import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
8
12
  import { alpha, styled, useThemeProps } from '@mui/material/styles';
9
13
  import unsupportedProp from '@mui/utils/unsupportedProp';
10
14
  import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
@@ -12,6 +16,7 @@ import { unstable_composeClasses as composeClasses } from '@mui/base';
12
16
  import { TreeItemContent } from './TreeItemContent';
13
17
  import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses';
14
18
  import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
19
+ import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
15
20
  import { jsx as _jsx } from "react/jsx-runtime";
16
21
  import { jsxs as _jsxs } from "react/jsx-runtime";
17
22
  const useUtilityClasses = ownerState => {
@@ -133,7 +138,9 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
133
138
  const {
134
139
  icons: contextIcons,
135
140
  runItemPlugins,
136
- multiSelect,
141
+ selection: {
142
+ multiSelect
143
+ },
137
144
  disabledItemsFocusable,
138
145
  instance
139
146
  } = useTreeViewContext();
@@ -152,12 +159,10 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
152
159
  const {
153
160
  children,
154
161
  className,
155
- collapseIcon,
162
+ slots: inSlots,
163
+ slotProps: inSlotProps,
156
164
  ContentComponent = TreeItemContent,
157
165
  ContentProps,
158
- endIcon,
159
- expandIcon,
160
- icon,
161
166
  nodeId,
162
167
  id,
163
168
  label,
@@ -167,6 +172,12 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
167
172
  TransitionProps
168
173
  } = props,
169
174
  other = _objectWithoutPropertiesLoose(props, _excluded);
175
+ const slots = {
176
+ expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? TreeViewExpandIcon,
177
+ collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? TreeViewCollapseIcon,
178
+ endIcon: inSlots?.endIcon ?? contextIcons.slots.endIcon,
179
+ icon: inSlots?.icon
180
+ };
170
181
  const expandable = Boolean(Array.isArray(children) ? children.length : children);
171
182
  const expanded = instance.isNodeExpanded(nodeId);
172
183
  const focused = instance.isNodeFocused(nodeId);
@@ -179,20 +190,40 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
179
190
  disabled
180
191
  });
181
192
  const classes = useUtilityClasses(ownerState);
182
- let displayIcon;
183
- let expansionIcon;
184
- if (expandable) {
185
- if (!expanded) {
186
- expansionIcon = expandIcon || contextIcons.defaultExpandIcon;
187
- } else {
188
- expansionIcon = collapseIcon || contextIcons.defaultCollapseIcon;
189
- }
190
- }
191
- if (expandable) {
192
- displayIcon = contextIcons.defaultParentIcon;
193
- } else {
194
- displayIcon = endIcon || contextIcons.defaultEndIcon;
195
- }
193
+ const ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
194
+ const _useSlotProps = useSlotProps({
195
+ elementType: ExpansionIcon,
196
+ ownerState: {},
197
+ externalSlotProps: tempOwnerState => {
198
+ if (expanded) {
199
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.collapseIcon, tempOwnerState), resolveComponentProps(inSlotProps?.collapseIcon, tempOwnerState));
200
+ }
201
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.expandIcon, tempOwnerState), resolveComponentProps(inSlotProps?.expandIcon, tempOwnerState));
202
+ }
203
+ }),
204
+ expansionIconProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded2);
205
+ const expansionIcon = expandable && !!ExpansionIcon ? /*#__PURE__*/_jsx(ExpansionIcon, _extends({}, expansionIconProps)) : null;
206
+ const DisplayIcon = expandable ? undefined : slots.endIcon;
207
+ const _useSlotProps2 = useSlotProps({
208
+ elementType: DisplayIcon,
209
+ ownerState: {},
210
+ externalSlotProps: tempOwnerState => {
211
+ if (expandable) {
212
+ return {};
213
+ }
214
+ return _extends({}, resolveComponentProps(contextIcons.slotProps.endIcon, tempOwnerState), resolveComponentProps(inSlotProps?.endIcon, tempOwnerState));
215
+ }
216
+ }),
217
+ displayIconProps = _objectWithoutPropertiesLoose(_useSlotProps2, _excluded3);
218
+ const displayIcon = DisplayIcon ? /*#__PURE__*/_jsx(DisplayIcon, _extends({}, displayIconProps)) : null;
219
+ const Icon = slots.icon;
220
+ const _useSlotProps3 = useSlotProps({
221
+ elementType: Icon,
222
+ ownerState: {},
223
+ externalSlotProps: inSlotProps?.icon
224
+ }),
225
+ iconProps = _objectWithoutPropertiesLoose(_useSlotProps3, _excluded4);
226
+ const icon = Icon ? /*#__PURE__*/_jsx(Icon, _extends({}, iconProps)) : null;
196
227
  let ariaSelected;
197
228
  if (multiSelect) {
198
229
  ariaSelected = selected;
@@ -273,14 +304,7 @@ TreeItem.propTypes = {
273
304
  * Override or extend the styles applied to the component.
274
305
  */
275
306
  classes: PropTypes.object,
276
- /**
277
- * className applied to the root element.
278
- */
279
307
  className: PropTypes.string,
280
- /**
281
- * The icon used to collapse the node.
282
- */
283
- collapseIcon: PropTypes.node,
284
308
  /**
285
309
  * The component used for the content node.
286
310
  * @default TreeItemContent
@@ -295,18 +319,6 @@ TreeItem.propTypes = {
295
319
  * @default false
296
320
  */
297
321
  disabled: PropTypes.bool,
298
- /**
299
- * The icon displayed next to an end node.
300
- */
301
- endIcon: PropTypes.node,
302
- /**
303
- * The icon used to expand the node.
304
- */
305
- expandIcon: PropTypes.node,
306
- /**
307
- * The icon to display next to the tree node's label.
308
- */
309
- icon: PropTypes.node,
310
322
  /**
311
323
  * The tree node label.
312
324
  */
@@ -320,6 +332,16 @@ TreeItem.propTypes = {
320
332
  * Use the `onNodeFocus` callback on the tree if you need to monitor a node's focus.
321
333
  */
322
334
  onFocus: unsupportedProp,
335
+ /**
336
+ * The props used for each component slot.
337
+ * @default {}
338
+ */
339
+ slotProps: PropTypes.object,
340
+ /**
341
+ * Overridable component slots.
342
+ * @default {}
343
+ */
344
+ slots: PropTypes.object,
323
345
  /**
324
346
  * The system prop that allows defining system overrides as well as additional CSS styles.
325
347
  */
@@ -4,7 +4,7 @@ const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import clsx from 'clsx';
7
- import { useTreeItem } from './useTreeItem';
7
+ import { useTreeItemState } from './useTreeItemState';
8
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
9
  import { jsxs as _jsxs } from "react/jsx-runtime";
10
10
  /**
@@ -31,7 +31,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
31
31
  handleExpansion,
32
32
  handleSelection,
33
33
  preventSelection
34
- } = useTreeItem(nodeId);
34
+ } = useTreeItemState(nodeId);
35
35
  const icon = iconProp || expansionIcon || displayIcon;
36
36
  const handleMouseDown = event => {
37
37
  preventSelection(event);
@@ -73,9 +73,6 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
73
73
  * Override or extend the styles applied to the component.
74
74
  */
75
75
  classes: PropTypes.object.isRequired,
76
- /**
77
- * className applied to the root element.
78
- */
79
76
  className: PropTypes.string,
80
77
  /**
81
78
  * The icon to display next to the tree node's label. Either a parent or end icon.
@@ -1,4 +1,4 @@
1
1
  export { TreeItem } from './TreeItem';
2
2
  export * from './treeItemClasses';
3
- export * from './useTreeItem';
3
+ export * from './useTreeItemState';
4
4
  export { TreeItemContent } from './TreeItemContent';