@mui/x-tree-view 8.0.0-beta.0 → 8.0.0-beta.2

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 (168) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/RichTreeView/RichTreeView.js +17 -5
  3. package/RichTreeView/richTreeViewClasses.d.ts +2 -4
  4. package/RichTreeView/richTreeViewClasses.js +1 -1
  5. package/SimpleTreeView/SimpleTreeView.js +17 -5
  6. package/SimpleTreeView/simpleTreeViewClasses.d.ts +2 -4
  7. package/SimpleTreeView/simpleTreeViewClasses.js +1 -1
  8. package/TreeItem/TreeItem.d.ts +1 -1
  9. package/TreeItem/TreeItem.js +45 -49
  10. package/TreeItem/index.d.ts +2 -1
  11. package/TreeItem/index.js +13 -21
  12. package/TreeItem/treeItemClasses.d.ts +40 -18
  13. package/TreeItem/treeItemClasses.js +3 -1
  14. package/TreeItemLabelInput/TreeItemLabelInput.js +2 -2
  15. package/esm/RichTreeView/RichTreeView.js +17 -5
  16. package/esm/RichTreeView/richTreeViewClasses.d.ts +2 -4
  17. package/esm/RichTreeView/richTreeViewClasses.js +1 -1
  18. package/esm/SimpleTreeView/SimpleTreeView.js +17 -5
  19. package/esm/SimpleTreeView/simpleTreeViewClasses.d.ts +2 -4
  20. package/esm/SimpleTreeView/simpleTreeViewClasses.js +1 -1
  21. package/esm/TreeItem/TreeItem.d.ts +1 -1
  22. package/esm/TreeItem/TreeItem.js +45 -49
  23. package/esm/TreeItem/index.d.ts +2 -1
  24. package/esm/TreeItem/index.js +1 -1
  25. package/esm/TreeItem/treeItemClasses.d.ts +40 -18
  26. package/esm/TreeItem/treeItemClasses.js +3 -1
  27. package/esm/TreeItemLabelInput/TreeItemLabelInput.js +2 -2
  28. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +8 -14
  29. package/esm/index.js +1 -1
  30. package/esm/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
  31. package/esm/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  32. package/esm/internals/TreeViewProvider/TreeViewContext.js +8 -1
  33. package/esm/internals/TreeViewProvider/TreeViewProvider.d.ts +1 -1
  34. package/esm/internals/TreeViewProvider/TreeViewProvider.js +17 -5
  35. package/esm/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -1
  36. package/esm/internals/TreeViewProvider/TreeViewStyleContext.d.ts +33 -0
  37. package/esm/internals/TreeViewProvider/TreeViewStyleContext.js +13 -0
  38. package/esm/internals/TreeViewProvider/index.d.ts +1 -1
  39. package/esm/internals/TreeViewProvider/index.js +1 -1
  40. package/esm/internals/index.d.ts +2 -1
  41. package/esm/internals/models/itemPlugin.d.ts +3 -3
  42. package/esm/internals/plugins/useTreeViewItemCustomization/index.d.ts +2 -0
  43. package/esm/internals/plugins/useTreeViewItemCustomization/index.js +1 -0
  44. package/esm/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.d.ts +3 -0
  45. package/esm/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.js +24 -0
  46. package/esm/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.d.ts +42 -0
  47. package/esm/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.js +1 -0
  48. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  49. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  50. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  51. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +13 -15
  52. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  53. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  54. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -11
  55. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  56. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  57. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  58. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  59. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +2 -3
  60. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -21
  61. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -38
  62. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  63. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +38 -1
  64. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  65. package/esm/internals/utils/selectors.d.ts +1 -1
  66. package/esm/useTreeItem/useTreeItem.js +16 -17
  67. package/esm/useTreeItem/useTreeItem.types.d.ts +9 -4
  68. package/hooks/useTreeItemUtils/useTreeItemUtils.js +7 -13
  69. package/index.js +1 -1
  70. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +2 -2
  71. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  72. package/internals/TreeViewProvider/TreeViewContext.js +10 -2
  73. package/internals/TreeViewProvider/TreeViewProvider.d.ts +1 -1
  74. package/internals/TreeViewProvider/TreeViewProvider.js +17 -5
  75. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -1
  76. package/internals/TreeViewProvider/TreeViewStyleContext.d.ts +33 -0
  77. package/internals/TreeViewProvider/TreeViewStyleContext.js +21 -0
  78. package/internals/TreeViewProvider/index.d.ts +1 -1
  79. package/internals/TreeViewProvider/index.js +2 -2
  80. package/internals/index.d.ts +2 -1
  81. package/internals/models/itemPlugin.d.ts +3 -3
  82. package/internals/plugins/useTreeViewItemCustomization/index.d.ts +2 -0
  83. package/internals/plugins/useTreeViewItemCustomization/index.js +12 -0
  84. package/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.d.ts +3 -0
  85. package/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.js +32 -0
  86. package/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.d.ts +42 -0
  87. package/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.js +5 -0
  88. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  89. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  90. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  91. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +12 -14
  92. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  93. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  94. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -12
  95. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  96. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  97. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  98. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  99. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +2 -3
  100. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +15 -20
  101. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +42 -37
  102. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  103. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +39 -2
  104. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  105. package/internals/utils/selectors.d.ts +1 -1
  106. package/modern/RichTreeView/RichTreeView.js +17 -5
  107. package/modern/RichTreeView/richTreeViewClasses.d.ts +2 -4
  108. package/modern/RichTreeView/richTreeViewClasses.js +1 -1
  109. package/modern/SimpleTreeView/SimpleTreeView.js +17 -5
  110. package/modern/SimpleTreeView/simpleTreeViewClasses.d.ts +2 -4
  111. package/modern/SimpleTreeView/simpleTreeViewClasses.js +1 -1
  112. package/modern/TreeItem/TreeItem.d.ts +1 -1
  113. package/modern/TreeItem/TreeItem.js +45 -49
  114. package/modern/TreeItem/index.d.ts +2 -1
  115. package/modern/TreeItem/index.js +1 -1
  116. package/modern/TreeItem/treeItemClasses.d.ts +40 -18
  117. package/modern/TreeItem/treeItemClasses.js +3 -1
  118. package/modern/TreeItemLabelInput/TreeItemLabelInput.js +2 -2
  119. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +8 -14
  120. package/modern/index.js +1 -1
  121. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
  122. package/modern/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  123. package/modern/internals/TreeViewProvider/TreeViewContext.js +8 -1
  124. package/modern/internals/TreeViewProvider/TreeViewProvider.d.ts +1 -1
  125. package/modern/internals/TreeViewProvider/TreeViewProvider.js +17 -5
  126. package/modern/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -1
  127. package/modern/internals/TreeViewProvider/TreeViewStyleContext.d.ts +33 -0
  128. package/modern/internals/TreeViewProvider/TreeViewStyleContext.js +13 -0
  129. package/modern/internals/TreeViewProvider/index.d.ts +1 -1
  130. package/modern/internals/TreeViewProvider/index.js +1 -1
  131. package/modern/internals/index.d.ts +2 -1
  132. package/modern/internals/models/itemPlugin.d.ts +3 -3
  133. package/modern/internals/plugins/useTreeViewItemCustomization/index.d.ts +2 -0
  134. package/modern/internals/plugins/useTreeViewItemCustomization/index.js +1 -0
  135. package/modern/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.d.ts +3 -0
  136. package/modern/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.js +24 -0
  137. package/modern/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.d.ts +42 -0
  138. package/modern/internals/plugins/useTreeViewItemCustomization/useTreeViewItemCustomization.types.js +1 -0
  139. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  140. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  141. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  142. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +13 -15
  143. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  144. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  145. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -11
  146. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  147. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  148. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  149. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  150. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +2 -3
  151. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -21
  152. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -38
  153. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  154. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +38 -1
  155. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  156. package/modern/internals/utils/selectors.d.ts +1 -1
  157. package/modern/useTreeItem/useTreeItem.js +16 -17
  158. package/modern/useTreeItem/useTreeItem.types.d.ts +9 -4
  159. package/package.json +2 -2
  160. package/tsconfig.build.tsbuildinfo +1 -1
  161. package/useTreeItem/useTreeItem.js +16 -17
  162. package/useTreeItem/useTreeItem.types.d.ts +9 -4
  163. package/esm/internals/TreeViewProvider/useTreeViewContext.d.ts +0 -3
  164. package/esm/internals/TreeViewProvider/useTreeViewContext.js +0 -9
  165. package/internals/TreeViewProvider/useTreeViewContext.d.ts +0 -3
  166. package/internals/TreeViewProvider/useTreeViewContext.js +0 -17
  167. package/modern/internals/TreeViewProvider/useTreeViewContext.d.ts +0 -3
  168. package/modern/internals/TreeViewProvider/useTreeViewContext.js +0 -9
@@ -14,17 +14,10 @@ import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeVie
14
14
  import { selectorCanItemBeFocused } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
15
15
  import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
16
16
  import { selectorItemExpansionTrigger } from "../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
17
+ import { selectorIsCheckboxSelectionEnabled, selectorIsItemSelectionEnabled } from "../internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js";
17
18
  export const useTreeItem = parameters => {
18
19
  const {
19
20
  runItemPlugins,
20
- items: {
21
- onItemClick
22
- },
23
- selection: {
24
- disableSelection,
25
- checkboxSelection
26
- },
27
- label: labelContext,
28
21
  instance,
29
22
  publicAPI,
30
23
  store
@@ -61,6 +54,8 @@ export const useTreeItem = parameters => {
61
54
  const handleContentRef = useForkRef(contentRef, contentRefObject);
62
55
  const checkboxRef = React.useRef(null);
63
56
  const treeId = useSelector(store, selectorTreeViewId);
57
+ const isSelectionEnabledForItem = useSelector(store, selectorIsItemSelectionEnabled, itemId);
58
+ const isCheckboxSelectionEnabled = useSelector(store, selectorIsCheckboxSelectionEnabled);
64
59
  const idAttribute = generateTreeItemIdAttribute({
65
60
  itemId,
66
61
  treeId,
@@ -70,8 +65,7 @@ export const useTreeItem = parameters => {
70
65
  const sharedPropsEnhancerParams = {
71
66
  rootRefObject,
72
67
  contentRefObject,
73
- interactions,
74
- status
68
+ interactions
75
69
  };
76
70
  const createRootHandleFocus = otherHandlers => event => {
77
71
  otherHandlers.onFocus?.(event);
@@ -116,14 +110,14 @@ export const useTreeItem = parameters => {
116
110
  };
117
111
  const createContentHandleClick = otherHandlers => event => {
118
112
  otherHandlers.onClick?.(event);
119
- onItemClick(event, itemId);
113
+ instance.handleItemClick(event, itemId);
120
114
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
121
115
  return;
122
116
  }
123
117
  if (selectorItemExpansionTrigger(store.value) === 'content') {
124
118
  interactions.handleExpansion(event);
125
119
  }
126
- if (!checkboxSelection) {
120
+ if (!isCheckboxSelectionEnabled) {
127
121
  interactions.handleSelection(event);
128
122
  }
129
123
  };
@@ -159,7 +153,7 @@ export const useTreeItem = parameters => {
159
153
  if (status.selected) {
160
154
  // - each selected node has aria-selected set to true.
161
155
  ariaSelected = true;
162
- } else if (disableSelection || status.disabled) {
156
+ } else if (!isSelectionEnabledForItem) {
163
157
  // - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
164
158
  ariaSelected = undefined;
165
159
  } else {
@@ -195,6 +189,11 @@ export const useTreeItem = parameters => {
195
189
  onMouseDown: createContentHandleMouseDown(externalEventHandlers),
196
190
  status
197
191
  });
192
+ ['expanded', 'selected', 'focused', 'disabled', 'editing', 'editable'].forEach(key => {
193
+ if (status[key]) {
194
+ props[`data-${key}`] = '';
195
+ }
196
+ });
198
197
  const enhancedContentProps = propsEnhancers.content?.(_extends({}, sharedPropsEnhancerParams, {
199
198
  externalEventHandlers
200
199
  })) ?? {};
@@ -217,10 +216,10 @@ export const useTreeItem = parameters => {
217
216
  }, externalProps, {
218
217
  onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
219
218
  });
220
- if (labelContext?.isItemEditable) {
221
- props.editable = status.editable;
222
- }
223
- return props;
219
+ const enhancedLabelProps = propsEnhancers.label?.(_extends({}, sharedPropsEnhancerParams, {
220
+ externalEventHandlers
221
+ })) ?? {};
222
+ return _extends({}, enhancedLabelProps, props);
224
223
  };
225
224
  const getLabelInputProps = (externalProps = {}) => {
226
225
  const externalEventHandlers = extractEventHandlers(externalProps);
@@ -55,7 +55,16 @@ export interface UseTreeItemContentSlotPropsFromUseTreeItem {
55
55
  onClick: TreeViewCancellableEventHandler<React.MouseEvent>;
56
56
  onMouseDown: TreeViewCancellableEventHandler<React.MouseEvent>;
57
57
  ref: React.RefCallback<HTMLDivElement> | null;
58
+ /**
59
+ * @deprecated Will be removed in the next major version. Please use the data-attrs instead.
60
+ */
58
61
  status: UseTreeItemStatus;
62
+ 'data-expanded'?: '';
63
+ 'data-selected'?: '';
64
+ 'data-focused'?: '';
65
+ 'data-disabled'?: '';
66
+ 'data-editing'?: '';
67
+ 'data-editable'?: '';
59
68
  }
60
69
  export interface UseTreeItemContentSlotOwnProps extends UseTreeItemContentSlotPropsFromUseTreeItem {}
61
70
  export type UseTreeItemContentSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItemContentSlotOwnProps;
@@ -66,10 +75,6 @@ export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProp
66
75
  export interface UseTreeItemLabelSlotOwnProps {
67
76
  children: React.ReactNode;
68
77
  onDoubleClick: TreeViewCancellableEventHandler<React.MouseEvent>;
69
- /**
70
- * Only defined when the `isItemEditable` experimental feature is enabled.
71
- */
72
- editable?: boolean;
73
78
  }
74
79
  export type UseTreeItemLabelSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItemLabelSlotOwnProps;
75
80
  export interface UseTreeItemLabelInputSlotOwnProps {}
@@ -36,15 +36,12 @@ const useTreeItemUtils = ({
36
36
  }) => {
37
37
  const {
38
38
  instance,
39
- label,
40
39
  store,
41
- selection: {
42
- multiSelect
43
- },
44
40
  publicAPI
45
41
  } = (0, _TreeViewProvider.useTreeViewContext)();
46
42
  const isItemExpandable = (0, _useSelector.useSelector)(store, _useTreeViewExpansion.selectorIsItemExpandable, itemId);
47
43
  const isLazyLoadingEnabled = (0, _useSelector.useSelector)(store, _useTreeViewLazyLoading.selectorIsLazyLoadingEnabled);
44
+ const isMultiSelectEnabled = (0, _useSelector.useSelector)(store, _useTreeViewSelection.selectorIsMultiSelectEnabled);
48
45
  const loading = (0, _useSelector.useSelector)(store, state => isLazyLoadingEnabled ? (0, _useTreeViewLazyLoading.selectorIsItemLoading)(state, itemId) : false);
49
46
  const error = (0, _useSelector.useSelector)(store, state => isLazyLoadingEnabled ? Boolean((0, _useTreeViewLazyLoading.selectorGetTreeItemError)(state, itemId)) : false);
50
47
  const isExpandable = itemHasChildren(children) || isItemExpandable;
@@ -52,11 +49,8 @@ const useTreeItemUtils = ({
52
49
  const isFocused = (0, _useSelector.useSelector)(store, _useTreeViewFocus.selectorIsItemFocused, itemId);
53
50
  const isSelected = (0, _useSelector.useSelector)(store, _useTreeViewSelection.selectorIsItemSelected, itemId);
54
51
  const isDisabled = (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorIsItemDisabled, itemId);
55
- const isEditing = (0, _useSelector.useSelector)(store, state => label == null ? false : (0, _useTreeViewLabel2.selectorIsItemBeingEdited)(state, itemId));
56
- const isEditable = (0, _useSelector.useSelector)(store, state => label == null ? false : (0, _useTreeViewLabel2.selectorIsItemEditable)(state, {
57
- itemId,
58
- isItemEditable: label.isItemEditable
59
- }));
52
+ const isEditing = (0, _useSelector.useSelector)(store, _useTreeViewLabel2.selectorIsItemBeingEdited, itemId);
53
+ const isEditable = (0, _useSelector.useSelector)(store, _useTreeViewLabel2.selectorIsItemEditable, itemId);
60
54
  const status = {
61
55
  expandable: isExpandable,
62
56
  expanded: isExpanded,
@@ -75,7 +69,7 @@ const useTreeItemUtils = ({
75
69
  if (!status.focused) {
76
70
  instance.focusItem(event, itemId);
77
71
  }
78
- const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
72
+ const multiple = isMultiSelectEnabled && (event.shiftKey || event.ctrlKey || event.metaKey);
79
73
 
80
74
  // If already expanded and trying to toggle selection don't close
81
75
  if (status.expandable && !(multiple && (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemId))) {
@@ -93,7 +87,7 @@ const useTreeItemUtils = ({
93
87
  if (!status.focused) {
94
88
  instance.focusItem(event, itemId);
95
89
  }
96
- const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
90
+ const multiple = isMultiSelectEnabled && (event.shiftKey || event.ctrlKey || event.metaKey);
97
91
  if (multiple) {
98
92
  if (event.shiftKey) {
99
93
  instance.expandSelectionRange(event, itemId);
@@ -114,13 +108,13 @@ const useTreeItemUtils = ({
114
108
  };
115
109
  const handleCheckboxSelection = event => {
116
110
  const hasShift = event.nativeEvent.shiftKey;
117
- if (multiSelect && hasShift) {
111
+ if (isMultiSelectEnabled && hasShift) {
118
112
  instance.expandSelectionRange(event, itemId);
119
113
  } else {
120
114
  instance.setItemSelection({
121
115
  event,
122
116
  itemId,
123
- keepExistingSelection: multiSelect,
117
+ keepExistingSelection: isMultiSelectEnabled,
124
118
  shouldBeSelected: event.target.checked
125
119
  });
126
120
  }
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-beta.0
2
+ * @mui/x-tree-view v8.0.0-beta.2
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -9,7 +9,7 @@ exports.TreeViewChildrenItemContext = void 0;
9
9
  exports.TreeViewChildrenItemProvider = TreeViewChildrenItemProvider;
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
- var _useTreeViewContext = require("./useTreeViewContext");
12
+ var _TreeViewContext = require("./TreeViewContext");
13
13
  var _utils = require("../utils/utils");
14
14
  var _useTreeViewItems = require("../plugins/useTreeViewItems/useTreeViewItems.selectors");
15
15
  var _jsxRuntime = require("react/jsx-runtime");
@@ -27,7 +27,7 @@ function TreeViewChildrenItemProvider(props) {
27
27
  instance,
28
28
  store,
29
29
  rootRef
30
- } = (0, _useTreeViewContext.useTreeViewContext)();
30
+ } = (0, _TreeViewContext.useTreeViewContext)();
31
31
  const childrenIdAttrToIdRef = React.useRef(new Map());
32
32
  React.useEffect(() => {
33
33
  if (!rootRef.current) {
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
+ import { TreeViewAnyPluginSignature } from "../models/index.js";
2
3
  import { TreeViewContextValue } from "./TreeViewProvider.types.js";
3
4
  /**
4
5
  * @ignore - internal component.
5
6
  */
6
- export declare const TreeViewContext: React.Context<TreeViewContextValue<any> | null>;
7
+ export declare const TreeViewContext: React.Context<TreeViewContextValue<any> | null>;
8
+ export declare const useTreeViewContext: <TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []>() => TreeViewContextValue<TSignatures, TOptionalSignatures>;
@@ -4,7 +4,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.TreeViewContext = void 0;
7
+ exports.useTreeViewContext = exports.TreeViewContext = void 0;
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
  /**
10
10
  * @ignore - internal component.
@@ -12,4 +12,12 @@ var React = _interopRequireWildcard(require("react"));
12
12
  const TreeViewContext = exports.TreeViewContext = /*#__PURE__*/React.createContext(null);
13
13
  if (process.env.NODE_ENV !== 'production') {
14
14
  TreeViewContext.displayName = 'TreeViewContext';
15
- }
15
+ }
16
+ const useTreeViewContext = () => {
17
+ const context = React.useContext(TreeViewContext);
18
+ if (context == null) {
19
+ throw new Error(['MUI X: Could not find the Tree View context.', 'It looks like you rendered your component outside of a SimpleTreeView or RichTreeView parent component.', 'This can also happen if you are bundling multiple versions of the Tree View.'].join('\n'));
20
+ }
21
+ return context;
22
+ };
23
+ exports.useTreeViewContext = useTreeViewContext;
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { TreeViewProviderProps } from "./TreeViewProvider.types.js";
3
3
  import { TreeViewAnyPluginSignature } from "../models/index.js";
4
4
  /**
5
- * Sets up the contexts for the underlying TreeItem components.
5
+ * Sets up the contexts for the underlying Tree Item components.
6
6
  *
7
7
  * @ignore - do not document.
8
8
  */
@@ -7,21 +7,33 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.TreeViewProvider = TreeViewProvider;
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
  var _TreeViewContext = require("./TreeViewContext");
10
+ var _TreeViewStyleContext = require("./TreeViewStyleContext");
10
11
  var _jsxRuntime = require("react/jsx-runtime");
12
+ const EMPTY_OBJECT = {};
13
+
11
14
  /**
12
- * Sets up the contexts for the underlying TreeItem components.
15
+ * Sets up the contexts for the underlying Tree Item components.
13
16
  *
14
17
  * @ignore - do not document.
15
18
  */
16
19
  function TreeViewProvider(props) {
17
20
  const {
18
- value,
21
+ contextValue,
22
+ classes = EMPTY_OBJECT,
19
23
  children
20
24
  } = props;
25
+
26
+ // TODO: Add the icons to this context and drop useTreeViewIcons
27
+ const styleContextValue = React.useMemo(() => ({
28
+ classes
29
+ }), [classes]);
21
30
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewContext.TreeViewContext.Provider, {
22
- value: value,
23
- children: value.wrapRoot({
24
- children
31
+ value: contextValue,
32
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewStyleContext.TreeViewStyleContext.Provider, {
33
+ value: styleContextValue,
34
+ children: contextValue.wrapRoot({
35
+ children
36
+ })
25
37
  })
26
38
  });
27
39
  }
@@ -3,6 +3,7 @@ import { MergeSignaturesProperty, TreeItemWrapper, TreeRootWrapper, TreeViewAnyP
3
3
  import { TreeViewStore } from "../utils/TreeViewStore.js";
4
4
  import { TreeViewCorePluginSignatures } from "../corePlugins/index.js";
5
5
  import type { TreeItemProps } from '../../TreeItem/TreeItem.types';
6
+ import { TreeViewClasses } from "./TreeViewStyleContext.js";
6
7
  export type TreeViewItemPluginsRunner = (props: TreeItemProps) => Required<TreeViewItemPluginResponse>;
7
8
  export type TreeViewContextValue<TSignatures extends readonly TreeViewAnyPluginSignature[], TOptionalSignatures extends readonly TreeViewAnyPluginSignature[] = []> = MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'contextValue'> & Partial<MergeSignaturesProperty<TOptionalSignatures, 'contextValue'>> & {
8
9
  instance: TreeViewInstance<TSignatures, TOptionalSignatures>;
@@ -14,6 +15,7 @@ export type TreeViewContextValue<TSignatures extends readonly TreeViewAnyPluginS
14
15
  runItemPlugins: TreeViewItemPluginsRunner;
15
16
  };
16
17
  export interface TreeViewProviderProps<TSignatures extends readonly TreeViewAnyPluginSignature[]> {
17
- value: TreeViewContextValue<TSignatures>;
18
+ contextValue: TreeViewContextValue<TSignatures>;
18
19
  children: React.ReactNode;
20
+ classes: Partial<TreeViewClasses> | undefined;
19
21
  }
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ export interface TreeViewClasses {
3
+ /** Styles applied to the root element. */
4
+ root: string;
5
+ /** Styles applied to the item's root element. */
6
+ item: string;
7
+ /** Styles applied to the item's content element. */
8
+ itemContent: string;
9
+ /** Styles applied to the item's transition element. */
10
+ itemGroupTransition: string;
11
+ /** Styles applied to the item's icon container element icon. */
12
+ itemIconContainer: string;
13
+ /** Styles applied to the item's label element. */
14
+ itemLabel: string;
15
+ /** Styles applied to the item's label input element (visible only when editing is enabled). */
16
+ itemLabelInput: string;
17
+ /** Styles applied to the item's checkbox element. */
18
+ itemCheckbox: string;
19
+ /** Styles applied to the item's drag and drop overlay element. */
20
+ itemDragAndDropOverlay: string;
21
+ /** Styles applied to the item's error icon element */
22
+ itemErrorIcon: string;
23
+ /** Styles applied to the item's loading icon element */
24
+ itemLoadingIcon: string;
25
+ }
26
+ export interface TreeViewStyleContextValue {
27
+ classes: Partial<TreeViewClasses>;
28
+ }
29
+ /**
30
+ * @ignore - internal component.
31
+ */
32
+ export declare const TreeViewStyleContext: React.Context<TreeViewStyleContextValue>;
33
+ export declare const useTreeViewStyleContext: () => TreeViewStyleContextValue;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeViewStyleContext = exports.TreeViewStyleContext = void 0;
8
+ var React = _interopRequireWildcard(require("react"));
9
+ /**
10
+ * @ignore - internal component.
11
+ */
12
+ const TreeViewStyleContext = exports.TreeViewStyleContext = /*#__PURE__*/React.createContext({
13
+ classes: {}
14
+ });
15
+ if (process.env.NODE_ENV !== 'production') {
16
+ TreeViewStyleContext.displayName = 'TreeViewStyleContext';
17
+ }
18
+ const useTreeViewStyleContext = () => {
19
+ return React.useContext(TreeViewStyleContext);
20
+ };
21
+ exports.useTreeViewStyleContext = useTreeViewStyleContext;
@@ -1,3 +1,3 @@
1
1
  export { TreeViewProvider } from "./TreeViewProvider.js";
2
- export { useTreeViewContext } from "./useTreeViewContext.js";
2
+ export { useTreeViewContext } from "./TreeViewContext.js";
3
3
  export type { TreeViewProviderProps, TreeViewContextValue, TreeViewItemPluginsRunner } from './TreeViewProvider.types';
@@ -12,8 +12,8 @@ Object.defineProperty(exports, "TreeViewProvider", {
12
12
  Object.defineProperty(exports, "useTreeViewContext", {
13
13
  enumerable: true,
14
14
  get: function () {
15
- return _useTreeViewContext.useTreeViewContext;
15
+ return _TreeViewContext.useTreeViewContext;
16
16
  }
17
17
  });
18
18
  var _TreeViewProvider = require("./TreeViewProvider");
19
- var _useTreeViewContext = require("./useTreeViewContext");
19
+ var _TreeViewContext = require("./TreeViewContext");
@@ -30,4 +30,5 @@ export { useTreeViewJSXItems } from "./plugins/useTreeViewJSXItems/index.js";
30
30
  export type { UseTreeViewJSXItemsSignature, UseTreeViewJSXItemsParameters } from './plugins/useTreeViewJSXItems';
31
31
  export { createSelector } from "./utils/selectors.js";
32
32
  export { isTargetInDescendants } from "./utils/tree.js";
33
- export { TreeViewStore } from "./utils/TreeViewStore.js";
33
+ export { TreeViewStore } from "./utils/TreeViewStore.js";
34
+ export type { TreeViewClasses } from './TreeViewProvider/TreeViewStyleContext';
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { EventHandlers } from '@mui/utils/types';
3
- import type { UseTreeItemContentSlotOwnProps, UseTreeItemDragAndDropOverlaySlotOwnProps, UseTreeItemLabelInputSlotOwnProps, UseTreeItemRootSlotOwnProps, UseTreeItemCheckboxSlotOwnProps, UseTreeItemStatus } from '../../useTreeItem';
3
+ import type { UseTreeItemContentSlotOwnProps, UseTreeItemDragAndDropOverlaySlotOwnProps, UseTreeItemLabelInputSlotOwnProps, UseTreeItemRootSlotOwnProps, UseTreeItemCheckboxSlotOwnProps, UseTreeItemLabelSlotOwnProps } from '../../useTreeItem';
4
4
  import type { UseTreeItemInteractions } from '../../hooks/useTreeItemUtils/useTreeItemUtils';
5
5
  import type { TreeItemProps } from '../../TreeItem/TreeItem.types';
6
6
  export interface TreeViewItemPluginSlotPropsEnhancerParams {
@@ -8,7 +8,6 @@ export interface TreeViewItemPluginSlotPropsEnhancerParams {
8
8
  contentRefObject: React.RefObject<HTMLDivElement | null>;
9
9
  externalEventHandlers: EventHandlers;
10
10
  interactions: UseTreeItemInteractions;
11
- status: UseTreeItemStatus;
12
11
  }
13
12
  type TreeViewItemPluginSlotPropsEnhancer<TSlotProps> = (params: TreeViewItemPluginSlotPropsEnhancerParams) => Partial<TSlotProps>;
14
13
  export interface TreeViewItemPluginSlotPropsEnhancers {
@@ -16,6 +15,7 @@ export interface TreeViewItemPluginSlotPropsEnhancers {
16
15
  content?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemContentSlotOwnProps>;
17
16
  dragAndDropOverlay?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemDragAndDropOverlaySlotOwnProps>;
18
17
  labelInput?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemLabelInputSlotOwnProps>;
18
+ label?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemLabelSlotOwnProps>;
19
19
  checkbox?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItemCheckboxSlotOwnProps>;
20
20
  }
21
21
  export interface TreeViewItemPluginResponse {
@@ -31,7 +31,7 @@ export interface TreeViewItemPluginResponse {
31
31
  * Callback to enhance the slot props of the Tree Item.
32
32
  *
33
33
  * Not all slots are enabled by default,
34
- * if a new plugin needs to pass to an unconfigured slot,
34
+ * if a new plugin needs to pass to an un-configured slot,
35
35
  * it just needs to be added to `TreeViewItemPluginSlotPropsEnhancers`
36
36
  */
37
37
  propsEnhancers?: TreeViewItemPluginSlotPropsEnhancers;
@@ -0,0 +1,2 @@
1
+ export { useTreeViewItemCustomization } from "./useTreeViewItemCustomization.js";
2
+ export type { UseTreeViewItemCustomizationSignature, UseTreeViewItemCustomizationParameters, UseTreeViewItemCustomizationDefaultizedParameters } from './useTreeViewItemCustomization.types';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewItemCustomization", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewItemCustomization.useTreeViewItemCustomization;
10
+ }
11
+ });
12
+ var _useTreeViewItemCustomization = require("./useTreeViewItemCustomization");
@@ -0,0 +1,3 @@
1
+ import { TreeViewPlugin } from "../../models/index.js";
2
+ import { UseTreeViewItemCustomizationSignature } from "./useTreeViewItemCustomization.types.js";
3
+ export declare const useTreeViewItemCustomization: TreeViewPlugin<UseTreeViewItemCustomizationSignature>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeViewItemCustomization = void 0;
8
+ var React = _interopRequireWildcard(require("react"));
9
+ const useTreeViewItemCustomization = ({
10
+ slots,
11
+ slotProps
12
+ }) => {
13
+ const pluginContextValue = React.useMemo(() => ({
14
+ icons: {
15
+ slots: {
16
+ collapseIcon: slots.collapseIcon,
17
+ expandIcon: slots.expandIcon,
18
+ endIcon: slots.endIcon
19
+ },
20
+ slotProps: {
21
+ collapseIcon: slotProps.collapseIcon,
22
+ expandIcon: slotProps.expandIcon,
23
+ endIcon: slotProps.endIcon
24
+ }
25
+ }
26
+ }), [slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
27
+ return {
28
+ contextValue: pluginContextValue
29
+ };
30
+ };
31
+ exports.useTreeViewItemCustomization = useTreeViewItemCustomization;
32
+ useTreeViewItemCustomization.params = {};
@@ -0,0 +1,42 @@
1
+ import * as React from 'react';
2
+ import { SlotComponentProps } from '@mui/utils/types';
3
+ import { TreeViewPluginSignature } from "../../models/index.js";
4
+ import { UseTreeViewItemsSignature } from "../useTreeViewItems/index.js";
5
+ import { UseTreeViewSelectionSignature } from "../useTreeViewSelection/index.js";
6
+ export interface UseTreeViewItemCustomizationParameters {}
7
+ export type UseTreeViewItemCustomizationDefaultizedParameters = UseTreeViewItemCustomizationParameters;
8
+ interface UseTreeViewItemCustomizationSlots {
9
+ /**
10
+ * The default icon used to collapse the item.
11
+ */
12
+ collapseIcon?: React.ElementType;
13
+ /**
14
+ * The default icon used to expand the item.
15
+ */
16
+ expandIcon?: React.ElementType;
17
+ /**
18
+ * The default icon displayed next to an end item.
19
+ * This is applied to all Tree Items and can be overridden by the TreeItem `icon` slot prop.
20
+ */
21
+ endIcon?: React.ElementType;
22
+ }
23
+ interface UseTreeViewItemCustomizationSlotProps {
24
+ collapseIcon?: SlotComponentProps<'svg', {}, {}>;
25
+ expandIcon?: SlotComponentProps<'svg', {}, {}>;
26
+ endIcon?: SlotComponentProps<'svg', {}, {}>;
27
+ }
28
+ interface UseTreeViewItemCustomizationContextValue {
29
+ icons: {
30
+ slots: UseTreeViewItemCustomizationSlots;
31
+ slotProps: UseTreeViewItemCustomizationSlotProps;
32
+ };
33
+ }
34
+ export type UseTreeViewItemCustomizationSignature = TreeViewPluginSignature<{
35
+ params: UseTreeViewItemCustomizationParameters;
36
+ defaultizedParams: UseTreeViewItemCustomizationDefaultizedParameters;
37
+ contextValue: UseTreeViewItemCustomizationContextValue;
38
+ slots: UseTreeViewItemCustomizationSlots;
39
+ slotProps: UseTreeViewItemCustomizationSlotProps;
40
+ dependencies: [UseTreeViewItemsSignature, UseTreeViewSelectionSignature];
41
+ }>;
42
+ export {};
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -270,11 +270,6 @@ const useTreeViewItems = ({
270
270
  params.onItemClick(event, itemId);
271
271
  }
272
272
  });
273
- const pluginContextValue = React.useMemo(() => ({
274
- items: {
275
- onItemClick: handleItemClick
276
- }
277
- }), [handleItemClick]);
278
273
  return {
279
274
  getRootProps: () => ({
280
275
  style: {
@@ -296,9 +291,9 @@ const useTreeViewItems = ({
296
291
  addItems,
297
292
  setTreeViewLoading,
298
293
  setTreeViewError,
299
- removeChildren
300
- },
301
- contextValue: pluginContextValue
294
+ removeChildren,
295
+ handleItemClick
296
+ }
302
297
  };
303
298
  };
304
299
  exports.useTreeViewItems = useTreeViewItems;
@@ -43,10 +43,7 @@ const selectorItemOrderedChildrenIds = exports.selectorItemOrderedChildrenIds =
43
43
  * @param {TreeViewItemId} itemId The id of the item to get the model of.
44
44
  * @returns {R} The model of the item.
45
45
  */
46
- const selectorItemModel = exports.selectorItemModel = (0, _selectors.createSelector)([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => {
47
- const a = itemsState.itemModelLookup[itemId];
48
- return a;
49
- });
46
+ const selectorItemModel = exports.selectorItemModel = (0, _selectors.createSelector)([selectorTreeViewItemsState, (_, itemId) => itemId], (itemsState, itemId) => itemsState.itemModelLookup[itemId]);
50
47
 
51
48
  /**
52
49
  * Get the meta-information of an item.
@@ -83,6 +83,12 @@ export interface UseTreeViewItemsInstance<R extends {}> extends Pick<UseTreeView
83
83
  * @param {Error | null} error The error on the tree view.
84
84
  */
85
85
  setTreeViewError: (error: Error | null) => void;
86
+ /**
87
+ * Event handler to fire when the `content` slot of a given Tree Item is clicked.
88
+ * @param {React.MouseEvent} event The DOM event that triggered the change.
89
+ * @param {TreeViewItemId} itemId The id of the item being clicked.
90
+ */
91
+ handleItemClick: (event: React.MouseEvent, itemId: TreeViewItemId) => void;
86
92
  }
87
93
  export interface UseTreeViewItemsParameters<R extends {
88
94
  children?: R[];
@@ -188,11 +194,6 @@ export interface UseTreeViewItemsState<R extends {}> {
188
194
  error: Error | null;
189
195
  };
190
196
  }
191
- interface UseTreeViewItemsContextValue {
192
- items: {
193
- onItemClick: (event: React.MouseEvent, itemId: string) => void;
194
- };
195
- }
196
197
  export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
197
198
  params: UseTreeViewItemsParameters<any>;
198
199
  defaultizedParams: UseTreeViewItemsDefaultizedParameters<any>;
@@ -200,6 +201,5 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
200
201
  publicAPI: UseTreeViewItemsPublicAPI<any>;
201
202
  events: UseTreeViewItemsEventLookup;
202
203
  state: UseTreeViewItemsState<TreeViewDefaultItemModelProperties>;
203
- contextValue: UseTreeViewItemsContextValue;
204
204
  }>;
205
205
  export {};