@mui/x-tree-view 7.0.0-beta.7 → 7.0.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 +195 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +12 -14
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +3 -4
- package/TreeItem/TreeItem.js +43 -35
- package/TreeItem/TreeItem.types.d.ts +3 -3
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.js +16 -17
- package/TreeItem2Icon/TreeItem2Icon.js +5 -6
- package/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +1 -1
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/index.js +1 -1
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +11 -18
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +3 -3
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +59 -43
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -5
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -18
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +70 -77
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +24 -29
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -21
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +4 -4
- package/internals/useTreeView/useTreeView.js +5 -6
- package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
- package/internals/useTreeView/useTreeView.utils.js +22 -22
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +7 -7
- package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
- package/modern/TreeItem/TreeItem.js +31 -22
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +11 -11
- package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/modern/TreeView/TreeView.js +1 -1
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/modern/index.js +1 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
- package/modern/internals/useTreeView/useTreeView.js +3 -4
- package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +23 -12
- package/node/RichTreeView/RichTreeView.js +7 -7
- package/node/SimpleTreeView/SimpleTreeView.js +1 -1
- package/node/TreeItem/TreeItem.js +31 -22
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +11 -11
- package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/node/TreeView/TreeView.js +1 -1
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/node/index.js +1 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
- package/node/internals/useTreeView/useTreeView.js +3 -4
- package/node/internals/useTreeView/useTreeView.utils.js +22 -22
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/useTreeItem2.js +23 -12
- package/package.json +5 -5
- package/useTreeItem2/useTreeItem2.js +26 -18
- package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
|
@@ -40,7 +40,7 @@ const SimpleTreeViewRoot = exports.SimpleTreeViewRoot = (0, _styles.styled)('ul'
|
|
|
40
40
|
outline: 0
|
|
41
41
|
});
|
|
42
42
|
const EMPTY_ITEMS = [];
|
|
43
|
-
const itemsPropWarning = (0, _warning.buildWarning)(['MUI X: The `SimpleTreeView` 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://
|
|
43
|
+
const itemsPropWarning = (0, _warning.buildWarning)(['MUI X: The `SimpleTreeView` 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/']);
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
*
|
|
@@ -23,7 +23,7 @@ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewCont
|
|
|
23
23
|
var _icons = require("../icons");
|
|
24
24
|
var _TreeItem2Provider = require("../TreeItem2Provider");
|
|
25
25
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
26
|
-
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "
|
|
26
|
+
const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
|
|
27
27
|
_excluded2 = ["ownerState"],
|
|
28
28
|
_excluded3 = ["ownerState"],
|
|
29
29
|
_excluded4 = ["ownerState"];
|
|
@@ -165,11 +165,13 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
165
165
|
slotProps: inSlotProps,
|
|
166
166
|
ContentComponent = _TreeItemContent.TreeItemContent,
|
|
167
167
|
ContentProps,
|
|
168
|
-
|
|
168
|
+
itemId,
|
|
169
169
|
id,
|
|
170
170
|
label,
|
|
171
171
|
onClick,
|
|
172
|
-
onMouseDown
|
|
172
|
+
onMouseDown,
|
|
173
|
+
onBlur,
|
|
174
|
+
onKeyDown
|
|
173
175
|
} = props,
|
|
174
176
|
other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
|
|
175
177
|
const {
|
|
@@ -192,10 +194,10 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
192
194
|
return Boolean(reactChildren);
|
|
193
195
|
};
|
|
194
196
|
const expandable = isExpandable(children);
|
|
195
|
-
const expanded = instance.isNodeExpanded(
|
|
196
|
-
const focused = instance.isNodeFocused(
|
|
197
|
-
const selected = instance.isNodeSelected(
|
|
198
|
-
const disabled = instance.isNodeDisabled(
|
|
197
|
+
const expanded = instance.isNodeExpanded(itemId);
|
|
198
|
+
const focused = instance.isNodeFocused(itemId);
|
|
199
|
+
const selected = instance.isNodeSelected(itemId);
|
|
200
|
+
const disabled = instance.isNodeDisabled(itemId);
|
|
199
201
|
const ownerState = (0, _extends2.default)({}, props, {
|
|
200
202
|
expanded,
|
|
201
203
|
focused,
|
|
@@ -257,24 +259,29 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
257
259
|
/* single-selection trees unset aria-selected on un-selected items.
|
|
258
260
|
*
|
|
259
261
|
* If the tree does not support multiple selection, aria-selected
|
|
260
|
-
* is set to true for the selected
|
|
262
|
+
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
261
263
|
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
262
264
|
*/
|
|
263
265
|
ariaSelected = true;
|
|
264
266
|
}
|
|
265
267
|
function handleFocus(event) {
|
|
266
|
-
// DOM focus stays on the tree which manages focus with aria-activedescendant
|
|
267
|
-
if (event.target === event.currentTarget) {
|
|
268
|
-
instance.focusRoot();
|
|
269
|
-
}
|
|
270
268
|
const canBeFocused = !disabled || disabledItemsFocusable;
|
|
271
269
|
if (!focused && canBeFocused && event.currentTarget === event.target) {
|
|
272
|
-
instance.focusItem(event,
|
|
270
|
+
instance.focusItem(event, itemId);
|
|
273
271
|
}
|
|
274
272
|
}
|
|
275
|
-
|
|
273
|
+
function handleBlur(event) {
|
|
274
|
+
onBlur?.(event);
|
|
275
|
+
instance.removeFocusedItem();
|
|
276
|
+
}
|
|
277
|
+
const handleKeyDown = event => {
|
|
278
|
+
onKeyDown?.(event);
|
|
279
|
+
instance.handleItemKeyDown(event, itemId);
|
|
280
|
+
};
|
|
281
|
+
const idAttribute = instance.getTreeItemId(itemId, id);
|
|
282
|
+
const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
|
|
276
283
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2Provider.TreeItem2Provider, {
|
|
277
|
-
|
|
284
|
+
itemId: itemId,
|
|
278
285
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(TreeItemRoot, (0, _extends2.default)({
|
|
279
286
|
className: (0, _clsx.default)(classes.root, className),
|
|
280
287
|
role: "treeitem",
|
|
@@ -282,10 +289,12 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
282
289
|
"aria-selected": ariaSelected,
|
|
283
290
|
"aria-disabled": disabled || undefined,
|
|
284
291
|
id: idAttribute,
|
|
285
|
-
tabIndex:
|
|
292
|
+
tabIndex: tabIndex
|
|
286
293
|
}, other, {
|
|
287
294
|
ownerState: ownerState,
|
|
288
295
|
onFocus: handleFocus,
|
|
296
|
+
onBlur: handleBlur,
|
|
297
|
+
onKeyDown: handleKeyDown,
|
|
289
298
|
ref: handleRootRef,
|
|
290
299
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(StyledTreeItemContent, (0, _extends2.default)({
|
|
291
300
|
as: ContentComponent,
|
|
@@ -299,7 +308,7 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
299
308
|
label: classes.label
|
|
300
309
|
},
|
|
301
310
|
label: label,
|
|
302
|
-
|
|
311
|
+
itemId: itemId,
|
|
303
312
|
onClick: onClick,
|
|
304
313
|
onMouseDown: onMouseDown,
|
|
305
314
|
icon: icon,
|
|
@@ -331,7 +340,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
331
340
|
classes: _propTypes.default.object,
|
|
332
341
|
className: _propTypes.default.string,
|
|
333
342
|
/**
|
|
334
|
-
* The component used
|
|
343
|
+
* The component used to render the content of the item.
|
|
335
344
|
* @default TreeItemContent
|
|
336
345
|
*/
|
|
337
346
|
ContentComponent: _elementTypeAcceptingRef.default,
|
|
@@ -345,13 +354,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
345
354
|
*/
|
|
346
355
|
disabled: _propTypes.default.bool,
|
|
347
356
|
/**
|
|
348
|
-
* The
|
|
357
|
+
* The id of the item.
|
|
349
358
|
*/
|
|
350
|
-
|
|
359
|
+
itemId: _propTypes.default.string.isRequired,
|
|
351
360
|
/**
|
|
352
|
-
* The
|
|
361
|
+
* The tree item label.
|
|
353
362
|
*/
|
|
354
|
-
|
|
363
|
+
label: _propTypes.default.node,
|
|
355
364
|
/**
|
|
356
365
|
* This prop isn't supported.
|
|
357
366
|
* Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
|
|
@@ -12,7 +12,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
12
12
|
var _clsx = _interopRequireDefault(require("clsx"));
|
|
13
13
|
var _useTreeItemState = require("./useTreeItemState");
|
|
14
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
-
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "
|
|
15
|
+
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
|
|
16
16
|
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); }
|
|
17
17
|
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; }
|
|
18
18
|
/**
|
|
@@ -26,7 +26,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
|
|
|
26
26
|
expansionIcon,
|
|
27
27
|
icon: iconProp,
|
|
28
28
|
label,
|
|
29
|
-
|
|
29
|
+
itemId,
|
|
30
30
|
onClick,
|
|
31
31
|
onMouseDown
|
|
32
32
|
} = props,
|
|
@@ -39,7 +39,7 @@ const TreeItemContent = exports.TreeItemContent = /*#__PURE__*/React.forwardRef(
|
|
|
39
39
|
handleExpansion,
|
|
40
40
|
handleSelection,
|
|
41
41
|
preventSelection
|
|
42
|
-
} = (0, _useTreeItemState.useTreeItemState)(
|
|
42
|
+
} = (0, _useTreeItemState.useTreeItemState)(itemId);
|
|
43
43
|
const icon = iconProp || expansionIcon || displayIcon;
|
|
44
44
|
const handleMouseDown = event => {
|
|
45
45
|
preventSelection(event);
|
|
@@ -83,23 +83,23 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
83
83
|
classes: _propTypes.default.object.isRequired,
|
|
84
84
|
className: _propTypes.default.string,
|
|
85
85
|
/**
|
|
86
|
-
* The icon to display next to the tree
|
|
86
|
+
* The icon to display next to the tree item's label. Either a parent or end icon.
|
|
87
87
|
*/
|
|
88
88
|
displayIcon: _propTypes.default.node,
|
|
89
89
|
/**
|
|
90
|
-
* The icon to display next to the tree
|
|
90
|
+
* The icon to display next to the tree item's label. Either an expansion or collapse icon.
|
|
91
91
|
*/
|
|
92
92
|
expansionIcon: _propTypes.default.node,
|
|
93
93
|
/**
|
|
94
|
-
* The icon to display next to the tree
|
|
94
|
+
* The icon to display next to the tree item's label.
|
|
95
95
|
*/
|
|
96
96
|
icon: _propTypes.default.node,
|
|
97
97
|
/**
|
|
98
|
-
* The
|
|
98
|
+
* The id of the item.
|
|
99
99
|
*/
|
|
100
|
-
|
|
100
|
+
itemId: _propTypes.default.string.isRequired,
|
|
101
101
|
/**
|
|
102
|
-
* The
|
|
102
|
+
* The tree item label.
|
|
103
103
|
*/
|
|
104
|
-
|
|
104
|
+
label: _propTypes.default.node
|
|
105
105
|
} : void 0;
|
|
@@ -5,47 +5,47 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useTreeItemState = useTreeItemState;
|
|
7
7
|
var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
|
|
8
|
-
function useTreeItemState(
|
|
8
|
+
function useTreeItemState(itemId) {
|
|
9
9
|
const {
|
|
10
10
|
instance,
|
|
11
11
|
selection: {
|
|
12
12
|
multiSelect
|
|
13
13
|
}
|
|
14
14
|
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
15
|
-
const expandable = instance.isNodeExpandable(
|
|
16
|
-
const expanded = instance.isNodeExpanded(
|
|
17
|
-
const focused = instance.isNodeFocused(
|
|
18
|
-
const selected = instance.isNodeSelected(
|
|
19
|
-
const disabled = instance.isNodeDisabled(
|
|
15
|
+
const expandable = instance.isNodeExpandable(itemId);
|
|
16
|
+
const expanded = instance.isNodeExpanded(itemId);
|
|
17
|
+
const focused = instance.isNodeFocused(itemId);
|
|
18
|
+
const selected = instance.isNodeSelected(itemId);
|
|
19
|
+
const disabled = instance.isNodeDisabled(itemId);
|
|
20
20
|
const handleExpansion = event => {
|
|
21
21
|
if (!disabled) {
|
|
22
22
|
if (!focused) {
|
|
23
|
-
instance.focusItem(event,
|
|
23
|
+
instance.focusItem(event, itemId);
|
|
24
24
|
}
|
|
25
25
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
26
26
|
|
|
27
27
|
// If already expanded and trying to toggle selection don't close
|
|
28
|
-
if (expandable && !(multiple && instance.isNodeExpanded(
|
|
29
|
-
instance.toggleNodeExpansion(event,
|
|
28
|
+
if (expandable && !(multiple && instance.isNodeExpanded(itemId))) {
|
|
29
|
+
instance.toggleNodeExpansion(event, itemId);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
const handleSelection = event => {
|
|
34
34
|
if (!disabled) {
|
|
35
35
|
if (!focused) {
|
|
36
|
-
instance.focusItem(event,
|
|
36
|
+
instance.focusItem(event, itemId);
|
|
37
37
|
}
|
|
38
38
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
39
39
|
if (multiple) {
|
|
40
40
|
if (event.shiftKey) {
|
|
41
41
|
instance.selectRange(event, {
|
|
42
|
-
end:
|
|
42
|
+
end: itemId
|
|
43
43
|
});
|
|
44
44
|
} else {
|
|
45
|
-
instance.selectNode(event,
|
|
45
|
+
instance.selectNode(event, itemId, true);
|
|
46
46
|
}
|
|
47
47
|
} else {
|
|
48
|
-
instance.selectNode(event,
|
|
48
|
+
instance.selectNode(event, itemId);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
};
|
|
@@ -21,7 +21,7 @@ var _TreeItem = require("../TreeItem");
|
|
|
21
21
|
var _TreeItem2Icon = require("../TreeItem2Icon");
|
|
22
22
|
var _TreeItem2Provider = require("../TreeItem2Provider");
|
|
23
23
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
24
|
-
const _excluded = ["id", "
|
|
24
|
+
const _excluded = ["id", "itemId", "label", "disabled", "children", "slots", "slotProps"];
|
|
25
25
|
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); }
|
|
26
26
|
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; }
|
|
27
27
|
const TreeItem2Root = exports.TreeItem2Root = (0, _styles.styled)('li', {
|
|
@@ -173,7 +173,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
|
|
|
173
173
|
});
|
|
174
174
|
const {
|
|
175
175
|
id,
|
|
176
|
-
|
|
176
|
+
itemId,
|
|
177
177
|
label,
|
|
178
178
|
disabled,
|
|
179
179
|
children,
|
|
@@ -190,7 +190,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
|
|
|
190
190
|
status
|
|
191
191
|
} = (0, _useTreeItem.unstable_useTreeItem2)({
|
|
192
192
|
id,
|
|
193
|
-
|
|
193
|
+
itemId,
|
|
194
194
|
children,
|
|
195
195
|
label,
|
|
196
196
|
disabled
|
|
@@ -242,7 +242,7 @@ const TreeItem2 = exports.TreeItem2 = /*#__PURE__*/React.forwardRef(function Tre
|
|
|
242
242
|
className: classes.groupTransition
|
|
243
243
|
});
|
|
244
244
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeItem2Provider.TreeItem2Provider, {
|
|
245
|
-
|
|
245
|
+
itemId: itemId,
|
|
246
246
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, (0, _extends2.default)({}, rootProps, {
|
|
247
247
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Content, (0, _extends2.default)({}, contentProps, {
|
|
248
248
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(IconContainer, (0, _extends2.default)({}, iconContainerProps, {
|
|
@@ -273,23 +273,23 @@ process.env.NODE_ENV !== "production" ? TreeItem2.propTypes = {
|
|
|
273
273
|
classes: _propTypes.default.object,
|
|
274
274
|
className: _propTypes.default.string,
|
|
275
275
|
/**
|
|
276
|
-
* If `true`, the
|
|
276
|
+
* If `true`, the item is disabled.
|
|
277
277
|
* @default false
|
|
278
278
|
*/
|
|
279
279
|
disabled: _propTypes.default.bool,
|
|
280
280
|
/**
|
|
281
|
-
* The id attribute of the
|
|
281
|
+
* The id attribute of the item. If not provided, it will be generated.
|
|
282
282
|
*/
|
|
283
283
|
id: _propTypes.default.string,
|
|
284
284
|
/**
|
|
285
|
-
* The
|
|
285
|
+
* The id of the item.
|
|
286
|
+
* Must be unique.
|
|
286
287
|
*/
|
|
287
|
-
|
|
288
|
+
itemId: _propTypes.default.string.isRequired,
|
|
288
289
|
/**
|
|
289
|
-
* The
|
|
290
|
-
* Must be unique.
|
|
290
|
+
* The label of the item.
|
|
291
291
|
*/
|
|
292
|
-
|
|
292
|
+
label: _propTypes.default.node,
|
|
293
293
|
/**
|
|
294
294
|
* This prop isn't supported.
|
|
295
295
|
* Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
|
|
@@ -10,14 +10,14 @@ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewCont
|
|
|
10
10
|
function TreeItem2Provider(props) {
|
|
11
11
|
const {
|
|
12
12
|
children,
|
|
13
|
-
|
|
13
|
+
itemId
|
|
14
14
|
} = props;
|
|
15
15
|
const {
|
|
16
16
|
wrapItem
|
|
17
17
|
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
18
18
|
return wrapItem({
|
|
19
19
|
children,
|
|
20
|
-
|
|
20
|
+
itemId
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
TreeItem2Provider.propTypes = {
|
|
@@ -26,5 +26,5 @@ TreeItem2Provider.propTypes = {
|
|
|
26
26
|
// | To update them edit the TypeScript types and run "yarn proptypes" |
|
|
27
27
|
// ----------------------------------------------------------------------
|
|
28
28
|
children: _propTypes.default.node,
|
|
29
|
-
|
|
29
|
+
itemId: _propTypes.default.string.isRequired
|
|
30
30
|
};
|
|
@@ -39,7 +39,7 @@ const warn = () => {
|
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* This component has been deprecated in favor of the new `SimpleTreeView` component.
|
|
42
|
-
* You can have a look at how to migrate to the new component in the v7 [migration guide](https://
|
|
42
|
+
* 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)
|
|
43
43
|
*
|
|
44
44
|
* Demos:
|
|
45
45
|
*
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useTreeItem2Utils = void 0;
|
|
7
7
|
var _useTreeViewContext = require("../../internals/TreeViewProvider/useTreeViewContext");
|
|
8
8
|
const useTreeItem2Utils = ({
|
|
9
|
-
|
|
9
|
+
itemId,
|
|
10
10
|
children
|
|
11
11
|
}) => {
|
|
12
12
|
const {
|
|
@@ -17,23 +17,23 @@ const useTreeItem2Utils = ({
|
|
|
17
17
|
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
18
18
|
const status = {
|
|
19
19
|
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
20
|
-
expanded: instance.isNodeExpanded(
|
|
21
|
-
focused: instance.isNodeFocused(
|
|
22
|
-
selected: instance.isNodeSelected(
|
|
23
|
-
disabled: instance.isNodeDisabled(
|
|
20
|
+
expanded: instance.isNodeExpanded(itemId),
|
|
21
|
+
focused: instance.isNodeFocused(itemId),
|
|
22
|
+
selected: instance.isNodeSelected(itemId),
|
|
23
|
+
disabled: instance.isNodeDisabled(itemId)
|
|
24
24
|
};
|
|
25
25
|
const handleExpansion = event => {
|
|
26
26
|
if (status.disabled) {
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
29
|
if (!status.focused) {
|
|
30
|
-
instance.focusItem(event,
|
|
30
|
+
instance.focusItem(event, itemId);
|
|
31
31
|
}
|
|
32
32
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
33
33
|
|
|
34
34
|
// If already expanded and trying to toggle selection don't close
|
|
35
|
-
if (status.expandable && !(multiple && instance.isNodeExpanded(
|
|
36
|
-
instance.toggleNodeExpansion(event,
|
|
35
|
+
if (status.expandable && !(multiple && instance.isNodeExpanded(itemId))) {
|
|
36
|
+
instance.toggleNodeExpansion(event, itemId);
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
const handleSelection = event => {
|
|
@@ -41,19 +41,19 @@ const useTreeItem2Utils = ({
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
if (!status.focused) {
|
|
44
|
-
instance.focusItem(event,
|
|
44
|
+
instance.focusItem(event, itemId);
|
|
45
45
|
}
|
|
46
46
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
47
47
|
if (multiple) {
|
|
48
48
|
if (event.shiftKey) {
|
|
49
49
|
instance.selectRange(event, {
|
|
50
|
-
end:
|
|
50
|
+
end: itemId
|
|
51
51
|
});
|
|
52
52
|
} else {
|
|
53
|
-
instance.selectNode(event,
|
|
53
|
+
instance.selectNode(event, itemId, true);
|
|
54
54
|
}
|
|
55
55
|
} else {
|
|
56
|
-
instance.selectNode(event,
|
|
56
|
+
instance.selectNode(event, itemId);
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
59
|
const interactions = {
|
package/node/index.js
CHANGED
|
@@ -20,10 +20,10 @@ const useTreeViewExpansion = ({
|
|
|
20
20
|
params.onExpandedItemsChange?.(event, value);
|
|
21
21
|
models.expandedItems.setControlledValue(value);
|
|
22
22
|
};
|
|
23
|
-
const isNodeExpanded = React.useCallback(
|
|
24
|
-
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(
|
|
23
|
+
const isNodeExpanded = React.useCallback(itemId => {
|
|
24
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
|
|
25
25
|
}, [models.expandedItems.value]);
|
|
26
|
-
const isNodeExpandable = React.useCallback(
|
|
26
|
+
const isNodeExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
|
|
27
27
|
const toggleNodeExpansion = (0, _useEventCallback.default)((event, itemId) => {
|
|
28
28
|
if (itemId == null) {
|
|
29
29
|
return;
|
|
@@ -40,15 +40,15 @@ const useTreeViewExpansion = ({
|
|
|
40
40
|
}
|
|
41
41
|
setExpandedItems(event, newExpanded);
|
|
42
42
|
});
|
|
43
|
-
const expandAllSiblings = (event,
|
|
44
|
-
const node = instance.getNode(
|
|
43
|
+
const expandAllSiblings = (event, itemId) => {
|
|
44
|
+
const node = instance.getNode(itemId);
|
|
45
45
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
46
46
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
47
47
|
const newExpanded = models.expandedItems.value.concat(diff);
|
|
48
48
|
if (diff.length > 0) {
|
|
49
49
|
if (params.onItemExpansionToggle) {
|
|
50
|
-
diff.forEach(
|
|
51
|
-
params.onItemExpansionToggle(event,
|
|
50
|
+
diff.forEach(newlyExpandedItemId => {
|
|
51
|
+
params.onItemExpansionToggle(event, newlyExpandedItemId, true);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
setExpandedItems(event, newExpanded);
|
|
@@ -14,6 +14,22 @@ var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
|
|
|
14
14
|
var _utils = require("../../utils/utils");
|
|
15
15
|
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); }
|
|
16
16
|
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; }
|
|
17
|
+
const useTabbableItemId = (instance, selectedItems) => {
|
|
18
|
+
const isItemVisible = itemId => {
|
|
19
|
+
const node = instance.getNode(itemId);
|
|
20
|
+
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
21
|
+
};
|
|
22
|
+
let tabbableItemId;
|
|
23
|
+
if (Array.isArray(selectedItems)) {
|
|
24
|
+
tabbableItemId = selectedItems.find(isItemVisible);
|
|
25
|
+
} else if (selectedItems != null && isItemVisible(selectedItems)) {
|
|
26
|
+
tabbableItemId = selectedItems;
|
|
27
|
+
}
|
|
28
|
+
if (tabbableItemId == null) {
|
|
29
|
+
tabbableItemId = instance.getNavigableChildrenIds(null)[0];
|
|
30
|
+
}
|
|
31
|
+
return tabbableItemId;
|
|
32
|
+
};
|
|
17
33
|
const useTreeViewFocus = ({
|
|
18
34
|
instance,
|
|
19
35
|
publicAPI,
|
|
@@ -23,30 +39,36 @@ const useTreeViewFocus = ({
|
|
|
23
39
|
models,
|
|
24
40
|
rootRef
|
|
25
41
|
}) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
|
|
43
|
+
const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
|
|
44
|
+
const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedNodeId) : itemId;
|
|
45
|
+
if (state.focusedNodeId !== cleanItemId) {
|
|
29
46
|
setState(prevState => (0, _extends2.default)({}, prevState, {
|
|
30
|
-
focusedNodeId:
|
|
47
|
+
focusedNodeId: cleanItemId
|
|
31
48
|
}));
|
|
32
49
|
}
|
|
33
50
|
});
|
|
34
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current
|
|
35
|
-
const isNodeFocused = React.useCallback(
|
|
36
|
-
const isNodeVisible =
|
|
37
|
-
const node = instance.getNode(
|
|
51
|
+
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
|
|
52
|
+
const isNodeFocused = React.useCallback(itemId => state.focusedNodeId === itemId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
|
|
53
|
+
const isNodeVisible = itemId => {
|
|
54
|
+
const node = instance.getNode(itemId);
|
|
38
55
|
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
39
56
|
};
|
|
57
|
+
const innerFocusItem = (event, itemId) => {
|
|
58
|
+
const node = instance.getNode(itemId);
|
|
59
|
+
const itemElement = document.getElementById(instance.getTreeItemId(itemId, node.idAttribute));
|
|
60
|
+
if (itemElement) {
|
|
61
|
+
itemElement.focus();
|
|
62
|
+
}
|
|
63
|
+
setFocusedItemId(itemId);
|
|
64
|
+
if (params.onItemFocus) {
|
|
65
|
+
params.onItemFocus(event, itemId);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
40
68
|
const focusItem = (0, _useEventCallback.default)((event, nodeId) => {
|
|
41
|
-
//
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
instance.focusRoot();
|
|
45
|
-
}
|
|
46
|
-
setFocusedNodeId(nodeId);
|
|
47
|
-
if (params.onItemFocus) {
|
|
48
|
-
params.onItemFocus(event, nodeId);
|
|
49
|
-
}
|
|
69
|
+
// If we receive a nodeId, and it is visible, the focus will be set to it
|
|
70
|
+
if (isNodeVisible(nodeId)) {
|
|
71
|
+
innerFocusItem(event, nodeId);
|
|
50
72
|
}
|
|
51
73
|
});
|
|
52
74
|
const focusDefaultNode = (0, _useEventCallback.default)(event => {
|
|
@@ -59,21 +81,26 @@ const useTreeViewFocus = ({
|
|
|
59
81
|
if (nodeToFocusId == null) {
|
|
60
82
|
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
61
83
|
}
|
|
62
|
-
|
|
63
|
-
if (params.onItemFocus) {
|
|
64
|
-
params.onItemFocus(event, nodeToFocusId);
|
|
65
|
-
}
|
|
84
|
+
innerFocusItem(event, nodeToFocusId);
|
|
66
85
|
});
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
86
|
+
const removeFocusedItem = (0, _useEventCallback.default)(() => {
|
|
87
|
+
if (state.focusedNodeId == null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const node = instance.getNode(state.focusedNodeId);
|
|
91
|
+
const itemElement = document.getElementById(instance.getTreeItemId(state.focusedNodeId, node.idAttribute));
|
|
92
|
+
if (itemElement) {
|
|
93
|
+
itemElement.blur();
|
|
94
|
+
}
|
|
95
|
+
setFocusedItemId(null);
|
|
71
96
|
});
|
|
97
|
+
const canItemBeTabbed = itemId => itemId === tabbableItemId;
|
|
72
98
|
(0, _useTreeView.populateInstance)(instance, {
|
|
73
99
|
isNodeFocused,
|
|
100
|
+
canItemBeTabbed,
|
|
74
101
|
focusItem,
|
|
75
|
-
|
|
76
|
-
|
|
102
|
+
focusDefaultNode,
|
|
103
|
+
removeFocusedItem
|
|
77
104
|
});
|
|
78
105
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
79
106
|
focusItem
|
|
@@ -81,12 +108,9 @@ const useTreeViewFocus = ({
|
|
|
81
108
|
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
|
|
82
109
|
id
|
|
83
110
|
}) => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
return oldFocusedNodeId;
|
|
89
|
-
});
|
|
111
|
+
if (state.focusedNodeId === id) {
|
|
112
|
+
instance.focusDefaultNode(null);
|
|
113
|
+
}
|
|
90
114
|
});
|
|
91
115
|
const createHandleFocus = otherHandlers => event => {
|
|
92
116
|
otherHandlers.onFocus?.(event);
|
|
@@ -95,16 +119,11 @@ const useTreeViewFocus = ({
|
|
|
95
119
|
instance.focusDefaultNode(event);
|
|
96
120
|
}
|
|
97
121
|
};
|
|
98
|
-
const createHandleBlur = otherHandlers => event => {
|
|
99
|
-
otherHandlers.onBlur?.(event);
|
|
100
|
-
setFocusedNodeId(null);
|
|
101
|
-
};
|
|
102
122
|
const focusedNode = instance.getNode(state.focusedNodeId);
|
|
103
123
|
const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
|
|
104
124
|
return {
|
|
105
125
|
getRootProps: otherHandlers => ({
|
|
106
126
|
onFocus: createHandleFocus(otherHandlers),
|
|
107
|
-
onBlur: createHandleBlur(otherHandlers),
|
|
108
127
|
'aria-activedescendant': activeDescendant ?? undefined
|
|
109
128
|
})
|
|
110
129
|
};
|
|
@@ -15,7 +15,7 @@ const useTreeViewId = ({
|
|
|
15
15
|
params
|
|
16
16
|
}) => {
|
|
17
17
|
const treeId = (0, _useId.default)(params.id);
|
|
18
|
-
const getTreeItemId = React.useCallback((
|
|
18
|
+
const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
|
|
19
19
|
(0, _useTreeView.populateInstance)(instance, {
|
|
20
20
|
getTreeItemId
|
|
21
21
|
});
|