@mui/x-tree-view 7.0.0-beta.6 → 7.0.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 (152) hide show
  1. package/CHANGELOG.md +311 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +34 -36
  4. package/RichTreeView/RichTreeView.types.d.ts +3 -2
  5. package/SimpleTreeView/SimpleTreeView.js +25 -26
  6. package/TreeItem/TreeItem.js +94 -82
  7. package/TreeItem/TreeItem.types.d.ts +13 -11
  8. package/TreeItem/TreeItemContent.d.ts +7 -7
  9. package/TreeItem/TreeItemContent.js +10 -10
  10. package/TreeItem/useTreeItemState.d.ts +1 -1
  11. package/TreeItem/useTreeItemState.js +13 -13
  12. package/TreeItem2/TreeItem2.d.ts +18 -0
  13. package/TreeItem2/TreeItem2.js +300 -0
  14. package/TreeItem2/TreeItem2.types.d.ts +64 -0
  15. package/TreeItem2/TreeItem2.types.js +1 -0
  16. package/TreeItem2/index.d.ts +2 -0
  17. package/TreeItem2/index.js +1 -0
  18. package/TreeItem2/package.json +6 -0
  19. package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
  20. package/TreeItem2Icon/TreeItem2Icon.js +67 -0
  21. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
  22. package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  23. package/TreeItem2Icon/index.d.ts +2 -0
  24. package/TreeItem2Icon/index.js +1 -0
  25. package/TreeItem2Icon/package.json +6 -0
  26. package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
  27. package/TreeItem2Provider/TreeItem2Provider.js +24 -0
  28. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
  29. package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  30. package/TreeItem2Provider/index.d.ts +2 -0
  31. package/TreeItem2Provider/index.js +1 -0
  32. package/TreeItem2Provider/package.json +6 -0
  33. package/TreeView/TreeView.d.ts +1 -1
  34. package/TreeView/TreeView.js +23 -23
  35. package/hooks/index.d.ts +1 -0
  36. package/hooks/index.js +2 -1
  37. package/hooks/useTreeItem2Utils/index.d.ts +1 -0
  38. package/hooks/useTreeItem2Utils/index.js +1 -0
  39. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
  40. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  41. package/index.d.ts +5 -1
  42. package/index.js +9 -2
  43. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  44. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  45. package/internals/hooks/useInstanceEventHandler.js +5 -10
  46. package/internals/hooks/useLazyRef.d.ts +1 -2
  47. package/internals/hooks/useLazyRef.js +1 -11
  48. package/internals/hooks/useOnMount.d.ts +1 -2
  49. package/internals/hooks/useOnMount.js +1 -7
  50. package/internals/hooks/useTimeout.d.ts +1 -11
  51. package/internals/hooks/useTimeout.js +1 -36
  52. package/internals/models/plugin.d.ts +19 -16
  53. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
  55. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
  56. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  57. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  58. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  59. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
  60. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  61. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
  62. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  63. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
  64. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
  67. package/internals/useTreeView/useTreeView.js +28 -27
  68. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  69. package/internals/useTreeView/useTreeView.utils.js +22 -22
  70. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  71. package/internals/utils/utils.js +1 -0
  72. package/modern/RichTreeView/RichTreeView.js +29 -29
  73. package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
  74. package/modern/TreeItem/TreeItem.js +83 -70
  75. package/modern/TreeItem/TreeItemContent.js +10 -10
  76. package/modern/TreeItem/useTreeItemState.js +13 -13
  77. package/modern/TreeItem2/TreeItem2.js +300 -0
  78. package/modern/TreeItem2/TreeItem2.types.js +1 -0
  79. package/modern/TreeItem2/index.js +1 -0
  80. package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
  81. package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  82. package/modern/TreeItem2Icon/index.js +1 -0
  83. package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
  84. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  85. package/modern/TreeItem2Provider/index.js +1 -0
  86. package/modern/TreeView/TreeView.js +23 -23
  87. package/modern/hooks/index.js +2 -1
  88. package/modern/hooks/useTreeItem2Utils/index.js +1 -0
  89. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  90. package/modern/index.js +9 -2
  91. package/modern/internals/hooks/useLazyRef.js +1 -11
  92. package/modern/internals/hooks/useOnMount.js +1 -7
  93. package/modern/internals/hooks/useTimeout.js +1 -36
  94. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  95. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  96. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  97. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  98. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  99. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  100. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  101. package/modern/internals/useTreeView/useTreeView.js +28 -27
  102. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  103. package/modern/internals/utils/utils.js +1 -0
  104. package/modern/useTreeItem2/index.js +1 -0
  105. package/modern/useTreeItem2/useTreeItem2.js +146 -0
  106. package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
  107. package/node/RichTreeView/RichTreeView.js +29 -29
  108. package/node/SimpleTreeView/SimpleTreeView.js +23 -23
  109. package/node/TreeItem/TreeItem.js +83 -70
  110. package/node/TreeItem/TreeItemContent.js +10 -10
  111. package/node/TreeItem/useTreeItemState.js +13 -13
  112. package/node/TreeItem2/TreeItem2.js +308 -0
  113. package/node/TreeItem2/TreeItem2.types.js +5 -0
  114. package/node/TreeItem2/index.js +42 -0
  115. package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
  116. package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
  117. package/node/TreeItem2Icon/index.js +12 -0
  118. package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
  119. package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
  120. package/node/TreeItem2Provider/index.js +12 -0
  121. package/node/TreeView/TreeView.js +23 -23
  122. package/node/hooks/index.js +8 -1
  123. package/node/hooks/useTreeItem2Utils/index.js +12 -0
  124. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
  125. package/node/index.js +61 -13
  126. package/node/internals/hooks/useLazyRef.js +7 -13
  127. package/node/internals/hooks/useOnMount.js +8 -10
  128. package/node/internals/hooks/useTimeout.js +7 -37
  129. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
  130. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
  131. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  132. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
  133. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
  134. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
  135. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
  136. package/node/internals/useTreeView/useTreeView.js +28 -27
  137. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  138. package/node/internals/utils/utils.js +1 -0
  139. package/node/useTreeItem2/index.js +12 -0
  140. package/node/useTreeItem2/useTreeItem2.js +154 -0
  141. package/node/useTreeItem2/useTreeItem2.types.js +5 -0
  142. package/package.json +5 -5
  143. package/themeAugmentation/components.d.ts +5 -0
  144. package/themeAugmentation/overrides.d.ts +1 -0
  145. package/themeAugmentation/props.d.ts +2 -0
  146. package/useTreeItem2/index.d.ts +2 -0
  147. package/useTreeItem2/index.js +1 -0
  148. package/useTreeItem2/package.json +6 -0
  149. package/useTreeItem2/useTreeItem2.d.ts +2 -0
  150. package/useTreeItem2/useTreeItem2.js +146 -0
  151. package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
  152. package/useTreeItem2/useTreeItem2.types.js +1 -0
@@ -30,7 +30,7 @@ const warn = () => {
30
30
 
31
31
  /**
32
32
  * This component has been deprecated in favor of the new `SimpleTreeView` component.
33
- * You can have a look at how to migrate to the new component in the v7 [migration guide](https://next.mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
33
+ * You can have a look at how to migrate to the new component in the v7 [migration guide](https://mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
34
34
  *
35
35
  * Demos:
36
36
  *
@@ -69,7 +69,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
69
69
  */
70
70
  apiRef: PropTypes.shape({
71
71
  current: PropTypes.shape({
72
- focusNode: PropTypes.func.isRequired,
72
+ focusItem: PropTypes.func.isRequired,
73
73
  getItem: PropTypes.func.isRequired
74
74
  })
75
75
  }),
@@ -83,17 +83,17 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
83
83
  classes: PropTypes.object,
84
84
  className: PropTypes.string,
85
85
  /**
86
- * Expanded node ids.
86
+ * Expanded item ids.
87
87
  * Used when the item's expansion is not controlled.
88
88
  * @default []
89
89
  */
90
- defaultExpandedNodes: PropTypes.arrayOf(PropTypes.string),
90
+ defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
91
91
  /**
92
- * Selected node ids. (Uncontrolled)
92
+ * Selected item ids. (Uncontrolled)
93
93
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
94
94
  * @default []
95
95
  */
96
- defaultSelectedNodes: PropTypes.any,
96
+ defaultSelectedItems: PropTypes.any,
97
97
  /**
98
98
  * If `true`, will allow focus on disabled items.
99
99
  * @default false
@@ -105,10 +105,10 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
105
105
  */
106
106
  disableSelection: PropTypes.bool,
107
107
  /**
108
- * Expanded node ids.
108
+ * Expanded item ids.
109
109
  * Used when the item's expansion is controlled.
110
110
  */
111
- expandedNodes: PropTypes.arrayOf(PropTypes.string),
111
+ expandedItems: PropTypes.arrayOf(PropTypes.string),
112
112
  /**
113
113
  * This prop is used to help implement the accessibility logic.
114
114
  * If you don't provide this prop. It falls back to a randomly generated id.
@@ -122,42 +122,42 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
122
122
  /**
123
123
  * Callback fired when tree items are expanded/collapsed.
124
124
  * @param {React.SyntheticEvent} event The event source of the callback.
125
- * @param {array} nodeIds The ids of the expanded nodes.
125
+ * @param {array} itemIds The ids of the expanded items.
126
126
  */
127
- onExpandedNodesChange: PropTypes.func,
127
+ onExpandedItemsChange: PropTypes.func,
128
128
  /**
129
129
  * Callback fired when a tree item is expanded or collapsed.
130
130
  * @param {React.SyntheticEvent} event The event source of the callback.
131
- * @param {array} nodeId The nodeId of the modified node.
132
- * @param {array} isExpanded `true` if the node has just been expanded, `false` if it has just been collapsed.
131
+ * @param {array} itemId The itemId of the modified item.
132
+ * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
133
133
  */
134
- onNodeExpansionToggle: PropTypes.func,
134
+ onItemExpansionToggle: PropTypes.func,
135
135
  /**
136
136
  * Callback fired when tree items are focused.
137
137
  * @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
138
- * @param {string} nodeId The id of the node focused.
139
- * @param {string} value of the focused node.
138
+ * @param {string} itemId The id of the focused item.
139
+ * @param {string} value of the focused item.
140
140
  */
141
- onNodeFocus: PropTypes.func,
141
+ onItemFocus: PropTypes.func,
142
142
  /**
143
143
  * Callback fired when a tree item is selected or deselected.
144
144
  * @param {React.SyntheticEvent} event The event source of the callback.
145
- * @param {array} nodeId The nodeId of the modified node.
146
- * @param {array} isSelected `true` if the node has just been selected, `false` if it has just been deselected.
145
+ * @param {array} itemId The itemId of the modified item.
146
+ * @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
147
147
  */
148
- onNodeSelectionToggle: PropTypes.func,
148
+ onItemSelectionToggle: PropTypes.func,
149
149
  /**
150
150
  * Callback fired when tree items are selected/deselected.
151
151
  * @param {React.SyntheticEvent} event The event source of the callback
152
- * @param {string[] | string} nodeIds The ids of the selected nodes.
152
+ * @param {string[] | string} itemIds The ids of the selected items.
153
153
  * When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
154
154
  */
155
- onSelectedNodesChange: PropTypes.func,
155
+ onSelectedItemsChange: PropTypes.func,
156
156
  /**
157
- * Selected node ids. (Controlled)
157
+ * Selected item ids. (Controlled)
158
158
  * When `multiSelect` is true this takes an array of strings; when false (default) a string.
159
159
  */
160
- selectedNodes: PropTypes.any,
160
+ selectedItems: PropTypes.any,
161
161
  /**
162
162
  * The props used for each component slot.
163
163
  */
package/hooks/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export { useTreeViewApiRef } from './useTreeViewApiRef';
2
+ export { useTreeItem2Utils } from './useTreeItem2Utils';
package/hooks/index.js CHANGED
@@ -1 +1,2 @@
1
- export { useTreeViewApiRef } from './useTreeViewApiRef';
1
+ export { useTreeViewApiRef } from './useTreeViewApiRef';
2
+ export { useTreeItem2Utils } from './useTreeItem2Utils';
@@ -0,0 +1 @@
1
+ export { useTreeItem2Utils } from './useTreeItem2Utils';
@@ -0,0 +1 @@
1
+ export { useTreeItem2Utils } from './useTreeItem2Utils';
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import type { UseTreeItem2Status } from '../../useTreeItem2';
3
+ interface UseTreeItem2Interactions {
4
+ handleExpansion: (event: React.MouseEvent) => void;
5
+ handleSelection: (event: React.MouseEvent) => void;
6
+ }
7
+ interface UseTreeItem2UtilsReturnValue {
8
+ interactions: UseTreeItem2Interactions;
9
+ status: UseTreeItem2Status;
10
+ }
11
+ export declare const useTreeItem2Utils: ({ itemId, children, }: {
12
+ itemId: string;
13
+ children: React.ReactNode;
14
+ }) => UseTreeItem2UtilsReturnValue;
15
+ export {};
@@ -0,0 +1,61 @@
1
+ import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext';
2
+ export const useTreeItem2Utils = ({
3
+ itemId,
4
+ children
5
+ }) => {
6
+ const {
7
+ instance,
8
+ selection: {
9
+ multiSelect
10
+ }
11
+ } = useTreeViewContext();
12
+ const status = {
13
+ expandable: Boolean(Array.isArray(children) ? children.length : children),
14
+ expanded: instance.isNodeExpanded(itemId),
15
+ focused: instance.isNodeFocused(itemId),
16
+ selected: instance.isNodeSelected(itemId),
17
+ disabled: instance.isNodeDisabled(itemId)
18
+ };
19
+ const handleExpansion = event => {
20
+ if (status.disabled) {
21
+ return;
22
+ }
23
+ if (!status.focused) {
24
+ instance.focusItem(event, itemId);
25
+ }
26
+ const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
27
+
28
+ // If already expanded and trying to toggle selection don't close
29
+ if (status.expandable && !(multiple && instance.isNodeExpanded(itemId))) {
30
+ instance.toggleNodeExpansion(event, itemId);
31
+ }
32
+ };
33
+ const handleSelection = event => {
34
+ if (status.disabled) {
35
+ return;
36
+ }
37
+ if (!status.focused) {
38
+ instance.focusItem(event, itemId);
39
+ }
40
+ const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
41
+ if (multiple) {
42
+ if (event.shiftKey) {
43
+ instance.selectRange(event, {
44
+ end: itemId
45
+ });
46
+ } else {
47
+ instance.selectNode(event, itemId, true);
48
+ }
49
+ } else {
50
+ instance.selectNode(event, itemId);
51
+ }
52
+ };
53
+ const interactions = {
54
+ handleExpansion,
55
+ handleSelection
56
+ };
57
+ return {
58
+ interactions,
59
+ status
60
+ };
61
+ };
package/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- export * from './TreeItem';
2
1
  export * from './TreeView';
3
2
  export * from './SimpleTreeView';
4
3
  export * from './RichTreeView';
4
+ export * from './TreeItem';
5
+ export * from './TreeItem2';
6
+ export * from './useTreeItem2';
7
+ export * from './TreeItem2Icon';
8
+ export * from './TreeItem2Provider';
5
9
  export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
6
10
  export * from './models';
7
11
  export * from './icons';
package/index.js CHANGED
@@ -1,14 +1,21 @@
1
1
  /**
2
- * @mui/x-tree-view v7.0.0-beta.6
2
+ * @mui/x-tree-view v7.0.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
- export * from './TreeItem';
8
+ // Tree View
9
9
  export * from './TreeView';
10
10
  export * from './SimpleTreeView';
11
11
  export * from './RichTreeView';
12
+
13
+ // Tree Item
14
+ export * from './TreeItem';
15
+ export * from './TreeItem2';
16
+ export * from './useTreeItem2';
17
+ export * from './TreeItem2Icon';
18
+ export * from './TreeItem2Provider';
12
19
  export { unstable_resetCleanupTracking } from './internals/hooks/useInstanceEventHandler';
13
20
  export * from './models';
14
21
  export * from './icons';
@@ -4,5 +4,7 @@ import * as React from 'react';
4
4
  */
5
5
  export declare const TreeViewContext: React.Context<{
6
6
  instance: {};
7
- runItemPlugins: (options: import("../models").TreeViewItemPluginOptions) => Required<import("../models").TreeViewItemPluginResponse>;
7
+ publicAPI: {};
8
+ wrapItem: import("../models").TreeItemWrapper;
9
+ runItemPlugins: <TProps extends {}>(props: TProps) => Required<import("../models").TreeViewItemPluginResponse>;
8
10
  } | null>;
@@ -1,8 +1,10 @@
1
1
  import * as React from 'react';
2
- import { MergePluginsProperty, TreeViewAnyPluginSignature, TreeViewInstance, TreeViewItemPluginOptions, TreeViewItemPluginResponse } from '../models';
2
+ import { MergePluginsProperty, TreeItemWrapper, TreeViewAnyPluginSignature, TreeViewInstance, TreeViewItemPluginResponse, TreeViewPublicAPI } from '../models';
3
3
  export type TreeViewContextValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> = MergePluginsProperty<TPlugins, 'contextValue'> & {
4
4
  instance: TreeViewInstance<TPlugins>;
5
- runItemPlugins: (options: TreeViewItemPluginOptions) => Required<TreeViewItemPluginResponse>;
5
+ publicAPI: TreeViewPublicAPI<TPlugins>;
6
+ wrapItem: TreeItemWrapper;
7
+ runItemPlugins: <TProps extends {}>(props: TProps) => Required<TreeViewItemPluginResponse>;
6
8
  };
7
9
  export interface TreeViewProviderProps<TPlugins extends readonly TreeViewAnyPluginSignature[]> {
8
10
  value: TreeViewContextValue<TPlugins>;
@@ -20,8 +20,7 @@ export function createUseInstanceEventHandler(registryContainer) {
20
20
  if (!subscription.current && handlerRef.current) {
21
21
  const enhancedHandler = (params, event) => {
22
22
  if (!event.defaultMuiPrevented) {
23
- var _handlerRef$current;
24
- (_handlerRef$current = handlerRef.current) == null || _handlerRef$current.call(handlerRef, params, event);
23
+ handlerRef.current?.(params, event);
25
24
  }
26
25
  };
27
26
  subscription.current = instance.$$subscribeEvent(eventName, enhancedHandler);
@@ -32,8 +31,7 @@ export function createUseInstanceEventHandler(registryContainer) {
32
31
  registryContainer.registry.register(objectRetainedByReact,
33
32
  // The callback below will be called once this reference stops being retained
34
33
  () => {
35
- var _subscription$current;
36
- (_subscription$current = subscription.current) == null || _subscription$current.call(subscription);
34
+ subscription.current?.();
37
35
  subscription.current = null;
38
36
  cleanupTokenRef.current = null;
39
37
  }, cleanupTokenRef.current);
@@ -49,8 +47,7 @@ export function createUseInstanceEventHandler(registryContainer) {
49
47
  if (!subscription.current && handlerRef.current) {
50
48
  const enhancedHandler = (params, event) => {
51
49
  if (!event.defaultMuiPrevented) {
52
- var _handlerRef$current2;
53
- (_handlerRef$current2 = handlerRef.current) == null || _handlerRef$current2.call(handlerRef, params, event);
50
+ handlerRef.current?.(params, event);
54
51
  }
55
52
  };
56
53
  subscription.current = instance.$$subscribeEvent(eventName, enhancedHandler);
@@ -62,8 +59,7 @@ export function createUseInstanceEventHandler(registryContainer) {
62
59
  cleanupTokenRef.current = null;
63
60
  }
64
61
  return () => {
65
- var _subscription$current2;
66
- (_subscription$current2 = subscription.current) == null || _subscription$current2.call(subscription);
62
+ subscription.current?.();
67
63
  subscription.current = null;
68
64
  };
69
65
  }, [instance, eventName]);
@@ -75,8 +71,7 @@ const registryContainer = {
75
71
 
76
72
  // eslint-disable-next-line @typescript-eslint/naming-convention
77
73
  export const unstable_resetCleanupTracking = () => {
78
- var _registryContainer$re;
79
- (_registryContainer$re = registryContainer.registry) == null || _registryContainer$re.reset();
74
+ registryContainer.registry?.reset();
80
75
  registryContainer.registry = null;
81
76
  };
82
77
  export const useInstanceEventHandler = createUseInstanceEventHandler(registryContainer);
@@ -1,2 +1 @@
1
- import * as React from 'react';
2
- export declare function useLazyRef<T, U>(init: (arg?: U) => T, initArg?: U): React.MutableRefObject<T>;
1
+ export { default as useLazyRef } from '@mui/utils/useLazyRef';
@@ -1,11 +1 @@
1
- import * as React from 'react';
2
- const UNINITIALIZED = {};
3
-
4
- // See https://github.com/facebook/react/issues/14490 for when to use this.
5
- export function useLazyRef(init, initArg) {
6
- const ref = React.useRef(UNINITIALIZED);
7
- if (ref.current === UNINITIALIZED) {
8
- ref.current = init(initArg);
9
- }
10
- return ref;
11
- }
1
+ export { default as useLazyRef } from '@mui/utils/useLazyRef';
@@ -1,2 +1 @@
1
- import * as React from 'react';
2
- export declare function useOnMount(fn: React.EffectCallback): void;
1
+ export { default as useOnMount } from '@mui/utils/useOnMount';
@@ -1,7 +1 @@
1
- import * as React from 'react';
2
- const EMPTY = [];
3
- export function useOnMount(fn) {
4
- /* eslint-disable react-hooks/exhaustive-deps */
5
- React.useEffect(fn, EMPTY);
6
- /* eslint-enable react-hooks/exhaustive-deps */
7
- }
1
+ export { default as useOnMount } from '@mui/utils/useOnMount';
@@ -1,11 +1 @@
1
- export declare class Timeout {
2
- static create(): Timeout;
3
- currentId: ReturnType<typeof setTimeout> | null;
4
- /**
5
- * Executes `fn` after `delay`, clearing any previously scheduled call.
6
- */
7
- start(delay: number, fn: Function): void;
8
- clear: () => void;
9
- disposeEffect: () => () => void;
10
- }
11
- export declare function useTimeout(): Timeout;
1
+ export { default as useTimeout } from '@mui/utils/useTimeout';
@@ -1,36 +1 @@
1
- 'use client';
2
-
3
- import { useLazyRef } from './useLazyRef';
4
- import { useOnMount } from './useOnMount';
5
- export class Timeout {
6
- constructor() {
7
- this.currentId = null;
8
- this.clear = () => {
9
- if (this.currentId !== null) {
10
- clearTimeout(this.currentId);
11
- this.currentId = null;
12
- }
13
- };
14
- this.disposeEffect = () => {
15
- return this.clear;
16
- };
17
- }
18
- static create() {
19
- return new Timeout();
20
- }
21
- /**
22
- * Executes `fn` after `delay`, clearing any previously scheduled call.
23
- */
24
- start(delay, fn) {
25
- this.clear();
26
- this.currentId = setTimeout(() => {
27
- this.currentId = null;
28
- fn();
29
- }, delay);
30
- }
31
- }
32
- export function useTimeout() {
33
- const timeout = useLazyRef(Timeout.create).current;
34
- useOnMount(timeout.disposeEffect);
35
- return timeout;
36
- }
1
+ export { default as useTimeout } from '@mui/utils/useTimeout';
@@ -4,7 +4,7 @@ import { TreeViewModel } from './treeView';
4
4
  import type { MergePluginsProperty, OptionalIfEmpty } from './helpers';
5
5
  import { TreeViewEventLookupElement } from './events';
6
6
  import type { TreeViewCorePluginsSignature } from '../corePlugins';
7
- import type { TreeItemProps } from '../../TreeItem';
7
+ import { TreeViewItemId } from '../../models';
8
8
  export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSignature> {
9
9
  instance: TreeViewUsedInstance<TSignature>;
10
10
  publicAPI: TreeViewUsedPublicAPI<TSignature>;
@@ -117,33 +117,36 @@ type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = {
117
117
  };
118
118
  export type TreeViewUsedModels<TSignature extends TreeViewAnyPluginSignature> = TSignature['models'] & RemoveSetValue<MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'models'>>;
119
119
  export type TreeViewUsedEvents<TSignature extends TreeViewAnyPluginSignature> = TSignature['events'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'events'>;
120
- export interface TreeViewItemPluginOptions {
121
- props: TreeItemProps;
122
- ref: React.Ref<HTMLLIElement>;
120
+ export interface TreeViewItemPluginOptions<TProps extends {}> extends TreeViewItemPluginResponse {
121
+ props: TProps;
123
122
  }
124
123
  export interface TreeViewItemPluginResponse {
125
124
  /**
126
- * Props enriched by the plugin.
125
+ * Root of the `content` slot enriched by the plugin.
127
126
  */
128
- props?: TreeItemProps;
127
+ contentRef?: React.RefCallback<HTMLElement> | null;
129
128
  /**
130
- * Ref enriched by the plugin
129
+ * Ref of the `root` slot enriched by the plugin
131
130
  */
132
- ref?: React.Ref<HTMLLIElement>;
133
- /**
134
- * Render function used to add React wrappers around the TreeItem.
135
- * @param {React.ReactNode} children The TreeItem node before this plugin execution.
136
- * @returns {React.ReactNode} The wrapped TreeItem.
137
- */
138
- wrapItem?: (children: React.ReactNode) => React.ReactNode;
131
+ rootRef?: React.RefCallback<HTMLLIElement> | null;
139
132
  }
140
- export type TreeViewItemPlugin = (options: TreeViewItemPluginOptions) => void | TreeViewItemPluginResponse;
133
+ export type TreeViewItemPlugin<TProps extends {}> = (options: TreeViewItemPluginOptions<TProps>) => void | TreeViewItemPluginResponse;
134
+ export type TreeItemWrapper = (params: {
135
+ itemId: TreeViewItemId;
136
+ children: React.ReactNode;
137
+ }) => React.ReactNode;
141
138
  export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = {
142
139
  (options: TreeViewPluginOptions<TSignature>): void | TreeViewResponse<TSignature>;
143
140
  getDefaultizedParams?: (params: TreeViewUsedParams<TSignature>) => TSignature['defaultizedParams'];
144
141
  getInitialState?: (params: TreeViewUsedDefaultizedParams<TSignature>) => TSignature['state'];
145
142
  models?: TreeViewModelsInitializer<TSignature>;
146
143
  params: Record<keyof TSignature['params'], true>;
147
- itemPlugin?: TreeViewItemPlugin;
144
+ itemPlugin?: TreeViewItemPlugin<any>;
145
+ /**
146
+ * Render function used to add React wrappers around the TreeItem.
147
+ * @param {TreeItemWrapperParams} params The params of the item.
148
+ * @returns {React.ReactNode} The wrapped items.
149
+ */
150
+ wrapItem?: TreeItemWrapper;
148
151
  };
149
152
  export {};
@@ -7,46 +7,42 @@ export const useTreeViewExpansion = ({
7
7
  params,
8
8
  models
9
9
  }) => {
10
- const setExpandedNodes = (event, value) => {
11
- var _params$onExpandedNod;
12
- (_params$onExpandedNod = params.onExpandedNodesChange) == null || _params$onExpandedNod.call(params, event, value);
13
- models.expandedNodes.setControlledValue(value);
10
+ const setExpandedItems = (event, value) => {
11
+ params.onExpandedItemsChange?.(event, value);
12
+ models.expandedItems.setControlledValue(value);
14
13
  };
15
- const isNodeExpanded = React.useCallback(nodeId => {
16
- return Array.isArray(models.expandedNodes.value) ? models.expandedNodes.value.indexOf(nodeId) !== -1 : false;
17
- }, [models.expandedNodes.value]);
18
- const isNodeExpandable = React.useCallback(nodeId => {
19
- var _instance$getNode;
20
- return !!((_instance$getNode = instance.getNode(nodeId)) != null && _instance$getNode.expandable);
21
- }, [instance]);
22
- const toggleNodeExpansion = useEventCallback((event, nodeId) => {
23
- if (nodeId == null) {
14
+ const isNodeExpanded = React.useCallback(itemId => {
15
+ return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
16
+ }, [models.expandedItems.value]);
17
+ const isNodeExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
18
+ const toggleNodeExpansion = useEventCallback((event, itemId) => {
19
+ if (itemId == null) {
24
20
  return;
25
21
  }
26
- const isExpandedBefore = models.expandedNodes.value.indexOf(nodeId) !== -1;
22
+ const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
27
23
  let newExpanded;
28
24
  if (isExpandedBefore) {
29
- newExpanded = models.expandedNodes.value.filter(id => id !== nodeId);
25
+ newExpanded = models.expandedItems.value.filter(id => id !== itemId);
30
26
  } else {
31
- newExpanded = [nodeId].concat(models.expandedNodes.value);
27
+ newExpanded = [itemId].concat(models.expandedItems.value);
32
28
  }
33
- if (params.onNodeExpansionToggle) {
34
- params.onNodeExpansionToggle(event, nodeId, !isExpandedBefore);
29
+ if (params.onItemExpansionToggle) {
30
+ params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
35
31
  }
36
- setExpandedNodes(event, newExpanded);
32
+ setExpandedItems(event, newExpanded);
37
33
  });
38
- const expandAllSiblings = (event, nodeId) => {
39
- const node = instance.getNode(nodeId);
34
+ const expandAllSiblings = (event, itemId) => {
35
+ const node = instance.getNode(itemId);
40
36
  const siblings = instance.getChildrenIds(node.parentId);
41
37
  const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
42
- const newExpanded = models.expandedNodes.value.concat(diff);
38
+ const newExpanded = models.expandedItems.value.concat(diff);
43
39
  if (diff.length > 0) {
44
- if (params.onNodeExpansionToggle) {
45
- diff.forEach(newlyExpandedNodeId => {
46
- params.onNodeExpansionToggle(event, newlyExpandedNodeId, true);
40
+ if (params.onItemExpansionToggle) {
41
+ diff.forEach(newlyExpandedItemId => {
42
+ params.onItemExpansionToggle(event, newlyExpandedItemId, true);
47
43
  });
48
44
  }
49
- setExpandedNodes(event, newExpanded);
45
+ setExpandedItems(event, newExpanded);
50
46
  }
51
47
  };
52
48
  populateInstance(instance, {
@@ -57,20 +53,17 @@ export const useTreeViewExpansion = ({
57
53
  });
58
54
  };
59
55
  useTreeViewExpansion.models = {
60
- expandedNodes: {
61
- getDefaultValue: params => params.defaultExpandedNodes
56
+ expandedItems: {
57
+ getDefaultValue: params => params.defaultExpandedItems
62
58
  }
63
59
  };
64
60
  const DEFAULT_EXPANDED_NODES = [];
65
- useTreeViewExpansion.getDefaultizedParams = params => {
66
- var _params$defaultExpand;
67
- return _extends({}, params, {
68
- defaultExpandedNodes: (_params$defaultExpand = params.defaultExpandedNodes) != null ? _params$defaultExpand : DEFAULT_EXPANDED_NODES
69
- });
70
- };
61
+ useTreeViewExpansion.getDefaultizedParams = params => _extends({}, params, {
62
+ defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
63
+ });
71
64
  useTreeViewExpansion.params = {
72
- expandedNodes: true,
73
- defaultExpandedNodes: true,
74
- onExpandedNodesChange: true,
75
- onNodeExpansionToggle: true
65
+ expandedItems: true,
66
+ defaultExpandedItems: true,
67
+ onExpandedItemsChange: true,
68
+ onItemExpansionToggle: true
76
69
  };
@@ -2,42 +2,42 @@ import * as React from 'react';
2
2
  import { DefaultizedProps, TreeViewPluginSignature } from '../../models';
3
3
  import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
4
4
  export interface UseTreeViewExpansionInstance {
5
- isNodeExpanded: (nodeId: string) => boolean;
6
- isNodeExpandable: (nodeId: string) => boolean;
5
+ isNodeExpanded: (itemId: string) => boolean;
6
+ isNodeExpandable: (itemId: string) => boolean;
7
7
  toggleNodeExpansion: (event: React.SyntheticEvent, value: string) => void;
8
- expandAllSiblings: (event: React.KeyboardEvent<HTMLUListElement>, nodeId: string) => void;
8
+ expandAllSiblings: (event: React.KeyboardEvent, itemId: string) => void;
9
9
  }
10
10
  export interface UseTreeViewExpansionParameters {
11
11
  /**
12
- * Expanded node ids.
12
+ * Expanded item ids.
13
13
  * Used when the item's expansion is controlled.
14
14
  */
15
- expandedNodes?: string[];
15
+ expandedItems?: string[];
16
16
  /**
17
- * Expanded node ids.
17
+ * Expanded item ids.
18
18
  * Used when the item's expansion is not controlled.
19
19
  * @default []
20
20
  */
21
- defaultExpandedNodes?: string[];
21
+ defaultExpandedItems?: string[];
22
22
  /**
23
23
  * Callback fired when tree items are expanded/collapsed.
24
24
  * @param {React.SyntheticEvent} event The event source of the callback.
25
- * @param {array} nodeIds The ids of the expanded nodes.
25
+ * @param {array} itemIds The ids of the expanded items.
26
26
  */
27
- onExpandedNodesChange?: (event: React.SyntheticEvent, nodeIds: string[]) => void;
27
+ onExpandedItemsChange?: (event: React.SyntheticEvent, itemIds: string[]) => void;
28
28
  /**
29
29
  * Callback fired when a tree item is expanded or collapsed.
30
30
  * @param {React.SyntheticEvent} event The event source of the callback.
31
- * @param {array} nodeId The nodeId of the modified node.
32
- * @param {array} isExpanded `true` if the node has just been expanded, `false` if it has just been collapsed.
31
+ * @param {array} itemId The itemId of the modified item.
32
+ * @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
33
33
  */
34
- onNodeExpansionToggle?: (event: React.SyntheticEvent, nodeId: string, isExpanded: boolean) => void;
34
+ onItemExpansionToggle?: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
35
35
  }
36
- export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedNodes'>;
36
+ export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedItems'>;
37
37
  export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
38
38
  params: UseTreeViewExpansionParameters;
39
39
  defaultizedParams: UseTreeViewExpansionDefaultizedParameters;
40
40
  instance: UseTreeViewExpansionInstance;
41
- modelNames: 'expandedNodes';
41
+ modelNames: 'expandedItems';
42
42
  dependantPlugins: [UseTreeViewNodesSignature];
43
43
  }>;