tntd 1.4.6 → 1.4.7
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/components/Layout/HeaderActions.js +90 -128
- package/components/LoadingButton/index.js +11 -15
- package/dist/stats.json +4958 -4958
- package/dist/tntd.js +1 -1
- package/es/Layout/HeaderActions.js +10 -10
- package/es/LoadingButton/index.js +20 -10
- package/lib/ArrayInput/icon.js +27 -31
- package/lib/ArrayInput/index.js +211 -298
- package/lib/AuthContext.js +2 -13
- package/lib/Columns/index.js +71 -100
- package/lib/DevelopmentLogin/LoginModal.js +79 -141
- package/lib/DevelopmentLogin/index.js +28 -55
- package/lib/Ellipsis/Svg/CopySVG.js +23 -71
- package/lib/Ellipsis/Svg/TickSVG.js +17 -49
- package/lib/Ellipsis/index.js +148 -154
- package/lib/Handle/index.js +72 -109
- package/lib/Icon/fonts/iconfont.js +1 -43
- package/lib/Icon/iconList.js +119 -8
- package/lib/Icon/index.js +13 -45
- package/lib/Img/Contain.js +49 -81
- package/lib/Img/Cover.js +88 -136
- package/lib/Img/index.js +36 -89
- package/lib/Layout/ActionsContext.js +2 -11
- package/lib/Layout/AppList.js +262 -256
- package/lib/Layout/Application.js +119 -135
- package/lib/Layout/Avatar.js +137 -137
- package/lib/Layout/CompatibleLanguage.js +214 -195
- package/lib/Layout/EnterpriseLayout/Avatar.js +156 -168
- package/lib/Layout/EnterpriseLayout/Language.js +75 -100
- package/lib/Layout/EnterpriseLayout/Theme.js +96 -94
- package/lib/Layout/EnterpriseLayout/index.js +32 -45
- package/lib/Layout/GlobalNavigation/NavigationPopup.js +335 -407
- package/lib/Layout/GlobalNavigation/index.js +110 -158
- package/lib/Layout/Header.js +165 -116
- package/lib/Layout/HeaderActions.js +132 -129
- package/lib/Layout/HeaderNavs.js +90 -113
- package/lib/Layout/HeaderTabs.js +312 -278
- package/lib/Layout/Iconfont.js +2 -15
- package/lib/Layout/Language.js +63 -102
- package/lib/Layout/Layout.js +272 -261
- package/lib/Layout/Logo.js +132 -87
- package/lib/Layout/OrgAppList.js +440 -319
- package/lib/Layout/SideMenu.js +429 -343
- package/lib/Layout/Theme.js +95 -124
- package/lib/Layout/checkAuth.js +21 -35
- package/lib/Layout/createActions.js +38 -51
- package/lib/Layout/images/index.js +33 -41
- package/lib/Layout/index.js +110 -161
- package/lib/Layout/paaslayout/CompactSideMenu.js +200 -178
- package/lib/Layout/paaslayout/Header.js +84 -90
- package/lib/Layout/paaslayout/Logo.js +27 -32
- package/lib/Layout/paaslayout/SideMenu.js +161 -174
- package/lib/Layout/paaslayout/index.js +240 -261
- package/lib/Layout/storage.js +20 -78
- package/lib/Layout/utils.js +93 -143
- package/lib/LoadingButton/index.js +25 -57
- package/lib/Modal/index.js +83 -108
- package/lib/Page/Box.js +56 -81
- package/lib/Page/index.js +151 -173
- package/lib/Page/utils.js +12 -30
- package/lib/QueryForm/Field/Checkbox.js +11 -33
- package/lib/QueryForm/Field/Select.js +63 -99
- package/lib/QueryForm/Field/SelectInput.js +69 -114
- package/lib/QueryForm/Field/fieldsMap.js +30 -52
- package/lib/QueryForm/Field/index.js +76 -158
- package/lib/QueryForm/createActions.js +50 -65
- package/lib/QueryForm/index.js +304 -383
- package/lib/QueryForm/useForm.js +6 -17
- package/lib/QueryListScene/List.js +290 -366
- package/lib/QueryListScene/QueryForm.js +93 -161
- package/lib/QueryListScene/QueryListScene.js +33 -87
- package/lib/QueryListScene/Title.js +10 -20
- package/lib/QueryListScene/Toolbar.js +8 -31
- package/lib/QueryListScene/createActions.js +64 -79
- package/lib/QueryListScene/index.js +23 -40
- package/lib/QueryListScene/useActions.js +6 -17
- package/lib/Select/DropDownWrap.js +60 -124
- package/lib/Select/index.js +425 -561
- package/lib/Table/ResizableTable/index.js +77 -121
- package/lib/Table/index.js +19 -51
- package/lib/Title/index.js +34 -52
- package/lib/index.js +19 -159
- package/lib/locale.js +48 -63
- package/package.json +1 -1
- package/lib/Layout/EnterpriseLayout/Header.js +0 -113
- package/lib/Layout/EnterpriseLayout/HeaderActions.js +0 -104
|
@@ -1,420 +1,348 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
var _Iconfont = _interopRequireDefault(require("../Iconfont"));
|
|
19
|
-
|
|
20
|
-
var _locale = require("../../locale");
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
23
|
-
|
|
24
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
25
|
-
|
|
26
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
27
|
-
|
|
28
|
-
function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
29
|
-
|
|
30
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
31
|
-
|
|
32
|
-
function _templateObject7() {
|
|
33
|
-
var data = _taggedTemplateLiteral(["\n background: #fff;\n max-height: 320px;\n overflow-y: auto;\n margin: 0;\n padding: 6px 0;\n list-style: none;\n font-size: 13px;\n position: absolute;\n top: 29px;\n width: 100%;\n box-shadow: 0 3px 6px -4px rgba(0,0,0,.12), 0 6px 16px 0 rgba(0,0,0,.08), 0 9px 28px 8px rgba(0,0,0,.05);\n li {\n cursor: pointer;\n line-height: 32px;\n padding: 0 10px;\n color: ", ";\n &:hover {\n color: ", ";\n background-color: ", ";\n }\n }\n"]);
|
|
34
|
-
|
|
35
|
-
_templateObject7 = function _templateObject7() {
|
|
36
|
-
return data;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
return data;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function _templateObject6() {
|
|
43
|
-
var data = _taggedTemplateLiteral(["\n display: block;\n line-height: 30px;\n font-size: 12px;\n cursor: pointer;\n a {\n color: ", ";\n &:hover {\n color: ", " !important;\n }\n }\n &.active a {\n color: ", ";\n }\n"]);
|
|
44
|
-
|
|
45
|
-
_templateObject6 = function _templateObject6() {
|
|
46
|
-
return data;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return data;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function _templateObject5() {
|
|
53
|
-
var data = _taggedTemplateLiteral(["\n list-style: none;\n padding: 0;\n margin: 0;\n"]);
|
|
54
|
-
|
|
55
|
-
_templateObject5 = function _templateObject5() {
|
|
56
|
-
return data;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
return data;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function _templateObject4() {
|
|
63
|
-
var data = _taggedTemplateLiteral(["\n margin-bottom: 20px;\n & > h5 {\n line-height: 20px;\n margin: 0;\n margin-bottom: 6px;\n }\n"]);
|
|
64
|
-
|
|
65
|
-
_templateObject4 = function _templateObject4() {
|
|
66
|
-
return data;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
return data;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function _templateObject3() {
|
|
73
|
-
var data = _taggedTemplateLiteral(["\n height: ", ";\n overflow: auto;\n & > div {\n width: 200px;\n margin-right: 10px;\n display: inline-block;\n vertical-align: top;\n }\n"]);
|
|
74
|
-
|
|
75
|
-
_templateObject3 = function _templateObject3() {
|
|
76
|
-
return data;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
return data;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function _templateObject2() {
|
|
83
|
-
var data = _taggedTemplateLiteral(["\n border: 1px solid ", ";\n color: ", ";\n line-height: 32px;\n margin: 0 0 16px;\n padding: 0;\n display: inline-block;\n\n & > li {\n padding: 0 20px;\n display: inline-block;\n cursor: pointer;\n &:not(:last-child) {\n border-right: 1px solid ", ";\n }\n &.active {\n background-color: ", ";\n color: #fff;\n }\n }\n"]);
|
|
84
|
-
|
|
85
|
-
_templateObject2 = function _templateObject2() {
|
|
86
|
-
return data;
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
return data;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function _templateObject() {
|
|
93
|
-
var data = _taggedTemplateLiteral(["\n position: relative;\n font-size: 14px;\n margin-bottom: 20px;\n color: ", ";\n &.active {\n color: ", ";\n input {\n border-color: ", ";\n }\n }\n .tnt-icon {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n line-height: 1em;\n &[type=\"close\"] {\n right: 0;\n top: 0;\n font-size: 18px;\n cursor: pointer;\n }\n }\n input {\n border-width: 0 0 1px;\n border-style: solid;\n border-color: ", ";\n width: 100%;\n padding: 4px 20px;\n line-height: 20px;\n background-color: transparent;\n outline: none;\n }\n"]);
|
|
94
|
-
|
|
95
|
-
_templateObject = function _templateObject() {
|
|
96
|
-
return data;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
return data;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
103
|
-
|
|
104
|
-
var SearchArea = _styledComponents["default"].div(_templateObject(), function (props) {
|
|
105
|
-
return props.theme.secondaryTextColor;
|
|
106
|
-
}, function (props) {
|
|
107
|
-
return props.theme.primaryColor;
|
|
108
|
-
}, function (props) {
|
|
109
|
-
return props.theme.primaryColor;
|
|
110
|
-
}, function (props) {
|
|
111
|
-
return props.theme.borderColor;
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
var ApplicationTabs = _styledComponents["default"].ul(_templateObject2(), function (props) {
|
|
115
|
-
return props.theme.borderColor;
|
|
116
|
-
}, function (props) {
|
|
117
|
-
return props.theme.primaryTextColor;
|
|
118
|
-
}, function (props) {
|
|
119
|
-
return props.theme.borderColor;
|
|
120
|
-
}, function (props) {
|
|
121
|
-
return props.theme.primaryColor;
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
var GroupMenus = _styledComponents["default"].div(_templateObject3(), function (props) {
|
|
125
|
-
return props.isLevel3 ? 'calc(100% - 80px)' : 'calc(100% - 50px)';
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
var GroupMenuItem = _styledComponents["default"].div(_templateObject4());
|
|
129
|
-
|
|
130
|
-
var MenuList = _styledComponents["default"].ul(_templateObject5());
|
|
131
|
-
|
|
132
|
-
var MenuItem = _styledComponents["default"].li(_templateObject6(), function (props) {
|
|
133
|
-
return props.theme.secondaryTextColor;
|
|
134
|
-
}, function (props) {
|
|
135
|
-
return props.theme.secondaryColor;
|
|
136
|
-
}, function (props) {
|
|
137
|
-
return props.theme.primaryColor;
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
var ListBox = _styledComponents["default"].ul(_templateObject7(), function (props) {
|
|
141
|
-
return props.theme.primaryTextColor;
|
|
142
|
-
}, function (props) {
|
|
143
|
-
return props.theme.secondaryColor;
|
|
144
|
-
}, function (props) {
|
|
145
|
-
return props.theme.lightBgColor;
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
var SearchList = function SearchList(_ref) {
|
|
149
|
-
var items = _ref.items,
|
|
150
|
-
onSelectMenu = _ref.onSelectMenu,
|
|
151
|
-
theme = _ref.theme;
|
|
152
|
-
return React.createElement(ListBox, {
|
|
153
|
-
theme: theme
|
|
154
|
-
}, items == null ? void 0 : items.map(function (item) {
|
|
155
|
-
return React.createElement("li", {
|
|
156
|
-
onClick: function onClick() {
|
|
157
|
-
return onSelectMenu(item);
|
|
158
|
-
}
|
|
159
|
-
}, item == null ? void 0 : item.menuName);
|
|
160
|
-
}));
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
var _default = function _default(_ref2) {
|
|
164
|
-
var theme = _ref2.theme,
|
|
165
|
-
_ref2$menus = _ref2.menus,
|
|
166
|
-
menus = _ref2$menus === void 0 ? [] : _ref2$menus,
|
|
167
|
-
close = _ref2.close,
|
|
168
|
-
actions = _ref2.actions,
|
|
169
|
-
popupRef = _ref2.popupRef,
|
|
170
|
-
containerRef = _ref2.containerRef;
|
|
171
|
-
|
|
172
|
-
var _useState = (0, _react.useState)(false),
|
|
173
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
174
|
-
active = _useState2[0],
|
|
175
|
-
setActive = _useState2[1];
|
|
176
|
-
|
|
177
|
-
var _useState3 = (0, _react.useState)(),
|
|
178
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
179
|
-
searchValue = _useState4[0],
|
|
180
|
-
setSearchValue = _useState4[1];
|
|
181
|
-
|
|
182
|
-
var language = actions == null ? void 0 : actions.getLanguage();
|
|
183
|
-
var isLevel3 = (0, _utils.hasLevel3)(menus);
|
|
184
|
-
|
|
185
|
-
var _useState5 = (0, _react.useState)(isLevel3 ? menus == null ? void 0 : menus[0] : null),
|
|
186
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
187
|
-
activeTopMenu = _useState6[0],
|
|
188
|
-
setActiveTopMenu = _useState6[1];
|
|
189
|
-
|
|
190
|
-
var selectedMenuKey = actions.getSelectedMenuKey();
|
|
191
|
-
|
|
192
|
-
var calcGroupMenus = function calcGroupMenus(menus) {
|
|
193
|
-
var _menus, _menus2;
|
|
194
|
-
|
|
195
|
-
menus = (_menus = menus) == null ? void 0 : _menus.reduce(function (acc, cur) {
|
|
196
|
-
var _cur$children;
|
|
197
|
-
|
|
198
|
-
// 分组
|
|
199
|
-
if (cur == null ? void 0 : (_cur$children = cur.children) == null ? void 0 : _cur$children.length) {
|
|
200
|
-
acc.push(cur);
|
|
201
|
-
} else {
|
|
202
|
-
var defaultGroup = acc.find(function (_ref3) {
|
|
203
|
-
var isDefaultGroup = _ref3.isDefaultGroup;
|
|
204
|
-
return isDefaultGroup;
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
if (!defaultGroup) {
|
|
208
|
-
acc.unshift({
|
|
209
|
-
isDefaultGroup: true,
|
|
210
|
-
children: [cur]
|
|
211
|
-
});
|
|
212
|
-
} else {
|
|
213
|
-
defaultGroup.children.push(cur);
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import { debounce } from 'lodash';
|
|
5
|
+
import { traverseTree, hasLevel3 } from '../utils';
|
|
6
|
+
import Icon from '../Iconfont';
|
|
7
|
+
import { getText } from '../../locale';
|
|
8
|
+
|
|
9
|
+
const SearchArea = styled.div`
|
|
10
|
+
position: relative;
|
|
11
|
+
font-size: 14px;
|
|
12
|
+
margin-bottom: 20px;
|
|
13
|
+
color: ${props => props.theme.secondaryTextColor};
|
|
14
|
+
&.active {
|
|
15
|
+
color: ${props => props.theme.primaryColor};
|
|
16
|
+
input {
|
|
17
|
+
border-color: ${props => props.theme.primaryColor};
|
|
214
18
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
var _group$children;
|
|
227
|
-
|
|
228
|
-
return 46 + ((group == null ? void 0 : (_group$children = group.children) == null ? void 0 : _group$children.length) || 0) * 30;
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
var calcColumnHeight = function calcColumnHeight(columnGroups) {
|
|
232
|
-
return columnGroups == null ? void 0 : columnGroups.reduce(function (acc, cur) {
|
|
233
|
-
acc += calcGroupHeight(cur);
|
|
234
|
-
return acc;
|
|
235
|
-
}, 0);
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
var currentColumnHeight = calcColumnHeight(acc[acc.length - 1]);
|
|
239
|
-
var nextGroupHeight = calcGroupHeight(cur);
|
|
240
|
-
|
|
241
|
-
var findMinHeightGroup = function findMinHeightGroup(groups) {
|
|
242
|
-
var minHeight = Infinity;
|
|
243
|
-
var index = 0;
|
|
244
|
-
|
|
245
|
-
for (var i = 0; i < groups.length; i++) {
|
|
246
|
-
var height = calcColumnHeight(groups[i]);
|
|
247
|
-
|
|
248
|
-
if (height < minHeight) {
|
|
249
|
-
index = i;
|
|
250
|
-
minHeight = height;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return groups[index];
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
if (acc.length >= column) {
|
|
258
|
-
var minHeightGroup = findMinHeightGroup(acc);
|
|
259
|
-
minHeightGroup == null ? void 0 : minHeightGroup.push(cur);
|
|
260
|
-
} else {
|
|
261
|
-
if (currentColumnHeight + nextGroupHeight > 440) {
|
|
262
|
-
acc.push([cur]);
|
|
263
|
-
} else {
|
|
264
|
-
var _acc;
|
|
265
|
-
|
|
266
|
-
(_acc = acc[(acc == null ? void 0 : acc.length) - 1]) == null ? void 0 : _acc.push(cur);
|
|
267
|
-
}
|
|
19
|
+
}
|
|
20
|
+
.tnt-icon {
|
|
21
|
+
position: absolute;
|
|
22
|
+
top: 50%;
|
|
23
|
+
transform: translateY(-50%);
|
|
24
|
+
line-height: 1em;
|
|
25
|
+
&[type="close"] {
|
|
26
|
+
right: 0;
|
|
27
|
+
top: 0;
|
|
28
|
+
font-size: 18px;
|
|
29
|
+
cursor: pointer;
|
|
268
30
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
var _node$menuName;
|
|
301
|
-
|
|
302
|
-
if (node.path && (node == null ? void 0 : (_node$menuName = node.menuName) == null ? void 0 : _node$menuName.includes(value))) {
|
|
303
|
-
matchedMenus.push(node);
|
|
31
|
+
}
|
|
32
|
+
input {
|
|
33
|
+
border-width: 0 0 1px;
|
|
34
|
+
border-style: solid;
|
|
35
|
+
border-color: ${props => props.theme.borderColor};
|
|
36
|
+
width: 100%;
|
|
37
|
+
padding: 4px 20px;
|
|
38
|
+
line-height: 20px;
|
|
39
|
+
background-color: transparent;
|
|
40
|
+
outline: none;
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
|
|
44
|
+
const ApplicationTabs = styled.ul`
|
|
45
|
+
border: 1px solid ${props => props.theme.borderColor};
|
|
46
|
+
color: ${props => props.theme.primaryTextColor};
|
|
47
|
+
line-height: 32px;
|
|
48
|
+
margin: 0 0 16px;
|
|
49
|
+
padding: 0;
|
|
50
|
+
display: inline-block;
|
|
51
|
+
|
|
52
|
+
& > li {
|
|
53
|
+
padding: 0 20px;
|
|
54
|
+
display: inline-block;
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
&:not(:last-child) {
|
|
57
|
+
border-right: 1px solid ${props => props.theme.borderColor};
|
|
58
|
+
}
|
|
59
|
+
&.active {
|
|
60
|
+
background-color: ${props => props.theme.primaryColor};
|
|
61
|
+
color: #fff;
|
|
304
62
|
}
|
|
305
|
-
});
|
|
306
63
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
const GroupMenus = styled.div`
|
|
67
|
+
height: ${props => props.isLevel3 ? 'calc(100% - 80px)' : 'calc(100% - 50px)'};
|
|
68
|
+
overflow: auto;
|
|
69
|
+
& > div {
|
|
70
|
+
width: 200px;
|
|
71
|
+
margin-right: 10px;
|
|
72
|
+
display: inline-block;
|
|
73
|
+
vertical-align: top;
|
|
74
|
+
}
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
const GroupMenuItem = styled.div`
|
|
78
|
+
margin-bottom: 20px;
|
|
79
|
+
& > h5 {
|
|
80
|
+
line-height: 20px;
|
|
81
|
+
margin: 0;
|
|
82
|
+
margin-bottom: 6px;
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
const MenuList = styled.ul`
|
|
87
|
+
list-style: none;
|
|
88
|
+
padding: 0;
|
|
89
|
+
margin: 0;
|
|
90
|
+
`;
|
|
91
|
+
|
|
92
|
+
const MenuItem = styled.li`
|
|
93
|
+
display: block;
|
|
94
|
+
line-height: 30px;
|
|
95
|
+
font-size: 12px;
|
|
96
|
+
cursor: pointer;
|
|
97
|
+
a {
|
|
98
|
+
color: ${props => props.theme.secondaryTextColor};
|
|
99
|
+
&:hover {
|
|
100
|
+
color: ${props => props.theme.secondaryColor} !important;
|
|
331
101
|
}
|
|
102
|
+
}
|
|
103
|
+
&.active a {
|
|
104
|
+
color: ${props => props.theme.primaryColor};
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
|
|
108
|
+
const ListBox = styled.ul`
|
|
109
|
+
background: #fff;
|
|
110
|
+
max-height: 320px;
|
|
111
|
+
overflow-y: auto;
|
|
112
|
+
margin: 0;
|
|
113
|
+
padding: 6px 0;
|
|
114
|
+
list-style: none;
|
|
115
|
+
font-size: 13px;
|
|
116
|
+
position: absolute;
|
|
117
|
+
top: 29px;
|
|
118
|
+
width: 100%;
|
|
119
|
+
box-shadow: 0 3px 6px -4px rgba(0,0,0,.12), 0 6px 16px 0 rgba(0,0,0,.08), 0 9px 28px 8px rgba(0,0,0,.05);
|
|
120
|
+
li {
|
|
121
|
+
cursor: pointer;
|
|
122
|
+
line-height: 32px;
|
|
123
|
+
padding: 0 10px;
|
|
124
|
+
color: ${props => props.theme.primaryTextColor};
|
|
125
|
+
&:hover {
|
|
126
|
+
color: ${props => props.theme.secondaryColor};
|
|
127
|
+
background-color: ${props => props.theme.lightBgColor};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
|
|
132
|
+
const SearchList = ({ items, onSelectMenu, theme }) => (
|
|
133
|
+
<ListBox theme={theme}>
|
|
134
|
+
{
|
|
135
|
+
items?.map(item => (
|
|
136
|
+
<li onClick={() => onSelectMenu(item)}>
|
|
137
|
+
{item?.menuName}
|
|
138
|
+
</li>
|
|
139
|
+
))
|
|
140
|
+
}
|
|
141
|
+
</ListBox>
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
export default ({ theme, menus = [], close, actions, popupRef, containerRef }) => {
|
|
145
|
+
const [active, setActive] = useState(false);
|
|
146
|
+
const [searchValue, setSearchValue] = useState();
|
|
147
|
+
const language = actions?.getLanguage();
|
|
148
|
+
const isLevel3 = hasLevel3(menus);
|
|
149
|
+
const [activeTopMenu, setActiveTopMenu] = useState(isLevel3 ? menus?.[0] : null);
|
|
150
|
+
const selectedMenuKey = actions.getSelectedMenuKey();
|
|
151
|
+
const calcGroupMenus = menus => {
|
|
152
|
+
menus = menus?.reduce((acc, cur) => {
|
|
153
|
+
// 分组
|
|
154
|
+
if (cur?.children?.length) {
|
|
155
|
+
acc.push(cur);
|
|
156
|
+
} else {
|
|
157
|
+
const defaultGroup = acc.find(({ isDefaultGroup }) => isDefaultGroup);
|
|
158
|
+
if (!defaultGroup) {
|
|
159
|
+
acc.unshift({
|
|
160
|
+
isDefaultGroup: true,
|
|
161
|
+
children: [cur]
|
|
162
|
+
});
|
|
163
|
+
} else {
|
|
164
|
+
defaultGroup.children.push(cur);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return acc;
|
|
168
|
+
}, []);
|
|
169
|
+
|
|
170
|
+
return menus?.reduce((acc, cur) => {
|
|
171
|
+
const column = Math.max(1, ~~((containerRef.current.clientWidth - 32) / 210));
|
|
172
|
+
|
|
173
|
+
if (!acc.length) {
|
|
174
|
+
acc.push([cur]);
|
|
175
|
+
} else {
|
|
176
|
+
const calcGroupHeight = group => 46 + (group?.children?.length || 0) * 30;
|
|
177
|
+
const calcColumnHeight = columnGroups => columnGroups?.reduce((acc, cur) => {
|
|
178
|
+
acc += calcGroupHeight(cur);
|
|
179
|
+
return acc;
|
|
180
|
+
}, 0);
|
|
181
|
+
const currentColumnHeight = calcColumnHeight(acc[acc.length - 1]);
|
|
182
|
+
const nextGroupHeight = calcGroupHeight(cur);
|
|
183
|
+
const findMinHeightGroup = groups => {
|
|
184
|
+
let minHeight = Infinity;
|
|
185
|
+
let index = 0;
|
|
186
|
+
|
|
187
|
+
for (let i = 0; i < groups.length; i++) {
|
|
188
|
+
const height = calcColumnHeight(groups[i]);
|
|
189
|
+
if (height < minHeight) {
|
|
190
|
+
index = i;
|
|
191
|
+
minHeight = height;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return groups[index];
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
if (acc.length >= column) {
|
|
199
|
+
const minHeightGroup = findMinHeightGroup(acc);
|
|
200
|
+
minHeightGroup?.push(cur);
|
|
201
|
+
} else {
|
|
202
|
+
if (currentColumnHeight + nextGroupHeight > 440) {
|
|
203
|
+
acc.push([cur]);
|
|
204
|
+
} else {
|
|
205
|
+
acc[acc?.length - 1]?.push(cur);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return acc;
|
|
211
|
+
}, []);
|
|
212
|
+
};
|
|
213
|
+
const groupMenus = calcGroupMenus(activeTopMenu?.children || menus);
|
|
214
|
+
const [searchedMenus, setSearchedMenus] = useState([]);
|
|
332
215
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
y = _popup$getBoundingCli.y,
|
|
336
|
-
height = _popup$getBoundingCli.height,
|
|
337
|
-
width = _popup$getBoundingCli.width;
|
|
338
|
-
|
|
339
|
-
console.log('clickOutside...', [x, y], [clientX, clientY], [pageX, pageY]);
|
|
340
|
-
x += window.scrollX;
|
|
341
|
-
y += window.scrollY;
|
|
342
|
-
return pageX < x || pageX > x + width || pageY < y || pageY > y + height;
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
if (isOutside(evt, popupRef.current)) {
|
|
216
|
+
const onMenuClick = menu => {
|
|
217
|
+
actions.emit('menuSelect', { key: menu.code, data: menu });
|
|
346
218
|
setSearchValue('');
|
|
347
219
|
setSearchedMenus([]);
|
|
348
220
|
close();
|
|
349
|
-
}
|
|
350
221
|
};
|
|
222
|
+
const debounceSearch = debounce(evt => {
|
|
223
|
+
const value = evt.target.value?.trim();
|
|
224
|
+
const matchedMenus = [];
|
|
225
|
+
|
|
226
|
+
if (value) {
|
|
227
|
+
traverseTree(menus, node => {
|
|
228
|
+
if (node.path && node?.menuName?.includes(value)) {
|
|
229
|
+
matchedMenus.push(node);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
351
233
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
234
|
+
setSearchedMenus(matchedMenus);
|
|
235
|
+
}, 100);
|
|
236
|
+
|
|
237
|
+
const onSearchChange = evt => {
|
|
238
|
+
evt.persist();
|
|
239
|
+
setSearchValue(evt.target.value);
|
|
240
|
+
debounceSearch(evt);
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const onSelectAppTab = menu => {
|
|
244
|
+
setActiveTopMenu(menu);
|
|
355
245
|
};
|
|
356
|
-
}, []);
|
|
357
|
-
return React.createElement(React.Fragment, null, React.createElement(SearchArea, {
|
|
358
|
-
theme: theme,
|
|
359
|
-
className: (0, _classnames["default"])({
|
|
360
|
-
active: active
|
|
361
|
-
})
|
|
362
|
-
}, React.createElement(_Iconfont["default"], {
|
|
363
|
-
type: "search"
|
|
364
|
-
}), React.createElement("input", {
|
|
365
|
-
placeholder: actions == null ? void 0 : actions.getText('menuSearch'),
|
|
366
|
-
value: searchValue,
|
|
367
|
-
onChange: onSearchChange,
|
|
368
|
-
onFocus: function onFocus() {
|
|
369
|
-
return setActive(true);
|
|
370
|
-
},
|
|
371
|
-
onBlur: function onBlur() {
|
|
372
|
-
return setActive(false);
|
|
373
|
-
}
|
|
374
|
-
}), React.createElement(_Iconfont["default"], {
|
|
375
|
-
type: "close",
|
|
376
|
-
onClick: close
|
|
377
|
-
}), (searchedMenus == null ? void 0 : searchedMenus.length) > 0 && React.createElement(SearchList, {
|
|
378
|
-
items: searchedMenus,
|
|
379
|
-
theme: theme,
|
|
380
|
-
onSelectMenu: onMenuClick
|
|
381
|
-
})), isLevel3 && React.createElement(ApplicationTabs, {
|
|
382
|
-
theme: theme
|
|
383
|
-
}, menus == null ? void 0 : menus.map(function (menu) {
|
|
384
|
-
return React.createElement("li", {
|
|
385
|
-
className: (0, _classnames["default"])({
|
|
386
|
-
active: menu.code === (activeTopMenu == null ? void 0 : activeTopMenu.code)
|
|
387
|
-
}),
|
|
388
|
-
onClick: function onClick() {
|
|
389
|
-
return onSelectAppTab(menu);
|
|
390
|
-
}
|
|
391
|
-
}, menu == null ? void 0 : menu[language === 'cn' ? 'groupName' : 'enName']);
|
|
392
|
-
})), React.createElement(GroupMenus, {
|
|
393
|
-
theme: theme,
|
|
394
|
-
isLevel3: isLevel3
|
|
395
|
-
}, groupMenus == null ? void 0 : groupMenus.map(function (groups) {
|
|
396
|
-
return React.createElement("div", null, groups == null ? void 0 : groups.map(function (group) {
|
|
397
|
-
return React.createElement(GroupMenuItem, {
|
|
398
|
-
theme: theme
|
|
399
|
-
}, React.createElement("h5", null, group == null ? void 0 : group[language === 'cn' ? 'groupName' : 'enName']), React.createElement(MenuList, null, (group.children || []).map(function (menu) {
|
|
400
|
-
return React.createElement(MenuItem, {
|
|
401
|
-
key: menu.code,
|
|
402
|
-
className: (0, _classnames["default"])({
|
|
403
|
-
active: selectedMenuKey === menu.code
|
|
404
|
-
}),
|
|
405
|
-
theme: theme,
|
|
406
|
-
onClick: function onClick() {
|
|
407
|
-
return onMenuClick(menu);
|
|
408
|
-
}
|
|
409
|
-
}, React.createElement("a", {
|
|
410
|
-
href: menu.path,
|
|
411
|
-
onClick: function onClick(evt) {
|
|
412
|
-
return evt.preventDefault();
|
|
413
|
-
}
|
|
414
|
-
}, menu == null ? void 0 : menu[language === 'cn' ? 'menuName' : 'enName']));
|
|
415
|
-
})));
|
|
416
|
-
}));
|
|
417
|
-
})));
|
|
418
|
-
};
|
|
419
246
|
|
|
420
|
-
|
|
247
|
+
useEffect(() => {
|
|
248
|
+
const clickOutside = evt => {
|
|
249
|
+
const { clientX, clientY, pageX, pageY } = evt;
|
|
250
|
+
const isOutside = (evt, popup) => {
|
|
251
|
+
if (popup?.contains) {
|
|
252
|
+
return !popup?.contains(evt.target);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
let { x, y, height, width } = popup.getBoundingClientRect();
|
|
256
|
+
console.log('clickOutside...', [x, y], [clientX, clientY], [pageX, pageY]);
|
|
257
|
+
x += window.scrollX;
|
|
258
|
+
y += window.scrollY;
|
|
259
|
+
|
|
260
|
+
return pageX < x || pageX > x + width || pageY < y || pageY > y + height;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
if (isOutside(evt, popupRef.current)) {
|
|
264
|
+
setSearchValue('');
|
|
265
|
+
setSearchedMenus([]);
|
|
266
|
+
close();
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
document.addEventListener('click', clickOutside);
|
|
271
|
+
return () => document.removeEventListener('click', clickOutside);
|
|
272
|
+
}, []);
|
|
273
|
+
|
|
274
|
+
return (
|
|
275
|
+
<>
|
|
276
|
+
<SearchArea theme={theme} className={cn({ active })}>
|
|
277
|
+
<Icon type="search" />
|
|
278
|
+
<input
|
|
279
|
+
placeholder={actions?.getText('menuSearch')}
|
|
280
|
+
value={searchValue}
|
|
281
|
+
onChange={onSearchChange}
|
|
282
|
+
onFocus={() => setActive(true)}
|
|
283
|
+
onBlur={() => setActive(false)}
|
|
284
|
+
/>
|
|
285
|
+
<Icon type="close" onClick={close} />
|
|
286
|
+
{
|
|
287
|
+
searchedMenus?.length > 0 && (
|
|
288
|
+
<SearchList
|
|
289
|
+
items={searchedMenus}
|
|
290
|
+
theme={theme}
|
|
291
|
+
onSelectMenu={onMenuClick}
|
|
292
|
+
/>
|
|
293
|
+
)
|
|
294
|
+
}
|
|
295
|
+
</SearchArea>
|
|
296
|
+
{
|
|
297
|
+
isLevel3 && (
|
|
298
|
+
<ApplicationTabs theme={theme}>
|
|
299
|
+
{
|
|
300
|
+
menus?.map(menu => (
|
|
301
|
+
<li
|
|
302
|
+
className={cn({ active: menu.code === activeTopMenu?.code})}
|
|
303
|
+
onClick={() => onSelectAppTab(menu)}
|
|
304
|
+
>
|
|
305
|
+
{menu?.[language === 'cn' ? 'groupName' : 'enName']}
|
|
306
|
+
</li>
|
|
307
|
+
))
|
|
308
|
+
}
|
|
309
|
+
</ApplicationTabs>
|
|
310
|
+
)
|
|
311
|
+
}
|
|
312
|
+
<GroupMenus theme={theme} isLevel3={isLevel3}>
|
|
313
|
+
{
|
|
314
|
+
groupMenus?.map(groups => (
|
|
315
|
+
<div>
|
|
316
|
+
{
|
|
317
|
+
groups?.map(group => (
|
|
318
|
+
<GroupMenuItem theme={theme}>
|
|
319
|
+
<h5>{group?.[language === 'cn' ? 'groupName' : 'enName']}</h5>
|
|
320
|
+
<MenuList>
|
|
321
|
+
{
|
|
322
|
+
(group.children || []).map(menu => (
|
|
323
|
+
<MenuItem
|
|
324
|
+
key={menu.code}
|
|
325
|
+
className={cn({ active: selectedMenuKey === menu.code})}
|
|
326
|
+
theme={theme}
|
|
327
|
+
onClick={() => onMenuClick(menu)}
|
|
328
|
+
>
|
|
329
|
+
<a
|
|
330
|
+
href={menu.path}
|
|
331
|
+
onClick={evt => evt.preventDefault()}
|
|
332
|
+
>
|
|
333
|
+
{menu?.[language === 'cn' ? 'menuName' : 'enName']}
|
|
334
|
+
</a>
|
|
335
|
+
</MenuItem>
|
|
336
|
+
))
|
|
337
|
+
}
|
|
338
|
+
</MenuList>
|
|
339
|
+
</GroupMenuItem>
|
|
340
|
+
))
|
|
341
|
+
}
|
|
342
|
+
</div>
|
|
343
|
+
))
|
|
344
|
+
}
|
|
345
|
+
</GroupMenus>
|
|
346
|
+
</>
|
|
347
|
+
);
|
|
348
|
+
};
|