@mui/x-tree-view 8.0.0-alpha.2 → 8.0.0-alpha.5

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 (28) hide show
  1. package/CHANGELOG.md +479 -0
  2. package/README.md +1 -1
  3. package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +4 -4
  4. package/index.js +1 -1
  5. package/internals/models/plugin.d.ts +1 -1
  6. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +23 -24
  7. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +66 -10
  8. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +8 -1
  9. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +1 -5
  10. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +3 -0
  11. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +12 -0
  12. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +252 -84
  13. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +26 -8
  14. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
  15. package/modern/index.js +1 -1
  16. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +23 -24
  17. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +8 -1
  18. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +12 -0
  19. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
  20. package/modern/useTreeItem/useTreeItem.js +3 -5
  21. package/node/index.js +1 -1
  22. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +22 -24
  23. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +9 -2
  24. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +15 -2
  25. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
  26. package/node/useTreeItem/useTreeItem.js +3 -5
  27. package/package.json +4 -4
  28. package/useTreeItem/useTreeItem.js +3 -5
@@ -102,12 +102,36 @@ interface UseTreeViewItemsEventLookup {
102
102
  }
103
103
  export interface UseTreeViewItemsState<R extends {}> {
104
104
  items: {
105
+ /**
106
+ * If `true`, will allow focus on disabled items.
107
+ * Always equal to `props.disabledItemsFocusable` (or `false` if not provided).
108
+ */
105
109
  disabledItemsFocusable: boolean;
106
- itemModelLookup: TreeViewItemModelLookup<R>;
107
- itemMetaLookup: TreeViewItemMetaLookup;
110
+ /**
111
+ * Model of each item as provided by `props.items` or by imperative items updates.
112
+ * It is not updated when properties derived from the model are updated:
113
+ * - when the label of an item is updated, `itemMetaLookup` is updated, not `itemModelLookup`.
114
+ * - when the children of an item are updated, `itemOrderedChildrenIdsLookup` and `itemChildrenIndexesLookup` are updated, not `itemModelLookup`.
115
+ * This means that the `children`, `label` or `id` properties of an item model should never be used directly, always use the structured sub-states instead.
116
+ */
117
+ itemModelLookup: {
118
+ [itemId: string]: TreeViewBaseItem<R>;
119
+ };
120
+ /**
121
+ * Meta data of each item.
122
+ */
123
+ itemMetaLookup: {
124
+ [itemId: string]: TreeViewItemMeta;
125
+ };
126
+ /**
127
+ * Ordered children ids of each item.
128
+ */
108
129
  itemOrderedChildrenIdsLookup: {
109
130
  [parentItemId: string]: string[];
110
131
  };
132
+ /**
133
+ * Index of each child in the ordered children ids of its parent.
134
+ */
111
135
  itemChildrenIndexesLookup: {
112
136
  [parentItemId: string]: {
113
137
  [itemId: string]: number;
@@ -129,10 +153,4 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
129
153
  state: UseTreeViewItemsState<TreeViewDefaultItemModelProperties>;
130
154
  contextValue: UseTreeViewItemsContextValue;
131
155
  }>;
132
- export type TreeViewItemMetaLookup = {
133
- [itemId: string]: TreeViewItemMeta;
134
- };
135
- export type TreeViewItemModelLookup<R extends {}> = {
136
- [itemId: string]: TreeViewBaseItem<R>;
137
- };
138
156
  export {};
@@ -2,19 +2,18 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import { useTreeViewContext } from "../../TreeViewProvider/index.js";
3
3
  import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
4
4
  import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
5
- function getCheckboxStatus({
5
+ import { useSelector } from "../../hooks/useSelector.js";
6
+ function selectorItemCheckboxStatus(state, {
6
7
  itemId,
7
- store,
8
- selectionPropagation,
9
- selected
8
+ selectionPropagation
10
9
  }) {
11
- if (selected) {
10
+ if (selectorIsItemSelected(state, itemId)) {
12
11
  return {
13
12
  indeterminate: false,
14
13
  checked: true
15
14
  };
16
15
  }
17
- const children = selectorItemOrderedChildrenIds(store.value, itemId);
16
+ const children = selectorItemOrderedChildrenIds(state, itemId);
18
17
  if (children.length === 0) {
19
18
  return {
20
19
  indeterminate: false,
@@ -25,18 +24,18 @@ function getCheckboxStatus({
25
24
  let hasUnSelectedDescendant = false;
26
25
  const traverseDescendants = itemToTraverseId => {
27
26
  if (itemToTraverseId !== itemId) {
28
- if (selectorIsItemSelected(store.value, itemToTraverseId)) {
27
+ if (selectorIsItemSelected(state, itemToTraverseId)) {
29
28
  hasSelectedDescendant = true;
30
29
  } else {
31
30
  hasUnSelectedDescendant = true;
32
31
  }
33
32
  }
34
- selectorItemOrderedChildrenIds(store.value, itemToTraverseId).forEach(traverseDescendants);
33
+ selectorItemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
35
34
  };
36
35
  traverseDescendants(itemId);
37
36
  return {
38
- indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
39
- checked: selectionPropagation.parents ? hasSelectedDescendant : selected
37
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant,
38
+ checked: selectionPropagation.parents ? hasSelectedDescendant : false
40
39
  };
41
40
  }
42
41
  export const useTreeViewSelectionItemPlugin = ({
@@ -53,6 +52,10 @@ export const useTreeViewSelectionItemPlugin = ({
53
52
  selectionPropagation
54
53
  }
55
54
  } = useTreeViewContext();
55
+ const checkboxStatus = useSelector(store, selectorItemCheckboxStatus, {
56
+ itemId,
57
+ selectionPropagation
58
+ }, (a, b) => a.checked === b.checked && a.indeterminate === b.indeterminate);
56
59
  return {
57
60
  propsEnhancers: {
58
61
  checkbox: ({
@@ -70,12 +73,6 @@ export const useTreeViewSelectionItemPlugin = ({
70
73
  }
71
74
  interactions.handleCheckboxSelection(event);
72
75
  };
73
- const checkboxStatus = getCheckboxStatus({
74
- store,
75
- itemId,
76
- selectionPropagation,
77
- selected: status.selected
78
- });
79
76
  return _extends({
80
77
  visible: checkboxSelection,
81
78
  disabled: disableSelection || status.disabled,
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-alpha.2
2
+ * @mui/x-tree-view v8.0.0-alpha.5
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1,25 +1,38 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import * as React from 'react';
3
2
  import useEventCallback from '@mui/utils/useEventCallback';
4
3
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
4
  import { selectorIsItemExpandable, selectorIsItemExpanded } from "./useTreeViewExpansion.selectors.js";
6
- import { createExpandedItemsMap } from "./useTreeViewExpansion.utils.js";
5
+ import { createExpandedItemsMap, getExpansionTrigger } from "./useTreeViewExpansion.utils.js";
7
6
  import { selectorItemMeta, selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
8
7
  export const useTreeViewExpansion = ({
9
8
  instance,
10
9
  store,
11
10
  params,
12
- models,
13
- experimentalFeatures
11
+ models
14
12
  }) => {
15
- const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
16
13
  useEnhancedEffect(() => {
17
14
  store.update(prevState => _extends({}, prevState, {
18
- expansion: {
15
+ expansion: _extends({}, prevState.expansion, {
19
16
  expandedItemsMap: createExpandedItemsMap(models.expandedItems.value)
20
- }
17
+ })
21
18
  }));
22
19
  }, [store, models.expandedItems.value]);
20
+ useEnhancedEffect(() => {
21
+ store.update(prevState => {
22
+ const newExpansionTrigger = getExpansionTrigger({
23
+ isItemEditable: params.isItemEditable,
24
+ expansionTrigger: params.expansionTrigger
25
+ });
26
+ if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
27
+ return prevState;
28
+ }
29
+ return _extends({}, prevState, {
30
+ expansion: _extends({}, prevState.expansion, {
31
+ expansionTrigger: newExpansionTrigger
32
+ })
33
+ });
34
+ });
35
+ }, [store, params.isItemEditable, params.expansionTrigger]);
23
36
  const setExpandedItems = (event, value) => {
24
37
  params.onExpandedItemsChange?.(event, value);
25
38
  models.expandedItems.setControlledValue(value);
@@ -61,20 +74,6 @@ export const useTreeViewExpansion = ({
61
74
  setExpandedItems(event, newExpanded);
62
75
  }
63
76
  };
64
- const expansionTrigger = React.useMemo(() => {
65
- if (params.expansionTrigger) {
66
- return params.expansionTrigger;
67
- }
68
- if (isTreeViewEditable) {
69
- return 'iconContainer';
70
- }
71
- return 'content';
72
- }, [params.expansionTrigger, isTreeViewEditable]);
73
- const pluginContextValue = React.useMemo(() => ({
74
- expansion: {
75
- expansionTrigger
76
- }
77
- }), [expansionTrigger]);
78
77
  return {
79
78
  publicAPI: {
80
79
  setItemExpansion
@@ -83,8 +82,7 @@ export const useTreeViewExpansion = ({
83
82
  setItemExpansion,
84
83
  toggleItemExpansion,
85
84
  expandAllSiblings
86
- },
87
- contextValue: pluginContextValue
85
+ }
88
86
  };
89
87
  };
90
88
  useTreeViewExpansion.models = {
@@ -100,7 +98,8 @@ useTreeViewExpansion.getDefaultizedParams = ({
100
98
  });
101
99
  useTreeViewExpansion.getInitialState = params => ({
102
100
  expansion: {
103
- expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
101
+ expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems),
102
+ expansionTrigger: getExpansionTrigger(params)
104
103
  }
105
104
  });
106
105
  useTreeViewExpansion.params = {
@@ -14,4 +14,11 @@ export const selectorIsItemExpanded = createSelector([selectorExpansion, (_, ite
14
14
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
15
15
  * @returns {boolean} `true` if the item is expandable, `false` otherwise.
16
16
  */
17
- export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
17
+ export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
18
+
19
+ /**
20
+ * Get the slot that triggers the item's expansion when clicked.
21
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
22
+ * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
23
+ */
24
+ export const selectorItemExpansionTrigger = createSelector([selectorExpansion], expansionState => expansionState.expansionTrigger);
@@ -4,4 +4,16 @@ export const createExpandedItemsMap = expandedItems => {
4
4
  expandedItemsMap.set(id, true);
5
5
  });
6
6
  return expandedItemsMap;
7
+ };
8
+ export const getExpansionTrigger = ({
9
+ isItemEditable,
10
+ expansionTrigger
11
+ }) => {
12
+ if (expansionTrigger) {
13
+ return expansionTrigger;
14
+ }
15
+ if (isItemEditable) {
16
+ return 'iconContainer';
17
+ }
18
+ return 'content';
7
19
  };
@@ -2,19 +2,18 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import { useTreeViewContext } from "../../TreeViewProvider/index.js";
3
3
  import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
4
4
  import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
5
- function getCheckboxStatus({
5
+ import { useSelector } from "../../hooks/useSelector.js";
6
+ function selectorItemCheckboxStatus(state, {
6
7
  itemId,
7
- store,
8
- selectionPropagation,
9
- selected
8
+ selectionPropagation
10
9
  }) {
11
- if (selected) {
10
+ if (selectorIsItemSelected(state, itemId)) {
12
11
  return {
13
12
  indeterminate: false,
14
13
  checked: true
15
14
  };
16
15
  }
17
- const children = selectorItemOrderedChildrenIds(store.value, itemId);
16
+ const children = selectorItemOrderedChildrenIds(state, itemId);
18
17
  if (children.length === 0) {
19
18
  return {
20
19
  indeterminate: false,
@@ -25,18 +24,18 @@ function getCheckboxStatus({
25
24
  let hasUnSelectedDescendant = false;
26
25
  const traverseDescendants = itemToTraverseId => {
27
26
  if (itemToTraverseId !== itemId) {
28
- if (selectorIsItemSelected(store.value, itemToTraverseId)) {
27
+ if (selectorIsItemSelected(state, itemToTraverseId)) {
29
28
  hasSelectedDescendant = true;
30
29
  } else {
31
30
  hasUnSelectedDescendant = true;
32
31
  }
33
32
  }
34
- selectorItemOrderedChildrenIds(store.value, itemToTraverseId).forEach(traverseDescendants);
33
+ selectorItemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
35
34
  };
36
35
  traverseDescendants(itemId);
37
36
  return {
38
- indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
39
- checked: selectionPropagation.parents ? hasSelectedDescendant : selected
37
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant,
38
+ checked: selectionPropagation.parents ? hasSelectedDescendant : false
40
39
  };
41
40
  }
42
41
  export const useTreeViewSelectionItemPlugin = ({
@@ -53,6 +52,10 @@ export const useTreeViewSelectionItemPlugin = ({
53
52
  selectionPropagation
54
53
  }
55
54
  } = useTreeViewContext();
55
+ const checkboxStatus = useSelector(store, selectorItemCheckboxStatus, {
56
+ itemId,
57
+ selectionPropagation
58
+ }, (a, b) => a.checked === b.checked && a.indeterminate === b.indeterminate);
56
59
  return {
57
60
  propsEnhancers: {
58
61
  checkbox: ({
@@ -70,12 +73,6 @@ export const useTreeViewSelectionItemPlugin = ({
70
73
  }
71
74
  interactions.handleCheckboxSelection(event);
72
75
  };
73
- const checkboxStatus = getCheckboxStatus({
74
- store,
75
- itemId,
76
- selectionPropagation,
77
- selected: status.selected
78
- });
79
76
  return _extends({
80
77
  visible: checkboxSelection,
81
78
  disabled: disableSelection || status.disabled,
@@ -13,6 +13,7 @@ import { selectorIsItemTheDefaultFocusableItem } from "../internals/plugins/useT
13
13
  import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
14
14
  import { selectorCanItemBeFocused } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
15
15
  import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
16
+ import { selectorItemExpansionTrigger } from "../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
16
17
  export const useTreeItem = parameters => {
17
18
  const {
18
19
  runItemPlugins,
@@ -23,9 +24,6 @@ export const useTreeItem = parameters => {
23
24
  disableSelection,
24
25
  checkboxSelection
25
26
  },
26
- expansion: {
27
- expansionTrigger
28
- },
29
27
  label: labelContext,
30
28
  instance,
31
29
  publicAPI,
@@ -122,7 +120,7 @@ export const useTreeItem = parameters => {
122
120
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
123
121
  return;
124
122
  }
125
- if (expansionTrigger === 'content') {
123
+ if (selectorItemExpansionTrigger(store.value) === 'content') {
126
124
  interactions.handleExpansion(event);
127
125
  }
128
126
  if (!checkboxSelection) {
@@ -145,7 +143,7 @@ export const useTreeItem = parameters => {
145
143
  if (event.defaultMuiPrevented) {
146
144
  return;
147
145
  }
148
- if (expansionTrigger === 'iconContainer') {
146
+ if (selectorItemExpansionTrigger(store.value) === 'iconContainer') {
149
147
  interactions.handleExpansion(event);
150
148
  }
151
149
  };
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-alpha.2
2
+ * @mui/x-tree-view v8.0.0-alpha.5
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1,13 +1,11 @@
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.useTreeViewExpansion = void 0;
9
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var React = _interopRequireWildcard(require("react"));
11
9
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
12
10
  var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
13
11
  var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
@@ -17,17 +15,31 @@ const useTreeViewExpansion = ({
17
15
  instance,
18
16
  store,
19
17
  params,
20
- models,
21
- experimentalFeatures
18
+ models
22
19
  }) => {
23
- const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
24
20
  (0, _useEnhancedEffect.default)(() => {
25
21
  store.update(prevState => (0, _extends2.default)({}, prevState, {
26
- expansion: {
22
+ expansion: (0, _extends2.default)({}, prevState.expansion, {
27
23
  expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(models.expandedItems.value)
28
- }
24
+ })
29
25
  }));
30
26
  }, [store, models.expandedItems.value]);
27
+ (0, _useEnhancedEffect.default)(() => {
28
+ store.update(prevState => {
29
+ const newExpansionTrigger = (0, _useTreeViewExpansion2.getExpansionTrigger)({
30
+ isItemEditable: params.isItemEditable,
31
+ expansionTrigger: params.expansionTrigger
32
+ });
33
+ if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
34
+ return prevState;
35
+ }
36
+ return (0, _extends2.default)({}, prevState, {
37
+ expansion: (0, _extends2.default)({}, prevState.expansion, {
38
+ expansionTrigger: newExpansionTrigger
39
+ })
40
+ });
41
+ });
42
+ }, [store, params.isItemEditable, params.expansionTrigger]);
31
43
  const setExpandedItems = (event, value) => {
32
44
  params.onExpandedItemsChange?.(event, value);
33
45
  models.expandedItems.setControlledValue(value);
@@ -69,20 +81,6 @@ const useTreeViewExpansion = ({
69
81
  setExpandedItems(event, newExpanded);
70
82
  }
71
83
  };
72
- const expansionTrigger = React.useMemo(() => {
73
- if (params.expansionTrigger) {
74
- return params.expansionTrigger;
75
- }
76
- if (isTreeViewEditable) {
77
- return 'iconContainer';
78
- }
79
- return 'content';
80
- }, [params.expansionTrigger, isTreeViewEditable]);
81
- const pluginContextValue = React.useMemo(() => ({
82
- expansion: {
83
- expansionTrigger
84
- }
85
- }), [expansionTrigger]);
86
84
  return {
87
85
  publicAPI: {
88
86
  setItemExpansion
@@ -91,8 +89,7 @@ const useTreeViewExpansion = ({
91
89
  setItemExpansion,
92
90
  toggleItemExpansion,
93
91
  expandAllSiblings
94
- },
95
- contextValue: pluginContextValue
92
+ }
96
93
  };
97
94
  };
98
95
  exports.useTreeViewExpansion = useTreeViewExpansion;
@@ -109,7 +106,8 @@ useTreeViewExpansion.getDefaultizedParams = ({
109
106
  });
110
107
  useTreeViewExpansion.getInitialState = params => ({
111
108
  expansion: {
112
- expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
109
+ expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems),
110
+ expansionTrigger: (0, _useTreeViewExpansion2.getExpansionTrigger)(params)
113
111
  }
114
112
  });
115
113
  useTreeViewExpansion.params = {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.selectorIsItemExpanded = exports.selectorIsItemExpandable = void 0;
6
+ exports.selectorItemExpansionTrigger = exports.selectorIsItemExpanded = exports.selectorIsItemExpandable = void 0;
7
7
  var _selectors = require("../../utils/selectors");
8
8
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
9
9
  const selectorExpansion = state => state.expansion;
@@ -20,4 +20,11 @@ const selectorIsItemExpanded = exports.selectorIsItemExpanded = (0, _selectors.c
20
20
  * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
21
21
  * @returns {boolean} `true` if the item is expandable, `false` otherwise.
22
22
  */
23
- const selectorIsItemExpandable = exports.selectorIsItemExpandable = (0, _selectors.createSelector)([_useTreeViewItems.selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
23
+ const selectorIsItemExpandable = exports.selectorIsItemExpandable = (0, _selectors.createSelector)([_useTreeViewItems.selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
24
+
25
+ /**
26
+ * Get the slot that triggers the item's expansion when clicked.
27
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
28
+ * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
29
+ */
30
+ const selectorItemExpansionTrigger = exports.selectorItemExpansionTrigger = (0, _selectors.createSelector)([selectorExpansion], expansionState => expansionState.expansionTrigger);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.createExpandedItemsMap = void 0;
6
+ exports.getExpansionTrigger = exports.createExpandedItemsMap = void 0;
7
7
  const createExpandedItemsMap = expandedItems => {
8
8
  const expandedItemsMap = new Map();
9
9
  expandedItems.forEach(id => {
@@ -11,4 +11,17 @@ const createExpandedItemsMap = expandedItems => {
11
11
  });
12
12
  return expandedItemsMap;
13
13
  };
14
- exports.createExpandedItemsMap = createExpandedItemsMap;
14
+ exports.createExpandedItemsMap = createExpandedItemsMap;
15
+ const getExpansionTrigger = ({
16
+ isItemEditable,
17
+ expansionTrigger
18
+ }) => {
19
+ if (expansionTrigger) {
20
+ return expansionTrigger;
21
+ }
22
+ if (isItemEditable) {
23
+ return 'iconContainer';
24
+ }
25
+ return 'content';
26
+ };
27
+ exports.getExpansionTrigger = getExpansionTrigger;
@@ -9,19 +9,18 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var _TreeViewProvider = require("../../TreeViewProvider");
10
10
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
11
11
  var _useTreeViewSelection = require("./useTreeViewSelection.selectors");
12
- function getCheckboxStatus({
12
+ var _useSelector = require("../../hooks/useSelector");
13
+ function selectorItemCheckboxStatus(state, {
13
14
  itemId,
14
- store,
15
- selectionPropagation,
16
- selected
15
+ selectionPropagation
17
16
  }) {
18
- if (selected) {
17
+ if ((0, _useTreeViewSelection.selectorIsItemSelected)(state, itemId)) {
19
18
  return {
20
19
  indeterminate: false,
21
20
  checked: true
22
21
  };
23
22
  }
24
- const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId);
23
+ const children = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemId);
25
24
  if (children.length === 0) {
26
25
  return {
27
26
  indeterminate: false,
@@ -32,18 +31,18 @@ function getCheckboxStatus({
32
31
  let hasUnSelectedDescendant = false;
33
32
  const traverseDescendants = itemToTraverseId => {
34
33
  if (itemToTraverseId !== itemId) {
35
- if ((0, _useTreeViewSelection.selectorIsItemSelected)(store.value, itemToTraverseId)) {
34
+ if ((0, _useTreeViewSelection.selectorIsItemSelected)(state, itemToTraverseId)) {
36
35
  hasSelectedDescendant = true;
37
36
  } else {
38
37
  hasUnSelectedDescendant = true;
39
38
  }
40
39
  }
41
- (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemToTraverseId).forEach(traverseDescendants);
40
+ (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(state, itemToTraverseId).forEach(traverseDescendants);
42
41
  };
43
42
  traverseDescendants(itemId);
44
43
  return {
45
- indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant && !selected,
46
- checked: selectionPropagation.parents ? hasSelectedDescendant : selected
44
+ indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant,
45
+ checked: selectionPropagation.parents ? hasSelectedDescendant : false
47
46
  };
48
47
  }
49
48
  const useTreeViewSelectionItemPlugin = ({
@@ -60,6 +59,10 @@ const useTreeViewSelectionItemPlugin = ({
60
59
  selectionPropagation
61
60
  }
62
61
  } = (0, _TreeViewProvider.useTreeViewContext)();
62
+ const checkboxStatus = (0, _useSelector.useSelector)(store, selectorItemCheckboxStatus, {
63
+ itemId,
64
+ selectionPropagation
65
+ }, (a, b) => a.checked === b.checked && a.indeterminate === b.indeterminate);
63
66
  return {
64
67
  propsEnhancers: {
65
68
  checkbox: ({
@@ -77,12 +80,6 @@ const useTreeViewSelectionItemPlugin = ({
77
80
  }
78
81
  interactions.handleCheckboxSelection(event);
79
82
  };
80
- const checkboxStatus = getCheckboxStatus({
81
- store,
82
- itemId,
83
- selectionPropagation,
84
- selected: status.selected
85
- });
86
83
  return (0, _extends2.default)({
87
84
  visible: checkboxSelection,
88
85
  disabled: disableSelection || status.disabled,
@@ -20,6 +20,7 @@ var _useTreeViewFocus = require("../internals/plugins/useTreeViewFocus/useTreeVi
20
20
  var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
21
21
  var _useTreeViewItems = require("../internals/plugins/useTreeViewItems/useTreeViewItems.selectors");
22
22
  var _useTreeViewId2 = require("../internals/corePlugins/useTreeViewId/useTreeViewId.selectors");
23
+ var _useTreeViewExpansion = require("../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors");
23
24
  const useTreeItem = parameters => {
24
25
  const {
25
26
  runItemPlugins,
@@ -30,9 +31,6 @@ const useTreeItem = parameters => {
30
31
  disableSelection,
31
32
  checkboxSelection
32
33
  },
33
- expansion: {
34
- expansionTrigger
35
- },
36
34
  label: labelContext,
37
35
  instance,
38
36
  publicAPI,
@@ -129,7 +127,7 @@ const useTreeItem = parameters => {
129
127
  if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
130
128
  return;
131
129
  }
132
- if (expansionTrigger === 'content') {
130
+ if ((0, _useTreeViewExpansion.selectorItemExpansionTrigger)(store.value) === 'content') {
133
131
  interactions.handleExpansion(event);
134
132
  }
135
133
  if (!checkboxSelection) {
@@ -152,7 +150,7 @@ const useTreeItem = parameters => {
152
150
  if (event.defaultMuiPrevented) {
153
151
  return;
154
152
  }
155
- if (expansionTrigger === 'iconContainer') {
153
+ if ((0, _useTreeViewExpansion.selectorItemExpansionTrigger)(store.value) === 'iconContainer') {
156
154
  interactions.handleExpansion(event);
157
155
  }
158
156
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "8.0.0-alpha.2",
3
+ "version": "8.0.0-alpha.5",
4
4
  "description": "The community edition of the Tree View components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -35,13 +35,13 @@
35
35
  "dependencies": {
36
36
  "@babel/runtime": "^7.26.0",
37
37
  "@mui/utils": "^5.16.6 || ^6.0.0",
38
- "@types/react-transition-group": "^4.4.11",
38
+ "@types/react-transition-group": "^4.4.12",
39
39
  "clsx": "^2.1.1",
40
40
  "prop-types": "^15.8.1",
41
41
  "react-transition-group": "^4.4.5",
42
42
  "reselect": "^5.1.1",
43
- "use-sync-external-store": "^1.2.2",
44
- "@mui/x-internals": "8.0.0-alpha.2"
43
+ "use-sync-external-store": "^1.4.0",
44
+ "@mui/x-internals": "8.0.0-alpha.5"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@emotion/react": "^11.9.0",