@mui/x-tree-view 7.7.0 → 7.8.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 (92) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/RichTreeView/RichTreeView.js +5 -0
  3. package/RichTreeView/RichTreeView.plugins.d.ts +3 -3
  4. package/RichTreeView/RichTreeView.plugins.js +1 -2
  5. package/SimpleTreeView/SimpleTreeView.js +5 -0
  6. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +3 -3
  7. package/SimpleTreeView/SimpleTreeView.plugins.js +1 -2
  8. package/TreeItem/TreeItem.js +19 -4
  9. package/TreeItem/TreeItem.types.d.ts +8 -3
  10. package/TreeItem/TreeItemContent.js +5 -2
  11. package/TreeItem/useTreeItemState.d.ts +1 -0
  12. package/TreeItem/useTreeItemState.js +5 -1
  13. package/TreeItem2/TreeItem2.d.ts +3 -3
  14. package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -1
  15. package/TreeView/TreeView.js +5 -0
  16. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +4 -0
  17. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +9 -0
  18. package/hooks/useTreeViewApiRef.d.ts +1 -1
  19. package/index.js +1 -1
  20. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +3 -1
  21. package/internals/TreeViewProvider/TreeViewContext.d.ts +2 -8
  22. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  23. package/internals/TreeViewProvider/useTreeViewContext.d.ts +1 -1
  24. package/internals/corePlugins/corePlugins.d.ts +4 -1
  25. package/internals/corePlugins/corePlugins.js +2 -1
  26. package/internals/corePlugins/index.d.ts +1 -1
  27. package/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.types.d.ts +0 -4
  28. package/internals/hooks/useInstanceEventHandler.d.ts +2 -2
  29. package/internals/index.d.ts +1 -2
  30. package/internals/index.js +3 -1
  31. package/internals/models/plugin.d.ts +27 -17
  32. package/internals/models/treeView.d.ts +3 -5
  33. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  34. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -1
  35. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -3
  36. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  37. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +1 -1
  38. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +1 -1
  39. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +1 -1
  40. package/internals/useTreeView/useTreeViewModels.d.ts +1 -1
  41. package/internals/utils/cleanupTracking/TimerBasedCleanupTracking.d.ts +0 -1
  42. package/internals/utils/publishTreeViewEvent.d.ts +1 -1
  43. package/internals/utils/utils.d.ts +1 -0
  44. package/internals/utils/utils.js +7 -1
  45. package/internals/utils/warning.d.ts +1 -1
  46. package/modern/RichTreeView/RichTreeView.js +5 -0
  47. package/modern/RichTreeView/RichTreeView.plugins.js +1 -2
  48. package/modern/SimpleTreeView/SimpleTreeView.js +5 -0
  49. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +1 -2
  50. package/modern/TreeItem/TreeItem.js +19 -4
  51. package/modern/TreeItem/TreeItemContent.js +5 -2
  52. package/modern/TreeItem/useTreeItemState.js +5 -1
  53. package/modern/TreeView/TreeView.js +5 -0
  54. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +9 -0
  55. package/modern/index.js +1 -1
  56. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +3 -1
  57. package/modern/internals/corePlugins/corePlugins.js +2 -1
  58. package/modern/internals/index.js +3 -1
  59. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  60. package/modern/internals/utils/utils.js +7 -1
  61. package/modern/useTreeItem2/useTreeItem2.js +18 -2
  62. package/node/RichTreeView/RichTreeView.js +5 -0
  63. package/node/RichTreeView/RichTreeView.plugins.js +1 -2
  64. package/node/SimpleTreeView/SimpleTreeView.js +5 -0
  65. package/node/SimpleTreeView/SimpleTreeView.plugins.js +1 -2
  66. package/node/TreeItem/TreeItem.js +19 -4
  67. package/node/TreeItem/TreeItemContent.js +5 -2
  68. package/node/TreeItem/useTreeItemState.js +5 -1
  69. package/node/TreeView/TreeView.js +5 -0
  70. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +9 -0
  71. package/node/index.js +1 -1
  72. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +3 -1
  73. package/node/internals/corePlugins/corePlugins.js +2 -1
  74. package/node/internals/index.js +0 -7
  75. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  76. package/node/internals/utils/utils.js +8 -1
  77. package/node/useTreeItem2/useTreeItem2.js +18 -2
  78. package/package.json +3 -3
  79. package/useTreeItem2/useTreeItem2.d.ts +2 -2
  80. package/useTreeItem2/useTreeItem2.js +18 -2
  81. package/useTreeItem2/useTreeItem2.types.d.ts +13 -5
  82. /package/internals/{plugins → corePlugins}/useTreeViewId/index.d.ts +0 -0
  83. /package/internals/{plugins → corePlugins}/useTreeViewId/index.js +0 -0
  84. /package/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.d.ts +0 -0
  85. /package/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.js +0 -0
  86. /package/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.types.js +0 -0
  87. /package/modern/internals/{plugins → corePlugins}/useTreeViewId/index.js +0 -0
  88. /package/modern/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.js +0 -0
  89. /package/modern/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.types.js +0 -0
  90. /package/node/internals/{plugins → corePlugins}/useTreeViewId/index.js +0 -0
  91. /package/node/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.js +0 -0
  92. /package/node/internals/{plugins → corePlugins}/useTreeViewId/useTreeViewId.types.js +0 -0
@@ -13,6 +13,9 @@ export const useTreeItem2 = parameters => {
13
13
  disableSelection,
14
14
  checkboxSelection
15
15
  },
16
+ expansion: {
17
+ expansionTrigger
18
+ },
16
19
  disabledItemsFocusable,
17
20
  indentationAtItemLevel,
18
21
  instance,
@@ -69,7 +72,9 @@ export const useTreeItem2 = parameters => {
69
72
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
70
73
  return;
71
74
  }
72
- interactions.handleExpansion(event);
75
+ if (expansionTrigger === 'content') {
76
+ interactions.handleExpansion(event);
77
+ }
73
78
  if (!checkboxSelection) {
74
79
  interactions.handleSelection(event);
75
80
  }
@@ -95,6 +100,15 @@ export const useTreeItem2 = parameters => {
95
100
  }
96
101
  interactions.handleCheckboxSelection(event);
97
102
  };
103
+ const createIconContainerHandleClick = otherHandlers => event => {
104
+ otherHandlers.onClick?.(event);
105
+ if (event.defaultMuiPrevented) {
106
+ return;
107
+ }
108
+ if (expansionTrigger === 'iconContainer') {
109
+ interactions.handleExpansion(event);
110
+ }
111
+ };
98
112
  const getRootProps = (externalProps = {}) => {
99
113
  const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
100
114
  let ariaSelected;
@@ -162,7 +176,9 @@ export const useTreeItem2 = parameters => {
162
176
  };
163
177
  const getIconContainerProps = (externalProps = {}) => {
164
178
  const externalEventHandlers = extractEventHandlers(externalProps);
165
- return _extends({}, externalEventHandlers, externalProps);
179
+ return _extends({}, externalEventHandlers, externalProps, {
180
+ onClick: createIconContainerHandleClick(externalEventHandlers)
181
+ });
166
182
  };
167
183
  const getGroupTransitionProps = (externalProps = {}) => {
168
184
  const externalEventHandlers = extractEventHandlers(externalProps);
@@ -186,6 +186,11 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
186
186
  * Used when the item's expansion is controlled.
187
187
  */
188
188
  expandedItems: _propTypes.default.arrayOf(_propTypes.default.string),
189
+ /**
190
+ * The slot that triggers the item's expansion when clicked.
191
+ * @default 'content'
192
+ */
193
+ expansionTrigger: _propTypes.default.oneOf(['content', 'iconContainer']),
189
194
  /**
190
195
  * Unstable features, breaking changes might be introduced.
191
196
  * For each feature, if the flag is not explicitly set to `true`,
@@ -4,13 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.RICH_TREE_VIEW_PLUGINS = void 0;
7
- var _useTreeViewId = require("../internals/plugins/useTreeViewId");
8
7
  var _useTreeViewItems = require("../internals/plugins/useTreeViewItems");
9
8
  var _useTreeViewExpansion = require("../internals/plugins/useTreeViewExpansion");
10
9
  var _useTreeViewSelection = require("../internals/plugins/useTreeViewSelection");
11
10
  var _useTreeViewFocus = require("../internals/plugins/useTreeViewFocus");
12
11
  var _useTreeViewKeyboardNavigation = require("../internals/plugins/useTreeViewKeyboardNavigation");
13
12
  var _useTreeViewIcons = require("../internals/plugins/useTreeViewIcons");
14
- const RICH_TREE_VIEW_PLUGINS = exports.RICH_TREE_VIEW_PLUGINS = [_useTreeViewId.useTreeViewId, _useTreeViewItems.useTreeViewItems, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewIcons.useTreeViewIcons];
13
+ const RICH_TREE_VIEW_PLUGINS = exports.RICH_TREE_VIEW_PLUGINS = [_useTreeViewItems.useTreeViewItems, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewIcons.useTreeViewIcons];
15
14
 
16
15
  // We can't infer this type from the plugin, otherwise we would lose the generics.
@@ -148,6 +148,11 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
148
148
  * Used when the item's expansion is controlled.
149
149
  */
150
150
  expandedItems: _propTypes.default.arrayOf(_propTypes.default.string),
151
+ /**
152
+ * The slot that triggers the item's expansion when clicked.
153
+ * @default 'content'
154
+ */
155
+ expansionTrigger: _propTypes.default.oneOf(['content', 'iconContainer']),
151
156
  /**
152
157
  * Unstable features, breaking changes might be introduced.
153
158
  * For each feature, if the flag is not explicitly set to `true`,
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.SIMPLE_TREE_VIEW_PLUGINS = void 0;
7
- var _useTreeViewId = require("../internals/plugins/useTreeViewId");
8
7
  var _useTreeViewItems = require("../internals/plugins/useTreeViewItems");
9
8
  var _useTreeViewExpansion = require("../internals/plugins/useTreeViewExpansion");
10
9
  var _useTreeViewSelection = require("../internals/plugins/useTreeViewSelection");
@@ -12,6 +11,6 @@ var _useTreeViewFocus = require("../internals/plugins/useTreeViewFocus");
12
11
  var _useTreeViewKeyboardNavigation = require("../internals/plugins/useTreeViewKeyboardNavigation");
13
12
  var _useTreeViewIcons = require("../internals/plugins/useTreeViewIcons");
14
13
  var _useTreeViewJSXItems = require("../internals/plugins/useTreeViewJSXItems");
15
- const SIMPLE_TREE_VIEW_PLUGINS = exports.SIMPLE_TREE_VIEW_PLUGINS = [_useTreeViewId.useTreeViewId, _useTreeViewItems.useTreeViewItems, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewIcons.useTreeViewIcons, _useTreeViewJSXItems.useTreeViewJSXItems];
14
+ const SIMPLE_TREE_VIEW_PLUGINS = exports.SIMPLE_TREE_VIEW_PLUGINS = [_useTreeViewItems.useTreeViewItems, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewIcons.useTreeViewIcons, _useTreeViewJSXItems.useTreeViewJSXItems];
16
15
 
17
16
  // We can't infer this type from the plugin, otherwise we would lose the generics.
@@ -25,6 +25,7 @@ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewCont
25
25
  var _icons = require("../icons");
26
26
  var _TreeItem2Provider = require("../TreeItem2Provider");
27
27
  var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
28
+ var _useTreeItemState = require("./useTreeItemState");
28
29
  var _jsxRuntime = require("react/jsx-runtime");
29
30
  const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
30
31
  _excluded2 = ["ownerState"],
@@ -177,6 +178,9 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
177
178
  selection: {
178
179
  multiSelect
179
180
  },
181
+ expansion: {
182
+ expansionTrigger
183
+ },
180
184
  disabledItemsFocusable,
181
185
  indentationAtItemLevel,
182
186
  instance
@@ -202,6 +206,13 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
202
206
  onKeyDown
203
207
  } = props,
204
208
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
209
+ const {
210
+ expanded,
211
+ focused,
212
+ selected,
213
+ disabled,
214
+ handleExpansion
215
+ } = (0, _useTreeItemState.useTreeItemState)(itemId);
205
216
  const {
206
217
  contentRef,
207
218
  rootRef
@@ -222,10 +233,6 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
222
233
  return Boolean(reactChildren);
223
234
  };
224
235
  const expandable = isExpandable(children);
225
- const expanded = instance.isItemExpanded(itemId);
226
- const focused = instance.isItemFocused(itemId);
227
- const selected = instance.isItemSelected(itemId);
228
- const disabled = instance.isItemDisabled(itemId);
229
236
  const ownerState = (0, _extends2.default)({}, props, {
230
237
  expanded,
231
238
  focused,
@@ -249,6 +256,11 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
249
256
  } : {}),
250
257
  className: classes.groupTransition
251
258
  });
259
+ const handleIconContainerClick = event => {
260
+ if (expansionTrigger === 'iconContainer') {
261
+ handleExpansion(event);
262
+ }
263
+ };
252
264
  const ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
253
265
  const _useSlotProps = (0, _utils.useSlotProps)({
254
266
  elementType: ExpansionIcon,
@@ -258,6 +270,9 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
258
270
  return (0, _extends2.default)({}, (0, _utils.resolveComponentProps)(contextIcons.slotProps.collapseIcon, tempOwnerState), (0, _utils.resolveComponentProps)(inSlotProps?.collapseIcon, tempOwnerState));
259
271
  }
260
272
  return (0, _extends2.default)({}, (0, _utils.resolveComponentProps)(contextIcons.slotProps.expandIcon, tempOwnerState), (0, _utils.resolveComponentProps)(inSlotProps?.expandIcon, tempOwnerState));
273
+ },
274
+ additionalProps: {
275
+ onClick: handleIconContainerClick
261
276
  }
262
277
  }),
263
278
  expansionIconProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded2);
@@ -42,7 +42,8 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
42
42
  handleExpansion,
43
43
  handleSelection,
44
44
  handleCheckboxSelection,
45
- preventSelection
45
+ preventSelection,
46
+ expansionTrigger
46
47
  } = (0, _useTreeItemState.useTreeItemState)(itemId);
47
48
  const icon = iconProp || expansionIcon || displayIcon;
48
49
  const checkboxRef = React.useRef(null);
@@ -56,7 +57,9 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
56
57
  if (checkboxRef.current?.contains(event.target)) {
57
58
  return;
58
59
  }
59
- handleExpansion(event);
60
+ if (expansionTrigger === 'content') {
61
+ handleExpansion(event);
62
+ }
60
63
  if (!checkboxSelection) {
61
64
  handleSelection(event);
62
65
  }
@@ -12,6 +12,9 @@ function useTreeItemState(itemId) {
12
12
  multiSelect,
13
13
  checkboxSelection,
14
14
  disableSelection
15
+ },
16
+ expansion: {
17
+ expansionTrigger
15
18
  }
16
19
  } = (0, _useTreeViewContext.useTreeViewContext)();
17
20
  const expandable = instance.isItemExpandable(itemId);
@@ -76,6 +79,7 @@ function useTreeItemState(itemId) {
76
79
  handleExpansion,
77
80
  handleSelection,
78
81
  handleCheckboxSelection,
79
- preventSelection
82
+ preventSelection,
83
+ expansionTrigger
80
84
  };
81
85
  }
@@ -125,6 +125,11 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
125
125
  * Used when the item's expansion is controlled.
126
126
  */
127
127
  expandedItems: _propTypes.default.arrayOf(_propTypes.default.string),
128
+ /**
129
+ * The slot that triggers the item's expansion when clicked.
130
+ * @default 'content'
131
+ */
132
+ expansionTrigger: _propTypes.default.oneOf(['content', 'iconContainer']),
128
133
  /**
129
134
  * Unstable features, breaking changes might be introduced.
130
135
  * For each feature, if the flag is not explicitly set to `true`,
@@ -11,6 +11,15 @@ const isItemExpandable = reactChildren => {
11
11
  }
12
12
  return Boolean(reactChildren);
13
13
  };
14
+
15
+ /**
16
+ * Plugins that need to be present in the Tree View in order for `useTreeItem2Utils` to work correctly.
17
+ */
18
+
19
+ /**
20
+ * Plugins that `useTreeItem2Utils` can use if they are present, but are not required.
21
+ */
22
+
14
23
  const useTreeItem2Utils = ({
15
24
  itemId,
16
25
  children
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.7.0
2
+ * @mui/x-tree-view v7.8.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -9,6 +9,7 @@ exports.TreeViewChildrenItemProvider = TreeViewChildrenItemProvider;
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _useTreeViewContext = require("./useTreeViewContext");
12
+ var _utils = require("../utils/utils");
12
13
  var _jsxRuntime = require("react/jsx-runtime");
13
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -44,7 +45,8 @@ function TreeViewChildrenItemProvider(props) {
44
45
  return;
45
46
  }
46
47
  const previousChildrenIds = instance.getItemOrderedChildrenIds(itemId ?? null) ?? [];
47
- const childrenElements = rootRef.current.querySelectorAll(`${itemId == null ? '' : `*[id="${idAttr}"] `}[role="treeitem"]:not(*[id="${idAttr}"] [role="treeitem"] [role="treeitem"])`);
48
+ const escapedIdAttr = (0, _utils.escapeOperandAttributeSelector)(idAttr);
49
+ const childrenElements = rootRef.current.querySelectorAll(`${itemId == null ? '' : `*[id="${escapedIdAttr}"] `}[role="treeitem"]:not(*[id="${escapedIdAttr}"] [role="treeitem"] [role="treeitem"])`);
48
50
  const childrenIds = Array.from(childrenElements).map(child => childrenIdAttrToIdRef.current.get(child.id));
49
51
  const hasChanged = childrenIds.length !== previousChildrenIds.length || childrenIds.some((childId, index) => childId !== previousChildrenIds[index]);
50
52
  if (hasChanged) {
@@ -5,8 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.TREE_VIEW_CORE_PLUGINS = void 0;
7
7
  var _useTreeViewInstanceEvents = require("./useTreeViewInstanceEvents");
8
+ var _useTreeViewId = require("./useTreeViewId");
8
9
  /**
9
10
  * Internal plugins that create the tools used by the other plugins.
10
11
  * These plugins are used by the tree view components.
11
12
  */
12
- const TREE_VIEW_CORE_PLUGINS = exports.TREE_VIEW_CORE_PLUGINS = [_useTreeViewInstanceEvents.useTreeViewInstanceEvents];
13
+ const TREE_VIEW_CORE_PLUGINS = exports.TREE_VIEW_CORE_PLUGINS = [_useTreeViewInstanceEvents.useTreeViewInstanceEvents, _useTreeViewId.useTreeViewId];
@@ -45,12 +45,6 @@ Object.defineProperty(exports, "useTreeViewIcons", {
45
45
  return _useTreeViewIcons.useTreeViewIcons;
46
46
  }
47
47
  });
48
- Object.defineProperty(exports, "useTreeViewId", {
49
- enumerable: true,
50
- get: function () {
51
- return _useTreeViewId.useTreeViewId;
52
- }
53
- });
54
48
  Object.defineProperty(exports, "useTreeViewItems", {
55
49
  enumerable: true,
56
50
  get: function () {
@@ -82,7 +76,6 @@ var _useTreeViewExpansion = require("./plugins/useTreeViewExpansion");
82
76
  var _useTreeViewSelection = require("./plugins/useTreeViewSelection");
83
77
  var _useTreeViewFocus = require("./plugins/useTreeViewFocus");
84
78
  var _useTreeViewKeyboardNavigation = require("./plugins/useTreeViewKeyboardNavigation");
85
- var _useTreeViewId = require("./plugins/useTreeViewId");
86
79
  var _useTreeViewIcons = require("./plugins/useTreeViewIcons");
87
80
  var _useTreeViewItems = require("./plugins/useTreeViewItems");
88
81
  var _useTreeViewJSXItems = require("./plugins/useTreeViewJSXItems");
@@ -62,6 +62,12 @@ const useTreeViewExpansion = ({
62
62
  setExpandedItems(event, newExpanded);
63
63
  }
64
64
  };
65
+ const expansionTrigger = React.useMemo(() => {
66
+ if (params.expansionTrigger) {
67
+ return params.expansionTrigger;
68
+ }
69
+ return 'content';
70
+ }, [params.expansionTrigger]);
65
71
  return {
66
72
  publicAPI: {
67
73
  setItemExpansion
@@ -72,6 +78,11 @@ const useTreeViewExpansion = ({
72
78
  setItemExpansion,
73
79
  toggleItemExpansion,
74
80
  expandAllSiblings
81
+ },
82
+ contextValue: {
83
+ expansion: {
84
+ expansionTrigger
85
+ }
75
86
  }
76
87
  };
77
88
  };
@@ -89,5 +100,6 @@ useTreeViewExpansion.params = {
89
100
  expandedItems: true,
90
101
  defaultExpandedItems: true,
91
102
  onExpandedItemsChange: true,
92
- onItemExpansionToggle: true
103
+ onItemExpansionToggle: true,
104
+ expansionTrigger: true
93
105
  };
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.escapeOperandAttributeSelector = escapeOperandAttributeSelector;
6
7
  exports.getActiveElement = void 0;
7
8
  // https://www.abeautifulsite.net/posts/finding-the-active-element-in-a-shadow-root/
8
9
  const getActiveElement = (root = document) => {
@@ -15,4 +16,10 @@ const getActiveElement = (root = document) => {
15
16
  }
16
17
  return activeEl;
17
18
  };
18
- exports.getActiveElement = getActiveElement;
19
+
20
+ // TODO, eventually replaces this function with CSS.escape, once available in jsdom, either added manually or built in
21
+ // https://github.com/jsdom/jsdom/issues/1550#issuecomment-236734471
22
+ exports.getActiveElement = getActiveElement;
23
+ function escapeOperandAttributeSelector(operand) {
24
+ return operand.replace(/["\\]/g, '\\$&');
25
+ }
@@ -22,6 +22,9 @@ const useTreeItem2 = parameters => {
22
22
  disableSelection,
23
23
  checkboxSelection
24
24
  },
25
+ expansion: {
26
+ expansionTrigger
27
+ },
25
28
  disabledItemsFocusable,
26
29
  indentationAtItemLevel,
27
30
  instance,
@@ -78,7 +81,9 @@ const useTreeItem2 = parameters => {
78
81
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
79
82
  return;
80
83
  }
81
- interactions.handleExpansion(event);
84
+ if (expansionTrigger === 'content') {
85
+ interactions.handleExpansion(event);
86
+ }
82
87
  if (!checkboxSelection) {
83
88
  interactions.handleSelection(event);
84
89
  }
@@ -104,6 +109,15 @@ const useTreeItem2 = parameters => {
104
109
  }
105
110
  interactions.handleCheckboxSelection(event);
106
111
  };
112
+ const createIconContainerHandleClick = otherHandlers => event => {
113
+ otherHandlers.onClick?.(event);
114
+ if (event.defaultMuiPrevented) {
115
+ return;
116
+ }
117
+ if (expansionTrigger === 'iconContainer') {
118
+ interactions.handleExpansion(event);
119
+ }
120
+ };
107
121
  const getRootProps = (externalProps = {}) => {
108
122
  const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
109
123
  let ariaSelected;
@@ -171,7 +185,9 @@ const useTreeItem2 = parameters => {
171
185
  };
172
186
  const getIconContainerProps = (externalProps = {}) => {
173
187
  const externalEventHandlers = (0, _utils.extractEventHandlers)(externalProps);
174
- return (0, _extends2.default)({}, externalEventHandlers, externalProps);
188
+ return (0, _extends2.default)({}, externalEventHandlers, externalProps, {
189
+ onClick: createIconContainerHandleClick(externalEventHandlers)
190
+ });
175
191
  };
176
192
  const getGroupTransitionProps = (externalProps = {}) => {
177
193
  const externalEventHandlers = (0, _utils.extractEventHandlers)(externalProps);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.7.0",
3
+ "version": "7.8.0",
4
4
  "description": "The community edition of the Tree View components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -35,8 +35,8 @@
35
35
  "dependencies": {
36
36
  "@babel/runtime": "^7.24.7",
37
37
  "@mui/base": "^5.0.0-beta.40",
38
- "@mui/system": "^5.15.15",
39
- "@mui/utils": "^5.15.14",
38
+ "@mui/system": "^5.15.20",
39
+ "@mui/utils": "^5.15.20",
40
40
  "@types/react-transition-group": "^4.4.10",
41
41
  "clsx": "^2.1.1",
42
42
  "prop-types": "^15.8.1",
@@ -1,2 +1,2 @@
1
- import { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2MinimalPlugins } from './useTreeItem2.types';
2
- export declare const useTreeItem2: <TSignatures extends UseTreeItem2MinimalPlugins = UseTreeItem2MinimalPlugins>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TSignatures>;
1
+ import { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2MinimalPlugins, UseTreeItem2OptionalPlugins } from './useTreeItem2.types';
2
+ export declare const useTreeItem2: <TSignatures extends UseTreeItem2MinimalPlugins = UseTreeItem2MinimalPlugins, TOptionalSignatures extends UseTreeItem2OptionalPlugins = readonly []>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TSignatures, TOptionalSignatures>;
@@ -13,6 +13,9 @@ export const useTreeItem2 = parameters => {
13
13
  disableSelection,
14
14
  checkboxSelection
15
15
  },
16
+ expansion: {
17
+ expansionTrigger
18
+ },
16
19
  disabledItemsFocusable,
17
20
  indentationAtItemLevel,
18
21
  instance,
@@ -69,7 +72,9 @@ export const useTreeItem2 = parameters => {
69
72
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
70
73
  return;
71
74
  }
72
- interactions.handleExpansion(event);
75
+ if (expansionTrigger === 'content') {
76
+ interactions.handleExpansion(event);
77
+ }
73
78
  if (!checkboxSelection) {
74
79
  interactions.handleSelection(event);
75
80
  }
@@ -95,6 +100,15 @@ export const useTreeItem2 = parameters => {
95
100
  }
96
101
  interactions.handleCheckboxSelection(event);
97
102
  };
103
+ const createIconContainerHandleClick = otherHandlers => event => {
104
+ otherHandlers.onClick?.(event);
105
+ if (event.defaultMuiPrevented) {
106
+ return;
107
+ }
108
+ if (expansionTrigger === 'iconContainer') {
109
+ interactions.handleExpansion(event);
110
+ }
111
+ };
98
112
  const getRootProps = (externalProps = {}) => {
99
113
  const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
100
114
  let ariaSelected;
@@ -162,7 +176,9 @@ export const useTreeItem2 = parameters => {
162
176
  };
163
177
  const getIconContainerProps = (externalProps = {}) => {
164
178
  const externalEventHandlers = extractEventHandlers(externalProps);
165
- return _extends({}, externalEventHandlers, externalProps);
179
+ return _extends({}, externalEventHandlers, externalProps, {
180
+ onClick: createIconContainerHandleClick(externalEventHandlers)
181
+ });
166
182
  };
167
183
  const getGroupTransitionProps = (externalProps = {}) => {
168
184
  const externalEventHandlers = extractEventHandlers(externalProps);
@@ -1,12 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { TreeViewItemId } from '../models';
3
3
  import { MuiCancellableEventHandler } from '../internals/models/MuiCancellableEvent';
4
- import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '../internals/models';
4
+ import { TreeViewPublicAPI } from '../internals/models';
5
5
  import { UseTreeViewSelectionSignature } from '../internals/plugins/useTreeViewSelection';
6
6
  import { UseTreeViewItemsSignature } from '../internals/plugins/useTreeViewItems';
7
- import { UseTreeViewIdSignature } from '../internals/plugins/useTreeViewId';
8
7
  import { UseTreeViewFocusSignature } from '../internals/plugins/useTreeViewFocus';
9
8
  import { UseTreeViewKeyboardNavigationSignature } from '../internals/plugins/useTreeViewKeyboardNavigation';
9
+ import { UseTreeViewExpansionSignature } from '../internals/plugins/useTreeViewExpansion';
10
10
  export interface UseTreeItem2Parameters {
11
11
  /**
12
12
  * The id attribute of the item. If not provided, it will be generated.
@@ -61,6 +61,7 @@ export interface UseTreeItem2ContentSlotOwnProps {
61
61
  }
62
62
  export type UseTreeItem2ContentSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2ContentSlotOwnProps;
63
63
  export interface UseTreeItem2IconContainerSlotOwnProps {
64
+ onClick: MuiCancellableEventHandler<React.MouseEvent>;
64
65
  }
65
66
  export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2IconContainerSlotOwnProps;
66
67
  export interface UseTreeItem2LabelSlotOwnProps {
@@ -95,7 +96,7 @@ export interface UseTreeItem2Status {
95
96
  selected: boolean;
96
97
  disabled: boolean;
97
98
  }
98
- export interface UseTreeItem2ReturnValue<TSignatures extends readonly TreeViewAnyPluginSignature[]> {
99
+ export interface UseTreeItem2ReturnValue<TSignatures extends UseTreeItem2MinimalPlugins, TOptionalSignatures extends UseTreeItem2OptionalPlugins> {
99
100
  /**
100
101
  * Resolver for the root slot's props.
101
102
  * @param {ExternalProps} externalProps Additional props for the root slot
@@ -143,12 +144,19 @@ export interface UseTreeItem2ReturnValue<TSignatures extends readonly TreeViewAn
143
144
  /**
144
145
  * The object the allows Tree View manipulation.
145
146
  */
146
- publicAPI: TreeViewPublicAPI<TSignatures>;
147
+ publicAPI: TreeViewPublicAPI<TSignatures, TOptionalSignatures>;
147
148
  }
149
+ /**
150
+ * Plugins that need to be present in the Tree View in order for `useTreeItem2` to work correctly.
151
+ */
148
152
  export type UseTreeItem2MinimalPlugins = readonly [
149
153
  UseTreeViewSelectionSignature,
154
+ UseTreeViewExpansionSignature,
150
155
  UseTreeViewItemsSignature,
151
- UseTreeViewIdSignature,
152
156
  UseTreeViewFocusSignature,
153
157
  UseTreeViewKeyboardNavigationSignature
154
158
  ];
159
+ /**
160
+ * Plugins that `useTreeItem2` can use if they are present, but are not required.
161
+ */
162
+ export type UseTreeItem2OptionalPlugins = readonly [];