@mui/x-tree-view 7.0.0-beta.6 → 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 +311 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +34 -36
- package/RichTreeView/RichTreeView.types.d.ts +3 -2
- package/SimpleTreeView/SimpleTreeView.js +25 -26
- package/TreeItem/TreeItem.js +94 -82
- package/TreeItem/TreeItem.types.d.ts +13 -11
- 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.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +300 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +23 -23
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
- package/internals/useTreeView/useTreeView.js +28 -27
- 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 +29 -29
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
- package/modern/TreeItem/TreeItem.js +83 -70
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +23 -23
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/modern/internals/useTreeView/useTreeView.js +28 -27
- package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +146 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +29 -29
- package/node/SimpleTreeView/SimpleTreeView.js +23 -23
- package/node/TreeItem/TreeItem.js +83 -70
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +23 -23
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/node/internals/useTreeView/useTreeView.js +28 -27
- package/node/internals/useTreeView/useTreeView.utils.js +22 -22
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +154 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +5 -5
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +146 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -4,46 +4,46 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.populatePublicAPI = exports.populateInstance = exports.getPreviousNode = exports.getNextNode = exports.getLastNode = exports.getFirstNode = void 0;
|
|
7
|
-
const getPreviousNode = (instance,
|
|
8
|
-
const
|
|
9
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
10
|
-
const
|
|
11
|
-
if (
|
|
12
|
-
return
|
|
7
|
+
const getPreviousNode = (instance, itemId) => {
|
|
8
|
+
const item = instance.getNode(itemId);
|
|
9
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
10
|
+
const itemIndex = siblings.indexOf(itemId);
|
|
11
|
+
if (itemIndex === 0) {
|
|
12
|
+
return item.parentId;
|
|
13
13
|
}
|
|
14
|
-
let
|
|
15
|
-
while (instance.isNodeExpanded(
|
|
16
|
-
|
|
14
|
+
let currentItem = siblings[itemIndex - 1];
|
|
15
|
+
while (instance.isNodeExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
|
|
16
|
+
currentItem = instance.getNavigableChildrenIds(currentItem).pop();
|
|
17
17
|
}
|
|
18
|
-
return
|
|
18
|
+
return currentItem;
|
|
19
19
|
};
|
|
20
20
|
exports.getPreviousNode = getPreviousNode;
|
|
21
|
-
const getNextNode = (instance,
|
|
21
|
+
const getNextNode = (instance, itemId) => {
|
|
22
22
|
// If expanded get first child
|
|
23
|
-
if (instance.isNodeExpanded(
|
|
24
|
-
return instance.getNavigableChildrenIds(
|
|
23
|
+
if (instance.isNodeExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
|
|
24
|
+
return instance.getNavigableChildrenIds(itemId)[0];
|
|
25
25
|
}
|
|
26
|
-
let
|
|
27
|
-
while (
|
|
26
|
+
let item = instance.getNode(itemId);
|
|
27
|
+
while (item != null) {
|
|
28
28
|
// Try to get next sibling
|
|
29
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
30
|
-
const nextSibling = siblings[siblings.indexOf(
|
|
29
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
30
|
+
const nextSibling = siblings[siblings.indexOf(item.id) + 1];
|
|
31
31
|
if (nextSibling) {
|
|
32
32
|
return nextSibling;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// If the sibling does not exist, go up a level to the parent and try again.
|
|
36
|
-
|
|
36
|
+
item = instance.getNode(item.parentId);
|
|
37
37
|
}
|
|
38
38
|
return null;
|
|
39
39
|
};
|
|
40
40
|
exports.getNextNode = getNextNode;
|
|
41
41
|
const getLastNode = instance => {
|
|
42
|
-
let
|
|
43
|
-
while (instance.isNodeExpanded(
|
|
44
|
-
|
|
42
|
+
let lastItem = instance.getNavigableChildrenIds(null).pop();
|
|
43
|
+
while (instance.isNodeExpanded(lastItem)) {
|
|
44
|
+
lastItem = instance.getNavigableChildrenIds(lastItem).pop();
|
|
45
45
|
}
|
|
46
|
-
return
|
|
46
|
+
return lastItem;
|
|
47
47
|
};
|
|
48
48
|
exports.getLastNode = getLastNode;
|
|
49
49
|
const getFirstNode = instance => instance.getNavigableChildrenIds(null)[0];
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getActiveElement = void 0;
|
|
7
|
+
// https://www.abeautifulsite.net/posts/finding-the-active-element-in-a-shadow-root/
|
|
7
8
|
const getActiveElement = (root = document) => {
|
|
8
9
|
const activeEl = root.activeElement;
|
|
9
10
|
if (!activeEl) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "unstable_useTreeItem2", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeItem.useTreeItem2;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeItem = require("./useTreeItem2");
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.useTreeItem2 = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _utils = require("@mui/base/utils");
|
|
10
|
+
var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
|
|
11
|
+
var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
|
|
12
|
+
var _useTreeItem2Utils = require("../hooks/useTreeItem2Utils");
|
|
13
|
+
const useTreeItem2 = parameters => {
|
|
14
|
+
const {
|
|
15
|
+
runItemPlugins,
|
|
16
|
+
selection: {
|
|
17
|
+
multiSelect
|
|
18
|
+
},
|
|
19
|
+
disabledItemsFocusable,
|
|
20
|
+
instance,
|
|
21
|
+
publicAPI
|
|
22
|
+
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
23
|
+
const {
|
|
24
|
+
id,
|
|
25
|
+
itemId,
|
|
26
|
+
label,
|
|
27
|
+
children,
|
|
28
|
+
rootRef
|
|
29
|
+
} = parameters;
|
|
30
|
+
const {
|
|
31
|
+
rootRef: pluginRootRef,
|
|
32
|
+
contentRef
|
|
33
|
+
} = runItemPlugins(parameters);
|
|
34
|
+
const {
|
|
35
|
+
interactions,
|
|
36
|
+
status
|
|
37
|
+
} = (0, _useTreeItem2Utils.useTreeItem2Utils)({
|
|
38
|
+
itemId,
|
|
39
|
+
children
|
|
40
|
+
});
|
|
41
|
+
const idAttribute = instance.getTreeItemId(itemId, id);
|
|
42
|
+
const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef);
|
|
43
|
+
const createRootHandleFocus = otherHandlers => event => {
|
|
44
|
+
otherHandlers.onFocus?.(event);
|
|
45
|
+
if (event.defaultMuiPrevented) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const canBeFocused = !status.disabled || disabledItemsFocusable;
|
|
49
|
+
if (!status.focused && canBeFocused && event.currentTarget === event.target) {
|
|
50
|
+
instance.focusItem(event, itemId);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const createRootHandleBlur = otherHandlers => event => {
|
|
54
|
+
otherHandlers.onBlur?.(event);
|
|
55
|
+
if (event.defaultMuiPrevented) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
instance.removeFocusedItem();
|
|
59
|
+
};
|
|
60
|
+
const createRootHandleKeyDown = otherHandlers => event => {
|
|
61
|
+
otherHandlers.onKeyDown?.(event);
|
|
62
|
+
if (event.defaultMuiPrevented) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
instance.handleItemKeyDown(event, itemId);
|
|
66
|
+
};
|
|
67
|
+
const createContentHandleClick = otherHandlers => event => {
|
|
68
|
+
otherHandlers.onClick?.(event);
|
|
69
|
+
if (event.defaultMuiPrevented) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
interactions.handleExpansion(event);
|
|
73
|
+
interactions.handleSelection(event);
|
|
74
|
+
};
|
|
75
|
+
const createContentHandleMouseDown = otherHandlers => event => {
|
|
76
|
+
otherHandlers.onMouseDown?.(event);
|
|
77
|
+
if (event.defaultMuiPrevented) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Prevent text selection
|
|
82
|
+
if (event.shiftKey || event.ctrlKey || event.metaKey || status.disabled) {
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const getRootProps = (externalProps = {}) => {
|
|
87
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
88
|
+
let ariaSelected;
|
|
89
|
+
if (multiSelect) {
|
|
90
|
+
ariaSelected = status.selected;
|
|
91
|
+
} else if (status.selected) {
|
|
92
|
+
/* single-selection trees unset aria-selected on un-selected items.
|
|
93
|
+
*
|
|
94
|
+
* If the tree does not support multiple selection, aria-selected
|
|
95
|
+
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
96
|
+
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
97
|
+
*/
|
|
98
|
+
ariaSelected = true;
|
|
99
|
+
}
|
|
100
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
101
|
+
ref: handleRootRef,
|
|
102
|
+
role: 'treeitem',
|
|
103
|
+
tabIndex: instance.canItemBeTabbed(itemId) ? 0 : -1,
|
|
104
|
+
id: idAttribute,
|
|
105
|
+
'aria-expanded': status.expandable ? status.expanded : undefined,
|
|
106
|
+
'aria-selected': ariaSelected,
|
|
107
|
+
'aria-disabled': status.disabled || undefined
|
|
108
|
+
}, externalProps, {
|
|
109
|
+
onFocus: createRootHandleFocus(externalEventHandlers),
|
|
110
|
+
onBlur: createRootHandleBlur(externalEventHandlers),
|
|
111
|
+
onKeyDown: createRootHandleKeyDown(externalEventHandlers)
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
const getContentProps = (externalProps = {}) => {
|
|
115
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
116
|
+
return (0, _extends2.default)({}, externalEventHandlers, externalProps, {
|
|
117
|
+
ref: contentRef,
|
|
118
|
+
onClick: createContentHandleClick(externalEventHandlers),
|
|
119
|
+
onMouseDown: createContentHandleMouseDown(externalEventHandlers),
|
|
120
|
+
status
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
const getLabelProps = (externalProps = {}) => {
|
|
124
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
125
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
126
|
+
children: label
|
|
127
|
+
}, externalProps);
|
|
128
|
+
};
|
|
129
|
+
const getIconContainerProps = (externalProps = {}) => {
|
|
130
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
131
|
+
return (0, _extends2.default)({}, externalEventHandlers, externalProps);
|
|
132
|
+
};
|
|
133
|
+
const getGroupTransitionProps = (externalProps = {}) => {
|
|
134
|
+
const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
|
|
135
|
+
return (0, _extends2.default)({}, externalEventHandlers, {
|
|
136
|
+
unmountOnExit: true,
|
|
137
|
+
component: 'ul',
|
|
138
|
+
role: 'group',
|
|
139
|
+
in: status.expanded,
|
|
140
|
+
children
|
|
141
|
+
}, externalProps);
|
|
142
|
+
};
|
|
143
|
+
return {
|
|
144
|
+
getRootProps,
|
|
145
|
+
getContentProps,
|
|
146
|
+
getGroupTransitionProps,
|
|
147
|
+
getIconContainerProps,
|
|
148
|
+
getLabelProps,
|
|
149
|
+
rootRef: handleRootRef,
|
|
150
|
+
status,
|
|
151
|
+
publicAPI
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
exports.useTreeItem2 = useTreeItem2;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-tree-view",
|
|
3
|
-
"version": "7.0.0
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "The community edition of the tree view components (MUI X).",
|
|
5
5
|
"author": "MUI Team",
|
|
6
6
|
"main": "./node/index.js",
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@babel/runtime": "^7.24.0",
|
|
36
|
-
"@mui/base": "^5.0.0-beta.
|
|
37
|
-
"@mui/system": "^5.15.
|
|
38
|
-
"@mui/utils": "^5.15.
|
|
36
|
+
"@mui/base": "^5.0.0-beta.40",
|
|
37
|
+
"@mui/system": "^5.15.14",
|
|
38
|
+
"@mui/utils": "^5.15.14",
|
|
39
39
|
"@types/react-transition-group": "^4.4.10",
|
|
40
40
|
"clsx": "^2.1.0",
|
|
41
41
|
"prop-types": "^15.8.1",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@emotion/react": "^11.9.0",
|
|
46
46
|
"@emotion/styled": "^11.8.1",
|
|
47
|
-
"@mui/material": "^5.15.
|
|
47
|
+
"@mui/material": "^5.15.14",
|
|
48
48
|
"react": "^17.0.0 || ^18.0.0",
|
|
49
49
|
"react-dom": "^17.0.0 || ^18.0.0"
|
|
50
50
|
},
|
|
@@ -21,6 +21,11 @@ export interface TreeViewComponents<Theme = unknown> {
|
|
|
21
21
|
styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem'];
|
|
22
22
|
variants?: ComponentsVariants<Theme>['MuiTreeItem'];
|
|
23
23
|
};
|
|
24
|
+
MuiTreeItem2?: {
|
|
25
|
+
defaultProps?: ComponentsProps['MuiTreeItem2'];
|
|
26
|
+
styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem2'];
|
|
27
|
+
variants?: ComponentsVariants<Theme>['MuiTreeItem2'];
|
|
28
|
+
};
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
declare module '@mui/material/styles' {
|
|
@@ -2,12 +2,14 @@ import { TreeItemProps } from '../TreeItem';
|
|
|
2
2
|
import { TreeViewProps } from '../TreeView';
|
|
3
3
|
import { SimpleTreeViewProps } from '../SimpleTreeView';
|
|
4
4
|
import { RichTreeViewProps } from '../RichTreeView';
|
|
5
|
+
import { TreeItem2Props } from '../TreeItem2';
|
|
5
6
|
|
|
6
7
|
export interface TreeViewComponentsPropsList {
|
|
7
8
|
MuiSimpleTreeView: SimpleTreeViewProps<any>;
|
|
8
9
|
MuiRichTreeView: RichTreeViewProps<any, any>;
|
|
9
10
|
MuiTreeView: TreeViewProps<any>;
|
|
10
11
|
MuiTreeItem: TreeItemProps;
|
|
12
|
+
MuiTreeItem2: TreeItem2Props;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
declare module '@mui/material/styles' {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useTreeItem2 as unstable_useTreeItem2 } from './useTreeItem2';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { UseTreeItem2Parameters, UseTreeItem2ReturnValue } from './useTreeItem2.types';
|
|
2
|
+
export declare const useTreeItem2: <TPlugins extends [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature] = [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature]>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TPlugins>;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import { extractEventHandlers } from '@mui/base/utils';
|
|
3
|
+
import useForkRef from '@mui/utils/useForkRef';
|
|
4
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
|
|
5
|
+
import { useTreeItem2Utils } from '../hooks/useTreeItem2Utils';
|
|
6
|
+
export const useTreeItem2 = parameters => {
|
|
7
|
+
const {
|
|
8
|
+
runItemPlugins,
|
|
9
|
+
selection: {
|
|
10
|
+
multiSelect
|
|
11
|
+
},
|
|
12
|
+
disabledItemsFocusable,
|
|
13
|
+
instance,
|
|
14
|
+
publicAPI
|
|
15
|
+
} = useTreeViewContext();
|
|
16
|
+
const {
|
|
17
|
+
id,
|
|
18
|
+
itemId,
|
|
19
|
+
label,
|
|
20
|
+
children,
|
|
21
|
+
rootRef
|
|
22
|
+
} = parameters;
|
|
23
|
+
const {
|
|
24
|
+
rootRef: pluginRootRef,
|
|
25
|
+
contentRef
|
|
26
|
+
} = runItemPlugins(parameters);
|
|
27
|
+
const {
|
|
28
|
+
interactions,
|
|
29
|
+
status
|
|
30
|
+
} = useTreeItem2Utils({
|
|
31
|
+
itemId,
|
|
32
|
+
children
|
|
33
|
+
});
|
|
34
|
+
const idAttribute = instance.getTreeItemId(itemId, id);
|
|
35
|
+
const handleRootRef = useForkRef(rootRef, pluginRootRef);
|
|
36
|
+
const createRootHandleFocus = otherHandlers => event => {
|
|
37
|
+
otherHandlers.onFocus?.(event);
|
|
38
|
+
if (event.defaultMuiPrevented) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const canBeFocused = !status.disabled || disabledItemsFocusable;
|
|
42
|
+
if (!status.focused && canBeFocused && event.currentTarget === event.target) {
|
|
43
|
+
instance.focusItem(event, itemId);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const createRootHandleBlur = otherHandlers => event => {
|
|
47
|
+
otherHandlers.onBlur?.(event);
|
|
48
|
+
if (event.defaultMuiPrevented) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
instance.removeFocusedItem();
|
|
52
|
+
};
|
|
53
|
+
const createRootHandleKeyDown = otherHandlers => event => {
|
|
54
|
+
otherHandlers.onKeyDown?.(event);
|
|
55
|
+
if (event.defaultMuiPrevented) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
instance.handleItemKeyDown(event, itemId);
|
|
59
|
+
};
|
|
60
|
+
const createContentHandleClick = otherHandlers => event => {
|
|
61
|
+
otherHandlers.onClick?.(event);
|
|
62
|
+
if (event.defaultMuiPrevented) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
interactions.handleExpansion(event);
|
|
66
|
+
interactions.handleSelection(event);
|
|
67
|
+
};
|
|
68
|
+
const createContentHandleMouseDown = otherHandlers => event => {
|
|
69
|
+
otherHandlers.onMouseDown?.(event);
|
|
70
|
+
if (event.defaultMuiPrevented) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Prevent text selection
|
|
75
|
+
if (event.shiftKey || event.ctrlKey || event.metaKey || status.disabled) {
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const getRootProps = (externalProps = {}) => {
|
|
80
|
+
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
81
|
+
let ariaSelected;
|
|
82
|
+
if (multiSelect) {
|
|
83
|
+
ariaSelected = status.selected;
|
|
84
|
+
} else if (status.selected) {
|
|
85
|
+
/* single-selection trees unset aria-selected on un-selected items.
|
|
86
|
+
*
|
|
87
|
+
* If the tree does not support multiple selection, aria-selected
|
|
88
|
+
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
89
|
+
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
90
|
+
*/
|
|
91
|
+
ariaSelected = true;
|
|
92
|
+
}
|
|
93
|
+
return _extends({}, externalEventHandlers, {
|
|
94
|
+
ref: handleRootRef,
|
|
95
|
+
role: 'treeitem',
|
|
96
|
+
tabIndex: instance.canItemBeTabbed(itemId) ? 0 : -1,
|
|
97
|
+
id: idAttribute,
|
|
98
|
+
'aria-expanded': status.expandable ? status.expanded : undefined,
|
|
99
|
+
'aria-selected': ariaSelected,
|
|
100
|
+
'aria-disabled': status.disabled || undefined
|
|
101
|
+
}, externalProps, {
|
|
102
|
+
onFocus: createRootHandleFocus(externalEventHandlers),
|
|
103
|
+
onBlur: createRootHandleBlur(externalEventHandlers),
|
|
104
|
+
onKeyDown: createRootHandleKeyDown(externalEventHandlers)
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const getContentProps = (externalProps = {}) => {
|
|
108
|
+
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
109
|
+
return _extends({}, externalEventHandlers, externalProps, {
|
|
110
|
+
ref: contentRef,
|
|
111
|
+
onClick: createContentHandleClick(externalEventHandlers),
|
|
112
|
+
onMouseDown: createContentHandleMouseDown(externalEventHandlers),
|
|
113
|
+
status
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
const getLabelProps = (externalProps = {}) => {
|
|
117
|
+
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
118
|
+
return _extends({}, externalEventHandlers, {
|
|
119
|
+
children: label
|
|
120
|
+
}, externalProps);
|
|
121
|
+
};
|
|
122
|
+
const getIconContainerProps = (externalProps = {}) => {
|
|
123
|
+
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
124
|
+
return _extends({}, externalEventHandlers, externalProps);
|
|
125
|
+
};
|
|
126
|
+
const getGroupTransitionProps = (externalProps = {}) => {
|
|
127
|
+
const externalEventHandlers = _extends({}, extractEventHandlers(parameters), extractEventHandlers(externalProps));
|
|
128
|
+
return _extends({}, externalEventHandlers, {
|
|
129
|
+
unmountOnExit: true,
|
|
130
|
+
component: 'ul',
|
|
131
|
+
role: 'group',
|
|
132
|
+
in: status.expanded,
|
|
133
|
+
children
|
|
134
|
+
}, externalProps);
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
getRootProps,
|
|
138
|
+
getContentProps,
|
|
139
|
+
getGroupTransitionProps,
|
|
140
|
+
getIconContainerProps,
|
|
141
|
+
getLabelProps,
|
|
142
|
+
rootRef: handleRootRef,
|
|
143
|
+
status,
|
|
144
|
+
publicAPI
|
|
145
|
+
};
|
|
146
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TreeViewItemId } from '../models';
|
|
3
|
+
import { MuiCancellableEventHandler } from '../internals/models/MuiCancellableEvent';
|
|
4
|
+
import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '../internals/models';
|
|
5
|
+
export interface UseTreeItem2Parameters {
|
|
6
|
+
/**
|
|
7
|
+
* The id attribute of the item. If not provided, it will be generated.
|
|
8
|
+
*/
|
|
9
|
+
id?: string;
|
|
10
|
+
/**
|
|
11
|
+
* If `true`, the item is disabled.
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The id of the item.
|
|
17
|
+
* Must be unique.
|
|
18
|
+
*/
|
|
19
|
+
itemId: TreeViewItemId;
|
|
20
|
+
/**
|
|
21
|
+
* The label of the item.
|
|
22
|
+
*/
|
|
23
|
+
label?: React.ReactNode;
|
|
24
|
+
rootRef?: React.Ref<HTMLLIElement>;
|
|
25
|
+
/**
|
|
26
|
+
* The content of the component.
|
|
27
|
+
*/
|
|
28
|
+
children?: React.ReactNode;
|
|
29
|
+
}
|
|
30
|
+
export interface UseTreeItem2RootSlotOwnProps {
|
|
31
|
+
role: 'treeitem';
|
|
32
|
+
tabIndex: 0 | -1;
|
|
33
|
+
id: string;
|
|
34
|
+
'aria-expanded': React.AriaAttributes['aria-expanded'];
|
|
35
|
+
'aria-selected': React.AriaAttributes['aria-selected'];
|
|
36
|
+
'aria-disabled': React.AriaAttributes['aria-disabled'];
|
|
37
|
+
onFocus: MuiCancellableEventHandler<React.FocusEvent<HTMLElement>>;
|
|
38
|
+
onBlur: MuiCancellableEventHandler<React.FocusEvent<HTMLElement>>;
|
|
39
|
+
onKeyDown: MuiCancellableEventHandler<React.KeyboardEvent<HTMLElement>>;
|
|
40
|
+
ref: React.RefCallback<HTMLLIElement>;
|
|
41
|
+
}
|
|
42
|
+
export type UseTreeItem2RootSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2RootSlotOwnProps;
|
|
43
|
+
export interface UseTreeItem2ContentSlotOwnProps {
|
|
44
|
+
onClick: MuiCancellableEventHandler<React.MouseEvent>;
|
|
45
|
+
onMouseDown: MuiCancellableEventHandler<React.MouseEvent>;
|
|
46
|
+
ref: React.RefCallback<HTMLDivElement> | null;
|
|
47
|
+
status: UseTreeItem2Status;
|
|
48
|
+
}
|
|
49
|
+
export type UseTreeItem2ContentSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2ContentSlotOwnProps;
|
|
50
|
+
export interface UseTreeItem2IconContainerSlotOwnProps {
|
|
51
|
+
}
|
|
52
|
+
export type UseTreeItemIconContainerSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2IconContainerSlotOwnProps;
|
|
53
|
+
export interface UseTreeItem2LabelSlotOwnProps {
|
|
54
|
+
children: React.ReactNode;
|
|
55
|
+
}
|
|
56
|
+
export type UseTreeItem2LabelSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2LabelSlotOwnProps;
|
|
57
|
+
export interface UseTreeItem2GroupTransitionSlotOwnProps {
|
|
58
|
+
unmountOnExit: boolean;
|
|
59
|
+
in: boolean;
|
|
60
|
+
component: 'ul';
|
|
61
|
+
role: 'group';
|
|
62
|
+
children: React.ReactNode;
|
|
63
|
+
}
|
|
64
|
+
export type UseTreeItem2GroupTransitionSlotProps<ExternalProps = {}> = ExternalProps & UseTreeItem2GroupTransitionSlotOwnProps;
|
|
65
|
+
export interface UseTreeItem2Status {
|
|
66
|
+
expandable: boolean;
|
|
67
|
+
expanded: boolean;
|
|
68
|
+
focused: boolean;
|
|
69
|
+
selected: boolean;
|
|
70
|
+
disabled: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface UseTreeItem2ReturnValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> {
|
|
73
|
+
/**
|
|
74
|
+
* Resolver for the root slot's props.
|
|
75
|
+
* @param {ExternalProps} externalProps Additional props for the root slot
|
|
76
|
+
* @returns {UseTreeItem2RootSlotProps<ExternalProps>} Props that should be spread on the root slot
|
|
77
|
+
*/
|
|
78
|
+
getRootProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItem2RootSlotProps<ExternalProps>;
|
|
79
|
+
/**
|
|
80
|
+
* Resolver for the content slot's props.
|
|
81
|
+
* @param {ExternalProps} externalProps Additional props for the content slot
|
|
82
|
+
* @returns {UseTreeItem2ContentSlotProps<ExternalProps>} Props that should be spread on the content slot
|
|
83
|
+
*/
|
|
84
|
+
getContentProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItem2ContentSlotProps<ExternalProps>;
|
|
85
|
+
/**
|
|
86
|
+
* Resolver for the label slot's props.
|
|
87
|
+
* @param {ExternalProps} externalProps Additional props for the label slot
|
|
88
|
+
* @returns {UseTreeItem2LabelSlotProps<ExternalProps>} Props that should be spread on the label slot
|
|
89
|
+
*/
|
|
90
|
+
getLabelProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItem2LabelSlotProps<ExternalProps>;
|
|
91
|
+
/**
|
|
92
|
+
* Resolver for the iconContainer slot's props.
|
|
93
|
+
* @param {ExternalProps} externalProps Additional props for the iconContainer slot
|
|
94
|
+
* @returns {UseTreeItemIconContainerSlotProps<ExternalProps>} Props that should be spread on the iconContainer slot
|
|
95
|
+
*/
|
|
96
|
+
getIconContainerProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItemIconContainerSlotProps<ExternalProps>;
|
|
97
|
+
/**
|
|
98
|
+
* Resolver for the GroupTransition slot's props.
|
|
99
|
+
* @param {ExternalProps} externalProps Additional props for the GroupTransition slot
|
|
100
|
+
* @returns {UseTreeItem2GroupTransitionSlotProps<ExternalProps>} Props that should be spread on the GroupTransition slot
|
|
101
|
+
*/
|
|
102
|
+
getGroupTransitionProps: <ExternalProps extends Record<string, any> = {}>(externalProps?: ExternalProps) => UseTreeItem2GroupTransitionSlotProps<ExternalProps>;
|
|
103
|
+
/**
|
|
104
|
+
* A ref to the component's root DOM element.
|
|
105
|
+
*/
|
|
106
|
+
rootRef: React.RefCallback<HTMLLIElement> | null;
|
|
107
|
+
/**
|
|
108
|
+
* Current status of the item.
|
|
109
|
+
*/
|
|
110
|
+
status: UseTreeItem2Status;
|
|
111
|
+
/**
|
|
112
|
+
* The object the allows Tree View manipulation.
|
|
113
|
+
*/
|
|
114
|
+
publicAPI: TreeViewPublicAPI<TPlugins>;
|
|
115
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|