@mui/x-tree-view 9.12.0 → 9.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/RichTreeView/RichTreeView.js +30 -25
  3. package/RichTreeView/RichTreeView.mjs +30 -25
  4. package/RichTreeView/RichTreeView.types.d.mts +27 -1
  5. package/RichTreeView/RichTreeView.types.d.ts +27 -1
  6. package/RichTreeView/richTreeViewClasses.d.mts +4 -1
  7. package/RichTreeView/richTreeViewClasses.d.ts +4 -1
  8. package/RichTreeView/richTreeViewClasses.js +1 -1
  9. package/RichTreeView/richTreeViewClasses.mjs +1 -1
  10. package/RichTreeView/useExtractRichTreeViewParameters.d.mts +1 -0
  11. package/RichTreeView/useExtractRichTreeViewParameters.d.ts +1 -0
  12. package/RichTreeView/useExtractRichTreeViewParameters.js +6 -3
  13. package/RichTreeView/useExtractRichTreeViewParameters.mjs +6 -3
  14. package/SimpleTreeView/simpleTreeViewClasses.d.mts +1 -1
  15. package/SimpleTreeView/simpleTreeViewClasses.d.ts +1 -1
  16. package/TreeItem/TreeItem.js +2 -1
  17. package/TreeItem/TreeItem.mjs +2 -1
  18. package/TreeItemLoader/TreeItemLoader.d.mts +20 -0
  19. package/TreeItemLoader/TreeItemLoader.d.ts +20 -0
  20. package/TreeItemLoader/TreeItemLoader.js +152 -0
  21. package/TreeItemLoader/TreeItemLoader.mjs +146 -0
  22. package/TreeItemLoader/TreeItemLoader.types.d.mts +36 -0
  23. package/TreeItemLoader/TreeItemLoader.types.d.ts +36 -0
  24. package/TreeItemLoader/TreeItemLoader.types.js +5 -0
  25. package/TreeItemLoader/TreeItemLoader.types.mjs +1 -0
  26. package/TreeItemLoader/TreeItemLoaderContext.d.mts +24 -0
  27. package/TreeItemLoader/TreeItemLoaderContext.d.ts +24 -0
  28. package/TreeItemLoader/TreeItemLoaderContext.js +22 -0
  29. package/TreeItemLoader/TreeItemLoaderContext.mjs +16 -0
  30. package/TreeItemLoader/index.d.mts +3 -0
  31. package/TreeItemLoader/index.d.ts +3 -0
  32. package/TreeItemLoader/index.js +34 -0
  33. package/TreeItemLoader/index.mjs +2 -0
  34. package/TreeItemLoader/treeItemLoaderClasses.d.mts +13 -0
  35. package/TreeItemLoader/treeItemLoaderClasses.d.ts +13 -0
  36. package/TreeItemLoader/treeItemLoaderClasses.js +14 -0
  37. package/TreeItemLoader/treeItemLoaderClasses.mjs +6 -0
  38. package/index.d.mts +1 -0
  39. package/index.d.ts +1 -0
  40. package/index.js +12 -1
  41. package/index.mjs +2 -1
  42. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.js +2 -2
  43. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.mjs +3 -3
  44. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.types.d.mts +4 -0
  45. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.types.d.ts +4 -0
  46. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.utils.d.mts +1 -2
  47. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.utils.d.ts +1 -2
  48. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.utils.js +2 -9
  49. package/internals/MinimalTreeViewStore/MinimalTreeViewStore.utils.mjs +2 -7
  50. package/internals/TreeViewProvider/TreeViewProvider.js +7 -3
  51. package/internals/TreeViewProvider/TreeViewProvider.mjs +7 -3
  52. package/internals/TreeViewProvider/TreeViewProvider.types.d.mts +3 -3
  53. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  54. package/internals/TreeViewProvider/TreeViewStyleContext.d.mts +30 -2
  55. package/internals/TreeViewProvider/TreeViewStyleContext.d.ts +30 -2
  56. package/internals/TreeViewProvider/TreeViewStyleContext.js +12 -0
  57. package/internals/TreeViewProvider/TreeViewStyleContext.mjs +13 -0
  58. package/internals/components/RichTreeViewItems.js +59 -2
  59. package/internals/components/RichTreeViewItems.mjs +59 -2
  60. package/internals/components/RichTreeViewLoading.d.mts +97 -0
  61. package/internals/components/RichTreeViewLoading.d.ts +97 -0
  62. package/internals/components/RichTreeViewLoading.js +171 -0
  63. package/internals/components/RichTreeViewLoading.mjs +160 -0
  64. package/internals/constants.d.mts +6 -0
  65. package/internals/constants.d.ts +6 -0
  66. package/internals/constants.js +12 -0
  67. package/internals/constants.mjs +6 -0
  68. package/internals/hooks/useTreeViewStore.d.mts +1 -1
  69. package/internals/hooks/useTreeViewStore.d.ts +1 -1
  70. package/internals/hooks/useTreeViewStore.js +7 -3
  71. package/internals/hooks/useTreeViewStore.mjs +7 -3
  72. package/internals/index.d.mts +2 -0
  73. package/internals/index.d.ts +2 -0
  74. package/internals/index.js +13 -0
  75. package/internals/index.mjs +1 -0
  76. package/internals/plugins/expansion/selectors.d.mts +3 -2
  77. package/internals/plugins/expansion/selectors.d.ts +3 -2
  78. package/internals/plugins/expansion/selectors.js +4 -4
  79. package/internals/plugins/expansion/selectors.mjs +5 -5
  80. package/internals/plugins/focus/selectors.d.mts +3 -2
  81. package/internals/plugins/focus/selectors.d.ts +3 -2
  82. package/internals/plugins/focus/selectors.js +3 -3
  83. package/internals/plugins/focus/selectors.mjs +4 -4
  84. package/internals/plugins/id/selectors.d.mts +6 -3
  85. package/internals/plugins/id/selectors.d.ts +6 -3
  86. package/internals/plugins/id/selectors.js +4 -5
  87. package/internals/plugins/id/selectors.mjs +4 -5
  88. package/internals/plugins/items/selectors.d.mts +9 -8
  89. package/internals/plugins/items/selectors.d.ts +9 -8
  90. package/internals/plugins/items/selectors.js +15 -16
  91. package/internals/plugins/items/selectors.mjs +15 -16
  92. package/internals/plugins/labelEditing/selectors.d.mts +3 -2
  93. package/internals/plugins/labelEditing/selectors.d.ts +3 -2
  94. package/internals/plugins/labelEditing/selectors.js +6 -5
  95. package/internals/plugins/labelEditing/selectors.mjs +6 -5
  96. package/internals/plugins/lazyLoading/selectors.d.mts +9 -3
  97. package/internals/plugins/lazyLoading/selectors.d.ts +9 -3
  98. package/internals/plugins/lazyLoading/selectors.js +10 -6
  99. package/internals/plugins/lazyLoading/selectors.mjs +10 -6
  100. package/internals/plugins/lazyLoading/types.d.mts +5 -1
  101. package/internals/plugins/lazyLoading/types.d.ts +5 -1
  102. package/internals/plugins/selection/selectors.d.mts +15 -9
  103. package/internals/plugins/selection/selectors.d.ts +15 -9
  104. package/internals/plugins/selection/selectors.js +12 -12
  105. package/internals/plugins/selection/selectors.mjs +13 -13
  106. package/package.json +19 -7
  107. package/useTreeItem/useTreeItem.js +3 -3
  108. package/useTreeItem/useTreeItem.mjs +3 -3
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v9.12.0
2
+ * @mui/x-tree-view v9.13.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -16,6 +16,7 @@ export * from "./TreeItemIcon/index.mjs";
16
16
  export * from "./TreeItemProvider/index.mjs";
17
17
  export * from "./TreeItemDragAndDropOverlay/index.mjs";
18
18
  export * from "./TreeItemLabelInput/index.mjs";
19
+ export * from "./TreeItemLoader/index.mjs";
19
20
  export * from "./models/index.mjs";
20
21
  export * from "./icons/index.mjs";
21
22
  export * from "./hooks/index.mjs";
@@ -77,8 +77,8 @@ class MinimalTreeViewStore extends _store.Store {
77
77
  const newMinimalState = (0, _MinimalTreeViewStore.deriveStateFromParameters)(parameters);
78
78
  updateModel(newMinimalState, 'expandedItems', 'defaultExpandedItems');
79
79
  updateModel(newMinimalState, 'selectedItems', 'defaultSelectedItems');
80
- if (this.state.providedTreeId !== parameters.id || this.state.treeId === undefined) {
81
- newMinimalState.treeId = (0, _MinimalTreeViewStore.createTreeViewDefaultId)();
80
+ if (this.state.treeId !== parameters.defaultId) {
81
+ newMinimalState.treeId = parameters.defaultId;
82
82
  }
83
83
  if (!this.mapper.shouldIgnoreItemsStateUpdate(parameters) && _TreeViewItemsPlugin.TreeViewItemsPlugin.shouldRebuildItemsState(parameters, this.parameters)) {
84
84
  Object.assign(newMinimalState, _TreeViewItemsPlugin.TreeViewItemsPlugin.buildItemsStateIfNeeded(parameters));
@@ -3,7 +3,7 @@ import { Store } from '@mui/x-internals/store';
3
3
  import { warnOnce } from '@mui/x-internals/warning';
4
4
  import { EventManager } from '@mui/x-internals/EventManager';
5
5
  import { DisposableStack, disposeSymbol, unwrapSuppressedErrors } from '@mui/x-internals/disposable';
6
- import { createMinimalInitialState, createTreeViewDefaultId, deriveStateFromParameters } from "./MinimalTreeViewStore.utils.mjs";
6
+ import { createMinimalInitialState, deriveStateFromParameters } from "./MinimalTreeViewStore.utils.mjs";
7
7
  import { TimeoutManager } from "./TimeoutManager.mjs";
8
8
  import { TreeViewKeyboardNavigationPlugin } from "../plugins/keyboardNavigation/index.mjs";
9
9
  import { TreeViewFocusPlugin } from "../plugins/focus/TreeViewFocusPlugin.mjs";
@@ -70,8 +70,8 @@ export class MinimalTreeViewStore extends Store {
70
70
  const newMinimalState = deriveStateFromParameters(parameters);
71
71
  updateModel(newMinimalState, 'expandedItems', 'defaultExpandedItems');
72
72
  updateModel(newMinimalState, 'selectedItems', 'defaultSelectedItems');
73
- if (this.state.providedTreeId !== parameters.id || this.state.treeId === undefined) {
74
- newMinimalState.treeId = createTreeViewDefaultId();
73
+ if (this.state.treeId !== parameters.defaultId) {
74
+ newMinimalState.treeId = parameters.defaultId;
75
75
  }
76
76
  if (!this.mapper.shouldIgnoreItemsStateUpdate(parameters) && TreeViewItemsPlugin.shouldRebuildItemsState(parameters, this.parameters)) {
77
77
  Object.assign(newMinimalState, TreeViewItemsPlugin.buildItemsStateIfNeeded(parameters));
@@ -88,6 +88,10 @@ export interface MinimalTreeViewState<R extends TreeViewValidItem<R>, Multiple e
88
88
  itemHeight: number | null;
89
89
  }
90
90
  export interface MinimalTreeViewParameters<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined> {
91
+ /**
92
+ * The id used to build the id attributes of the items when the `id` parameter is not provided.
93
+ */
94
+ defaultId: string | undefined;
91
95
  /**
92
96
  * Whether the layout is right-to-left.
93
97
  */
@@ -88,6 +88,10 @@ export interface MinimalTreeViewState<R extends TreeViewValidItem<R>, Multiple e
88
88
  itemHeight: number | null;
89
89
  }
90
90
  export interface MinimalTreeViewParameters<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined> {
91
+ /**
92
+ * The id used to build the id attributes of the items when the `id` parameter is not provided.
93
+ */
94
+ defaultId: string | undefined;
91
95
  /**
92
96
  * Whether the layout is right-to-left.
93
97
  */
@@ -17,5 +17,4 @@ export declare function deriveStateFromParameters<R extends TreeViewValidItem<R>
17
17
  selectionPropagation: Readonly<{}>;
18
18
  itemHeight: number | null;
19
19
  };
20
- export declare function createMinimalInitialState<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined>(parameters: MinimalTreeViewParameters<R, Multiple>): MinimalTreeViewState<R, Multiple>;
21
- export declare const createTreeViewDefaultId: () => string;
20
+ export declare function createMinimalInitialState<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined>(parameters: MinimalTreeViewParameters<R, Multiple>): MinimalTreeViewState<R, Multiple>;
@@ -17,5 +17,4 @@ export declare function deriveStateFromParameters<R extends TreeViewValidItem<R>
17
17
  selectionPropagation: Readonly<{}>;
18
18
  itemHeight: number | null;
19
19
  };
20
- export declare function createMinimalInitialState<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined>(parameters: MinimalTreeViewParameters<R, Multiple>): MinimalTreeViewState<R, Multiple>;
21
- export declare const createTreeViewDefaultId: () => string;
20
+ export declare function createMinimalInitialState<R extends TreeViewValidItem<R>, Multiple extends boolean | undefined>(parameters: MinimalTreeViewParameters<R, Multiple>): MinimalTreeViewState<R, Multiple>;
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.createMinimalInitialState = createMinimalInitialState;
8
- exports.createTreeViewDefaultId = void 0;
9
8
  exports.deriveStateFromParameters = deriveStateFromParameters;
10
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
10
  var _empty = require("@base-ui/utils/empty");
@@ -43,16 +42,10 @@ function applyModelInitialValue(controlledValue, defaultValue, fallback) {
43
42
  }
44
43
  function createMinimalInitialState(parameters) {
45
44
  return (0, _extends2.default)({
46
- treeId: undefined,
45
+ treeId: parameters.defaultId,
47
46
  focusedItemId: null
48
47
  }, deriveStateFromParameters(parameters), _items.TreeViewItemsPlugin.buildItemsStateIfNeeded(parameters), {
49
48
  expandedItems: applyModelInitialValue(parameters.expandedItems, parameters.defaultExpandedItems, []),
50
49
  selectedItems: applyModelInitialValue(parameters.selectedItems, parameters.defaultSelectedItems, parameters.multiSelect ? _empty.EMPTY_ARRAY : null)
51
50
  });
52
- }
53
- let globalTreeViewDefaultId = 0;
54
- const createTreeViewDefaultId = () => {
55
- globalTreeViewDefaultId += 1;
56
- return `mui-tree-view-${globalTreeViewDefaultId}`;
57
- };
58
- exports.createTreeViewDefaultId = createTreeViewDefaultId;
51
+ }
@@ -35,15 +35,10 @@ function applyModelInitialValue(controlledValue, defaultValue, fallback) {
35
35
  }
36
36
  export function createMinimalInitialState(parameters) {
37
37
  return _extends({
38
- treeId: undefined,
38
+ treeId: parameters.defaultId,
39
39
  focusedItemId: null
40
40
  }, deriveStateFromParameters(parameters), TreeViewItemsPlugin.buildItemsStateIfNeeded(parameters), {
41
41
  expandedItems: applyModelInitialValue(parameters.expandedItems, parameters.defaultExpandedItems, []),
42
42
  selectedItems: applyModelInitialValue(parameters.selectedItems, parameters.defaultSelectedItems, parameters.multiSelect ? EMPTY_ARRAY : null)
43
43
  });
44
- }
45
- let globalTreeViewDefaultId = 0;
46
- export const createTreeViewDefaultId = () => {
47
- globalTreeViewDefaultId += 1;
48
- return `mui-tree-view-${globalTreeViewDefaultId}`;
49
- };
44
+ }
@@ -36,14 +36,18 @@ function TreeViewProvider(props) {
36
36
  slots: {
37
37
  collapseIcon: slots.collapseIcon,
38
38
  expandIcon: slots.expandIcon,
39
- endIcon: slots.endIcon
39
+ endIcon: slots.endIcon,
40
+ loading: slots.loading,
41
+ itemLoader: slots.itemLoader
40
42
  },
41
43
  slotProps: {
42
44
  collapseIcon: slotProps.collapseIcon,
43
45
  expandIcon: slotProps.expandIcon,
44
- endIcon: slotProps.endIcon
46
+ endIcon: slotProps.endIcon,
47
+ loading: slotProps.loading,
48
+ itemLoader: slotProps.itemLoader
45
49
  }
46
- }), [classes, slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
50
+ }), [classes, slots.collapseIcon, slots.expandIcon, slots.endIcon, slots.loading, slots.itemLoader, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon, slotProps.loading, slotProps.itemLoader]);
47
51
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewContext.TreeViewContext.Provider, {
48
52
  value: contextValue,
49
53
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewStyleContext.TreeViewStyleContext.Provider, {
@@ -29,14 +29,18 @@ export function TreeViewProvider(props) {
29
29
  slots: {
30
30
  collapseIcon: slots.collapseIcon,
31
31
  expandIcon: slots.expandIcon,
32
- endIcon: slots.endIcon
32
+ endIcon: slots.endIcon,
33
+ loading: slots.loading,
34
+ itemLoader: slots.itemLoader
33
35
  },
34
36
  slotProps: {
35
37
  collapseIcon: slotProps.collapseIcon,
36
38
  expandIcon: slotProps.expandIcon,
37
- endIcon: slotProps.endIcon
39
+ endIcon: slotProps.endIcon,
40
+ loading: slotProps.loading,
41
+ itemLoader: slotProps.itemLoader
38
42
  }
39
- }), [classes, slots.collapseIcon, slots.expandIcon, slots.endIcon, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon]);
43
+ }), [classes, slots.collapseIcon, slots.expandIcon, slots.endIcon, slots.loading, slots.itemLoader, slotProps.collapseIcon, slotProps.expandIcon, slotProps.endIcon, slotProps.loading, slotProps.itemLoader]);
40
44
  return /*#__PURE__*/_jsx(TreeViewContext.Provider, {
41
45
  value: contextValue,
42
46
  children: /*#__PURE__*/_jsx(TreeViewStyleContext.Provider, {
@@ -2,7 +2,7 @@ import type * as React from 'react';
2
2
  import type { disposeSymbol } from '@mui/x-internals/disposable';
3
3
  import type { TreeItemWrapper, TreeViewItemPluginResponse, TreeViewPublicAPI, TreeViewAnyStore } from "../models/index.mjs";
4
4
  import type { TreeItemProps } from "../../TreeItem/TreeItem.types.mjs";
5
- import type { TreeViewClasses, TreeViewSlotProps, TreeViewSlots } from "./TreeViewStyleContext.mjs";
5
+ import type { TreeViewClasses, TreeViewStyleContextSlotProps, TreeViewStyleContextSlots } from "./TreeViewStyleContext.mjs";
6
6
  import type { UseTreeViewBuildContextParameters } from "./useTreeViewBuildContext.mjs";
7
7
  export type TreeViewItemPluginsRunner = (props: TreeItemProps) => Required<TreeViewItemPluginResponse>;
8
8
  export type TreeViewStoreInContext<TStore extends TreeViewAnyStore> = Omit<TStore, 'setState' | 'update' | 'set' | 'updateStateFromParameters' | 'disposables' | typeof disposeSymbol | 'mountEffect' | 'registerStoreEffect' | 'itemPluginManager' | 'parameters'>;
@@ -16,6 +16,6 @@ export interface TreeViewContextValue<TStore extends TreeViewAnyStore> {
16
16
  export interface TreeViewProviderProps<TStore extends TreeViewAnyStore> extends UseTreeViewBuildContextParameters<TStore> {
17
17
  children: React.ReactNode;
18
18
  classes: Partial<TreeViewClasses> | undefined;
19
- slots: TreeViewSlots | undefined;
20
- slotProps: TreeViewSlotProps | undefined;
19
+ slots: TreeViewStyleContextSlots | undefined;
20
+ slotProps: TreeViewStyleContextSlotProps | undefined;
21
21
  }
@@ -2,7 +2,7 @@ import type * as React from 'react';
2
2
  import type { disposeSymbol } from '@mui/x-internals/disposable';
3
3
  import type { TreeItemWrapper, TreeViewItemPluginResponse, TreeViewPublicAPI, TreeViewAnyStore } from "../models/index.js";
4
4
  import type { TreeItemProps } from "../../TreeItem/TreeItem.types.js";
5
- import type { TreeViewClasses, TreeViewSlotProps, TreeViewSlots } from "./TreeViewStyleContext.js";
5
+ import type { TreeViewClasses, TreeViewStyleContextSlotProps, TreeViewStyleContextSlots } from "./TreeViewStyleContext.js";
6
6
  import type { UseTreeViewBuildContextParameters } from "./useTreeViewBuildContext.js";
7
7
  export type TreeViewItemPluginsRunner = (props: TreeItemProps) => Required<TreeViewItemPluginResponse>;
8
8
  export type TreeViewStoreInContext<TStore extends TreeViewAnyStore> = Omit<TStore, 'setState' | 'update' | 'set' | 'updateStateFromParameters' | 'disposables' | typeof disposeSymbol | 'mountEffect' | 'registerStoreEffect' | 'itemPluginManager' | 'parameters'>;
@@ -16,6 +16,6 @@ export interface TreeViewContextValue<TStore extends TreeViewAnyStore> {
16
16
  export interface TreeViewProviderProps<TStore extends TreeViewAnyStore> extends UseTreeViewBuildContextParameters<TStore> {
17
17
  children: React.ReactNode;
18
18
  classes: Partial<TreeViewClasses> | undefined;
19
- slots: TreeViewSlots | undefined;
20
- slotProps: TreeViewSlotProps | undefined;
19
+ slots: TreeViewStyleContextSlots | undefined;
20
+ slotProps: TreeViewStyleContextSlotProps | undefined;
21
21
  }
@@ -1,5 +1,7 @@
1
1
  import type { SlotComponentProps } from '@mui/utils/types';
2
2
  import * as React from 'react';
3
+ import type { TreeItemLoaderOwnerState } from "../../TreeItemLoader/index.mjs";
4
+ import type { RichTreeViewLoadingSlotOwnProps, RichTreeViewLoadingSlotOwnerState } from "../components/RichTreeViewLoading.mjs";
3
5
  export interface TreeViewClasses {
4
6
  /** Styles applied to the root element. */
5
7
  root: string;
@@ -23,6 +25,8 @@ export interface TreeViewClasses {
23
25
  itemErrorIcon: string;
24
26
  /** Styles applied to the item's loading icon element */
25
27
  itemLoadingIcon: string;
28
+ /** Styles applied to the item loader element. */
29
+ itemLoader: string;
26
30
  }
27
31
  export interface TreeViewSlots {
28
32
  /**
@@ -44,10 +48,34 @@ export interface TreeViewSlotProps {
44
48
  expandIcon?: SlotComponentProps<'svg', {}, {}>;
45
49
  endIcon?: SlotComponentProps<'svg', {}, {}>;
46
50
  }
51
+ /**
52
+ * Slots stored in the style context.
53
+ * The loading slots only exist on the components with a loading state,
54
+ * so they are not part of the public `TreeViewSlots` interface.
55
+ */
56
+ export interface TreeViewStyleContextSlots extends TreeViewSlots {
57
+ /**
58
+ * Component rendered instead of the default loading rows.
59
+ */
60
+ loading?: React.ElementType;
61
+ /**
62
+ * Component rendered for each loading row. The default renders a skeleton row.
63
+ */
64
+ itemLoader?: React.ElementType;
65
+ }
66
+ /**
67
+ * Slot props stored in the style context.
68
+ * The loading slot props only exist on the components with a loading state,
69
+ * so they are not part of the public `TreeViewSlotProps` interface.
70
+ */
71
+ export interface TreeViewStyleContextSlotProps extends TreeViewSlotProps {
72
+ loading?: SlotComponentProps<'div', RichTreeViewLoadingSlotOwnProps, RichTreeViewLoadingSlotOwnerState>;
73
+ itemLoader?: SlotComponentProps<'li', {}, TreeItemLoaderOwnerState>;
74
+ }
47
75
  export interface TreeViewStyleContextValue {
48
76
  classes: Partial<TreeViewClasses>;
49
- slots: TreeViewSlots;
50
- slotProps: TreeViewSlotProps;
77
+ slots: TreeViewStyleContextSlots;
78
+ slotProps: TreeViewStyleContextSlotProps;
51
79
  }
52
80
  /**
53
81
  * @ignore - internal component.
@@ -1,5 +1,7 @@
1
1
  import type { SlotComponentProps } from '@mui/utils/types';
2
2
  import * as React from 'react';
3
+ import type { TreeItemLoaderOwnerState } from "../../TreeItemLoader/index.js";
4
+ import type { RichTreeViewLoadingSlotOwnProps, RichTreeViewLoadingSlotOwnerState } from "../components/RichTreeViewLoading.js";
3
5
  export interface TreeViewClasses {
4
6
  /** Styles applied to the root element. */
5
7
  root: string;
@@ -23,6 +25,8 @@ export interface TreeViewClasses {
23
25
  itemErrorIcon: string;
24
26
  /** Styles applied to the item's loading icon element */
25
27
  itemLoadingIcon: string;
28
+ /** Styles applied to the item loader element. */
29
+ itemLoader: string;
26
30
  }
27
31
  export interface TreeViewSlots {
28
32
  /**
@@ -44,10 +48,34 @@ export interface TreeViewSlotProps {
44
48
  expandIcon?: SlotComponentProps<'svg', {}, {}>;
45
49
  endIcon?: SlotComponentProps<'svg', {}, {}>;
46
50
  }
51
+ /**
52
+ * Slots stored in the style context.
53
+ * The loading slots only exist on the components with a loading state,
54
+ * so they are not part of the public `TreeViewSlots` interface.
55
+ */
56
+ export interface TreeViewStyleContextSlots extends TreeViewSlots {
57
+ /**
58
+ * Component rendered instead of the default loading rows.
59
+ */
60
+ loading?: React.ElementType;
61
+ /**
62
+ * Component rendered for each loading row. The default renders a skeleton row.
63
+ */
64
+ itemLoader?: React.ElementType;
65
+ }
66
+ /**
67
+ * Slot props stored in the style context.
68
+ * The loading slot props only exist on the components with a loading state,
69
+ * so they are not part of the public `TreeViewSlotProps` interface.
70
+ */
71
+ export interface TreeViewStyleContextSlotProps extends TreeViewSlotProps {
72
+ loading?: SlotComponentProps<'div', RichTreeViewLoadingSlotOwnProps, RichTreeViewLoadingSlotOwnerState>;
73
+ itemLoader?: SlotComponentProps<'li', {}, TreeItemLoaderOwnerState>;
74
+ }
47
75
  export interface TreeViewStyleContextValue {
48
76
  classes: Partial<TreeViewClasses>;
49
- slots: TreeViewSlots;
50
- slotProps: TreeViewSlotProps;
77
+ slots: TreeViewStyleContextSlots;
78
+ slotProps: TreeViewStyleContextSlotProps;
51
79
  }
52
80
  /**
53
81
  * @ignore - internal component.
@@ -7,6 +7,18 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.useTreeViewStyleContext = exports.TreeViewStyleContext = void 0;
9
9
  var React = _interopRequireWildcard(require("react"));
10
+ /**
11
+ * Slots stored in the style context.
12
+ * The loading slots only exist on the components with a loading state,
13
+ * so they are not part of the public `TreeViewSlots` interface.
14
+ */
15
+
16
+ /**
17
+ * Slot props stored in the style context.
18
+ * The loading slot props only exist on the components with a loading state,
19
+ * so they are not part of the public `TreeViewSlotProps` interface.
20
+ */
21
+
10
22
  /**
11
23
  * @ignore - internal component.
12
24
  */
@@ -1,6 +1,19 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+
5
+ /**
6
+ * Slots stored in the style context.
7
+ * The loading slots only exist on the components with a loading state,
8
+ * so they are not part of the public `TreeViewSlots` interface.
9
+ */
10
+
11
+ /**
12
+ * Slot props stored in the style context.
13
+ * The loading slot props only exist on the components with a loading state,
14
+ * so they are not part of the public `TreeViewSlotProps` interface.
15
+ */
16
+
4
17
  /**
5
18
  * @ignore - internal component.
6
19
  */
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "__esModule", {
8
8
  });
9
9
  exports.RichTreeViewItem = void 0;
10
10
  exports.RichTreeViewItems = RichTreeViewItems;
11
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
11
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
13
  var React = _interopRequireWildcard(require("react"));
14
14
  var _empty = require("@base-ui/utils/empty");
15
15
  var _store = require("@mui/x-internals/store");
@@ -19,6 +19,8 @@ var _TreeItem = require("../../TreeItem");
19
19
  var _items = require("../plugins/items");
20
20
  var _TreeViewProvider = require("../TreeViewProvider");
21
21
  var _expansion = require("../plugins/expansion");
22
+ var _lazyLoading = require("../plugins/lazyLoading");
23
+ var _RichTreeViewLoading = require("./RichTreeViewLoading");
22
24
  var _useTreeViewRootProps = require("../hooks/useTreeViewRootProps");
23
25
  var _jsxRuntime = require("react/jsx-runtime");
24
26
  const _excluded = ["ownerState"];
@@ -26,6 +28,54 @@ const RichTreeViewItemsContext = /*#__PURE__*/React.createContext(null);
26
28
  if (process.env.NODE_ENV !== "production") RichTreeViewItemsContext.displayName = "RichTreeViewItemsContext";
27
29
  const selectorNoChildren = () => _empty.EMPTY_ARRAY;
28
30
  const selectorChildrenIdsNull = state => _items.itemsSelectors.itemOrderedChildrenIds(state, null);
31
+
32
+ /**
33
+ * Renders the loading rows for the children of an item that lazily loads them.
34
+ * It only mounts while the item is loading, so the `loading` slot props are not
35
+ * resolved for the other items.
36
+ */
37
+ function RichTreeViewItemLoadingChildren({
38
+ itemId
39
+ }) {
40
+ const {
41
+ store
42
+ } = (0, _TreeViewProvider.useTreeViewContext)();
43
+ const {
44
+ classes,
45
+ slots: styleSlots,
46
+ slotProps: styleSlotProps
47
+ } = (0, _TreeViewProvider.useTreeViewStyleContext)();
48
+ const itemDepth = (0, _store.useStore)(store, _items.itemsSelectors.itemDepth, itemId);
49
+ const loadingChildrenCount = (0, _store.useStore)(store, _lazyLoading.lazyLoadingSelectors.itemLoadingChildrenCount, itemId);
50
+ const Loading = styleSlots.loading;
51
+ const loadingProps = (0, _useSlotProps2.default)({
52
+ elementType: Loading ?? 'div',
53
+ externalSlotProps: styleSlotProps.loading,
54
+ ownerState: {
55
+ itemId
56
+ }
57
+ });
58
+
59
+ // The count reported by `getChildrenCount()` wins over `slotProps.loading.itemsCount`,
60
+ // which only acts as a fallback when the count is unknown.
61
+ const itemsCount = loadingChildrenCount > 0 ? Math.min(loadingChildrenCount, _RichTreeViewLoading.MAX_LOADING_ITEMS_COUNT) : (0, _RichTreeViewLoading.getLoadingItemsCount)(loadingProps.itemsCount);
62
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_RichTreeViewLoading.RichTreeViewLoadingContext, {
63
+ store: store,
64
+ itemDepth: itemDepth + 1,
65
+ children: Loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(Loading, (0, _extends2.default)({}, loadingProps, {
66
+ itemsCount: itemsCount
67
+ })) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_RichTreeViewLoading.RichTreeViewItemLoaders, {
68
+ classes: classes,
69
+ slots: {
70
+ itemLoader: styleSlots.itemLoader
71
+ },
72
+ slotProps: {
73
+ itemLoader: styleSlotProps.itemLoader
74
+ },
75
+ itemsCount: itemsCount
76
+ })
77
+ });
78
+ }
29
79
  const RichTreeViewItem = exports.RichTreeViewItem = /*#__PURE__*/React.memo(function RichTreeViewItem({
30
80
  itemSlot,
31
81
  itemSlotProps,
@@ -38,6 +88,7 @@ const RichTreeViewItem = exports.RichTreeViewItem = /*#__PURE__*/React.memo(func
38
88
  } = (0, _TreeViewProvider.useTreeViewContext)();
39
89
  const itemMeta = (0, _store.useStore)(store, _items.itemsSelectors.itemMeta, itemId);
40
90
  const children = (0, _store.useStore)(store, skipChildren ? selectorNoChildren : _items.itemsSelectors.itemOrderedChildrenIds, itemId);
91
+ const isLoadingChildren = (0, _store.useStore)(store, _lazyLoading.lazyLoadingSelectors.isItemLoading, itemId);
41
92
  const Item = itemSlot ?? _TreeItem.TreeItem;
42
93
  const _useSlotProps = (0, _useSlotProps2.default)({
43
94
  elementType: Item,
@@ -53,8 +104,14 @@ const RichTreeViewItem = exports.RichTreeViewItem = /*#__PURE__*/React.memo(func
53
104
  }
54
105
  }),
55
106
  itemProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded);
107
+ let renderedChildren = renderItemForRichTreeView ? children?.map(renderItemForRichTreeView) : null;
108
+ if (isLoadingChildren && !skipChildren && (children == null || children.length === 0)) {
109
+ renderedChildren = /*#__PURE__*/(0, _jsxRuntime.jsx)(RichTreeViewItemLoadingChildren, {
110
+ itemId: itemId
111
+ });
112
+ }
56
113
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Item, (0, _extends2.default)({}, itemProps, {
57
- children: renderItemForRichTreeView ? children?.map(renderItemForRichTreeView) : null
114
+ children: renderedChildren
58
115
  }));
59
116
  }, _fastObjectShallowCompare.fastObjectShallowCompare);
60
117
  if (process.env.NODE_ENV !== "production") RichTreeViewItem.displayName = "RichTreeViewItem";
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
- import _extends from "@babel/runtime/helpers/esm/extends";
4
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+ import _extends from "@babel/runtime/helpers/esm/extends";
5
5
  const _excluded = ["ownerState"];
6
6
  import * as React from 'react';
7
7
  import { EMPTY_ARRAY } from '@base-ui/utils/empty';
@@ -12,12 +12,62 @@ import { TreeItem } from "../../TreeItem/index.mjs";
12
12
  import { itemsSelectors } from "../plugins/items/index.mjs";
13
13
  import { useTreeViewContext, useTreeViewStyleContext } from "../TreeViewProvider/index.mjs";
14
14
  import { expansionSelectors } from "../plugins/expansion/index.mjs";
15
+ import { lazyLoadingSelectors } from "../plugins/lazyLoading/index.mjs";
16
+ import { RichTreeViewItemLoaders, RichTreeViewLoadingContext, getLoadingItemsCount, MAX_LOADING_ITEMS_COUNT } from "./RichTreeViewLoading.mjs";
15
17
  import { useTreeViewRootProps } from "../hooks/useTreeViewRootProps.mjs";
16
18
  import { jsx as _jsx } from "react/jsx-runtime";
17
19
  const RichTreeViewItemsContext = /*#__PURE__*/React.createContext(null);
18
20
  if (process.env.NODE_ENV !== "production") RichTreeViewItemsContext.displayName = "RichTreeViewItemsContext";
19
21
  const selectorNoChildren = () => EMPTY_ARRAY;
20
22
  const selectorChildrenIdsNull = state => itemsSelectors.itemOrderedChildrenIds(state, null);
23
+
24
+ /**
25
+ * Renders the loading rows for the children of an item that lazily loads them.
26
+ * It only mounts while the item is loading, so the `loading` slot props are not
27
+ * resolved for the other items.
28
+ */
29
+ function RichTreeViewItemLoadingChildren({
30
+ itemId
31
+ }) {
32
+ const {
33
+ store
34
+ } = useTreeViewContext();
35
+ const {
36
+ classes,
37
+ slots: styleSlots,
38
+ slotProps: styleSlotProps
39
+ } = useTreeViewStyleContext();
40
+ const itemDepth = useStore(store, itemsSelectors.itemDepth, itemId);
41
+ const loadingChildrenCount = useStore(store, lazyLoadingSelectors.itemLoadingChildrenCount, itemId);
42
+ const Loading = styleSlots.loading;
43
+ const loadingProps = useSlotProps({
44
+ elementType: Loading ?? 'div',
45
+ externalSlotProps: styleSlotProps.loading,
46
+ ownerState: {
47
+ itemId
48
+ }
49
+ });
50
+
51
+ // The count reported by `getChildrenCount()` wins over `slotProps.loading.itemsCount`,
52
+ // which only acts as a fallback when the count is unknown.
53
+ const itemsCount = loadingChildrenCount > 0 ? Math.min(loadingChildrenCount, MAX_LOADING_ITEMS_COUNT) : getLoadingItemsCount(loadingProps.itemsCount);
54
+ return /*#__PURE__*/_jsx(RichTreeViewLoadingContext, {
55
+ store: store,
56
+ itemDepth: itemDepth + 1,
57
+ children: Loading ? /*#__PURE__*/_jsx(Loading, _extends({}, loadingProps, {
58
+ itemsCount: itemsCount
59
+ })) : /*#__PURE__*/_jsx(RichTreeViewItemLoaders, {
60
+ classes: classes,
61
+ slots: {
62
+ itemLoader: styleSlots.itemLoader
63
+ },
64
+ slotProps: {
65
+ itemLoader: styleSlotProps.itemLoader
66
+ },
67
+ itemsCount: itemsCount
68
+ })
69
+ });
70
+ }
21
71
  export const RichTreeViewItem = /*#__PURE__*/React.memo(function RichTreeViewItem({
22
72
  itemSlot,
23
73
  itemSlotProps,
@@ -30,6 +80,7 @@ export const RichTreeViewItem = /*#__PURE__*/React.memo(function RichTreeViewIte
30
80
  } = useTreeViewContext();
31
81
  const itemMeta = useStore(store, itemsSelectors.itemMeta, itemId);
32
82
  const children = useStore(store, skipChildren ? selectorNoChildren : itemsSelectors.itemOrderedChildrenIds, itemId);
83
+ const isLoadingChildren = useStore(store, lazyLoadingSelectors.isItemLoading, itemId);
33
84
  const Item = itemSlot ?? TreeItem;
34
85
  const _useSlotProps = useSlotProps({
35
86
  elementType: Item,
@@ -45,8 +96,14 @@ export const RichTreeViewItem = /*#__PURE__*/React.memo(function RichTreeViewIte
45
96
  }
46
97
  }),
47
98
  itemProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded);
99
+ let renderedChildren = renderItemForRichTreeView ? children?.map(renderItemForRichTreeView) : null;
100
+ if (isLoadingChildren && !skipChildren && (children == null || children.length === 0)) {
101
+ renderedChildren = /*#__PURE__*/_jsx(RichTreeViewItemLoadingChildren, {
102
+ itemId: itemId
103
+ });
104
+ }
48
105
  return /*#__PURE__*/_jsx(Item, _extends({}, itemProps, {
49
- children: renderItemForRichTreeView ? children?.map(renderItemForRichTreeView) : null
106
+ children: renderedChildren
50
107
  }));
51
108
  }, fastObjectShallowCompare);
52
109
  if (process.env.NODE_ENV !== "production") RichTreeViewItem.displayName = "RichTreeViewItem";