@mui/x-tree-view 7.0.0-alpha.1 → 7.0.0-alpha.7

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 (203) hide show
  1. package/CHANGELOG.md +1254 -188
  2. package/README.md +0 -1
  3. package/RichTreeView/RichTreeView.d.ts +20 -0
  4. package/RichTreeView/RichTreeView.js +324 -0
  5. package/RichTreeView/RichTreeView.types.d.ts +55 -0
  6. package/RichTreeView/RichTreeView.types.js +1 -0
  7. package/RichTreeView/index.d.ts +3 -0
  8. package/RichTreeView/index.js +3 -0
  9. package/RichTreeView/package.json +6 -0
  10. package/RichTreeView/richTreeViewClasses.d.ts +7 -0
  11. package/RichTreeView/richTreeViewClasses.js +6 -0
  12. package/SimpleTreeView/SimpleTreeView.d.ts +20 -0
  13. package/SimpleTreeView/SimpleTreeView.js +268 -0
  14. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +6 -0
  15. package/SimpleTreeView/SimpleTreeView.plugins.js +5 -0
  16. package/SimpleTreeView/SimpleTreeView.types.d.ts +38 -0
  17. package/SimpleTreeView/SimpleTreeView.types.js +1 -0
  18. package/SimpleTreeView/index.d.ts +3 -0
  19. package/SimpleTreeView/index.js +3 -0
  20. package/SimpleTreeView/package.json +6 -0
  21. package/SimpleTreeView/simpleTreeViewClasses.d.ts +7 -0
  22. package/SimpleTreeView/simpleTreeViewClasses.js +6 -0
  23. package/TreeItem/TreeItem.js +44 -89
  24. package/TreeItem/TreeItem.types.d.ts +2 -1
  25. package/TreeItem/index.d.ts +2 -2
  26. package/TreeItem/index.js +2 -2
  27. package/TreeItem/useTreeItem.js +5 -5
  28. package/TreeView/TreeView.d.ts +4 -0
  29. package/TreeView/TreeView.js +80 -87
  30. package/TreeView/TreeView.types.d.ts +4 -26
  31. package/TreeView/index.d.ts +1 -1
  32. package/index.d.ts +3 -0
  33. package/index.js +5 -2
  34. package/internals/TreeViewProvider/TreeViewContext.d.ts +1 -2
  35. package/internals/TreeViewProvider/TreeViewContext.js +1 -14
  36. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +3 -3
  37. package/internals/TreeViewProvider/useTreeViewContext.js +7 -1
  38. package/internals/corePlugins/corePlugins.d.ts +1 -1
  39. package/internals/corePlugins/corePlugins.js +1 -1
  40. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.d.ts +0 -5
  41. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +0 -6
  42. package/internals/hooks/useLazyRef.d.ts +2 -0
  43. package/internals/hooks/useLazyRef.js +11 -0
  44. package/internals/hooks/useOnMount.d.ts +2 -0
  45. package/internals/hooks/useOnMount.js +7 -0
  46. package/internals/hooks/useTimeout.d.ts +9 -0
  47. package/internals/hooks/useTimeout.js +28 -0
  48. package/internals/models/plugin.d.ts +23 -0
  49. package/internals/models/treeView.d.ts +5 -1
  50. package/internals/plugins/defaultPlugins.d.ts +3 -2
  51. package/internals/plugins/defaultPlugins.js +2 -1
  52. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +8 -6
  53. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +1 -6
  54. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -17
  55. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +12 -5
  56. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +13 -6
  57. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -1
  58. package/internals/plugins/useTreeViewId/index.d.ts +2 -0
  59. package/internals/plugins/useTreeViewId/index.js +1 -0
  60. package/internals/plugins/useTreeViewId/useTreeViewId.d.ts +3 -0
  61. package/internals/plugins/useTreeViewId/useTreeViewId.js +18 -0
  62. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +17 -0
  63. package/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  64. package/internals/plugins/useTreeViewJSXNodes/index.d.ts +2 -0
  65. package/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  66. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +3 -0
  67. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +114 -0
  68. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +16 -0
  69. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  70. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +20 -9
  71. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +5 -2
  72. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +83 -18
  73. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +48 -5
  74. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.d.ts +1 -1
  75. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +41 -28
  76. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -8
  77. package/internals/useTreeView/useTreeView.js +40 -3
  78. package/internals/useTreeView/useTreeView.types.d.ts +2 -1
  79. package/internals/utils/warning.d.ts +1 -0
  80. package/internals/utils/warning.js +14 -0
  81. package/legacy/RichTreeView/RichTreeView.js +317 -0
  82. package/legacy/RichTreeView/RichTreeView.types.js +1 -0
  83. package/legacy/RichTreeView/index.js +3 -0
  84. package/legacy/RichTreeView/richTreeViewClasses.js +6 -0
  85. package/legacy/SimpleTreeView/SimpleTreeView.js +264 -0
  86. package/legacy/SimpleTreeView/SimpleTreeView.plugins.js +6 -0
  87. package/legacy/SimpleTreeView/SimpleTreeView.types.js +1 -0
  88. package/legacy/SimpleTreeView/index.js +3 -0
  89. package/legacy/SimpleTreeView/simpleTreeViewClasses.js +6 -0
  90. package/legacy/TreeItem/TreeItem.js +49 -103
  91. package/legacy/TreeItem/index.js +2 -2
  92. package/legacy/TreeItem/useTreeItem.js +5 -5
  93. package/legacy/TreeView/TreeView.js +80 -82
  94. package/legacy/index.js +5 -2
  95. package/legacy/internals/TreeViewProvider/TreeViewContext.js +1 -14
  96. package/legacy/internals/TreeViewProvider/useTreeViewContext.js +5 -1
  97. package/legacy/internals/corePlugins/corePlugins.js +1 -1
  98. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +0 -6
  99. package/legacy/internals/hooks/useLazyRef.js +11 -0
  100. package/legacy/internals/hooks/useOnMount.js +7 -0
  101. package/legacy/internals/hooks/useTimeout.js +38 -0
  102. package/legacy/internals/plugins/defaultPlugins.js +2 -1
  103. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +11 -8
  104. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -17
  105. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +13 -6
  106. package/legacy/internals/plugins/useTreeViewId/index.js +1 -0
  107. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +21 -0
  108. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  109. package/legacy/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  110. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +120 -0
  111. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  112. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +20 -9
  113. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +89 -20
  114. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -28
  115. package/legacy/internals/useTreeView/useTreeView.js +39 -3
  116. package/legacy/internals/utils/warning.js +15 -0
  117. package/legacy/models/index.js +1 -0
  118. package/legacy/models/items.js +1 -0
  119. package/models/index.d.ts +1 -0
  120. package/models/index.js +1 -0
  121. package/models/items.d.ts +7 -0
  122. package/models/items.js +1 -0
  123. package/models/package.json +6 -0
  124. package/modern/RichTreeView/RichTreeView.js +322 -0
  125. package/modern/RichTreeView/RichTreeView.types.js +1 -0
  126. package/modern/RichTreeView/index.js +3 -0
  127. package/modern/RichTreeView/richTreeViewClasses.js +6 -0
  128. package/modern/SimpleTreeView/SimpleTreeView.js +267 -0
  129. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +5 -0
  130. package/modern/SimpleTreeView/SimpleTreeView.types.js +1 -0
  131. package/modern/SimpleTreeView/index.js +3 -0
  132. package/modern/SimpleTreeView/simpleTreeViewClasses.js +6 -0
  133. package/modern/TreeItem/TreeItem.js +44 -88
  134. package/modern/TreeItem/index.js +2 -2
  135. package/modern/TreeItem/useTreeItem.js +5 -5
  136. package/modern/TreeView/TreeView.js +80 -87
  137. package/modern/index.js +5 -2
  138. package/modern/internals/TreeViewProvider/TreeViewContext.js +1 -14
  139. package/modern/internals/TreeViewProvider/useTreeViewContext.js +7 -1
  140. package/modern/internals/corePlugins/corePlugins.js +1 -1
  141. package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +0 -6
  142. package/modern/internals/hooks/useLazyRef.js +11 -0
  143. package/modern/internals/hooks/useOnMount.js +7 -0
  144. package/modern/internals/hooks/useTimeout.js +28 -0
  145. package/modern/internals/plugins/defaultPlugins.js +2 -1
  146. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +8 -6
  147. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -17
  148. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -6
  149. package/modern/internals/plugins/useTreeViewId/index.js +1 -0
  150. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +18 -0
  151. package/modern/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  152. package/modern/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  153. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +113 -0
  154. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  155. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +19 -9
  156. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +82 -18
  157. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +41 -28
  158. package/modern/internals/useTreeView/useTreeView.js +40 -3
  159. package/modern/internals/utils/warning.js +14 -0
  160. package/modern/models/index.js +1 -0
  161. package/modern/models/items.js +1 -0
  162. package/node/RichTreeView/RichTreeView.js +330 -0
  163. package/node/RichTreeView/RichTreeView.types.js +5 -0
  164. package/node/RichTreeView/index.js +27 -0
  165. package/node/RichTreeView/richTreeViewClasses.js +14 -0
  166. package/node/SimpleTreeView/SimpleTreeView.js +275 -0
  167. package/node/SimpleTreeView/SimpleTreeView.plugins.js +11 -0
  168. package/node/SimpleTreeView/SimpleTreeView.types.js +5 -0
  169. package/node/SimpleTreeView/index.js +27 -0
  170. package/node/SimpleTreeView/simpleTreeViewClasses.js +14 -0
  171. package/node/TreeItem/TreeItem.js +44 -88
  172. package/node/TreeItem/index.js +11 -15
  173. package/node/TreeItem/useTreeItem.js +5 -5
  174. package/node/TreeView/TreeView.js +80 -87
  175. package/node/index.js +38 -2
  176. package/node/internals/TreeViewProvider/TreeViewContext.js +2 -15
  177. package/node/internals/TreeViewProvider/useTreeViewContext.js +7 -1
  178. package/node/internals/corePlugins/corePlugins.js +1 -1
  179. package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +0 -6
  180. package/node/internals/hooks/useLazyRef.js +19 -0
  181. package/node/internals/hooks/useOnMount.js +15 -0
  182. package/node/internals/hooks/useTimeout.js +34 -0
  183. package/node/internals/plugins/defaultPlugins.js +2 -1
  184. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +8 -7
  185. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +26 -17
  186. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -6
  187. package/node/internals/plugins/useTreeViewId/index.js +12 -0
  188. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +28 -0
  189. package/node/internals/plugins/useTreeViewId/useTreeViewId.types.js +5 -0
  190. package/node/internals/plugins/useTreeViewJSXNodes/index.js +12 -0
  191. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +123 -0
  192. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +5 -0
  193. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +19 -9
  194. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +82 -18
  195. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +41 -28
  196. package/node/internals/useTreeView/useTreeView.js +40 -3
  197. package/node/internals/utils/warning.js +21 -0
  198. package/node/models/index.js +16 -0
  199. package/node/models/items.js +5 -0
  200. package/package.json +8 -7
  201. package/themeAugmentation/components.d.ts +14 -4
  202. package/themeAugmentation/overrides.d.ts +8 -4
  203. package/themeAugmentation/props.d.ts +7 -3
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.TREE_VIEW_CORE_PLUGINS = void 0;
7
7
  var _useTreeViewInstanceEvents = require("./useTreeViewInstanceEvents");
8
8
  /**
9
- * Internal plugins that creates the tools used by the other plugins.
9
+ * Internal plugins that create the tools used by the other plugins.
10
10
  * These plugins are used by the tree view components.
11
11
  */
12
12
  const TREE_VIEW_CORE_PLUGINS = exports.TREE_VIEW_CORE_PLUGINS = [_useTreeViewInstanceEvents.useTreeViewInstanceEvents];
@@ -12,12 +12,6 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
12
12
  const isSyntheticEvent = event => {
13
13
  return event.isPropagationStopped !== undefined;
14
14
  };
15
-
16
- /**
17
- * Plugin responsible for the registration of the nodes defined as JSX children of the TreeView.
18
- * When we will have both a SimpleTreeView using JSX children and a TreeView using a data prop,
19
- * this plugin will only be used by SimpleTreeView.
20
- */
21
15
  const useTreeViewInstanceEvents = ({
22
16
  instance
23
17
  }) => {
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLazyRef = useLazyRef;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ const UNINITIALIZED = {};
11
+
12
+ // See https://github.com/facebook/react/issues/14490 for when to use this.
13
+ function useLazyRef(init, initArg) {
14
+ const ref = React.useRef(UNINITIALIZED);
15
+ if (ref.current === UNINITIALIZED) {
16
+ ref.current = init(initArg);
17
+ }
18
+ return ref;
19
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useOnMount = useOnMount;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ const EMPTY = [];
11
+ function useOnMount(fn) {
12
+ /* eslint-disable react-hooks/exhaustive-deps */
13
+ React.useEffect(fn, EMPTY);
14
+ /* eslint-enable react-hooks/exhaustive-deps */
15
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useTimeout = useTimeout;
7
+ var _useLazyRef = require("./useLazyRef");
8
+ var _useOnMount = require("./useOnMount");
9
+ class Timeout {
10
+ constructor() {
11
+ this.currentId = 0;
12
+ this.clear = () => {
13
+ if (this.currentId !== 0) {
14
+ clearTimeout(this.currentId);
15
+ this.currentId = 0;
16
+ }
17
+ };
18
+ this.disposeEffect = () => {
19
+ return this.clear;
20
+ };
21
+ }
22
+ static create() {
23
+ return new Timeout();
24
+ }
25
+ start(delay, fn) {
26
+ this.clear();
27
+ this.currentId = setTimeout(fn, delay);
28
+ }
29
+ }
30
+ function useTimeout() {
31
+ const timeout = (0, _useLazyRef.useLazyRef)(Timeout.create).current;
32
+ (0, _useOnMount.useOnMount)(timeout.disposeEffect);
33
+ return timeout;
34
+ }
@@ -4,12 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.DEFAULT_TREE_VIEW_PLUGINS = void 0;
7
+ var _useTreeViewId = require("./useTreeViewId");
7
8
  var _useTreeViewNodes = require("./useTreeViewNodes");
8
9
  var _useTreeViewExpansion = require("./useTreeViewExpansion");
9
10
  var _useTreeViewSelection = require("./useTreeViewSelection");
10
11
  var _useTreeViewFocus = require("./useTreeViewFocus");
11
12
  var _useTreeViewKeyboardNavigation = require("./useTreeViewKeyboardNavigation");
12
13
  var _useTreeViewContextValueBuilder = require("./useTreeViewContextValueBuilder");
13
- const DEFAULT_TREE_VIEW_PLUGINS = exports.DEFAULT_TREE_VIEW_PLUGINS = [_useTreeViewNodes.useTreeViewNodes, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewContextValueBuilder.useTreeViewContextValueBuilder];
14
+ const DEFAULT_TREE_VIEW_PLUGINS = exports.DEFAULT_TREE_VIEW_PLUGINS = [_useTreeViewId.useTreeViewId, _useTreeViewNodes.useTreeViewNodes, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewContextValueBuilder.useTreeViewContextValueBuilder];
14
15
 
15
16
  // We can't infer this type from the plugin, otherwise we would lose the generics.
@@ -1,24 +1,25 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.useTreeViewContextValueBuilder = void 0;
8
- var _useId = _interopRequireDefault(require("@mui/utils/useId"));
9
7
  const useTreeViewContextValueBuilder = ({
10
8
  instance,
11
9
  params
12
10
  }) => {
13
- const treeId = (0, _useId.default)(params.id);
14
11
  return {
15
- getRootProps: () => ({
16
- id: treeId
17
- }),
18
12
  contextValue: {
19
- treeId,
20
13
  instance: instance,
21
14
  multiSelect: params.multiSelect,
15
+ runItemPlugins: ({
16
+ props,
17
+ ref
18
+ }) => ({
19
+ props,
20
+ ref,
21
+ wrapItem: children => children
22
+ }),
22
23
  disabledItemsFocusable: params.disabledItemsFocusable,
23
24
  icons: {
24
25
  defaultCollapseIcon: params.defaultCollapseIcon,
@@ -17,34 +17,43 @@ const useTreeViewExpansion = ({
17
17
  models
18
18
  }) => {
19
19
  const isNodeExpanded = React.useCallback(nodeId => {
20
- return Array.isArray(models.expanded.value) ? models.expanded.value.indexOf(nodeId) !== -1 : false;
21
- }, [models.expanded.value]);
20
+ return Array.isArray(models.expandedNodes.value) ? models.expandedNodes.value.indexOf(nodeId) !== -1 : false;
21
+ }, [models.expandedNodes.value]);
22
22
  const isNodeExpandable = React.useCallback(nodeId => !!instance.getNode(nodeId)?.expandable, [instance]);
23
23
  const toggleNodeExpansion = (0, _useEventCallback.default)((event, nodeId) => {
24
24
  if (nodeId == null) {
25
25
  return;
26
26
  }
27
+ const isExpandedBefore = models.expandedNodes.value.indexOf(nodeId) !== -1;
27
28
  let newExpanded;
28
- if (models.expanded.value.indexOf(nodeId) !== -1) {
29
- newExpanded = models.expanded.value.filter(id => id !== nodeId);
29
+ if (isExpandedBefore) {
30
+ newExpanded = models.expandedNodes.value.filter(id => id !== nodeId);
30
31
  } else {
31
- newExpanded = [nodeId].concat(models.expanded.value);
32
+ newExpanded = [nodeId].concat(models.expandedNodes.value);
32
33
  }
33
- if (params.onNodeToggle) {
34
- params.onNodeToggle(event, newExpanded);
34
+ if (params.onNodeExpansionToggle) {
35
+ params.onNodeExpansionToggle(event, nodeId, !isExpandedBefore);
35
36
  }
36
- models.expanded.setValue(newExpanded);
37
+ if (params.onExpandedNodesChange) {
38
+ params.onExpandedNodesChange(event, newExpanded);
39
+ }
40
+ models.expandedNodes.setValue(newExpanded);
37
41
  });
38
42
  const expandAllSiblings = (event, nodeId) => {
39
43
  const node = instance.getNode(nodeId);
40
44
  const siblings = instance.getChildrenIds(node.parentId);
41
45
  const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
42
- const newExpanded = models.expanded.value.concat(diff);
46
+ const newExpanded = models.expandedNodes.value.concat(diff);
43
47
  if (diff.length > 0) {
44
- models.expanded.setValue(newExpanded);
45
- if (params.onNodeToggle) {
46
- params.onNodeToggle(event, newExpanded);
48
+ if (params.onNodeExpansionToggle) {
49
+ diff.forEach(newlyExpandedNodeId => {
50
+ params.onNodeExpansionToggle(event, newlyExpandedNodeId, true);
51
+ });
52
+ }
53
+ if (params.onExpandedNodesChange) {
54
+ params.onExpandedNodesChange(event, newExpanded);
47
55
  }
56
+ models.expandedNodes.setValue(newExpanded);
48
57
  }
49
58
  };
50
59
  (0, _useTreeView.populateInstance)(instance, {
@@ -56,12 +65,12 @@ const useTreeViewExpansion = ({
56
65
  };
57
66
  exports.useTreeViewExpansion = useTreeViewExpansion;
58
67
  useTreeViewExpansion.models = {
59
- expanded: {
60
- controlledProp: 'expanded',
61
- defaultProp: 'defaultExpanded'
68
+ expandedNodes: {
69
+ controlledProp: 'expandedNodes',
70
+ defaultProp: 'defaultExpandedNodes'
62
71
  }
63
72
  };
64
- const DEFAULT_EXPANDED = [];
73
+ const DEFAULT_EXPANDED_NODES = [];
65
74
  useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
66
- defaultExpanded: params.defaultExpanded ?? DEFAULT_EXPANDED
75
+ defaultExpandedNodes: params.defaultExpandedNodes ?? DEFAULT_EXPANDED_NODES
67
76
  });
@@ -36,9 +36,15 @@ const useTreeViewFocus = ({
36
36
  }
37
37
  }
38
38
  });
39
+ const focusRoot = (0, _useEventCallback.default)(() => {
40
+ rootRef.current?.focus({
41
+ preventScroll: true
42
+ });
43
+ });
39
44
  (0, _useTreeView.populateInstance)(instance, {
40
45
  isNodeFocused,
41
- focusNode
46
+ focusNode,
47
+ focusRoot
42
48
  });
43
49
  (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
44
50
  id
@@ -60,10 +66,10 @@ const useTreeViewFocus = ({
60
66
  return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
61
67
  };
62
68
  let nodeToFocusId;
63
- if (Array.isArray(models.selected.value)) {
64
- nodeToFocusId = models.selected.value.find(isNodeVisible);
65
- } else if (models.selected.value != null && isNodeVisible(models.selected.value)) {
66
- nodeToFocusId = models.selected.value;
69
+ if (Array.isArray(models.selectedNodes.value)) {
70
+ nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
71
+ } else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
72
+ nodeToFocusId = models.selectedNodes.value;
67
73
  }
68
74
  if (nodeToFocusId == null) {
69
75
  nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
@@ -76,7 +82,7 @@ const useTreeViewFocus = ({
76
82
  setFocusedNodeId(null);
77
83
  };
78
84
  const focusedNode = instance.getNode(state.focusedNodeId);
79
- const activeDescendant = focusedNode ? focusedNode.idAttribute : null;
85
+ const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
80
86
  return {
81
87
  getRootProps: otherHandlers => ({
82
88
  onFocus: createHandleFocus(otherHandlers),
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewId", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewId.useTreeViewId;
10
+ }
11
+ });
12
+ var _useTreeViewId = require("./useTreeViewId");
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeViewId = void 0;
8
+ var React = _interopRequireWildcard(require("react"));
9
+ var _useId = _interopRequireDefault(require("@mui/utils/useId"));
10
+ var _useTreeView = require("../../useTreeView/useTreeView.utils");
11
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
12
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ const useTreeViewId = ({
14
+ instance,
15
+ params
16
+ }) => {
17
+ const treeId = (0, _useId.default)(params.id);
18
+ const getTreeItemId = React.useCallback((nodeId, idAttribute) => idAttribute ?? `${treeId}-${nodeId}`, [treeId]);
19
+ (0, _useTreeView.populateInstance)(instance, {
20
+ getTreeItemId
21
+ });
22
+ return {
23
+ getRootProps: () => ({
24
+ id: treeId
25
+ })
26
+ };
27
+ };
28
+ exports.useTreeViewId = useTreeViewId;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewJSXNodes", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewJSXNodes.useTreeViewJSXNodes;
10
+ }
11
+ });
12
+ var _useTreeViewJSXNodes = require("./useTreeViewJSXNodes");
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeViewJSXNodes = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var React = _interopRequireWildcard(require("react"));
10
+ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
+ var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
12
+ var _useTreeView = require("../../useTreeView/useTreeView.utils");
13
+ var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
14
+ var _useTreeViewContext = require("../../TreeViewProvider/useTreeViewContext");
15
+ var _DescendantProvider = require("../../TreeViewProvider/DescendantProvider");
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
+ const useTreeViewJSXNodes = ({
20
+ instance,
21
+ setState
22
+ }) => {
23
+ const insertJSXNode = (0, _useEventCallback.default)(node => {
24
+ setState(prevState => (0, _extends2.default)({}, prevState, {
25
+ nodeMap: (0, _extends2.default)({}, prevState.nodeMap, {
26
+ [node.id]: node
27
+ })
28
+ }));
29
+ });
30
+ const removeJSXNode = (0, _useEventCallback.default)(nodeId => {
31
+ setState(prevState => {
32
+ const newMap = (0, _extends2.default)({}, prevState.nodeMap);
33
+ delete newMap[nodeId];
34
+ return (0, _extends2.default)({}, prevState, {
35
+ nodeMap: newMap
36
+ });
37
+ });
38
+ (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
39
+ id: nodeId
40
+ });
41
+ });
42
+ const mapFirstCharFromJSX = (0, _useEventCallback.default)((nodeId, firstChar) => {
43
+ instance.updateFirstCharMap(firstCharMap => {
44
+ firstCharMap[nodeId] = firstChar;
45
+ return firstCharMap;
46
+ });
47
+ return () => {
48
+ instance.updateFirstCharMap(firstCharMap => {
49
+ const newMap = (0, _extends2.default)({}, firstCharMap);
50
+ delete newMap[nodeId];
51
+ return newMap;
52
+ });
53
+ };
54
+ });
55
+ (0, _useTreeView.populateInstance)(instance, {
56
+ insertJSXNode,
57
+ removeJSXNode,
58
+ mapFirstCharFromJSX
59
+ });
60
+ };
61
+ exports.useTreeViewJSXNodes = useTreeViewJSXNodes;
62
+ const useTreeViewJSXNodesItemPlugin = ({
63
+ props,
64
+ ref
65
+ }) => {
66
+ const {
67
+ children,
68
+ disabled = false,
69
+ label,
70
+ nodeId,
71
+ id,
72
+ ContentProps: inContentProps
73
+ } = props;
74
+ const {
75
+ instance
76
+ } = (0, _useTreeViewContext.useTreeViewContext)();
77
+ const expandable = Boolean(Array.isArray(children) ? children.length : children);
78
+ const [treeItemElement, setTreeItemElement] = React.useState(null);
79
+ const contentRef = React.useRef(null);
80
+ const handleRef = (0, _useForkRef.default)(setTreeItemElement, ref);
81
+ const descendant = React.useMemo(() => ({
82
+ element: treeItemElement,
83
+ id: nodeId
84
+ }), [nodeId, treeItemElement]);
85
+ const {
86
+ index,
87
+ parentId
88
+ } = (0, _DescendantProvider.useDescendant)(descendant);
89
+ React.useEffect(() => {
90
+ // On the first render a node's index will be -1. We want to wait for the real index.
91
+ if (instance && index !== -1) {
92
+ instance.insertJSXNode({
93
+ id: nodeId,
94
+ idAttribute: id,
95
+ index,
96
+ parentId,
97
+ expandable,
98
+ disabled
99
+ });
100
+ return () => instance.removeJSXNode(nodeId);
101
+ }
102
+ return undefined;
103
+ }, [instance, parentId, index, nodeId, expandable, disabled, id]);
104
+ React.useEffect(() => {
105
+ if (instance && label) {
106
+ return instance.mapFirstCharFromJSX(nodeId, (contentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
107
+ }
108
+ return undefined;
109
+ }, [instance, nodeId, label]);
110
+ return {
111
+ props: (0, _extends2.default)({}, props, {
112
+ ContentProps: (0, _extends2.default)({}, inContentProps, {
113
+ ref: contentRef
114
+ })
115
+ }),
116
+ ref: handleRef,
117
+ wrapItem: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
118
+ id: nodeId,
119
+ children: item
120
+ })
121
+ };
122
+ };
123
+ useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.useTreeViewKeyboardNavigation = void 0;
8
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
8
  var React = _interopRequireWildcard(require("react"));
10
9
  var _styles = require("@mui/material/styles");
11
10
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
@@ -31,16 +30,27 @@ const useTreeViewKeyboardNavigation = ({
31
30
  const theme = (0, _styles.useTheme)();
32
31
  const isRtl = theme.direction === 'rtl';
33
32
  const firstCharMap = React.useRef({});
34
- const mapFirstChar = (0, _useEventCallback.default)((nodeId, firstChar) => {
35
- firstCharMap.current[nodeId] = firstChar;
36
- return () => {
37
- const newMap = (0, _extends2.default)({}, firstCharMap.current);
38
- delete newMap[nodeId];
39
- firstCharMap.current = newMap;
40
- };
33
+ const hasFirstCharMapBeenUpdatedImperatively = React.useRef(false);
34
+ const updateFirstCharMap = (0, _useEventCallback.default)(callback => {
35
+ hasFirstCharMapBeenUpdatedImperatively.current = true;
36
+ firstCharMap.current = callback(firstCharMap.current);
41
37
  });
38
+ React.useEffect(() => {
39
+ if (hasFirstCharMapBeenUpdatedImperatively.current) {
40
+ return;
41
+ }
42
+ const newFirstCharMap = {};
43
+ const processItem = item => {
44
+ const getItemId = params.getItemId;
45
+ const nodeId = getItemId ? getItemId(item) : item.id;
46
+ newFirstCharMap[nodeId] = instance.getNode(nodeId).label.substring(0, 1).toLowerCase();
47
+ item.children?.forEach(processItem);
48
+ };
49
+ params.items.forEach(processItem);
50
+ firstCharMap.current = newFirstCharMap;
51
+ }, [params.items, params.getItemId, instance]);
42
52
  (0, _useTreeView.populateInstance)(instance, {
43
- mapFirstChar
53
+ updateFirstCharMap
44
54
  });
45
55
  const handleNextArrow = event => {
46
56
  if (state.focusedNodeId != null && instance.isNodeExpandable(state.focusedNodeId)) {
@@ -12,23 +12,49 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
12
12
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
13
13
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
14
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ const updateState = ({
16
+ items,
17
+ isItemDisabled,
18
+ getItemLabel,
19
+ getItemId
20
+ }) => {
21
+ const nodeMap = {};
22
+ const processItem = (item, index, parentId) => {
23
+ const id = getItemId ? getItemId(item) : item.id;
24
+ if (id == null) {
25
+ throw new Error(['MUI: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
26
+ }
27
+ const label = getItemLabel ? getItemLabel(item) : item.label;
28
+ if (label == null) {
29
+ throw new Error(['MUI: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
30
+ }
31
+ nodeMap[id] = {
32
+ id,
33
+ label,
34
+ index,
35
+ parentId,
36
+ idAttribute: id,
37
+ expandable: !!item.children?.length,
38
+ disabled: isItemDisabled ? isItemDisabled(item) : false
39
+ };
40
+ return {
41
+ id,
42
+ children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
43
+ };
44
+ };
45
+ const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
46
+ return {
47
+ nodeMap,
48
+ nodeTree
49
+ };
50
+ };
15
51
  const useTreeViewNodes = ({
16
52
  instance,
17
- params
53
+ params,
54
+ state,
55
+ setState
18
56
  }) => {
19
- const nodeMap = React.useRef({});
20
- const getNode = React.useCallback(nodeId => nodeMap.current[nodeId], []);
21
- const insertNode = React.useCallback(node => {
22
- nodeMap.current[node.id] = node;
23
- }, []);
24
- const removeNode = React.useCallback(nodeId => {
25
- const newMap = (0, _extends2.default)({}, nodeMap.current);
26
- delete newMap[nodeId];
27
- nodeMap.current = newMap;
28
- (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
29
- id: nodeId
30
- });
31
- }, [instance]);
57
+ const getNode = React.useCallback(nodeId => state.nodeMap[nodeId], [state.nodeMap]);
32
58
  const isNodeDisabled = React.useCallback(nodeId => {
33
59
  if (nodeId == null) {
34
60
  return false;
@@ -50,7 +76,7 @@ const useTreeViewNodes = ({
50
76
  }
51
77
  return false;
52
78
  }, [instance]);
53
- const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(nodeMap.current).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
79
+ const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
54
80
  const getNavigableChildrenIds = nodeId => {
55
81
  let childrenIds = instance.getChildrenIds(nodeId);
56
82
  if (!params.disabledItemsFocusable) {
@@ -58,13 +84,51 @@ const useTreeViewNodes = ({
58
84
  }
59
85
  return childrenIds;
60
86
  };
87
+ React.useEffect(() => {
88
+ setState(prevState => {
89
+ const newState = updateState({
90
+ items: params.items,
91
+ isItemDisabled: params.isItemDisabled,
92
+ getItemId: params.getItemId,
93
+ getItemLabel: params.getItemLabel
94
+ });
95
+ Object.values(prevState.nodeMap).forEach(node => {
96
+ if (!newState.nodeMap[node.id]) {
97
+ (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
98
+ id: node.id
99
+ });
100
+ }
101
+ });
102
+ return (0, _extends2.default)({}, prevState, newState);
103
+ });
104
+ }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
105
+ const getNodesToRender = (0, _useEventCallback.default)(() => {
106
+ const getPropsFromNodeId = ({
107
+ id,
108
+ children
109
+ }) => {
110
+ const node = state.nodeMap[id];
111
+ return {
112
+ label: node.label,
113
+ nodeId: node.id,
114
+ id: node.idAttribute,
115
+ children: children?.map(getPropsFromNodeId)
116
+ };
117
+ };
118
+ return state.nodeTree.map(getPropsFromNodeId);
119
+ });
61
120
  (0, _useTreeView.populateInstance)(instance, {
62
121
  getNode,
63
- updateNode: insertNode,
64
- removeNode,
122
+ getNodesToRender,
65
123
  getChildrenIds,
66
124
  getNavigableChildrenIds,
67
125
  isNodeDisabled
68
126
  });
69
127
  };
70
- exports.useTreeViewNodes = useTreeViewNodes;
128
+ exports.useTreeViewNodes = useTreeViewNodes;
129
+ useTreeViewNodes.getInitialState = params => updateState({
130
+ items: params.items,
131
+ isItemDisabled: params.isItemDisabled,
132
+ getItemId: params.getItemId,
133
+ getItemLabel: params.getItemLabel
134
+ });