@mui/x-tree-view 8.0.0-alpha.4 → 8.0.0-alpha.6

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,187 @@
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.6
9
+
10
+ _Dec 26, 2024_
11
+
12
+ We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨:
13
+
14
+ - 🏎️ Improve Data Grid scrolling performance
15
+ - 🌍 Improve Dutch (nl-NL) locale on the Data Grid
16
+ - 🐞 Bugfixes
17
+
18
+ Special thanks go out to the community contributors who have helped make this release possible:
19
+ @JoepVerkoelen, @k-rajat19, @lauri865.
20
+ Following are all team members who have contributed to this release:
21
+ @flaviendelangle, @JCQuintas, @LukasTy, @MBilalShafi, @romgrk.
22
+
23
+ <!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
24
+
25
+ ### Data Grid
26
+
27
+ #### Breaking changes
28
+
29
+ - The `sanitizeFilterItemValue()` utility is not exported anymore.
30
+
31
+ #### `@mui/x-data-grid@8.0.0-alpha.6`
32
+
33
+ - [DataGrid] Avoid subscribing to `renderContext` state in grid root for better scroll performance (#15986) @lauri865
34
+ - [DataGrid] Fix header filters showing clear button while empty (#15829) @k-rajat19
35
+ - [DataGrid] Improve test coverage of server side data source (#15942) @MBilalShafi
36
+ - [DataGrid] Move progress components to leaf import (#15914) @romgrk
37
+ - [DataGrid] Move skeleton to leaf import (#15931) @romgrk
38
+ - [DataGrid] Replace `forwardRef` with a shim for forward compatibility (#15955) @lauri865
39
+ - [l10n] Improve Dutch (nl-NL) locale (#15994) @JoepVerkoelen
40
+
41
+ #### `@mui/x-data-grid-pro@8.0.0-alpha.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
42
+
43
+ Same changes as in `@mui/x-data-grid@8.0.0-alpha.6`.
44
+
45
+ #### `@mui/x-data-grid-premium@8.0.0-alpha.6` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
46
+
47
+ Same changes as in `@mui/x-data-grid-pro@8.0.0-alpha.6`, plus:
48
+
49
+ - [DataGridPremium] Fix column unpinning with row grouping (#15908) @k-rajat19
50
+
51
+ ### Date and Time Pickers
52
+
53
+ #### `@mui/x-date-pickers@8.0.0-alpha.6`
54
+
55
+ - [pickers] Use `usePickerContext()` and `usePickerActionsContext()` to get the actions in the `actionBar` slot and in internal components (#15843) @flaviendelangle
56
+ - [pickers] Use `usePickerContext()` to get the view-related props in the layout, toolbar and tabs slots (#15606) @flaviendelangle
57
+
58
+ #### `@mui/x-date-pickers-pro@8.0.0-alpha.6` [![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-date-pickers@8.0.0-alpha.6`.
61
+
62
+ ### Charts
63
+
64
+ #### `@mui/x-charts@8.0.0-alpha.6`
65
+
66
+ No changes since `@mui/x-charts@v8.0.0-alpha.5`.
67
+
68
+ #### `@mui/x-charts-pro@8.0.0-alpha.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
69
+
70
+ Same changes as in `@mui/x-charts@8.0.0-alpha.6`.
71
+
72
+ ### Tree View
73
+
74
+ #### `@mui/x-tree-view@8.0.0-alpha.6`
75
+
76
+ No changes since `@mui/x-tree-view-pro@v8.0.0-alpha.5`.
77
+
78
+ #### `@mui/x-tree-view-pro@8.0.0-alpha.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
79
+
80
+ Same changes as in `@mui/x-tree-view@8.0.0-alpha.6`.
81
+
82
+ ### Docs
83
+
84
+ - [docs] Remove production profiler from docs build (#15959) @lauri865
85
+ - [code-infra] Add new `next-env.d.ts` changes (#15947) @JCQuintas
86
+
87
+ ## 8.0.0-alpha.5
88
+
89
+ _Dec 19, 2024_
90
+
91
+ We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨:
92
+
93
+ - 🌍 Improve Korean (ko-KR) locale on the Data Grid
94
+ - 🐞 Bugfixes
95
+
96
+ Special thanks go out to the community contributors who have helped make this release possible:
97
+ @good-jinu, @k-rajat19.
98
+ Following are all team members who have contributed to this release:
99
+ @alexfauquette, @cherniavskii, @flaviendelangle, @KenanYusuf, @LukasTy, @MBilalShafi, @romgrk.
100
+
101
+ <!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
102
+
103
+ ### Data Grid
104
+
105
+ #### Breaking changes
106
+
107
+ - Passing additional props (like `data-*`, `aria-*`) directly on the Data Grid component is no longer supported. To pass the props, use `slotProps`.
108
+
109
+ - For `.root` element, use `slotProps.root`.
110
+ - For `.main` element (the one with `role="grid"`), use `slotProps.main`.
111
+
112
+ - `detailPanelExpandedRowIds` and `onDetailPanelExpandedRowIdsChange` props use a [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instead of an array:
113
+
114
+ ```diff
115
+ -detailPanelExpandedRowIds?: GridRowId[];
116
+ +detailPanelExpandedRowIds?: Set<GridRowId>;
117
+
118
+ -onDetailPanelExpandedRowIdsChange?: (ids: GridRowId[], details: GridCallbackDetails) => void;
119
+ +onDetailPanelExpandedRowIdsChange?: (ids: Set<GridRowId>, details: GridCallbackDetails) => void;
120
+ ```
121
+
122
+ - `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.
123
+ - `gridDetailPanelExpandedRowIdsSelector` returns a [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instead of an array.
124
+ - `gridDetailPanelExpandedRowsHeightCacheSelector` was removed.
125
+
126
+ #### `@mui/x-data-grid@8.0.0-alpha.5`
127
+
128
+ - [DataGrid] Consider `columnGroupHeaderHeight` prop in `getTotalHeaderHeight` method (#15915) @k-rajat19
129
+ - [DataGrid] Fix autosizing with virtualized columns (#15116) @k-rajat19
130
+ - [DataGrid] Move `<Badge />` to leaf import (#15879) @romgrk
131
+ - [DataGrid] Move `<ListItemText />` and `<ListItemIcon />` to leaf import (#15869) @romgrk
132
+ - [DataGrid] Remove the Joy UI demo (#15913) @romgrk
133
+ - [DataGrid] Update quick filter input variant (#15909) @KenanYusuf
134
+ - [DataGrid] Use `slotProps` to forward props to `.main` and `.root` elements (#15870) @MBilalShafi
135
+ - [l10n] Improve Korean(ko-KR) locale (#15878) @good-jinu
136
+
137
+ #### `@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')
138
+
139
+ Same changes as in `@mui/x-data-grid@8.0.0-alpha.5`, plus:
140
+
141
+ - [DataGridPro] Use `Set` for `detailPanelExpandedRowIds` (#15835) @cherniavskii
142
+
143
+ #### `@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')
144
+
145
+ Same changes as in `@mui/x-data-grid-pro@8.0.0-alpha.5`.
146
+
147
+ ### Date and Time Pickers
148
+
149
+ #### Breaking changes
150
+
151
+ - The `<PickersMonth />` component has been moved inside the Month Calendar component — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#month-calendar).
152
+
153
+ - The `<PickersYear />` component has been moved inside the Year Calendar component — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#year-calendar).
154
+
155
+ #### `@mui/x-date-pickers@8.0.0-alpha.5`
156
+
157
+ - [pickers] Add verification to disable skipped hours in spring forward DST (#15849) @flaviendelangle
158
+ - [pickers] Remove `PickersMonth` and `PickersYear` from the theme and remove the `div` wrapping each button (#15806) @flaviendelangle
159
+ - [pickers] Use the new `ownerState` object on the `<PickersTextField />` component (#15863) @flaviendelangle
160
+
161
+ #### `@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')
162
+
163
+ Same changes as in `@mui/x-date-pickers@8.0.0-alpha.5`.
164
+
165
+ ### Charts
166
+
167
+ #### `@mui/x-charts@8.0.0-alpha.5`
168
+
169
+ - [charts] Fix `<ScatterChart />` value type if `null` (#15917) @alexfauquette
170
+
171
+ #### `@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')
172
+
173
+ Same changes as in `@mui/x-charts@8.0.0-alpha.5`.
174
+
175
+ ### Tree View
176
+
177
+ #### `@mui/x-tree-view@8.0.0-alpha.5`
178
+
179
+ No changes since `@mui/x-tree-view-pro@v8.0.0-alpha.4`.
180
+
181
+ #### `@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')
182
+
183
+ Same changes as in `@mui/x-tree-view@8.0.0-alpha.5`.
184
+
185
+ ### Core
186
+
187
+ - [code-infra] Remove `@mui/material-nextjs` dependency (#15925) @LukasTy
188
+
8
189
  ## 8.0.0-alpha.4
9
190
 
10
191
  _Dec 13, 2024_
@@ -39,6 +220,7 @@ Following are all team members who have contributed to this release:
39
220
  -const output = useGridSelector(apiRef, selector, equals)
40
221
  +const output = useGridSelector(apiRef, selector, arguments, equals)
41
222
  ```
223
+
42
224
  - The default variant for text fields and selects in the filter panel has been changed to `outlined`.
43
225
  - The "row spanning" feature is now stable.
44
226
  ```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.6
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.6
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.6
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.6",
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.6"
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
  };