@mui/x-tree-view 7.20.0 → 7.22.0
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.
- package/CHANGELOG.md +200 -31
- package/RichTreeView/RichTreeView.js +8 -8
- package/SimpleTreeView/SimpleTreeView.js +8 -8
- package/TreeItem/TreeItem.js +15 -14
- package/TreeItem/TreeItem.types.d.ts +8 -9
- package/TreeItem/TreeItemContent.d.ts +5 -5
- package/TreeItem/TreeItemContent.js +4 -4
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.d.ts +2 -2
- package/TreeItem2/TreeItem2.types.d.ts +4 -4
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
- package/TreeItem2LabelInput/TreeItem2LabelInput.types.d.ts +3 -3
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +8 -8
- package/index.js +1 -1
- package/internals/corePlugins/corePlugins.d.ts +1 -1
- package/internals/corePlugins/corePlugins.js +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/internals/index.d.ts +1 -1
- package/internals/models/index.d.ts +0 -1
- package/internals/models/index.js +1 -2
- package/internals/models/treeView.d.ts +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -2
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -1
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +2 -2
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -4
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +1 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +3 -3
- package/models/events.d.ts +4 -0
- package/models/index.d.ts +1 -0
- package/models/index.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +8 -8
- package/modern/SimpleTreeView/SimpleTreeView.js +8 -8
- package/modern/TreeItem/TreeItem.js +15 -14
- package/modern/TreeItem/TreeItemContent.js +4 -4
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/modern/TreeView/TreeView.js +8 -8
- package/modern/index.js +1 -1
- package/modern/internals/corePlugins/corePlugins.js +1 -1
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/modern/internals/models/index.js +1 -2
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/modern/models/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +11 -11
- package/node/RichTreeView/RichTreeView.js +8 -8
- package/node/SimpleTreeView/SimpleTreeView.js +8 -8
- package/node/TreeItem/TreeItem.js +15 -14
- package/node/TreeItem/TreeItemContent.js +4 -4
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/node/TreeView/TreeView.js +8 -8
- package/node/index.js +1 -1
- package/node/internals/corePlugins/corePlugins.js +1 -1
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/node/internals/models/index.js +0 -11
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/node/models/index.js +11 -0
- package/node/useTreeItem2/useTreeItem2.js +11 -11
- package/package.json +2 -2
- package/useTreeItem2/useTreeItem2.js +11 -11
- package/useTreeItem2/useTreeItem2.types.d.ts +11 -11
- package/internals/models/MuiCancellableEvent.d.ts +0 -4
- /package/{internals/models/MuiCancellableEvent.js → models/events.js} +0 -0
- /package/modern/{internals/models/MuiCancellableEvent.js → models/events.js} +0 -0
- /package/node/{internals/models/MuiCancellableEvent.js → models/events.js} +0 -0
|
@@ -80,19 +80,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
80
80
|
*/
|
|
81
81
|
multiSelect?: Multiple;
|
|
82
82
|
/**
|
|
83
|
-
* If `true`, the
|
|
83
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
84
84
|
* @default false
|
|
85
85
|
*/
|
|
86
86
|
checkboxSelection?: boolean;
|
|
87
87
|
/**
|
|
88
|
-
* Callback fired when
|
|
88
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
89
89
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
90
90
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
91
91
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
92
92
|
*/
|
|
93
93
|
onSelectedItemsChange?: (event: React.SyntheticEvent, itemIds: TreeViewSelectionValue<Multiple>) => void;
|
|
94
94
|
/**
|
|
95
|
-
* Callback fired when a
|
|
95
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
96
96
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
97
97
|
* @param {array} itemId The itemId of the modified item.
|
|
98
98
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
package/models/index.d.ts
CHANGED
package/models/index.js
CHANGED
|
@@ -51,7 +51,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
51
51
|
});
|
|
52
52
|
if (process.env.NODE_ENV !== 'production') {
|
|
53
53
|
if (props.children != null) {
|
|
54
|
-
warnOnce(['MUI X: The
|
|
54
|
+
warnOnce(['MUI X: The Rich Tree View 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://mui.com/x/react-tree-view/rich-tree-view/items/.']);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
const {
|
|
@@ -108,7 +108,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
108
108
|
})
|
|
109
109
|
}),
|
|
110
110
|
/**
|
|
111
|
-
* If `true`, the
|
|
111
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
112
112
|
* @default false
|
|
113
113
|
*/
|
|
114
114
|
checkboxSelection: PropTypes.bool,
|
|
@@ -211,26 +211,26 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
211
211
|
*/
|
|
212
212
|
multiSelect: PropTypes.bool,
|
|
213
213
|
/**
|
|
214
|
-
* Callback fired when
|
|
214
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
215
215
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
216
216
|
* @param {array} itemIds The ids of the expanded items.
|
|
217
217
|
*/
|
|
218
218
|
onExpandedItemsChange: PropTypes.func,
|
|
219
219
|
/**
|
|
220
|
-
* Callback fired when the `content` slot of a given
|
|
220
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
221
221
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
222
222
|
* @param {string} itemId The id of the focused item.
|
|
223
223
|
*/
|
|
224
224
|
onItemClick: PropTypes.func,
|
|
225
225
|
/**
|
|
226
|
-
* Callback fired when a
|
|
226
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
227
227
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
228
228
|
* @param {array} itemId The itemId of the modified item.
|
|
229
229
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
230
230
|
*/
|
|
231
231
|
onItemExpansionToggle: PropTypes.func,
|
|
232
232
|
/**
|
|
233
|
-
* Callback fired when a given
|
|
233
|
+
* Callback fired when a given Tree Item is focused.
|
|
234
234
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
235
235
|
* @param {string} itemId The id of the focused item.
|
|
236
236
|
*/
|
|
@@ -242,14 +242,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
242
242
|
*/
|
|
243
243
|
onItemLabelChange: PropTypes.func,
|
|
244
244
|
/**
|
|
245
|
-
* Callback fired when a
|
|
245
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
246
246
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
247
247
|
* @param {array} itemId The itemId of the modified item.
|
|
248
248
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
249
249
|
*/
|
|
250
250
|
onItemSelectionToggle: PropTypes.func,
|
|
251
251
|
/**
|
|
252
|
-
* Callback fired when
|
|
252
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
253
253
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
254
254
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
255
255
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
@@ -53,7 +53,7 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
|
|
|
53
53
|
const ownerState = props;
|
|
54
54
|
if (process.env.NODE_ENV !== 'production') {
|
|
55
55
|
if (props.items != null) {
|
|
56
|
-
warnOnce(['MUI X: The
|
|
56
|
+
warnOnce(['MUI X: The Simple Tree View component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/.']);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
const {
|
|
@@ -104,7 +104,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
104
104
|
})
|
|
105
105
|
}),
|
|
106
106
|
/**
|
|
107
|
-
* If `true`, the
|
|
107
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
108
108
|
* @default false
|
|
109
109
|
*/
|
|
110
110
|
checkboxSelection: PropTypes.bool,
|
|
@@ -174,39 +174,39 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
174
174
|
*/
|
|
175
175
|
multiSelect: PropTypes.bool,
|
|
176
176
|
/**
|
|
177
|
-
* Callback fired when
|
|
177
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
178
178
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
179
179
|
* @param {array} itemIds The ids of the expanded items.
|
|
180
180
|
*/
|
|
181
181
|
onExpandedItemsChange: PropTypes.func,
|
|
182
182
|
/**
|
|
183
|
-
* Callback fired when the `content` slot of a given
|
|
183
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
184
184
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
185
185
|
* @param {string} itemId The id of the focused item.
|
|
186
186
|
*/
|
|
187
187
|
onItemClick: PropTypes.func,
|
|
188
188
|
/**
|
|
189
|
-
* Callback fired when a
|
|
189
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
190
190
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
191
191
|
* @param {array} itemId The itemId of the modified item.
|
|
192
192
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
193
193
|
*/
|
|
194
194
|
onItemExpansionToggle: PropTypes.func,
|
|
195
195
|
/**
|
|
196
|
-
* Callback fired when a given
|
|
196
|
+
* Callback fired when a given Tree Item is focused.
|
|
197
197
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
198
198
|
* @param {string} itemId The id of the focused item.
|
|
199
199
|
*/
|
|
200
200
|
onItemFocus: PropTypes.func,
|
|
201
201
|
/**
|
|
202
|
-
* Callback fired when a
|
|
202
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
203
203
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
204
204
|
* @param {array} itemId The itemId of the modified item.
|
|
205
205
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
206
206
|
*/
|
|
207
207
|
onItemSelectionToggle: PropTypes.func,
|
|
208
208
|
/**
|
|
209
|
-
* Callback fired when
|
|
209
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
210
210
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
211
211
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
212
212
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
@@ -182,7 +182,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
182
182
|
indentationAtItemLevel
|
|
183
183
|
},
|
|
184
184
|
selection: {
|
|
185
|
-
|
|
185
|
+
disableSelection
|
|
186
186
|
},
|
|
187
187
|
expansion: {
|
|
188
188
|
expansionTrigger
|
|
@@ -318,17 +318,18 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
318
318
|
}),
|
|
319
319
|
iconProps = _objectWithoutPropertiesLoose(_useSlotProps3, _excluded4);
|
|
320
320
|
const icon = Icon ? /*#__PURE__*/_jsx(Icon, _extends({}, iconProps)) : null;
|
|
321
|
+
|
|
322
|
+
// https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
321
323
|
let ariaSelected;
|
|
322
|
-
if (
|
|
323
|
-
|
|
324
|
-
} else if (selected) {
|
|
325
|
-
/* single-selection trees unset aria-selected on un-selected items.
|
|
326
|
-
*
|
|
327
|
-
* If the tree does not support multiple selection, aria-selected
|
|
328
|
-
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
329
|
-
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
330
|
-
*/
|
|
324
|
+
if (selected) {
|
|
325
|
+
// - each selected node has aria-selected set to true.
|
|
331
326
|
ariaSelected = true;
|
|
327
|
+
} else if (disableSelection || disabled) {
|
|
328
|
+
// - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
|
|
329
|
+
ariaSelected = undefined;
|
|
330
|
+
} else {
|
|
331
|
+
// - all nodes that are selectable but not selected have aria-selected set to false.
|
|
332
|
+
ariaSelected = false;
|
|
332
333
|
}
|
|
333
334
|
function handleFocus(event) {
|
|
334
335
|
const canBeFocused = !disabled || disabledItemsFocusable;
|
|
@@ -339,7 +340,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
339
340
|
function handleBlur(event) {
|
|
340
341
|
onBlur?.(event);
|
|
341
342
|
if (editing ||
|
|
342
|
-
// we can exit the editing state by clicking outside the input (within the
|
|
343
|
+
// we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
|
|
343
344
|
// we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
|
|
344
345
|
event.relatedTarget && isTargetInDescendants(event.relatedTarget, rootRefObject.current) && (event.target && event.target?.dataset?.element === 'labelInput' && isTargetInDescendants(event.target, rootRefObject.current) || event.relatedTarget?.dataset?.element === 'labelInput')) {
|
|
345
346
|
return;
|
|
@@ -452,13 +453,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
452
453
|
className: PropTypes.string,
|
|
453
454
|
/**
|
|
454
455
|
* The component used to render the content of the item.
|
|
455
|
-
* @deprecated Consider using the
|
|
456
|
+
* @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
|
|
456
457
|
* @default TreeItemContent
|
|
457
458
|
*/
|
|
458
459
|
ContentComponent: elementTypeAcceptingRef,
|
|
459
460
|
/**
|
|
460
461
|
* Props applied to ContentComponent.
|
|
461
|
-
* @deprecated Consider using the
|
|
462
|
+
* @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
|
|
462
463
|
*/
|
|
463
464
|
ContentProps: PropTypes.object,
|
|
464
465
|
/**
|
|
@@ -471,7 +472,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
471
472
|
*/
|
|
472
473
|
itemId: PropTypes.string.isRequired,
|
|
473
474
|
/**
|
|
474
|
-
* The
|
|
475
|
+
* The Tree Item label.
|
|
475
476
|
*/
|
|
476
477
|
label: PropTypes.node,
|
|
477
478
|
/**
|
|
@@ -110,7 +110,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
110
110
|
classes: PropTypes.object.isRequired,
|
|
111
111
|
className: PropTypes.string,
|
|
112
112
|
/**
|
|
113
|
-
* The icon to display next to the
|
|
113
|
+
* The icon to display next to the Tree Item's label. Either a parent or end icon.
|
|
114
114
|
*/
|
|
115
115
|
displayIcon: PropTypes.node,
|
|
116
116
|
dragAndDropOverlayProps: PropTypes.shape({
|
|
@@ -118,11 +118,11 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
118
118
|
style: PropTypes.object
|
|
119
119
|
}),
|
|
120
120
|
/**
|
|
121
|
-
* The icon to display next to the
|
|
121
|
+
* The icon to display next to the Tree Item's label. Either an expansion or collapse icon.
|
|
122
122
|
*/
|
|
123
123
|
expansionIcon: PropTypes.node,
|
|
124
124
|
/**
|
|
125
|
-
* The icon to display next to the
|
|
125
|
+
* The icon to display next to the Tree Item's label.
|
|
126
126
|
*/
|
|
127
127
|
icon: PropTypes.node,
|
|
128
128
|
/**
|
|
@@ -130,7 +130,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
130
130
|
*/
|
|
131
131
|
itemId: PropTypes.string.isRequired,
|
|
132
132
|
/**
|
|
133
|
-
* The
|
|
133
|
+
* The Tree Item label.
|
|
134
134
|
*/
|
|
135
135
|
label: PropTypes.node,
|
|
136
136
|
labelInputProps: PropTypes.shape({
|
|
@@ -26,7 +26,7 @@ const TreeItem2DragAndDropOverlayRoot = styled('div', {
|
|
|
26
26
|
style: {
|
|
27
27
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
28
28
|
borderRadius: theme.shape.borderRadius,
|
|
29
|
-
backgroundColor:
|
|
29
|
+
backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.dark} / ${0.15})` : alpha(theme.palette.primary.dark, 0.15)
|
|
30
30
|
}
|
|
31
31
|
}, {
|
|
32
32
|
props: {
|
|
@@ -34,9 +34,9 @@ const TreeItem2DragAndDropOverlayRoot = styled('div', {
|
|
|
34
34
|
},
|
|
35
35
|
style: _extends({
|
|
36
36
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
37
|
-
borderTop: `1px solid ${
|
|
37
|
+
borderTop: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${alpha(theme.palette.grey[900], 0.6)}`
|
|
38
38
|
}, theme.applyStyles('dark', {
|
|
39
|
-
borderTopColor:
|
|
39
|
+
borderTopColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : alpha(theme.palette.grey[100], 0.6)
|
|
40
40
|
}))
|
|
41
41
|
}, {
|
|
42
42
|
props: {
|
|
@@ -44,9 +44,9 @@ const TreeItem2DragAndDropOverlayRoot = styled('div', {
|
|
|
44
44
|
},
|
|
45
45
|
style: _extends({
|
|
46
46
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * var(--TreeView-itemDepth))',
|
|
47
|
-
borderBottom: `1px solid ${
|
|
47
|
+
borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${alpha(theme.palette.grey[900], 0.6)}`
|
|
48
48
|
}, theme.applyStyles('dark', {
|
|
49
|
-
borderBottomColor:
|
|
49
|
+
borderBottomColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : alpha(theme.palette.grey[100], 0.6)
|
|
50
50
|
}))
|
|
51
51
|
}, {
|
|
52
52
|
props: {
|
|
@@ -54,9 +54,9 @@ const TreeItem2DragAndDropOverlayRoot = styled('div', {
|
|
|
54
54
|
},
|
|
55
55
|
style: _extends({
|
|
56
56
|
marginLeft: 'calc(var(--TreeView-indentMultiplier) * calc(var(--TreeView-itemDepth) - 1))',
|
|
57
|
-
borderBottom: `1px solid ${
|
|
57
|
+
borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.grey[900]} / ${0.6})` : `1px solid ${alpha(theme.palette.grey[900], 0.6)}`
|
|
58
58
|
}, theme.applyStyles('dark', {
|
|
59
|
-
borderBottomColor:
|
|
59
|
+
borderBottomColor: theme.vars ? `rgba(${theme.vars.palette.grey[100]} / ${0.6})` : alpha(theme.palette.grey[100], 0.6)
|
|
60
60
|
}))
|
|
61
61
|
}]
|
|
62
62
|
}));
|
|
@@ -32,7 +32,7 @@ const warn = () => {
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
* This component has been deprecated in favor of the new
|
|
35
|
+
* This component has been deprecated in favor of the new Simple Tree View component.
|
|
36
36
|
* You can have a look at how to migrate to the new component in the v7 [migration guide](https://mui.com/x/migration/migration-tree-view-v6/#use-simpletreeview-instead-of-treeview)
|
|
37
37
|
*
|
|
38
38
|
* Demos:
|
|
@@ -82,7 +82,7 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
82
82
|
})
|
|
83
83
|
}),
|
|
84
84
|
/**
|
|
85
|
-
* If `true`, the
|
|
85
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
86
86
|
* @default false
|
|
87
87
|
*/
|
|
88
88
|
checkboxSelection: PropTypes.bool,
|
|
@@ -152,39 +152,39 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
152
152
|
*/
|
|
153
153
|
multiSelect: PropTypes.bool,
|
|
154
154
|
/**
|
|
155
|
-
* Callback fired when
|
|
155
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
156
156
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
157
157
|
* @param {array} itemIds The ids of the expanded items.
|
|
158
158
|
*/
|
|
159
159
|
onExpandedItemsChange: PropTypes.func,
|
|
160
160
|
/**
|
|
161
|
-
* Callback fired when the `content` slot of a given
|
|
161
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
162
162
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
163
163
|
* @param {string} itemId The id of the focused item.
|
|
164
164
|
*/
|
|
165
165
|
onItemClick: PropTypes.func,
|
|
166
166
|
/**
|
|
167
|
-
* Callback fired when a
|
|
167
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
168
168
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
169
169
|
* @param {array} itemId The itemId of the modified item.
|
|
170
170
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
171
171
|
*/
|
|
172
172
|
onItemExpansionToggle: PropTypes.func,
|
|
173
173
|
/**
|
|
174
|
-
* Callback fired when a given
|
|
174
|
+
* Callback fired when a given Tree Item is focused.
|
|
175
175
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
176
176
|
* @param {string} itemId The id of the focused item.
|
|
177
177
|
*/
|
|
178
178
|
onItemFocus: PropTypes.func,
|
|
179
179
|
/**
|
|
180
|
-
* Callback fired when a
|
|
180
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
181
181
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
182
182
|
* @param {array} itemId The itemId of the modified item.
|
|
183
183
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
184
184
|
*/
|
|
185
185
|
onItemSelectionToggle: PropTypes.func,
|
|
186
186
|
/**
|
|
187
|
-
* Callback fired when
|
|
187
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
188
188
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
189
189
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
190
190
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
package/modern/index.js
CHANGED
|
@@ -3,6 +3,6 @@ import { useTreeViewOptionalPlugins } from "./useTreeViewOptionalPlugins/index.j
|
|
|
3
3
|
import { useTreeViewId } from "./useTreeViewId/index.js";
|
|
4
4
|
/**
|
|
5
5
|
* Internal plugins that create the tools used by the other plugins.
|
|
6
|
-
* These plugins are used by the
|
|
6
|
+
* These plugins are used by the Tree View components.
|
|
7
7
|
*/
|
|
8
8
|
export const TREE_VIEW_CORE_PLUGINS = [useTreeViewInstanceEvents, useTreeViewOptionalPlugins, useTreeViewId];
|
|
@@ -6,10 +6,9 @@ export const useTreeViewId = ({
|
|
|
6
6
|
state,
|
|
7
7
|
setState
|
|
8
8
|
}) => {
|
|
9
|
-
const treeId = state.id.treeId;
|
|
10
9
|
React.useEffect(() => {
|
|
11
10
|
setState(prevState => {
|
|
12
|
-
if (prevState.id.treeId === params.id) {
|
|
11
|
+
if (prevState.id.treeId === params.id && prevState.id.treeId !== undefined) {
|
|
13
12
|
return prevState;
|
|
14
13
|
}
|
|
15
14
|
return _extends({}, prevState, {
|
|
@@ -19,6 +18,7 @@ export const useTreeViewId = ({
|
|
|
19
18
|
});
|
|
20
19
|
});
|
|
21
20
|
}, [setState, params.id]);
|
|
21
|
+
const treeId = params.id ?? state.id.treeId;
|
|
22
22
|
return {
|
|
23
23
|
getRootProps: () => ({
|
|
24
24
|
id: treeId
|
|
@@ -35,6 +35,6 @@ useTreeViewId.getInitialState = ({
|
|
|
35
35
|
id
|
|
36
36
|
}) => ({
|
|
37
37
|
id: {
|
|
38
|
-
treeId: id ??
|
|
38
|
+
treeId: id ?? undefined
|
|
39
39
|
}
|
|
40
40
|
});
|
|
@@ -5,7 +5,7 @@ export const createTreeViewDefaultId = () => {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a
|
|
8
|
+
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
|
|
9
9
|
* If the user explicitly defined an id attribute, it will be returned.
|
|
10
10
|
* Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
|
|
11
11
|
* @param {object} params The parameters to determine the id attribute of the item.
|
|
@@ -25,7 +25,7 @@ export const useTreeViewJSXItems = ({
|
|
|
25
25
|
itemMetaMap: _extends({}, prevState.items.itemMetaMap, {
|
|
26
26
|
[item.id]: item
|
|
27
27
|
}),
|
|
28
|
-
// For
|
|
28
|
+
// For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
|
|
29
29
|
itemMap: _extends({}, prevState.items.itemMap, {
|
|
30
30
|
[item.id]: {
|
|
31
31
|
id: item.id,
|
package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -4,7 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
|
|
|
4
4
|
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
|
|
5
5
|
import { hasPlugin } from "../../utils/plugins.js";
|
|
6
6
|
import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
|
|
7
|
-
function
|
|
7
|
+
function isPrintableKey(string) {
|
|
8
8
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
9
9
|
}
|
|
10
10
|
export const useTreeViewKeyboardNavigation = ({
|
|
@@ -227,7 +227,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
227
227
|
|
|
228
228
|
// Multi select behavior when pressing Ctrl + a
|
|
229
229
|
// Selects all the items
|
|
230
|
-
case
|
|
230
|
+
case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && params.multiSelect && !params.disableSelection:
|
|
231
231
|
{
|
|
232
232
|
instance.selectAllNavigableItems(event);
|
|
233
233
|
event.preventDefault();
|
|
@@ -236,7 +236,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
236
236
|
|
|
237
237
|
// Type-ahead
|
|
238
238
|
// TODO: Support typing multiple characters
|
|
239
|
-
case !ctrlPressed && !event.shiftKey &&
|
|
239
|
+
case !ctrlPressed && !event.shiftKey && isPrintableKey(key):
|
|
240
240
|
{
|
|
241
241
|
const matchingItem = getFirstMatchingItem(itemId, key);
|
|
242
242
|
if (matchingItem != null) {
|
|
@@ -73,7 +73,7 @@ useTreeViewLabel.getDefaultizedParams = ({
|
|
|
73
73
|
const canUseFeature = experimentalFeatures?.labelEditing;
|
|
74
74
|
if (process.env.NODE_ENV !== 'production') {
|
|
75
75
|
if (params.isItemEditable && !canUseFeature) {
|
|
76
|
-
warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the
|
|
76
|
+
warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/editing/']);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
return _extends({}, params, {
|
package/modern/models/index.js
CHANGED
|
@@ -16,7 +16,6 @@ export const useTreeItem2 = parameters => {
|
|
|
16
16
|
indentationAtItemLevel
|
|
17
17
|
},
|
|
18
18
|
selection: {
|
|
19
|
-
multiSelect,
|
|
20
19
|
disableSelection,
|
|
21
20
|
checkboxSelection
|
|
22
21
|
},
|
|
@@ -84,7 +83,7 @@ export const useTreeItem2 = parameters => {
|
|
|
84
83
|
// the input that triggers the root blur can be either the relatedTarget (when entering editing state) or the target (when exiting editing state)
|
|
85
84
|
// when we enter the editing state, we focus the input -> we don't want to remove the focused item from the state
|
|
86
85
|
if (status.editing ||
|
|
87
|
-
// we can exit the editing state by clicking outside the input (within the
|
|
86
|
+
// we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
|
|
88
87
|
// we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
|
|
89
88
|
event.relatedTarget && isTargetInDescendants(event.relatedTarget, rootElement) && (event.target && event.target?.dataset?.element === 'labelInput' && isTargetInDescendants(event.target, rootElement) || event.relatedTarget?.dataset?.element === 'labelInput')) {
|
|
90
89
|
return;
|
|
@@ -150,17 +149,18 @@ export const useTreeItem2 = parameters => {
|
|
|
150
149
|
};
|
|
151
150
|
const getRootProps = (externalProps = {}) => {
|
|
152
151
|
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
152
|
+
|
|
153
|
+
// https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
153
154
|
let ariaSelected;
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
} else if (status.selected) {
|
|
157
|
-
/* single-selection trees unset aria-selected on un-selected items.
|
|
158
|
-
*
|
|
159
|
-
* If the tree does not support multiple selection, aria-selected
|
|
160
|
-
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
161
|
-
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
162
|
-
*/
|
|
155
|
+
if (status.selected) {
|
|
156
|
+
// - each selected node has aria-selected set to true.
|
|
163
157
|
ariaSelected = true;
|
|
158
|
+
} else if (disableSelection || status.disabled) {
|
|
159
|
+
// - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
|
|
160
|
+
ariaSelected = undefined;
|
|
161
|
+
} else {
|
|
162
|
+
// - all nodes that are selectable but not selected have aria-selected set to false.
|
|
163
|
+
ariaSelected = false;
|
|
164
164
|
}
|
|
165
165
|
const props = _extends({}, externalEventHandlers, {
|
|
166
166
|
ref: handleRootRef,
|
|
@@ -58,7 +58,7 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
|
|
|
58
58
|
});
|
|
59
59
|
if (process.env.NODE_ENV !== 'production') {
|
|
60
60
|
if (props.children != null) {
|
|
61
|
-
(0, _warning.warnOnce)(['MUI X: The
|
|
61
|
+
(0, _warning.warnOnce)(['MUI X: The Rich Tree View 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://mui.com/x/react-tree-view/rich-tree-view/items/.']);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
const {
|
|
@@ -115,7 +115,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
115
115
|
})
|
|
116
116
|
}),
|
|
117
117
|
/**
|
|
118
|
-
* If `true`, the
|
|
118
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
119
119
|
* @default false
|
|
120
120
|
*/
|
|
121
121
|
checkboxSelection: _propTypes.default.bool,
|
|
@@ -218,26 +218,26 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
218
218
|
*/
|
|
219
219
|
multiSelect: _propTypes.default.bool,
|
|
220
220
|
/**
|
|
221
|
-
* Callback fired when
|
|
221
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
222
222
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
223
223
|
* @param {array} itemIds The ids of the expanded items.
|
|
224
224
|
*/
|
|
225
225
|
onExpandedItemsChange: _propTypes.default.func,
|
|
226
226
|
/**
|
|
227
|
-
* Callback fired when the `content` slot of a given
|
|
227
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
228
228
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
229
229
|
* @param {string} itemId The id of the focused item.
|
|
230
230
|
*/
|
|
231
231
|
onItemClick: _propTypes.default.func,
|
|
232
232
|
/**
|
|
233
|
-
* Callback fired when a
|
|
233
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
234
234
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
235
235
|
* @param {array} itemId The itemId of the modified item.
|
|
236
236
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
237
237
|
*/
|
|
238
238
|
onItemExpansionToggle: _propTypes.default.func,
|
|
239
239
|
/**
|
|
240
|
-
* Callback fired when a given
|
|
240
|
+
* Callback fired when a given Tree Item is focused.
|
|
241
241
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
242
242
|
* @param {string} itemId The id of the focused item.
|
|
243
243
|
*/
|
|
@@ -249,14 +249,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
249
249
|
*/
|
|
250
250
|
onItemLabelChange: _propTypes.default.func,
|
|
251
251
|
/**
|
|
252
|
-
* Callback fired when a
|
|
252
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
253
253
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
254
254
|
* @param {array} itemId The itemId of the modified item.
|
|
255
255
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
256
256
|
*/
|
|
257
257
|
onItemSelectionToggle: _propTypes.default.func,
|
|
258
258
|
/**
|
|
259
|
-
* Callback fired when
|
|
259
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
260
260
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
261
261
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
262
262
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|