@mui/x-tree-view 7.7.1 → 7.9.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 (60) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/RichTreeView/RichTreeView.js +12 -5
  3. package/SimpleTreeView/SimpleTreeView.js +12 -5
  4. package/TreeItem/TreeItem.js +19 -4
  5. package/TreeItem/TreeItemContent.js +5 -2
  6. package/TreeItem/useTreeItemState.d.ts +1 -0
  7. package/TreeItem/useTreeItemState.js +21 -4
  8. package/TreeItem2/TreeItem2.d.ts +3 -3
  9. package/TreeItem2Provider/TreeItem2Provider.d.ts +0 -1
  10. package/TreeView/TreeView.js +12 -5
  11. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
  12. package/index.js +1 -1
  13. package/internals/hooks/useInstanceEventHandler.d.ts +2 -2
  14. package/internals/models/plugin.d.ts +5 -1
  15. package/internals/models/treeView.d.ts +1 -3
  16. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  17. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +17 -7
  18. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
  19. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -2
  20. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
  21. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -1
  22. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
  23. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
  24. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +25 -16
  25. package/internals/useTreeView/useTreeViewModels.d.ts +1 -1
  26. package/internals/utils/cleanupTracking/TimerBasedCleanupTracking.d.ts +0 -1
  27. package/internals/utils/publishTreeViewEvent.d.ts +1 -1
  28. package/internals/utils/warning.d.ts +1 -1
  29. package/modern/RichTreeView/RichTreeView.js +12 -5
  30. package/modern/SimpleTreeView/SimpleTreeView.js +12 -5
  31. package/modern/TreeItem/TreeItem.js +19 -4
  32. package/modern/TreeItem/TreeItemContent.js +5 -2
  33. package/modern/TreeItem/useTreeItemState.js +21 -4
  34. package/modern/TreeView/TreeView.js +12 -5
  35. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
  36. package/modern/index.js +1 -1
  37. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  38. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
  39. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
  40. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
  41. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
  42. package/modern/useTreeItem2/useTreeItem2.js +18 -2
  43. package/node/RichTreeView/RichTreeView.js +12 -5
  44. package/node/SimpleTreeView/SimpleTreeView.js +12 -5
  45. package/node/TreeItem/TreeItem.js +19 -4
  46. package/node/TreeItem/TreeItemContent.js +5 -2
  47. package/node/TreeItem/useTreeItemState.js +21 -4
  48. package/node/TreeView/TreeView.js +12 -5
  49. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +16 -3
  50. package/node/index.js +1 -1
  51. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +13 -1
  52. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -2
  53. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +10 -1
  54. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +15 -5
  55. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +12 -4
  56. package/node/useTreeItem2/useTreeItem2.js +18 -2
  57. package/package.json +3 -3
  58. package/useTreeItem2/useTreeItem2.d.ts +2 -2
  59. package/useTreeItem2/useTreeItem2.js +18 -2
  60. package/useTreeItem2/useTreeItem2.types.d.ts +3 -0
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.7.1
2
+ * @mui/x-tree-view v7.9.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -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
  };
@@ -52,8 +52,7 @@ const useTreeViewFocus = ({
52
52
  return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
53
53
  };
54
54
  const innerFocusItem = (event, itemId) => {
55
- const itemMeta = instance.getItemMeta(itemId);
56
- const itemElement = document.getElementById(instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute));
55
+ const itemElement = instance.getItemDOMElement(itemId);
57
56
  if (itemElement) {
58
57
  itemElement.focus();
59
58
  }
@@ -101,6 +101,13 @@ const useTreeViewItems = ({
101
101
  return state.items.itemChildrenIndexes[parentId][itemId];
102
102
  }, [instance, state.items.itemChildrenIndexes]);
103
103
  const getItemOrderedChildrenIds = React.useCallback(itemId => state.items.itemOrderedChildrenIds[itemId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID] ?? [], [state.items.itemOrderedChildrenIds]);
104
+ const getItemDOMElement = itemId => {
105
+ const itemMeta = instance.getItemMeta(itemId);
106
+ if (itemMeta == null) {
107
+ return null;
108
+ }
109
+ return document.getElementById(instance.getTreeItemIdAttribute(itemId, itemMeta.idAttribute));
110
+ };
104
111
  const isItemNavigable = itemId => {
105
112
  if (params.disabledItemsFocusable) {
106
113
  return true;
@@ -154,13 +161,15 @@ const useTreeViewItems = ({
154
161
  }
155
162
  }),
156
163
  publicAPI: {
157
- getItem
164
+ getItem,
165
+ getItemDOMElement
158
166
  },
159
167
  instance: {
160
168
  getItemMeta,
161
169
  getItem,
162
170
  getItemsToRender,
163
171
  getItemIndex,
172
+ getItemDOMElement,
164
173
  getItemOrderedChildrenIds,
165
174
  isItemDisabled,
166
175
  isItemNavigable,
@@ -83,10 +83,13 @@ const useTreeViewKeyboardNavigation = ({
83
83
  event.preventDefault();
84
84
  if (params.multiSelect && event.shiftKey) {
85
85
  instance.expandSelectionRange(event, itemId);
86
- } else if (params.multiSelect) {
87
- instance.selectItem(event, itemId, true);
88
86
  } else {
89
- instance.selectItem(event, itemId, false);
87
+ instance.selectItem({
88
+ event,
89
+ itemId,
90
+ keepExistingSelection: params.multiSelect,
91
+ shouldBeSelected: params.multiSelect ? undefined : true
92
+ });
90
93
  }
91
94
  break;
92
95
  }
@@ -101,9 +104,16 @@ const useTreeViewKeyboardNavigation = ({
101
104
  } else if (canToggleItemSelection(itemId)) {
102
105
  if (params.multiSelect) {
103
106
  event.preventDefault();
104
- instance.selectItem(event, itemId, true);
107
+ instance.selectItem({
108
+ event,
109
+ itemId,
110
+ keepExistingSelection: true
111
+ });
105
112
  } else if (!instance.isItemSelected(itemId)) {
106
- instance.selectItem(event, itemId, false);
113
+ instance.selectItem({
114
+ event,
115
+ itemId
116
+ });
107
117
  event.preventDefault();
108
118
  }
109
119
  }
@@ -55,7 +55,12 @@ const useTreeViewSelection = ({
55
55
  models.selectedItems.setControlledValue(newSelectedItems);
56
56
  };
57
57
  const isItemSelected = itemId => selectedItemsMap.has(itemId);
58
- const selectItem = (event, itemId, keepExistingSelection, newValue) => {
58
+ const selectItem = ({
59
+ event,
60
+ itemId,
61
+ keepExistingSelection = false,
62
+ shouldBeSelected
63
+ }) => {
59
64
  if (params.disableSelection) {
60
65
  return;
61
66
  }
@@ -63,16 +68,16 @@ const useTreeViewSelection = ({
63
68
  if (keepExistingSelection) {
64
69
  const cleanSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value);
65
70
  const isSelectedBefore = instance.isItemSelected(itemId);
66
- if (isSelectedBefore && (newValue === false || newValue == null)) {
71
+ if (isSelectedBefore && (shouldBeSelected === false || shouldBeSelected == null)) {
67
72
  newSelected = cleanSelectedItems.filter(id => id !== itemId);
68
- } else if (!isSelectedBefore && (newValue === true || newValue == null)) {
73
+ } else if (!isSelectedBefore && (shouldBeSelected === true || shouldBeSelected == null)) {
69
74
  newSelected = [itemId].concat(cleanSelectedItems);
70
75
  } else {
71
76
  newSelected = cleanSelectedItems;
72
77
  }
73
78
  } else {
74
79
  // eslint-disable-next-line no-lonely-if
75
- if (newValue === false) {
80
+ if (shouldBeSelected === false || shouldBeSelected == null && instance.isItemSelected(itemId)) {
76
81
  newSelected = params.multiSelect ? [] : null;
77
82
  } else {
78
83
  newSelected = params.multiSelect ? [itemId] : itemId;
@@ -151,6 +156,9 @@ const useTreeViewSelection = ({
151
156
  getRootProps: () => ({
152
157
  'aria-multiselectable': params.multiSelect
153
158
  }),
159
+ publicAPI: {
160
+ selectItem
161
+ },
154
162
  instance: {
155
163
  isItemSelected,
156
164
  selectItem,
@@ -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.1",
3
+ "version": "7.9.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.20",
39
- "@mui/utils": "^5.15.20",
38
+ "@mui/system": "^5.16.0",
39
+ "@mui/utils": "^5.16.0",
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, TOptionalSignatures extends readonly [] = readonly []>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TSignatures, TOptionalSignatures>;
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);
@@ -6,6 +6,7 @@ import { UseTreeViewSelectionSignature } from '../internals/plugins/useTreeViewS
6
6
  import { UseTreeViewItemsSignature } from '../internals/plugins/useTreeViewItems';
7
7
  import { UseTreeViewFocusSignature } from '../internals/plugins/useTreeViewFocus';
8
8
  import { UseTreeViewKeyboardNavigationSignature } from '../internals/plugins/useTreeViewKeyboardNavigation';
9
+ import { UseTreeViewExpansionSignature } from '../internals/plugins/useTreeViewExpansion';
9
10
  export interface UseTreeItem2Parameters {
10
11
  /**
11
12
  * The id attribute of the item. If not provided, it will be generated.
@@ -60,6 +61,7 @@ export interface UseTreeItem2ContentSlotOwnProps {
60
61
  }
61
62
  export type UseTreeItem2ContentSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2ContentSlotOwnProps;
62
63
  export interface UseTreeItem2IconContainerSlotOwnProps {
64
+ onClick: MuiCancellableEventHandler<React.MouseEvent>;
63
65
  }
64
66
  export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2IconContainerSlotOwnProps;
65
67
  export interface UseTreeItem2LabelSlotOwnProps {
@@ -149,6 +151,7 @@ export interface UseTreeItem2ReturnValue<TSignatures extends UseTreeItem2Minimal
149
151
  */
150
152
  export type UseTreeItem2MinimalPlugins = readonly [
151
153
  UseTreeViewSelectionSignature,
154
+ UseTreeViewExpansionSignature,
152
155
  UseTreeViewItemsSignature,
153
156
  UseTreeViewFocusSignature,
154
157
  UseTreeViewKeyboardNavigationSignature