@mui/x-tree-view 7.0.0-beta.3 → 7.0.0-beta.5

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 (147) hide show
  1. package/CHANGELOG.md +357 -22
  2. package/RichTreeView/RichTreeView.js +8 -0
  3. package/RichTreeView/RichTreeView.types.d.ts +7 -1
  4. package/SimpleTreeView/SimpleTreeView.js +8 -0
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +7 -1
  6. package/TreeItem/TreeItem.js +1 -1
  7. package/TreeItem/TreeItem.types.d.ts +1 -1
  8. package/TreeView/TreeView.js +8 -0
  9. package/hooks/index.d.ts +1 -0
  10. package/hooks/index.js +1 -0
  11. package/hooks/package.json +6 -0
  12. package/hooks/useTreeViewApiRef.d.ts +6 -0
  13. package/hooks/useTreeViewApiRef.js +5 -0
  14. package/index.d.ts +1 -0
  15. package/index.js +3 -2
  16. package/internals/TreeViewProvider/DescendantProvider.js +1 -11
  17. package/internals/hooks/useTimeout.d.ts +5 -3
  18. package/internals/hooks/useTimeout.js +13 -5
  19. package/internals/models/helpers.d.ts +1 -0
  20. package/internals/models/plugin.d.ts +12 -0
  21. package/internals/models/treeView.d.ts +1 -0
  22. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +40 -22
  23. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -0
  24. package/internals/useTreeView/useTreeView.d.ts +2 -0
  25. package/internals/useTreeView/useTreeView.js +12 -0
  26. package/internals/useTreeView/useTreeView.types.d.ts +2 -1
  27. package/internals/useTreeView/useTreeView.utils.d.ts +2 -1
  28. package/internals/useTreeView/useTreeView.utils.js +3 -0
  29. package/internals/utils/extractPluginParamsFromProps.d.ts +3 -2
  30. package/internals/utils/extractPluginParamsFromProps.js +5 -3
  31. package/internals/utils/utils.d.ts +1 -0
  32. package/internals/utils/utils.js +10 -0
  33. package/modern/RichTreeView/RichTreeView.js +8 -0
  34. package/modern/SimpleTreeView/SimpleTreeView.js +8 -0
  35. package/modern/TreeItem/TreeItem.js +1 -1
  36. package/modern/TreeView/TreeView.js +8 -0
  37. package/modern/hooks/index.js +1 -0
  38. package/modern/hooks/useTreeViewApiRef.js +5 -0
  39. package/modern/index.js +3 -2
  40. package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -11
  41. package/modern/internals/hooks/useTimeout.js +13 -5
  42. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +40 -22
  43. package/modern/internals/useTreeView/useTreeView.js +12 -0
  44. package/modern/internals/useTreeView/useTreeView.utils.js +3 -0
  45. package/modern/internals/utils/extractPluginParamsFromProps.js +5 -3
  46. package/modern/internals/utils/utils.js +10 -0
  47. package/node/RichTreeView/RichTreeView.js +8 -0
  48. package/node/SimpleTreeView/SimpleTreeView.js +8 -0
  49. package/node/TreeItem/TreeItem.js +1 -1
  50. package/node/TreeView/TreeView.js +8 -0
  51. package/node/hooks/index.js +12 -0
  52. package/node/hooks/useTreeViewApiRef.js +14 -0
  53. package/node/index.js +13 -1
  54. package/node/internals/TreeViewProvider/DescendantProvider.js +1 -10
  55. package/node/internals/hooks/useTimeout.js +13 -4
  56. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +39 -21
  57. package/node/internals/useTreeView/useTreeView.js +13 -0
  58. package/node/internals/useTreeView/useTreeView.utils.js +6 -2
  59. package/node/internals/utils/extractPluginParamsFromProps.js +5 -3
  60. package/node/internals/utils/utils.js +17 -0
  61. package/package.json +1 -1
  62. package/legacy/RichTreeView/RichTreeView.js +0 -255
  63. package/legacy/RichTreeView/RichTreeView.types.js +0 -1
  64. package/legacy/RichTreeView/index.js +0 -3
  65. package/legacy/RichTreeView/richTreeViewClasses.js +0 -6
  66. package/legacy/SimpleTreeView/SimpleTreeView.js +0 -190
  67. package/legacy/SimpleTreeView/SimpleTreeView.plugins.js +0 -6
  68. package/legacy/SimpleTreeView/SimpleTreeView.types.js +0 -1
  69. package/legacy/SimpleTreeView/index.js +0 -3
  70. package/legacy/SimpleTreeView/simpleTreeViewClasses.js +0 -6
  71. package/legacy/TreeItem/TreeItem.js +0 -360
  72. package/legacy/TreeItem/TreeItem.types.js +0 -1
  73. package/legacy/TreeItem/TreeItemContent.js +0 -95
  74. package/legacy/TreeItem/index.js +0 -4
  75. package/legacy/TreeItem/treeItemClasses.js +0 -6
  76. package/legacy/TreeItem/useTreeItemState.js +0 -58
  77. package/legacy/TreeView/TreeView.js +0 -165
  78. package/legacy/TreeView/TreeView.types.js +0 -1
  79. package/legacy/TreeView/index.js +0 -3
  80. package/legacy/TreeView/treeViewClasses.js +0 -6
  81. package/legacy/icons/icons.js +0 -9
  82. package/legacy/icons/index.js +0 -1
  83. package/legacy/index.js +0 -14
  84. package/legacy/internals/TreeViewProvider/DescendantProvider.js +0 -199
  85. package/legacy/internals/TreeViewProvider/TreeViewContext.js +0 -8
  86. package/legacy/internals/TreeViewProvider/TreeViewProvider.js +0 -19
  87. package/legacy/internals/TreeViewProvider/TreeViewProvider.types.js +0 -1
  88. package/legacy/internals/TreeViewProvider/index.js +0 -1
  89. package/legacy/internals/TreeViewProvider/useTreeViewContext.js +0 -9
  90. package/legacy/internals/corePlugins/corePlugins.js +0 -6
  91. package/legacy/internals/corePlugins/index.js +0 -1
  92. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/index.js +0 -1
  93. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +0 -40
  94. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.types.js +0 -1
  95. package/legacy/internals/hooks/useInstanceEventHandler.js +0 -87
  96. package/legacy/internals/hooks/useLazyRef.js +0 -11
  97. package/legacy/internals/hooks/useOnMount.js +0 -7
  98. package/legacy/internals/hooks/useTimeout.js +0 -38
  99. package/legacy/internals/index.js +0 -4
  100. package/legacy/internals/models/MuiCancellableEvent.js +0 -1
  101. package/legacy/internals/models/events.js +0 -1
  102. package/legacy/internals/models/helpers.js +0 -1
  103. package/legacy/internals/models/index.js +0 -3
  104. package/legacy/internals/models/plugin.js +0 -1
  105. package/legacy/internals/models/treeView.js +0 -1
  106. package/legacy/internals/plugins/defaultPlugins.js +0 -10
  107. package/legacy/internals/plugins/index.js +0 -1
  108. package/legacy/internals/plugins/useTreeViewExpansion/index.js +0 -1
  109. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +0 -81
  110. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.js +0 -1
  111. package/legacy/internals/plugins/useTreeViewFocus/index.js +0 -1
  112. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +0 -103
  113. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.js +0 -1
  114. package/legacy/internals/plugins/useTreeViewIcons/index.js +0 -1
  115. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +0 -21
  116. package/legacy/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.js +0 -1
  117. package/legacy/internals/plugins/useTreeViewId/index.js +0 -1
  118. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +0 -24
  119. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.types.js +0 -1
  120. package/legacy/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  121. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +0 -130
  122. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +0 -1
  123. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/index.js +0 -1
  124. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +0 -284
  125. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.js +0 -1
  126. package/legacy/internals/plugins/useTreeViewNodes/index.js +0 -1
  127. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +0 -161
  128. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.js +0 -1
  129. package/legacy/internals/plugins/useTreeViewSelection/index.js +0 -1
  130. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +0 -219
  131. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.js +0 -1
  132. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +0 -55
  133. package/legacy/internals/useTreeView/index.js +0 -1
  134. package/legacy/internals/useTreeView/useTreeView.js +0 -111
  135. package/legacy/internals/useTreeView/useTreeView.types.js +0 -1
  136. package/legacy/internals/useTreeView/useTreeView.utils.js +0 -46
  137. package/legacy/internals/useTreeView/useTreeViewModels.js +0 -75
  138. package/legacy/internals/utils/EventManager.js +0 -91
  139. package/legacy/internals/utils/cleanupTracking/CleanupTracking.js +0 -1
  140. package/legacy/internals/utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking.js +0 -29
  141. package/legacy/internals/utils/cleanupTracking/TimerBasedCleanupTracking.js +0 -52
  142. package/legacy/internals/utils/extractPluginParamsFromProps.js +0 -36
  143. package/legacy/internals/utils/publishTreeViewEvent.js +0 -3
  144. package/legacy/internals/utils/warning.js +0 -15
  145. package/legacy/models/index.js +0 -1
  146. package/legacy/models/items.js +0 -1
  147. package/legacy/themeAugmentation/index.js +0 -3
@@ -3,6 +3,16 @@ import * as React from 'react';
3
3
  import useForkRef from '@mui/utils/useForkRef';
4
4
  import { useTreeViewModels } from './useTreeViewModels';
5
5
  import { TREE_VIEW_CORE_PLUGINS } from '../corePlugins';
6
+ export function useTreeViewApiInitialization(inputApiRef) {
7
+ const fallbackPublicApiRef = React.useRef({});
8
+ if (inputApiRef) {
9
+ if (inputApiRef.current == null) {
10
+ inputApiRef.current = {};
11
+ }
12
+ return inputApiRef.current;
13
+ }
14
+ return fallbackPublicApiRef.current;
15
+ }
6
16
  export const useTreeView = inParams => {
7
17
  const plugins = [...TREE_VIEW_CORE_PLUGINS, ...inParams.plugins];
8
18
  const params = plugins.reduce((acc, plugin) => {
@@ -14,6 +24,7 @@ export const useTreeView = inParams => {
14
24
  const models = useTreeViewModels(plugins, params);
15
25
  const instanceRef = React.useRef({});
16
26
  const instance = instanceRef.current;
27
+ const publicAPI = useTreeViewApiInitialization(inParams.apiRef);
17
28
  const innerRootRef = React.useRef(null);
18
29
  const handleRootRef = useForkRef(innerRootRef, inParams.rootRef);
19
30
  const [state, setState] = React.useState(() => {
@@ -32,6 +43,7 @@ export const useTreeView = inParams => {
32
43
  const runPlugin = plugin => {
33
44
  const pluginResponse = plugin({
34
45
  instance,
46
+ publicAPI,
35
47
  params,
36
48
  slots: params.slots,
37
49
  slotProps: params.slotProps,
@@ -40,4 +40,7 @@ export const getLastNode = instance => {
40
40
  export const getFirstNode = instance => instance.getNavigableChildrenIds(null)[0];
41
41
  export const populateInstance = (instance, methods) => {
42
42
  Object.assign(instance, methods);
43
+ };
44
+ export const populatePublicAPI = (publicAPI, methods) => {
45
+ Object.assign(publicAPI, methods);
43
46
  };
@@ -1,10 +1,11 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
- const _excluded = ["slots", "slotProps"];
2
+ const _excluded = ["slots", "slotProps", "apiRef"];
3
3
  export const extractPluginParamsFromProps = _ref => {
4
4
  let {
5
5
  props: {
6
6
  slots,
7
- slotProps
7
+ slotProps,
8
+ apiRef
8
9
  },
9
10
  plugins,
10
11
  rootRef
@@ -18,7 +19,8 @@ export const extractPluginParamsFromProps = _ref => {
18
19
  plugins,
19
20
  rootRef,
20
21
  slots: slots ?? {},
21
- slotProps: slotProps ?? {}
22
+ slotProps: slotProps ?? {},
23
+ apiRef
22
24
  };
23
25
  const otherProps = {};
24
26
  Object.keys(props).forEach(propName => {
@@ -0,0 +1,10 @@
1
+ export const getActiveElement = (root = document) => {
2
+ const activeEl = root.activeElement;
3
+ if (!activeEl) {
4
+ return null;
5
+ }
6
+ if (activeEl.shadowRoot) {
7
+ return getActiveElement(activeEl.shadowRoot);
8
+ }
9
+ return activeEl;
10
+ };
@@ -141,6 +141,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
141
141
  // | These PropTypes are generated from the TypeScript type definitions |
142
142
  // | To update them edit the TypeScript types and run "yarn proptypes" |
143
143
  // ----------------------------------------------------------------------
144
+ /**
145
+ * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
146
+ */
147
+ apiRef: _propTypes.default.shape({
148
+ current: _propTypes.default.shape({
149
+ focusNode: _propTypes.default.func.isRequired
150
+ })
151
+ }),
144
152
  /**
145
153
  * Override or extend the styles applied to the component.
146
154
  */
@@ -99,6 +99,14 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
99
99
  // | These PropTypes are generated from the TypeScript type definitions |
100
100
  // | To update them edit the TypeScript types and run "yarn proptypes" |
101
101
  // ----------------------------------------------------------------------
102
+ /**
103
+ * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
104
+ */
105
+ apiRef: _propTypes.default.shape({
106
+ current: _propTypes.default.shape({
107
+ focusNode: _propTypes.default.func.isRequired
108
+ })
109
+ }),
102
110
  /**
103
111
  * The content of the component.
104
112
  */
@@ -368,7 +368,7 @@ TreeItem.propTypes = {
368
368
  TransitionComponent: _propTypes.default.elementType,
369
369
  /**
370
370
  * Props applied to the transition element.
371
- * By default, the element is based on this [`Transition`](http://reactcommunity.org/react-transition-group/transition/) component.
371
+ * By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
372
372
  */
373
373
  TransitionProps: _propTypes.default.object
374
374
  };
@@ -73,6 +73,14 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
73
73
  // | These PropTypes are generated from the TypeScript type definitions |
74
74
  // | To update them edit the TypeScript types and run "yarn proptypes" |
75
75
  // ----------------------------------------------------------------------
76
+ /**
77
+ * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`.
78
+ */
79
+ apiRef: _propTypes.default.shape({
80
+ current: _propTypes.default.shape({
81
+ focusNode: _propTypes.default.func.isRequired
82
+ })
83
+ }),
76
84
  /**
77
85
  * The content of the component.
78
86
  */
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useTreeViewApiRef", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeViewApiRef.useTreeViewApiRef;
10
+ }
11
+ });
12
+ var _useTreeViewApiRef = require("./useTreeViewApiRef");
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useTreeViewApiRef = void 0;
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
+ /**
11
+ * Hook that instantiates a [[TreeViewApiRef]].
12
+ */
13
+ const useTreeViewApiRef = () => React.useRef(undefined);
14
+ exports.useTreeViewApiRef = useTreeViewApiRef;
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.0.0-beta.3
2
+ * @mui/x-tree-view v7.0.0-beta.5
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -91,4 +91,16 @@ Object.keys(_icons).forEach(function (key) {
91
91
  return _icons[key];
92
92
  }
93
93
  });
94
+ });
95
+ var _hooks = require("./hooks");
96
+ Object.keys(_hooks).forEach(function (key) {
97
+ if (key === "default" || key === "__esModule") return;
98
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
99
+ if (key in exports && exports[key] === _hooks[key]) return;
100
+ Object.defineProperty(exports, key, {
101
+ enumerable: true,
102
+ get: function () {
103
+ return _hooks[key];
104
+ }
105
+ });
94
106
  });
@@ -16,17 +16,8 @@ const _excluded = ["element"];
16
16
  /** Credit: https://github.com/reach/reach-ui/blob/86a046f54d53b6420e392b3fa56dd991d9d4e458/packages/descendants/README.md
17
17
  * Modified slightly to suit our purposes.
18
18
  */
19
- // To replace with .findIndex() once we stop IE11 support.
20
19
  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); }
21
20
  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; }
22
- function findIndex(array, comp) {
23
- for (let i = 0; i < array.length; i += 1) {
24
- if (comp(array[i])) {
25
- return i;
26
- }
27
- }
28
- return -1;
29
- }
30
21
  function binaryFindElement(array, element) {
31
22
  let start = 0;
32
23
  let end = array.length - 1;
@@ -92,7 +83,7 @@ function useDescendant(descendant) {
92
83
  // index on the following render, and we will re-register descendants
93
84
  // so that everything is up-to-date before the user interacts with a
94
85
  // collection.
95
- const index = findIndex(descendants, item => item.element === descendant.element);
86
+ const index = descendants.findIndex(item => item.element === descendant.element);
96
87
  const previousDescendants = usePrevious(descendants);
97
88
 
98
89
  // We also need to re-register descendants any time ANY of the other
@@ -1,18 +1,20 @@
1
1
  "use strict";
2
+ 'use client';
2
3
 
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
7
+ exports.Timeout = void 0;
6
8
  exports.useTimeout = useTimeout;
7
9
  var _useLazyRef = require("./useLazyRef");
8
10
  var _useOnMount = require("./useOnMount");
9
11
  class Timeout {
10
12
  constructor() {
11
- this.currentId = 0;
13
+ this.currentId = null;
12
14
  this.clear = () => {
13
- if (this.currentId !== 0) {
15
+ if (this.currentId !== null) {
14
16
  clearTimeout(this.currentId);
15
- this.currentId = 0;
17
+ this.currentId = null;
16
18
  }
17
19
  };
18
20
  this.disposeEffect = () => {
@@ -22,11 +24,18 @@ class Timeout {
22
24
  static create() {
23
25
  return new Timeout();
24
26
  }
27
+ /**
28
+ * Executes `fn` after `delay`, clearing any previously scheduled call.
29
+ */
25
30
  start(delay, fn) {
26
31
  this.clear();
27
- this.currentId = setTimeout(fn, delay);
32
+ this.currentId = setTimeout(() => {
33
+ this.currentId = null;
34
+ fn();
35
+ }, delay);
28
36
  }
29
37
  }
38
+ exports.Timeout = Timeout;
30
39
  function useTimeout() {
31
40
  const timeout = (0, _useLazyRef.useLazyRef)(Timeout.create).current;
32
41
  (0, _useOnMount.useOnMount)(timeout.disposeEffect);
@@ -11,10 +11,12 @@ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallb
11
11
  var _ownerDocument = _interopRequireDefault(require("@mui/utils/ownerDocument"));
12
12
  var _useTreeView = require("../../useTreeView/useTreeView.utils");
13
13
  var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
14
+ var _utils = require("../../utils/utils");
14
15
  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); }
15
16
  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; }
16
17
  const useTreeViewFocus = ({
17
18
  instance,
19
+ publicAPI,
18
20
  params,
19
21
  state,
20
22
  setState,
@@ -23,19 +25,45 @@ const useTreeViewFocus = ({
23
25
  }) => {
24
26
  const setFocusedNodeId = (0, _useEventCallback.default)(nodeId => {
25
27
  const cleanNodeId = typeof nodeId === 'function' ? nodeId(state.focusedNodeId) : nodeId;
26
- setState(prevState => (0, _extends2.default)({}, prevState, {
27
- focusedNodeId: cleanNodeId
28
- }));
28
+ if (state.focusedNodeId !== cleanNodeId) {
29
+ setState(prevState => (0, _extends2.default)({}, prevState, {
30
+ focusedNodeId: cleanNodeId
31
+ }));
32
+ }
29
33
  });
30
- const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId, [state.focusedNodeId]);
34
+ const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current === (0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current)), [rootRef]);
35
+ const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
36
+ const isNodeVisible = nodeId => {
37
+ const node = instance.getNode(nodeId);
38
+ return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
39
+ };
31
40
  const focusNode = (0, _useEventCallback.default)((event, nodeId) => {
32
- if (nodeId) {
41
+ // if we receive a nodeId, and it is visible, the focus will be set to it
42
+ if (nodeId && isNodeVisible(nodeId)) {
43
+ if (!isTreeViewFocused()) {
44
+ instance.focusRoot();
45
+ }
33
46
  setFocusedNodeId(nodeId);
34
47
  if (params.onNodeFocus) {
35
48
  params.onNodeFocus(event, nodeId);
36
49
  }
37
50
  }
38
51
  });
52
+ const focusDefaultNode = (0, _useEventCallback.default)(event => {
53
+ let nodeToFocusId;
54
+ if (Array.isArray(models.selectedNodes.value)) {
55
+ nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
56
+ } else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
57
+ nodeToFocusId = models.selectedNodes.value;
58
+ }
59
+ if (nodeToFocusId == null) {
60
+ nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
61
+ }
62
+ setFocusedNodeId(nodeToFocusId);
63
+ if (params.onNodeFocus) {
64
+ params.onNodeFocus(event, nodeToFocusId);
65
+ }
66
+ });
39
67
  const focusRoot = (0, _useEventCallback.default)(() => {
40
68
  rootRef.current?.focus({
41
69
  preventScroll: true
@@ -44,7 +72,11 @@ const useTreeViewFocus = ({
44
72
  (0, _useTreeView.populateInstance)(instance, {
45
73
  isNodeFocused,
46
74
  focusNode,
47
- focusRoot
75
+ focusRoot,
76
+ focusDefaultNode
77
+ });
78
+ (0, _useTreeView.populatePublicAPI)(publicAPI, {
79
+ focusNode
48
80
  });
49
81
  (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
50
82
  id
@@ -58,23 +90,9 @@ const useTreeViewFocus = ({
58
90
  });
59
91
  const createHandleFocus = otherHandlers => event => {
60
92
  otherHandlers.onFocus?.(event);
61
-
62
93
  // if the event bubbled (which is React specific) we don't want to steal focus
63
94
  if (event.target === event.currentTarget) {
64
- const isNodeVisible = nodeId => {
65
- const node = instance.getNode(nodeId);
66
- return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
67
- };
68
- let nodeToFocusId;
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;
73
- }
74
- if (nodeToFocusId == null) {
75
- nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
76
- }
77
- instance.focusNode(event, nodeToFocusId);
95
+ instance.focusDefaultNode(event);
78
96
  }
79
97
  };
80
98
  const createHandleBlur = otherHandlers => event => {
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.useTreeView = void 0;
8
+ exports.useTreeViewApiInitialization = useTreeViewApiInitialization;
8
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10
  var React = _interopRequireWildcard(require("react"));
10
11
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
@@ -12,6 +13,16 @@ var _useTreeViewModels = require("./useTreeViewModels");
12
13
  var _corePlugins = require("../corePlugins");
13
14
  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
15
  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; }
16
+ function useTreeViewApiInitialization(inputApiRef) {
17
+ const fallbackPublicApiRef = React.useRef({});
18
+ if (inputApiRef) {
19
+ if (inputApiRef.current == null) {
20
+ inputApiRef.current = {};
21
+ }
22
+ return inputApiRef.current;
23
+ }
24
+ return fallbackPublicApiRef.current;
25
+ }
15
26
  const useTreeView = inParams => {
16
27
  const plugins = [..._corePlugins.TREE_VIEW_CORE_PLUGINS, ...inParams.plugins];
17
28
  const params = plugins.reduce((acc, plugin) => {
@@ -23,6 +34,7 @@ const useTreeView = inParams => {
23
34
  const models = (0, _useTreeViewModels.useTreeViewModels)(plugins, params);
24
35
  const instanceRef = React.useRef({});
25
36
  const instance = instanceRef.current;
37
+ const publicAPI = useTreeViewApiInitialization(inParams.apiRef);
26
38
  const innerRootRef = React.useRef(null);
27
39
  const handleRootRef = (0, _useForkRef.default)(innerRootRef, inParams.rootRef);
28
40
  const [state, setState] = React.useState(() => {
@@ -41,6 +53,7 @@ const useTreeView = inParams => {
41
53
  const runPlugin = plugin => {
42
54
  const pluginResponse = plugin({
43
55
  instance,
56
+ publicAPI,
44
57
  params,
45
58
  slots: params.slots,
46
59
  slotProps: params.slotProps,
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.populateInstance = exports.getPreviousNode = exports.getNextNode = exports.getLastNode = exports.getFirstNode = void 0;
6
+ exports.populatePublicAPI = exports.populateInstance = exports.getPreviousNode = exports.getNextNode = exports.getLastNode = exports.getFirstNode = void 0;
7
7
  const getPreviousNode = (instance, nodeId) => {
8
8
  const node = instance.getNode(nodeId);
9
9
  const siblings = instance.getNavigableChildrenIds(node.parentId);
@@ -51,4 +51,8 @@ exports.getFirstNode = getFirstNode;
51
51
  const populateInstance = (instance, methods) => {
52
52
  Object.assign(instance, methods);
53
53
  };
54
- exports.populateInstance = populateInstance;
54
+ exports.populateInstance = populateInstance;
55
+ const populatePublicAPI = (publicAPI, methods) => {
56
+ Object.assign(publicAPI, methods);
57
+ };
58
+ exports.populatePublicAPI = populatePublicAPI;
@@ -6,12 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.extractPluginParamsFromProps = void 0;
8
8
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
- const _excluded = ["slots", "slotProps"];
9
+ const _excluded = ["slots", "slotProps", "apiRef"];
10
10
  const extractPluginParamsFromProps = _ref => {
11
11
  let {
12
12
  props: {
13
13
  slots,
14
- slotProps
14
+ slotProps,
15
+ apiRef
15
16
  },
16
17
  plugins,
17
18
  rootRef
@@ -25,7 +26,8 @@ const extractPluginParamsFromProps = _ref => {
25
26
  plugins,
26
27
  rootRef,
27
28
  slots: slots ?? {},
28
- slotProps: slotProps ?? {}
29
+ slotProps: slotProps ?? {},
30
+ apiRef
29
31
  };
30
32
  const otherProps = {};
31
33
  Object.keys(props).forEach(propName => {
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getActiveElement = void 0;
7
+ const getActiveElement = (root = document) => {
8
+ const activeEl = root.activeElement;
9
+ if (!activeEl) {
10
+ return null;
11
+ }
12
+ if (activeEl.shadowRoot) {
13
+ return getActiveElement(activeEl.shadowRoot);
14
+ }
15
+ return activeEl;
16
+ };
17
+ exports.getActiveElement = getActiveElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.0.0-beta.3",
3
+ "version": "7.0.0-beta.5",
4
4
  "description": "The community edition of the tree view components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",