@mui/x-tree-view 8.0.0-beta.0 → 8.0.0-beta.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 (69) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +8 -14
  3. package/esm/index.js +1 -1
  4. package/esm/internals/models/itemPlugin.d.ts +3 -3
  5. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  6. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  7. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  8. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +13 -15
  9. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  10. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  11. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -11
  12. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  13. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  14. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  15. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  16. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -21
  17. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -38
  18. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  19. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +38 -1
  20. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  21. package/esm/internals/utils/selectors.d.ts +1 -1
  22. package/esm/useTreeItem/useTreeItem.js +11 -17
  23. package/esm/useTreeItem/useTreeItem.types.d.ts +0 -4
  24. package/hooks/useTreeItemUtils/useTreeItemUtils.js +7 -13
  25. package/index.js +1 -1
  26. package/internals/models/itemPlugin.d.ts +3 -3
  27. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  28. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  29. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  30. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +12 -14
  31. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  32. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  33. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -12
  34. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  35. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  36. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  37. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  38. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +15 -20
  39. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +42 -37
  40. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  41. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +39 -2
  42. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  43. package/internals/utils/selectors.d.ts +1 -1
  44. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +8 -14
  45. package/modern/index.js +1 -1
  46. package/modern/internals/models/itemPlugin.d.ts +3 -3
  47. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +3 -8
  48. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +1 -4
  49. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +6 -6
  50. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +13 -15
  51. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +0 -3
  52. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +9 -12
  53. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +16 -11
  54. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +14 -20
  55. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +5 -7
  56. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +5 -4
  57. package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +0 -2
  58. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -21
  59. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -38
  60. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +331 -0
  61. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +38 -1
  62. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +5 -4
  63. package/modern/internals/utils/selectors.d.ts +1 -1
  64. package/modern/useTreeItem/useTreeItem.js +11 -17
  65. package/modern/useTreeItem/useTreeItem.types.d.ts +0 -4
  66. package/package.json +1 -1
  67. package/tsconfig.build.tsbuildinfo +1 -1
  68. package/useTreeItem/useTreeItem.js +11 -17
  69. package/useTreeItem/useTreeItem.types.d.ts +0 -4
@@ -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 {
@@ -217,10 +211,10 @@ export const useTreeItem = parameters => {
217
211
  }, externalProps, {
218
212
  onDoubleClick: createLabelHandleDoubleClick(externalEventHandlers)
219
213
  });
220
- if (labelContext?.isItemEditable) {
221
- props.editable = status.editable;
222
- }
223
- return props;
214
+ const enhancedLabelProps = propsEnhancers.label?.(_extends({}, sharedPropsEnhancerParams, {
215
+ externalEventHandlers
216
+ })) ?? {};
217
+ return _extends({}, enhancedLabelProps, props);
224
218
  };
225
219
  const getLabelInputProps = (externalProps = {}) => {
226
220
  const externalEventHandlers = extractEventHandlers(externalProps);
@@ -66,10 +66,6 @@ export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProp
66
66
  export interface UseTreeItemLabelSlotOwnProps {
67
67
  children: React.ReactNode;
68
68
  onDoubleClick: TreeViewCancellableEventHandler<React.MouseEvent>;
69
- /**
70
- * Only defined when the `isItemEditable` experimental feature is enabled.
71
- */
72
- editable?: boolean;
73
69
  }
74
70
  export type UseTreeItemLabelSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItemLabelSlotOwnProps;
75
71
  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.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -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;
@@ -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 {};
@@ -66,7 +66,7 @@ const useTreeViewKeyboardNavigation = ({
66
66
  }
67
67
  return matchingItemId;
68
68
  };
69
- const canToggleItemSelection = itemId => !params.disableSelection && !(0, _useTreeViewItems.selectorIsItemDisabled)(store.value, itemId);
69
+ const canToggleItemSelection = itemId => (0, _useTreeViewSelection.selectorIsSelectionEnabled)(store.value) && !(0, _useTreeViewItems.selectorIsItemDisabled)(store.value, itemId);
70
70
  const canToggleItemExpansion = itemId => {
71
71
  return !(0, _useTreeViewItems.selectorIsItemDisabled)(store.value, itemId) && (0, _useTreeViewExpansion.selectorIsItemExpandable)(store.value, itemId);
72
72
  };
@@ -81,6 +81,7 @@ const useTreeViewKeyboardNavigation = ({
81
81
  }
82
82
  const ctrlPressed = event.ctrlKey || event.metaKey;
83
83
  const key = event.key;
84
+ const isMultiSelectEnabled = (0, _useTreeViewSelection.selectorIsMultiSelectEnabled)(store.value);
84
85
 
85
86
  // eslint-disable-next-line default-case
86
87
  switch (true) {
@@ -88,14 +89,14 @@ const useTreeViewKeyboardNavigation = ({
88
89
  case key === ' ' && canToggleItemSelection(itemId):
89
90
  {
90
91
  event.preventDefault();
91
- if (params.multiSelect && event.shiftKey) {
92
+ if (isMultiSelectEnabled && event.shiftKey) {
92
93
  instance.expandSelectionRange(event, itemId);
93
94
  } else {
94
95
  instance.setItemSelection({
95
96
  event,
96
97
  itemId,
97
- keepExistingSelection: params.multiSelect,
98
- shouldBeSelected: params.multiSelect ? undefined : true
98
+ keepExistingSelection: isMultiSelectEnabled,
99
+ shouldBeSelected: undefined
99
100
  });
100
101
  }
101
102
  break;
@@ -105,10 +106,7 @@ const useTreeViewKeyboardNavigation = ({
105
106
  // If the focused item has no children, we select it.
106
107
  case key === 'Enter':
107
108
  {
108
- if ((0, _plugins.hasPlugin)(instance, _useTreeViewLabel.useTreeViewLabel) && (0, _useTreeViewLabel2.selectorIsItemEditable)(store.value, {
109
- itemId,
110
- isItemEditable: params.isItemEditable
111
- }) && !(0, _useTreeViewLabel2.selectorIsItemBeingEdited)(store.value, itemId)) {
109
+ if ((0, _plugins.hasPlugin)(instance, _useTreeViewLabel.useTreeViewLabel) && (0, _useTreeViewLabel2.selectorIsItemEditable)(store.value, itemId) && !(0, _useTreeViewLabel2.selectorIsItemBeingEdited)(store.value, itemId)) {
112
110
  instance.setEditedItemId(itemId);
113
111
  } else if (canToggleItemExpansion(itemId)) {
114
112
  instance.setItemExpansion({
@@ -117,7 +115,7 @@ const useTreeViewKeyboardNavigation = ({
117
115
  });
118
116
  event.preventDefault();
119
117
  } else if (canToggleItemSelection(itemId)) {
120
- if (params.multiSelect) {
118
+ if (isMultiSelectEnabled) {
121
119
  event.preventDefault();
122
120
  instance.setItemSelection({
123
121
  event,
@@ -145,7 +143,7 @@ const useTreeViewKeyboardNavigation = ({
145
143
 
146
144
  // Multi select behavior when pressing Shift + ArrowDown
147
145
  // Toggles the selection state of the next item
148
- if (params.multiSelect && event.shiftKey && canToggleItemSelection(nextItem)) {
146
+ if (isMultiSelectEnabled && event.shiftKey && canToggleItemSelection(nextItem)) {
149
147
  instance.selectItemFromArrowNavigation(event, itemId, nextItem);
150
148
  }
151
149
  }
@@ -162,7 +160,7 @@ const useTreeViewKeyboardNavigation = ({
162
160
 
163
161
  // Multi select behavior when pressing Shift + ArrowUp
164
162
  // Toggles the selection state of the previous item
165
- if (params.multiSelect && event.shiftKey && canToggleItemSelection(previousItem)) {
163
+ if (isMultiSelectEnabled && event.shiftKey && canToggleItemSelection(previousItem)) {
166
164
  instance.selectItemFromArrowNavigation(event, itemId, previousItem);
167
165
  }
168
166
  }
@@ -220,7 +218,7 @@ const useTreeViewKeyboardNavigation = ({
220
218
  {
221
219
  // Multi select behavior when pressing Ctrl + Shift + Home
222
220
  // Selects the focused item and all items up to the first item.
223
- if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
221
+ if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
224
222
  instance.selectRangeFromStartToItem(event, itemId);
225
223
  } else {
226
224
  instance.focusItem(event, (0, _tree.getFirstNavigableItem)(store.value));
@@ -234,7 +232,7 @@ const useTreeViewKeyboardNavigation = ({
234
232
  {
235
233
  // Multi select behavior when pressing Ctrl + Shirt + End
236
234
  // Selects the focused item and all the items down to the last item.
237
- if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
235
+ if (canToggleItemSelection(itemId) && isMultiSelectEnabled && ctrlPressed && event.shiftKey) {
238
236
  instance.selectRangeFromItemToEnd(event, itemId);
239
237
  } else {
240
238
  instance.focusItem(event, (0, _tree.getLastNavigableItem)(store.value));
@@ -253,7 +251,7 @@ const useTreeViewKeyboardNavigation = ({
253
251
 
254
252
  // Multi select behavior when pressing Ctrl + a
255
253
  // Selects all the items
256
- case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && params.multiSelect && !params.disableSelection:
254
+ case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && isMultiSelectEnabled && (0, _useTreeViewSelection.selectorIsSelectionEnabled)(store.value):
257
255
  {
258
256
  instance.selectAllNavigableItems(event);
259
257
  event.preventDefault();
@@ -5,8 +5,6 @@ import { UseTreeViewSelectionSignature } from "../useTreeViewSelection/index.js"
5
5
  import { UseTreeViewFocusSignature } from "../useTreeViewFocus/index.js";
6
6
  import { UseTreeViewExpansionSignature } from "../useTreeViewExpansion/index.js";
7
7
  import { TreeViewItemId, TreeViewCancellableEvent } from "../../../models/index.js";
8
- import { UseTreeViewLabelSignature } from "../useTreeViewLabel/index.js";
9
- import { UseTreeViewLazyLoadingSignature } from "../useTreeViewLazyLoading/index.js";
10
8
  export interface UseTreeViewKeyboardNavigationInstance {
11
9
  /**
12
10
  * Updates the `firstCharMap` to add/remove the first character of some item's labels.
@@ -26,7 +24,6 @@ export interface UseTreeViewKeyboardNavigationInstance {
26
24
  export type UseTreeViewKeyboardNavigationSignature = TreeViewPluginSignature<{
27
25
  instance: UseTreeViewKeyboardNavigationInstance;
28
26
  dependencies: [UseTreeViewItemsSignature, UseTreeViewSelectionSignature, UseTreeViewFocusSignature, UseTreeViewExpansionSignature];
29
- optionalDependencies: [UseTreeViewLabelSignature, UseTreeViewLazyLoadingSignature];
30
27
  }>;
31
28
  export type TreeViewFirstCharMap = {
32
29
  [itemId: string]: string;
@@ -13,33 +13,30 @@ const useTreeViewLabelItemPlugin = ({
13
13
  props
14
14
  }) => {
15
15
  const {
16
- store,
17
- label: {
18
- isItemEditable
19
- }
16
+ store
20
17
  } = (0, _TreeViewProvider.useTreeViewContext)();
21
18
  const {
22
19
  label,
23
20
  itemId
24
21
  } = props;
25
22
  const [labelInputValue, setLabelInputValue] = React.useState(label);
26
- const editable = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemEditable, {
27
- itemId,
28
- isItemEditable
29
- });
30
- const editing = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemBeingEdited, itemId);
23
+ const isItemEditable = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemEditable, itemId);
24
+ const isItemBeingEdited = (0, _useSelector.useSelector)(store, _useTreeViewLabel.selectorIsItemBeingEdited, itemId);
31
25
  React.useEffect(() => {
32
- if (!editing) {
26
+ if (!isItemBeingEdited) {
33
27
  setLabelInputValue(label);
34
28
  }
35
- }, [editing, label]);
29
+ }, [isItemBeingEdited, label]);
36
30
  return {
37
31
  propsEnhancers: {
32
+ label: () => ({
33
+ editable: isItemEditable
34
+ }),
38
35
  labelInput: ({
39
36
  externalEventHandlers,
40
37
  interactions
41
38
  }) => {
42
- if (!editable) {
39
+ if (!isItemEditable) {
43
40
  return {};
44
41
  }
45
42
  const handleKeydown = event => {
@@ -1,13 +1,12 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.useTreeViewLabel = void 0;
9
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var React = _interopRequireWildcard(require("react"));
9
+ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
11
10
  var _useTreeViewLabel = require("./useTreeViewLabel.itemPlugin");
12
11
  const useTreeViewLabel = ({
13
12
  store,
@@ -15,9 +14,9 @@ const useTreeViewLabel = ({
15
14
  }) => {
16
15
  const setEditedItemId = editedItemId => {
17
16
  store.update(prevState => (0, _extends2.default)({}, prevState, {
18
- label: {
17
+ label: (0, _extends2.default)({}, prevState.label, {
19
18
  editedItemId
20
- }
19
+ })
21
20
  }));
22
21
  };
23
22
  const updateItemLabel = (itemId, label) => {
@@ -43,11 +42,14 @@ const useTreeViewLabel = ({
43
42
  params.onItemLabelChange(itemId, label);
44
43
  }
45
44
  };
46
- const pluginContextValue = React.useMemo(() => ({
47
- label: {
48
- isItemEditable: params.isItemEditable
49
- }
50
- }), [params.isItemEditable]);
45
+ (0, _useEnhancedEffect.default)(() => {
46
+ const isItemEditable = params.isItemEditable;
47
+ store.update(prevState => (0, _extends2.default)({}, prevState, {
48
+ label: (0, _extends2.default)({}, prevState.label, {
49
+ isItemEditable: typeof isItemEditable === 'boolean' ? () => isItemEditable : isItemEditable
50
+ })
51
+ }));
52
+ }, [store, params.isItemEditable]);
51
53
  return {
52
54
  instance: {
53
55
  setEditedItemId,
@@ -55,8 +57,7 @@ const useTreeViewLabel = ({
55
57
  },
56
58
  publicAPI: {
57
59
  updateItemLabel
58
- },
59
- contextValue: pluginContextValue
60
+ }
60
61
  };
61
62
  };
62
63
  exports.useTreeViewLabel = useTreeViewLabel;
@@ -66,8 +67,11 @@ useTreeViewLabel.getDefaultizedParams = ({
66
67
  }) => (0, _extends2.default)({}, params, {
67
68
  isItemEditable: params.isItemEditable ?? false
68
69
  });
69
- useTreeViewLabel.getInitialState = () => ({
70
+ useTreeViewLabel.getInitialState = ({
71
+ isItemEditable
72
+ }) => ({
70
73
  label: {
74
+ isItemEditable: typeof isItemEditable === 'boolean' ? () => isItemEditable : isItemEditable,
71
75
  editedItemId: null
72
76
  }
73
77
  });
@@ -3,36 +3,28 @@ import { TreeViewRootSelector } from "../../utils/selectors.js";
3
3
  /**
4
4
  * Check if an item is editable.
5
5
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
6
- * @param {object} params The parameters.
7
- * @param {TreeViewItemId} params.itemId The id of the item to check.
8
- * @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
6
+ * @param {TreeViewItemId} itemId The id of the item to check.
9
7
  * @returns {boolean} `true` if the item is editable, `false` otherwise.
10
8
  */
11
- export declare const selectorIsItemEditable: ((state: any, args: any) => boolean) & {
9
+ export declare const selectorIsItemEditable: ((state: any, itemId: string) => boolean) & {
12
10
  clearCache: () => void;
13
11
  resultsCount: () => number;
14
12
  resetResultsCount: () => void;
15
13
  } & {
16
14
  resultFunc: (resultFuncArgs_0: {
17
- itemId: string;
18
- isItemEditable: ((item: any) => boolean) | boolean;
19
- }, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean;
15
+ isItemEditable: (item: any) => boolean;
16
+ editedItemId: string | null;
17
+ } | undefined, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean;
20
18
  memoizedResultFunc: ((resultFuncArgs_0: {
21
- itemId: string;
22
- isItemEditable: ((item: any) => boolean) | boolean;
23
- }, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean) & {
19
+ isItemEditable: (item: any) => boolean;
20
+ editedItemId: string | null;
21
+ } | undefined, resultFuncArgs_1: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>) => boolean) & {
24
22
  clearCache: () => void;
25
23
  resultsCount: () => number;
26
24
  resetResultsCount: () => void;
27
25
  };
28
26
  lastResult: () => boolean;
29
- dependencies: [(_: any, args: {
30
- itemId: string;
31
- isItemEditable: ((item: any) => boolean) | boolean;
32
- }) => {
33
- itemId: string;
34
- isItemEditable: ((item: any) => boolean) | boolean;
35
- }, (state: any, args: any) => import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>];
27
+ dependencies: [TreeViewRootSelector<UseTreeViewLabelSignature, true>, (state: any, itemId: string) => import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>];
36
28
  recomputations: () => number;
37
29
  resetRecomputations: () => void;
38
30
  dependencyRecomputations: () => number;
@@ -53,17 +45,19 @@ export declare const selectorIsItemBeingEdited: ((state: any, itemId: string) =>
53
45
  resetResultsCount: () => void;
54
46
  } & {
55
47
  resultFunc: (resultFuncArgs_0: {
48
+ isItemEditable: (item: any) => boolean;
56
49
  editedItemId: string | null;
57
- }, resultFuncArgs_1: string) => boolean;
50
+ } | undefined, resultFuncArgs_1: string) => boolean;
58
51
  memoizedResultFunc: ((resultFuncArgs_0: {
52
+ isItemEditable: (item: any) => boolean;
59
53
  editedItemId: string | null;
60
- }, resultFuncArgs_1: string) => boolean) & {
54
+ } | undefined, resultFuncArgs_1: string) => boolean) & {
61
55
  clearCache: () => void;
62
56
  resultsCount: () => number;
63
57
  resetResultsCount: () => void;
64
58
  };
65
59
  lastResult: () => boolean;
66
- dependencies: [TreeViewRootSelector<UseTreeViewLabelSignature>, (_: any, itemId: string) => string];
60
+ dependencies: [TreeViewRootSelector<UseTreeViewLabelSignature, true>, (_: any, itemId: string) => string];
67
61
  recomputations: () => number;
68
62
  resetRecomputations: () => void;
69
63
  dependencyRecomputations: () => number;
@@ -11,16 +11,14 @@ const selectorTreeViewLabelState = state => state.label;
11
11
  /**
12
12
  * Check if an item is editable.
13
13
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
14
- * @param {object} params The parameters.
15
- * @param {TreeViewItemId} params.itemId The id of the item to check.
16
- * @param {((item: any) => boolean) | boolean} params.isItemEditable The function to determine if an item is editable.
14
+ * @param {TreeViewItemId} itemId The id of the item to check.
17
15
  * @returns {boolean} `true` if the item is editable, `false` otherwise.
18
16
  */
19
- const selectorIsItemEditable = exports.selectorIsItemEditable = (0, _selectors.createSelector)([(_, args) => args, (state, args) => (0, _useTreeViewItems.selectorItemModel)(state, args.itemId)], (args, itemModel) => {
20
- if (!itemModel || !args.isItemEditable) {
17
+ const selectorIsItemEditable = exports.selectorIsItemEditable = (0, _selectors.createSelector)([selectorTreeViewLabelState, (state, itemId) => (0, _useTreeViewItems.selectorItemModel)(state, itemId)], (labelState, itemModel) => {
18
+ if (!itemModel || !labelState) {
21
19
  return false;
22
20
  }
23
- return typeof args.isItemEditable === 'function' ? args.isItemEditable(itemModel) : true;
21
+ return labelState.isItemEditable(itemModel);
24
22
  });
25
23
 
26
24
  /**
@@ -29,4 +27,4 @@ const selectorIsItemEditable = exports.selectorIsItemEditable = (0, _selectors.c
29
27
  * @param {TreeViewItemId} itemId The id of the item to check.
30
28
  * @returns {boolean} `true` if the item is being edited, `false` otherwise.
31
29
  */
32
- const selectorIsItemBeingEdited = exports.selectorIsItemBeingEdited = (0, _selectors.createSelector)([selectorTreeViewLabelState, (_, itemId) => itemId], (labelState, itemId) => labelState.editedItemId === itemId);
30
+ const selectorIsItemBeingEdited = exports.selectorIsItemBeingEdited = (0, _selectors.createSelector)([selectorTreeViewLabelState, (_, itemId) => itemId], (labelState, itemId) => labelState?.editedItemId === itemId);
@@ -38,22 +38,23 @@ export interface UseTreeViewLabelParameters<R extends {}> {
38
38
  export type UseTreeViewLabelDefaultizedParameters<R extends {}> = DefaultizedProps<UseTreeViewLabelParameters<R>, 'isItemEditable'>;
39
39
  export interface UseTreeViewLabelState {
40
40
  label: {
41
+ isItemEditable: (item: any) => boolean;
41
42
  editedItemId: string | null;
42
43
  };
43
44
  }
44
- export interface UseTreeViewLabelContextValue {
45
- label: Pick<UseTreeViewLabelDefaultizedParameters<any>, 'isItemEditable'>;
46
- }
47
45
  export type UseTreeViewLabelSignature = TreeViewPluginSignature<{
48
46
  params: UseTreeViewLabelParameters<any>;
49
47
  defaultizedParams: UseTreeViewLabelDefaultizedParameters<any>;
50
48
  publicAPI: UseTreeViewLabelPublicAPI;
51
49
  instance: UseTreeViewLabelInstance;
52
50
  state: UseTreeViewLabelState;
53
- contextValue: UseTreeViewLabelContextValue;
54
51
  dependencies: [UseTreeViewItemsSignature];
55
52
  }>;
56
53
  export interface UseTreeItemLabelInputSlotPropsFromLabelEditing extends TreeItemLabelInputProps {}
54
+ export interface UseTreeItemLabelSlotPropsFromLabelEditing {
55
+ editable?: boolean;
56
+ }
57
57
  declare module '@mui/x-tree-view/useTreeItem' {
58
58
  interface UseTreeItemLabelInputSlotOwnProps extends UseTreeItemLabelInputSlotPropsFromLabelEditing {}
59
+ interface UseTreeItemLabelSlotOwnProps extends UseTreeItemLabelSlotPropsFromLabelEditing {}
59
60
  }
@@ -1,7 +1,5 @@
1
- import { TreeViewAnyPluginSignature, TreeViewState } from "../../models/index.js";
2
1
  import { TreeViewRootSelector, TreeViewRootSelectorForOptionalPlugin } from "../../utils/selectors.js";
3
2
  import { UseTreeViewLazyLoadingSignature } from "./useTreeViewLazyLoading.types.js";
4
- export type Temp<TSignature extends TreeViewAnyPluginSignature> = <TSignatures extends [], TOptionalSignatures extends [TSignature]>(state: TreeViewState<TSignatures, TOptionalSignatures>) => TSignature['state'][keyof TSignature['state']];
5
3
  export declare const selectorDataSourceState: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewLazyLoading.types").UseTreeViewLazyLoadingState & Partial<{}> & {
6
4
  cacheKey: import("../../models").TreeViewStateCacheKey;
7
5
  }) => {