@hi-ui/menu 4.3.1 → 5.0.0-alpha.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 +83 -0
- package/lib/cjs/EnterIcon.js +44 -0
- package/lib/cjs/GroupMenu.js +96 -0
- package/lib/cjs/Menu.js +25 -11
- package/lib/cjs/MenuItem.js +4 -3
- package/lib/cjs/MenuSearch.js +322 -0
- package/lib/cjs/SideMenu.js +139 -0
- package/lib/cjs/button/lib/esm/Button.js +109 -0
- package/lib/cjs/button/lib/esm/ButtonGroup.js +56 -0
- package/lib/cjs/button/lib/esm/styles/index.scss.js +35 -0
- package/lib/cjs/index.js +8 -0
- package/lib/cjs/styles/index.scss.js +1 -1
- package/lib/cjs/util.js +95 -1
- package/lib/esm/EnterIcon.js +32 -0
- package/lib/esm/GroupMenu.js +83 -0
- package/lib/esm/Menu.js +26 -12
- package/lib/esm/MenuItem.js +4 -3
- package/lib/esm/MenuSearch.js +305 -0
- package/lib/esm/SideMenu.js +124 -0
- package/lib/esm/button/lib/esm/Button.js +97 -0
- package/lib/esm/button/lib/esm/ButtonGroup.js +44 -0
- package/lib/esm/button/lib/esm/styles/index.scss.js +23 -0
- package/lib/esm/index.js +3 -0
- package/lib/esm/styles/index.scss.js +1 -1
- package/lib/esm/util.js +95 -2
- package/lib/types/EnterIcon.d.ts +1 -0
- package/lib/types/GroupMenu.d.ts +29 -0
- package/lib/types/Menu.d.ts +4 -0
- package/lib/types/MenuSearch.d.ts +37 -0
- package/lib/types/SideMenu.d.ts +58 -0
- package/lib/types/context.d.ts +2 -1
- package/lib/types/index.d.ts +3 -0
- package/lib/types/util.d.ts +16 -0
- package/package.json +27 -19
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/menu
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var tslib = require('tslib');
|
|
17
|
+
var React = require('react');
|
|
18
|
+
var core = require('@hi-ui/core');
|
|
19
|
+
var env = require('@hi-ui/env');
|
|
20
|
+
var classname = require('@hi-ui/classname');
|
|
21
|
+
var icons = require('@hi-ui/icons');
|
|
22
|
+
var IconButton = require('@hi-ui/icon-button');
|
|
23
|
+
require('./button/lib/esm/styles/index.scss.js');
|
|
24
|
+
var Button = require('./button/lib/esm/Button.js');
|
|
25
|
+
require('./button/lib/esm/ButtonGroup.js');
|
|
26
|
+
var Input = require('@hi-ui/input');
|
|
27
|
+
var Highlighter = require('@hi-ui/highlighter');
|
|
28
|
+
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
|
29
|
+
var useToggle = require('@hi-ui/use-toggle');
|
|
30
|
+
var EllipsisTooltip = require('@hi-ui/ellipsis-tooltip');
|
|
31
|
+
var EnterIcon = require('./EnterIcon.js');
|
|
32
|
+
var util = require('./util.js');
|
|
33
|
+
function _interopDefaultCompat(e) {
|
|
34
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
35
|
+
'default': e
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
39
|
+
var IconButton__default = /*#__PURE__*/_interopDefaultCompat(IconButton);
|
|
40
|
+
var Input__default = /*#__PURE__*/_interopDefaultCompat(Input);
|
|
41
|
+
var Highlighter__default = /*#__PURE__*/_interopDefaultCompat(Highlighter);
|
|
42
|
+
var EllipsisTooltip__default = /*#__PURE__*/_interopDefaultCompat(EllipsisTooltip);
|
|
43
|
+
var _role = 'menu-search';
|
|
44
|
+
var _prefix = classname.getPrefixCls(_role);
|
|
45
|
+
var MenuSearch = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
46
|
+
var _cx, _cx2;
|
|
47
|
+
var _b, _c;
|
|
48
|
+
var innerRef = _a.innerRef,
|
|
49
|
+
_a$prefixCls = _a.prefixCls,
|
|
50
|
+
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
|
51
|
+
className = _a.className,
|
|
52
|
+
placeholder = _a.placeholder,
|
|
53
|
+
width = _a.width,
|
|
54
|
+
style = _a.style,
|
|
55
|
+
visibleProp = _a.visible,
|
|
56
|
+
data = _a.data,
|
|
57
|
+
_a$defaultValue = _a.defaultValue,
|
|
58
|
+
defaultValue = _a$defaultValue === void 0 ? '' : _a$defaultValue,
|
|
59
|
+
valueProp = _a.value,
|
|
60
|
+
onChange = _a.onChange,
|
|
61
|
+
onSelect = _a.onSelect,
|
|
62
|
+
onClear = _a.onClear,
|
|
63
|
+
onClose = _a.onClose,
|
|
64
|
+
onEsc = _a.onEsc;
|
|
65
|
+
tslib.__rest(_a, ["innerRef", "prefixCls", "className", "clearText", "placeholder", "notFoundContent", "width", "style", "visible", "data", "defaultValue", "value", "onChange", "onSearch", "onSelect", "onClear", "onClose", "onEsc"]);
|
|
66
|
+
var i18n = core.useLocaleContext();
|
|
67
|
+
var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
|
|
68
|
+
visible: visibleProp
|
|
69
|
+
}),
|
|
70
|
+
visible = _useUncontrolledToggl[0],
|
|
71
|
+
visibleAction = _useUncontrolledToggl[1];
|
|
72
|
+
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultValue, valueProp, onChange),
|
|
73
|
+
value = _useUncontrolledState[0],
|
|
74
|
+
tryChangeValue = _useUncontrolledState[1];
|
|
75
|
+
var _useState = React.useState(-1),
|
|
76
|
+
currentIndex = _useState[0],
|
|
77
|
+
setCurrentIndex = _useState[1];
|
|
78
|
+
var listRef = React.useRef(null);
|
|
79
|
+
React.useLayoutEffect(function () {
|
|
80
|
+
if (currentIndex === -1 || !listRef.current) return;
|
|
81
|
+
var listContainer = listRef.current;
|
|
82
|
+
var selectedItem = listContainer.children[currentIndex];
|
|
83
|
+
if (!selectedItem) return;
|
|
84
|
+
var containerScrollTop = listContainer.scrollTop;
|
|
85
|
+
var containerHeight = listContainer.clientHeight;
|
|
86
|
+
var itemTop = selectedItem.offsetTop;
|
|
87
|
+
var itemHeight = selectedItem.offsetHeight;
|
|
88
|
+
// 计算元素的可见范围
|
|
89
|
+
var itemBottom = itemTop + itemHeight;
|
|
90
|
+
var visibleTop = containerScrollTop;
|
|
91
|
+
var visibleBottom = containerScrollTop + containerHeight;
|
|
92
|
+
// 判断是否需要滚动
|
|
93
|
+
var isItemAboveViewport = itemTop < visibleTop;
|
|
94
|
+
var isItemBelowViewport = itemBottom > visibleBottom;
|
|
95
|
+
if (isItemAboveViewport) {
|
|
96
|
+
// 如果元素在可视区域上方,滚动到元素顶部
|
|
97
|
+
listContainer.scrollTop = itemTop;
|
|
98
|
+
} else if (isItemBelowViewport) {
|
|
99
|
+
// 如果元素在可视区域下方,滚动到元素底部刚好可见
|
|
100
|
+
listContainer.scrollTop = itemBottom - containerHeight;
|
|
101
|
+
}
|
|
102
|
+
}, [currentIndex]);
|
|
103
|
+
var resultMemo = React__default["default"].useMemo(function () {
|
|
104
|
+
if (!data || !value) return [];
|
|
105
|
+
// 使用新的搜索算法
|
|
106
|
+
var searchResults = util.searchMenuWithPath(data, value);
|
|
107
|
+
return searchResults.map(function (result) {
|
|
108
|
+
return Object.assign(Object.assign({}, result.node), {
|
|
109
|
+
level: result.level,
|
|
110
|
+
path: result.path,
|
|
111
|
+
// 添加路径信息用于显示
|
|
112
|
+
pathTitles: result.path.map(function (p) {
|
|
113
|
+
var _a;
|
|
114
|
+
return (_a = p.title) === null || _a === void 0 ? void 0 : _a.toString();
|
|
115
|
+
}).filter(Boolean)
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}, [data, value]);
|
|
119
|
+
var handleChange = React.useCallback(function (value) {
|
|
120
|
+
tryChangeValue(value);
|
|
121
|
+
}, [tryChangeValue]);
|
|
122
|
+
var handleSelect = React.useCallback(function (id, item, index) {
|
|
123
|
+
var _a;
|
|
124
|
+
setCurrentIndex(index);
|
|
125
|
+
visibleAction.off();
|
|
126
|
+
// 让列表容器获取焦点,确保键盘导航可用
|
|
127
|
+
(_a = listRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
128
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(id, item);
|
|
129
|
+
}, [onSelect, visibleAction]);
|
|
130
|
+
var handleMove = React.useCallback(function (direction) {
|
|
131
|
+
if (!resultMemo) return;
|
|
132
|
+
setCurrentIndex(function (prev) {
|
|
133
|
+
if (direction === 'up') {
|
|
134
|
+
return prev - 1 < 0 ? (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) - 1 : prev - 1;
|
|
135
|
+
} else {
|
|
136
|
+
return prev + 1 > (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) - 1 ? 0 : prev + 1;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}, [resultMemo]);
|
|
140
|
+
var handleEnter = React.useCallback(function () {
|
|
141
|
+
if (!resultMemo) return;
|
|
142
|
+
if (currentIndex === -1) {
|
|
143
|
+
setCurrentIndex(0);
|
|
144
|
+
}
|
|
145
|
+
visibleAction.off();
|
|
146
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(resultMemo[currentIndex].id, resultMemo[currentIndex]);
|
|
147
|
+
}, [resultMemo, currentIndex, onSelect, visibleAction]);
|
|
148
|
+
var handleClear = React.useCallback(function () {
|
|
149
|
+
tryChangeValue('');
|
|
150
|
+
setCurrentIndex(-1);
|
|
151
|
+
onClear === null || onClear === void 0 ? void 0 : onClear();
|
|
152
|
+
}, [onClear, tryChangeValue]);
|
|
153
|
+
var handleClose = React.useCallback(function () {
|
|
154
|
+
visibleAction.off();
|
|
155
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
156
|
+
}, [onClose, visibleAction]);
|
|
157
|
+
var handleEscape = React.useCallback(function () {
|
|
158
|
+
handleClose();
|
|
159
|
+
onEsc === null || onEsc === void 0 ? void 0 : onEsc();
|
|
160
|
+
}, [handleClose, onEsc]);
|
|
161
|
+
var handleKeyDown = React.useCallback(function (e) {
|
|
162
|
+
if (e.key === 'ArrowUp') {
|
|
163
|
+
handleMove('up');
|
|
164
|
+
}
|
|
165
|
+
if (e.key === 'ArrowDown') {
|
|
166
|
+
handleMove('down');
|
|
167
|
+
}
|
|
168
|
+
if (e.key === 'Enter') {
|
|
169
|
+
handleEnter();
|
|
170
|
+
}
|
|
171
|
+
if (e.key === 'Escape') {
|
|
172
|
+
handleEscape();
|
|
173
|
+
}
|
|
174
|
+
}, [handleEnter, handleMove, handleEscape]);
|
|
175
|
+
var _useState2 = React.useState(null),
|
|
176
|
+
inputRef = _useState2[0],
|
|
177
|
+
setInputRef = _useState2[1];
|
|
178
|
+
React.useEffect(function () {
|
|
179
|
+
if (!value || !inputRef) {
|
|
180
|
+
visibleAction.off();
|
|
181
|
+
} else {
|
|
182
|
+
visibleAction.on();
|
|
183
|
+
}
|
|
184
|
+
}, [inputRef, value, visibleAction]);
|
|
185
|
+
React.useImperativeHandle(innerRef, function () {
|
|
186
|
+
return {
|
|
187
|
+
show: function show() {
|
|
188
|
+
visibleAction.on();
|
|
189
|
+
},
|
|
190
|
+
hide: function hide() {
|
|
191
|
+
visibleAction.off();
|
|
192
|
+
},
|
|
193
|
+
focus: function focus() {
|
|
194
|
+
inputRef === null || inputRef === void 0 ? void 0 : inputRef.focus();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
var cls = classname.cx(prefixCls, className, (_cx = {}, _cx[prefixCls + "--open"] = visible, _cx));
|
|
199
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
200
|
+
className: cls,
|
|
201
|
+
style: style
|
|
202
|
+
}, /*#__PURE__*/React__default["default"].createElement(MenuSearchInput, {
|
|
203
|
+
width: width,
|
|
204
|
+
prefixCls: prefixCls,
|
|
205
|
+
placeholder: placeholder,
|
|
206
|
+
value: value,
|
|
207
|
+
onChange: handleChange,
|
|
208
|
+
onClear: handleClear,
|
|
209
|
+
onClose: handleClose,
|
|
210
|
+
onKeyDown: handleKeyDown,
|
|
211
|
+
inputRef: setInputRef
|
|
212
|
+
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
213
|
+
className: classname.cx(prefixCls + "__content", (_cx2 = {}, _cx2[prefixCls + "__content--visible"] = visible, _cx2))
|
|
214
|
+
}, (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) > 0 ? ( /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
215
|
+
className: prefixCls + "__header"
|
|
216
|
+
}, /*#__PURE__*/React__default["default"].createElement(Highlighter__default["default"], {
|
|
217
|
+
keyword: String((_b = resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) !== null && _b !== void 0 ? _b : 0)
|
|
218
|
+
}, i18n.get('menuSearch.searchResult', {
|
|
219
|
+
count: (_c = resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) !== null && _c !== void 0 ? _c : 0,
|
|
220
|
+
keyword: value
|
|
221
|
+
}))), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
222
|
+
className: prefixCls + "__list",
|
|
223
|
+
ref: listRef,
|
|
224
|
+
tabIndex: -1,
|
|
225
|
+
onKeyDown: handleKeyDown
|
|
226
|
+
}, resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.map(function (item, index) {
|
|
227
|
+
var _cx3;
|
|
228
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
229
|
+
key: item.id,
|
|
230
|
+
className: classname.cx(prefixCls + "__list-item", (_cx3 = {}, _cx3[prefixCls + "__list-item--selected"] = currentIndex === index, _cx3)),
|
|
231
|
+
onClick: function onClick() {
|
|
232
|
+
return handleSelect(item.id, item, index);
|
|
233
|
+
}
|
|
234
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
235
|
+
className: prefixCls + "__list-item__title"
|
|
236
|
+
}, /*#__PURE__*/React__default["default"].createElement(EllipsisTooltip__default["default"], {
|
|
237
|
+
tooltipProps: {
|
|
238
|
+
style: {
|
|
239
|
+
maxWidth: 320
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}, /*#__PURE__*/React__default["default"].createElement(Highlighter__default["default"], {
|
|
243
|
+
keyword: value
|
|
244
|
+
}, item.pathTitles.join('/')))));
|
|
245
|
+
})))) : ( /*#__PURE__*/React__default["default"].createElement("div", {
|
|
246
|
+
className: prefixCls + "__empty"
|
|
247
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", null, i18n.menuSearch.searchEmptyResult)))), (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) > 0 && ( /*#__PURE__*/React__default["default"].createElement("div", {
|
|
248
|
+
className: prefixCls + "__footer"
|
|
249
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
250
|
+
className: prefixCls + "__footer-item"
|
|
251
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
252
|
+
className: prefixCls + "__footer-item__icon"
|
|
253
|
+
}, /*#__PURE__*/React__default["default"].createElement(icons.ArrowUpOutlined, null), /*#__PURE__*/React__default["default"].createElement(icons.ArrowDownOutlined, null)), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
254
|
+
className: prefixCls + "__footer-item__text"
|
|
255
|
+
}, i18n.menuSearch.moveCursor)), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
256
|
+
className: prefixCls + "__footer-item"
|
|
257
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
258
|
+
className: prefixCls + "__footer-item__icon"
|
|
259
|
+
}, /*#__PURE__*/React__default["default"].createElement(EnterIcon.EnterIcon, null)), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
260
|
+
className: prefixCls + "__footer-item__text"
|
|
261
|
+
}, i18n.menuSearch.confirmSelect)), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
262
|
+
className: prefixCls + "__footer-item"
|
|
263
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
264
|
+
className: prefixCls + "__footer-item__icon"
|
|
265
|
+
}, "esc"), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
266
|
+
className: prefixCls + "__footer-item__text"
|
|
267
|
+
}, i18n.menuSearch.hideWindow)))));
|
|
268
|
+
});
|
|
269
|
+
if (env.__DEV__) {
|
|
270
|
+
MenuSearch.displayName = 'MenuSearch';
|
|
271
|
+
}
|
|
272
|
+
var MenuSearchInput = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
273
|
+
var prefixCls = _a.prefixCls,
|
|
274
|
+
placeholder = _a.placeholder,
|
|
275
|
+
width = _a.width,
|
|
276
|
+
value = _a.value,
|
|
277
|
+
_onChange = _a.onChange,
|
|
278
|
+
onClear = _a.onClear,
|
|
279
|
+
onClose = _a.onClose,
|
|
280
|
+
onKeyDown = _a.onKeyDown,
|
|
281
|
+
inputRef = _a.inputRef,
|
|
282
|
+
rest = tslib.__rest(_a, ["prefixCls", "placeholder", "width", "value", "onChange", "onClear", "onClose", "onKeyDown", "inputRef"]);
|
|
283
|
+
var i18n = core.useLocaleContext();
|
|
284
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
285
|
+
ref: ref,
|
|
286
|
+
className: prefixCls + "__input-wrapper",
|
|
287
|
+
style: {
|
|
288
|
+
width: width
|
|
289
|
+
}
|
|
290
|
+
}, /*#__PURE__*/React__default["default"].createElement(Input__default["default"], Object.assign({
|
|
291
|
+
ref: inputRef,
|
|
292
|
+
className: prefixCls + "__input",
|
|
293
|
+
classNames: {
|
|
294
|
+
prefix: prefixCls + "__input-prefix"
|
|
295
|
+
},
|
|
296
|
+
appearance: "unset",
|
|
297
|
+
placeholder: placeholder,
|
|
298
|
+
prefix: /*#__PURE__*/React__default["default"].createElement(icons.SearchOutlined, null),
|
|
299
|
+
suffix: /*#__PURE__*/React__default["default"].createElement(Button.Button, {
|
|
300
|
+
className: prefixCls + "__input-clear",
|
|
301
|
+
appearance: "link",
|
|
302
|
+
size: "xs",
|
|
303
|
+
onClick: onClear
|
|
304
|
+
}, i18n.menuSearch.clear),
|
|
305
|
+
value: value,
|
|
306
|
+
onChange: function onChange(e) {
|
|
307
|
+
return _onChange === null || _onChange === void 0 ? void 0 : _onChange(e.target.value);
|
|
308
|
+
},
|
|
309
|
+
onKeyDown: onKeyDown
|
|
310
|
+
}, rest)), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
311
|
+
className: prefixCls + "__close"
|
|
312
|
+
}, /*#__PURE__*/React__default["default"].createElement(IconButton__default["default"], {
|
|
313
|
+
icon: /*#__PURE__*/React__default["default"].createElement(icons.CloseOutlined, null),
|
|
314
|
+
effect: true,
|
|
315
|
+
onClick: onClose
|
|
316
|
+
})));
|
|
317
|
+
});
|
|
318
|
+
if (env.__DEV__) {
|
|
319
|
+
MenuSearchInput.displayName = 'MenuSearchInput';
|
|
320
|
+
}
|
|
321
|
+
exports.MenuSearch = MenuSearch;
|
|
322
|
+
exports.MenuSearchInput = MenuSearchInput;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/menu
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var tslib = require('tslib');
|
|
17
|
+
var React = require('react');
|
|
18
|
+
var classname = require('@hi-ui/classname');
|
|
19
|
+
var env = require('@hi-ui/env');
|
|
20
|
+
var EllipsisTooltip = require('@hi-ui/ellipsis-tooltip');
|
|
21
|
+
var useLatest = require('@hi-ui/use-latest');
|
|
22
|
+
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
|
23
|
+
var Scrollbar = require('@hi-ui/scrollbar');
|
|
24
|
+
var util = require('./util.js');
|
|
25
|
+
function _interopDefaultCompat(e) {
|
|
26
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
27
|
+
'default': e
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
31
|
+
var EllipsisTooltip__default = /*#__PURE__*/_interopDefaultCompat(EllipsisTooltip);
|
|
32
|
+
var Scrollbar__default = /*#__PURE__*/_interopDefaultCompat(Scrollbar);
|
|
33
|
+
var SIDE_MENU_PREFIX = classname.getPrefixCls('side-menu');
|
|
34
|
+
/**
|
|
35
|
+
* 侧边菜单组件
|
|
36
|
+
*/
|
|
37
|
+
var SideMenu = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
38
|
+
var _cx;
|
|
39
|
+
var _a$prefixCls = _a.prefixCls,
|
|
40
|
+
prefixCls = _a$prefixCls === void 0 ? SIDE_MENU_PREFIX : _a$prefixCls,
|
|
41
|
+
_a$role = _a.role,
|
|
42
|
+
role = _a$role === void 0 ? 'side-menu' : _a$role,
|
|
43
|
+
className = _a.className,
|
|
44
|
+
_a$defaultActiveId = _a.defaultActiveId,
|
|
45
|
+
defaultActiveId = _a$defaultActiveId === void 0 ? null : _a$defaultActiveId,
|
|
46
|
+
activeIdProp = _a.activeId,
|
|
47
|
+
selectedIdProp = _a.selectedId,
|
|
48
|
+
_a$data = _a.data,
|
|
49
|
+
data = _a$data === void 0 ? [] : _a$data,
|
|
50
|
+
mini = _a.mini,
|
|
51
|
+
onClick = _a.onClick,
|
|
52
|
+
onMouseEnter = _a.onMouseEnter,
|
|
53
|
+
onMouseLeave = _a.onMouseLeave,
|
|
54
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "defaultActiveId", "activeId", "selectedId", "data", "mini", "childrenContainerRef", "onClick", "onMouseEnter", "onMouseLeave"]);
|
|
55
|
+
var cls = classname.cx(prefixCls, className, (_cx = {}, _cx[prefixCls + "--mini"] = mini, _cx));
|
|
56
|
+
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultActiveId, activeIdProp),
|
|
57
|
+
activeId = _useUncontrolledState[0],
|
|
58
|
+
tryChangeActiveId = _useUncontrolledState[1];
|
|
59
|
+
var handleClick = useLatest.useLatestCallback(function (event, id, item) {
|
|
60
|
+
tryChangeActiveId(id);
|
|
61
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event, id, item);
|
|
62
|
+
});
|
|
63
|
+
var handleMouseEnter = useLatest.useLatestCallback(function (event, id, item) {
|
|
64
|
+
event.stopPropagation();
|
|
65
|
+
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(event, id, item);
|
|
66
|
+
});
|
|
67
|
+
var handleMouseLeave = useLatest.useLatestCallback(function (event, id, item) {
|
|
68
|
+
event.stopPropagation();
|
|
69
|
+
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(event, id, item);
|
|
70
|
+
});
|
|
71
|
+
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
|
72
|
+
ref: ref,
|
|
73
|
+
role: role,
|
|
74
|
+
className: cls
|
|
75
|
+
}, rest), /*#__PURE__*/React__default["default"].createElement(Scrollbar__default["default"], {
|
|
76
|
+
onlyScrollVisible: true,
|
|
77
|
+
axes: "y"
|
|
78
|
+
}, data.map(function (item) {
|
|
79
|
+
var _cx2;
|
|
80
|
+
var id = item.id,
|
|
81
|
+
title = item.title,
|
|
82
|
+
icon = item.icon;
|
|
83
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
84
|
+
key: id,
|
|
85
|
+
className: classname.cx(prefixCls + "-item-wrapper"),
|
|
86
|
+
onClick: function onClick(event) {
|
|
87
|
+
return handleClick(event, id, item);
|
|
88
|
+
},
|
|
89
|
+
onMouseEnter: function onMouseEnter(event) {
|
|
90
|
+
return handleMouseEnter(event, id, item);
|
|
91
|
+
},
|
|
92
|
+
onMouseLeave: function onMouseLeave(event) {
|
|
93
|
+
return handleMouseLeave(event, id, item);
|
|
94
|
+
}
|
|
95
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
96
|
+
className: classname.cx(prefixCls + "-item", (_cx2 = {}, _cx2[prefixCls + "-item--active"] = activeId === id, _cx2[prefixCls + "-item--mini"] = mini, _cx2[prefixCls + "-item--selected"] = selectedIdProp === id, _cx2))
|
|
97
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
98
|
+
className: classname.cx(prefixCls + "-item__icon")
|
|
99
|
+
}, icon), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
100
|
+
className: classname.cx(prefixCls + "-item__title")
|
|
101
|
+
}, /*#__PURE__*/React__default["default"].createElement(EllipsisTooltip__default["default"], null, title))));
|
|
102
|
+
})));
|
|
103
|
+
});
|
|
104
|
+
if (env.__DEV__) {
|
|
105
|
+
SideMenu.displayName = 'SideMenu';
|
|
106
|
+
}
|
|
107
|
+
var useSideMenuCascade = function useSideMenuCascade(_ref) {
|
|
108
|
+
var data = _ref.data,
|
|
109
|
+
selectId = _ref.selectId,
|
|
110
|
+
activeId = _ref.activeId;
|
|
111
|
+
var activeParents = React__default["default"].useMemo(function () {
|
|
112
|
+
return util.getAncestorIds(activeId, data);
|
|
113
|
+
}, [activeId, data]);
|
|
114
|
+
var selectParents = React__default["default"].useMemo(function () {
|
|
115
|
+
return util.getAncestorIds(selectId, data);
|
|
116
|
+
}, [selectId, data]);
|
|
117
|
+
var selectParentId = React__default["default"].useMemo(function () {
|
|
118
|
+
var _a;
|
|
119
|
+
return (_a = selectParents[selectParents.length - 1]) !== null && _a !== void 0 ? _a : selectId;
|
|
120
|
+
}, [selectId, selectParents]);
|
|
121
|
+
var activeParentId = React__default["default"].useMemo(function () {
|
|
122
|
+
var _a;
|
|
123
|
+
return (_a = activeParents[activeParents.length - 1]) !== null && _a !== void 0 ? _a : activeId;
|
|
124
|
+
}, [activeId, activeParents]);
|
|
125
|
+
var submenuData = React__default["default"].useMemo(function () {
|
|
126
|
+
var _a;
|
|
127
|
+
var parentId = selectParentId || activeParentId;
|
|
128
|
+
return ((_a = data.find(function (item) {
|
|
129
|
+
return item.id === parentId;
|
|
130
|
+
})) === null || _a === void 0 ? void 0 : _a.children) || [];
|
|
131
|
+
}, [selectParentId, activeParentId, data]);
|
|
132
|
+
return {
|
|
133
|
+
submenuData: submenuData,
|
|
134
|
+
selectParentId: selectParentId,
|
|
135
|
+
activeParentId: activeParentId
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
exports.SideMenu = SideMenu;
|
|
139
|
+
exports.useSideMenuCascade = useSideMenuCascade;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/menu
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var tslib = require('tslib');
|
|
17
|
+
var React = require('react');
|
|
18
|
+
var classname = require('@hi-ui/classname');
|
|
19
|
+
var env = require('@hi-ui/env');
|
|
20
|
+
function _interopDefaultCompat(e) {
|
|
21
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
22
|
+
'default': e
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
26
|
+
|
|
27
|
+
/** @LICENSE
|
|
28
|
+
* @hi-ui/button
|
|
29
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/button#readme
|
|
30
|
+
*
|
|
31
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
32
|
+
*
|
|
33
|
+
* This source code is licensed under the MIT license found in the
|
|
34
|
+
* LICENSE file in the root directory of this source tree.
|
|
35
|
+
*/
|
|
36
|
+
var _role = 'button';
|
|
37
|
+
var _prefix = classname.getPrefixCls(_role);
|
|
38
|
+
/**
|
|
39
|
+
* 按钮
|
|
40
|
+
*/
|
|
41
|
+
var Button = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
42
|
+
var _a$prefixCls = _a.prefixCls,
|
|
43
|
+
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
|
44
|
+
_a$role = _a.role,
|
|
45
|
+
role = _a$role === void 0 ? _role : _a$role,
|
|
46
|
+
className = _a.className,
|
|
47
|
+
children = _a.children,
|
|
48
|
+
_a$type = _a.type,
|
|
49
|
+
type = _a$type === void 0 ? 'default' : _a$type,
|
|
50
|
+
_a$size = _a.size,
|
|
51
|
+
size = _a$size === void 0 ? 'md' : _a$size,
|
|
52
|
+
_a$appearance = _a.appearance,
|
|
53
|
+
appearance = _a$appearance === void 0 ? 'filled' : _a$appearance,
|
|
54
|
+
_a$disabled = _a.disabled,
|
|
55
|
+
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
|
56
|
+
_a$loading = _a.loading,
|
|
57
|
+
loading = _a$loading === void 0 ? false : _a$loading,
|
|
58
|
+
_a$icon = _a.icon,
|
|
59
|
+
icon = _a$icon === void 0 ? null : _a$icon,
|
|
60
|
+
_a$shape = _a.shape,
|
|
61
|
+
shape = _a$shape === void 0 ? 'square' : _a$shape,
|
|
62
|
+
href = _a.href,
|
|
63
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "type", "size", "appearance", "disabled", "loading", "icon", "shape", "href"]);
|
|
64
|
+
var isEmptyChildren = !children || typeof children === 'string' && !children.trim();
|
|
65
|
+
var isNonInteractive = disabled || loading;
|
|
66
|
+
var prefix = loading ? ( /*#__PURE__*/React__default["default"].createElement(IconLoading, {
|
|
67
|
+
className: prefixCls + "__icon " + prefixCls + "__icon--prefix"
|
|
68
|
+
})) : icon && (!Array.isArray(icon) || icon[0]) ? ( /*#__PURE__*/React__default["default"].createElement("span", {
|
|
69
|
+
className: prefixCls + "__icon " + prefixCls + "__icon--prefix"
|
|
70
|
+
}, Array.isArray(icon) ? icon[0] : icon)) : null;
|
|
71
|
+
var suffix = Array.isArray(icon) && icon.length > 1 ? ( /*#__PURE__*/React__default["default"].createElement("span", {
|
|
72
|
+
className: prefixCls + "__icon " + prefixCls + "__icon--suffix"
|
|
73
|
+
}, icon[1])) : null;
|
|
74
|
+
var cls = classname.cx(prefixCls, className, prefixCls + "--appearance-" + appearance, prefixCls + "--size-" + size, prefixCls + "--type-" + type, prefixCls + "--shape-" + shape, isEmptyChildren && prefixCls + "--icon-only", disabled && prefixCls + "--disabled", loading && prefixCls + "--loading");
|
|
75
|
+
return !href ? ( /*#__PURE__*/React__default["default"].createElement("button", Object.assign({
|
|
76
|
+
ref: ref,
|
|
77
|
+
role: role,
|
|
78
|
+
className: cls,
|
|
79
|
+
disabled: isNonInteractive,
|
|
80
|
+
type: "button"
|
|
81
|
+
}, rest), prefix, children, suffix)) : ( /*#__PURE__*/React__default["default"].createElement("a", Object.assign({
|
|
82
|
+
ref: ref,
|
|
83
|
+
role: role,
|
|
84
|
+
href: href,
|
|
85
|
+
className: cls
|
|
86
|
+
}, rest), prefix, children, suffix));
|
|
87
|
+
});
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
Button.HiName = 'Button';
|
|
90
|
+
if (env.__DEV__) {
|
|
91
|
+
Button.displayName = 'Button';
|
|
92
|
+
}
|
|
93
|
+
function IconLoading(_ref) {
|
|
94
|
+
var _ref$className = _ref.className,
|
|
95
|
+
className = _ref$className === void 0 ? '' : _ref$className,
|
|
96
|
+
_ref$size = _ref.size,
|
|
97
|
+
size = _ref$size === void 0 ? '0.8em' : _ref$size;
|
|
98
|
+
return /*#__PURE__*/React__default["default"].createElement("i", {
|
|
99
|
+
className: classname.cx(className)
|
|
100
|
+
}, /*#__PURE__*/React__default["default"].createElement("svg", {
|
|
101
|
+
viewBox: "0 0 18 18",
|
|
102
|
+
width: size,
|
|
103
|
+
height: size,
|
|
104
|
+
fill: "currentColor"
|
|
105
|
+
}, /*#__PURE__*/React__default["default"].createElement("g", null, /*#__PURE__*/React__default["default"].createElement("path", {
|
|
106
|
+
d: "m15.547 2.8242c0.37904 0.40168 0.36068 1.0346-0.040996 1.4136-0.40168 0.37904-1.0346 0.36068-1.4136-0.040996-1.315-1.3935-3.1381-2.1969-5.0922-2.1969-3.866 0-7 3.134-7 7 0 0.55228-0.44772 1-1 1s-1-0.44772-1-1c0-4.9706 4.0294-9 9-9 2.5103 0 4.8578 1.0343 6.5468 2.8242z"
|
|
107
|
+
}))));
|
|
108
|
+
}
|
|
109
|
+
exports.Button = Button;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/menu
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var tslib = require('tslib');
|
|
17
|
+
var React = require('react');
|
|
18
|
+
var classname = require('@hi-ui/classname');
|
|
19
|
+
var env = require('@hi-ui/env');
|
|
20
|
+
function _interopDefaultCompat(e) {
|
|
21
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
22
|
+
'default': e
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
26
|
+
|
|
27
|
+
/** @LICENSE
|
|
28
|
+
* @hi-ui/button
|
|
29
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/button#readme
|
|
30
|
+
*
|
|
31
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
32
|
+
*
|
|
33
|
+
* This source code is licensed under the MIT license found in the
|
|
34
|
+
* LICENSE file in the root directory of this source tree.
|
|
35
|
+
*/
|
|
36
|
+
var _role = 'button-group';
|
|
37
|
+
var _prefix = classname.getPrefixCls(_role);
|
|
38
|
+
var ButtonGroup = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
39
|
+
var _a$prefixCls = _a.prefixCls,
|
|
40
|
+
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
|
41
|
+
_a$role = _a.role,
|
|
42
|
+
role = _a$role === void 0 ? _role : _a$role,
|
|
43
|
+
className = _a.className,
|
|
44
|
+
children = _a.children,
|
|
45
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children"]);
|
|
46
|
+
var cls = classname.cx(prefixCls, className);
|
|
47
|
+
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
|
48
|
+
role: role,
|
|
49
|
+
className: cls,
|
|
50
|
+
ref: ref
|
|
51
|
+
}, rest), children);
|
|
52
|
+
});
|
|
53
|
+
if (env.__DEV__) {
|
|
54
|
+
ButtonGroup.displayName = 'ButtonGroup';
|
|
55
|
+
}
|
|
56
|
+
exports.ButtonGroup = ButtonGroup;
|