@mui/x-tree-view 7.4.0 → 7.5.1

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 (65) hide show
  1. package/CHANGELOG.md +132 -5395
  2. package/RichTreeView/RichTreeView.js +7 -2
  3. package/SimpleTreeView/SimpleTreeView.js +7 -2
  4. package/TreeItem/TreeItem.js +8 -3
  5. package/TreeItem/TreeItemContent.d.ts +2 -0
  6. package/TreeItem/TreeItemContent.js +19 -2
  7. package/TreeItem/treeItemClasses.d.ts +2 -0
  8. package/TreeItem/treeItemClasses.js +1 -1
  9. package/TreeItem/useTreeItemState.d.ts +4 -1
  10. package/TreeItem/useTreeItemState.js +18 -2
  11. package/TreeItem2/TreeItem2.d.ts +4 -0
  12. package/TreeItem2/TreeItem2.js +34 -4
  13. package/TreeItem2/TreeItem2.types.d.ts +6 -0
  14. package/TreeItem2/index.d.ts +1 -1
  15. package/TreeItem2/index.js +1 -1
  16. package/TreeItem2Icon/TreeItem2Icon.js +1 -1
  17. package/TreeItem2Provider/TreeItem2Provider.js +1 -1
  18. package/TreeView/TreeView.js +7 -2
  19. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +1 -0
  20. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +18 -3
  21. package/index.js +1 -1
  22. package/internals/models/plugin.d.ts +0 -6
  23. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +1 -0
  24. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  25. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -6
  26. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +16 -4
  27. package/internals/useTreeView/useTreeViewModels.d.ts +1 -1
  28. package/internals/useTreeView/useTreeViewModels.js +1 -1
  29. package/modern/RichTreeView/RichTreeView.js +7 -2
  30. package/modern/SimpleTreeView/SimpleTreeView.js +7 -2
  31. package/modern/TreeItem/TreeItem.js +8 -3
  32. package/modern/TreeItem/TreeItemContent.js +19 -2
  33. package/modern/TreeItem/treeItemClasses.js +1 -1
  34. package/modern/TreeItem/useTreeItemState.js +18 -2
  35. package/modern/TreeItem2/TreeItem2.js +34 -4
  36. package/modern/TreeItem2/index.js +1 -1
  37. package/modern/TreeItem2Icon/TreeItem2Icon.js +1 -1
  38. package/modern/TreeItem2Provider/TreeItem2Provider.js +1 -1
  39. package/modern/TreeView/TreeView.js +7 -2
  40. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +18 -3
  41. package/modern/index.js +1 -1
  42. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  43. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -6
  44. package/modern/internals/useTreeView/useTreeViewModels.js +1 -1
  45. package/modern/useTreeItem2/useTreeItem2.js +32 -3
  46. package/node/RichTreeView/RichTreeView.js +7 -2
  47. package/node/SimpleTreeView/SimpleTreeView.js +7 -2
  48. package/node/TreeItem/TreeItem.js +8 -3
  49. package/node/TreeItem/TreeItemContent.js +19 -2
  50. package/node/TreeItem/treeItemClasses.js +1 -1
  51. package/node/TreeItem/useTreeItemState.js +18 -2
  52. package/node/TreeItem2/TreeItem2.js +35 -5
  53. package/node/TreeItem2/index.js +6 -0
  54. package/node/TreeItem2Icon/TreeItem2Icon.js +1 -1
  55. package/node/TreeItem2Provider/TreeItem2Provider.js +1 -1
  56. package/node/TreeView/TreeView.js +7 -2
  57. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +18 -3
  58. package/node/index.js +1 -1
  59. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
  60. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -6
  61. package/node/internals/useTreeView/useTreeViewModels.js +1 -1
  62. package/node/useTreeItem2/useTreeItem2.js +34 -3
  63. package/package.json +2 -2
  64. package/useTreeItem2/useTreeItem2.js +32 -3
  65. package/useTreeItem2/useTreeItem2.types.d.ts +15 -0
@@ -140,7 +140,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
140
140
  process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
141
141
  // ----------------------------- Warning --------------------------------
142
142
  // | These PropTypes are generated from the TypeScript type definitions |
143
- // | To update them edit the TypeScript types and run "yarn proptypes" |
143
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
144
144
  // ----------------------------------------------------------------------
145
145
  /**
146
146
  * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
@@ -152,6 +152,11 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
152
152
  setItemExpansion: _propTypes.default.func.isRequired
153
153
  })
154
154
  }),
155
+ /**
156
+ * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
157
+ * @default false
158
+ */
159
+ checkboxSelection: _propTypes.default.bool,
155
160
  /**
156
161
  * Override or extend the styles applied to the component.
157
162
  */
@@ -216,7 +221,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
216
221
  isItemDisabled: _propTypes.default.func,
217
222
  items: _propTypes.default.array.isRequired,
218
223
  /**
219
- * If true `ctrl` and `shift` will trigger multiselect.
224
+ * If `true`, `ctrl` and `shift` will trigger multiselect.
220
225
  * @default false
221
226
  */
222
227
  multiSelect: _propTypes.default.bool,
@@ -98,7 +98,7 @@ const SimpleTreeView = exports.SimpleTreeView = /*#__PURE__*/React.forwardRef(fu
98
98
  process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
99
99
  // ----------------------------- Warning --------------------------------
100
100
  // | These PropTypes are generated from the TypeScript type definitions |
101
- // | To update them edit the TypeScript types and run "yarn proptypes" |
101
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
102
102
  // ----------------------------------------------------------------------
103
103
  /**
104
104
  * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
@@ -110,6 +110,11 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
110
110
  setItemExpansion: _propTypes.default.func.isRequired
111
111
  })
112
112
  }),
113
+ /**
114
+ * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
115
+ * @default false
116
+ */
117
+ checkboxSelection: _propTypes.default.bool,
113
118
  /**
114
119
  * The content of the component.
115
120
  */
@@ -152,7 +157,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
152
157
  */
153
158
  id: _propTypes.default.string,
154
159
  /**
155
- * If true `ctrl` and `shift` will trigger multiselect.
160
+ * If `true`, `ctrl` and `shift` will trigger multiselect.
156
161
  * @default false
157
162
  */
158
163
  multiSelect: _propTypes.default.bool,
@@ -41,6 +41,7 @@ const useUtilityClasses = ownerState => {
41
41
  focused: ['focused'],
42
42
  disabled: ['disabled'],
43
43
  iconContainer: ['iconContainer'],
44
+ checkbox: ['checkbox'],
44
45
  label: ['label'],
45
46
  groupTransition: ['groupTransition']
46
47
  };
@@ -122,7 +123,10 @@ const StyledTreeItemContent = (0, _styles.styled)(_TreeItemContent.TreeItemConte
122
123
  // fixes overflow - see https://github.com/mui/material-ui/issues/27372
123
124
  minWidth: 0,
124
125
  position: 'relative'
125
- }, theme.typography.body1)
126
+ }, theme.typography.body1),
127
+ [`& .${_treeItemClasses.treeItemClasses.checkbox}`]: {
128
+ padding: 0
129
+ }
126
130
  }));
127
131
  const TreeItemGroup = (0, _styles.styled)(_Collapse.default, {
128
132
  name: 'MuiTreeItem',
@@ -305,7 +309,8 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
305
309
  focused: classes.focused,
306
310
  disabled: classes.disabled,
307
311
  iconContainer: classes.iconContainer,
308
- label: classes.label
312
+ label: classes.label,
313
+ checkbox: classes.checkbox
309
314
  },
310
315
  label: label,
311
316
  itemId: itemId,
@@ -328,7 +333,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
328
333
  process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
329
334
  // ----------------------------- Warning --------------------------------
330
335
  // | These PropTypes are generated from the TypeScript type definitions |
331
- // | To update them edit the TypeScript types and run "yarn proptypes" |
336
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
332
337
  // ----------------------------------------------------------------------
333
338
  /**
334
339
  * The content of the component.
@@ -10,6 +10,7 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
+ var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
13
14
  var _useTreeItemState = require("./useTreeItemState");
14
15
  var _jsxRuntime = require("react/jsx-runtime");
15
16
  const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
@@ -36,11 +37,15 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
36
37
  expanded,
37
38
  selected,
38
39
  focused,
40
+ disableSelection,
41
+ checkboxSelection,
39
42
  handleExpansion,
40
43
  handleSelection,
44
+ handleCheckboxSelection,
41
45
  preventSelection
42
46
  } = (0, _useTreeItemState.useTreeItemState)(itemId);
43
47
  const icon = iconProp || expansionIcon || displayIcon;
48
+ const checkboxRef = React.useRef(null);
44
49
  const handleMouseDown = event => {
45
50
  preventSelection(event);
46
51
  if (onMouseDown) {
@@ -48,8 +53,13 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
48
53
  }
49
54
  };
50
55
  const handleClick = event => {
56
+ if (checkboxRef.current?.contains(event.target)) {
57
+ return;
58
+ }
51
59
  handleExpansion(event);
52
- handleSelection(event);
60
+ if (!checkboxSelection) {
61
+ handleSelection(event);
62
+ }
53
63
  if (onClick) {
54
64
  onClick(event);
55
65
  }
@@ -65,6 +75,13 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
65
75
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
66
76
  className: classes.iconContainer,
67
77
  children: icon
78
+ }), checkboxSelection && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
79
+ className: classes.checkbox,
80
+ checked: selected,
81
+ onChange: handleCheckboxSelection,
82
+ disabled: disabled || disableSelection,
83
+ ref: checkboxRef,
84
+ tabIndex: -1
68
85
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
69
86
  className: classes.label,
70
87
  children: label
@@ -75,7 +92,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
75
92
  process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
76
93
  // ----------------------------- Warning --------------------------------
77
94
  // | These PropTypes are generated from the TypeScript type definitions |
78
- // | To update them edit the TypeScript types and run "yarn proptypes" |
95
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
79
96
  // ----------------------------------------------------------------------
80
97
  /**
81
98
  * Override or extend the styles applied to the component.
@@ -11,4 +11,4 @@ var _generateUtilityClasses = _interopRequireDefault(require("@mui/utils/generat
11
11
  function getTreeItemUtilityClass(slot) {
12
12
  return (0, _generateUtilityClass.default)('MuiTreeItem', slot);
13
13
  }
14
- const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label']);
14
+ const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox']);
@@ -9,7 +9,9 @@ function useTreeItemState(itemId) {
9
9
  const {
10
10
  instance,
11
11
  selection: {
12
- multiSelect
12
+ multiSelect,
13
+ checkboxSelection,
14
+ disableSelection
13
15
  }
14
16
  } = (0, _useTreeViewContext.useTreeViewContext)();
15
17
  const expandable = instance.isItemExpandable(itemId);
@@ -43,10 +45,21 @@ function useTreeItemState(itemId) {
43
45
  instance.selectItem(event, itemId, true);
44
46
  }
45
47
  } else {
46
- instance.selectItem(event, itemId);
48
+ instance.selectItem(event, itemId, false);
47
49
  }
48
50
  }
49
51
  };
52
+ const handleCheckboxSelection = event => {
53
+ if (disableSelection || disabled) {
54
+ return;
55
+ }
56
+ const hasShift = event.nativeEvent.shiftKey;
57
+ if (multiSelect && hasShift) {
58
+ instance.expandSelectionRange(event, itemId);
59
+ } else {
60
+ instance.selectItem(event, itemId, multiSelect, event.target.checked);
61
+ }
62
+ };
50
63
  const preventSelection = event => {
51
64
  if (event.shiftKey || event.ctrlKey || event.metaKey || disabled) {
52
65
  // Prevent text selection
@@ -58,8 +71,11 @@ function useTreeItemState(itemId) {
58
71
  expanded,
59
72
  selected,
60
73
  focused,
74
+ disableSelection,
75
+ checkboxSelection,
61
76
  handleExpansion,
62
77
  handleSelection,
78
+ handleCheckboxSelection,
63
79
  preventSelection
64
80
  };
65
81
  }
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.TreeItem2Root = exports.TreeItem2Label = exports.TreeItem2IconContainer = exports.TreeItem2GroupTransition = exports.TreeItem2Content = exports.TreeItem2 = void 0;
7
+ exports.TreeItem2Root = exports.TreeItem2Label = exports.TreeItem2IconContainer = exports.TreeItem2GroupTransition = exports.TreeItem2Content = exports.TreeItem2Checkbox = exports.TreeItem2 = void 0;
8
8
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
@@ -13,6 +13,7 @@ var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _unsupportedProp = _interopRequireDefault(require("@mui/utils/unsupportedProp"));
14
14
  var _styles = require("@mui/material/styles");
15
15
  var _Collapse = _interopRequireDefault(require("@mui/material/Collapse"));
16
+ var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
16
17
  var _utils = require("@mui/base/utils");
17
18
  var _system = require("@mui/system");
18
19
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
@@ -21,7 +22,8 @@ var _TreeItem = require("../TreeItem");
21
22
  var _TreeItem2Icon = require("../TreeItem2Icon");
22
23
  var _TreeItem2Provider = require("../TreeItem2Provider");
23
24
  var _jsxRuntime = require("react/jsx-runtime");
24
- const _excluded = ["id", "itemId", "label", "disabled", "children", "slots", "slotProps"];
25
+ const _excluded = ["visible"],
26
+ _excluded2 = ["id", "itemId", "label", "disabled", "children", "slots", "slotProps"];
25
27
  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); }
26
28
  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; }
27
29
  const TreeItem2Root = exports.TreeItem2Root = (0, _styles.styled)('li', {
@@ -138,6 +140,24 @@ const TreeItem2GroupTransition = exports.TreeItem2GroupTransition = (0, _styles.
138
140
  padding: 0,
139
141
  paddingLeft: 12
140
142
  });
143
+ const TreeItem2Checkbox = exports.TreeItem2Checkbox = (0, _styles.styled)( /*#__PURE__*/React.forwardRef((props, ref) => {
144
+ const {
145
+ visible
146
+ } = props,
147
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
148
+ if (!visible) {
149
+ return null;
150
+ }
151
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, (0, _extends2.default)({}, other, {
152
+ ref: ref
153
+ }));
154
+ }), {
155
+ name: 'MuiTreeItem2',
156
+ slot: 'Checkbox',
157
+ overridesResolver: (props, styles) => styles.checkbox
158
+ })({
159
+ padding: 0
160
+ });
141
161
  const useUtilityClasses = ownerState => {
142
162
  const {
143
163
  classes
@@ -150,6 +170,7 @@ const useUtilityClasses = ownerState => {
150
170
  focused: ['focused'],
151
171
  disabled: ['disabled'],
152
172
  iconContainer: ['iconContainer'],
173
+ checkbox: ['checkbox'],
153
174
  label: ['label'],
154
175
  groupTransition: ['groupTransition']
155
176
  };
@@ -179,11 +200,12 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
179
200
  slots = {},
180
201
  slotProps = {}
181
202
  } = props,
182
- other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
203
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded2);
183
204
  const {
184
205
  getRootProps,
185
206
  getContentProps,
186
207
  getIconContainerProps,
208
+ getCheckboxProps,
187
209
  getLabelProps,
188
210
  getGroupTransitionProps,
189
211
  status
@@ -232,6 +254,14 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
232
254
  ownerState: {},
233
255
  className: classes.label
234
256
  });
257
+ const Checkbox = slots.checkbox ?? TreeItem2Checkbox;
258
+ const checkboxProps = (0, _utils.useSlotProps)({
259
+ elementType: Checkbox,
260
+ getSlotProps: getCheckboxProps,
261
+ externalSlotProps: slotProps.checkbox,
262
+ ownerState: {},
263
+ className: classes.checkbox
264
+ });
235
265
  const GroupTransition = slots.groupTransition ?? undefined;
236
266
  const groupTransitionProps = (0, _utils.useSlotProps)({
237
267
  elementType: GroupTransition,
@@ -250,7 +280,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
250
280
  slots: slots,
251
281
  slotProps: slotProps
252
282
  })
253
- })), /*#__PURE__*/(0, _jsxRuntime.jsx)(Label, (0, _extends2.default)({}, labelProps))]
283
+ })), /*#__PURE__*/(0, _jsxRuntime.jsx)(Checkbox, (0, _extends2.default)({}, checkboxProps)), /*#__PURE__*/(0, _jsxRuntime.jsx)(Label, (0, _extends2.default)({}, labelProps))]
254
284
  })), children && /*#__PURE__*/(0, _jsxRuntime.jsx)(TreeItem2GroupTransition, (0, _extends2.default)({
255
285
  as: GroupTransition
256
286
  }, groupTransitionProps))]
@@ -260,7 +290,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
260
290
  process.env.NODE_ENV !== "production" ? TreeItem2.propTypes = {
261
291
  // ----------------------------- Warning --------------------------------
262
292
  // | These PropTypes are generated from the TypeScript type definitions |
263
- // | To update them edit the TypeScript types and run "yarn proptypes" |
293
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
264
294
  // ----------------------------------------------------------------------
265
295
  /**
266
296
  * The content of the component.
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "TreeItem2", {
9
9
  return _TreeItem.TreeItem2;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "TreeItem2Checkbox", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _TreeItem.TreeItem2Checkbox;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "TreeItem2Content", {
13
19
  enumerable: true,
14
20
  get: function () {
@@ -53,7 +53,7 @@ function TreeItem2Icon(props) {
53
53
  process.env.NODE_ENV !== "production" ? TreeItem2Icon.propTypes = {
54
54
  // ----------------------------- Warning --------------------------------
55
55
  // | These PropTypes are generated from the TypeScript type definitions |
56
- // | To update them edit the TypeScript types and run "yarn proptypes" |
56
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
57
57
  // ----------------------------------------------------------------------
58
58
  /**
59
59
  * The props used for each component slot.
@@ -23,7 +23,7 @@ function TreeItem2Provider(props) {
23
23
  TreeItem2Provider.propTypes = {
24
24
  // ----------------------------- Warning --------------------------------
25
25
  // | These PropTypes are generated from the TypeScript type definitions |
26
- // | To update them edit the TypeScript types and run "yarn proptypes" |
26
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
27
27
  // ----------------------------------------------------------------------
28
28
  children: _propTypes.default.node,
29
29
  itemId: _propTypes.default.string.isRequired
@@ -71,7 +71,7 @@ const TreeView = exports.TreeView = /*#__PURE__*/React.forwardRef(function TreeV
71
71
  process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
72
72
  // ----------------------------- Warning --------------------------------
73
73
  // | These PropTypes are generated from the TypeScript type definitions |
74
- // | To update them edit the TypeScript types and run "yarn proptypes" |
74
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
75
75
  // ----------------------------------------------------------------------
76
76
  /**
77
77
  * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
@@ -83,6 +83,11 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
83
83
  setItemExpansion: _propTypes.default.func.isRequired
84
84
  })
85
85
  }),
86
+ /**
87
+ * If `true`, the tree view renders a checkbox at the left of its label that allows selecting it.
88
+ * @default false
89
+ */
90
+ checkboxSelection: _propTypes.default.bool,
86
91
  /**
87
92
  * The content of the component.
88
93
  */
@@ -125,7 +130,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
125
130
  */
126
131
  id: _propTypes.default.string,
127
132
  /**
128
- * If true `ctrl` and `shift` will trigger multiselect.
133
+ * If `true`, `ctrl` and `shift` will trigger multiselect.
129
134
  * @default false
130
135
  */
131
136
  multiSelect: _propTypes.default.bool,
@@ -5,6 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useTreeItem2Utils = void 0;
7
7
  var _useTreeViewContext = require("../../internals/TreeViewProvider/useTreeViewContext");
8
+ const isItemExpandable = reactChildren => {
9
+ if (Array.isArray(reactChildren)) {
10
+ return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
11
+ }
12
+ return Boolean(reactChildren);
13
+ };
8
14
  const useTreeItem2Utils = ({
9
15
  itemId,
10
16
  children
@@ -16,7 +22,7 @@ const useTreeItem2Utils = ({
16
22
  }
17
23
  } = (0, _useTreeViewContext.useTreeViewContext)();
18
24
  const status = {
19
- expandable: Boolean(Array.isArray(children) ? children.length : children),
25
+ expandable: isItemExpandable(children),
20
26
  expanded: instance.isItemExpanded(itemId),
21
27
  focused: instance.isItemFocused(itemId),
22
28
  selected: instance.isItemSelected(itemId),
@@ -51,12 +57,21 @@ const useTreeItem2Utils = ({
51
57
  instance.selectItem(event, itemId, true);
52
58
  }
53
59
  } else {
54
- instance.selectItem(event, itemId);
60
+ instance.selectItem(event, itemId, false);
61
+ }
62
+ };
63
+ const handleCheckboxSelection = event => {
64
+ const hasShift = event.nativeEvent.shiftKey;
65
+ if (multiSelect && hasShift) {
66
+ instance.expandSelectionRange(event, itemId);
67
+ } else {
68
+ instance.selectItem(event, itemId, multiSelect, event.target.checked);
55
69
  }
56
70
  };
57
71
  const interactions = {
58
72
  handleExpansion,
59
- handleSelection
73
+ handleSelection,
74
+ handleCheckboxSelection
60
75
  };
61
76
  return {
62
77
  interactions,
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.4.0
2
+ * @mui/x-tree-view v7.5.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -70,7 +70,7 @@ const useTreeViewKeyboardNavigation = ({
70
70
  if (event.defaultMuiPrevented) {
71
71
  return;
72
72
  }
73
- if (event.altKey || event.currentTarget !== event.target) {
73
+ if (event.altKey || event.currentTarget !== event.target.closest('*[role="treeitem"]')) {
74
74
  return;
75
75
  }
76
76
  const ctrlPressed = event.ctrlKey || event.metaKey;
@@ -87,7 +87,7 @@ const useTreeViewKeyboardNavigation = ({
87
87
  } else if (params.multiSelect) {
88
88
  instance.selectItem(event, itemId, true);
89
89
  } else {
90
- instance.selectItem(event, itemId);
90
+ instance.selectItem(event, itemId, false);
91
91
  }
92
92
  break;
93
93
  }
@@ -104,7 +104,7 @@ const useTreeViewKeyboardNavigation = ({
104
104
  event.preventDefault();
105
105
  instance.selectItem(event, itemId, true);
106
106
  } else if (!instance.isItemSelected(itemId)) {
107
- instance.selectItem(event, itemId);
107
+ instance.selectItem(event, itemId, false);
108
108
  event.preventDefault();
109
109
  }
110
110
  }
@@ -55,20 +55,28 @@ const useTreeViewSelection = ({
55
55
  models.selectedItems.setControlledValue(newSelectedItems);
56
56
  };
57
57
  const isItemSelected = itemId => selectedItemsMap.has(itemId);
58
- const selectItem = (event, itemId, multiple = false) => {
58
+ const selectItem = (event, itemId, keepExistingSelection, newValue) => {
59
59
  if (params.disableSelection) {
60
60
  return;
61
61
  }
62
62
  let newSelected;
63
- if (multiple) {
63
+ if (keepExistingSelection) {
64
64
  const cleanSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value);
65
- if (instance.isItemSelected(itemId)) {
65
+ const isSelectedBefore = instance.isItemSelected(itemId);
66
+ if (isSelectedBefore && (newValue === false || newValue == null)) {
66
67
  newSelected = cleanSelectedItems.filter(id => id !== itemId);
67
- } else {
68
+ } else if (!isSelectedBefore && (newValue === true || newValue == null)) {
68
69
  newSelected = [itemId].concat(cleanSelectedItems);
70
+ } else {
71
+ newSelected = cleanSelectedItems;
69
72
  }
70
73
  } else {
71
- newSelected = params.multiSelect ? [itemId] : itemId;
74
+ // eslint-disable-next-line no-lonely-if
75
+ if (newValue === false) {
76
+ newSelected = params.multiSelect ? [] : null;
77
+ } else {
78
+ newSelected = params.multiSelect ? [itemId] : itemId;
79
+ }
72
80
  }
73
81
  setSelectedItems(event, newSelected);
74
82
  lastSelectedItem.current = itemId;
@@ -154,7 +162,9 @@ const useTreeViewSelection = ({
154
162
  },
155
163
  contextValue: {
156
164
  selection: {
157
- multiSelect: params.multiSelect
165
+ multiSelect: params.multiSelect,
166
+ checkboxSelection: params.checkboxSelection,
167
+ disableSelection: params.disableSelection
158
168
  }
159
169
  }
160
170
  };
@@ -169,11 +179,13 @@ const DEFAULT_SELECTED_ITEMS = [];
169
179
  useTreeViewSelection.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
170
180
  disableSelection: params.disableSelection ?? false,
171
181
  multiSelect: params.multiSelect ?? false,
182
+ checkboxSelection: params.checkboxSelection ?? false,
172
183
  defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null)
173
184
  });
174
185
  useTreeViewSelection.params = {
175
186
  disableSelection: true,
176
187
  multiSelect: true,
188
+ checkboxSelection: true,
177
189
  defaultSelectedItems: true,
178
190
  selectedItems: true,
179
191
  onSelectedItemsChange: true,
@@ -11,7 +11,7 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
11
11
  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; }
12
12
  /**
13
13
  * Implements the same behavior as `useControlled` but for several models.
14
- * The controlled models are never stored in the state and the state is only updated if the model is not controlled.
14
+ * The controlled models are never stored in the state, and the state is only updated if the model is not controlled.
15
15
  */
16
16
  const useTreeViewModels = (plugins, props) => {
17
17
  const modelsRef = React.useRef({});
@@ -6,15 +6,20 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.useTreeItem2 = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var React = _interopRequireWildcard(require("react"));
9
10
  var _utils = require("@mui/base/utils");
10
11
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
11
12
  var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
12
13
  var _useTreeItem2Utils = require("../hooks/useTreeItem2Utils");
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); }
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; }
13
16
  const useTreeItem2 = parameters => {
14
17
  const {
15
18
  runItemPlugins,
16
19
  selection: {
17
- multiSelect
20
+ multiSelect,
21
+ disableSelection,
22
+ checkboxSelection
18
23
  },
19
24
  disabledItemsFocusable,
20
25
  instance,
@@ -40,6 +45,7 @@ const useTreeItem2 = parameters => {
40
45
  });
41
46
  const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
42
47
  const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef);
48
+ const checkboxRef = React.useRef(null);
43
49
  const createRootHandleFocus = otherHandlers => event => {
44
50
  otherHandlers.onFocus?.(event);
45
51
  if (event.defaultMuiPrevented) {
@@ -66,11 +72,13 @@ const useTreeItem2 = parameters => {
66
72
  };
67
73
  const createContentHandleClick = otherHandlers => event => {
68
74
  otherHandlers.onClick?.(event);
69
- if (event.defaultMuiPrevented) {
75
+ if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
70
76
  return;
71
77
  }
72
78
  interactions.handleExpansion(event);
73
- interactions.handleSelection(event);
79
+ if (!checkboxSelection) {
80
+ interactions.handleSelection(event);
81
+ }
74
82
  };
75
83
  const createContentHandleMouseDown = otherHandlers => event => {
76
84
  otherHandlers.onMouseDown?.(event);
@@ -83,6 +91,16 @@ const useTreeItem2 = parameters => {
83
91
  event.preventDefault();
84
92
  }
85
93
  };
94
+ const createCheckboxHandleChange = otherHandlers => event => {
95
+ otherHandlers.onChange?.(event);
96
+ if (event.defaultMuiPrevented) {
97
+ return;
98
+ }
99
+ if (disableSelection || status.disabled) {
100
+ return;
101
+ }
102
+ interactions.handleCheckboxSelection(event);
103
+ };
86
104
  const getRootProps = (externalProps = {}) => {
87
105
  const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
88
106
  let ariaSelected;
@@ -120,6 +138,18 @@ const useTreeItem2 = parameters => {
120
138
  status
121
139
  });
122
140
  };
141
+ const getCheckboxProps = (externalProps = {}) => {
142
+ const externalEventHandlers = (0, _utils.extractEventHandlers)(externalProps);
143
+ return (0, _extends2.default)({}, externalEventHandlers, {
144
+ visible: checkboxSelection,
145
+ ref: checkboxRef,
146
+ checked: status.selected,
147
+ disabled: disableSelection || status.disabled,
148
+ tabIndex: -1
149
+ }, externalProps, {
150
+ onChange: createCheckboxHandleChange(externalEventHandlers)
151
+ });
152
+ };
123
153
  const getLabelProps = (externalProps = {}) => {
124
154
  const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
125
155
  return (0, _extends2.default)({}, externalEventHandlers, {
@@ -145,6 +175,7 @@ const useTreeItem2 = parameters => {
145
175
  getContentProps,
146
176
  getGroupTransitionProps,
147
177
  getIconContainerProps,
178
+ getCheckboxProps,
148
179
  getLabelProps,
149
180
  rootRef: handleRootRef,
150
181
  status,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.4.0",
3
+ "version": "7.5.1",
4
4
  "description": "The community edition of the Tree View components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -33,7 +33,7 @@
33
33
  "directory": "packages/x-tree-view"
34
34
  },
35
35
  "dependencies": {
36
- "@babel/runtime": "^7.24.0",
36
+ "@babel/runtime": "^7.24.5",
37
37
  "@mui/base": "^5.0.0-beta.40",
38
38
  "@mui/system": "^5.15.14",
39
39
  "@mui/utils": "^5.15.14",