tntd 1.4.4 → 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.
Files changed (88) hide show
  1. package/components/Layout/HeaderActions.js +90 -128
  2. package/components/LoadingButton/index.js +11 -15
  3. package/components/QueryListScene/QueryForm.js +7 -4
  4. package/dist/stats.json +4990 -4990
  5. package/dist/tntd.js +1 -1
  6. package/es/Layout/HeaderActions.js +10 -10
  7. package/es/LoadingButton/index.js +20 -10
  8. package/es/QueryListScene/QueryForm.js +6 -3
  9. package/lib/ArrayInput/icon.js +27 -31
  10. package/lib/ArrayInput/index.js +211 -298
  11. package/lib/AuthContext.js +2 -13
  12. package/lib/Columns/index.js +71 -100
  13. package/lib/DevelopmentLogin/LoginModal.js +79 -141
  14. package/lib/DevelopmentLogin/index.js +28 -55
  15. package/lib/Ellipsis/Svg/CopySVG.js +23 -71
  16. package/lib/Ellipsis/Svg/TickSVG.js +17 -49
  17. package/lib/Ellipsis/index.js +148 -154
  18. package/lib/Handle/index.js +72 -109
  19. package/lib/Icon/fonts/iconfont.js +1 -43
  20. package/lib/Icon/iconList.js +119 -8
  21. package/lib/Icon/index.js +13 -45
  22. package/lib/Img/Contain.js +49 -81
  23. package/lib/Img/Cover.js +88 -136
  24. package/lib/Img/index.js +36 -89
  25. package/lib/Layout/ActionsContext.js +2 -11
  26. package/lib/Layout/AppList.js +262 -256
  27. package/lib/Layout/Application.js +119 -135
  28. package/lib/Layout/Avatar.js +137 -137
  29. package/lib/Layout/CompatibleLanguage.js +214 -195
  30. package/lib/Layout/EnterpriseLayout/Avatar.js +156 -168
  31. package/lib/Layout/EnterpriseLayout/Language.js +75 -100
  32. package/lib/Layout/EnterpriseLayout/Theme.js +96 -94
  33. package/lib/Layout/EnterpriseLayout/index.js +32 -45
  34. package/lib/Layout/GlobalNavigation/NavigationPopup.js +335 -407
  35. package/lib/Layout/GlobalNavigation/index.js +110 -158
  36. package/lib/Layout/Header.js +165 -116
  37. package/lib/Layout/HeaderActions.js +132 -129
  38. package/lib/Layout/HeaderNavs.js +90 -113
  39. package/lib/Layout/HeaderTabs.js +312 -278
  40. package/lib/Layout/Iconfont.js +2 -15
  41. package/lib/Layout/Language.js +63 -102
  42. package/lib/Layout/Layout.js +272 -261
  43. package/lib/Layout/Logo.js +132 -87
  44. package/lib/Layout/OrgAppList.js +440 -319
  45. package/lib/Layout/SideMenu.js +429 -343
  46. package/lib/Layout/Theme.js +95 -124
  47. package/lib/Layout/checkAuth.js +21 -35
  48. package/lib/Layout/createActions.js +38 -51
  49. package/lib/Layout/images/index.js +33 -41
  50. package/lib/Layout/index.js +110 -161
  51. package/lib/Layout/paaslayout/CompactSideMenu.js +200 -178
  52. package/lib/Layout/paaslayout/Header.js +84 -90
  53. package/lib/Layout/paaslayout/Logo.js +27 -32
  54. package/lib/Layout/paaslayout/SideMenu.js +161 -174
  55. package/lib/Layout/paaslayout/index.js +240 -261
  56. package/lib/Layout/storage.js +20 -78
  57. package/lib/Layout/utils.js +93 -143
  58. package/lib/LoadingButton/index.js +25 -57
  59. package/lib/Modal/index.js +83 -108
  60. package/lib/Page/Box.js +56 -81
  61. package/lib/Page/index.js +151 -173
  62. package/lib/Page/utils.js +12 -30
  63. package/lib/QueryForm/Field/Checkbox.js +11 -33
  64. package/lib/QueryForm/Field/Select.js +63 -99
  65. package/lib/QueryForm/Field/SelectInput.js +69 -114
  66. package/lib/QueryForm/Field/fieldsMap.js +30 -52
  67. package/lib/QueryForm/Field/index.js +76 -158
  68. package/lib/QueryForm/createActions.js +50 -65
  69. package/lib/QueryForm/index.js +304 -383
  70. package/lib/QueryForm/useForm.js +6 -17
  71. package/lib/QueryListScene/List.js +290 -366
  72. package/lib/QueryListScene/QueryForm.js +93 -158
  73. package/lib/QueryListScene/QueryListScene.js +33 -87
  74. package/lib/QueryListScene/Title.js +10 -20
  75. package/lib/QueryListScene/Toolbar.js +8 -31
  76. package/lib/QueryListScene/createActions.js +64 -79
  77. package/lib/QueryListScene/index.js +23 -40
  78. package/lib/QueryListScene/useActions.js +6 -17
  79. package/lib/Select/DropDownWrap.js +60 -124
  80. package/lib/Select/index.js +425 -561
  81. package/lib/Table/ResizableTable/index.js +77 -121
  82. package/lib/Table/index.js +19 -51
  83. package/lib/Title/index.js +34 -52
  84. package/lib/index.js +19 -159
  85. package/lib/locale.js +48 -63
  86. package/package.json +1 -1
  87. package/lib/Layout/EnterpriseLayout/Header.js +0 -113
  88. package/lib/Layout/EnterpriseLayout/HeaderActions.js +0 -104
@@ -1,420 +1,348 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports["default"] = void 0;
7
-
8
- var _react = require("react");
9
-
10
- var _classnames = _interopRequireDefault(require("classnames"));
11
-
12
- var _styledComponents = _interopRequireDefault(require("styled-components"));
13
-
14
- var _lodash = require("lodash");
15
-
16
- var _utils = require("../utils");
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
- return acc;
218
- }, []);
219
- return (_menus2 = menus) == null ? void 0 : _menus2.reduce(function (acc, cur) {
220
- var column = Math.max(1, ~~((containerRef.current.clientWidth - 32) / 210));
221
-
222
- if (!acc.length) {
223
- acc.push([cur]);
224
- } else {
225
- var calcGroupHeight = function calcGroupHeight(group) {
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
- return acc;
272
- }, []);
273
- };
274
-
275
- var groupMenus = calcGroupMenus((activeTopMenu == null ? void 0 : activeTopMenu.children) || menus);
276
-
277
- var _useState7 = (0, _react.useState)([]),
278
- _useState8 = _slicedToArray(_useState7, 2),
279
- searchedMenus = _useState8[0],
280
- setSearchedMenus = _useState8[1];
281
-
282
- var onMenuClick = function onMenuClick(menu) {
283
- actions.emit('menuSelect', {
284
- key: menu.code,
285
- data: menu
286
- });
287
- setSearchValue('');
288
- setSearchedMenus([]);
289
- close();
290
- };
291
-
292
- var debounceSearch = (0, _lodash.debounce)(function (evt) {
293
- var _evt$target$value;
294
-
295
- var value = (_evt$target$value = evt.target.value) == null ? void 0 : _evt$target$value.trim();
296
- var matchedMenus = [];
297
-
298
- if (value) {
299
- (0, _utils.traverseTree)(menus, function (node) {
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
- setSearchedMenus(matchedMenus);
309
- }, 100);
310
-
311
- var onSearchChange = function onSearchChange(evt) {
312
- evt.persist();
313
- setSearchValue(evt.target.value);
314
- debounceSearch(evt);
315
- };
316
-
317
- var onSelectAppTab = function onSelectAppTab(menu) {
318
- setActiveTopMenu(menu);
319
- };
320
-
321
- (0, _react.useEffect)(function () {
322
- var clickOutside = function clickOutside(evt) {
323
- var clientX = evt.clientX,
324
- clientY = evt.clientY,
325
- pageX = evt.pageX,
326
- pageY = evt.pageY;
327
-
328
- var isOutside = function isOutside(evt, popup) {
329
- if (popup == null ? void 0 : popup.contains) {
330
- return !(popup == null ? void 0 : popup.contains(evt.target));
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
- var _popup$getBoundingCli = popup.getBoundingClientRect(),
334
- x = _popup$getBoundingCli.x,
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
- document.addEventListener('click', clickOutside);
353
- return function () {
354
- return document.removeEventListener('click', clickOutside);
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
- exports["default"] = _default;
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
+ };