@hi-ui/menu 4.0.0-beta.3 → 4.0.0-beta.30
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/lib/cjs/Expander.js +2 -3
- package/lib/cjs/Menu.js +208 -54
- package/lib/cjs/MenuItem.js +158 -79
- package/lib/cjs/context.js +0 -1
- package/lib/cjs/index.js +0 -1
- package/lib/cjs/styles/index.scss.js +2 -3
- package/lib/cjs/util.js +0 -1
- package/lib/esm/Expander.js +0 -1
- package/lib/esm/Menu.js +198 -52
- package/lib/esm/MenuItem.js +128 -55
- package/lib/esm/context.js +1 -2
- package/lib/esm/index.js +0 -1
- package/lib/esm/styles/index.scss.js +3 -5
- package/lib/esm/util.js +0 -1
- package/lib/types/Menu.d.ts +62 -27
- package/lib/types/MenuItem.d.ts +14 -2
- package/lib/types/context.d.ts +2 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/types.d.ts +24 -2
- package/package.json +17 -9
- package/lib/cjs/Expander.js.map +0 -1
- package/lib/cjs/Menu.js.map +0 -1
- package/lib/cjs/MenuItem.js.map +0 -1
- package/lib/cjs/context.js.map +0 -1
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/styles/index.scss.js.map +0 -1
- package/lib/cjs/util.js.map +0 -1
- package/lib/esm/Expander.js.map +0 -1
- package/lib/esm/Menu.js.map +0 -1
- package/lib/esm/MenuItem.js.map +0 -1
- package/lib/esm/context.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/styles/index.scss.js.map +0 -1
- package/lib/esm/util.js.map +0 -1
package/lib/cjs/Expander.js
CHANGED
|
@@ -36,7 +36,7 @@ var Expander = function Expander(_ref) {
|
|
|
36
36
|
height = _useState[0],
|
|
37
37
|
setHeight = _useState[1];
|
|
38
38
|
|
|
39
|
-
return /*#__PURE__*/React__default[
|
|
39
|
+
return /*#__PURE__*/React__default["default"].createElement(reactTransitionGroup.CSSTransition, {
|
|
40
40
|
"in": visible,
|
|
41
41
|
timeout: 200,
|
|
42
42
|
classNames: className,
|
|
@@ -56,7 +56,7 @@ var Expander = function Expander(_ref) {
|
|
|
56
56
|
setHeight(0);
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
-
}, /*#__PURE__*/React__default[
|
|
59
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
60
60
|
style: {
|
|
61
61
|
height: height,
|
|
62
62
|
overflow: 'hidden',
|
|
@@ -66,4 +66,3 @@ var Expander = function Expander(_ref) {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
exports.Expander = Expander;
|
|
69
|
-
//# sourceMappingURL=Expander.js.map
|
package/lib/cjs/Menu.js
CHANGED
|
@@ -33,6 +33,18 @@ var util = require('./util.js');
|
|
|
33
33
|
|
|
34
34
|
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
|
35
35
|
|
|
36
|
+
var Tooltip = require('@hi-ui/tooltip');
|
|
37
|
+
|
|
38
|
+
var useToggle = require('@hi-ui/use-toggle');
|
|
39
|
+
|
|
40
|
+
var treeUtils = require('@hi-ui/tree-utils');
|
|
41
|
+
|
|
42
|
+
var typeAssertion = require('@hi-ui/type-assertion');
|
|
43
|
+
|
|
44
|
+
var useResizeObserver = require('@hi-ui/use-resize-observer');
|
|
45
|
+
|
|
46
|
+
var useMergeRefs = require('@hi-ui/use-merge-refs');
|
|
47
|
+
|
|
36
48
|
function _interopDefaultLegacy(e) {
|
|
37
49
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
38
50
|
'default': e
|
|
@@ -41,86 +53,198 @@ function _interopDefaultLegacy(e) {
|
|
|
41
53
|
|
|
42
54
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
43
55
|
|
|
56
|
+
var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
|
|
57
|
+
|
|
44
58
|
var MENU_PREFIX = classname.getPrefixCls('menu');
|
|
59
|
+
var DEFAULT_EXPANDED_IDS = [];
|
|
60
|
+
var NOOP_ARRAY = [];
|
|
61
|
+
var MIN_WIDTH = 56;
|
|
45
62
|
/**
|
|
46
63
|
* TODO: What is Menu
|
|
47
64
|
*/
|
|
48
65
|
|
|
49
66
|
var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
50
|
-
var _cx;
|
|
51
|
-
|
|
52
67
|
var _a$prefixCls = _a.prefixCls,
|
|
53
68
|
prefixCls = _a$prefixCls === void 0 ? MENU_PREFIX : _a$prefixCls,
|
|
54
69
|
_a$role = _a.role,
|
|
55
70
|
role = _a$role === void 0 ? 'menu' : _a$role,
|
|
56
71
|
className = _a.className,
|
|
57
|
-
data = _a.data,
|
|
72
|
+
_a$data = _a.data,
|
|
73
|
+
data = _a$data === void 0 ? NOOP_ARRAY : _a$data,
|
|
58
74
|
_a$placement = _a.placement,
|
|
59
75
|
placement = _a$placement === void 0 ? 'vertical' : _a$placement,
|
|
60
|
-
showCollapse = _a.showCollapse,
|
|
76
|
+
_a$showCollapse = _a.showCollapse,
|
|
77
|
+
showCollapse = _a$showCollapse === void 0 ? false : _a$showCollapse,
|
|
61
78
|
_a$expandedType = _a.expandedType,
|
|
62
79
|
expandedType = _a$expandedType === void 0 ? 'collapse' : _a$expandedType,
|
|
63
80
|
_a$showAllSubMenus = _a.showAllSubMenus,
|
|
64
81
|
showAllSubMenus = _a$showAllSubMenus === void 0 ? false : _a$showAllSubMenus,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
_a$defaultExpandedAll = _a.defaultExpandedAll,
|
|
83
|
+
defaultExpandedAll = _a$defaultExpandedAll === void 0 ? false : _a$defaultExpandedAll,
|
|
84
|
+
_a$defaultExpandedIds = _a.defaultExpandedIds,
|
|
85
|
+
defaultExpandedIds = _a$defaultExpandedIds === void 0 ? DEFAULT_EXPANDED_IDS : _a$defaultExpandedIds,
|
|
86
|
+
expandedIdsProp = _a.expandedIds,
|
|
87
|
+
onExpand = _a.onExpand,
|
|
88
|
+
_a$defaultActiveId = _a.defaultActiveId,
|
|
89
|
+
defaultActiveId = _a$defaultActiveId === void 0 ? '' : _a$defaultActiveId,
|
|
90
|
+
activeIdProp = _a.activeId,
|
|
68
91
|
onClickSubMenu = _a.onClickSubMenu,
|
|
92
|
+
collapsed = _a.collapsed,
|
|
93
|
+
_a$defaultCollapsed = _a.defaultCollapsed,
|
|
94
|
+
defaultCollapsed = _a$defaultCollapsed === void 0 ? false : _a$defaultCollapsed,
|
|
95
|
+
onCollapse = _a.onCollapse,
|
|
96
|
+
footerRender = _a.footerRender,
|
|
69
97
|
onClick = _a.onClick,
|
|
70
|
-
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandedIds", "defaultActiveId", "activeId", "onClickSubMenu", "onClick"]);
|
|
98
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "placement", "showCollapse", "expandedType", "showAllSubMenus", "defaultExpandedAll", "defaultExpandedIds", "expandedIds", "onExpand", "defaultActiveId", "activeId", "onClickSubMenu", "collapsed", "defaultCollapsed", "onCollapse", "footerRender", "onClick"]);
|
|
71
99
|
|
|
72
|
-
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId
|
|
73
|
-
|
|
100
|
+
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId, activeIdProp, onClick),
|
|
101
|
+
activeId = _useUncontrolledState[0],
|
|
74
102
|
updateActiveId = _useUncontrolledState[1];
|
|
75
103
|
|
|
76
|
-
var _useState = React.useState(
|
|
104
|
+
var _useState = React.useState(function () {
|
|
105
|
+
return util.getAncestorIds(activeId, data);
|
|
106
|
+
}),
|
|
77
107
|
activeParents = _useState[0],
|
|
78
108
|
updateActiveParents = _useState[1];
|
|
79
109
|
|
|
80
110
|
React.useEffect(function () {
|
|
81
|
-
updateActiveParents(util.getAncestorIds(
|
|
82
|
-
}, [
|
|
111
|
+
updateActiveParents(util.getAncestorIds(activeId, data));
|
|
112
|
+
}, [activeId, data]);
|
|
83
113
|
|
|
84
|
-
var
|
|
85
|
-
|
|
86
|
-
|
|
114
|
+
var _useUncontrolledState2 = useUncontrolledState.useUncontrolledState(function () {
|
|
115
|
+
return defaultExpandedAll ? treeUtils.getTreeNodesWithChildren(data).map(function (node) {
|
|
116
|
+
return node.id;
|
|
117
|
+
}) : defaultExpandedIds;
|
|
118
|
+
}, expandedIdsProp, onExpand),
|
|
119
|
+
expandedIds = _useUncontrolledState2[0],
|
|
120
|
+
updateExpandedIds = _useUncontrolledState2[1];
|
|
87
121
|
|
|
88
|
-
var clickMenu = React.useCallback(function (id) {
|
|
89
|
-
updateActiveId(id);
|
|
122
|
+
var clickMenu = React.useCallback(function (id, raw) {
|
|
123
|
+
updateActiveId(id, raw);
|
|
90
124
|
}, [updateActiveId]);
|
|
91
125
|
var clickSubMenu = React.useCallback(function (id) {
|
|
92
|
-
var
|
|
93
|
-
return
|
|
94
|
-
}) :
|
|
95
|
-
|
|
126
|
+
var nextExpandedIds = expandedIds.includes(id) ? expandedIds.filter(function (expandedId) {
|
|
127
|
+
return expandedId !== id;
|
|
128
|
+
}) : expandedIds.concat(id);
|
|
129
|
+
updateExpandedIds(nextExpandedIds);
|
|
96
130
|
|
|
97
131
|
if (onClickSubMenu) {
|
|
98
|
-
onClickSubMenu(id,
|
|
132
|
+
onClickSubMenu(id, nextExpandedIds);
|
|
99
133
|
}
|
|
100
|
-
}, [onClickSubMenu,
|
|
134
|
+
}, [onClickSubMenu, expandedIds, updateExpandedIds]);
|
|
101
135
|
var closePopper = React.useCallback(function (id) {
|
|
102
|
-
|
|
103
|
-
return
|
|
136
|
+
updateExpandedIds(expandedIds.filter(function (expandedId) {
|
|
137
|
+
return expandedId !== id;
|
|
104
138
|
}));
|
|
105
|
-
}, [
|
|
139
|
+
}, [expandedIds, updateExpandedIds]);
|
|
106
140
|
var closeAllPopper = React.useCallback(function () {
|
|
107
|
-
|
|
108
|
-
}, []);
|
|
109
|
-
|
|
110
|
-
var
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
141
|
+
updateExpandedIds([]);
|
|
142
|
+
}, [updateExpandedIds]);
|
|
143
|
+
|
|
144
|
+
var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
|
|
145
|
+
defaultVisible: defaultCollapsed,
|
|
146
|
+
visible: collapsed,
|
|
147
|
+
onToggle: onCollapse
|
|
148
|
+
}),
|
|
149
|
+
mini = _useUncontrolledToggl[0],
|
|
150
|
+
miniToggleAction = _useUncontrolledToggl[1];
|
|
151
|
+
|
|
152
|
+
var showVertical = placement === 'vertical';
|
|
153
|
+
var canToggle = showVertical && showCollapse;
|
|
154
|
+
var showMini = showVertical && mini;
|
|
155
|
+
|
|
156
|
+
var _useState2 = React.useState(null),
|
|
157
|
+
containerElement = _useState2[0],
|
|
158
|
+
setContainerElement = _useState2[1];
|
|
159
|
+
|
|
160
|
+
var _useState3 = React.useState(),
|
|
161
|
+
_useState3$ = _useState3[0],
|
|
162
|
+
containerWidth = _useState3$ === void 0 ? 0 : _useState3$,
|
|
163
|
+
setContainerWidth = _useState3[1];
|
|
164
|
+
|
|
165
|
+
useResizeObserver.useResizeObserver({
|
|
166
|
+
element: containerElement,
|
|
167
|
+
disabled: showVertical,
|
|
168
|
+
getSize: function getSize(element) {
|
|
169
|
+
var itemRect = element.getBoundingClientRect();
|
|
170
|
+
return itemRect.width;
|
|
171
|
+
},
|
|
172
|
+
onResize: function onResize(el, width) {
|
|
173
|
+
setContainerWidth(width);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
var _useState4 = React.useState(0),
|
|
178
|
+
tagMaxCount = _useState4[0],
|
|
179
|
+
setTagMaxCount = _useState4[1];
|
|
180
|
+
|
|
181
|
+
var mergedTagList = React.useMemo(function () {
|
|
182
|
+
if (showVertical) return data;
|
|
183
|
+
if (containerWidth < MIN_WIDTH) return data;
|
|
184
|
+
return data.slice(0, Math.min(data.length, containerWidth / MIN_WIDTH));
|
|
185
|
+
}, [showVertical, data, containerWidth]);
|
|
186
|
+
var restTagList = React.useMemo(function () {
|
|
187
|
+
if (tagMaxCount > 0) return data.slice(tagMaxCount);
|
|
188
|
+
return [];
|
|
189
|
+
}, [data, tagMaxCount]);
|
|
190
|
+
var getTagWidth = React.useCallback(function (index) {
|
|
191
|
+
if (!containerElement) return MIN_WIDTH;
|
|
192
|
+
var elements = containerElement.getElementsByClassName('hi-v4-menu-item');
|
|
193
|
+
var element = elements && elements[index];
|
|
194
|
+
if (!element) return MIN_WIDTH;
|
|
195
|
+
return element.getBoundingClientRect().width;
|
|
196
|
+
}, [containerElement]);
|
|
197
|
+
React.useLayoutEffect(function () {
|
|
198
|
+
if (showVertical) return;
|
|
199
|
+
var tagMaxCount = 0;
|
|
200
|
+
|
|
201
|
+
if (typeAssertion.isArrayNonEmpty(mergedTagList)) {
|
|
202
|
+
var len = mergedTagList.length;
|
|
203
|
+
var lastIndex = len - 1;
|
|
204
|
+
var totalWidth = 72; // 更多
|
|
205
|
+
|
|
206
|
+
for (var i = 0; i < len; ++i) {
|
|
207
|
+
var currentTagWidth = getTagWidth(i);
|
|
208
|
+
|
|
209
|
+
if (currentTagWidth === undefined) {
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
totalWidth += currentTagWidth;
|
|
214
|
+
|
|
215
|
+
if (lastIndex === 0 && totalWidth <= containerWidth || i === lastIndex - 1 && totalWidth + getTagWidth(lastIndex) <= containerWidth) {
|
|
216
|
+
tagMaxCount = lastIndex;
|
|
217
|
+
break;
|
|
218
|
+
} else if (totalWidth > containerWidth) {
|
|
219
|
+
tagMaxCount = i - 1;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
tagMaxCount = 0;
|
|
225
|
+
} // 保底要展示 1 个
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
setTagMaxCount(typeAssertion.isArrayNonEmpty(mergedTagList) && tagMaxCount < 1 ? 1 : tagMaxCount + 1);
|
|
229
|
+
}, [showVertical, getTagWidth, containerWidth, mergedTagList]);
|
|
230
|
+
|
|
231
|
+
var renderFooter = function renderFooter() {
|
|
232
|
+
var collapseNode = canToggle ? /*#__PURE__*/React__default["default"].createElement("div", {
|
|
233
|
+
className: classname.cx(prefixCls + "__toggle"),
|
|
234
|
+
onClick: miniToggleAction.not
|
|
235
|
+
}, mini ? /*#__PURE__*/React__default["default"].createElement(icons.MenuUnfoldOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.MenuFoldOutlined, null)) : null;
|
|
236
|
+
return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, typeAssertion.isFunction(footerRender) ? footerRender({
|
|
237
|
+
collapsed: showMini,
|
|
238
|
+
collapseNode: collapseNode
|
|
239
|
+
}) : collapseNode);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
var cls = classname.cx(prefixCls, className, prefixCls + "--" + placement, mini && prefixCls + "--mini", (expandedType === 'pop' || showAllSubMenus || mini) && prefixCls + "--popup");
|
|
243
|
+
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
|
244
|
+
ref: useMergeRefs.useMergeRefs(ref, setContainerElement),
|
|
121
245
|
role: role,
|
|
122
246
|
className: cls
|
|
123
|
-
}, rest), /*#__PURE__*/React__default[
|
|
247
|
+
}, rest), /*#__PURE__*/React__default["default"].createElement(context["default"].Provider, {
|
|
124
248
|
value: {
|
|
125
249
|
placement: placement,
|
|
126
250
|
expandedType: expandedType,
|
|
@@ -131,25 +255,55 @@ var Menu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
|
131
255
|
closePopper: closePopper,
|
|
132
256
|
closeAllPopper: closeAllPopper,
|
|
133
257
|
activeParents: activeParents,
|
|
134
|
-
activeId:
|
|
135
|
-
expandedIds:
|
|
258
|
+
activeId: activeId,
|
|
259
|
+
expandedIds: expandedIds
|
|
136
260
|
}
|
|
137
|
-
}, /*#__PURE__*/React__default[
|
|
261
|
+
}, /*#__PURE__*/React__default["default"].createElement("ul", {
|
|
138
262
|
className: classname.cx(prefixCls + "__wrapper")
|
|
139
|
-
},
|
|
140
|
-
return /*#__PURE__*/React__default[
|
|
141
|
-
|
|
142
|
-
|
|
263
|
+
}, mergedTagList.map(function (item, index) {
|
|
264
|
+
return showMini ? /*#__PURE__*/React__default["default"].createElement(Tooltip__default["default"], {
|
|
265
|
+
title: item.title,
|
|
266
|
+
key: item.id,
|
|
267
|
+
placement: "right"
|
|
268
|
+
}, /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, Object.assign({}, item, {
|
|
269
|
+
level: 1,
|
|
270
|
+
render: renderMenuItemMini,
|
|
271
|
+
raw: item
|
|
272
|
+
}))) : /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, Object.assign({
|
|
273
|
+
hidden: !showVertical && index >= tagMaxCount
|
|
274
|
+
}, item, {
|
|
275
|
+
key: item.id,
|
|
276
|
+
level: 1,
|
|
277
|
+
raw: item
|
|
143
278
|
}));
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
279
|
+
}), /*#__PURE__*/React__default["default"].createElement(MenuItem.MenuItem, {
|
|
280
|
+
hidden: showVertical || restTagList.length === 0,
|
|
281
|
+
id: "hi-v4-menu-more",
|
|
282
|
+
title: "\u66F4\u591A",
|
|
283
|
+
children: restTagList
|
|
284
|
+
})), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
285
|
+
className: prefixCls + "__footer"
|
|
286
|
+
}, renderFooter())));
|
|
148
287
|
});
|
|
149
288
|
|
|
150
289
|
if (env.__DEV__) {
|
|
151
290
|
Menu.displayName = 'Menu';
|
|
152
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* Mini 模式下渲染 item
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
var renderMenuItemMini = function renderMenuItemMini(menu) {
|
|
298
|
+
if (typeof menu.icon !== 'undefined') {
|
|
299
|
+
return menu.icon;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (typeof menu.title === 'string') {
|
|
303
|
+
return menu.title.substring(0, 1);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return menu.title;
|
|
307
|
+
};
|
|
153
308
|
|
|
154
309
|
exports.Menu = Menu;
|
|
155
|
-
//# sourceMappingURL=Menu.js.map
|