@mui/x-tree-view 7.0.0-alpha.7 → 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 (73) hide show
  1. package/CHANGELOG.md +175 -49
  2. package/RichTreeView/RichTreeView.js +18 -57
  3. package/SimpleTreeView/SimpleTreeView.js +20 -53
  4. package/TreeView/TreeView.js +1 -1
  5. package/index.js +1 -1
  6. package/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  7. package/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  8. package/internals/models/MuiCancellableEvent.d.ts +4 -0
  9. package/internals/models/MuiCancellableEvent.js +1 -0
  10. package/internals/models/plugin.d.ts +1 -0
  11. package/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
  12. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -0
  13. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -0
  14. package/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  15. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  16. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  17. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
  18. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +8 -0
  19. package/internals/useTreeView/useTreeViewModels.js +2 -2
  20. package/internals/utils/extractPluginParamsFromProps.d.ts +13 -0
  21. package/internals/utils/extractPluginParamsFromProps.js +27 -0
  22. package/legacy/RichTreeView/RichTreeView.js +17 -55
  23. package/legacy/SimpleTreeView/SimpleTreeView.js +15 -47
  24. package/legacy/TreeView/TreeView.js +1 -1
  25. package/legacy/index.js +1 -1
  26. package/legacy/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  27. package/legacy/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  28. package/legacy/internals/models/MuiCancellableEvent.js +1 -0
  29. package/legacy/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
  30. package/legacy/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -0
  31. package/legacy/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +3 -0
  32. package/legacy/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  33. package/legacy/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  34. package/legacy/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +157 -110
  35. package/legacy/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +9 -2
  36. package/legacy/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +8 -0
  37. package/legacy/internals/useTreeView/useTreeViewModels.js +2 -2
  38. package/legacy/internals/utils/extractPluginParamsFromProps.js +27 -0
  39. package/modern/RichTreeView/RichTreeView.js +18 -57
  40. package/modern/SimpleTreeView/SimpleTreeView.js +20 -53
  41. package/modern/TreeView/TreeView.js +1 -1
  42. package/modern/index.js +1 -1
  43. package/modern/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  44. package/modern/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  45. package/modern/internals/models/MuiCancellableEvent.js +1 -0
  46. package/modern/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +6 -0
  47. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -1
  48. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -1
  49. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +3 -0
  50. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  51. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  52. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
  53. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -1
  54. package/modern/internals/useTreeView/useTreeViewModels.js +2 -2
  55. package/modern/internals/utils/extractPluginParamsFromProps.js +27 -0
  56. package/node/RichTreeView/RichTreeView.js +18 -57
  57. package/node/SimpleTreeView/SimpleTreeView.js +20 -53
  58. package/node/TreeView/TreeView.js +1 -1
  59. package/node/index.js +1 -1
  60. package/node/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  61. package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +2 -1
  62. package/node/internals/models/MuiCancellableEvent.js +5 -0
  63. package/node/internals/plugins/useTreeViewContextValueBuilder/useTreeViewContextValueBuilder.js +7 -1
  64. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -1
  65. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -1
  66. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +4 -1
  67. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +2 -1
  68. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +155 -112
  69. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +10 -3
  70. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +9 -1
  71. package/node/internals/useTreeView/useTreeViewModels.js +2 -2
  72. package/node/internals/utils/extractPluginParamsFromProps.js +34 -0
  73. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { useTheme } from '@mui/material/styles';
3
3
  import useEventCallback from '@mui/utils/useEventCallback';
4
4
  import { getFirstNode, getLastNode, getNextNode, getPreviousNode, populateInstance } from '../../useTreeView/useTreeView.utils';
5
5
  function isPrintableCharacter(string) {
6
- return string && string.length === 1 && string.match(/\S/);
6
+ return !!string && string.length === 1 && !!string.match(/\S/);
7
7
  }
8
8
  function findNextFirstChar(firstChars, startIndex, char) {
9
9
  for (let i = startIndex; i < firstChars.length; i += 1) {
@@ -19,7 +19,7 @@ export const useTreeViewKeyboardNavigation = ({
19
19
  state
20
20
  }) => {
21
21
  const theme = useTheme();
22
- const isRtl = theme.direction === 'rtl';
22
+ const isRTL = theme.direction === 'rtl';
23
23
  const firstCharMap = React.useRef({});
24
24
  const hasFirstCharMapBeenUpdatedImperatively = React.useRef(false);
25
25
  const updateFirstCharMap = useEventCallback(callback => {
@@ -44,32 +44,7 @@ export const useTreeViewKeyboardNavigation = ({
44
44
  populateInstance(instance, {
45
45
  updateFirstCharMap
46
46
  });
47
- const handleNextArrow = event => {
48
- if (state.focusedNodeId != null && instance.isNodeExpandable(state.focusedNodeId)) {
49
- if (instance.isNodeExpanded(state.focusedNodeId)) {
50
- instance.focusNode(event, getNextNode(instance, state.focusedNodeId));
51
- } else if (!instance.isNodeDisabled(state.focusedNodeId)) {
52
- instance.toggleNodeExpansion(event, state.focusedNodeId);
53
- }
54
- }
55
- return true;
56
- };
57
- const handlePreviousArrow = event => {
58
- if (state.focusedNodeId == null) {
59
- return false;
60
- }
61
- if (instance.isNodeExpanded(state.focusedNodeId) && !instance.isNodeDisabled(state.focusedNodeId)) {
62
- instance.toggleNodeExpansion(event, state.focusedNodeId);
63
- return true;
64
- }
65
- const parent = instance.getNode(state.focusedNodeId).parentId;
66
- if (parent) {
67
- instance.focusNode(event, parent);
68
- return true;
69
- }
70
- return false;
71
- };
72
- const focusByFirstCharacter = (event, nodeId, firstChar) => {
47
+ const getFirstMatchingNode = (nodeId, firstChar) => {
73
48
  let start;
74
49
  let index;
75
50
  const lowercaseChar = firstChar.toLowerCase();
@@ -100,42 +75,36 @@ export const useTreeViewKeyboardNavigation = ({
100
75
  index = findNextFirstChar(firstChars, 0, lowercaseChar);
101
76
  }
102
77
 
103
- // If match was found...
78
+ // If a match was found...
104
79
  if (index > -1) {
105
- instance.focusNode(event, firstCharIds[index]);
106
- }
107
- };
108
- const selectNextNode = (event, id) => {
109
- if (!instance.isNodeDisabled(getNextNode(instance, id))) {
110
- instance.selectRange(event, {
111
- end: getNextNode(instance, id),
112
- current: id
113
- }, true);
114
- }
115
- };
116
- const selectPreviousNode = (event, nodeId) => {
117
- if (!instance.isNodeDisabled(getPreviousNode(instance, nodeId))) {
118
- instance.selectRange(event, {
119
- end: getPreviousNode(instance, nodeId),
120
- current: nodeId
121
- }, true);
80
+ return firstCharIds[index];
122
81
  }
82
+ return null;
123
83
  };
84
+ const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
85
+ const canToggleNodeExpansion = nodeId => !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
86
+
87
+ // ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
124
88
  const createHandleKeyDown = otherHandlers => event => {
125
89
  var _otherHandlers$onKeyD;
126
90
  (_otherHandlers$onKeyD = otherHandlers.onKeyDown) == null || _otherHandlers$onKeyD.call(otherHandlers, event);
127
- let flag = false;
128
- const key = event.key;
91
+ if (event.defaultMuiPrevented) {
92
+ return;
93
+ }
129
94
 
130
95
  // If the tree is empty there will be no focused node
131
96
  if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
132
97
  return;
133
98
  }
134
99
  const ctrlPressed = event.ctrlKey || event.metaKey;
135
- switch (key) {
136
- case ' ':
137
- if (!params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
138
- flag = true;
100
+ const key = event.key;
101
+
102
+ // eslint-disable-next-line default-case
103
+ switch (true) {
104
+ // Select the node when pressing "Space"
105
+ case key === ' ' && canToggleNodeSelection(state.focusedNodeId):
106
+ {
107
+ event.preventDefault();
139
108
  if (params.multiSelect && event.shiftKey) {
140
109
  instance.selectRange(event, {
141
110
  end: state.focusedNodeId
@@ -145,85 +114,158 @@ export const useTreeViewKeyboardNavigation = ({
145
114
  } else {
146
115
  instance.selectNode(event, state.focusedNodeId);
147
116
  }
117
+ break;
148
118
  }
149
- event.stopPropagation();
150
- break;
151
- case 'Enter':
152
- if (!instance.isNodeDisabled(state.focusedNodeId)) {
153
- if (instance.isNodeExpandable(state.focusedNodeId)) {
119
+
120
+ // If the focused node has children, we expand it.
121
+ // If the focused node has no children, we select it.
122
+ case key === 'Enter':
123
+ {
124
+ if (canToggleNodeExpansion(state.focusedNodeId)) {
154
125
  instance.toggleNodeExpansion(event, state.focusedNodeId);
155
- flag = true;
156
- } else if (!params.disableSelection) {
157
- flag = true;
126
+ event.preventDefault();
127
+ } else if (canToggleNodeSelection(state.focusedNodeId)) {
158
128
  if (params.multiSelect) {
129
+ event.preventDefault();
159
130
  instance.selectNode(event, state.focusedNodeId, true);
160
- } else {
131
+ } else if (!instance.isNodeSelected(state.focusedNodeId)) {
161
132
  instance.selectNode(event, state.focusedNodeId);
133
+ event.preventDefault();
162
134
  }
163
135
  }
136
+ break;
164
137
  }
165
- event.stopPropagation();
166
- break;
167
- case 'ArrowDown':
168
- if (params.multiSelect && event.shiftKey && !params.disableSelection) {
169
- selectNextNode(event, state.focusedNodeId);
138
+
139
+ // Focus the next focusable node
140
+ case key === 'ArrowDown':
141
+ {
142
+ const nextNode = getNextNode(instance, state.focusedNodeId);
143
+ if (nextNode) {
144
+ event.preventDefault();
145
+ instance.focusNode(event, nextNode);
146
+
147
+ // Multi select behavior when pressing Shift + ArrowDown
148
+ // Toggles the selection state of the next node
149
+ if (params.multiSelect && event.shiftKey && canToggleNodeSelection(nextNode)) {
150
+ instance.selectRange(event, {
151
+ end: nextNode,
152
+ current: state.focusedNodeId
153
+ }, true);
154
+ }
155
+ }
156
+ break;
170
157
  }
171
- instance.focusNode(event, getNextNode(instance, state.focusedNodeId));
172
- flag = true;
173
- break;
174
- case 'ArrowUp':
175
- if (params.multiSelect && event.shiftKey && !params.disableSelection) {
176
- selectPreviousNode(event, state.focusedNodeId);
158
+
159
+ // Focuses the previous focusable node
160
+ case key === 'ArrowUp':
161
+ {
162
+ const previousNode = getPreviousNode(instance, state.focusedNodeId);
163
+ if (previousNode) {
164
+ event.preventDefault();
165
+ instance.focusNode(event, previousNode);
166
+
167
+ // Multi select behavior when pressing Shift + ArrowUp
168
+ // Toggles the selection state of the previous node
169
+ if (params.multiSelect && event.shiftKey && canToggleNodeSelection(previousNode)) {
170
+ instance.selectRange(event, {
171
+ end: previousNode,
172
+ current: state.focusedNodeId
173
+ }, true);
174
+ }
175
+ }
176
+ break;
177
177
  }
178
- instance.focusNode(event, getPreviousNode(instance, state.focusedNodeId));
179
- flag = true;
180
- break;
181
- case 'ArrowRight':
182
- if (isRtl) {
183
- flag = handlePreviousArrow(event);
184
- } else {
185
- flag = handleNextArrow(event);
178
+
179
+ // If the focused node is expanded, we move the focus to its first child
180
+ // If the focused node is collapsed and has children, we expand it
181
+ case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
182
+ {
183
+ if (instance.isNodeExpanded(state.focusedNodeId)) {
184
+ instance.focusNode(event, getNextNode(instance, state.focusedNodeId));
185
+ event.preventDefault();
186
+ } else if (canToggleNodeExpansion(state.focusedNodeId)) {
187
+ instance.toggleNodeExpansion(event, state.focusedNodeId);
188
+ event.preventDefault();
189
+ }
190
+ break;
186
191
  }
187
- break;
188
- case 'ArrowLeft':
189
- if (isRtl) {
190
- flag = handleNextArrow(event);
191
- } else {
192
- flag = handlePreviousArrow(event);
192
+
193
+ // If the focused node is expanded, we collapse it
194
+ // If the focused node is collapsed and has a parent, we move the focus to this parent
195
+ case key === 'ArrowLeft' && !isRTL || key === 'ArrowRight' && isRTL:
196
+ {
197
+ if (canToggleNodeExpansion(state.focusedNodeId) && instance.isNodeExpanded(state.focusedNodeId)) {
198
+ instance.toggleNodeExpansion(event, state.focusedNodeId);
199
+ event.preventDefault();
200
+ } else {
201
+ const parent = instance.getNode(state.focusedNodeId).parentId;
202
+ if (parent) {
203
+ instance.focusNode(event, parent);
204
+ event.preventDefault();
205
+ }
206
+ }
207
+ break;
193
208
  }
194
- break;
195
- case 'Home':
196
- if (params.multiSelect && ctrlPressed && event.shiftKey && !params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
197
- instance.rangeSelectToFirst(event, state.focusedNodeId);
209
+
210
+ // Focuses the first node in the tree
211
+ case key === 'Home':
212
+ {
213
+ instance.focusNode(event, getFirstNode(instance));
214
+
215
+ // Multi select behavior when pressing Ctrl + Shift + Home
216
+ // Selects the focused node and all nodes up to the first node.
217
+ if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
218
+ instance.rangeSelectToFirst(event, state.focusedNodeId);
219
+ }
220
+ event.preventDefault();
221
+ break;
198
222
  }
199
- instance.focusNode(event, getFirstNode(instance));
200
- flag = true;
201
- break;
202
- case 'End':
203
- if (params.multiSelect && ctrlPressed && event.shiftKey && !params.disableSelection && !instance.isNodeDisabled(state.focusedNodeId)) {
204
- instance.rangeSelectToLast(event, state.focusedNodeId);
223
+
224
+ // Focuses the last node in the tree
225
+ case key === 'End':
226
+ {
227
+ instance.focusNode(event, getLastNode(instance));
228
+
229
+ // Multi select behavior when pressing Ctrl + Shirt + End
230
+ // Selects the focused node and all the nodes down to the last node.
231
+ if (canToggleNodeSelection(state.focusedNodeId) && params.multiSelect && ctrlPressed && event.shiftKey) {
232
+ instance.rangeSelectToLast(event, state.focusedNodeId);
233
+ }
234
+ event.preventDefault();
235
+ break;
205
236
  }
206
- instance.focusNode(event, getLastNode(instance));
207
- flag = true;
208
- break;
209
- default:
210
- if (key === '*') {
237
+
238
+ // Expand all siblings that are at the same level as the focused node
239
+ case key === '*':
240
+ {
211
241
  instance.expandAllSiblings(event, state.focusedNodeId);
212
- flag = true;
213
- } else if (params.multiSelect && ctrlPressed && key.toLowerCase() === 'a' && !params.disableSelection) {
242
+ event.preventDefault();
243
+ break;
244
+ }
245
+
246
+ // Multi select behavior when pressing Ctrl + a
247
+ // Selects all the nodes
248
+ case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
249
+ {
214
250
  instance.selectRange(event, {
215
251
  start: getFirstNode(instance),
216
252
  end: getLastNode(instance)
217
253
  });
218
- flag = true;
219
- } else if (!ctrlPressed && !event.shiftKey && isPrintableCharacter(key)) {
220
- focusByFirstCharacter(event, state.focusedNodeId, key);
221
- flag = true;
254
+ event.preventDefault();
255
+ break;
256
+ }
257
+
258
+ // Type-ahead
259
+ // TODO: Support typing multiple characters
260
+ case !ctrlPressed && !event.shiftKey && isPrintableCharacter(key):
261
+ {
262
+ const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
263
+ if (matchingNode != null) {
264
+ instance.focusNode(event, matchingNode);
265
+ event.preventDefault();
266
+ }
267
+ break;
222
268
  }
223
- }
224
- if (flag) {
225
- event.preventDefault();
226
- event.stopPropagation();
227
269
  }
228
270
  };
229
271
  return {
@@ -231,4 +273,5 @@ export const useTreeViewKeyboardNavigation = ({
231
273
  onKeyDown: createHandleKeyDown(otherHandlers)
232
274
  })
233
275
  };
234
- };
276
+ };
277
+ useTreeViewKeyboardNavigation.params = {};
@@ -14,11 +14,11 @@ const updateState = ({
14
14
  var _item$children, _item$children2;
15
15
  const id = getItemId ? getItemId(item) : item.id;
16
16
  if (id == null) {
17
- 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
+ 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'));
18
18
  }
19
19
  const label = getItemLabel ? getItemLabel(item) : item.label;
20
20
  if (label == null) {
21
- 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
+ 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'));
22
22
  }
23
23
  nodeMap[id] = {
24
24
  id,
@@ -122,4 +122,11 @@ useTreeViewNodes.getInitialState = params => updateState({
122
122
  isItemDisabled: params.isItemDisabled,
123
123
  getItemId: params.getItemId,
124
124
  getItemLabel: params.getItemLabel
125
- });
125
+ });
126
+ useTreeViewNodes.params = {
127
+ disabledItemsFocusable: true,
128
+ items: true,
129
+ isItemDisabled: true,
130
+ getItemLabel: true,
131
+ getItemId: true
132
+ };
@@ -182,4 +182,12 @@ useTreeViewSelection.getDefaultizedParams = params => {
182
182
  multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
183
183
  defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
184
184
  });
185
+ };
186
+ useTreeViewSelection.params = {
187
+ disableSelection: true,
188
+ multiSelect: true,
189
+ defaultSelectedNodes: true,
190
+ selectedNodes: true,
191
+ onSelectedNodesChange: true,
192
+ onNodeSelectionToggle: true
185
193
  };
@@ -44,7 +44,7 @@ export const useTreeViewModels = (plugins, props) => {
44
44
  const defaultProp = props[model.defaultProp];
45
45
  React.useEffect(() => {
46
46
  if (model.isControlled !== (controlled !== undefined)) {
47
- 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'));
47
+ 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'));
48
48
  }
49
49
  }, [controlled]);
50
50
  const {
@@ -52,7 +52,7 @@ export const useTreeViewModels = (plugins, props) => {
52
52
  } = React.useRef(defaultProp);
53
53
  React.useEffect(() => {
54
54
  if (!model.isControlled && defaultValue !== defaultProp) {
55
- 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'));
55
+ 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'));
56
56
  }
57
57
  }, [JSON.stringify(defaultValue)]);
58
58
  });
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { ConvertPluginsIntoSignatures, MergePluginsProperty, TreeViewPlugin } from '../models';
3
+ export declare const extractPluginParamsFromProps: <TProps extends {}, TPlugins extends readonly TreeViewPlugin<any>[]>({ props, plugins, rootRef, }: {
4
+ props: TProps;
5
+ plugins: TPlugins;
6
+ rootRef?: React.Ref<HTMLUListElement> | undefined;
7
+ }) => {
8
+ pluginParams: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params"> & {
9
+ plugins: TPlugins;
10
+ rootRef?: React.Ref<HTMLUListElement> | undefined;
11
+ };
12
+ otherProps: Omit<TProps, keyof MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, "params">>;
13
+ };
@@ -0,0 +1,27 @@
1
+ export const extractPluginParamsFromProps = ({
2
+ props,
3
+ plugins,
4
+ rootRef
5
+ }) => {
6
+ const paramsLookup = {};
7
+ plugins.forEach(plugin => {
8
+ Object.assign(paramsLookup, plugin.params);
9
+ });
10
+ const pluginParams = {
11
+ plugins,
12
+ rootRef
13
+ };
14
+ const otherProps = {};
15
+ Object.keys(props).forEach(propName => {
16
+ const prop = props[propName];
17
+ if (paramsLookup[propName]) {
18
+ pluginParams[propName] = prop;
19
+ } else {
20
+ otherProps[propName] = prop;
21
+ }
22
+ });
23
+ return {
24
+ pluginParams,
25
+ otherProps
26
+ };
27
+ };
@@ -1,6 +1,6 @@
1
1
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- var _excluded = ["disabledItemsFocusable", "expandedNodes", "defaultExpandedNodes", "onExpandedNodesChange", "onNodeExpansionToggle", "onNodeFocus", "disableSelection", "defaultSelectedNodes", "selectedNodes", "multiSelect", "onSelectedNodesChange", "onNodeSelectionToggle", "id", "defaultCollapseIcon", "defaultEndIcon", "defaultExpandIcon", "defaultParentIcon", "items", "getItemId", "getItemLabel", "isItemDisabled", "slots", "slotProps"];
3
+ var _excluded = ["slots", "slotProps"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import { styled, useThemeProps } from '@mui/material/styles';
@@ -12,6 +12,7 @@ import { TreeViewProvider } from '../internals/TreeViewProvider';
12
12
  import { DEFAULT_TREE_VIEW_PLUGINS } from '../internals/plugins';
13
13
  import { TreeItem } from '../TreeItem';
14
14
  import { buildWarning } from '../internals/utils/warning';
15
+ import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps';
15
16
  import { jsx as _jsx } from "react/jsx-runtime";
16
17
  var useUtilityClasses = function useUtilityClasses(ownerState) {
17
18
  var classes = ownerState.classes;
@@ -58,7 +59,7 @@ function WrappedTreeItem(_ref) {
58
59
  children: children
59
60
  }));
60
61
  }
61
- var childrenWarning = buildWarning(['MUI: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
62
+ var childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
62
63
 
63
64
  /**
64
65
  *
@@ -76,61 +77,22 @@ var RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps,
76
77
  props: inProps,
77
78
  name: 'MuiRichTreeView'
78
79
  });
79
- var _ref2 = props,
80
- disabledItemsFocusable = _ref2.disabledItemsFocusable,
81
- expandedNodes = _ref2.expandedNodes,
82
- defaultExpandedNodes = _ref2.defaultExpandedNodes,
83
- onExpandedNodesChange = _ref2.onExpandedNodesChange,
84
- onNodeExpansionToggle = _ref2.onNodeExpansionToggle,
85
- onNodeFocus = _ref2.onNodeFocus,
86
- disableSelection = _ref2.disableSelection,
87
- defaultSelectedNodes = _ref2.defaultSelectedNodes,
88
- selectedNodes = _ref2.selectedNodes,
89
- multiSelect = _ref2.multiSelect,
90
- onSelectedNodesChange = _ref2.onSelectedNodesChange,
91
- onNodeSelectionToggle = _ref2.onNodeSelectionToggle,
92
- treeId = _ref2.id,
93
- defaultCollapseIcon = _ref2.defaultCollapseIcon,
94
- defaultEndIcon = _ref2.defaultEndIcon,
95
- defaultExpandIcon = _ref2.defaultExpandIcon,
96
- defaultParentIcon = _ref2.defaultParentIcon,
97
- items = _ref2.items,
98
- getItemId = _ref2.getItemId,
99
- getItemLabel = _ref2.getItemLabel,
100
- isItemDisabled = _ref2.isItemDisabled,
101
- slots = _ref2.slots,
102
- slotProps = _ref2.slotProps,
103
- other = _objectWithoutProperties(_ref2, _excluded);
104
80
  if (process.env.NODE_ENV !== 'production') {
105
81
  if (props.children != null) {
106
82
  childrenWarning();
107
83
  }
108
84
  }
109
- var _useTreeView = useTreeView({
110
- disabledItemsFocusable: disabledItemsFocusable,
111
- expandedNodes: expandedNodes,
112
- defaultExpandedNodes: defaultExpandedNodes,
113
- onExpandedNodesChange: onExpandedNodesChange,
114
- onNodeExpansionToggle: onNodeExpansionToggle,
115
- onNodeFocus: onNodeFocus,
116
- disableSelection: disableSelection,
117
- defaultSelectedNodes: defaultSelectedNodes,
118
- selectedNodes: selectedNodes,
119
- multiSelect: multiSelect,
120
- onSelectedNodesChange: onSelectedNodesChange,
121
- onNodeSelectionToggle: onNodeSelectionToggle,
122
- id: treeId,
123
- defaultCollapseIcon: defaultCollapseIcon,
124
- defaultEndIcon: defaultEndIcon,
125
- defaultExpandIcon: defaultExpandIcon,
126
- defaultParentIcon: defaultParentIcon,
127
- items: items,
128
- getItemId: getItemId,
129
- getItemLabel: getItemLabel,
130
- isItemDisabled: isItemDisabled,
85
+ var _extractPluginParamsF = extractPluginParamsFromProps({
86
+ props: props,
131
87
  plugins: DEFAULT_TREE_VIEW_PLUGINS,
132
88
  rootRef: ref
133
89
  }),
90
+ pluginParams = _extractPluginParamsF.pluginParams,
91
+ _extractPluginParamsF2 = _extractPluginParamsF.otherProps,
92
+ slots = _extractPluginParamsF2.slots,
93
+ slotProps = _extractPluginParamsF2.slotProps,
94
+ otherProps = _objectWithoutProperties(_extractPluginParamsF2, _excluded);
95
+ var _useTreeView = useTreeView(pluginParams),
134
96
  getRootProps = _useTreeView.getRootProps,
135
97
  contextValue = _useTreeView.contextValue,
136
98
  instance = _useTreeView.instance;
@@ -139,17 +101,17 @@ var RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps,
139
101
  var rootProps = useSlotProps({
140
102
  elementType: Root,
141
103
  externalSlotProps: slotProps == null ? void 0 : slotProps.root,
142
- externalForwardedProps: other,
104
+ externalForwardedProps: otherProps,
143
105
  className: classes.root,
144
106
  getSlotProps: getRootProps,
145
107
  ownerState: props
146
108
  });
147
109
  var nodesToRender = instance.getNodesToRender();
148
- var renderNode = function renderNode(_ref3) {
149
- var label = _ref3.label,
150
- nodeId = _ref3.nodeId,
151
- id = _ref3.id,
152
- children = _ref3.children;
110
+ var renderNode = function renderNode(_ref2) {
111
+ var label = _ref2.label,
112
+ nodeId = _ref2.nodeId,
113
+ id = _ref2.id,
114
+ children = _ref2.children;
153
115
  return /*#__PURE__*/_jsx(WrappedTreeItem, {
154
116
  slots: slots,
155
117
  slotProps: slotProps,