@mui/x-tree-view-pro 8.0.0-alpha.13 → 8.0.0-alpha.14
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 +131 -0
- package/RichTreeViewPro/RichTreeViewPro.js +19 -6
- package/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +3 -3
- package/RichTreeViewPro/RichTreeViewPro.plugins.js +2 -1
- package/esm/RichTreeViewPro/RichTreeViewPro.js +19 -6
- package/esm/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +3 -3
- package/esm/RichTreeViewPro/RichTreeViewPro.plugins.js +2 -1
- package/esm/index.js +1 -1
- package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +4 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +288 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/esm/internals/plugins/useTreeViewLazyLoading/utils.js +85 -0
- package/esm/internals/utils/releaseInfo.js +1 -1
- package/index.js +1 -1
- package/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +4 -0
- package/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/internals/plugins/useTreeViewLazyLoading/index.js +12 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +297 -0
- package/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/internals/plugins/useTreeViewLazyLoading/utils.js +89 -0
- package/internals/utils/releaseInfo.js +1 -1
- package/modern/RichTreeViewPro/RichTreeViewPro.js +19 -6
- package/modern/RichTreeViewPro/RichTreeViewPro.plugins.d.ts +3 -3
- package/modern/RichTreeViewPro/RichTreeViewPro.plugins.js +2 -1
- package/modern/index.js +1 -1
- package/modern/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts +4 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/index.js +1 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.d.ts +3 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.js +288 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/utils.d.ts +32 -0
- package/modern/internals/plugins/useTreeViewLazyLoading/utils.js +85 -0
- package/modern/internals/utils/releaseInfo.js +1 -1
- package/package.json +3 -3
- package/tsconfig.build.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,137 @@
|
|
|
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.14
|
|
9
|
+
|
|
10
|
+
_Mar 7, 2025_
|
|
11
|
+
|
|
12
|
+
We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨:
|
|
13
|
+
|
|
14
|
+
- 🚀📊 New Pro Chart: It is now possible to create Funnel charts—perfect for visualizing conversions, sales pipelines and more!
|
|
15
|
+
<img width="418" alt="Screenshot 2025-01-31 at 12 22 31" src="https://github.com/user-attachments/assets/8cd26821-5f11-46bf-a9bb-34d212880a47" />
|
|
16
|
+
- 🎁 The first iteration of the radar chart is available. Features and refinements will be added in the coming weeks.
|
|
17
|
+
- 🛠️ New and improved [Toolbar component](https://next.mui.com/x/react-data-grid/components/toolbar/) for the data grid
|
|
18
|
+
- 🐞 Bugfixes
|
|
19
|
+
|
|
20
|
+
Special thanks go out to the community member for their valuable contributions:
|
|
21
|
+
@vadimka123.
|
|
22
|
+
|
|
23
|
+
Following are all team members who have contributed to this release:
|
|
24
|
+
@alexfauquette, @arminmeh, @bernardobelchior, @cherniavskii, @flaviendelangle, @JCQuintas, @KenanYusuf, @LukasTy, @michelengelen, @noraleonte, @oliviertassinari.
|
|
25
|
+
|
|
26
|
+
<!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
|
|
27
|
+
|
|
28
|
+
### Data Grid
|
|
29
|
+
|
|
30
|
+
#### Breaking changes
|
|
31
|
+
|
|
32
|
+
- The density selector has been removed from the toolbar. It is still possible to set the density programmatically via the `density` prop. A density selector can be added to a custom toolbar passed to `slots.toolbar`. See [Toolbar component—Settings menu](https://next.mui.com/x/react-data-grid/components/toolbar/#settings-menu) for an example.
|
|
33
|
+
- The quick filter is now shown in the toolbar by default. Use `slotProps={{ toolbar: { showQuickFilter: false } }}` to hide it.
|
|
34
|
+
- The `<GridSaveAltIcon />` icon is not exported anymore. Import `SaveAlt` from `@mui/icons-material` instead.
|
|
35
|
+
|
|
36
|
+
#### `@mui/x-data-grid@8.0.0-alpha.14`
|
|
37
|
+
|
|
38
|
+
- [DataGrid] Fix `aria-hidden` console error when scrollbar is dragged (#16829) @arminmeh
|
|
39
|
+
- [DataGrid] Fix scroll jump with dynamic row height (#16763) @cherniavskii
|
|
40
|
+
- [DataGrid] New `<Toolbar />` component (#14611) @KenanYusuf
|
|
41
|
+
- [DataGrid] Use new toolbar by default (#16814) @KenanYusuf
|
|
42
|
+
- [DataGrid] Remove the quick filtering on a given column (#16738) @vadimka123
|
|
43
|
+
|
|
44
|
+
#### `@mui/x-data-grid-pro@8.0.0-alpha.14` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
45
|
+
|
|
46
|
+
Same changes as in `@mui/x-data-grid@8.0.0-alpha.14`.
|
|
47
|
+
|
|
48
|
+
#### `@mui/x-data-grid-premium@8.0.0-alpha.14` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
49
|
+
|
|
50
|
+
Same changes as in `@mui/x-data-grid-pro@8.0.0-alpha.14`.
|
|
51
|
+
|
|
52
|
+
### Date and Time Pickers
|
|
53
|
+
|
|
54
|
+
#### Breaking changes
|
|
55
|
+
|
|
56
|
+
- All Date Time Picker variants now use Digital Clock for time editing.
|
|
57
|
+
- Stop passing invalid date to `onChange` when the date is partially filled — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#treat-partially-filled-date-as-null-in-onchange).
|
|
58
|
+
|
|
59
|
+
#### `@mui/x-date-pickers@8.0.0-alpha.14`
|
|
60
|
+
|
|
61
|
+
- [DateTimePicker] Use Digital Clock in all component variants (#16678) @LukasTy
|
|
62
|
+
- [fields] Always use `props.value` as the source of truth when defined (#15875) @flaviendelangle
|
|
63
|
+
- [fields] Fix Fields aria relationship with `helperText` (#16821) @LukasTy
|
|
64
|
+
- [pickers] Add `TValidationProps` generic to the `PickerManager` interface (#16832) @flaviendelangle
|
|
65
|
+
- [pickers] Fix `edge` property setting in different button position cases (#16838) @LukasTy
|
|
66
|
+
- [pickers] Fix typo in JSDoc (#16831) @flaviendelangle
|
|
67
|
+
- [pickers] Refactor the files in the `usePicker` folder (#16680) @flaviendelangle
|
|
68
|
+
|
|
69
|
+
#### `@mui/x-date-pickers-pro@8.0.0-alpha.14` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
70
|
+
|
|
71
|
+
Same changes as in `@mui/x-date-pickers@8.0.0-alpha.14`.
|
|
72
|
+
|
|
73
|
+
### Charts
|
|
74
|
+
|
|
75
|
+
#### `@mui/x-charts@8.0.0-alpha.14`
|
|
76
|
+
|
|
77
|
+
- [charts] Fix `undefined` behaving differently from missing value for axis size (#16844) @bernardobelchior
|
|
78
|
+
- [charts] Fix x-axis text anchor default when language is RTL (#16836) @bernardobelchior
|
|
79
|
+
- [charts] Add Radar chart (#16406) @alexfauquette
|
|
80
|
+
- [charts] Move series default color generation in the series config (#16752) @alexfauquette
|
|
81
|
+
- [charts] Render axis title within axis size (#16730) @bernardobelchior
|
|
82
|
+
- [charts] Split `defaultizeAxis` function into two (#16745) @bernardobelchior
|
|
83
|
+
- [charts] Warn if axes data don't have enough elements (#16830) @alexfauquette
|
|
84
|
+
- [charts] XAxis: Add defaults for `textAnchor` and `dominantBaseline` based on `angle` (#16817) @bernardobelchior
|
|
85
|
+
|
|
86
|
+
#### `@mui/x-charts-pro@8.0.0-alpha.14` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
87
|
+
|
|
88
|
+
Same changes as in `@mui/x-charts@8.0.0-alpha.14`, plus:
|
|
89
|
+
|
|
90
|
+
- [charts] Add Funnel chart (#14804) @JCQuintas
|
|
91
|
+
|
|
92
|
+
### Tree View
|
|
93
|
+
|
|
94
|
+
#### Breaking changes
|
|
95
|
+
|
|
96
|
+
- The `selectItem` method has been renamed `setItemSelection`:
|
|
97
|
+
|
|
98
|
+
```diff
|
|
99
|
+
const { publicAPI } = useTreeItemUtils();
|
|
100
|
+
|
|
101
|
+
const handleSelectItem() {
|
|
102
|
+
- publicAPI.selectItem({ event, itemId: props.itemId, shouldBeSelected: true })
|
|
103
|
+
+ publicAPI.setItemSelection({ event, itemId: props.itemId, shouldBeSelected: true })
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- The `setItemExpansion` method now receives a single object instead of a list of parameters:
|
|
108
|
+
|
|
109
|
+
```diff
|
|
110
|
+
const { publicAPI } = useTreeItemUtils();
|
|
111
|
+
|
|
112
|
+
const handleExpandItem() {
|
|
113
|
+
- publicAPI.setItemExpansion(event, props.itemId, true)
|
|
114
|
+
+ publicAPI.setItemExpansion({ event, itemId: props.itemId, shouldBeExpanded: true })
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### `@mui/x-tree-view@8.0.0-alpha.14`
|
|
119
|
+
|
|
120
|
+
- [TreeView] Clean the expansion and selection API methods (#16795) @flaviendelangle
|
|
121
|
+
|
|
122
|
+
#### `@mui/x-tree-view-pro@8.0.0-alpha.14` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
123
|
+
|
|
124
|
+
Same changes as in `@mui/x-tree-view@8.0.0-alpha.14`.
|
|
125
|
+
|
|
126
|
+
### Docs
|
|
127
|
+
|
|
128
|
+
- [docs] Fix padding package install on mobile (#16794) @oliviertassinari
|
|
129
|
+
- [docs] Typo fixes (#16835) @alexfauquette
|
|
130
|
+
|
|
131
|
+
### Core
|
|
132
|
+
|
|
133
|
+
- [code-infra] Fix console warning in telemetry package (#16816) @JCQuintas
|
|
134
|
+
- [code-infra] Split date-picker test files (#16825) @JCQuintas
|
|
135
|
+
- [infra] Replace PR label check workflow with reusable version (#16762) @michelengelen
|
|
136
|
+
- [infra] Update label in priority-support issue template (#16767) @michelengelen
|
|
137
|
+
- [test] Add timeout to flaky screenshot tests (#16852) @LukasTy
|
|
138
|
+
|
|
8
139
|
## 8.0.0-alpha.13
|
|
9
140
|
|
|
10
141
|
_Feb 28, 2025_
|
|
@@ -113,8 +113,10 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
113
113
|
getItemDOMElement: _propTypes.default.func.isRequired,
|
|
114
114
|
getItemOrderedChildrenIds: _propTypes.default.func.isRequired,
|
|
115
115
|
getItemTree: _propTypes.default.func.isRequired,
|
|
116
|
-
|
|
116
|
+
getParentId: _propTypes.default.func.isRequired,
|
|
117
|
+
setIsItemDisabled: _propTypes.default.func.isRequired,
|
|
117
118
|
setItemExpansion: _propTypes.default.func.isRequired,
|
|
119
|
+
setItemSelection: _propTypes.default.func.isRequired,
|
|
118
120
|
updateItemLabel: _propTypes.default.func.isRequired
|
|
119
121
|
})
|
|
120
122
|
}),
|
|
@@ -137,6 +139,15 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
137
139
|
*/
|
|
138
140
|
classes: _propTypes.default.object,
|
|
139
141
|
className: _propTypes.default.string,
|
|
142
|
+
dataSource: _propTypes.default.shape({
|
|
143
|
+
getChildrenCount: _propTypes.default.func,
|
|
144
|
+
getTreeItems: _propTypes.default.func
|
|
145
|
+
}),
|
|
146
|
+
dataSourceCache: _propTypes.default.shape({
|
|
147
|
+
clear: _propTypes.default.func.isRequired,
|
|
148
|
+
get: _propTypes.default.func.isRequired,
|
|
149
|
+
set: _propTypes.default.func.isRequired
|
|
150
|
+
}),
|
|
140
151
|
/**
|
|
141
152
|
* Expanded item ids.
|
|
142
153
|
* Used when the item's expansion is not controlled.
|
|
@@ -174,7 +185,9 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
174
185
|
* For each feature, if the flag is not explicitly set to `true`,
|
|
175
186
|
* the feature will be fully disabled and any property / method call will not have any effect.
|
|
176
187
|
*/
|
|
177
|
-
experimentalFeatures: _propTypes.default.
|
|
188
|
+
experimentalFeatures: _propTypes.default.shape({
|
|
189
|
+
lazyLoading: _propTypes.default.bool
|
|
190
|
+
}),
|
|
178
191
|
/**
|
|
179
192
|
* Used to determine the id of a given item.
|
|
180
193
|
*
|
|
@@ -239,7 +252,7 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
239
252
|
multiSelect: _propTypes.default.bool,
|
|
240
253
|
/**
|
|
241
254
|
* Callback fired when Tree Items are expanded/collapsed.
|
|
242
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
255
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
243
256
|
* @param {array} itemIds The ids of the expanded items.
|
|
244
257
|
*/
|
|
245
258
|
onExpandedItemsChange: _propTypes.default.func,
|
|
@@ -251,7 +264,7 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
251
264
|
onItemClick: _propTypes.default.func,
|
|
252
265
|
/**
|
|
253
266
|
* Callback fired when a Tree Item is expanded or collapsed.
|
|
254
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
267
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
255
268
|
* @param {array} itemId The itemId of the modified item.
|
|
256
269
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
257
270
|
*/
|
|
@@ -278,14 +291,14 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
278
291
|
onItemPositionChange: _propTypes.default.func,
|
|
279
292
|
/**
|
|
280
293
|
* Callback fired when a Tree Item is selected or deselected.
|
|
281
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
294
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
282
295
|
* @param {array} itemId The itemId of the modified item.
|
|
283
296
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
284
297
|
*/
|
|
285
298
|
onItemSelectionToggle: _propTypes.default.func,
|
|
286
299
|
/**
|
|
287
300
|
* Callback fired when Tree Items are selected/deselected.
|
|
288
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
301
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
289
302
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
290
303
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
291
304
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, UseTreeViewIconsParameters, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewCorePluginParameters, UseTreeViewLabelParameters } from '@mui/x-tree-view/internals';
|
|
1
|
+
import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, UseTreeViewIconsParameters, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewCorePluginParameters, UseTreeViewLabelParameters, UseTreeViewLazyLoadingParameters } from '@mui/x-tree-view/internals';
|
|
2
2
|
import { UseTreeViewItemsReorderingParameters } from "../internals/plugins/useTreeViewItemsReordering/index.js";
|
|
3
|
-
export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewIconsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals").UseTreeViewItemsReorderingSignature>];
|
|
3
|
+
export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewIconsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLazyLoadingSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals").UseTreeViewItemsReorderingSignature>];
|
|
4
4
|
export type RichTreeViewProPluginSignatures = ConvertPluginsIntoSignatures<typeof RICH_TREE_VIEW_PRO_PLUGINS>;
|
|
5
5
|
export type RichTreeViewProPluginSlots = MergeSignaturesProperty<RichTreeViewProPluginSignatures, 'slots'>;
|
|
6
6
|
export type RichTreeViewProPluginSlotProps = MergeSignaturesProperty<RichTreeViewProPluginSignatures, 'slotProps'>;
|
|
7
|
-
export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewIconsParameters, UseTreeViewLabelParameters<R>, UseTreeViewItemsReorderingParameters {}
|
|
7
|
+
export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewIconsParameters, UseTreeViewLabelParameters<R>, UseTreeViewLazyLoadingParameters<R>, UseTreeViewItemsReorderingParameters {}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.RICH_TREE_VIEW_PRO_PLUGINS = void 0;
|
|
7
7
|
var _internals = require("@mui/x-tree-view/internals");
|
|
8
8
|
var _useTreeViewItemsReordering = require("../internals/plugins/useTreeViewItemsReordering");
|
|
9
|
-
|
|
9
|
+
var _useTreeViewLazyLoading = require("../internals/plugins/useTreeViewLazyLoading");
|
|
10
|
+
const RICH_TREE_VIEW_PRO_PLUGINS = exports.RICH_TREE_VIEW_PRO_PLUGINS = [_internals.useTreeViewItems, _internals.useTreeViewExpansion, _internals.useTreeViewSelection, _internals.useTreeViewFocus, _internals.useTreeViewKeyboardNavigation, _internals.useTreeViewIcons, _internals.useTreeViewLabel, _useTreeViewLazyLoading.useTreeViewLazyLoading, _useTreeViewItemsReordering.useTreeViewItemsReordering];
|
|
10
11
|
|
|
11
12
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|
|
@@ -106,8 +106,10 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
106
106
|
getItemDOMElement: PropTypes.func.isRequired,
|
|
107
107
|
getItemOrderedChildrenIds: PropTypes.func.isRequired,
|
|
108
108
|
getItemTree: PropTypes.func.isRequired,
|
|
109
|
-
|
|
109
|
+
getParentId: PropTypes.func.isRequired,
|
|
110
|
+
setIsItemDisabled: PropTypes.func.isRequired,
|
|
110
111
|
setItemExpansion: PropTypes.func.isRequired,
|
|
112
|
+
setItemSelection: PropTypes.func.isRequired,
|
|
111
113
|
updateItemLabel: PropTypes.func.isRequired
|
|
112
114
|
})
|
|
113
115
|
}),
|
|
@@ -130,6 +132,15 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
130
132
|
*/
|
|
131
133
|
classes: PropTypes.object,
|
|
132
134
|
className: PropTypes.string,
|
|
135
|
+
dataSource: PropTypes.shape({
|
|
136
|
+
getChildrenCount: PropTypes.func,
|
|
137
|
+
getTreeItems: PropTypes.func
|
|
138
|
+
}),
|
|
139
|
+
dataSourceCache: PropTypes.shape({
|
|
140
|
+
clear: PropTypes.func.isRequired,
|
|
141
|
+
get: PropTypes.func.isRequired,
|
|
142
|
+
set: PropTypes.func.isRequired
|
|
143
|
+
}),
|
|
133
144
|
/**
|
|
134
145
|
* Expanded item ids.
|
|
135
146
|
* Used when the item's expansion is not controlled.
|
|
@@ -167,7 +178,9 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
167
178
|
* For each feature, if the flag is not explicitly set to `true`,
|
|
168
179
|
* the feature will be fully disabled and any property / method call will not have any effect.
|
|
169
180
|
*/
|
|
170
|
-
experimentalFeatures: PropTypes.
|
|
181
|
+
experimentalFeatures: PropTypes.shape({
|
|
182
|
+
lazyLoading: PropTypes.bool
|
|
183
|
+
}),
|
|
171
184
|
/**
|
|
172
185
|
* Used to determine the id of a given item.
|
|
173
186
|
*
|
|
@@ -232,7 +245,7 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
232
245
|
multiSelect: PropTypes.bool,
|
|
233
246
|
/**
|
|
234
247
|
* Callback fired when Tree Items are expanded/collapsed.
|
|
235
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
248
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
236
249
|
* @param {array} itemIds The ids of the expanded items.
|
|
237
250
|
*/
|
|
238
251
|
onExpandedItemsChange: PropTypes.func,
|
|
@@ -244,7 +257,7 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
244
257
|
onItemClick: PropTypes.func,
|
|
245
258
|
/**
|
|
246
259
|
* Callback fired when a Tree Item is expanded or collapsed.
|
|
247
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
260
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemExpansion()` method.
|
|
248
261
|
* @param {array} itemId The itemId of the modified item.
|
|
249
262
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
250
263
|
*/
|
|
@@ -271,14 +284,14 @@ process.env.NODE_ENV !== "production" ? RichTreeViewPro.propTypes = {
|
|
|
271
284
|
onItemPositionChange: PropTypes.func,
|
|
272
285
|
/**
|
|
273
286
|
* Callback fired when a Tree Item is selected or deselected.
|
|
274
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
287
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
275
288
|
* @param {array} itemId The itemId of the modified item.
|
|
276
289
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
277
290
|
*/
|
|
278
291
|
onItemSelectionToggle: PropTypes.func,
|
|
279
292
|
/**
|
|
280
293
|
* Callback fired when Tree Items are selected/deselected.
|
|
281
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
294
|
+
* @param {React.SyntheticEvent} event The DOM event that triggered the change. Can be null when the change is caused by the `publicAPI.setItemSelection()` method.
|
|
282
295
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
283
296
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
284
297
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, UseTreeViewIconsParameters, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewCorePluginParameters, UseTreeViewLabelParameters } from '@mui/x-tree-view/internals';
|
|
1
|
+
import { UseTreeViewItemsParameters, UseTreeViewExpansionParameters, UseTreeViewSelectionParameters, UseTreeViewFocusParameters, UseTreeViewIconsParameters, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewCorePluginParameters, UseTreeViewLabelParameters, UseTreeViewLazyLoadingParameters } from '@mui/x-tree-view/internals';
|
|
2
2
|
import { UseTreeViewItemsReorderingParameters } from "../internals/plugins/useTreeViewItemsReordering/index.js";
|
|
3
|
-
export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewIconsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals").UseTreeViewItemsReorderingSignature>];
|
|
3
|
+
export declare const RICH_TREE_VIEW_PRO_PLUGINS: readonly [import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewItemsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewExpansionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewSelectionSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewFocusSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewKeyboardNavigationSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewIconsSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLabelSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("@mui/x-tree-view/internals").UseTreeViewLazyLoadingSignature>, import("@mui/x-tree-view/internals").TreeViewPlugin<import("../internals").UseTreeViewItemsReorderingSignature>];
|
|
4
4
|
export type RichTreeViewProPluginSignatures = ConvertPluginsIntoSignatures<typeof RICH_TREE_VIEW_PRO_PLUGINS>;
|
|
5
5
|
export type RichTreeViewProPluginSlots = MergeSignaturesProperty<RichTreeViewProPluginSignatures, 'slots'>;
|
|
6
6
|
export type RichTreeViewProPluginSlotProps = MergeSignaturesProperty<RichTreeViewProPluginSignatures, 'slotProps'>;
|
|
7
|
-
export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewIconsParameters, UseTreeViewLabelParameters<R>, UseTreeViewItemsReorderingParameters {}
|
|
7
|
+
export interface RichTreeViewProPluginParameters<R extends {}, Multiple extends boolean | undefined> extends TreeViewCorePluginParameters, UseTreeViewItemsParameters<R>, UseTreeViewExpansionParameters, UseTreeViewFocusParameters, UseTreeViewSelectionParameters<Multiple>, UseTreeViewIconsParameters, UseTreeViewLabelParameters<R>, UseTreeViewLazyLoadingParameters<R>, UseTreeViewItemsReorderingParameters {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useTreeViewItems, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewIcons, useTreeViewLabel } from '@mui/x-tree-view/internals';
|
|
2
2
|
import { useTreeViewItemsReordering } from "../internals/plugins/useTreeViewItemsReordering/index.js";
|
|
3
|
-
|
|
3
|
+
import { useTreeViewLazyLoading } from "../internals/plugins/useTreeViewLazyLoading/index.js";
|
|
4
|
+
export const RICH_TREE_VIEW_PRO_PLUGINS = [useTreeViewItems, useTreeViewExpansion, useTreeViewSelection, useTreeViewFocus, useTreeViewKeyboardNavigation, useTreeViewIcons, useTreeViewLabel, useTreeViewLazyLoading, useTreeViewItemsReordering];
|
|
4
5
|
|
|
5
6
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|
package/esm/index.js
CHANGED
package/esm/internals/plugins/useTreeViewItemsReordering/useTreeViewItemsReordering.selectors.d.ts
CHANGED
|
@@ -89,6 +89,8 @@ export declare const selectorItemsReorderingDraggedItemProperties: ((state: any,
|
|
|
89
89
|
[itemId: string]: number;
|
|
90
90
|
};
|
|
91
91
|
};
|
|
92
|
+
loading: boolean;
|
|
93
|
+
error: Error | null;
|
|
92
94
|
}) => {
|
|
93
95
|
[itemId: string]: import("@mui/x-tree-view/internals").TreeViewItemMeta;
|
|
94
96
|
};
|
|
@@ -108,6 +110,8 @@ export declare const selectorItemsReorderingDraggedItemProperties: ((state: any,
|
|
|
108
110
|
[itemId: string]: number;
|
|
109
111
|
};
|
|
110
112
|
};
|
|
113
|
+
loading: boolean;
|
|
114
|
+
error: Error | null;
|
|
111
115
|
}) => {
|
|
112
116
|
[itemId: string]: import("@mui/x-tree-view/internals").TreeViewItemMeta;
|
|
113
117
|
}) & {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeViewLazyLoading } from "./useTreeViewLazyLoading.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeViewLazyLoading } from "./useTreeViewLazyLoading.js";
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import useLazyRef from '@mui/utils/useLazyRef';
|
|
4
|
+
import { warnOnce } from '@mui/x-internals/warning';
|
|
5
|
+
import useEventCallback from '@mui/utils/useEventCallback';
|
|
6
|
+
import { selectorItemMeta, selectorIsItemSelected, useInstanceEventHandler, selectorDataSourceState, selectorGetTreeItemError } from '@mui/x-tree-view/internals';
|
|
7
|
+
import { DataSourceCacheDefault } from '@mui/x-tree-view/utils';
|
|
8
|
+
import { NestedDataManager } from "./utils.js";
|
|
9
|
+
const INITIAL_STATE = {
|
|
10
|
+
loading: {},
|
|
11
|
+
errors: {}
|
|
12
|
+
};
|
|
13
|
+
const noopCache = {
|
|
14
|
+
clear: () => {},
|
|
15
|
+
get: () => undefined,
|
|
16
|
+
set: () => {}
|
|
17
|
+
};
|
|
18
|
+
function getCache(cacheProp) {
|
|
19
|
+
if (cacheProp === null) {
|
|
20
|
+
return noopCache;
|
|
21
|
+
}
|
|
22
|
+
return cacheProp ?? new DataSourceCacheDefault({});
|
|
23
|
+
}
|
|
24
|
+
export const useTreeViewLazyLoading = ({
|
|
25
|
+
instance,
|
|
26
|
+
params,
|
|
27
|
+
store
|
|
28
|
+
}) => {
|
|
29
|
+
const isLazyLoadingEnabled = params.dataSource?.getChildrenCount !== undefined;
|
|
30
|
+
const firstRenderRef = React.useRef(true);
|
|
31
|
+
const nestedDataManager = useLazyRef(() => new NestedDataManager(instance)).current;
|
|
32
|
+
const cacheRef = useLazyRef(() => getCache(params.dataSourceCache));
|
|
33
|
+
const setDataSourceLoading = useEventCallback((itemId, isLoading) => {
|
|
34
|
+
if (!isLazyLoadingEnabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
store.update(prevState => {
|
|
38
|
+
if (!prevState.lazyLoading.dataSource.loading[itemId] && !isLoading) {
|
|
39
|
+
return prevState;
|
|
40
|
+
}
|
|
41
|
+
const loading = _extends({}, prevState.lazyLoading.dataSource.loading);
|
|
42
|
+
if (isLoading === false) {
|
|
43
|
+
delete loading[itemId];
|
|
44
|
+
} else {
|
|
45
|
+
loading[itemId] = isLoading;
|
|
46
|
+
}
|
|
47
|
+
return _extends({}, prevState, {
|
|
48
|
+
lazyLoading: _extends({}, prevState.lazyLoading, {
|
|
49
|
+
dataSource: _extends({}, prevState.lazyLoading.dataSource, {
|
|
50
|
+
loading
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
const setDataSourceError = (itemId, error) => {
|
|
57
|
+
if (!isLazyLoadingEnabled) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
store.update(prevState => {
|
|
61
|
+
const errors = _extends({}, prevState.lazyLoading.dataSource.errors);
|
|
62
|
+
if (error === null && errors[itemId] !== undefined) {
|
|
63
|
+
delete errors[itemId];
|
|
64
|
+
} else {
|
|
65
|
+
errors[itemId] = error;
|
|
66
|
+
}
|
|
67
|
+
errors[itemId] = error;
|
|
68
|
+
return _extends({}, prevState, {
|
|
69
|
+
lazyLoading: _extends({}, prevState.lazyLoading, {
|
|
70
|
+
dataSource: _extends({}, prevState.lazyLoading.dataSource, {
|
|
71
|
+
errors
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const resetDataSourceState = useEventCallback(() => {
|
|
78
|
+
if (!isLazyLoadingEnabled) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
store.update(prevState => _extends({}, prevState, {
|
|
82
|
+
lazyLoading: _extends({}, prevState.lazyLoading, {
|
|
83
|
+
dataSource: INITIAL_STATE
|
|
84
|
+
})
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
const fetchItems = useEventCallback(async parentIds => {
|
|
88
|
+
if (!isLazyLoadingEnabled) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
92
|
+
const getTreeItems = params.dataSource?.getTreeItems;
|
|
93
|
+
if (!getTreeItems) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (parentIds) {
|
|
97
|
+
await nestedDataManager.queue(parentIds);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
nestedDataManager.clear();
|
|
101
|
+
|
|
102
|
+
// reset the state if we are refetching the first visible items
|
|
103
|
+
if (selectorDataSourceState(store.value) !== INITIAL_STATE) {
|
|
104
|
+
resetDataSourceState();
|
|
105
|
+
}
|
|
106
|
+
// handle caching here
|
|
107
|
+
const cachedData = cacheRef.current.get('root');
|
|
108
|
+
if (cachedData !== undefined) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// handle loading here
|
|
113
|
+
instance.setTreeViewLoading(true);
|
|
114
|
+
try {
|
|
115
|
+
const getTreeItemsResponse = await getTreeItems();
|
|
116
|
+
|
|
117
|
+
// set caching
|
|
118
|
+
cacheRef.current.set('root', getTreeItemsResponse);
|
|
119
|
+
|
|
120
|
+
// update the items in the state
|
|
121
|
+
instance.addItems({
|
|
122
|
+
items: getTreeItemsResponse,
|
|
123
|
+
depth: 0,
|
|
124
|
+
getChildrenCount
|
|
125
|
+
});
|
|
126
|
+
} catch (error) {
|
|
127
|
+
// set the items to empty
|
|
128
|
+
instance.addItems({
|
|
129
|
+
items: [],
|
|
130
|
+
depth: 0,
|
|
131
|
+
getChildrenCount
|
|
132
|
+
});
|
|
133
|
+
// set error state
|
|
134
|
+
instance.setTreeViewError(error);
|
|
135
|
+
} finally {
|
|
136
|
+
// set loading state
|
|
137
|
+
instance.setTreeViewLoading(false);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
const fetchItemChildren = useEventCallback(async id => {
|
|
141
|
+
if (!isLazyLoadingEnabled) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
145
|
+
const getTreeItems = params.dataSource?.getTreeItems;
|
|
146
|
+
if (!getTreeItems) {
|
|
147
|
+
nestedDataManager.clearPendingRequest(id);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const parent = selectorItemMeta(store.value, id);
|
|
151
|
+
if (!parent) {
|
|
152
|
+
nestedDataManager.clearPendingRequest(id);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const depth = parent.depth ? parent.depth + 1 : 1;
|
|
156
|
+
|
|
157
|
+
// handle loading here
|
|
158
|
+
instance.setDataSourceLoading(id, true);
|
|
159
|
+
|
|
160
|
+
// handle caching here
|
|
161
|
+
const cachedData = cacheRef.current.get(id);
|
|
162
|
+
if (cachedData !== undefined && cachedData !== -1) {
|
|
163
|
+
nestedDataManager.setRequestSettled(id);
|
|
164
|
+
instance.addItems({
|
|
165
|
+
items: cachedData,
|
|
166
|
+
depth,
|
|
167
|
+
parentId: id,
|
|
168
|
+
getChildrenCount
|
|
169
|
+
});
|
|
170
|
+
instance.setDataSourceLoading(id, false);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (cachedData === -1) {
|
|
174
|
+
instance.removeChildren(id);
|
|
175
|
+
}
|
|
176
|
+
const existingError = selectorGetTreeItemError(store.value, id) ?? null;
|
|
177
|
+
if (existingError) {
|
|
178
|
+
instance.setDataSourceError(id, null);
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const getTreeItemsResponse = await getTreeItems(id);
|
|
182
|
+
nestedDataManager.setRequestSettled(id);
|
|
183
|
+
|
|
184
|
+
// set caching
|
|
185
|
+
cacheRef.current.set(id, getTreeItemsResponse);
|
|
186
|
+
// update the items in the state
|
|
187
|
+
instance.addItems({
|
|
188
|
+
items: getTreeItemsResponse,
|
|
189
|
+
depth,
|
|
190
|
+
parentId: id,
|
|
191
|
+
getChildrenCount
|
|
192
|
+
});
|
|
193
|
+
} catch (error) {
|
|
194
|
+
const childrenFetchError = error;
|
|
195
|
+
// handle errors here
|
|
196
|
+
instance.setDataSourceError(id, childrenFetchError);
|
|
197
|
+
instance.removeChildren(id);
|
|
198
|
+
} finally {
|
|
199
|
+
// unset loading
|
|
200
|
+
instance.setDataSourceLoading(id, false);
|
|
201
|
+
nestedDataManager.setRequestSettled(id);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
useInstanceEventHandler(instance, 'beforeItemToggleExpansion', async eventParameters => {
|
|
205
|
+
if (!isLazyLoadingEnabled || !eventParameters.shouldBeExpanded) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
eventParameters.isExpansionPrevented = true;
|
|
209
|
+
await instance.fetchItems([eventParameters.itemId]);
|
|
210
|
+
const fetchErrors = Boolean(selectorGetTreeItemError(store.value, eventParameters.itemId));
|
|
211
|
+
if (!fetchErrors) {
|
|
212
|
+
instance.applyItemExpansion({
|
|
213
|
+
itemId: eventParameters.itemId,
|
|
214
|
+
shouldBeExpanded: true,
|
|
215
|
+
event: eventParameters.event
|
|
216
|
+
});
|
|
217
|
+
if (selectorIsItemSelected(store.value, eventParameters.itemId)) {
|
|
218
|
+
// make sure selection propagation works correctly
|
|
219
|
+
instance.setItemSelection({
|
|
220
|
+
event: eventParameters.event,
|
|
221
|
+
itemId: eventParameters.itemId,
|
|
222
|
+
keepExistingSelection: true,
|
|
223
|
+
shouldBeSelected: true
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
React.useEffect(() => {
|
|
229
|
+
if (isLazyLoadingEnabled && firstRenderRef.current) {
|
|
230
|
+
store.update(prevState => _extends({}, prevState, {
|
|
231
|
+
lazyLoading: _extends({}, prevState.lazyLoading, {
|
|
232
|
+
enabled: true
|
|
233
|
+
})
|
|
234
|
+
}));
|
|
235
|
+
if (params.items.length) {
|
|
236
|
+
const getChildrenCount = params.dataSource?.getChildrenCount || (() => 0);
|
|
237
|
+
instance.addItems({
|
|
238
|
+
items: params.items,
|
|
239
|
+
depth: 0,
|
|
240
|
+
getChildrenCount
|
|
241
|
+
});
|
|
242
|
+
} else {
|
|
243
|
+
instance.fetchItems();
|
|
244
|
+
}
|
|
245
|
+
firstRenderRef.current = false;
|
|
246
|
+
}
|
|
247
|
+
}, [instance, params.items, params.dataSource, isLazyLoadingEnabled, store]);
|
|
248
|
+
if (isLazyLoadingEnabled) {
|
|
249
|
+
instance.preventItemUpdates();
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
instance: {
|
|
253
|
+
fetchItemChildren,
|
|
254
|
+
fetchItems,
|
|
255
|
+
setDataSourceLoading,
|
|
256
|
+
setDataSourceError
|
|
257
|
+
},
|
|
258
|
+
publicAPI: {}
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
useTreeViewLazyLoading.getDefaultizedParams = ({
|
|
262
|
+
params,
|
|
263
|
+
experimentalFeatures
|
|
264
|
+
}) => {
|
|
265
|
+
const canUseFeature = experimentalFeatures?.lazyLoading;
|
|
266
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
267
|
+
if (params.dataSource && !canUseFeature) {
|
|
268
|
+
warnOnce(['MUI X: The label editing feature requires the `lazyLoading` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ lazyLoading: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/lazy-loading/']);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const defaultDataSource = params?.dataSource ?? {
|
|
272
|
+
getChildrenCount: () => 0,
|
|
273
|
+
getTreeItems: () => Promise.resolve([])
|
|
274
|
+
};
|
|
275
|
+
return _extends({}, params, {
|
|
276
|
+
dataSource: canUseFeature ? defaultDataSource : {}
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
useTreeViewLazyLoading.getInitialState = () => ({
|
|
280
|
+
lazyLoading: {
|
|
281
|
+
enabled: false,
|
|
282
|
+
dataSource: INITIAL_STATE
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
useTreeViewLazyLoading.params = {
|
|
286
|
+
dataSource: true,
|
|
287
|
+
dataSourceCache: true
|
|
288
|
+
};
|