@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
@@ -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,17 +53,17 @@ 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
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) {
66
+ if (!model.isControlled && defaultValue !== newDefaultValue) {
68
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)]);
@@ -1,6 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["slots", "slotProps"];
2
4
  export var extractPluginParamsFromProps = function extractPluginParamsFromProps(_ref) {
3
- var props = _ref.props,
5
+ var _ref$props = _ref.props,
6
+ slots = _ref$props.slots,
7
+ slotProps = _ref$props.slotProps,
8
+ props = _objectWithoutProperties(_ref$props, _excluded),
4
9
  plugins = _ref.plugins,
5
10
  rootRef = _ref.rootRef;
6
11
  var paramsLookup = {};
@@ -9,7 +14,9 @@ export var extractPluginParamsFromProps = function extractPluginParamsFromProps(
9
14
  });
10
15
  var pluginParams = {
11
16
  plugins: plugins,
12
- rootRef: rootRef
17
+ rootRef: rootRef,
18
+ slots: slots != null ? slots : {},
19
+ slotProps: slotProps != null ? slotProps : {}
13
20
  };
14
21
  var otherProps = {};
15
22
  Object.keys(props).forEach(function (propName) {
@@ -22,6 +29,8 @@ export var extractPluginParamsFromProps = function extractPluginParamsFromProps(
22
29
  });
23
30
  return {
24
31
  pluginParams: pluginParams,
32
+ slots: slots,
33
+ slotProps: slotProps,
25
34
  otherProps: otherProps
26
35
  };
27
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 = ["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';
@@ -81,19 +79,16 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
81
79
  childrenWarning();
82
80
  }
83
81
  }
84
- const _extractPluginParamsF = extractPluginParamsFromProps({
85
- props,
86
- plugins: DEFAULT_TREE_VIEW_PLUGINS,
87
- rootRef: ref
88
- }),
89
- {
90
- pluginParams,
91
- otherProps: {
92
- slots,
93
- slotProps
94
- }
95
- } = _extractPluginParamsF,
96
- otherProps = _objectWithoutPropertiesLoose(_extractPluginParamsF.otherProps, _excluded);
82
+ const {
83
+ pluginParams,
84
+ slots,
85
+ slotProps,
86
+ otherProps
87
+ } = extractPluginParamsFromProps({
88
+ props,
89
+ plugins: DEFAULT_TREE_VIEW_PLUGINS,
90
+ rootRef: ref
91
+ });
97
92
  const {
98
93
  getRootProps,
99
94
  contextValue,
@@ -141,34 +136,13 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
141
136
  * Override or extend the styles applied to the component.
142
137
  */
143
138
  classes: PropTypes.object,
144
- /**
145
- * className applied to the root element.
146
- */
147
139
  className: PropTypes.string,
148
- /**
149
- * The default icon used to collapse the node.
150
- */
151
- defaultCollapseIcon: PropTypes.node,
152
- /**
153
- * The default icon displayed next to a end node. This is applied to all
154
- * tree nodes and can be overridden by the TreeItem `icon` prop.
155
- */
156
- defaultEndIcon: PropTypes.node,
157
140
  /**
158
141
  * Expanded node ids.
159
142
  * Used when the item's expansion is not controlled.
160
143
  * @default []
161
144
  */
162
145
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
163
- /**
164
- * The default icon used to expand the node.
165
- */
166
- defaultExpandIcon: PropTypes.node,
167
- /**
168
- * The default icon displayed next to a parent node. This is applied to all
169
- * parent nodes and can be overridden by the TreeItem `icon` prop.
170
- */
171
- defaultParentIcon: PropTypes.node,
172
146
  /**
173
147
  * Selected node ids. (Uncontrolled)
174
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 = ["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';
@@ -56,20 +54,18 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
56
54
  itemsPropWarning();
57
55
  }
58
56
  }
59
- const _extractPluginParamsF = extractPluginParamsFromProps({
60
- props: _extends({}, props, {
61
- items: EMPTY_ITEMS
62
- }),
63
- plugins: SIMPLE_TREE_VIEW_PLUGINS,
64
- rootRef: ref
57
+ const {
58
+ pluginParams,
59
+ slots,
60
+ slotProps,
61
+ otherProps
62
+ } = extractPluginParamsFromProps({
63
+ props: _extends({}, props, {
64
+ items: EMPTY_ITEMS
65
65
  }),
66
- {
67
- pluginParams,
68
- otherProps: {
69
- slots
70
- }
71
- } = _extractPluginParamsF,
72
- otherProps = _objectWithoutPropertiesLoose(_extractPluginParamsF.otherProps, _excluded);
66
+ plugins: SIMPLE_TREE_VIEW_PLUGINS,
67
+ rootRef: ref
68
+ });
73
69
  const {
74
70
  getRootProps,
75
71
  contextValue
@@ -78,7 +74,7 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
78
74
  const Root = slots?.root ?? SimpleTreeViewRoot;
79
75
  const rootProps = useSlotProps({
80
76
  elementType: Root,
81
- externalSlotProps: {},
77
+ externalSlotProps: slotProps?.root,
82
78
  externalForwardedProps: otherProps,
83
79
  className: classes.root,
84
80
  getSlotProps: getRootProps,
@@ -102,34 +98,13 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
102
98
  * Override or extend the styles applied to the component.
103
99
  */
104
100
  classes: PropTypes.object,
105
- /**
106
- * className applied to the root element.
107
- */
108
101
  className: PropTypes.string,
109
- /**
110
- * The default icon used to collapse the node.
111
- */
112
- defaultCollapseIcon: PropTypes.node,
113
- /**
114
- * The default icon displayed next to a end node. This is applied to all
115
- * tree nodes and can be overridden by the TreeItem `icon` prop.
116
- */
117
- defaultEndIcon: PropTypes.node,
118
102
  /**
119
103
  * Expanded node ids.
120
104
  * Used when the item's expansion is not controlled.
121
105
  * @default []
122
106
  */
123
107
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
124
- /**
125
- * The default icon used to expand the node.
126
- */
127
- defaultExpandIcon: PropTypes.node,
128
- /**
129
- * The default icon displayed next to a parent node. This is applied to all
130
- * parent nodes and can be overridden by the TreeItem `icon` prop.
131
- */
132
- defaultParentIcon: PropTypes.node,
133
108
  /**
134
109
  * Selected node ids. (Uncontrolled)
135
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';
@@ -1,8 +1,10 @@
1
1
  import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
2
- export function useTreeItem(nodeId) {
2
+ export function useTreeItemState(nodeId) {
3
3
  const {
4
4
  instance,
5
- multiSelect
5
+ selection: {
6
+ multiSelect
7
+ }
6
8
  } = useTreeViewContext();
7
9
  const expandable = instance.isNodeExpandable(nodeId);
8
10
  const expanded = instance.isNodeExpanded(nodeId);
@@ -72,34 +72,13 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
72
72
  * Override or extend the styles applied to the component.
73
73
  */
74
74
  classes: PropTypes.object,
75
- /**
76
- * className applied to the root element.
77
- */
78
75
  className: PropTypes.string,
79
- /**
80
- * The default icon used to collapse the node.
81
- */
82
- defaultCollapseIcon: PropTypes.node,
83
- /**
84
- * The default icon displayed next to a end node. This is applied to all
85
- * tree nodes and can be overridden by the TreeItem `icon` prop.
86
- */
87
- defaultEndIcon: PropTypes.node,
88
76
  /**
89
77
  * Expanded node ids.
90
78
  * Used when the item's expansion is not controlled.
91
79
  * @default []
92
80
  */
93
81
  defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
94
- /**
95
- * The default icon used to expand the node.
96
- */
97
- defaultExpandIcon: PropTypes.node,
98
- /**
99
- * The default icon displayed next to a parent node. This is applied to all
100
- * parent nodes and can be overridden by the TreeItem `icon` prop.
101
- */
102
- defaultParentIcon: PropTypes.node,
103
82
  /**
104
83
  * Selected node ids. (Uncontrolled)
105
84
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
@@ -0,0 +1,9 @@
1
+ import { createSvgIcon } from '@mui/material/utils';
2
+ import * as React from 'react';
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export const TreeViewExpandIcon = createSvgIcon( /*#__PURE__*/_jsx("path", {
5
+ d: "M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"
6
+ }), 'TreeViewExpandIcon');
7
+ export const TreeViewCollapseIcon = createSvgIcon( /*#__PURE__*/_jsx("path", {
8
+ d: "M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"
9
+ }), 'TreeViewCollapseIcon');
@@ -0,0 +1 @@
1
+ export * from './icons';
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.0.0-alpha.8
2
+ * @mui/x-tree-view v7.0.0-alpha.9
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -10,4 +10,5 @@ export * from './TreeView';
10
10
  export * from './SimpleTreeView';
11
11
  export * from './RichTreeView';
12
12
  export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
13
- export * from './models';
13
+ export * from './models';
14
+ export * from './icons';
@@ -0,0 +1,4 @@
1
+ export { useTreeView } from './useTreeView';
2
+ export { TreeViewProvider } from './TreeViewProvider';
3
+ export { DEFAULT_TREE_VIEW_PLUGINS } from './plugins/defaultPlugins';
4
+ export { extractPluginParamsFromProps } from './utils/extractPluginParamsFromProps';
@@ -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,10 @@ export const useTreeViewExpansion = ({
7
7
  params,
8
8
  models
9
9
  }) => {
10
+ const setExpandedNodes = (event, value) => {
11
+ params.onExpandedNodesChange?.(event, value);
12
+ models.expandedNodes.setControlledValue(value);
13
+ };
10
14
  const isNodeExpanded = React.useCallback(nodeId => {
11
15
  return Array.isArray(models.expandedNodes.value) ? models.expandedNodes.value.indexOf(nodeId) !== -1 : false;
12
16
  }, [models.expandedNodes.value]);
@@ -25,10 +29,7 @@ export const useTreeViewExpansion = ({
25
29
  if (params.onNodeExpansionToggle) {
26
30
  params.onNodeExpansionToggle(event, nodeId, !isExpandedBefore);
27
31
  }
28
- if (params.onExpandedNodesChange) {
29
- params.onExpandedNodesChange(event, newExpanded);
30
- }
31
- models.expandedNodes.setValue(newExpanded);
32
+ setExpandedNodes(event, newExpanded);
32
33
  });
33
34
  const expandAllSiblings = (event, nodeId) => {
34
35
  const node = instance.getNode(nodeId);
@@ -41,10 +42,7 @@ export const useTreeViewExpansion = ({
41
42
  params.onNodeExpansionToggle(event, newlyExpandedNodeId, true);
42
43
  });
43
44
  }
44
- if (params.onExpandedNodesChange) {
45
- params.onExpandedNodesChange(event, newExpanded);
46
- }
47
- models.expandedNodes.setValue(newExpanded);
45
+ setExpandedNodes(event, newExpanded);
48
46
  }
49
47
  };
50
48
  populateInstance(instance, {
@@ -56,8 +54,7 @@ export const useTreeViewExpansion = ({
56
54
  };
57
55
  useTreeViewExpansion.models = {
58
56
  expandedNodes: {
59
- controlledProp: 'expandedNodes',
60
- defaultProp: 'defaultExpandedNodes'
57
+ getDefaultValue: params => params.defaultExpandedNodes
61
58
  }
62
59
  };
63
60
  const DEFAULT_EXPANDED_NODES = [];
@@ -85,9 +85,6 @@ export const useTreeViewFocus = ({
85
85
  useTreeViewFocus.getInitialState = () => ({
86
86
  focusedNodeId: null
87
87
  });
88
- useTreeViewFocus.getDefaultizedParams = params => _extends({}, params, {
89
- disabledItemsFocusable: params.disabledItemsFocusable ?? false
90
- });
91
88
  useTreeViewFocus.params = {
92
89
  onNodeFocus: true
93
90
  };
@@ -0,0 +1 @@
1
+ export { useTreeViewIcons } from './useTreeViewIcons';
@@ -0,0 +1,22 @@
1
+ export const useTreeViewIcons = ({
2
+ slots,
3
+ slotProps
4
+ }) => {
5
+ return {
6
+ contextValue: {
7
+ icons: {
8
+ slots: {
9
+ collapseIcon: slots.collapseIcon,
10
+ expandIcon: slots.expandIcon,
11
+ endIcon: slots.endIcon
12
+ },
13
+ slotProps: {
14
+ collapseIcon: slotProps.collapseIcon,
15
+ expandIcon: slotProps.expandIcon,
16
+ endIcon: slotProps.endIcon
17
+ }
18
+ }
19
+ }
20
+ };
21
+ };
22
+ useTreeViewIcons.params = {};