@mui/x-tree-view 8.21.0 → 8.23.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 (80) hide show
  1. package/CHANGELOG.md +339 -1
  2. package/RichTreeView/RichTreeView.js +8 -1
  3. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  4. package/SimpleTreeView/SimpleTreeView.js +1 -1
  5. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  6. package/SimpleTreeView/SimpleTreeView.types.d.ts +1 -1
  7. package/TreeItem/TreeItem.js +9 -2
  8. package/esm/RichTreeView/RichTreeView.js +8 -1
  9. package/esm/RichTreeView/RichTreeView.types.d.ts +1 -1
  10. package/esm/SimpleTreeView/SimpleTreeView.js +1 -1
  11. package/esm/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  12. package/esm/SimpleTreeView/SimpleTreeView.types.d.ts +1 -1
  13. package/esm/TreeItem/TreeItem.js +9 -2
  14. package/esm/hooks/index.d.ts +4 -2
  15. package/esm/hooks/index.js +4 -2
  16. package/esm/hooks/useApplyPropagationToSelectedItemsOnMount.js +1 -1
  17. package/esm/hooks/useRichTreeViewApiRef.d.ts +8 -0
  18. package/esm/hooks/useRichTreeViewApiRef.js +7 -0
  19. package/esm/hooks/useSimpleTreeViewApiRef.d.ts +8 -0
  20. package/esm/hooks/useSimpleTreeViewApiRef.js +7 -0
  21. package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +1 -1
  22. package/esm/hooks/useTreeViewApiRef.d.ts +1 -0
  23. package/esm/hooks/useTreeViewApiRef.js +1 -0
  24. package/esm/index.js +1 -1
  25. package/esm/internals/models/treeView.d.ts +1 -0
  26. package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -6
  27. package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
  28. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +13 -8
  29. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +4 -0
  30. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +5 -1
  31. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -0
  32. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  33. package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -0
  34. package/esm/internals/plugins/useTreeViewJSXItems/itemPlugin.js +6 -4
  35. package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +3 -3
  36. package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +4 -4
  37. package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
  38. package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +2 -2
  39. package/esm/internals/plugins/useTreeViewSelection/itemPlugin.js +5 -5
  40. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -2
  41. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +6 -1
  42. package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +7 -2
  43. package/esm/internals/useTreeView/useTreeView.js +2 -2
  44. package/esm/models/items.d.ts +4 -1
  45. package/esm/useTreeItem/useTreeItem.js +1 -1
  46. package/esm/useTreeItem/useTreeItem.types.d.ts +5 -0
  47. package/hooks/index.d.ts +4 -2
  48. package/hooks/index.js +16 -2
  49. package/hooks/useApplyPropagationToSelectedItemsOnMount.js +1 -1
  50. package/hooks/useRichTreeViewApiRef.d.ts +8 -0
  51. package/hooks/useRichTreeViewApiRef.js +14 -0
  52. package/hooks/useSimpleTreeViewApiRef.d.ts +8 -0
  53. package/hooks/useSimpleTreeViewApiRef.js +14 -0
  54. package/hooks/useTreeItemUtils/useTreeItemUtils.js +1 -1
  55. package/hooks/useTreeViewApiRef.d.ts +1 -0
  56. package/hooks/useTreeViewApiRef.js +1 -0
  57. package/index.js +1 -1
  58. package/internals/models/treeView.d.ts +1 -0
  59. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -6
  60. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
  61. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +13 -8
  62. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +4 -0
  63. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +5 -1
  64. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -0
  65. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
  66. package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -0
  67. package/internals/plugins/useTreeViewJSXItems/itemPlugin.js +6 -4
  68. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +3 -3
  69. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +4 -4
  70. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
  71. package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +2 -2
  72. package/internals/plugins/useTreeViewSelection/itemPlugin.js +5 -5
  73. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -2
  74. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +6 -1
  75. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +7 -2
  76. package/internals/useTreeView/useTreeView.js +2 -2
  77. package/models/items.d.ts +4 -1
  78. package/package.json +3 -3
  79. package/useTreeItem/useTreeItem.js +1 -1
  80. package/useTreeItem/useTreeItem.types.d.ts +5 -0
@@ -7,8 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.useTreeViewExpansion = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _useAssertModelConsistency = require("@mui/x-internals/useAssertModelConsistency");
10
- var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
11
- var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
10
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
11
+ var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
12
12
  var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
13
13
  var _useTreeViewExpansion2 = require("./useTreeViewExpansion.utils");
14
14
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
@@ -44,10 +44,10 @@ const useTreeViewExpansion = ({
44
44
  }
45
45
  params.onExpandedItemsChange?.(event, value);
46
46
  };
47
- const resetItemExpansion = (0, _useEventCallback.useEventCallback)(() => {
47
+ const resetItemExpansion = (0, _useStableCallback.useStableCallback)(() => {
48
48
  setExpandedItems(null, []);
49
49
  });
50
- const applyItemExpansion = (0, _useEventCallback.useEventCallback)(({
50
+ const applyItemExpansion = (0, _useStableCallback.useStableCallback)(({
51
51
  itemId,
52
52
  event,
53
53
  shouldBeExpanded
@@ -64,7 +64,7 @@ const useTreeViewExpansion = ({
64
64
  }
65
65
  setExpandedItems(event, newExpanded);
66
66
  });
67
- const setItemExpansion = (0, _useEventCallback.useEventCallback)(({
67
+ const setItemExpansion = (0, _useStableCallback.useStableCallback)(({
68
68
  itemId,
69
69
  event = null,
70
70
  shouldBeExpanded
@@ -90,7 +90,7 @@ const useTreeViewExpansion = ({
90
90
  shouldBeExpanded: cleanShouldBeExpanded
91
91
  });
92
92
  });
93
- const isItemExpanded = (0, _useEventCallback.useEventCallback)(itemId => {
93
+ const isItemExpanded = (0, _useStableCallback.useStableCallback)(itemId => {
94
94
  return _useTreeViewExpansion.expansionSelectors.isItemExpanded(store.state, itemId);
95
95
  });
96
96
  const expandAllSiblings = (event, itemId) => {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.useTreeViewFocus = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
9
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
10
10
  var _store = require("@mui/x-internals/store");
11
11
  var _useTreeViewFocus = require("./useTreeViewFocus.selectors");
12
12
  var _useTreeViewExpansion = require("../useTreeViewExpansion/useTreeViewExpansion.selectors");
@@ -16,7 +16,7 @@ const useTreeViewFocus = ({
16
16
  params,
17
17
  store
18
18
  }) => {
19
- const setFocusedItemId = (0, _useEventCallback.useEventCallback)(itemId => {
19
+ const setFocusedItemId = (0, _useStableCallback.useStableCallback)(itemId => {
20
20
  const focusedItemId = _useTreeViewFocus.focusSelectors.focusedItemId(store.state);
21
21
  if (focusedItemId === itemId) {
22
22
  return;
@@ -39,13 +39,13 @@ const useTreeViewFocus = ({
39
39
  params.onItemFocus(event, itemId);
40
40
  }
41
41
  };
42
- const focusItem = (0, _useEventCallback.useEventCallback)((event, itemId) => {
42
+ const focusItem = (0, _useStableCallback.useStableCallback)((event, itemId) => {
43
43
  // If we receive an itemId, and it is visible, the focus will be set to it
44
44
  if (isItemVisible(itemId)) {
45
45
  innerFocusItem(event, itemId);
46
46
  }
47
47
  });
48
- const removeFocusedItem = (0, _useEventCallback.useEventCallback)(() => {
48
+ const removeFocusedItem = (0, _useStableCallback.useStableCallback)(() => {
49
49
  const focusedItemId = _useTreeViewFocus.focusSelectors.focusedItemId(store.state);
50
50
  if (focusedItemId == null) {
51
51
  return;
@@ -9,13 +9,14 @@ Object.defineProperty(exports, "__esModule", {
9
9
  exports.useTreeViewItems = void 0;
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
- var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
12
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
13
13
  var _useTreeViewItems = require("./useTreeViewItems.utils");
14
14
  var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
15
15
  var _useTreeViewItems2 = require("./useTreeViewItems.selectors");
16
16
  var _useTreeViewId = require("../../corePlugins/useTreeViewId");
17
17
  var _useTreeViewId2 = require("../../corePlugins/useTreeViewId/useTreeViewId.utils");
18
18
  var _jsxRuntime = require("react/jsx-runtime");
19
+ const defaultIsItemSelectionDisabled = item => item.disableSelection === true;
19
20
  const useTreeViewItems = ({
20
21
  instance,
21
22
  params,
@@ -23,16 +24,17 @@ const useTreeViewItems = ({
23
24
  }) => {
24
25
  const itemsConfig = React.useMemo(() => ({
25
26
  isItemDisabled: params.isItemDisabled,
27
+ isItemSelectionDisabled: params.isItemSelectionDisabled,
26
28
  getItemLabel: params.getItemLabel,
27
29
  getItemChildren: params.getItemChildren,
28
30
  getItemId: params.getItemId
29
- }), [params.isItemDisabled, params.getItemLabel, params.getItemChildren, params.getItemId]);
31
+ }), [params.isItemDisabled, params.isItemSelectionDisabled, params.getItemLabel, params.getItemChildren, params.getItemId]);
30
32
  const getItem = React.useCallback(itemId => _useTreeViewItems2.itemsSelectors.itemModel(store.state, itemId), [store]);
31
33
  const getParentId = React.useCallback(itemId => {
32
34
  const itemMeta = _useTreeViewItems2.itemsSelectors.itemMeta(store.state, itemId);
33
35
  return itemMeta?.parentId || null;
34
36
  }, [store]);
35
- const setIsItemDisabled = (0, _useEventCallback.useEventCallback)(({
37
+ const setIsItemDisabled = (0, _useStableCallback.useStableCallback)(({
36
38
  itemId,
37
39
  shouldBeDisabled
38
40
  }) => {
@@ -111,7 +113,7 @@ const useTreeViewItems = ({
111
113
  };
112
114
  store.set('items', (0, _extends2.default)({}, store.state.items, lookups));
113
115
  };
114
- const removeChildren = (0, _useEventCallback.useEventCallback)(parentId => {
116
+ const removeChildren = (0, _useStableCallback.useStableCallback)(parentId => {
115
117
  const newMetaMap = Object.keys(store.state.items.itemMetaLookup).reduce((acc, key) => {
116
118
  const item = store.state.items.itemMetaLookup[key];
117
119
  if (item.parentId === parentId) {
@@ -132,7 +134,7 @@ const useTreeViewItems = ({
132
134
  itemChildrenIndexesLookup: newItemChildrenIndexesLookup
133
135
  }));
134
136
  });
135
- const addExpandableItems = (0, _useEventCallback.useEventCallback)(items => {
137
+ const addExpandableItems = (0, _useStableCallback.useStableCallback)(items => {
136
138
  const newItemMetaLookup = (0, _extends2.default)({}, store.state.items.itemMetaLookup);
137
139
  for (const itemId of items) {
138
140
  newItemMetaLookup[itemId] = (0, _extends2.default)({}, newItemMetaLookup[itemId], {
@@ -155,8 +157,8 @@ const useTreeViewItems = ({
155
157
  store.set('items', (0, _extends2.default)({}, store.state.items, newState));
156
158
  }, [instance, store, params.items, params.disabledItemsFocusable, itemsConfig]);
157
159
 
158
- // Wrap `props.onItemClick` with `useEventCallback` to prevent unneeded context updates.
159
- const handleItemClick = (0, _useEventCallback.useEventCallback)((event, itemId) => {
160
+ // Wrap `props.onItemClick` with `useStableCallback` to prevent unneeded context updates.
161
+ const handleItemClick = (0, _useStableCallback.useStableCallback)((event, itemId) => {
160
162
  if (params.onItemClick) {
161
163
  params.onItemClick(event, itemId);
162
164
  }
@@ -193,6 +195,7 @@ useTreeViewItems.getInitialState = params => ({
193
195
  disabledItemsFocusable: params.disabledItemsFocusable,
194
196
  config: {
195
197
  isItemDisabled: params.isItemDisabled,
198
+ isItemSelectionDisabled: params.isItemSelectionDisabled,
196
199
  getItemId: params.getItemId,
197
200
  getItemLabel: params.getItemLabel,
198
201
  getItemChildren: params.getItemChildren
@@ -203,7 +206,8 @@ useTreeViewItems.applyDefaultValuesToParams = ({
203
206
  params
204
207
  }) => (0, _extends2.default)({}, params, {
205
208
  disabledItemsFocusable: params.disabledItemsFocusable ?? false,
206
- itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
209
+ itemChildrenIndentation: params.itemChildrenIndentation ?? '12px',
210
+ isItemSelectionDisabled: params.isItemSelectionDisabled ?? defaultIsItemSelectionDisabled
207
211
  });
208
212
  useTreeViewItems.wrapRoot = ({
209
213
  children
@@ -218,6 +222,7 @@ useTreeViewItems.params = {
218
222
  disabledItemsFocusable: true,
219
223
  items: true,
220
224
  isItemDisabled: true,
225
+ isItemSelectionDisabled: true,
221
226
  getItemLabel: true,
222
227
  getItemChildren: true,
223
228
  getItemId: true,
@@ -53,4 +53,8 @@ export declare const itemsSelectors: {
53
53
  * Checks whether an item can be focused.
54
54
  */
55
55
  canItemBeFocused: (state: TreeViewState<[UseTreeViewItemsSignature]>, itemId: string) => boolean;
56
+ /**
57
+ * Checks whether an item is selectable based on the `isItemSelectionDisabled` prop.
58
+ */
59
+ isItemSelectable: (state: TreeViewState<[UseTreeViewItemsSignature]>, itemId: string) => boolean;
56
60
  };
@@ -62,5 +62,9 @@ const itemsSelectors = exports.itemsSelectors = {
62
62
  /**
63
63
  * Checks whether an item can be focused.
64
64
  */
65
- canItemBeFocused: (0, _store.createSelector)((state, itemId) => state.items.disabledItemsFocusable || !(0, _useTreeViewItems.isItemDisabled)(state.items.itemMetaLookup, itemId))
65
+ canItemBeFocused: (0, _store.createSelector)((state, itemId) => state.items.disabledItemsFocusable || !(0, _useTreeViewItems.isItemDisabled)(state.items.itemMetaLookup, itemId)),
66
+ /**
67
+ * Checks whether an item is selectable based on the `isItemSelectionDisabled` prop.
68
+ */
69
+ isItemSelectable: (0, _store.createSelector)((state, itemId) => state.items.itemMetaLookup[itemId]?.selectable ?? true)
66
70
  };
@@ -100,6 +100,13 @@ export interface UseTreeViewItemsParameters<R extends {
100
100
  * @returns {boolean} `true` if the item should be disabled.
101
101
  */
102
102
  isItemDisabled?: (item: R) => boolean;
103
+ /**
104
+ * Used to determine if a given item should have selection disabled.
105
+ * @template R
106
+ * @param {R} item The item to check.
107
+ * @returns {boolean} `true` if the item should have selection disabled.
108
+ */
109
+ isItemSelectionDisabled?: (item: R) => boolean;
103
110
  /**
104
111
  * Used to determine the string label for a given item.
105
112
  *
@@ -45,5 +45,5 @@ interface BuildItemsLookupsParameters {
45
45
  [itemId: string]: TreeViewItemMeta;
46
46
  };
47
47
  }
48
- export interface BuildItemsLookupConfig extends Pick<UseTreeViewItemsParametersWithDefaults<TreeViewBaseItem>, 'isItemDisabled' | 'getItemLabel' | 'getItemChildren' | 'getItemId'> {}
48
+ export interface BuildItemsLookupConfig extends Pick<UseTreeViewItemsParametersWithDefaults<TreeViewBaseItem>, 'isItemDisabled' | 'isItemSelectionDisabled' | 'getItemLabel' | 'getItemChildren' | 'getItemId'> {}
49
49
  export {};
@@ -131,6 +131,7 @@ function buildItemsLookups(parameters) {
131
131
  idAttribute: undefined,
132
132
  expandable: isItemExpandable(item, children),
133
133
  disabled: config.isItemDisabled ? config.isItemDisabled(item) : false,
134
+ selectable: config.isItemSelectionDisabled ? !config.isItemSelectionDisabled(item) : true,
134
135
  depth
135
136
  };
136
137
  orderedChildrenIds.push(id);
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.useTreeViewJSXItemsItemPlugin = void 0;
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _store = require("@mui/x-internals/store");
11
- var _useMergedRefs = require("@base-ui-components/utils/useMergedRefs");
12
- var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
11
+ var _useMergedRefs = require("@base-ui/utils/useMergedRefs");
12
+ var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
13
13
  var _TreeViewProvider = require("../../TreeViewProvider");
14
14
  var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
15
15
  var _useTreeItemUtils = require("../../../hooks/useTreeItemUtils/useTreeItemUtils");
@@ -27,6 +27,7 @@ const useTreeViewJSXItemsItemPlugin = ({
27
27
  const {
28
28
  children,
29
29
  disabled = false,
30
+ disableSelection = false,
30
31
  label,
31
32
  itemId,
32
33
  id
@@ -64,9 +65,10 @@ const useTreeViewJSXItemsItemPlugin = ({
64
65
  idAttribute: id,
65
66
  parentId,
66
67
  expandable,
67
- disabled
68
+ disabled,
69
+ selectable: !disableSelection
68
70
  });
69
- }, [instance, parentId, itemId, expandable, disabled, id]);
71
+ }, [instance, parentId, itemId, expandable, disabled, disableSelection, id]);
70
72
  React.useEffect(() => {
71
73
  if (label) {
72
74
  return instance.mapLabelFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').toLowerCase());
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "__esModule", {
9
9
  exports.useTreeViewJSXItems = void 0;
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
- var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
12
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
13
13
  var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
14
14
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.utils");
15
15
  var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
@@ -20,7 +20,7 @@ const useTreeViewJSXItems = ({
20
20
  store
21
21
  }) => {
22
22
  instance.preventItemUpdates();
23
- const insertJSXItem = (0, _useEventCallback.useEventCallback)(item => {
23
+ const insertJSXItem = (0, _useStableCallback.useStableCallback)(item => {
24
24
  if (store.state.items.itemMetaLookup[item.id] != null) {
25
25
  throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${item.id}"`].join('\n'));
26
26
  }
@@ -58,7 +58,7 @@ const useTreeViewJSXItems = ({
58
58
  })
59
59
  }));
60
60
  };
61
- const mapLabelFromJSX = (0, _useEventCallback.useEventCallback)((itemId, label) => {
61
+ const mapLabelFromJSX = (0, _useStableCallback.useStableCallback)((itemId, label) => {
62
62
  instance.updateLabelMap(labelMap => {
63
63
  labelMap[itemId] = label;
64
64
  return labelMap;
@@ -9,8 +9,8 @@ exports.useTreeViewKeyboardNavigation = void 0;
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _store = require("@mui/x-internals/store");
11
11
  var _RtlProvider = require("@mui/system/RtlProvider");
12
- var _useTimeout = require("@base-ui-components/utils/useTimeout");
13
- var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
12
+ var _useTimeout = require("@base-ui/utils/useTimeout");
13
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
14
14
  var _tree = require("../../utils/tree");
15
15
  var _plugins = require("../../utils/plugins");
16
16
  var _useTreeViewLabel = require("../useTreeViewLabel");
@@ -31,7 +31,7 @@ const useTreeViewKeyboardNavigation = ({
31
31
  const labelMap = React.useRef({});
32
32
  const typeaheadQueryRef = React.useRef('');
33
33
  const typeaheadTimeout = (0, _useTimeout.useTimeout)();
34
- const updateLabelMap = (0, _useEventCallback.useEventCallback)(callback => {
34
+ const updateLabelMap = (0, _useStableCallback.useStableCallback)(callback => {
35
35
  labelMap.current = callback(labelMap.current);
36
36
  });
37
37
  const itemMetaLookup = (0, _store.useStore)(store, _useTreeViewItems.itemsSelectors.itemMetaLookup);
@@ -91,7 +91,7 @@ const useTreeViewKeyboardNavigation = ({
91
91
  typeaheadQueryRef.current = '';
92
92
  return null;
93
93
  };
94
- const canToggleItemSelection = itemId => _useTreeViewSelection.selectionSelectors.enabled(store.state) && !_useTreeViewItems.itemsSelectors.isItemDisabled(store.state, itemId);
94
+ const canToggleItemSelection = itemId => _useTreeViewSelection.selectionSelectors.canItemBeSelected(store.state, itemId);
95
95
  const canToggleItemExpansion = itemId => {
96
96
  return !_useTreeViewItems.itemsSelectors.isItemDisabled(store.state, itemId) && _useTreeViewExpansion.expansionSelectors.isItemExpandable(store.state, itemId);
97
97
  };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.useTreeViewLabel = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
9
+ var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
10
10
  var _itemPlugin = require("./itemPlugin");
11
11
  var _useTreeViewLabel = require("./useTreeViewLabel.selectors");
12
12
  const useTreeViewLabel = ({
@@ -30,10 +30,10 @@ export interface UseTreeViewLazyLoadingPublicAPI {
30
30
  * Method used for updating an item's children.
31
31
  * Only relevant for lazy-loaded tree views.
32
32
  *
33
- * @param {TreeViewItemId} itemId The The id of the item to update the children of.
33
+ * @param {TreeViewItemId | null} itemId The id of the item to update the children of. If null is passed, it will update the root's children.
34
34
  * @returns {Promise<void>} The promise resolved when the items are fetched.
35
35
  */
36
- updateItemChildren: (itemId: TreeViewItemId) => Promise<void>;
36
+ updateItemChildren: (itemId: TreeViewItemId | null) => Promise<void>;
37
37
  }
38
38
  export interface UseTreeViewLazyLoadingInstance extends UseTreeViewLazyLoadingPublicAPI {
39
39
  /**
@@ -50,9 +50,9 @@ const useTreeViewSelectionItemPlugin = ({
50
50
  store
51
51
  } = (0, _TreeViewProvider.useTreeViewContext)();
52
52
  const isCheckboxSelectionEnabled = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.isCheckboxSelectionEnabled);
53
- const isItemSelectionEnabled = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
53
+ const isFeatureEnabledForItem = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.isFeatureEnabledForItem, itemId);
54
+ const canItemBeSelected = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
54
55
  const selectionStatus = (0, _store.useStore)(store, selectorCheckboxSelectionStatus, itemId);
55
- const isSelectionEnabledForItem = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
56
56
  return {
57
57
  propsEnhancers: {
58
58
  root: () => {
@@ -63,7 +63,7 @@ const useTreeViewSelectionItemPlugin = ({
63
63
  ariaChecked = true;
64
64
  } else if (selectionStatus === 'indeterminate') {
65
65
  ariaChecked = 'mixed';
66
- } else if (!isSelectionEnabledForItem) {
66
+ } else if (!canItemBeSelected) {
67
67
  // - if the tree contains nodes that are not selectable, aria-checked is not present on those nodes.
68
68
  ariaChecked = undefined;
69
69
  } else {
@@ -91,8 +91,8 @@ const useTreeViewSelectionItemPlugin = ({
91
91
  return {
92
92
  tabIndex: -1,
93
93
  onChange: handleChange,
94
- visible: isCheckboxSelectionEnabled,
95
- disabled: !isItemSelectionEnabled,
94
+ visible: isCheckboxSelectionEnabled && isFeatureEnabledForItem,
95
+ disabled: !canItemBeSelected,
96
96
  checked: selectionStatus === 'checked',
97
97
  indeterminate: selectionStatus === 'indeterminate'
98
98
  };
@@ -9,10 +9,11 @@ exports.useTreeViewSelection = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _useAssertModelConsistency = require("@mui/x-internals/useAssertModelConsistency");
12
- var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
12
+ var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
13
13
  var _tree = require("../../utils/tree");
14
14
  var _useTreeViewSelection = require("./useTreeViewSelection.utils");
15
15
  var _useTreeViewSelection2 = require("./useTreeViewSelection.selectors");
16
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
16
17
  var _itemPlugin = require("./itemPlugin");
17
18
  const useTreeViewSelection = ({
18
19
  store,
@@ -123,7 +124,7 @@ const useTreeViewSelection = ({
123
124
 
124
125
  // Add to the model the items that are part of the new range and not already part of the model.
125
126
  const selectedItemsLookup = (0, _useTreeViewSelection.getLookupFromArray)(newSelectedItems);
126
- const range = (0, _tree.getNonDisabledItemsInRange)(store.state, start, end);
127
+ const range = (0, _tree.getNonDisabledItemsInRange)(store.state, start, end).filter(id => _useTreeViewItems.itemsSelectors.isItemSelectable(store.state, id));
127
128
  const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
128
129
  newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
129
130
  setSelectedItems(event, newSelectedItems);
@@ -34,7 +34,12 @@ export declare const selectionSelectors: {
34
34
  */
35
35
  isItemSelected: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, itemId: string) => boolean;
36
36
  /**
37
- * Checks whether an item can be selected (if selection is enabled and if the item is not disabled).
37
+ * Checks whether the selection feature is enabled for an item.
38
+ * Returns `true` when selection is enabled on the Tree View and the item is selectable (even if the item is disabled).
39
+ */
40
+ isFeatureEnabledForItem: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, _itemId: string) => boolean;
41
+ /**
42
+ * Checks whether an item can be selected (if selection is enabled, if the item is not disabled, and if the item is selectable).
38
43
  */
39
44
  canItemBeSelected: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, _itemId: string) => boolean;
40
45
  };
@@ -56,7 +56,12 @@ const selectionSelectors = exports.selectionSelectors = {
56
56
  */
57
57
  isItemSelected: (0, _store.createSelector)(selectedItemsMapSelector, (selectedItemsMap, itemId) => selectedItemsMap.has(itemId)),
58
58
  /**
59
- * Checks whether an item can be selected (if selection is enabled and if the item is not disabled).
59
+ * Checks whether the selection feature is enabled for an item.
60
+ * Returns `true` when selection is enabled on the Tree View and the item is selectable (even if the item is disabled).
60
61
  */
61
- canItemBeSelected: (0, _store.createSelector)(_useTreeViewItems.itemsSelectors.isItemDisabled, state => state.selection.isEnabled, (isItemDisabled, isSelectionEnabled, _itemId) => isSelectionEnabled && !isItemDisabled)
62
+ isFeatureEnabledForItem: (0, _store.createSelector)(_useTreeViewItems.itemsSelectors.isItemSelectable, state => state.selection.isEnabled, (isItemSelectable, isSelectionEnabled, _itemId) => isSelectionEnabled && isItemSelectable),
63
+ /**
64
+ * Checks whether an item can be selected (if selection is enabled, if the item is not disabled, and if the item is selectable).
65
+ */
66
+ canItemBeSelected: (0, _store.createSelector)(_useTreeViewItems.itemsSelectors.isItemDisabled, _useTreeViewItems.itemsSelectors.isItemSelectable, state => state.selection.isEnabled, (isItemDisabled, isItemSelectable, isSelectionEnabled, _itemId) => isSelectionEnabled && !isItemDisabled && isItemSelectable)
62
67
  };
@@ -9,9 +9,9 @@ exports.useTreeView = void 0;
9
9
  exports.useTreeViewApiInitialization = useTreeViewApiInitialization;
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
- var _useRefWithInit = require("@base-ui-components/utils/useRefWithInit");
12
+ var _useRefWithInit = require("@base-ui/utils/useRefWithInit");
13
13
  var _store = require("@mui/x-internals/store");
14
- var _useMergedRefs = require("@base-ui-components/utils/useMergedRefs");
14
+ var _useMergedRefs = require("@base-ui/utils/useMergedRefs");
15
15
  var _corePlugins = require("../corePlugins");
16
16
  var _useExtractPluginParamsFromProps = require("./useExtractPluginParamsFromProps");
17
17
  var _useTreeViewBuildContext = require("./useTreeViewBuildContext");
package/models/items.d.ts CHANGED
@@ -4,9 +4,12 @@ export type TreeViewDefaultItemModelProperties = {
4
4
  label: string;
5
5
  children?: TreeViewDefaultItemModelProperties[];
6
6
  };
7
- export type TreeViewBaseItem<R extends {} = TreeViewDefaultItemModelProperties> = R & {
7
+ export type TreeViewBaseItem<R extends object = TreeViewDefaultItemModelProperties> = R & {
8
8
  children?: TreeViewBaseItem<R>[];
9
9
  };
10
+ export type TreeViewValidItem<R extends object> = {
11
+ children?: R[];
12
+ };
10
13
  export type TreeViewItemsReorderingAction = 'reorder-above' | 'reorder-below' | 'make-child' | 'move-to-parent';
11
14
  export interface TreeViewSelectionPropagation {
12
15
  descendants?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "8.21.0",
3
+ "version": "8.23.0",
4
4
  "author": "MUI Team",
5
5
  "description": "The community edition of the MUI X Tree View components.",
6
6
  "license": "MIT",
@@ -32,13 +32,13 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@babel/runtime": "^7.28.4",
35
- "@base-ui-components/utils": "0.1.2",
35
+ "@base-ui/utils": "^0.2.3",
36
36
  "@mui/utils": "^7.3.5",
37
37
  "@types/react-transition-group": "^4.4.12",
38
38
  "clsx": "^2.1.1",
39
39
  "prop-types": "^15.8.1",
40
40
  "react-transition-group": "^4.4.5",
41
- "@mui/x-internals": "8.21.0"
41
+ "@mui/x-internals": "8.23.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@emotion/react": "^11.9.0",
@@ -11,7 +11,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _store = require("@mui/x-internals/store");
13
13
  var _extractEventHandlers = _interopRequireDefault(require("@mui/utils/extractEventHandlers"));
14
- var _useMergedRefs = require("@base-ui-components/utils/useMergedRefs");
14
+ var _useMergedRefs = require("@base-ui/utils/useMergedRefs");
15
15
  var _TreeViewProvider = require("../internals/TreeViewProvider");
16
16
  var _useTreeItemUtils = require("../hooks/useTreeItemUtils");
17
17
  var _TreeViewItemDepthContext = require("../internals/TreeViewItemDepthContext");
@@ -18,6 +18,11 @@ export interface UseTreeItemParameters {
18
18
  * @default false
19
19
  */
20
20
  disabled?: boolean;
21
+ /**
22
+ * If `true`, the item cannot be selected.
23
+ * @default false
24
+ */
25
+ disableSelection?: boolean;
21
26
  /**
22
27
  * The id of the item.
23
28
  * Must be unique.