@mui/x-tree-view 8.0.0-alpha.4 → 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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,108 @@
5
5
  All notable changes to this project will be documented in this file.
6
6
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
7
7
 
8
+ ## 8.0.0-alpha.5
9
+
10
+ _Dec 19, 2024_
11
+
12
+ We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨:
13
+
14
+ - 🌍 Improve Korean (ko-KR) locale on the Data Grid
15
+ - 🐞 Bugfixes
16
+
17
+ Special thanks go out to the community contributors who have helped make this release possible:
18
+ @good-jinu, @k-rajat19.
19
+ Following are all team members who have contributed to this release:
20
+ @alexfauquette, @cherniavskii, @flaviendelangle, @KenanYusuf, @LukasTy, @MBilalShafi, @romgrk.
21
+
22
+ <!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
23
+
24
+ ### Data Grid
25
+
26
+ #### Breaking changes
27
+
28
+ - Passing additional props (like `data-*`, `aria-*`) directly on the Data Grid component is no longer supported. To pass the props, use `slotProps`.
29
+
30
+ - For `.root` element, use `slotProps.root`.
31
+ - For `.main` element (the one with `role="grid"`), use `slotProps.main`.
32
+
33
+ - `detailPanelExpandedRowIds` and `onDetailPanelExpandedRowIdsChange` props use a [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instead of an array:
34
+
35
+ ```diff
36
+ -detailPanelExpandedRowIds?: GridRowId[];
37
+ +detailPanelExpandedRowIds?: Set<GridRowId>;
38
+
39
+ -onDetailPanelExpandedRowIdsChange?: (ids: GridRowId[], details: GridCallbackDetails) => void;
40
+ +onDetailPanelExpandedRowIdsChange?: (ids: Set<GridRowId>, details: GridCallbackDetails) => void;
41
+ ```
42
+
43
+ - `apiRef.current.getExpandedDetailPanels` and `apiRef.current.setExpandedDetailPanels` methods receive and return a [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instead of an array.
44
+ - `gridDetailPanelExpandedRowIdsSelector` returns a [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instead of an array.
45
+ - `gridDetailPanelExpandedRowsHeightCacheSelector` was removed.
46
+
47
+ #### `@mui/x-data-grid@8.0.0-alpha.5`
48
+
49
+ - [DataGrid] Consider `columnGroupHeaderHeight` prop in `getTotalHeaderHeight` method (#15915) @k-rajat19
50
+ - [DataGrid] Fix autosizing with virtualized columns (#15116) @k-rajat19
51
+ - [DataGrid] Move `<Badge />` to leaf import (#15879) @romgrk
52
+ - [DataGrid] Move `<ListItemText />` and `<ListItemIcon />` to leaf import (#15869) @romgrk
53
+ - [DataGrid] Remove the Joy UI demo (#15913) @romgrk
54
+ - [DataGrid] Update quick filter input variant (#15909) @KenanYusuf
55
+ - [DataGrid] Use `slotProps` to forward props to `.main` and `.root` elements (#15870) @MBilalShafi
56
+ - [l10n] Improve Korean(ko-KR) locale (#15878) @good-jinu
57
+
58
+ #### `@mui/x-data-grid-pro@8.0.0-alpha.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
59
+
60
+ Same changes as in `@mui/x-data-grid@8.0.0-alpha.5`, plus:
61
+
62
+ - [DataGridPro] Use `Set` for `detailPanelExpandedRowIds` (#15835) @cherniavskii
63
+
64
+ #### `@mui/x-data-grid-premium@8.0.0-alpha.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
65
+
66
+ Same changes as in `@mui/x-data-grid-pro@8.0.0-alpha.5`.
67
+
68
+ ### Date and Time Pickers
69
+
70
+ #### Breaking changes
71
+
72
+ - The `<PickersMonth />` component has been moved inside the Month Calendar component — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#month-calendar).
73
+
74
+ - The `<PickersYear />` component has been moved inside the Year Calendar component — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#year-calendar).
75
+
76
+ #### `@mui/x-date-pickers@8.0.0-alpha.5`
77
+
78
+ - [pickers] Add verification to disable skipped hours in spring forward DST (#15849) @flaviendelangle
79
+ - [pickers] Remove `PickersMonth` and `PickersYear` from the theme and remove the `div` wrapping each button (#15806) @flaviendelangle
80
+ - [pickers] Use the new `ownerState` object on the `<PickersTextField />` component (#15863) @flaviendelangle
81
+
82
+ #### `@mui/x-date-pickers-pro@8.0.0-alpha.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
83
+
84
+ Same changes as in `@mui/x-date-pickers@8.0.0-alpha.5`.
85
+
86
+ ### Charts
87
+
88
+ #### `@mui/x-charts@8.0.0-alpha.5`
89
+
90
+ - [charts] Fix `<ScatterChart />` value type if `null` (#15917) @alexfauquette
91
+
92
+ #### `@mui/x-charts-pro@8.0.0-alpha.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
93
+
94
+ Same changes as in `@mui/x-charts@8.0.0-alpha.5`.
95
+
96
+ ### Tree View
97
+
98
+ #### `@mui/x-tree-view@8.0.0-alpha.5`
99
+
100
+ No changes since `@mui/x-tree-view-pro@v8.0.0-alpha.4`.
101
+
102
+ #### `@mui/x-tree-view-pro@8.0.0-alpha.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
103
+
104
+ Same changes as in `@mui/x-tree-view@8.0.0-alpha.5`.
105
+
106
+ ### Core
107
+
108
+ - [code-infra] Remove `@mui/material-nextjs` dependency (#15925) @LukasTy
109
+
8
110
  ## 8.0.0-alpha.4
9
111
 
10
112
  _Dec 13, 2024_
@@ -39,6 +141,7 @@ Following are all team members who have contributed to this release:
39
141
  -const output = useGridSelector(apiRef, selector, equals)
40
142
  +const output = useGridSelector(apiRef, selector, arguments, equals)
41
143
  ```
144
+
42
145
  - The default variant for text fields and selects in the filter panel has been changed to `outlined`.
43
146
  - The "row spanning" feature is now stable.
44
147
  ```diff
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-alpha.4
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
@@ -118,7 +118,7 @@ type TreeViewRequiredPlugins<TSignature extends TreeViewAnyPluginSignature> = [
118
118
  ];
119
119
  type PluginPropertyWithDependencies<TSignature extends TreeViewAnyPluginSignature, TProperty extends keyof TreeViewAnyPluginSignature> = TSignature[TProperty] & MergeSignaturesProperty<TreeViewRequiredPlugins<TSignature>, TProperty> & Partial<MergeSignaturesProperty<TSignature['optionalDependencies'], TProperty>>;
120
120
  export type TreeViewUsedParams<TSignature extends TreeViewAnyPluginSignature> = PluginPropertyWithDependencies<TSignature, 'params'>;
121
- type TreeViewUsedDefaultizedParams<TSignature extends TreeViewAnyPluginSignature> = PluginPropertyWithDependencies<TSignature, 'defaultizedParams'>;
121
+ export type TreeViewUsedDefaultizedParams<TSignature extends TreeViewAnyPluginSignature> = PluginPropertyWithDependencies<TSignature, 'defaultizedParams'>;
122
122
  export type TreeViewUsedInstance<TSignature extends TreeViewAnyPluginSignature> = PluginPropertyWithDependencies<TSignature, 'instance'> & {
123
123
  /**
124
124
  * Private property only defined in TypeScript to be able to access the plugin signature from the instance object.
@@ -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 = {
@@ -12,9 +12,11 @@ export declare const selectorIsItemExpanded: ((state: any, itemId: string) => bo
12
12
  } & {
13
13
  resultFunc: (resultFuncArgs_0: {
14
14
  expandedItemsMap: Map<string, true>;
15
+ expansionTrigger: "content" | "iconContainer";
15
16
  }, resultFuncArgs_1: string) => boolean;
16
17
  memoizedResultFunc: ((resultFuncArgs_0: {
17
18
  expandedItemsMap: Map<string, true>;
19
+ expansionTrigger: "content" | "iconContainer";
18
20
  }, resultFuncArgs_1: string) => boolean) & {
19
21
  clearCache: () => void;
20
22
  resultsCount: () => number;
@@ -142,3 +144,37 @@ export declare const selectorIsItemExpandable: ((state: any, itemId: string | nu
142
144
  argsMemoize: typeof import("reselect").weakMapMemoize;
143
145
  memoize: typeof import("reselect").weakMapMemoize;
144
146
  };
147
+ /**
148
+ * Get the slot that triggers the item's expansion when clicked.
149
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
150
+ * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
151
+ */
152
+ export declare const selectorItemExpansionTrigger: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewExpansion.types").UseTreeViewExpansionState & Partial<{}> & {
153
+ cacheKey: import("../../models").TreeViewStateCacheKey;
154
+ }) => "content" | "iconContainer") & {
155
+ clearCache: () => void;
156
+ resultsCount: () => number;
157
+ resetResultsCount: () => void;
158
+ } & {
159
+ resultFunc: (resultFuncArgs_0: {
160
+ expandedItemsMap: Map<string, true>;
161
+ expansionTrigger: "content" | "iconContainer";
162
+ }) => "content" | "iconContainer";
163
+ memoizedResultFunc: ((resultFuncArgs_0: {
164
+ expandedItemsMap: Map<string, true>;
165
+ expansionTrigger: "content" | "iconContainer";
166
+ }) => "content" | "iconContainer") & {
167
+ clearCache: () => void;
168
+ resultsCount: () => number;
169
+ resetResultsCount: () => void;
170
+ };
171
+ lastResult: () => "content" | "iconContainer";
172
+ dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
173
+ recomputations: () => number;
174
+ resetRecomputations: () => void;
175
+ dependencyRecomputations: () => number;
176
+ resetDependencyRecomputations: () => void;
177
+ } & {
178
+ argsMemoize: typeof import("reselect").weakMapMemoize;
179
+ memoize: typeof import("reselect").weakMapMemoize;
180
+ };
@@ -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);
@@ -63,11 +63,9 @@ export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTree
63
63
  export interface UseTreeViewExpansionState {
64
64
  expansion: {
65
65
  expandedItemsMap: Map<string, true>;
66
+ expansionTrigger: 'content' | 'iconContainer';
66
67
  };
67
68
  }
68
- interface UseTreeViewExpansionContextValue {
69
- expansion: Pick<UseTreeViewExpansionParameters, 'expansionTrigger'>;
70
- }
71
69
  export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
72
70
  params: UseTreeViewExpansionParameters;
73
71
  defaultizedParams: UseTreeViewExpansionDefaultizedParameters;
@@ -75,8 +73,6 @@ export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
75
73
  publicAPI: UseTreeViewExpansionPublicAPI;
76
74
  modelNames: 'expandedItems';
77
75
  state: UseTreeViewExpansionState;
78
- contextValue: UseTreeViewExpansionContextValue;
79
76
  dependencies: [UseTreeViewItemsSignature];
80
77
  optionalDependencies: [UseTreeViewLabelSignature];
81
78
  }>;
82
- export {};
@@ -1 +1,4 @@
1
+ import { TreeViewUsedDefaultizedParams } from '../../models';
2
+ import { UseTreeViewExpansionSignature } from './useTreeViewExpansion.types';
1
3
  export declare const createExpandedItemsMap: (expandedItems: string[]) => Map<string, true>;
4
+ export declare const getExpansionTrigger: ({ isItemEditable, expansionTrigger, }: Pick<TreeViewUsedDefaultizedParams<UseTreeViewExpansionSignature>, "isItemEditable" | "expansionTrigger">) => "content" | "iconContainer";
@@ -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
  };
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v8.0.0-alpha.4
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
  };
@@ -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.4
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;
@@ -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.4",
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
43
  "use-sync-external-store": "^1.4.0",
44
- "@mui/x-internals": "8.0.0-alpha.2"
44
+ "@mui/x-internals": "8.0.0-alpha.5"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@emotion/react": "^11.9.0",
@@ -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
  };