@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
@@ -12,23 +12,49 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
12
12
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
13
13
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
14
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ const updateState = ({
16
+ items,
17
+ isItemDisabled,
18
+ getItemLabel,
19
+ getItemId
20
+ }) => {
21
+ const nodeMap = {};
22
+ const processItem = (item, index, parentId) => {
23
+ const id = getItemId ? getItemId(item) : item.id;
24
+ if (id == null) {
25
+ throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
26
+ }
27
+ const label = getItemLabel ? getItemLabel(item) : item.label;
28
+ if (label == null) {
29
+ throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
30
+ }
31
+ nodeMap[id] = {
32
+ id,
33
+ label,
34
+ index,
35
+ parentId,
36
+ idAttribute: id,
37
+ expandable: !!item.children?.length,
38
+ disabled: isItemDisabled ? isItemDisabled(item) : false
39
+ };
40
+ return {
41
+ id,
42
+ children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
43
+ };
44
+ };
45
+ const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
46
+ return {
47
+ nodeMap,
48
+ nodeTree
49
+ };
50
+ };
15
51
  const useTreeViewNodes = ({
16
52
  instance,
17
- params
53
+ params,
54
+ state,
55
+ setState
18
56
  }) => {
19
- const nodeMap = React.useRef({});
20
- const getNode = React.useCallback(nodeId => nodeMap.current[nodeId], []);
21
- const insertNode = React.useCallback(node => {
22
- nodeMap.current[node.id] = node;
23
- }, []);
24
- const removeNode = React.useCallback(nodeId => {
25
- const newMap = (0, _extends2.default)({}, nodeMap.current);
26
- delete newMap[nodeId];
27
- nodeMap.current = newMap;
28
- (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
29
- id: nodeId
30
- });
31
- }, [instance]);
57
+ const getNode = React.useCallback(nodeId => state.nodeMap[nodeId], [state.nodeMap]);
32
58
  const isNodeDisabled = React.useCallback(nodeId => {
33
59
  if (nodeId == null) {
34
60
  return false;
@@ -50,7 +76,7 @@ const useTreeViewNodes = ({
50
76
  }
51
77
  return false;
52
78
  }, [instance]);
53
- const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(nodeMap.current).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
79
+ const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
54
80
  const getNavigableChildrenIds = nodeId => {
55
81
  let childrenIds = instance.getChildrenIds(nodeId);
56
82
  if (!params.disabledItemsFocusable) {
@@ -58,13 +84,58 @@ const useTreeViewNodes = ({
58
84
  }
59
85
  return childrenIds;
60
86
  };
87
+ React.useEffect(() => {
88
+ setState(prevState => {
89
+ const newState = updateState({
90
+ items: params.items,
91
+ isItemDisabled: params.isItemDisabled,
92
+ getItemId: params.getItemId,
93
+ getItemLabel: params.getItemLabel
94
+ });
95
+ Object.values(prevState.nodeMap).forEach(node => {
96
+ if (!newState.nodeMap[node.id]) {
97
+ (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
98
+ id: node.id
99
+ });
100
+ }
101
+ });
102
+ return (0, _extends2.default)({}, prevState, newState);
103
+ });
104
+ }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
105
+ const getNodesToRender = (0, _useEventCallback.default)(() => {
106
+ const getPropsFromNodeId = ({
107
+ id,
108
+ children
109
+ }) => {
110
+ const node = state.nodeMap[id];
111
+ return {
112
+ label: node.label,
113
+ nodeId: node.id,
114
+ id: node.idAttribute,
115
+ children: children?.map(getPropsFromNodeId)
116
+ };
117
+ };
118
+ return state.nodeTree.map(getPropsFromNodeId);
119
+ });
61
120
  (0, _useTreeView.populateInstance)(instance, {
62
121
  getNode,
63
- updateNode: insertNode,
64
- removeNode,
122
+ getNodesToRender,
65
123
  getChildrenIds,
66
124
  getNavigableChildrenIds,
67
125
  isNodeDisabled
68
126
  });
69
127
  };
70
- exports.useTreeViewNodes = useTreeViewNodes;
128
+ exports.useTreeViewNodes = useTreeViewNodes;
129
+ useTreeViewNodes.getInitialState = params => updateState({
130
+ items: params.items,
131
+ isItemDisabled: params.isItemDisabled,
132
+ getItemId: params.getItemId,
133
+ getItemLabel: params.getItemLabel
134
+ });
135
+ useTreeViewNodes.params = {
136
+ disabledItemsFocusable: true,
137
+ items: true,
138
+ isItemDisabled: true,
139
+ getItemLabel: true,
140
+ getItemId: true
141
+ };
@@ -19,30 +19,49 @@ const useTreeViewSelection = ({
19
19
  const lastSelectedNode = React.useRef(null);
20
20
  const lastSelectionWasRange = React.useRef(false);
21
21
  const currentRangeSelection = React.useRef([]);
22
- const isNodeSelected = nodeId => Array.isArray(models.selected.value) ? models.selected.value.indexOf(nodeId) !== -1 : models.selected.value === nodeId;
22
+ const isNodeSelected = nodeId => Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
23
+ const setSelectedNodes = (event, newSelectedNodes) => {
24
+ if (params.onNodeSelectionToggle) {
25
+ if (params.multiSelect) {
26
+ const addedNodes = newSelectedNodes.filter(nodeId => !instance.isNodeSelected(nodeId));
27
+ const removedNodes = models.selectedNodes.value.filter(nodeId => !newSelectedNodes.includes(nodeId));
28
+ addedNodes.forEach(nodeId => {
29
+ params.onNodeSelectionToggle(event, nodeId, true);
30
+ });
31
+ removedNodes.forEach(nodeId => {
32
+ params.onNodeSelectionToggle(event, nodeId, false);
33
+ });
34
+ } else if (newSelectedNodes !== models.selectedNodes.value) {
35
+ if (models.selectedNodes.value != null) {
36
+ params.onNodeSelectionToggle(event, models.selectedNodes.value, false);
37
+ }
38
+ if (newSelectedNodes != null) {
39
+ params.onNodeSelectionToggle(event, newSelectedNodes, true);
40
+ }
41
+ }
42
+ }
43
+ if (params.onSelectedNodesChange) {
44
+ params.onSelectedNodesChange(event, newSelectedNodes);
45
+ }
46
+ models.selectedNodes.setValue(newSelectedNodes);
47
+ };
23
48
  const selectNode = (event, nodeId, multiple = false) => {
24
49
  if (params.disableSelection) {
25
50
  return;
26
51
  }
27
52
  if (multiple) {
28
- if (Array.isArray(models.selected.value)) {
53
+ if (Array.isArray(models.selectedNodes.value)) {
29
54
  let newSelected;
30
- if (models.selected.value.indexOf(nodeId) !== -1) {
31
- newSelected = models.selected.value.filter(id => id !== nodeId);
55
+ if (models.selectedNodes.value.indexOf(nodeId) !== -1) {
56
+ newSelected = models.selectedNodes.value.filter(id => id !== nodeId);
32
57
  } else {
33
- newSelected = [nodeId].concat(models.selected.value);
58
+ newSelected = [nodeId].concat(models.selectedNodes.value);
34
59
  }
35
- if (params.onNodeSelect) {
36
- params.onNodeSelect(event, newSelected);
37
- }
38
- models.selected.setValue(newSelected);
60
+ setSelectedNodes(event, newSelected);
39
61
  }
40
62
  } else {
41
63
  const newSelected = params.multiSelect ? [nodeId] : nodeId;
42
- if (params.onNodeSelect) {
43
- params.onNodeSelect(event, newSelected);
44
- }
45
- models.selected.setValue(newSelected);
64
+ setSelectedNodes(event, newSelected);
46
65
  }
47
66
  lastSelectedNode.current = nodeId;
48
67
  lastSelectionWasRange.current = false;
@@ -59,7 +78,7 @@ const useTreeViewSelection = ({
59
78
  return nodes;
60
79
  };
61
80
  const handleRangeArrowSelect = (event, nodes) => {
62
- let base = models.selected.value.slice();
81
+ let base = models.selectedNodes.value.slice();
63
82
  const {
64
83
  start,
65
84
  next,
@@ -83,13 +102,10 @@ const useTreeViewSelection = ({
83
102
  base.push(next);
84
103
  currentRangeSelection.current.push(current, next);
85
104
  }
86
- if (params.onNodeSelect) {
87
- params.onNodeSelect(event, base);
88
- }
89
- models.selected.setValue(base);
105
+ setSelectedNodes(event, base);
90
106
  };
91
107
  const handleRangeSelect = (event, nodes) => {
92
- let base = models.selected.value.slice();
108
+ let base = models.selectedNodes.value.slice();
93
109
  const {
94
110
  start,
95
111
  end
@@ -103,10 +119,7 @@ const useTreeViewSelection = ({
103
119
  currentRangeSelection.current = range;
104
120
  let newSelected = base.concat(range);
105
121
  newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
106
- if (params.onNodeSelect) {
107
- params.onNodeSelect(event, newSelected);
108
- }
109
- models.selected.setValue(newSelected);
122
+ setSelectedNodes(event, newSelected);
110
123
  };
111
124
  const selectRange = (event, nodes, stacked = false) => {
112
125
  if (params.disableSelection) {
@@ -166,14 +179,22 @@ const useTreeViewSelection = ({
166
179
  };
167
180
  exports.useTreeViewSelection = useTreeViewSelection;
168
181
  useTreeViewSelection.models = {
169
- selected: {
170
- controlledProp: 'selected',
171
- defaultProp: 'defaultSelected'
182
+ selectedNodes: {
183
+ controlledProp: 'selectedNodes',
184
+ defaultProp: 'defaultSelectedNodes'
172
185
  }
173
186
  };
174
- const DEFAULT_SELECTED = [];
187
+ const DEFAULT_SELECTED_NODES = [];
175
188
  useTreeViewSelection.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
176
189
  disableSelection: params.disableSelection ?? false,
177
190
  multiSelect: params.multiSelect ?? false,
178
- defaultSelected: params.defaultSelected ?? (params.multiSelect ? DEFAULT_SELECTED : null)
179
- });
191
+ defaultSelectedNodes: params.defaultSelectedNodes ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
192
+ });
193
+ useTreeViewSelection.params = {
194
+ disableSelection: true,
195
+ multiSelect: true,
196
+ defaultSelectedNodes: true,
197
+ selectedNodes: true,
198
+ onSelectedNodesChange: true,
199
+ onNodeSelectionToggle: true
200
+ };
@@ -8,7 +8,6 @@ exports.useTreeView = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
11
- var _TreeViewContext = require("../TreeViewProvider/TreeViewContext");
12
11
  var _useTreeViewModels = require("./useTreeViewModels");
13
12
  var _corePlugins = require("../corePlugins");
14
13
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
@@ -36,7 +35,7 @@ const useTreeView = inParams => {
36
35
  return temp;
37
36
  });
38
37
  const rootPropsGetters = [];
39
- let contextValue = _TreeViewContext.DEFAULT_TREE_VIEW_CONTEXT_VALUE;
38
+ let contextValue = {};
40
39
  const runPlugin = plugin => {
41
40
  const pluginResponse = plugin({
42
41
  instance,
@@ -54,6 +53,43 @@ const useTreeView = inParams => {
54
53
  }
55
54
  };
56
55
  plugins.forEach(runPlugin);
56
+ contextValue.runItemPlugins = ({
57
+ props,
58
+ ref
59
+ }) => {
60
+ let finalProps = props;
61
+ let finalRef = ref;
62
+ const itemWrappers = [];
63
+ plugins.forEach(plugin => {
64
+ if (!plugin.itemPlugin) {
65
+ return;
66
+ }
67
+ const itemPluginResponse = plugin.itemPlugin({
68
+ props: finalProps,
69
+ ref: finalRef
70
+ });
71
+ if (itemPluginResponse?.props) {
72
+ finalProps = itemPluginResponse.props;
73
+ }
74
+ if (itemPluginResponse?.ref) {
75
+ finalRef = itemPluginResponse.ref;
76
+ }
77
+ if (itemPluginResponse?.wrapItem) {
78
+ itemWrappers.push(itemPluginResponse.wrapItem);
79
+ }
80
+ });
81
+ return {
82
+ props: finalProps,
83
+ ref: finalRef,
84
+ wrapItem: children => {
85
+ let finalChildren = children;
86
+ itemWrappers.forEach(itemWrapper => {
87
+ finalChildren = itemWrapper(finalChildren);
88
+ });
89
+ return finalChildren;
90
+ }
91
+ };
92
+ };
57
93
  const getRootProps = (otherHandlers = {}) => {
58
94
  const rootProps = (0, _extends2.default)({
59
95
  role: 'tree',
@@ -69,7 +105,8 @@ const useTreeView = inParams => {
69
105
  return {
70
106
  getRootProps,
71
107
  rootRef: handleRootRef,
72
- contextValue
108
+ contextValue,
109
+ instance: instance
73
110
  };
74
111
  };
75
112
  exports.useTreeView = useTreeView;
@@ -53,7 +53,7 @@ const useTreeViewModels = (plugins, props) => {
53
53
  const defaultProp = props[model.defaultProp];
54
54
  React.useEffect(() => {
55
55
  if (model.isControlled !== (controlled !== undefined)) {
56
- console.error([`MUI: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
56
+ console.error([`MUI X: A component is changing the ${model.isControlled ? '' : 'un'}controlled ${modelName} state of TreeView to be ${model.isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${modelName} ` + 'element for the lifetime of the component.', "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
57
57
  }
58
58
  }, [controlled]);
59
59
  const {
@@ -61,7 +61,7 @@ const useTreeViewModels = (plugins, props) => {
61
61
  } = React.useRef(defaultProp);
62
62
  React.useEffect(() => {
63
63
  if (!model.isControlled && defaultValue !== defaultProp) {
64
- console.error([`MUI: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
64
+ console.error([`MUI X: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
65
65
  }
66
66
  }, [JSON.stringify(defaultValue)]);
67
67
  });
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractPluginParamsFromProps = void 0;
7
+ const extractPluginParamsFromProps = ({
8
+ props,
9
+ plugins,
10
+ rootRef
11
+ }) => {
12
+ const paramsLookup = {};
13
+ plugins.forEach(plugin => {
14
+ Object.assign(paramsLookup, plugin.params);
15
+ });
16
+ const pluginParams = {
17
+ plugins,
18
+ rootRef
19
+ };
20
+ const otherProps = {};
21
+ Object.keys(props).forEach(propName => {
22
+ const prop = props[propName];
23
+ if (paramsLookup[propName]) {
24
+ pluginParams[propName] = prop;
25
+ } else {
26
+ otherProps[propName] = prop;
27
+ }
28
+ });
29
+ return {
30
+ pluginParams,
31
+ otherProps
32
+ };
33
+ };
34
+ exports.extractPluginParamsFromProps = extractPluginParamsFromProps;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildWarning = void 0;
7
+ const buildWarning = (message, gravity = 'warning') => {
8
+ let alreadyWarned = false;
9
+ const cleanMessage = Array.isArray(message) ? message.join('\n') : message;
10
+ return () => {
11
+ if (!alreadyWarned) {
12
+ alreadyWarned = true;
13
+ if (gravity === 'error') {
14
+ console.error(cleanMessage);
15
+ } else {
16
+ console.warn(cleanMessage);
17
+ }
18
+ }
19
+ };
20
+ };
21
+ exports.buildWarning = buildWarning;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _items = require("./items");
7
+ Object.keys(_items).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _items[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _items[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.0.0-alpha.1",
3
+ "version": "7.0.0-alpha.8",
4
4
  "description": "The community edition of the tree view components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -11,7 +11,7 @@
11
11
  "homepage": "https://mui.com/x/react-tree-view/",
12
12
  "funding": {
13
13
  "type": "opencollective",
14
- "url": "https://opencollective.com/mui"
14
+ "url": "https://opencollective.com/mui-org"
15
15
  },
16
16
  "sideEffects": false,
17
17
  "publishConfig": {
@@ -21,6 +21,7 @@
21
21
  "react",
22
22
  "react-component",
23
23
  "mui",
24
+ "mui-x",
24
25
  "material-ui",
25
26
  "material design",
26
27
  "treeview"
@@ -31,10 +32,11 @@
31
32
  "directory": "packages/x-tree-view"
32
33
  },
33
34
  "dependencies": {
34
- "@babel/runtime": "^7.23.2",
35
- "@mui/base": "^5.0.0-beta.22",
36
- "@mui/utils": "^5.14.16",
37
- "@types/react-transition-group": "^4.4.8",
35
+ "@babel/runtime": "^7.23.7",
36
+ "@mui/base": "^5.0.0-beta.29",
37
+ "@mui/system": "^5.15.2",
38
+ "@mui/utils": "^5.15.2",
39
+ "@types/react-transition-group": "^4.4.10",
38
40
  "clsx": "^2.0.0",
39
41
  "prop-types": "^15.8.1",
40
42
  "react-transition-group": "^4.4.5"
@@ -43,7 +45,6 @@
43
45
  "@emotion/react": "^11.9.0",
44
46
  "@emotion/styled": "^11.8.1",
45
47
  "@mui/material": "^5.8.6",
46
- "@mui/system": "^5.8.0",
47
48
  "react": "^17.0.0 || ^18.0.0",
48
49
  "react-dom": "^17.0.0 || ^18.0.0"
49
50
  },
@@ -1,16 +1,26 @@
1
1
  import { ComponentsProps, ComponentsOverrides, ComponentsVariants } from '@mui/material/styles';
2
2
 
3
3
  export interface TreeViewComponents<Theme = unknown> {
4
- MuiTreeItem?: {
5
- defaultProps?: ComponentsProps['MuiTreeItem'];
6
- styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem'];
7
- variants?: ComponentsVariants['MuiTreeItem'];
4
+ MuiSimpleTreeView?: {
5
+ defaultProps?: ComponentsProps['MuiSimpleTreeView'];
6
+ styleOverrides?: ComponentsOverrides<Theme>['MuiSimpleTreeView'];
7
+ variants?: ComponentsVariants['MuiSimpleTreeView'];
8
+ };
9
+ MuiRichTreeView?: {
10
+ defaultProps?: ComponentsProps['MuiRichTreeView'];
11
+ styleOverrides?: ComponentsOverrides<Theme>['MuiRichTreeView'];
12
+ variants?: ComponentsVariants['MuiRichTreeView'];
8
13
  };
9
14
  MuiTreeView?: {
10
15
  defaultProps?: ComponentsProps['MuiTreeView'];
11
16
  styleOverrides?: ComponentsOverrides<Theme>['MuiTreeView'];
12
17
  variants?: ComponentsVariants['MuiTreeView'];
13
18
  };
19
+ MuiTreeItem?: {
20
+ defaultProps?: ComponentsProps['MuiTreeItem'];
21
+ styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem'];
22
+ variants?: ComponentsVariants['MuiTreeItem'];
23
+ };
14
24
  }
15
25
 
16
26
  declare module '@mui/material/styles' {
@@ -1,14 +1,18 @@
1
- import { TreeItemClassKey } from '../TreeItem';
1
+ import { RichTreeViewClassKey } from '../RichTreeView';
2
+ import { SimpleTreeViewClassKey } from '../SimpleTreeView';
2
3
  import { TreeViewClassKey } from '../TreeView';
4
+ import { TreeItemClassKey } from '../TreeItem';
3
5
 
4
6
  // prettier-ignore
5
- export interface PickersComponentNameToClassKey {
6
- MuiTreeItem: TreeItemClassKey;
7
+ export interface TreeViewComponentNameToClassKey {
8
+ MuiSimpleTreeView: SimpleTreeViewClassKey;
9
+ MuiRichTreeView: RichTreeViewClassKey;
7
10
  MuiTreeView: TreeViewClassKey;
11
+ MuiTreeItem: TreeItemClassKey;
8
12
  }
9
13
 
10
14
  declare module '@mui/material/styles' {
11
- interface ComponentNameToClassKey extends PickersComponentNameToClassKey {}
15
+ interface ComponentNameToClassKey extends TreeViewComponentNameToClassKey {}
12
16
  }
13
17
 
14
18
  // disable automatic export
@@ -1,13 +1,17 @@
1
1
  import { TreeItemProps } from '../TreeItem';
2
2
  import { TreeViewProps } from '../TreeView';
3
+ import { SimpleTreeViewProps } from '../SimpleTreeView';
4
+ import { RichTreeViewProps } from '../RichTreeView';
3
5
 
4
- export interface PickersComponentsPropsList {
5
- MuiTreeItem: TreeItemProps;
6
+ export interface TreeViewComponentsPropsList {
7
+ MuiSimpleTreeView: SimpleTreeViewProps<any>;
8
+ MuiRichTreeView: RichTreeViewProps<any, any>;
6
9
  MuiTreeView: TreeViewProps<any>;
10
+ MuiTreeItem: TreeItemProps;
7
11
  }
8
12
 
9
13
  declare module '@mui/material/styles' {
10
- interface ComponentsPropsList extends PickersComponentsPropsList {}
14
+ interface ComponentsPropsList extends TreeViewComponentsPropsList {}
11
15
  }
12
16
 
13
17
  // disable automatic export