@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
@@ -0,0 +1,120 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from 'react';
5
+ import useEventCallback from '@mui/utils/useEventCallback';
6
+ import useForkRef from '@mui/utils/useForkRef';
7
+ import { populateInstance } from '../../useTreeView/useTreeView.utils';
8
+ import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
9
+ import { useTreeViewContext } from '../../TreeViewProvider/useTreeViewContext';
10
+ import { DescendantProvider, useDescendant } from '../../TreeViewProvider/DescendantProvider';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ export var useTreeViewJSXNodes = function useTreeViewJSXNodes(_ref) {
13
+ var instance = _ref.instance,
14
+ setState = _ref.setState;
15
+ var insertJSXNode = useEventCallback(function (node) {
16
+ setState(function (prevState) {
17
+ return _extends({}, prevState, {
18
+ nodeMap: _extends({}, prevState.nodeMap, _defineProperty({}, node.id, node))
19
+ });
20
+ });
21
+ });
22
+ var removeJSXNode = useEventCallback(function (nodeId) {
23
+ setState(function (prevState) {
24
+ var newMap = _extends({}, prevState.nodeMap);
25
+ delete newMap[nodeId];
26
+ return _extends({}, prevState, {
27
+ nodeMap: newMap
28
+ });
29
+ });
30
+ publishTreeViewEvent(instance, 'removeNode', {
31
+ id: nodeId
32
+ });
33
+ });
34
+ var mapFirstCharFromJSX = useEventCallback(function (nodeId, firstChar) {
35
+ instance.updateFirstCharMap(function (firstCharMap) {
36
+ firstCharMap[nodeId] = firstChar;
37
+ return firstCharMap;
38
+ });
39
+ return function () {
40
+ instance.updateFirstCharMap(function (firstCharMap) {
41
+ var newMap = _extends({}, firstCharMap);
42
+ delete newMap[nodeId];
43
+ return newMap;
44
+ });
45
+ };
46
+ });
47
+ populateInstance(instance, {
48
+ insertJSXNode: insertJSXNode,
49
+ removeJSXNode: removeJSXNode,
50
+ mapFirstCharFromJSX: mapFirstCharFromJSX
51
+ });
52
+ };
53
+ var useTreeViewJSXNodesItemPlugin = function useTreeViewJSXNodesItemPlugin(_ref2) {
54
+ var props = _ref2.props,
55
+ ref = _ref2.ref;
56
+ var children = props.children,
57
+ _props$disabled = props.disabled,
58
+ disabled = _props$disabled === void 0 ? false : _props$disabled,
59
+ label = props.label,
60
+ nodeId = props.nodeId,
61
+ id = props.id,
62
+ inContentProps = props.ContentProps;
63
+ var _useTreeViewContext = useTreeViewContext(),
64
+ instance = _useTreeViewContext.instance;
65
+ var expandable = Boolean(Array.isArray(children) ? children.length : children);
66
+ var _React$useState = React.useState(null),
67
+ _React$useState2 = _slicedToArray(_React$useState, 2),
68
+ treeItemElement = _React$useState2[0],
69
+ setTreeItemElement = _React$useState2[1];
70
+ var contentRef = React.useRef(null);
71
+ var handleRef = useForkRef(setTreeItemElement, ref);
72
+ var descendant = React.useMemo(function () {
73
+ return {
74
+ element: treeItemElement,
75
+ id: nodeId
76
+ };
77
+ }, [nodeId, treeItemElement]);
78
+ var _useDescendant = useDescendant(descendant),
79
+ index = _useDescendant.index,
80
+ parentId = _useDescendant.parentId;
81
+ React.useEffect(function () {
82
+ // On the first render a node's index will be -1. We want to wait for the real index.
83
+ if (instance && index !== -1) {
84
+ instance.insertJSXNode({
85
+ id: nodeId,
86
+ idAttribute: id,
87
+ index: index,
88
+ parentId: parentId,
89
+ expandable: expandable,
90
+ disabled: disabled
91
+ });
92
+ return function () {
93
+ return instance.removeJSXNode(nodeId);
94
+ };
95
+ }
96
+ return undefined;
97
+ }, [instance, parentId, index, nodeId, expandable, disabled, id]);
98
+ React.useEffect(function () {
99
+ if (instance && label) {
100
+ var _contentRef$current$t, _contentRef$current;
101
+ return instance.mapFirstCharFromJSX(nodeId, ((_contentRef$current$t = (_contentRef$current = contentRef.current) == null ? void 0 : _contentRef$current.textContent) != null ? _contentRef$current$t : '').substring(0, 1).toLowerCase());
102
+ }
103
+ return undefined;
104
+ }, [instance, nodeId, label]);
105
+ return {
106
+ props: _extends({}, props, {
107
+ ContentProps: _extends({}, inContentProps, {
108
+ ref: contentRef
109
+ })
110
+ }),
111
+ ref: handleRef,
112
+ wrapItem: function wrapItem(item) {
113
+ return /*#__PURE__*/_jsx(DescendantProvider, {
114
+ id: nodeId,
115
+ children: item
116
+ });
117
+ }
118
+ };
119
+ };
120
+ useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
@@ -1,4 +1,3 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
1
  import * as React from 'react';
3
2
  import { useTheme } from '@mui/material/styles';
4
3
  import useEventCallback from '@mui/utils/useEventCallback';
@@ -21,16 +20,28 @@ export var useTreeViewKeyboardNavigation = function useTreeViewKeyboardNavigatio
21
20
  var theme = useTheme();
22
21
  var isRtl = theme.direction === 'rtl';
23
22
  var firstCharMap = React.useRef({});
24
- var mapFirstChar = useEventCallback(function (nodeId, firstChar) {
25
- firstCharMap.current[nodeId] = firstChar;
26
- return function () {
27
- var newMap = _extends({}, firstCharMap.current);
28
- delete newMap[nodeId];
29
- firstCharMap.current = newMap;
30
- };
23
+ var hasFirstCharMapBeenUpdatedImperatively = React.useRef(false);
24
+ var updateFirstCharMap = useEventCallback(function (callback) {
25
+ hasFirstCharMapBeenUpdatedImperatively.current = true;
26
+ firstCharMap.current = callback(firstCharMap.current);
31
27
  });
28
+ React.useEffect(function () {
29
+ if (hasFirstCharMapBeenUpdatedImperatively.current) {
30
+ return;
31
+ }
32
+ var newFirstCharMap = {};
33
+ var processItem = function processItem(item) {
34
+ var _item$children;
35
+ var getItemId = params.getItemId;
36
+ var nodeId = getItemId ? getItemId(item) : item.id;
37
+ newFirstCharMap[nodeId] = instance.getNode(nodeId).label.substring(0, 1).toLowerCase();
38
+ (_item$children = item.children) == null || _item$children.forEach(processItem);
39
+ };
40
+ params.items.forEach(processItem);
41
+ firstCharMap.current = newFirstCharMap;
42
+ }, [params.items, params.getItemId, instance]);
32
43
  populateInstance(instance, {
33
- mapFirstChar: mapFirstChar
44
+ updateFirstCharMap: updateFirstCharMap
34
45
  });
35
46
  var handleNextArrow = function handleNextArrow(event) {
36
47
  if (state.focusedNodeId != null && instance.isNodeExpandable(state.focusedNodeId)) {
@@ -3,24 +3,54 @@ import * as React from 'react';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import { populateInstance } from '../../useTreeView/useTreeView.utils';
5
5
  import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
6
- export var useTreeViewNodes = function useTreeViewNodes(_ref) {
7
- var instance = _ref.instance,
8
- params = _ref.params;
9
- var nodeMap = React.useRef({});
6
+ var updateState = function updateState(_ref) {
7
+ var items = _ref.items,
8
+ isItemDisabled = _ref.isItemDisabled,
9
+ getItemLabel = _ref.getItemLabel,
10
+ getItemId = _ref.getItemId;
11
+ var nodeMap = {};
12
+ var processItem = function processItem(item, index, parentId) {
13
+ var _item$children, _item$children2;
14
+ var id = getItemId ? getItemId(item) : item.id;
15
+ if (id == null) {
16
+ 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'));
17
+ }
18
+ var label = getItemLabel ? getItemLabel(item) : item.label;
19
+ if (label == null) {
20
+ 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'));
21
+ }
22
+ nodeMap[id] = {
23
+ id: id,
24
+ label: label,
25
+ index: index,
26
+ parentId: parentId,
27
+ idAttribute: id,
28
+ expandable: !!((_item$children = item.children) != null && _item$children.length),
29
+ disabled: isItemDisabled ? isItemDisabled(item) : false
30
+ };
31
+ return {
32
+ id: id,
33
+ children: (_item$children2 = item.children) == null ? void 0 : _item$children2.map(function (child, childIndex) {
34
+ return processItem(child, childIndex, id);
35
+ })
36
+ };
37
+ };
38
+ var nodeTree = items.map(function (item, itemIndex) {
39
+ return processItem(item, itemIndex, null);
40
+ });
41
+ return {
42
+ nodeMap: nodeMap,
43
+ nodeTree: nodeTree
44
+ };
45
+ };
46
+ export var useTreeViewNodes = function useTreeViewNodes(_ref2) {
47
+ var instance = _ref2.instance,
48
+ params = _ref2.params,
49
+ state = _ref2.state,
50
+ setState = _ref2.setState;
10
51
  var getNode = React.useCallback(function (nodeId) {
11
- return nodeMap.current[nodeId];
12
- }, []);
13
- var insertNode = React.useCallback(function (node) {
14
- nodeMap.current[node.id] = node;
15
- }, []);
16
- var removeNode = React.useCallback(function (nodeId) {
17
- var newMap = _extends({}, nodeMap.current);
18
- delete newMap[nodeId];
19
- nodeMap.current = newMap;
20
- publishTreeViewEvent(instance, 'removeNode', {
21
- id: nodeId
22
- });
23
- }, [instance]);
52
+ return state.nodeMap[nodeId];
53
+ }, [state.nodeMap]);
24
54
  var isNodeDisabled = React.useCallback(function (nodeId) {
25
55
  if (nodeId == null) {
26
56
  return false;
@@ -43,7 +73,7 @@ export var useTreeViewNodes = function useTreeViewNodes(_ref) {
43
73
  return false;
44
74
  }, [instance]);
45
75
  var getChildrenIds = useEventCallback(function (nodeId) {
46
- return Object.values(nodeMap.current).filter(function (node) {
76
+ return Object.values(state.nodeMap).filter(function (node) {
47
77
  return node.parentId === nodeId;
48
78
  }).sort(function (a, b) {
49
79
  return a.index - b.index;
@@ -60,12 +90,51 @@ export var useTreeViewNodes = function useTreeViewNodes(_ref) {
60
90
  }
61
91
  return childrenIds;
62
92
  };
93
+ React.useEffect(function () {
94
+ setState(function (prevState) {
95
+ var newState = updateState({
96
+ items: params.items,
97
+ isItemDisabled: params.isItemDisabled,
98
+ getItemId: params.getItemId,
99
+ getItemLabel: params.getItemLabel
100
+ });
101
+ Object.values(prevState.nodeMap).forEach(function (node) {
102
+ if (!newState.nodeMap[node.id]) {
103
+ publishTreeViewEvent(instance, 'removeNode', {
104
+ id: node.id
105
+ });
106
+ }
107
+ });
108
+ return _extends({}, prevState, newState);
109
+ });
110
+ }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
111
+ var getNodesToRender = useEventCallback(function () {
112
+ var getPropsFromNodeId = function getPropsFromNodeId(_ref3) {
113
+ var id = _ref3.id,
114
+ children = _ref3.children;
115
+ var node = state.nodeMap[id];
116
+ return {
117
+ label: node.label,
118
+ nodeId: node.id,
119
+ id: node.idAttribute,
120
+ children: children == null ? void 0 : children.map(getPropsFromNodeId)
121
+ };
122
+ };
123
+ return state.nodeTree.map(getPropsFromNodeId);
124
+ });
63
125
  populateInstance(instance, {
64
126
  getNode: getNode,
65
- updateNode: insertNode,
66
- removeNode: removeNode,
127
+ getNodesToRender: getNodesToRender,
67
128
  getChildrenIds: getChildrenIds,
68
129
  getNavigableChildrenIds: getNavigableChildrenIds,
69
130
  isNodeDisabled: isNodeDisabled
70
131
  });
132
+ };
133
+ useTreeViewNodes.getInitialState = function (params) {
134
+ return updateState({
135
+ items: params.items,
136
+ isItemDisabled: params.isItemDisabled,
137
+ getItemId: params.getItemId,
138
+ getItemLabel: params.getItemLabel
139
+ });
71
140
  };
@@ -11,7 +11,36 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
11
11
  var lastSelectionWasRange = React.useRef(false);
12
12
  var currentRangeSelection = React.useRef([]);
13
13
  var isNodeSelected = function isNodeSelected(nodeId) {
14
- return Array.isArray(models.selected.value) ? models.selected.value.indexOf(nodeId) !== -1 : models.selected.value === nodeId;
14
+ return Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
15
+ };
16
+ var setSelectedNodes = function setSelectedNodes(event, newSelectedNodes) {
17
+ if (params.onNodeSelectionToggle) {
18
+ if (params.multiSelect) {
19
+ var addedNodes = newSelectedNodes.filter(function (nodeId) {
20
+ return !instance.isNodeSelected(nodeId);
21
+ });
22
+ var removedNodes = models.selectedNodes.value.filter(function (nodeId) {
23
+ return !newSelectedNodes.includes(nodeId);
24
+ });
25
+ addedNodes.forEach(function (nodeId) {
26
+ params.onNodeSelectionToggle(event, nodeId, true);
27
+ });
28
+ removedNodes.forEach(function (nodeId) {
29
+ params.onNodeSelectionToggle(event, nodeId, false);
30
+ });
31
+ } else if (newSelectedNodes !== models.selectedNodes.value) {
32
+ if (models.selectedNodes.value != null) {
33
+ params.onNodeSelectionToggle(event, models.selectedNodes.value, false);
34
+ }
35
+ if (newSelectedNodes != null) {
36
+ params.onNodeSelectionToggle(event, newSelectedNodes, true);
37
+ }
38
+ }
39
+ }
40
+ if (params.onSelectedNodesChange) {
41
+ params.onSelectedNodesChange(event, newSelectedNodes);
42
+ }
43
+ models.selectedNodes.setValue(newSelectedNodes);
15
44
  };
16
45
  var selectNode = function selectNode(event, nodeId) {
17
46
  var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
@@ -19,26 +48,20 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
19
48
  return;
20
49
  }
21
50
  if (multiple) {
22
- if (Array.isArray(models.selected.value)) {
51
+ if (Array.isArray(models.selectedNodes.value)) {
23
52
  var newSelected;
24
- if (models.selected.value.indexOf(nodeId) !== -1) {
25
- newSelected = models.selected.value.filter(function (id) {
53
+ if (models.selectedNodes.value.indexOf(nodeId) !== -1) {
54
+ newSelected = models.selectedNodes.value.filter(function (id) {
26
55
  return id !== nodeId;
27
56
  });
28
57
  } else {
29
- newSelected = [nodeId].concat(models.selected.value);
30
- }
31
- if (params.onNodeSelect) {
32
- params.onNodeSelect(event, newSelected);
58
+ newSelected = [nodeId].concat(models.selectedNodes.value);
33
59
  }
34
- models.selected.setValue(newSelected);
60
+ setSelectedNodes(event, newSelected);
35
61
  }
36
62
  } else {
37
63
  var _newSelected = params.multiSelect ? [nodeId] : nodeId;
38
- if (params.onNodeSelect) {
39
- params.onNodeSelect(event, _newSelected);
40
- }
41
- models.selected.setValue(_newSelected);
64
+ setSelectedNodes(event, _newSelected);
42
65
  }
43
66
  lastSelectedNode.current = nodeId;
44
67
  lastSelectionWasRange.current = false;
@@ -58,7 +81,7 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
58
81
  return nodes;
59
82
  };
60
83
  var handleRangeArrowSelect = function handleRangeArrowSelect(event, nodes) {
61
- var base = models.selected.value.slice();
84
+ var base = models.selectedNodes.value.slice();
62
85
  var start = nodes.start,
63
86
  next = nodes.next,
64
87
  current = nodes.current;
@@ -84,13 +107,10 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
84
107
  base.push(next);
85
108
  currentRangeSelection.current.push(current, next);
86
109
  }
87
- if (params.onNodeSelect) {
88
- params.onNodeSelect(event, base);
89
- }
90
- models.selected.setValue(base);
110
+ setSelectedNodes(event, base);
91
111
  };
92
112
  var handleRangeSelect = function handleRangeSelect(event, nodes) {
93
- var base = models.selected.value.slice();
113
+ var base = models.selectedNodes.value.slice();
94
114
  var start = nodes.start,
95
115
  end = nodes.end;
96
116
  // If last selection was a range selection ignore nodes that were selected.
@@ -108,10 +128,7 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
108
128
  newSelected = newSelected.filter(function (id, i) {
109
129
  return newSelected.indexOf(id) === i;
110
130
  });
111
- if (params.onNodeSelect) {
112
- params.onNodeSelect(event, newSelected);
113
- }
114
- models.selected.setValue(newSelected);
131
+ setSelectedNodes(event, newSelected);
115
132
  };
116
133
  var selectRange = function selectRange(event, nodes) {
117
134
  var stacked = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
@@ -172,17 +189,17 @@ export var useTreeViewSelection = function useTreeViewSelection(_ref) {
172
189
  };
173
190
  };
174
191
  useTreeViewSelection.models = {
175
- selected: {
176
- controlledProp: 'selected',
177
- defaultProp: 'defaultSelected'
192
+ selectedNodes: {
193
+ controlledProp: 'selectedNodes',
194
+ defaultProp: 'defaultSelectedNodes'
178
195
  }
179
196
  };
180
- var DEFAULT_SELECTED = [];
197
+ var DEFAULT_SELECTED_NODES = [];
181
198
  useTreeViewSelection.getDefaultizedParams = function (params) {
182
199
  var _params$disableSelect, _params$multiSelect, _params$defaultSelect;
183
200
  return _extends({}, params, {
184
201
  disableSelection: (_params$disableSelect = params.disableSelection) != null ? _params$disableSelect : false,
185
202
  multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
186
- defaultSelected: (_params$defaultSelect = params.defaultSelected) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED : null
203
+ defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
187
204
  });
188
205
  };
@@ -3,7 +3,6 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
4
  import * as React from 'react';
5
5
  import useForkRef from '@mui/utils/useForkRef';
6
- import { DEFAULT_TREE_VIEW_CONTEXT_VALUE } from '../TreeViewProvider/TreeViewContext';
7
6
  import { useTreeViewModels } from './useTreeViewModels';
8
7
  import { TREE_VIEW_CORE_PLUGINS } from '../corePlugins';
9
8
  export var useTreeView = function useTreeView(inParams) {
@@ -32,7 +31,7 @@ export var useTreeView = function useTreeView(inParams) {
32
31
  state = _React$useState2[0],
33
32
  setState = _React$useState2[1];
34
33
  var rootPropsGetters = [];
35
- var contextValue = DEFAULT_TREE_VIEW_CONTEXT_VALUE;
34
+ var contextValue = {};
36
35
  var runPlugin = function runPlugin(plugin) {
37
36
  var pluginResponse = plugin({
38
37
  instance: instance,
@@ -50,6 +49,42 @@ export var useTreeView = function useTreeView(inParams) {
50
49
  }
51
50
  };
52
51
  plugins.forEach(runPlugin);
52
+ contextValue.runItemPlugins = function (_ref) {
53
+ var props = _ref.props,
54
+ ref = _ref.ref;
55
+ var finalProps = props;
56
+ var finalRef = ref;
57
+ var itemWrappers = [];
58
+ plugins.forEach(function (plugin) {
59
+ if (!plugin.itemPlugin) {
60
+ return;
61
+ }
62
+ var itemPluginResponse = plugin.itemPlugin({
63
+ props: finalProps,
64
+ ref: finalRef
65
+ });
66
+ if (itemPluginResponse != null && itemPluginResponse.props) {
67
+ finalProps = itemPluginResponse.props;
68
+ }
69
+ if (itemPluginResponse != null && itemPluginResponse.ref) {
70
+ finalRef = itemPluginResponse.ref;
71
+ }
72
+ if (itemPluginResponse != null && itemPluginResponse.wrapItem) {
73
+ itemWrappers.push(itemPluginResponse.wrapItem);
74
+ }
75
+ });
76
+ return {
77
+ props: finalProps,
78
+ ref: finalRef,
79
+ wrapItem: function wrapItem(children) {
80
+ var finalChildren = children;
81
+ itemWrappers.forEach(function (itemWrapper) {
82
+ finalChildren = itemWrapper(finalChildren);
83
+ });
84
+ return finalChildren;
85
+ }
86
+ };
87
+ };
53
88
  var getRootProps = function getRootProps() {
54
89
  var otherHandlers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
55
90
  var rootProps = _extends({
@@ -66,6 +101,7 @@ export var useTreeView = function useTreeView(inParams) {
66
101
  return {
67
102
  getRootProps: getRootProps,
68
103
  rootRef: handleRootRef,
69
- contextValue: contextValue
104
+ contextValue: contextValue,
105
+ instance: instance
70
106
  };
71
107
  };
@@ -0,0 +1,15 @@
1
+ export var buildWarning = function buildWarning(message) {
2
+ var gravity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'warning';
3
+ var alreadyWarned = false;
4
+ var cleanMessage = Array.isArray(message) ? message.join('\n') : message;
5
+ return function () {
6
+ if (!alreadyWarned) {
7
+ alreadyWarned = true;
8
+ if (gravity === 'error') {
9
+ console.error(cleanMessage);
10
+ } else {
11
+ console.warn(cleanMessage);
12
+ }
13
+ }
14
+ };
15
+ };
@@ -0,0 +1 @@
1
+ export * from './items';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export * from './items';
@@ -0,0 +1 @@
1
+ export * from './items';
@@ -0,0 +1,7 @@
1
+ export type TreeViewItemId = string;
2
+ export type TreeViewBaseItem<R extends {} = {
3
+ id: string;
4
+ label: string;
5
+ }> = R & {
6
+ children?: TreeViewBaseItem<R>[];
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/models/index.js",
5
+ "types": "./index.d.ts"
6
+ }