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

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 (217) hide show
  1. package/CHANGELOG.md +1380 -188
  2. package/README.md +0 -1
  3. package/RichTreeView/RichTreeView.d.ts +20 -0
  4. package/RichTreeView/RichTreeView.js +285 -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 +235 -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 +2 -7
  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/MuiCancellableEvent.d.ts +4 -0
  49. package/internals/models/MuiCancellableEvent.js +1 -0
  50. package/internals/models/plugin.d.ts +24 -0
  51. package/internals/models/treeView.d.ts +5 -1
  52. package/internals/plugins/defaultPlugins.d.ts +3 -2
  53. package/internals/plugins/defaultPlugins.js +2 -1
  54. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +14 -6
  55. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.types.d.ts +1 -6
  56. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +32 -17
  57. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +12 -5
  58. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -6
  59. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -1
  60. package/internals/plugins/useTreeViewId/index.d.ts +2 -0
  61. package/internals/plugins/useTreeViewId/index.js +1 -0
  62. package/internals/plugins/useTreeViewId/useTreeViewId.d.ts +3 -0
  63. package/internals/plugins/useTreeViewId/useTreeViewId.js +21 -0
  64. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +17 -0
  65. package/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  66. package/internals/plugins/useTreeViewJSXNodes/index.d.ts +2 -0
  67. package/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  68. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +3 -0
  69. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +115 -0
  70. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +16 -0
  71. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  72. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +175 -121
  73. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +5 -2
  74. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +89 -17
  75. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +48 -5
  76. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.d.ts +1 -1
  77. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +49 -28
  78. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -8
  79. package/internals/useTreeView/useTreeView.js +40 -3
  80. package/internals/useTreeView/useTreeView.types.d.ts +2 -1
  81. package/internals/useTreeView/useTreeViewModels.js +2 -2
  82. package/internals/utils/extractPluginParamsFromProps.d.ts +13 -0
  83. package/internals/utils/extractPluginParamsFromProps.js +27 -0
  84. package/internals/utils/warning.d.ts +1 -0
  85. package/internals/utils/warning.js +14 -0
  86. package/legacy/RichTreeView/RichTreeView.js +279 -0
  87. package/legacy/RichTreeView/RichTreeView.types.js +1 -0
  88. package/legacy/RichTreeView/index.js +3 -0
  89. package/legacy/RichTreeView/richTreeViewClasses.js +6 -0
  90. package/legacy/SimpleTreeView/SimpleTreeView.js +232 -0
  91. package/legacy/SimpleTreeView/SimpleTreeView.plugins.js +6 -0
  92. package/legacy/SimpleTreeView/SimpleTreeView.types.js +1 -0
  93. package/legacy/SimpleTreeView/index.js +3 -0
  94. package/legacy/SimpleTreeView/simpleTreeViewClasses.js +6 -0
  95. package/legacy/TreeItem/TreeItem.js +49 -103
  96. package/legacy/TreeItem/index.js +2 -2
  97. package/legacy/TreeItem/useTreeItem.js +5 -5
  98. package/legacy/TreeView/TreeView.js +80 -82
  99. package/legacy/index.js +5 -2
  100. package/legacy/internals/TreeViewProvider/TreeViewContext.js +1 -14
  101. package/legacy/internals/TreeViewProvider/useTreeViewContext.js +5 -1
  102. package/legacy/internals/corePlugins/corePlugins.js +1 -1
  103. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
  104. package/legacy/internals/hooks/useLazyRef.js +11 -0
  105. package/legacy/internals/hooks/useOnMount.js +7 -0
  106. package/legacy/internals/hooks/useTimeout.js +38 -0
  107. package/legacy/internals/models/MuiCancellableEvent.js +1 -0
  108. package/legacy/internals/plugins/defaultPlugins.js +2 -1
  109. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +17 -8
  110. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +32 -17
  111. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -6
  112. package/legacy/internals/plugins/useTreeViewId/index.js +1 -0
  113. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +24 -0
  114. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  115. package/legacy/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  116. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +121 -0
  117. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  118. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +177 -119
  119. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +96 -20
  120. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +53 -28
  121. package/legacy/internals/useTreeView/useTreeView.js +39 -3
  122. package/legacy/internals/useTreeView/useTreeViewModels.js +2 -2
  123. package/legacy/internals/utils/extractPluginParamsFromProps.js +27 -0
  124. package/legacy/internals/utils/warning.js +15 -0
  125. package/legacy/models/index.js +1 -0
  126. package/legacy/models/items.js +1 -0
  127. package/models/index.d.ts +1 -0
  128. package/models/index.js +1 -0
  129. package/models/items.d.ts +7 -0
  130. package/models/items.js +1 -0
  131. package/models/package.json +6 -0
  132. package/modern/RichTreeView/RichTreeView.js +283 -0
  133. package/modern/RichTreeView/RichTreeView.types.js +1 -0
  134. package/modern/RichTreeView/index.js +3 -0
  135. package/modern/RichTreeView/richTreeViewClasses.js +6 -0
  136. package/modern/SimpleTreeView/SimpleTreeView.js +234 -0
  137. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +5 -0
  138. package/modern/SimpleTreeView/SimpleTreeView.types.js +1 -0
  139. package/modern/SimpleTreeView/index.js +3 -0
  140. package/modern/SimpleTreeView/simpleTreeViewClasses.js +6 -0
  141. package/modern/TreeItem/TreeItem.js +44 -88
  142. package/modern/TreeItem/index.js +2 -2
  143. package/modern/TreeItem/useTreeItem.js +5 -5
  144. package/modern/TreeView/TreeView.js +80 -87
  145. package/modern/index.js +5 -2
  146. package/modern/internals/TreeViewProvider/TreeViewContext.js +1 -14
  147. package/modern/internals/TreeViewProvider/useTreeViewContext.js +7 -1
  148. package/modern/internals/corePlugins/corePlugins.js +1 -1
  149. package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
  150. package/modern/internals/hooks/useLazyRef.js +11 -0
  151. package/modern/internals/hooks/useOnMount.js +7 -0
  152. package/modern/internals/hooks/useTimeout.js +28 -0
  153. package/modern/internals/models/MuiCancellableEvent.js +1 -0
  154. package/modern/internals/plugins/defaultPlugins.js +2 -1
  155. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +14 -6
  156. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +33 -18
  157. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -7
  158. package/modern/internals/plugins/useTreeViewId/index.js +1 -0
  159. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +21 -0
  160. package/modern/internals/plugins/useTreeViewId/useTreeViewId.types.js +1 -0
  161. package/modern/internals/plugins/useTreeViewJSXNodes/index.js +1 -0
  162. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +114 -0
  163. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +1 -0
  164. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +174 -121
  165. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +88 -17
  166. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +50 -29
  167. package/modern/internals/useTreeView/useTreeView.js +40 -3
  168. package/modern/internals/useTreeView/useTreeViewModels.js +2 -2
  169. package/modern/internals/utils/extractPluginParamsFromProps.js +27 -0
  170. package/modern/internals/utils/warning.js +14 -0
  171. package/modern/models/index.js +1 -0
  172. package/modern/models/items.js +1 -0
  173. package/node/RichTreeView/RichTreeView.js +291 -0
  174. package/node/RichTreeView/RichTreeView.types.js +5 -0
  175. package/node/RichTreeView/index.js +27 -0
  176. package/node/RichTreeView/richTreeViewClasses.js +14 -0
  177. package/node/SimpleTreeView/SimpleTreeView.js +242 -0
  178. package/node/SimpleTreeView/SimpleTreeView.plugins.js +11 -0
  179. package/node/SimpleTreeView/SimpleTreeView.types.js +5 -0
  180. package/node/SimpleTreeView/index.js +27 -0
  181. package/node/SimpleTreeView/simpleTreeViewClasses.js +14 -0
  182. package/node/TreeItem/TreeItem.js +44 -88
  183. package/node/TreeItem/index.js +11 -15
  184. package/node/TreeItem/useTreeItem.js +5 -5
  185. package/node/TreeView/TreeView.js +80 -87
  186. package/node/index.js +38 -2
  187. package/node/internals/TreeViewProvider/TreeViewContext.js +2 -15
  188. package/node/internals/TreeViewProvider/useTreeViewContext.js +7 -1
  189. package/node/internals/corePlugins/corePlugins.js +1 -1
  190. package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -7
  191. package/node/internals/hooks/useLazyRef.js +19 -0
  192. package/node/internals/hooks/useOnMount.js +15 -0
  193. package/node/internals/hooks/useTimeout.js +34 -0
  194. package/node/internals/models/MuiCancellableEvent.js +5 -0
  195. package/node/internals/plugins/defaultPlugins.js +2 -1
  196. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +15 -8
  197. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +33 -18
  198. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +16 -7
  199. package/node/internals/plugins/useTreeViewId/index.js +12 -0
  200. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +31 -0
  201. package/node/internals/plugins/useTreeViewId/useTreeViewId.types.js +5 -0
  202. package/node/internals/plugins/useTreeViewJSXNodes/index.js +12 -0
  203. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +124 -0
  204. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.js +5 -0
  205. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +174 -121
  206. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +89 -18
  207. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +50 -29
  208. package/node/internals/useTreeView/useTreeView.js +40 -3
  209. package/node/internals/useTreeView/useTreeViewModels.js +2 -2
  210. package/node/internals/utils/extractPluginParamsFromProps.js +34 -0
  211. package/node/internals/utils/warning.js +21 -0
  212. package/node/models/index.js +16 -0
  213. package/node/models/items.js +5 -0
  214. package/package.json +8 -7
  215. package/themeAugmentation/components.d.ts +14 -4
  216. package/themeAugmentation/overrides.d.ts +8 -4
  217. package/themeAugmentation/props.d.ts +7 -3
@@ -0,0 +1,31 @@
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;
29
+ useTreeViewId.params = {
30
+ id: true
31
+ };
@@ -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,124 @@
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;
124
+ useTreeViewJSXNodes.params = {};
@@ -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"));
@@ -13,7 +12,7 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
13
12
  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
13
  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
14
  function isPrintableCharacter(string) {
16
- return string && string.length === 1 && string.match(/\S/);
15
+ return !!string && string.length === 1 && !!string.match(/\S/);
17
16
  }
18
17
  function findNextFirstChar(firstChars, startIndex, char) {
19
18
  for (let i = startIndex; i < firstChars.length; i += 1) {
@@ -29,45 +28,31 @@ const useTreeViewKeyboardNavigation = ({
29
28
  state
30
29
  }) => {
31
30
  const theme = (0, _styles.useTheme)();
32
- const isRtl = theme.direction === 'rtl';
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
- const handleNextArrow = event => {
46
- if (state.focusedNodeId != null && instance.isNodeExpandable(state.focusedNodeId)) {
47
- if (instance.isNodeExpanded(state.focusedNodeId)) {
48
- instance.focusNode(event, (0, _useTreeView.getNextNode)(instance, state.focusedNodeId));
49
- } else if (!instance.isNodeDisabled(state.focusedNodeId)) {
50
- instance.toggleNodeExpansion(event, state.focusedNodeId);
51
- }
52
- }
53
- return true;
54
- };
55
- const handlePreviousArrow = event => {
56
- if (state.focusedNodeId == null) {
57
- return false;
58
- }
59
- if (instance.isNodeExpanded(state.focusedNodeId) && !instance.isNodeDisabled(state.focusedNodeId)) {
60
- instance.toggleNodeExpansion(event, state.focusedNodeId);
61
- return true;
62
- }
63
- const parent = instance.getNode(state.focusedNodeId).parentId;
64
- if (parent) {
65
- instance.focusNode(event, parent);
66
- return true;
67
- }
68
- return false;
69
- };
70
- const focusByFirstCharacter = (event, nodeId, firstChar) => {
55
+ const getFirstMatchingNode = (nodeId, firstChar) => {
71
56
  let start;
72
57
  let index;
73
58
  const lowercaseChar = firstChar.toLowerCase();
@@ -98,41 +83,35 @@ const useTreeViewKeyboardNavigation = ({
98
83
  index = findNextFirstChar(firstChars, 0, lowercaseChar);
99
84
  }
100
85
 
101
- // If match was found...
86
+ // If a match was found...
102
87
  if (index > -1) {
103
- instance.focusNode(event, firstCharIds[index]);
104
- }
105
- };
106
- const selectNextNode = (event, id) => {
107
- if (!instance.isNodeDisabled((0, _useTreeView.getNextNode)(instance, id))) {
108
- instance.selectRange(event, {
109
- end: (0, _useTreeView.getNextNode)(instance, id),
110
- current: id
111
- }, true);
112
- }
113
- };
114
- const selectPreviousNode = (event, nodeId) => {
115
- if (!instance.isNodeDisabled((0, _useTreeView.getPreviousNode)(instance, nodeId))) {
116
- instance.selectRange(event, {
117
- end: (0, _useTreeView.getPreviousNode)(instance, nodeId),
118
- current: nodeId
119
- }, true);
88
+ return firstCharIds[index];
120
89
  }
90
+ return null;
121
91
  };
92
+ const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
93
+ const canToggleNodeExpansion = nodeId => !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
94
+
95
+ // ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
122
96
  const createHandleKeyDown = otherHandlers => event => {
123
97
  otherHandlers.onKeyDown?.(event);
124
- let flag = false;
125
- const key = event.key;
98
+ if (event.defaultMuiPrevented) {
99
+ return;
100
+ }
126
101
 
127
102
  // If the tree is empty there will be no focused node
128
103
  if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
129
104
  return;
130
105
  }
131
106
  const ctrlPressed = event.ctrlKey || event.metaKey;
132
- switch (key) {
133
- case ' ':
134
- if (!params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
135
- flag = true;
107
+ const key = event.key;
108
+
109
+ // eslint-disable-next-line default-case
110
+ switch (true) {
111
+ // Select the node when pressing "Space"
112
+ case key === ' ' && canToggleNodeSelection(state.focusedNodeId):
113
+ {
114
+ event.preventDefault();
136
115
  if (params.multiSelect && event.shiftKey) {
137
116
  instance.selectRange(event, {
138
117
  end: state.focusedNodeId
@@ -142,85 +121,158 @@ const useTreeViewKeyboardNavigation = ({
142
121
  } else {
143
122
  instance.selectNode(event, state.focusedNodeId);
144
123
  }
124
+ break;
145
125
  }
146
- event.stopPropagation();
147
- break;
148
- case 'Enter':
149
- if (!instance.isNodeDisabled(state.focusedNodeId)) {
150
- if (instance.isNodeExpandable(state.focusedNodeId)) {
126
+
127
+ // If the focused node has children, we expand it.
128
+ // If the focused node has no children, we select it.
129
+ case key === 'Enter':
130
+ {
131
+ if (canToggleNodeExpansion(state.focusedNodeId)) {
151
132
  instance.toggleNodeExpansion(event, state.focusedNodeId);
152
- flag = true;
153
- } else if (!params.disableSelection) {
154
- flag = true;
133
+ event.preventDefault();
134
+ } else if (canToggleNodeSelection(state.focusedNodeId)) {
155
135
  if (params.multiSelect) {
136
+ event.preventDefault();
156
137
  instance.selectNode(event, state.focusedNodeId, true);
157
- } else {
138
+ } else if (!instance.isNodeSelected(state.focusedNodeId)) {
158
139
  instance.selectNode(event, state.focusedNodeId);
140
+ event.preventDefault();
159
141
  }
160
142
  }
143
+ break;
161
144
  }
162
- event.stopPropagation();
163
- break;
164
- case 'ArrowDown':
165
- if (params.multiSelect && event.shiftKey && !params.disableSelection) {
166
- selectNextNode(event, state.focusedNodeId);
145
+
146
+ // Focus the next focusable node
147
+ case key === 'ArrowDown':
148
+ {
149
+ const nextNode = (0, _useTreeView.getNextNode)(instance, state.focusedNodeId);
150
+ if (nextNode) {
151
+ event.preventDefault();
152
+ instance.focusNode(event, nextNode);
153
+
154
+ // Multi select behavior when pressing Shift + ArrowDown
155
+ // Toggles the selection state of the next node
156
+ if (params.multiSelect && event.shiftKey && canToggleNodeSelection(nextNode)) {
157
+ instance.selectRange(event, {
158
+ end: nextNode,
159
+ current: state.focusedNodeId
160
+ }, true);
161
+ }
162
+ }
163
+ break;
167
164
  }
168
- instance.focusNode(event, (0, _useTreeView.getNextNode)(instance, state.focusedNodeId));
169
- flag = true;
170
- break;
171
- case 'ArrowUp':
172
- if (params.multiSelect && event.shiftKey && !params.disableSelection) {
173
- selectPreviousNode(event, state.focusedNodeId);
165
+
166
+ // Focuses the previous focusable node
167
+ case key === 'ArrowUp':
168
+ {
169
+ const previousNode = (0, _useTreeView.getPreviousNode)(instance, state.focusedNodeId);
170
+ if (previousNode) {
171
+ event.preventDefault();
172
+ instance.focusNode(event, previousNode);
173
+
174
+ // Multi select behavior when pressing Shift + ArrowUp
175
+ // Toggles the selection state of the previous node
176
+ if (params.multiSelect && event.shiftKey && canToggleNodeSelection(previousNode)) {
177
+ instance.selectRange(event, {
178
+ end: previousNode,
179
+ current: state.focusedNodeId
180
+ }, true);
181
+ }
182
+ }
183
+ break;
174
184
  }
175
- instance.focusNode(event, (0, _useTreeView.getPreviousNode)(instance, state.focusedNodeId));
176
- flag = true;
177
- break;
178
- case 'ArrowRight':
179
- if (isRtl) {
180
- flag = handlePreviousArrow(event);
181
- } else {
182
- flag = handleNextArrow(event);
185
+
186
+ // If the focused node is expanded, we move the focus to its first child
187
+ // If the focused node is collapsed and has children, we expand it
188
+ case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
189
+ {
190
+ if (instance.isNodeExpanded(state.focusedNodeId)) {
191
+ instance.focusNode(event, (0, _useTreeView.getNextNode)(instance, state.focusedNodeId));
192
+ event.preventDefault();
193
+ } else if (canToggleNodeExpansion(state.focusedNodeId)) {
194
+ instance.toggleNodeExpansion(event, state.focusedNodeId);
195
+ event.preventDefault();
196
+ }
197
+ break;
183
198
  }
184
- break;
185
- case 'ArrowLeft':
186
- if (isRtl) {
187
- flag = handleNextArrow(event);
188
- } else {
189
- flag = handlePreviousArrow(event);
199
+
200
+ // If the focused node is expanded, we collapse it
201
+ // If the focused node is collapsed and has a parent, we move the focus to this parent
202
+ case key === 'ArrowLeft' && !isRTL || key === 'ArrowRight' && isRTL:
203
+ {
204
+ if (canToggleNodeExpansion(state.focusedNodeId) && instance.isNodeExpanded(state.focusedNodeId)) {
205
+ instance.toggleNodeExpansion(event, state.focusedNodeId);
206
+ event.preventDefault();
207
+ } else {
208
+ const parent = instance.getNode(state.focusedNodeId).parentId;
209
+ if (parent) {
210
+ instance.focusNode(event, parent);
211
+ event.preventDefault();
212
+ }
213
+ }
214
+ break;
190
215
  }
191
- break;
192
- case 'Home':
193
- if (params.multiSelect && ctrlPressed && event.shiftKey && !params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
194
- instance.rangeSelectToFirst(event, state.focusedNodeId);
216
+
217
+ // Focuses the first node in the tree
218
+ case key === 'Home':
219
+ {
220
+ instance.focusNode(event, (0, _useTreeView.getFirstNode)(instance));
221
+
222
+ // Multi select behavior when pressing Ctrl + Shift + Home
223
+ // Selects the focused node and all nodes up to the first node.
224
+ if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
225
+ instance.rangeSelectToFirst(event, state.focusedNodeId);
226
+ }
227
+ event.preventDefault();
228
+ break;
195
229
  }
196
- instance.focusNode(event, (0, _useTreeView.getFirstNode)(instance));
197
- flag = true;
198
- break;
199
- case 'End':
200
- if (params.multiSelect && ctrlPressed && event.shiftKey && !params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
201
- instance.rangeSelectToLast(event, state.focusedNodeId);
230
+
231
+ // Focuses the last node in the tree
232
+ case key === 'End':
233
+ {
234
+ instance.focusNode(event, (0, _useTreeView.getLastNode)(instance));
235
+
236
+ // Multi select behavior when pressing Ctrl + Shirt + End
237
+ // Selects the focused node and all the nodes down to the last node.
238
+ if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
239
+ instance.rangeSelectToLast(event, state.focusedNodeId);
240
+ }
241
+ event.preventDefault();
242
+ break;
202
243
  }
203
- instance.focusNode(event, (0, _useTreeView.getLastNode)(instance));
204
- flag = true;
205
- break;
206
- default:
207
- if (key === '*') {
244
+
245
+ // Expand all siblings that are at the same level as the focused node
246
+ case key === '*':
247
+ {
208
248
  instance.expandAllSiblings(event, state.focusedNodeId);
209
- flag = true;
210
- } else if (params.multiSelect && ctrlPressed && key.toLowerCase() === 'a' && !params.disableSelection) {
249
+ event.preventDefault();
250
+ break;
251
+ }
252
+
253
+ // Multi select behavior when pressing Ctrl + a
254
+ // Selects all the nodes
255
+ case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
256
+ {
211
257
  instance.selectRange(event, {
212
258
  start: (0, _useTreeView.getFirstNode)(instance),
213
259
  end: (0, _useTreeView.getLastNode)(instance)
214
260
  });
215
- flag = true;
216
- } else if (!ctrlPressed && !event.shiftKey && isPrintableCharacter(key)) {
217
- focusByFirstCharacter(event, state.focusedNodeId, key);
218
- flag = true;
261
+ event.preventDefault();
262
+ break;
263
+ }
264
+
265
+ // Type-ahead
266
+ // TODO: Support typing multiple characters
267
+ case !ctrlPressed && !event.shiftKey && isPrintableCharacter(key):
268
+ {
269
+ const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
270
+ if (matchingNode != null) {
271
+ instance.focusNode(event, matchingNode);
272
+ event.preventDefault();
273
+ }
274
+ break;
219
275
  }
220
- }
221
- if (flag) {
222
- event.preventDefault();
223
- event.stopPropagation();
224
276
  }
225
277
  };
226
278
  return {
@@ -229,4 +281,5 @@ const useTreeViewKeyboardNavigation = ({
229
281
  })
230
282
  };
231
283
  };
232
- exports.useTreeViewKeyboardNavigation = useTreeViewKeyboardNavigation;
284
+ exports.useTreeViewKeyboardNavigation = useTreeViewKeyboardNavigation;
285
+ useTreeViewKeyboardNavigation.params = {};