@bit-sun/business-component 2.1.15 → 2.1.17

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 (150) hide show
  1. package/.editorconfig +16 -16
  2. package/.fatherrc.ts +5 -5
  3. package/.gitlab-ci.yml +179 -179
  4. package/.prettierignore +7 -7
  5. package/.prettierrc +11 -11
  6. package/.umirc.ts +74 -74
  7. package/README.md +27 -27
  8. package/dist/components/Business/BsLayouts/Components/AllFunc/drawContent.d.ts +1 -1
  9. package/dist/components/Business/BsLayouts/Components/AllFunc/index.d.ts +1 -1
  10. package/dist/components/Business/BsLayouts/Components/RightContent/index.d.ts +2 -2
  11. package/dist/components/Business/BsLayouts/Components/SearchFunc/index.d.ts +2 -2
  12. package/dist/components/Business/BsLayouts/index.d.ts +2 -2
  13. package/dist/components/Business/BsLayouts/utils.d.ts +1 -0
  14. package/dist/components/Business/BsSulaQueryTable/utils.d.ts +2 -2
  15. package/dist/index.esm.js +1242 -2692
  16. package/dist/index.js +1242 -2692
  17. package/dist/utils/TableUtils.d.ts +2 -2
  18. package/dist/utils/utils.d.ts +1 -1
  19. package/docs/index.md +21 -21
  20. package/lib/assets/drag.svg +17 -17
  21. package/lib/assets/exportFail.svg +37 -37
  22. package/lib/assets/exportProcessing.svg +28 -28
  23. package/lib/assets/exportSuccess.svg +34 -34
  24. package/lib/assets/label_icon_bottom.svg +25 -25
  25. package/lib/assets/upExport.svg +22 -22
  26. package/package.json +71 -71
  27. package/src/assets/32.svg +27 -27
  28. package/src/assets/addIcon.svg +17 -17
  29. package/src/assets/allfunc.svg +27 -27
  30. package/src/assets/arrowRight.svg +24 -24
  31. package/src/assets/btn-delete.svg +29 -29
  32. package/src/assets/btn-edit.svg +19 -19
  33. package/src/assets/btn-more.svg +17 -17
  34. package/src/assets/btn-submit.svg +19 -19
  35. package/src/assets/caidan.svg +11 -11
  36. package/src/assets/close.svg +26 -26
  37. package/src/assets/drag.svg +17 -17
  38. package/src/assets/exportFail.svg +37 -37
  39. package/src/assets/exportProcessing.svg +28 -28
  40. package/src/assets/exportSuccess.svg +34 -34
  41. package/src/assets/fixed-left-active.svg +11 -11
  42. package/src/assets/fixed-left.svg +15 -15
  43. package/src/assets/fixed-right-active.svg +11 -11
  44. package/src/assets/fixed-right.svg +15 -15
  45. package/src/assets/guanbi.svg +15 -15
  46. package/src/assets/icon-quanping.svg +15 -15
  47. package/src/assets/icon-shezhi.svg +17 -17
  48. package/src/assets/label_icon_bottom.svg +25 -25
  49. package/src/assets/list-no-img.svg +21 -21
  50. package/src/assets/morentouxiang-32.svg +23 -23
  51. package/src/assets/scanning.svg +24 -24
  52. package/src/assets/upExport.svg +22 -22
  53. package/src/components/Business/AddSelectBusiness/index.md +41 -41
  54. package/src/components/Business/AddSelectBusiness/index.tsx +319 -318
  55. package/src/components/Business/BsLayouts/Components/AllFunc/drawContent.tsx +111 -111
  56. package/src/components/Business/BsLayouts/Components/AllFunc/index.less +153 -153
  57. package/src/components/Business/BsLayouts/Components/AllFunc/index.tsx +70 -70
  58. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.less +90 -90
  59. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/index.tsx +37 -37
  60. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/leftTree.tsx +242 -242
  61. package/src/components/Business/BsLayouts/Components/CustomerMenu/MenuSetting/rightTree.tsx +384 -384
  62. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/DrawContent.tsx +285 -285
  63. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/customMenuHeader.tsx +74 -74
  64. package/src/components/Business/BsLayouts/Components/CustomerMenu/globalMenu/drawContent.less +170 -170
  65. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.less +64 -64
  66. package/src/components/Business/BsLayouts/Components/CustomerMenu/index.tsx +153 -153
  67. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.less +72 -72
  68. package/src/components/Business/BsLayouts/Components/GlobalHeader/index.tsx +157 -157
  69. package/src/components/Business/BsLayouts/Components/RightContent/LoginModal.tsx +85 -85
  70. package/src/components/Business/BsLayouts/Components/RightContent/home.less +218 -218
  71. package/src/components/Business/BsLayouts/Components/RightContent/index.tsx +156 -156
  72. package/src/components/Business/BsLayouts/Components/SearchFunc/index.less +160 -160
  73. package/src/components/Business/BsLayouts/Components/SearchFunc/index.tsx +75 -75
  74. package/src/components/Business/BsLayouts/index.less +79 -79
  75. package/src/components/Business/BsLayouts/index.tsx +1479 -1469
  76. package/src/components/Business/BsLayouts/service.ts +10 -10
  77. package/src/components/Business/BsLayouts/utils.tsx +231 -211
  78. package/src/components/Business/BsSulaQueryTable/index.less +219 -219
  79. package/src/components/Business/BsSulaQueryTable/index.tsx +505 -505
  80. package/src/components/Business/BsSulaQueryTable/setting.tsx +799 -799
  81. package/src/components/Business/BsSulaQueryTable/utils.less +65 -65
  82. package/src/components/Business/BsSulaQueryTable/utils.tsx +688 -688
  83. package/src/components/Business/CommodityEntry/index.md +70 -70
  84. package/src/components/Business/CommodityEntry/index.tsx +80 -80
  85. package/src/components/Business/CommonAlert/index.tsx +23 -23
  86. package/src/components/Business/CommonGuideWrapper/index.less +111 -111
  87. package/src/components/Business/CommonGuideWrapper/index.md +39 -39
  88. package/src/components/Business/CommonGuideWrapper/index.tsx +83 -83
  89. package/src/components/Business/DetailPageWrapper/index.less +79 -79
  90. package/src/components/Business/DetailPageWrapper/index.tsx +335 -335
  91. package/src/components/Business/DetailPageWrapper/utils.tsx +100 -100
  92. package/src/components/Business/HomePageWrapper/index.less +33 -33
  93. package/src/components/Business/HomePageWrapper/index.md +45 -45
  94. package/src/components/Business/HomePageWrapper/index.tsx +162 -162
  95. package/src/components/Business/SearchSelect/BusinessUtils.ts +1478 -1478
  96. package/src/components/Business/SearchSelect/common.ts +53 -53
  97. package/src/components/Business/SearchSelect/index.md +1137 -1137
  98. package/src/components/Business/SearchSelect/index.tsx +51 -51
  99. package/src/components/Business/SearchSelect/utils.ts +100 -100
  100. package/src/components/Business/StateFlow/index.less +130 -130
  101. package/src/components/Business/StateFlow/index.md +60 -60
  102. package/src/components/Business/StateFlow/index.tsx +29 -29
  103. package/src/components/Business/TreeSearchSelect/index.md +126 -126
  104. package/src/components/Business/TreeSearchSelect/index.tsx +34 -34
  105. package/src/components/Business/TreeSearchSelect/utils.ts +60 -60
  106. package/src/components/Business/columnSettingTable/columnSetting.tsx +764 -764
  107. package/src/components/Business/columnSettingTable/index.less +247 -247
  108. package/src/components/Business/columnSettingTable/index.md +357 -357
  109. package/src/components/Business/columnSettingTable/index.tsx +232 -232
  110. package/src/components/Business/columnSettingTable/sulaSettingTable.tsx +240 -240
  111. package/src/components/Business/columnSettingTable/utils.tsx +68 -68
  112. package/src/components/Business/moreTreeTable/index.less +99 -99
  113. package/src/components/Business/moreTreeTable/index.md +508 -508
  114. package/src/components/Business/moreTreeTable/index.tsx +315 -315
  115. package/src/components/Business/moreTreeTable/utils.ts +126 -126
  116. package/src/components/Functional/AddSelect/index.less +367 -367
  117. package/src/components/Functional/AddSelect/index.md +122 -122
  118. package/src/components/Functional/AddSelect/index.tsx +992 -992
  119. package/src/components/Functional/BillEntry/index.less +371 -371
  120. package/src/components/Functional/BillEntry/index.md +39 -39
  121. package/src/components/Functional/BillEntry/index.tsx +671 -671
  122. package/src/components/Functional/DataImport/index.less +63 -63
  123. package/src/components/Functional/DataImport/index.md +44 -44
  124. package/src/components/Functional/DataImport/index.tsx +695 -695
  125. package/src/components/Functional/DataValidation/index.less +63 -63
  126. package/src/components/Functional/DataValidation/index.md +39 -39
  127. package/src/components/Functional/DataValidation/index.tsx +687 -687
  128. package/src/components/Functional/ExportFunctions/ExportIcon/index.md +37 -37
  129. package/src/components/Functional/ExportFunctions/ExportIcon/index.tsx +59 -59
  130. package/src/components/Functional/QueryMutipleInput/index.less +37 -37
  131. package/src/components/Functional/QueryMutipleInput/index.md +33 -33
  132. package/src/components/Functional/QueryMutipleInput/index.tsx +128 -128
  133. package/src/components/Functional/SearchSelect/index.less +115 -115
  134. package/src/components/Functional/SearchSelect/index.md +141 -141
  135. package/src/components/Functional/SearchSelect/index.tsx +813 -813
  136. package/src/components/Functional/SearchSelect/utils.ts +6 -6
  137. package/src/components/Functional/TreeSearchSelect/index.md +47 -47
  138. package/src/components/Functional/TreeSearchSelect/index.tsx +149 -149
  139. package/src/index.ts +32 -32
  140. package/src/styles/bsDefault.less +1906 -1906
  141. package/src/utils/CheckOneUser/index.md +39 -39
  142. package/src/utils/CheckOneUser/index.ts +51 -51
  143. package/src/utils/TableUtils.tsx +18 -18
  144. package/src/utils/checkUtils.ts +39 -39
  145. package/src/utils/enumConfig.ts +10 -10
  146. package/src/utils/index.ts +2 -2
  147. package/src/utils/requestUtils.ts +33 -33
  148. package/src/utils/utils.ts +57 -57
  149. package/tsconfig.json +29 -29
  150. package/typings.d.ts +4 -4
@@ -1,1469 +1,1479 @@
1
- // @ts-nocheck
2
- import type {
3
- MenuDataItem,
4
- BasicLayoutProps as ProLayoutProps,
5
- Settings,
6
- } from '@ant-design/pro-layout';
7
- import ProLayout from '@ant-design/pro-layout';
8
- import React, { useState, createRef, useRef } from 'react';
9
- import {
10
- Tabs,
11
- Dropdown,
12
- Menu,
13
- } from 'antd';
14
- import {
15
- Link,
16
- useIntl,
17
- history,
18
- useModel,
19
- } from 'umi';
20
- import {
21
- DashOutlined,
22
- MenuUnfoldOutlined,
23
- CaretLeftOutlined,
24
- HomeOutlined,
25
- DoubleLeftOutlined,
26
- DoubleRightOutlined,
27
- } from '@ant-design/icons';
28
- import SearchFunc from './Components/SearchFunc';
29
- import { debounce } from 'lodash';
30
-
31
- import AllFunc from './Components/AllFunc';
32
- import {
33
- getBreadcrumbNameMap,
34
- ergodicMenuRoutes,
35
- matchPath,
36
- } from './utils';
37
- import moment from 'moment';
38
- import GlobalHeaderCom from './Components/GlobalHeader';
39
- import CustomerMenu from './Components/CustomerMenu';
40
- import CustomerMenuHeader from './Components/CustomerMenu/globalMenu/customMenuHeader';
41
- import './index.less';
42
- import { DndProvider, useDrag, useDrop } from 'react-dnd';
43
- import { HTML5Backend } from 'react-dnd-html5-backend';
44
- import ENUM from '@/utils/enumConfig';
45
- import { memoizeOneFormatter } from '@/utils/utils';
46
-
47
- const { TabPane } = Tabs;
48
-
49
- export const RouterContext = React.createContext({});
50
-
51
- export type BasicLayoutProps = {
52
- breadcrumbNameMap: Record<string, MenuDataItem>;
53
- route: ProLayoutProps['route'] & {
54
- authority: string[];
55
- };
56
- settings: Settings;
57
- } & ProLayoutProps;
58
-
59
- export type BasicLayoutContext = { [K in 'location']: BasicLayoutProps[K] } & {
60
- breadcrumbNameMap: Record<string, MenuDataItem>;
61
- };
62
-
63
- const menuDataRender = (menuList: MenuDataItem[]): MenuDataItem[] =>
64
- menuList.map((item) => {
65
- return {
66
- ...item,
67
- children: item.children ? menuDataRender(item.children) : undefined,
68
- };
69
- });
70
-
71
- let UN_LISTTEN_DRP;
72
- let routerArray = [];
73
- let lastTwoRouterArray = [1, 2];
74
-
75
- let draggerTabKeys = [];
76
-
77
- const type = 'DraggableTabNode';
78
- const DraggableTabNode = ({ index, children, moveNode }) => {
79
- const ref = useRef(null);
80
- const [{ isOver, dropClassName }, drop] = useDrop({
81
- accept: type,
82
- collect: (monitor) => {
83
- const { index: dragIndex } = monitor.getItem() || {};
84
-
85
- if (dragIndex === index) {
86
- return {};
87
- }
88
-
89
- return {
90
- isOver: monitor.isOver(),
91
- dropClassName: 'dropping',
92
- };
93
- },
94
- drop: (item) => {
95
- moveNode(item.index, index);
96
- },
97
- });
98
- const [, drag] = useDrag({
99
- type,
100
- item: {
101
- index,
102
- },
103
- collect: (monitor) => ({
104
- isDragging: monitor.isDragging(),
105
- }),
106
- });
107
- drop(drag(ref));
108
- return (
109
- <div
110
- ref={ref}
111
- style={{
112
- marginRight: 24,
113
- }}
114
- className={isOver ? dropClassName : ''}
115
- >
116
- {children}
117
- </div>
118
- );
119
- };
120
-
121
- const DraggableTabs = (props) => {
122
- const { children, changeListenRouterState } = props;
123
- const [order, setOrder] = useState([]);
124
-
125
- const moveTabNode = (dragKey, hoverKey) => {
126
- const newOrder = order.slice();
127
- React.Children.forEach(children, (c) => {
128
- if (c.key && newOrder.indexOf(c.key) === -1) {
129
- newOrder.push(c.key);
130
- }
131
- });
132
- const dragIndex = newOrder.indexOf(dragKey);
133
- const hoverIndex = newOrder.indexOf(hoverKey);
134
- newOrder.splice(dragIndex, 1);
135
- newOrder.splice(hoverIndex, 0, dragKey);
136
- changeListenRouterState(dragIndex, hoverIndex);
137
- setOrder(newOrder);
138
- };
139
-
140
- const renderTabBar = (tabBarProps, DefaultTabBar) => (
141
- <DefaultTabBar {...tabBarProps}>
142
- {(node) => (
143
- <DraggableTabNode
144
- key={node.key}
145
- index={node.key}
146
- moveNode={moveTabNode}
147
- >
148
- {node}
149
- </DraggableTabNode>
150
- )}
151
- </DefaultTabBar>
152
- );
153
-
154
- const tabs = [];
155
- React.Children.forEach(children, (c) => {
156
- tabs.push(c);
157
- });
158
- const orderTabs = tabs.slice().sort((a, b) => {
159
- const orderA = order.indexOf(a.key);
160
- const orderB = order.indexOf(b.key);
161
-
162
- if (orderA !== -1 && orderB !== -1) {
163
- return orderA - orderB;
164
- }
165
-
166
- if (orderA !== -1) {
167
- return -1;
168
- }
169
-
170
- if (orderB !== -1) {
171
- return 1;
172
- }
173
-
174
- const ia = tabs.indexOf(a);
175
- const ib = tabs.indexOf(b);
176
- return ia - ib;
177
- });
178
- return (
179
- <DndProvider backend={HTML5Backend}>
180
- <Tabs renderTabBar={renderTabBar} {...props}>
181
- {orderTabs}
182
- </Tabs>
183
- </DndProvider>
184
- );
185
- };
186
-
187
- const ItemMenu = (props) => {
188
- const {
189
- info: { key },
190
- operateFun,
191
- listenRouterState,
192
- } = props;
193
- let index = listenRouterState.findIndex((item) => item.key === key);
194
-
195
- const menu = (
196
- <Menu>
197
- <Menu.Item key="0" style={{ fontSize: '12px', textAlign: 'center' }}>
198
- <a
199
- onClick={(e) => {
200
- e.stopPropagation();
201
- operateFun(key, 'self');
202
- }}
203
- >
204
- 关闭当前标签
205
- </a>
206
- </Menu.Item>
207
- <Menu.Item
208
- disabled={index === 0}
209
- key="1"
210
- style={{ fontSize: '12px', textAlign: 'center' }}
211
- >
212
- <a
213
- onClick={(e) => {
214
- e.stopPropagation();
215
- operateFun(key, 'left');
216
- }}
217
- >
218
- 关闭其左侧标签
219
- </a>
220
- </Menu.Item>
221
- <Menu.Item
222
- disabled={index === listenRouterState.length - 1}
223
- key="2"
224
- style={{ fontSize: '12px', textAlign: 'center' }}
225
- >
226
- <a
227
- onClick={(e) => {
228
- e.stopPropagation();
229
- operateFun(key, 'right');
230
- }}
231
- >
232
- 关闭其右侧标签
233
- </a>
234
- </Menu.Item>
235
- <Menu.Item
236
- disabled={index === listenRouterState.length - 1}
237
- key="3"
238
- style={{ fontSize: '12px', textAlign: 'center' }}
239
- >
240
- <a
241
- onClick={(e) => {
242
- e.stopPropagation();
243
- operateFun(key, 'other');
244
- }}
245
- >
246
- 关闭其他标签
247
- </a>
248
- </Menu.Item>
249
- <Menu.Item
250
- disabled={index === listenRouterState.length - 1}
251
- key="4"
252
- style={{ fontSize: '12px', textAlign: 'center' }}
253
- >
254
- <a
255
- onClick={(e) => {
256
- e.stopPropagation();
257
- operateFun(key, 'all');
258
- }}
259
- >
260
- 关闭全部标签
261
- </a>
262
- </Menu.Item>
263
- </Menu>
264
- );
265
- return (
266
- <Dropdown overlay={menu} trigger={['hover']}>
267
- <a
268
- className="ant-dropdown-link"
269
- onClick={(e) => {
270
- e.preventDefault();
271
- e.stopPropagation();
272
- }}
273
- >
274
- <img style={{ marginRight: '-12px' }} src="./biaoqian-icon.svg" />
275
- </a>
276
- </Dropdown>
277
- );
278
- };
279
-
280
- class BasicLayout extends React.PureComponent {
281
- allFunc: any = createRef('');
282
- customerMenuRef: any = createRef('');
283
- actionRef: any = createRef<{
284
- reload: () => void;
285
- }>();
286
- constructor(props) {
287
- super(props);
288
- routerArray = this.updateTree(props.route.routes);
289
- const homeRouter = routerArray.filter(
290
- (itemroute) => itemroute.key === '/',
291
- )[0];
292
- const breadcrumbNameMap = getBreadcrumbNameMap(
293
- memoizeOneFormatter(props.route.routes, ''),
294
- );
295
- const hideMenuArray = ergodicMenuRoutes(props.route.routes);
296
-
297
- this.state = {
298
- listenRouterState: [
299
- { ...homeRouter, key: '/', tab: '欢迎', closable: false },
300
- ],
301
- listenRouterKey: ['/'],
302
- activeKey: '/',
303
- homeRouter,
304
- customerMatchs: [],
305
- breadcrumbNameMap,
306
- hideMenuArray,
307
- keyWord: '',
308
- collapse: false,
309
- drawerLeftParams: {
310
- visible: false,
311
- width: 690,
312
- title: '搜索',
313
- onClose: () => {
314
- this.setState({
315
- drawerLeftParams: {
316
- ...this.state.drawerLeftParams,
317
- visible: false,
318
- },
319
- });
320
- },
321
- },
322
- currentSubMenuData: [],
323
- showSubMenu: false,
324
- isSlider: false,
325
- };
326
- }
327
-
328
- componentDidMount() {
329
- const {
330
- history,
331
- location,
332
- itemPath,
333
- pathToRegexp,
334
- } = this.props;
335
-
336
- let istParent = 0;
337
-
338
- var self = this;
339
-
340
- window.top != window &&
341
- window.addEventListener('message', function (e) {
342
- istParent = 1;
343
- if (localStorage.getItem(ENUM.BROWSER_CACHE.CHILD_APP_BACK)) {
344
- localStorage.removeItem(ENUM.BROWSER_CACHE.CHILD_APP_BACK);
345
- } else {
346
- localStorage.setItem('isTabChange', true);
347
- }
348
-
349
- if (typeof e.data === 'string') {
350
- history.push(e.data.replace(/^\/\w+\//, '/'));
351
- } else {
352
- const info = e.data;
353
- if (info.type === 'remove') {
354
- self.tabActions['remove'](info.key.replace(/^\/\w+\//, '/'));
355
- }
356
- }
357
- });
358
-
359
- UN_LISTTEN_DRP = history.listen((route) => {
360
- if ((window as any).__POWERED_BY_QIANKUN__) {
361
- if (window.location.href.indexOf(`/${itemPath}`) === -1) return;
362
- }
363
- const {
364
- listenRouterState,
365
- listenRouterKey,
366
- customerMatchs,
367
- hideMenuArray,
368
- } = this.state;
369
- let newListenRouterState = [...listenRouterState];
370
- let newListenRouterKey = [...listenRouterKey];
371
-
372
- let replaceRouter = routerArray.filter((itemRoute) =>
373
- pathToRegexp(itemRoute.key || '').test(route.pathname),
374
- )[0];
375
-
376
- if (!istParent) {
377
- if (route.pathname === '/') return;
378
- window.parent.postMessage(`/parent/${itemPath}${route.pathname}`, '*');
379
- }
380
-
381
- let currentKey = '';
382
-
383
- if (replaceRouter && replaceRouter.isOnlyOnePage) {
384
- // 处理中英文和特殊字符
385
- currentKey = decodeURIComponent(route.pathname);
386
- } else {
387
- currentKey = decodeURIComponent(
388
- route.pathname + this.parseQueryString(route.search),
389
- );
390
- }
391
-
392
- // 防止出错
393
- if (listenRouterKey.length !== listenRouterState.length) {
394
- listenRouterState.forEach((item, index) => {
395
- listenRouterKey[index] = item.key;
396
- });
397
- }
398
-
399
- if (!listenRouterKey.includes(currentKey)) {
400
- if (!replaceRouter) {
401
- replaceRouter = routerArray.filter(
402
- (itemroute) => itemroute.key === '/404',
403
- )?.[0];
404
-
405
- this.setState(
406
- {
407
- listenRouterState: [
408
- ...listenRouterState,
409
- { ...replaceRouter, key: currentKey, tab: '404' },
410
- ],
411
- activeKey: currentKey,
412
- listenRouterKey: [...listenRouterKey, currentKey],
413
- },
414
- () => {
415
- this.checkisNavSlide();
416
- },
417
- );
418
- } else {
419
- const match = matchPath(route.pathname, { path: replaceRouter.key }, pathToRegexp);
420
- newListenRouterState = [
421
- ...newListenRouterState,
422
- {
423
- ...replaceRouter,
424
- query: route.query,
425
- match: match,
426
- key: currentKey,
427
- tab: this.getPageTitle(route.pathname) + '',
428
- },
429
- ];
430
- newListenRouterKey = [...listenRouterKey, currentKey];
431
- }
432
- }
433
-
434
- // 处理hideMenu页面自动关闭
435
- lastTwoRouterArray.push(route.pathname);
436
- lastTwoRouterArray.shift();
437
- if (
438
- !localStorage.getItem('isTabChange') &&
439
- !localStorage.getItem('isMenuClick')
440
- ) {
441
- if (
442
- lastTwoRouterArray[0] &&
443
- typeof lastTwoRouterArray[0] === 'string'
444
- ) {
445
- let needRemoveKeyArray = hideMenuArray.filter((itemRoute) =>
446
- pathToRegexp(itemRoute.path || '').test(lastTwoRouterArray[0]),
447
- );
448
- // lastTwoRouterArray[0] != lastTwoRouterArray[1] 该判断条件用于判断是否是tab删除操作,如果是tab页删除操作,删除的是不是最后一个打开的tab页,执行history.push会导致错误的将最后打开的那个tab页也删除掉
449
- if (
450
- needRemoveKeyArray.length &&
451
- lastTwoRouterArray[0] != lastTwoRouterArray[1]
452
- ) {
453
- if (
454
- (!(
455
- lastTwoRouterArray[0].indexOf('/order/mainOrder/supplement') >=
456
- 0
457
- ) ||
458
- !pathToRegexp(
459
- '/order/mainOrder/:parmode/separateOrder/:id',
460
- ).test(lastTwoRouterArray[1])) &&
461
- (!pathToRegexp(
462
- '/order/mainOrder/:parmode/separateOrder/:id',
463
- ).test(lastTwoRouterArray[0]) ||
464
- !(
465
- lastTwoRouterArray[1].indexOf(
466
- 'order/mainOrder/separateOrder/',
467
- ) >= 0
468
- ))
469
- ) {
470
- if (!route.state?.thisHideInMenuDoNotClose) {
471
- newListenRouterState = newListenRouterState.filter((item) => {
472
- const [pathname] = item.key ? item.key.split('?') : [];
473
- return pathname && pathname !== lastTwoRouterArray[0];
474
- });
475
- newListenRouterKey = newListenRouterKey.filter((item) => {
476
- const [pathname] = item ? item.split('?') : [];
477
- return pathname && pathname !== lastTwoRouterArray[0];
478
- });
479
- }
480
- }
481
- }
482
- }
483
- // refs?.tableRef?.current?.refreshTable();
484
- } else {
485
- setTimeout(() => {
486
- // 处理页面刷新两面
487
- localStorage.removeItem('isTabChange');
488
- localStorage.removeItem('isMenuClick');
489
- }, 0);
490
- }
491
- this.setState(
492
- {
493
- //路由监听函数最后执行setState,避免处理hideMenu类型页面自动关闭的逻辑块内获取不到最新state的listenRouterState和listenRouterKey
494
- activeKey: currentKey,
495
- listenRouterState: newListenRouterState,
496
- listenRouterKey: newListenRouterKey,
497
- },
498
- () => {
499
- this.checkisNavSlide();
500
- },
501
- );
502
-
503
- istParent = 0;
504
- });
505
-
506
- if (
507
- localStorage.getItem('firstPage') &&
508
- localStorage.getItem('firstPage')?.startsWith(`#/${itemPath}/`)
509
- ) {
510
- istParent = 1;
511
- history.push(
512
- localStorage
513
- .getItem('firstPage')
514
- ?.slice(1)
515
- .replace(/^\/\w+\//, '/'),
516
- );
517
- } else {
518
- history.push(location);
519
- }
520
- }
521
-
522
- componentWillUnmount() {
523
- // eslint-disable-next-line no-unused-expressions
524
- UN_LISTTEN_DRP && UN_LISTTEN_DRP();
525
- }
526
-
527
- parseQueryString = (queryString) => {
528
- if (!queryString) {
529
- return '';
530
- }
531
-
532
- if (queryString.indexOf('?') < 0) {
533
- return `?${queryString}`;
534
- }
535
-
536
- return queryString;
537
- };
538
-
539
- updateTree = (Tree) => {
540
- const treeData = Tree;
541
- const treeList = [];
542
- // 递归获取树列表
543
- const getTreeList = (data) => {
544
- data.forEach((node) => {
545
- if (node.routes && node.routes.length > 0) {
546
- getTreeList(node.routes);
547
- } else {
548
- treeList.push({
549
- tab: node.locale,
550
- key: node.path,
551
- locale: node.locale,
552
- closable: true,
553
- content: node.component,
554
- name: node.name,
555
- hideInMenu: node.hideInMenu,
556
- isOnlyOnePage: node.isOnlyOnePage,
557
- });
558
- }
559
- });
560
- };
561
- getTreeList(treeData);
562
- return treeList;
563
- };
564
-
565
- getDictionarySource = (dicCode: string, needConvertInterger = false) => {
566
- const { dictionaryData } = this.props;
567
-
568
- let dicData = {};
569
-
570
- if (!dictionaryData) {
571
- let storageDic = localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES)
572
- ? JSON.parse(localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES))
573
- : {};
574
- dicData = storageDic[dicCode];
575
- } else {
576
- dicData = dictionaryData[dicCode];
577
- }
578
- // if (!dicData || !dicData.length) {
579
- // throw new Error(`当前没有${dicCode}字典值`);
580
- // }
581
-
582
- try {
583
- if (needConvertInterger) {
584
- dicData = dicData.map((item: { text: string; value: string }) => ({
585
- ...item,
586
- value: parseFloat(item.value),
587
- }));
588
- }
589
- } catch (e) { }
590
-
591
- return dicData;
592
- };
593
-
594
- getDictionaryTextByValue = (dicCode: string, value: string) => {
595
- let dicData = [];
596
- let dictionaryData: any;
597
- if (!dictionaryData) {
598
- let storageDic = localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES)
599
- ? JSON.parse(localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES))
600
- : {};
601
- dicData = storageDic[dicCode];
602
- } else {
603
- dicData = dictionaryData[dicCode];
604
- }
605
-
606
- if (!dicData || !dicData.length) {
607
- // throw new Error(`当前没有${dicCode}字典值`);
608
- }
609
-
610
- if (value === undefined) return '- -';
611
-
612
- const dicItemArray = dicData?.filter(
613
- (item: { value: string }) => item.value === value.toString(),
614
- );
615
-
616
- if (!dicItemArray?.length) {
617
- // throw new Error(`当前${dicCode}字典值合没有${value}的数据`)
618
- return value;
619
- }
620
-
621
- return dicItemArray[0].text;
622
- };
623
-
624
- timeFormat = (timeStr, format, notNeedConvertTimeZone) => {
625
- if (!timeStr) return '- -';
626
-
627
- if (notNeedConvertTimeZone) {
628
- return moment(timeStr).format(format);
629
- }
630
-
631
- return moment(timeStr).add(8, 'hours').format(format) || '- -';
632
- };
633
-
634
- onChange = (key) => {
635
- // console.log('onChange');
636
- if (key !== this.state.activeKey) {
637
- this.setState({
638
- activeKey: key,
639
- });
640
- localStorage.setItem('isTabChange', '1');
641
- history.push(key);
642
- }
643
- };
644
-
645
- getPageTitle = (pathname) => {
646
- const { formatMessage } = this.props;
647
- const { breadcrumbNameMap } = this.state;
648
- const currRouterData = this.matchParamsPath(pathname, breadcrumbNameMap);
649
-
650
- if (!currRouterData) {
651
- return '';
652
- }
653
- const pageName = formatMessage({
654
- id: currRouterData.locale || currRouterData.name,
655
- defaultMessage: currRouterData.name,
656
- });
657
-
658
- return `${pageName}`;
659
- };
660
-
661
- matchParamsPath = (pathname, breadcrumbNameMap) => {
662
- const { pathToRegexp } = this.props;
663
- const pathKey = Object.keys(breadcrumbNameMap).find((key) =>
664
- pathToRegexp(key).test(pathname),
665
- );
666
- return breadcrumbNameMap[pathKey];
667
- };
668
-
669
- onEdit = (
670
- targetKey: React.MouseEvent | React.KeyboardEvent | string,
671
- action: string,
672
- ) => {
673
- this.tabActions[action](targetKey);
674
- };
675
-
676
- tabActions: any = {
677
- remove: (targetKey: string) => {
678
- const { listenRouterState, activeKey, customerMatchs, listenRouterKey } =
679
- this.state;
680
-
681
- let lastIndex: number = 0;
682
- let newActiveKey: string | undefined = activeKey;
683
- let newListenRouterState = [];
684
- let newListenRouterKey = [];
685
-
686
- if (targetKey === activeKey) {
687
- listenRouterState.forEach((pane, i) => {
688
- if (pane.key === targetKey) {
689
- lastIndex = i - 1;
690
- }
691
- });
692
-
693
- newListenRouterState = listenRouterState.filter(
694
- (item) => item.key !== targetKey,
695
- );
696
- newListenRouterKey = listenRouterKey.filter(
697
- (item) => item !== targetKey,
698
- );
699
-
700
- if (lastIndex < 0) {
701
- lastIndex = 0;
702
- }
703
-
704
- newActiveKey = newListenRouterState[lastIndex].key;
705
- } else {
706
- newListenRouterState = listenRouterState.filter(
707
- (item) => item.key !== targetKey,
708
- );
709
- newListenRouterKey = listenRouterKey.filter(
710
- (item) => item !== targetKey,
711
- );
712
- }
713
-
714
- this.setState(
715
- {
716
- activeKey: newActiveKey,
717
- listenRouterState: newListenRouterState,
718
- listenRouterKey: newListenRouterKey,
719
- },
720
- () => {
721
- history.push({
722
- pathname: newActiveKey,
723
- });
724
- this.checkisNavSlide();
725
- },
726
- );
727
- },
728
- };
729
-
730
- updateState = (newListenRouterState, newListenRouterKey, cb) => {
731
- this.setState(
732
- {
733
- listenRouterState: newListenRouterState,
734
- listenRouterKey: newListenRouterKey,
735
- },
736
- () => {
737
- this.checkisNavSlide();
738
- if (cb) cb();
739
- },
740
- );
741
- };
742
-
743
- handleClose = () => {
744
- this.setState({
745
- drawerLeftParams: {
746
- ...this.state.drawerLeftParams,
747
- visible: false,
748
- },
749
- isCollapse: true,
750
- });
751
- this.allFunc.current?.close?.();
752
- this.customerMenuRef.current?.close?.();
753
- };
754
-
755
- handleMenuClick = (item: any) => {
756
- if (item.children || !item.component) return;
757
- history.push({
758
- pathname: item.path,
759
- });
760
- this.setShowMenu(false);
761
- };
762
-
763
- getMenuDom = (menuData) => {
764
- return menuData.map((item) => (
765
- <div>
766
- <div
767
- onClick={() => {
768
- this.handleMenuClick(item);
769
- }}
770
- className={`${'menu_item'} ${item.children || !item.component ? '' : 'link_style'
771
- }`}
772
- style={{
773
- fontWeight: item.children || !item.component ? 'bolder' : '400',
774
- paddingLeft: '10px',
775
- marginTop: item.children || !item.component ? '5px' : '0px',
776
- fontSize: item.children || !item.component ? '14px' : '12px',
777
- }}
778
- >
779
- {item.name}
780
- </div>
781
- {!!item.children &&
782
- !!item.children.length &&
783
- this.getMenuDom(item.children)}
784
- </div>
785
- ));
786
- };
787
-
788
- setShowMenu = debounce((isShow) => {
789
- this.setState({
790
- showSubMenu: isShow,
791
- });
792
- }, 500);
793
-
794
- //设置tabs标签左右滚动
795
- setTabNavTransLate = (num) => {
796
- let globalTabsNav = document
797
- .getElementById('globalTabs')
798
- ?.getElementsByClassName('ant-tabs-nav-list')?.[0];
799
- let globalTabsNavWrap = document
800
- .getElementById('globalTabs')
801
- ?.getElementsByClassName('ant-tabs-nav-wrap')?.[0];
802
- let wrapWidth = globalTabsNavWrap.offsetWidth; //tabsNav父节点宽度
803
- let navListWidth = globalTabsNav.offsetWidth; //tabsNav总宽度
804
- if (navListWidth - wrapWidth <= 0) return;
805
- let maxTransX = navListWidth - wrapWidth; // 允许移动最大宽度
806
- let transXStr = document.defaultView?.getComputedStyle(
807
- globalTabsNav,
808
- null,
809
- ).transform;
810
- let transx = transXStr?.split(',')[4]; //当前translateX的值
811
-
812
- let targetTransX = Math.abs(Number(transx)) + num;
813
- if (targetTransX <= 0) targetTransX = 0;
814
- if (targetTransX >= Number(maxTransX)) targetTransX = Number(maxTransX);
815
- globalTabsNav.style.transform = 'translateX(-' + targetTransX + 'px)';
816
- };
817
-
818
- checkisNavSlide = () => {
819
- if (window.top != window) return;
820
- //监听tabs页签总长度判断是否可点击滑动
821
- let globalTabsNav = document
822
- .getElementById('globalTabs')
823
- ?.getElementsByClassName('ant-tabs-nav-list')?.[0];
824
- let globalTabsNavWrap = document
825
- .getElementById('globalTabs')
826
- ?.getElementsByClassName('ant-tabs-nav-wrap')?.[0];
827
- let wrapWidth = globalTabsNavWrap?.offsetWidth; //tabsNav父节点宽度
828
- let navListWidth = globalTabsNav?.offsetWidth; //tabsNav总宽度
829
- if (navListWidth - wrapWidth <= 0) {
830
- this.setState({
831
- isSlider: false,
832
- });
833
- return;
834
- }
835
- this.setState({
836
- isSlider: true,
837
- });
838
- };
839
-
840
- changeListenRouterState = (dragIndex: number, hoverIndex: number) => {
841
- const { listenRouterState, listenRouterKey } = this.state;
842
- let dragItem = listenRouterState[dragIndex];
843
- let dragKeyItem = listenRouterKey[dragIndex];
844
-
845
- listenRouterState.splice(dragIndex, 1);
846
- listenRouterState.splice(hoverIndex, 0, dragItem);
847
-
848
- listenRouterKey.splice(dragIndex, 1);
849
- listenRouterKey.splice(hoverIndex, 0, dragKeyItem);
850
- };
851
-
852
- operateFun = (key, type) => {
853
- const { listenRouterState, activeKey, listenRouterKey } = this.state;
854
- let deleteKey = '';
855
- let newlistenRouterState = [];
856
- let newlistenRouterKey = [];
857
- let newActiveKey = '';
858
- let deleteIndex = 0;
859
- if (type === 'self') {
860
- deleteIndex = listenRouterState.findIndex((item) => item.key === key);
861
- deleteKey = key;
862
- if (deleteIndex > 0) {
863
- newActiveKey = listenRouterState[deleteIndex - 1].key;
864
- } else {
865
- newActiveKey = listenRouterState[1].key;
866
- }
867
- newlistenRouterState = listenRouterState.filter((d) => d.key !== key);
868
- newlistenRouterKey = listenRouterKey.filter((d) => d !== key);
869
- this.updateState(newlistenRouterState, newlistenRouterKey, () => {
870
- if (deleteKey === activeKey) {
871
- history.push({
872
- pathname: newActiveKey,
873
- });
874
- }
875
- });
876
- }
877
- if (type === 'left') {
878
- const index = listenRouterState.findIndex((item) => item.key === key);
879
- newlistenRouterState = listenRouterState.filter(
880
- (d: any, i: number) => i >= index || d.key === '/',
881
- );
882
- newlistenRouterKey = listenRouterKey.filter(
883
- (d: any, i: number) => i >= index || d === '/',
884
- );
885
- this.updateState(newlistenRouterState, newlistenRouterKey, () => {
886
- if (newlistenRouterKey.find((item) => item === activeKey)) {
887
- return;
888
- } else {
889
- history.push({
890
- pathname: key,
891
- });
892
- }
893
- });
894
- }
895
- if (type === 'right') {
896
- const index = listenRouterState.findIndex((item) => item.key === key);
897
- newlistenRouterState = listenRouterState.filter(
898
- (d: any, i: number) => i <= index || d.key === '/',
899
- );
900
- newlistenRouterKey = listenRouterKey.filter(
901
- (d: any, i: number) => i <= index || d === '/',
902
- );
903
- this.updateState(
904
- listenRouterState.filter(
905
- (d: any, i: number) => i <= index || d.key === '/',
906
- ),
907
- listenRouterKey.filter((d: any, i: number) => i <= index || d === '/'),
908
- () => {
909
- if (newlistenRouterKey.find((item) => item === activeKey)) {
910
- return;
911
- } else {
912
- history.push({
913
- pathname: key,
914
- });
915
- }
916
- },
917
- );
918
- }
919
- if (type === 'all') {
920
- this.updateState(
921
- listenRouterState.filter((item) => item.key === '/'),
922
- listenRouterKey.filter((item) => item === '/'),
923
- () => {
924
- history.push({
925
- pathname: '/',
926
- });
927
- },
928
- );
929
- }
930
- if (type === 'other') {
931
- this.updateState(
932
- listenRouterState.filter(
933
- (item) => item.key === key || item.key === '/',
934
- ),
935
- listenRouterKey.filter((item) => item === key || item === '/'),
936
- () => {
937
- if (key !== activeKey) {
938
- history.push({
939
- pathname: key,
940
- });
941
- }
942
- },
943
- );
944
- }
945
- };
946
-
947
- render() {
948
- const {
949
- listenRouterState,
950
- activeKey,
951
- listenRouterKey,
952
- drawerLeftParams,
953
- collapse,
954
- currentSubMenuData,
955
- showSubMenu,
956
- currentSubPath,
957
- } = this.state;
958
- const { originRoutes, itemPath, defaultSettings, transparentProps={} } = this.props;
959
- const TabTitle: React.FC<{}> = ({ item, index, updateState }) => {
960
- return (
961
- <div className="tab_title_content">
962
- {item.tab}
963
- {item.key !== '/' && (
964
- <ItemMenu
965
- info={item}
966
- operateFun={this.operateFun}
967
- listenRouterState={listenRouterState}
968
- />
969
- )}
970
- </div>
971
- );
972
- };
973
-
974
- // 左侧菜单 route
975
- const dataShowRoute = this.props.routes.find(
976
- (route) => route.path === '/homePage/data-show',
977
- ); // 添加数据大屏
978
- const { route, ...restPrpos } = this.props;
979
- const exist = route.routes.find(
980
- (route) => route.path === '/homePage/data-show',
981
- );
982
- if (dataShowRoute && !exist) {
983
- route.routes.splice(1, 0, dataShowRoute);
984
- }
985
-
986
- const menu = (
987
- <Menu>
988
- <Menu.Item
989
- key="0"
990
- style={{
991
- background: '#FFFFFF',
992
- color: '#848484',
993
- fontSize: '12px',
994
- textAlign: 'center',
995
- }}
996
- >
997
- <div>已打开的页签数: {listenRouterState.length}</div>
998
- </Menu.Item>
999
- <Menu.Item key="1" style={{ fontSize: '12px', textAlign: 'center' }}>
1000
- <a
1001
- onClick={() => {
1002
- // 关闭全部
1003
- this.updateState(
1004
- [
1005
- {
1006
- ...this.state.homeRouter,
1007
- key: '/',
1008
- tab: '欢迎',
1009
- closable: false,
1010
- },
1011
- ],
1012
- ['/'],
1013
- () => {
1014
- history.push('/');
1015
- },
1016
- );
1017
- }}
1018
- >
1019
- 关闭全部标签
1020
- </a>
1021
- </Menu.Item>
1022
- <Menu.Item key="2" style={{ fontSize: '12px', textAlign: 'center' }}>
1023
- <a
1024
- onClick={() => {
1025
- if (activeKey === '/') return;
1026
- const index = listenRouterState.findIndex(
1027
- (item) => item.key === activeKey,
1028
- );
1029
- let newActiveKey = '';
1030
- if (index > 0) {
1031
- newActiveKey = listenRouterState[index - 1].key;
1032
- } else {
1033
- newActiveKey = listenRouterState[1].key;
1034
- }
1035
- this.updateState(
1036
- listenRouterState.filter((d) => d.key !== activeKey),
1037
- listenRouterKey.filter((d) => d !== activeKey),
1038
- () => {
1039
- history.push({
1040
- pathname: newActiveKey,
1041
- });
1042
- },
1043
- );
1044
- }}
1045
- >
1046
- 关闭当前标签
1047
- </a>
1048
- </Menu.Item>
1049
- <Menu.Item key="3" style={{ fontSize: '12px', textAlign: 'center' }}>
1050
- <a
1051
- onClick={() => {
1052
- const index = listenRouterState.findIndex(
1053
- (item) => item.key === activeKey,
1054
- );
1055
- // let deleteKey = listenRouterState[index - 1]?.key;
1056
- // if (deleteKey === '/') {
1057
- // message.warning('首页不可关闭。');
1058
- // return;
1059
- // }
1060
-
1061
- this.updateState(
1062
- listenRouterState.filter(
1063
- (d: any, i: number) => i >= index || d.key === '/',
1064
- ),
1065
- listenRouterKey.filter(
1066
- (d: any, i: number) => i >= index || d === '/',
1067
- ),
1068
- );
1069
- }}
1070
- >
1071
- 关闭其左侧标签
1072
- </a>
1073
- </Menu.Item>
1074
- <Menu.Item key="4" style={{ fontSize: '12px', textAlign: 'center' }}>
1075
- <a
1076
- onClick={() => {
1077
- let index = listenRouterState.findIndex(
1078
- (item) => item.key === activeKey,
1079
- );
1080
- this.updateState(
1081
- listenRouterState.filter(
1082
- (d: any, i: number) => i <= index || d.key === '/',
1083
- ),
1084
- listenRouterKey.filter(
1085
- (d: any, i: number) => i <= index || d === '/',
1086
- ),
1087
- );
1088
- }}
1089
- >
1090
- 关闭其右侧标签
1091
- </a>
1092
- </Menu.Item>
1093
- </Menu>
1094
- );
1095
-
1096
- const filterByMenuDate = (
1097
- data: MenuDataItem[],
1098
- keyWord: string,
1099
- ): MenuDataItem[] =>
1100
- data
1101
- .map((item) => {
1102
- if (item.name && item.name.includes(keyWord)) {
1103
- return {
1104
- ...item,
1105
- };
1106
- }
1107
- return undefined;
1108
- })
1109
- .filter((item) => item) as MenuDataItem[];
1110
-
1111
- let weiqianduanProps = {};
1112
- let isWeiqianduan = false;
1113
-
1114
- if (window.top != window) {
1115
- isWeiqianduan = true;
1116
- weiqianduanProps = {
1117
- headerRender: false,
1118
- footerRender: false,
1119
- menuRender: false,
1120
- menuHeaderRender: false,
1121
- menuExtraRender: false,
1122
- };
1123
- }
1124
-
1125
- const OperationsSlot: Record<PositionType, React.ReactNode> = {
1126
- left: (
1127
- <div className={'tab_left_operate'}>
1128
- <div
1129
- onClick={() => {
1130
- history.push({
1131
- pathname: '/',
1132
- });
1133
- }}
1134
- >
1135
- <HomeOutlined />
1136
- </div>
1137
- <div
1138
- style={{ opacity: this.state.isSlider ? 1 : 0.5 }}
1139
- onClick={() => {
1140
- this.setTabNavTransLate(-100);
1141
- }}
1142
- >
1143
- <DoubleLeftOutlined />
1144
- </div>
1145
- </div>
1146
- ),
1147
- right: (
1148
- <div
1149
- style={{ opacity: this.state.isSlider ? 1 : 0.5 }}
1150
- className={'tab_right_operate'}
1151
- onClick={() => {
1152
- this.setTabNavTransLate(100);
1153
- }}
1154
- >
1155
- <DoubleRightOutlined />
1156
- </div>
1157
- ),
1158
- };
1159
-
1160
- return (
1161
- <ProLayout
1162
- actionRef={this.actionRef}
1163
- onMenuHeaderClick={() => history.push('/')}
1164
- menuHeaderRender={({ }) => (
1165
- <CustomerMenuHeader
1166
- originRoutes={originRoutes}
1167
- itemPath={itemPath}
1168
- handleClose={this.handleClose}
1169
- collapsed={collapse}
1170
- />
1171
- )}
1172
- menuExtraRender={() => {
1173
- if (!collapse) {
1174
- return (
1175
- <div>
1176
- <CustomerMenu
1177
- originRoutes={originRoutes}
1178
- itemPath={itemPath}
1179
- ref={this.customerMenuRef}
1180
- actionRef={this.actionRef}
1181
- handleClose={this.handleClose}
1182
- isCollapse={this.state.collapse}
1183
- />
1184
- </div>
1185
- );
1186
- }
1187
- return (
1188
- <div className="collapse_icon_close">
1189
- <span
1190
- className="collapse_icon"
1191
- onClick={() => {
1192
- this.setState({
1193
- collapse: !collapse,
1194
- });
1195
- }}
1196
- >
1197
- <MenuUnfoldOutlined />
1198
- </span>
1199
- </div>
1200
- );
1201
- }}
1202
- menuProps={{
1203
- onClick: () => {
1204
- localStorage.setItem('isMenuClick', 'true');
1205
- },
1206
- }}
1207
- collapsed={collapse}
1208
- onCollapse={(boo: boolean) => {
1209
- this.setState({
1210
- collapse: boo,
1211
- });
1212
- }}
1213
- menuItemRender={(menuItemProps, defaultDom) => {
1214
- if (menuItemProps?.path === '/') {
1215
- return (
1216
- <>
1217
- <div className="one_menu_wrap">
1218
- <Link
1219
- onClick={() => {
1220
- localStorage.setItem('isMenuClick', 'true');
1221
- }}
1222
- to={menuItemProps.path}
1223
- >
1224
- {defaultDom}
1225
- </Link>
1226
- </div>
1227
- </>
1228
- );
1229
- }
1230
- return (
1231
- <Link
1232
- onClick={() => {
1233
- localStorage.setItem('isMenuClick', 'true');
1234
- }}
1235
- to={menuItemProps.path}
1236
- >
1237
- {defaultDom}
1238
- </Link>
1239
- );
1240
- }}
1241
- subMenuItemRender={(menuItemProps, defaultDom) => {
1242
- return (
1243
- <div
1244
- style={{
1245
- height: '40px',
1246
- lineHeight: '40px',
1247
- position: 'relative',
1248
- overflow: 'hidden',
1249
- textOverflow: 'ellipsis',
1250
- whiteSpace: 'nowrap',
1251
- boxSizing: 'border-box',
1252
- paddingRight: '10px',
1253
- }}
1254
- onMouseEnter={() => {
1255
- if (
1256
- menuItemProps.pro_layout_parentKeys &&
1257
- menuItemProps.pro_layout_parentKeys.length
1258
- )
1259
- return;
1260
- this.setState({
1261
- currentSubMenuData: menuItemProps.children,
1262
- currentSubPath: menuItemProps.path,
1263
- });
1264
- this.setShowMenu(true);
1265
- }}
1266
- onMouseLeave={() => {
1267
- this.setShowMenu(false);
1268
- }}
1269
- >
1270
- {defaultDom}
1271
- {showSubMenu &&
1272
- currentSubPath === menuItemProps.path &&
1273
- !collapse && (
1274
- <CaretLeftOutlined
1275
- style={{ position: 'absolute', top: '14px', right: '-4px' }}
1276
- />
1277
- )}
1278
- </div>
1279
- );
1280
- }}
1281
- collapsedButtonRender={() => {
1282
- return (
1283
- <div
1284
- onClick={(e) => {
1285
- e.stopPropagation();
1286
- }}
1287
- className="banquan"
1288
- >
1289
- {''}
1290
- </div>
1291
- );
1292
- }}
1293
- postMenuData={(menus) => {
1294
- return [...filterByMenuDate(menus || [], this.state.keyWord)];
1295
- }}
1296
- links={[
1297
- !this.state.collapse ? (
1298
- <AllFunc
1299
- ref={this.allFunc}
1300
- itemPath={itemPath}
1301
- handleClose={this.handleClose}
1302
- isCollapse={this.state.collapse}
1303
- />
1304
- ) : (
1305
- ''
1306
- ),
1307
- ]}
1308
- onPageChange={() => {
1309
- const { location } = history;
1310
- // 如果没有登录,重定向到 login
1311
- if (
1312
- !localStorage.getItem(ENUM.BROWSER_CACHE.USER_INFO) &&
1313
- location.pathname !== '/user/login'
1314
- ) {
1315
- history.push('/user/login');
1316
- }
1317
- }}
1318
- headerRender={(props) => <GlobalHeaderCom {...props} />}
1319
- menu={{
1320
- request: async () => {
1321
- return JSON.parse(
1322
- localStorage.getItem(`customerMenu_${itemPath}_front`) || '[]',
1323
- );
1324
- },
1325
- type: 'group',
1326
- }}
1327
- route={route}
1328
- {...restPrpos}
1329
- {...defaultSettings}
1330
- {...weiqianduanProps}
1331
- >
1332
- <div id="globalTabsContent" className="globalTabs">
1333
- <DraggableTabs
1334
- activeKey={activeKey}
1335
- id="globalTabs"
1336
- onChange={this.onChange}
1337
- // tabBarExtraContent={operations}
1338
- type="editable-card"
1339
- tabBarStyle={{
1340
- background: '#f3f3f3',
1341
- height: '28px',
1342
- marginRight: 0,
1343
- fontSize: '12px',
1344
- color: '#2C2F2E70',
1345
- marginBottom: '-2px',
1346
- position: 'fixed',
1347
- top: 50,
1348
- zIndex: 10,
1349
- width: collapse ? 'calc(100% - 75px)' : 'calc(100% - 167px)',
1350
- display: isWeiqianduan ? 'none' : 'flex',
1351
- }}
1352
- tabPosition="top"
1353
- tabBarGutter={8}
1354
- onEdit={this.onEdit}
1355
- tabBarExtraContent={OperationsSlot}
1356
- animated={false}
1357
- hideAdd
1358
- >
1359
- {listenRouterState.map((item, index) => (
1360
- <TabPane
1361
- tab={
1362
- <TabTitle
1363
- item={item}
1364
- index={index}
1365
- updateState={this.updateState}
1366
- />
1367
- }
1368
- style={{ marginTop: isWeiqianduan ? 0 : 30 }}
1369
- key={item.key}
1370
- closable={item.key !== '/'}
1371
- closeIcon={<img src="./biaoqian-guanbi-icon.svg" />}
1372
- >
1373
- <WrapperComponent
1374
- item={item}
1375
- routerProps={this.props}
1376
- getDictionarySource={this.getDictionarySource}
1377
- getDictionaryTextByValue={this.getDictionaryTextByValue}
1378
- timeFormat={this.timeFormat}
1379
- transparentProps={transparentProps}
1380
- />
1381
- </TabPane>
1382
- ))}
1383
- </DraggableTabs>
1384
- <div
1385
- className="globalTabsOper"
1386
- style={{
1387
- position: 'fixed',
1388
- top: '50px',
1389
- zIndex: 10,
1390
- background: '#fff',
1391
- display: isWeiqianduan ? 'none' : 'block',
1392
- borderLeft: '1px solid #E4E4E4',
1393
- }}
1394
- >
1395
- <Dropdown overlay={menu} trigger={['click']}>
1396
- <a
1397
- className="ant-dropdown-link"
1398
- onClick={(e) => e.preventDefault()}
1399
- >
1400
- <DashOutlined />
1401
- </a>
1402
- </Dropdown>
1403
- </div>
1404
- <SearchFunc itemPath={itemPath} {...drawerLeftParams}></SearchFunc>
1405
- <div
1406
- onMouseEnter={() => {
1407
- this.setShowMenu(true);
1408
- }}
1409
- onMouseLeave={() => {
1410
- this.setShowMenu(false);
1411
- }}
1412
- className={'sub_menu_content'}
1413
- style={{ display: showSubMenu && !collapse ? 'block' : 'none' }}
1414
- >
1415
- {this.getMenuDom(currentSubMenuData)}
1416
- </div>
1417
- </div>
1418
- </ProLayout>
1419
- );
1420
- }
1421
- }
1422
-
1423
- class WrapperComponent extends React.Component {
1424
- constructor(props) {
1425
- super(props);
1426
- }
1427
-
1428
- shouldComponentUpdate() {
1429
- return false;
1430
- }
1431
-
1432
- render() {
1433
- const {
1434
- item,
1435
- routerProps,
1436
- getDictionarySource,
1437
- getDictionaryTextByValue,
1438
- timeFormat,
1439
- transparentProps,
1440
- } = this.props;
1441
- return (
1442
- <>
1443
- {React.createElement(item.content, {
1444
- getDictionarySource: getDictionarySource,
1445
- getDictionaryTextByValue: getDictionaryTextByValue,
1446
- timeFormat: timeFormat,
1447
- ...routerProps,
1448
- ...transparentProps,
1449
- match: item.match,
1450
- })}
1451
- </>
1452
- );
1453
- }
1454
- }
1455
-
1456
- export default (props) => {
1457
- const { initialState = {} } = useModel('@@initialState');
1458
-
1459
- const { dictionaryData } = initialState;
1460
- const intl = useIntl();
1461
- const { formatMessage } = intl;
1462
- return (
1463
- <BasicLayout
1464
- {...props}
1465
- dictionaryData={dictionaryData}
1466
- formatMessage={formatMessage}
1467
- />
1468
- );
1469
- };
1
+ // @ts-nocheck
2
+ import type {
3
+ MenuDataItem,
4
+ BasicLayoutProps as ProLayoutProps,
5
+ Settings,
6
+ } from '@ant-design/pro-layout';
7
+ import ProLayout from '@ant-design/pro-layout';
8
+ import React, { useState, createRef, useRef } from 'react';
9
+ import {
10
+ Tabs,
11
+ Dropdown,
12
+ Menu,
13
+ } from 'antd';
14
+ import {
15
+ Link,
16
+ useIntl,
17
+ history,
18
+ useModel,
19
+ } from 'umi';
20
+ import {
21
+ DashOutlined,
22
+ MenuUnfoldOutlined,
23
+ CaretLeftOutlined,
24
+ HomeOutlined,
25
+ DoubleLeftOutlined,
26
+ DoubleRightOutlined,
27
+ } from '@ant-design/icons';
28
+ import SearchFunc from './Components/SearchFunc';
29
+ import { debounce } from 'lodash';
30
+
31
+ import AllFunc from './Components/AllFunc';
32
+ import {
33
+ getBreadcrumbNameMap,
34
+ ergodicMenuRoutes,
35
+ matchPath,
36
+ encodeUrlQuery,
37
+ } from './utils';
38
+ import moment from 'moment';
39
+ import GlobalHeaderCom from './Components/GlobalHeader';
40
+ import CustomerMenu from './Components/CustomerMenu';
41
+ import CustomerMenuHeader from './Components/CustomerMenu/globalMenu/customMenuHeader';
42
+ import './index.less';
43
+ import { DndProvider, useDrag, useDrop } from 'react-dnd';
44
+ import { HTML5Backend } from 'react-dnd-html5-backend';
45
+ import ENUM from '@/utils/enumConfig';
46
+ import { memoizeOneFormatter } from '@/utils/utils';
47
+
48
+ const { TabPane } = Tabs;
49
+
50
+ export const RouterContext = React.createContext({});
51
+
52
+ export type BasicLayoutProps = {
53
+ breadcrumbNameMap: Record<string, MenuDataItem>;
54
+ route: ProLayoutProps['route'] & {
55
+ authority: string[];
56
+ };
57
+ settings: Settings;
58
+ } & ProLayoutProps;
59
+
60
+ export type BasicLayoutContext = { [K in 'location']: BasicLayoutProps[K] } & {
61
+ breadcrumbNameMap: Record<string, MenuDataItem>;
62
+ };
63
+
64
+ const menuDataRender = (menuList: MenuDataItem[]): MenuDataItem[] =>
65
+ menuList.map((item) => {
66
+ return {
67
+ ...item,
68
+ children: item.children ? menuDataRender(item.children) : undefined,
69
+ };
70
+ });
71
+
72
+ let UN_LISTTEN_DRP;
73
+ let routerArray = [];
74
+ let lastTwoRouterArray = [1, 2];
75
+
76
+ let draggerTabKeys = [];
77
+
78
+ const type = 'DraggableTabNode';
79
+ const DraggableTabNode = ({ index, children, moveNode }) => {
80
+ const ref = useRef(null);
81
+ const [{ isOver, dropClassName }, drop] = useDrop({
82
+ accept: type,
83
+ collect: (monitor) => {
84
+ const { index: dragIndex } = monitor.getItem() || {};
85
+
86
+ if (dragIndex === index) {
87
+ return {};
88
+ }
89
+
90
+ return {
91
+ isOver: monitor.isOver(),
92
+ dropClassName: 'dropping',
93
+ };
94
+ },
95
+ drop: (item) => {
96
+ moveNode(item.index, index);
97
+ },
98
+ });
99
+ const [, drag] = useDrag({
100
+ type,
101
+ item: {
102
+ index,
103
+ },
104
+ collect: (monitor) => ({
105
+ isDragging: monitor.isDragging(),
106
+ }),
107
+ });
108
+ drop(drag(ref));
109
+ return (
110
+ <div
111
+ ref={ref}
112
+ style={{
113
+ marginRight: 24,
114
+ }}
115
+ className={isOver ? dropClassName : ''}
116
+ >
117
+ {children}
118
+ </div>
119
+ );
120
+ };
121
+
122
+ const DraggableTabs = (props) => {
123
+ const { children, changeListenRouterState } = props;
124
+ const [order, setOrder] = useState([]);
125
+
126
+ const moveTabNode = (dragKey, hoverKey) => {
127
+ const newOrder = order.slice();
128
+ React.Children.forEach(children, (c) => {
129
+ if (c.key && newOrder.indexOf(c.key) === -1) {
130
+ newOrder.push(c.key);
131
+ }
132
+ });
133
+ const dragIndex = newOrder.indexOf(dragKey);
134
+ const hoverIndex = newOrder.indexOf(hoverKey);
135
+ newOrder.splice(dragIndex, 1);
136
+ newOrder.splice(hoverIndex, 0, dragKey);
137
+ changeListenRouterState(dragIndex, hoverIndex);
138
+ setOrder(newOrder);
139
+ };
140
+
141
+ const renderTabBar = (tabBarProps, DefaultTabBar) => (
142
+ <DefaultTabBar {...tabBarProps}>
143
+ {(node) => (
144
+ <DraggableTabNode
145
+ key={node.key}
146
+ index={node.key}
147
+ moveNode={moveTabNode}
148
+ >
149
+ {node}
150
+ </DraggableTabNode>
151
+ )}
152
+ </DefaultTabBar>
153
+ );
154
+
155
+ const tabs = [];
156
+ React.Children.forEach(children, (c) => {
157
+ tabs.push(c);
158
+ });
159
+ const orderTabs = tabs.slice().sort((a, b) => {
160
+ const orderA = order.indexOf(a.key);
161
+ const orderB = order.indexOf(b.key);
162
+
163
+ if (orderA !== -1 && orderB !== -1) {
164
+ return orderA - orderB;
165
+ }
166
+
167
+ if (orderA !== -1) {
168
+ return -1;
169
+ }
170
+
171
+ if (orderB !== -1) {
172
+ return 1;
173
+ }
174
+
175
+ const ia = tabs.indexOf(a);
176
+ const ib = tabs.indexOf(b);
177
+ return ia - ib;
178
+ });
179
+ return (
180
+ <DndProvider backend={HTML5Backend}>
181
+ <Tabs renderTabBar={renderTabBar} {...props}>
182
+ {orderTabs}
183
+ </Tabs>
184
+ </DndProvider>
185
+ );
186
+ };
187
+
188
+ const ItemMenu = (props) => {
189
+ const {
190
+ info: { key },
191
+ operateFun,
192
+ listenRouterState,
193
+ } = props;
194
+ let index = listenRouterState.findIndex((item) => item.key === key);
195
+
196
+ const menu = (
197
+ <Menu>
198
+ <Menu.Item key="0" style={{ fontSize: '12px', textAlign: 'center' }}>
199
+ <a
200
+ onClick={(e) => {
201
+ e.stopPropagation();
202
+ operateFun(key, 'self');
203
+ }}
204
+ >
205
+ 关闭当前标签
206
+ </a>
207
+ </Menu.Item>
208
+ <Menu.Item
209
+ disabled={index === 0}
210
+ key="1"
211
+ style={{ fontSize: '12px', textAlign: 'center' }}
212
+ >
213
+ <a
214
+ onClick={(e) => {
215
+ e.stopPropagation();
216
+ operateFun(key, 'left');
217
+ }}
218
+ >
219
+ 关闭其左侧标签
220
+ </a>
221
+ </Menu.Item>
222
+ <Menu.Item
223
+ disabled={index === listenRouterState.length - 1}
224
+ key="2"
225
+ style={{ fontSize: '12px', textAlign: 'center' }}
226
+ >
227
+ <a
228
+ onClick={(e) => {
229
+ e.stopPropagation();
230
+ operateFun(key, 'right');
231
+ }}
232
+ >
233
+ 关闭其右侧标签
234
+ </a>
235
+ </Menu.Item>
236
+ <Menu.Item
237
+ disabled={index === listenRouterState.length - 1}
238
+ key="3"
239
+ style={{ fontSize: '12px', textAlign: 'center' }}
240
+ >
241
+ <a
242
+ onClick={(e) => {
243
+ e.stopPropagation();
244
+ operateFun(key, 'other');
245
+ }}
246
+ >
247
+ 关闭其他标签
248
+ </a>
249
+ </Menu.Item>
250
+ <Menu.Item
251
+ disabled={index === listenRouterState.length - 1}
252
+ key="4"
253
+ style={{ fontSize: '12px', textAlign: 'center' }}
254
+ >
255
+ <a
256
+ onClick={(e) => {
257
+ e.stopPropagation();
258
+ operateFun(key, 'all');
259
+ }}
260
+ >
261
+ 关闭全部标签
262
+ </a>
263
+ </Menu.Item>
264
+ </Menu>
265
+ );
266
+ return (
267
+ <Dropdown overlay={menu} trigger={['hover']}>
268
+ <a
269
+ className="ant-dropdown-link"
270
+ onClick={(e) => {
271
+ e.preventDefault();
272
+ e.stopPropagation();
273
+ }}
274
+ >
275
+ <img style={{ marginRight: '-12px' }} src="./biaoqian-icon.svg" />
276
+ </a>
277
+ </Dropdown>
278
+ );
279
+ };
280
+
281
+ class BasicLayout extends React.PureComponent {
282
+ allFunc: any = createRef('');
283
+ customerMenuRef: any = createRef('');
284
+ actionRef: any = createRef<{
285
+ reload: () => void;
286
+ }>();
287
+ constructor(props) {
288
+ super(props);
289
+ routerArray = this.updateTree(props.route.routes);
290
+ const homeRouter = routerArray.filter(
291
+ (itemroute) => itemroute.key === '/',
292
+ )[0];
293
+ const breadcrumbNameMap = getBreadcrumbNameMap(
294
+ memoizeOneFormatter(props.route.routes, ''),
295
+ );
296
+ const hideMenuArray = ergodicMenuRoutes(props.route.routes);
297
+
298
+ this.state = {
299
+ listenRouterState: [
300
+ { ...homeRouter, key: '/', tab: '欢迎', closable: false },
301
+ ],
302
+ listenRouterKey: ['/'],
303
+ activeKey: '/',
304
+ homeRouter,
305
+ customerMatchs: [],
306
+ breadcrumbNameMap,
307
+ hideMenuArray,
308
+ keyWord: '',
309
+ collapse: false,
310
+ drawerLeftParams: {
311
+ visible: false,
312
+ width: 690,
313
+ title: '搜索',
314
+ onClose: () => {
315
+ this.setState({
316
+ drawerLeftParams: {
317
+ ...this.state.drawerLeftParams,
318
+ visible: false,
319
+ },
320
+ });
321
+ },
322
+ },
323
+ currentSubMenuData: [],
324
+ showSubMenu: false,
325
+ isSlider: false,
326
+ };
327
+ }
328
+
329
+ componentDidMount() {
330
+ const {
331
+ history,
332
+ location,
333
+ itemPath,
334
+ pathToRegexp,
335
+ } = this.props;
336
+
337
+ let istParent = 0;
338
+
339
+ var self = this;
340
+
341
+ window.top != window &&
342
+ window.addEventListener('message', function (e) {
343
+ istParent = 1;
344
+ if (localStorage.getItem(ENUM.BROWSER_CACHE.CHILD_APP_BACK)) {
345
+ localStorage.removeItem(ENUM.BROWSER_CACHE.CHILD_APP_BACK);
346
+ } else {
347
+ localStorage.setItem('isTabChange', true);
348
+ }
349
+
350
+ if (typeof e.data === 'string') {
351
+ let newKey = encodeUrlQuery(e.data.replace(/^\/\w+\//, '/'));
352
+ history.push(newKey);
353
+ } else {
354
+ const info = e.data;
355
+ if (info.type === 'remove') {
356
+ self.tabActions['remove'](info.key.replace(/^\/\w+\//, '/'));
357
+ }
358
+ }
359
+ });
360
+
361
+ UN_LISTTEN_DRP = history.listen((route) => {
362
+ if ((window as any).__POWERED_BY_QIANKUN__) {
363
+ if (window.location.href.indexOf(`/${itemPath}`) === -1) return;
364
+ }
365
+ const {
366
+ listenRouterState,
367
+ listenRouterKey,
368
+ customerMatchs,
369
+ hideMenuArray,
370
+ } = this.state;
371
+ let newListenRouterState = [...listenRouterState];
372
+ let newListenRouterKey = [...listenRouterKey];
373
+
374
+ let replaceRouter = routerArray.filter((itemRoute) =>
375
+ pathToRegexp(itemRoute.key || '').test(route.pathname),
376
+ )[0];
377
+
378
+ if (!istParent) {
379
+ if (route.pathname === '/') return;
380
+ window.parent.postMessage(`/parent/${itemPath}${route.pathname}`, '*');
381
+ }
382
+
383
+ let currentKey = '';
384
+
385
+ if (replaceRouter && replaceRouter.isOnlyOnePage) {
386
+ // 处理中英文和特殊字符
387
+ currentKey = decodeURIComponent(route.pathname);
388
+ } else {
389
+ currentKey = decodeURIComponent(
390
+ route.pathname + this.parseQueryString(route.search),
391
+ );
392
+ }
393
+
394
+ // 防止出错
395
+ if (listenRouterKey.length !== listenRouterState.length) {
396
+ listenRouterState.forEach((item, index) => {
397
+ listenRouterKey[index] = item.key;
398
+ });
399
+ }
400
+
401
+ if (!listenRouterKey.includes(currentKey)) {
402
+ if (!replaceRouter) {
403
+ replaceRouter = routerArray.filter(
404
+ (itemroute) => itemroute.key === '/404',
405
+ )?.[0];
406
+
407
+ this.setState(
408
+ {
409
+ listenRouterState: [
410
+ ...listenRouterState,
411
+ { ...replaceRouter, key: currentKey, tab: '404' },
412
+ ],
413
+ activeKey: currentKey,
414
+ listenRouterKey: [...listenRouterKey, currentKey],
415
+ },
416
+ () => {
417
+ this.checkisNavSlide();
418
+ },
419
+ );
420
+ } else {
421
+ const match = matchPath(route.pathname, { path: replaceRouter.key }, pathToRegexp);
422
+ newListenRouterState = [
423
+ ...newListenRouterState,
424
+ {
425
+ ...replaceRouter,
426
+ query: route.query,
427
+ match: match,
428
+ key: currentKey,
429
+ tab: this.getPageTitle(route.pathname) + '',
430
+ },
431
+ ];
432
+ newListenRouterKey = [...listenRouterKey, currentKey];
433
+ }
434
+ }
435
+
436
+ // 处理hideMenu页面自动关闭
437
+ lastTwoRouterArray.push(route.pathname);
438
+ lastTwoRouterArray.shift();
439
+ if (
440
+ !localStorage.getItem('isTabChange') &&
441
+ !localStorage.getItem('isMenuClick')
442
+ ) {
443
+ if (
444
+ lastTwoRouterArray[0] &&
445
+ typeof lastTwoRouterArray[0] === 'string'
446
+ ) {
447
+ let needRemoveKeyArray = hideMenuArray.filter((itemRoute) =>
448
+ pathToRegexp(itemRoute.path || '').test(lastTwoRouterArray[0]),
449
+ );
450
+ // lastTwoRouterArray[0] != lastTwoRouterArray[1] 该判断条件用于判断是否是tab删除操作,如果是tab页删除操作,删除的是不是最后一个打开的tab页,执行history.push会导致错误的将最后打开的那个tab页也删除掉
451
+ if (
452
+ needRemoveKeyArray.length &&
453
+ lastTwoRouterArray[0] != lastTwoRouterArray[1]
454
+ ) {
455
+ if (
456
+ (!(
457
+ lastTwoRouterArray[0].indexOf('/order/mainOrder/supplement') >=
458
+ 0
459
+ ) ||
460
+ !pathToRegexp(
461
+ '/order/mainOrder/:parmode/separateOrder/:id',
462
+ ).test(lastTwoRouterArray[1])) &&
463
+ (!pathToRegexp(
464
+ '/order/mainOrder/:parmode/separateOrder/:id',
465
+ ).test(lastTwoRouterArray[0]) ||
466
+ !(
467
+ lastTwoRouterArray[1].indexOf(
468
+ 'order/mainOrder/separateOrder/',
469
+ ) >= 0
470
+ ))
471
+ ) {
472
+ if (!route.state?.thisHideInMenuDoNotClose) {
473
+ newListenRouterState = newListenRouterState.filter((item) => {
474
+ const [pathname] = item.key ? item.key.split('?') : [];
475
+ return pathname && pathname !== lastTwoRouterArray[0];
476
+ });
477
+ newListenRouterKey = newListenRouterKey.filter((item) => {
478
+ const [pathname] = item ? item.split('?') : [];
479
+ return pathname && pathname !== lastTwoRouterArray[0];
480
+ });
481
+ }
482
+ }
483
+ }
484
+ }
485
+ // refs?.tableRef?.current?.refreshTable();
486
+ } else {
487
+ setTimeout(() => {
488
+ // 处理页面刷新两面
489
+ localStorage.removeItem('isTabChange');
490
+ localStorage.removeItem('isMenuClick');
491
+ }, 0);
492
+ }
493
+ this.setState(
494
+ {
495
+ //路由监听函数最后执行setState,避免处理hideMenu类型页面自动关闭的逻辑块内获取不到最新state的listenRouterState和listenRouterKey
496
+ activeKey: currentKey,
497
+ listenRouterState: newListenRouterState,
498
+ listenRouterKey: newListenRouterKey,
499
+ },
500
+ () => {
501
+ this.checkisNavSlide();
502
+ },
503
+ );
504
+
505
+ istParent = 0;
506
+ });
507
+
508
+ if (
509
+ localStorage.getItem('firstPage') &&
510
+ localStorage.getItem('firstPage')?.startsWith(`#/${itemPath}/`)
511
+ ) {
512
+ istParent = 1;
513
+ history.push(
514
+ localStorage
515
+ .getItem('firstPage')
516
+ ?.slice(1)
517
+ .replace(/^\/\w+\//, '/'),
518
+ );
519
+ } else {
520
+ history.push(location);
521
+ }
522
+ }
523
+
524
+ componentWillUnmount() {
525
+ // eslint-disable-next-line no-unused-expressions
526
+ UN_LISTTEN_DRP && UN_LISTTEN_DRP();
527
+ }
528
+
529
+ parseQueryString = (queryString) => {
530
+ if (!queryString) {
531
+ return '';
532
+ }
533
+
534
+ if (queryString.indexOf('?') < 0) {
535
+ return `?${queryString}`;
536
+ }
537
+
538
+ return queryString;
539
+ };
540
+
541
+ updateTree = (Tree) => {
542
+ const treeData = Tree;
543
+ const treeList = [];
544
+ // 递归获取树列表
545
+ const getTreeList = (data) => {
546
+ data.forEach((node) => {
547
+ if (node.routes && node.routes.length > 0) {
548
+ getTreeList(node.routes);
549
+ } else {
550
+ treeList.push({
551
+ tab: node.locale,
552
+ key: node.path,
553
+ locale: node.locale,
554
+ closable: true,
555
+ content: node.component,
556
+ name: node.name,
557
+ hideInMenu: node.hideInMenu,
558
+ isOnlyOnePage: node.isOnlyOnePage,
559
+ });
560
+ }
561
+ });
562
+ };
563
+ getTreeList(treeData);
564
+ return treeList;
565
+ };
566
+
567
+ getDictionarySource = (dicCode: string, needConvertInterger = false) => {
568
+ const { dictionaryData } = this.props;
569
+
570
+ let dicData = {};
571
+
572
+ if (!dictionaryData) {
573
+ let storageDic = localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES)
574
+ ? JSON.parse(localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES))
575
+ : {};
576
+ dicData = storageDic[dicCode];
577
+ } else {
578
+ dicData = dictionaryData[dicCode];
579
+ }
580
+ // if (!dicData || !dicData.length) {
581
+ // throw new Error(`当前没有${dicCode}字典值`);
582
+ // }
583
+
584
+ try {
585
+ if (needConvertInterger) {
586
+ dicData = dicData.map((item: { text: string; value: string }) => ({
587
+ ...item,
588
+ value: parseFloat(item.value),
589
+ }));
590
+ }
591
+ } catch (e) { }
592
+
593
+ return dicData;
594
+ };
595
+
596
+ getDictionaryTextByValue = (dicCode: string, value: string) => {
597
+ let dicData = [];
598
+ let dictionaryData: any;
599
+ if (!dictionaryData) {
600
+ let storageDic = localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES)
601
+ ? JSON.parse(localStorage.getItem(ENUM.BROWSER_CACHE.DICT_CODES))
602
+ : {};
603
+ dicData = storageDic[dicCode];
604
+ } else {
605
+ dicData = dictionaryData[dicCode];
606
+ }
607
+
608
+ if (!dicData || !dicData.length) {
609
+ // throw new Error(`当前没有${dicCode}字典值`);
610
+ }
611
+
612
+ if (value === undefined) return '- -';
613
+
614
+ const dicItemArray = dicData?.filter(
615
+ (item: { value: string }) => item.value === value.toString(),
616
+ );
617
+
618
+ if (!dicItemArray?.length) {
619
+ // throw new Error(`当前${dicCode}字典值合没有${value}的数据`)
620
+ return value;
621
+ }
622
+
623
+ return dicItemArray[0].text;
624
+ };
625
+
626
+ timeFormat = (timeStr, format, notNeedConvertTimeZone) => {
627
+ if (!timeStr) return '- -';
628
+
629
+ if (notNeedConvertTimeZone) {
630
+ return moment(timeStr).format(format);
631
+ }
632
+
633
+ return moment(timeStr).add(8, 'hours').format(format) || '- -';
634
+ };
635
+
636
+ onChange = (key) => {
637
+ // console.log('onChange');
638
+ if (key !== this.state.activeKey) {
639
+ this.setState({
640
+ activeKey: key,
641
+ });
642
+ localStorage.setItem('isTabChange', '1');
643
+ let newKey = encodeUrlQuery(key);
644
+ history.push(newKey);
645
+ }
646
+ };
647
+
648
+ getPageTitle = (pathname) => {
649
+ const { formatMessage } = this.props;
650
+ const { breadcrumbNameMap } = this.state;
651
+ const currRouterData = this.matchParamsPath(pathname, breadcrumbNameMap);
652
+
653
+ if (!currRouterData) {
654
+ return '';
655
+ }
656
+ const pageName = formatMessage({
657
+ id: currRouterData.locale || currRouterData.name,
658
+ defaultMessage: currRouterData.name,
659
+ });
660
+
661
+ return `${pageName}`;
662
+ };
663
+
664
+ matchParamsPath = (pathname, breadcrumbNameMap) => {
665
+ const { pathToRegexp } = this.props;
666
+ const pathKey = Object.keys(breadcrumbNameMap).find((key) =>
667
+ pathToRegexp(key).test(pathname),
668
+ );
669
+ return breadcrumbNameMap[pathKey];
670
+ };
671
+
672
+ onEdit = (
673
+ targetKey: React.MouseEvent | React.KeyboardEvent | string,
674
+ action: string,
675
+ ) => {
676
+ this.tabActions[action](targetKey);
677
+ };
678
+
679
+ tabActions: any = {
680
+ remove: (targetKey: string) => {
681
+ const { listenRouterState, activeKey, customerMatchs, listenRouterKey } =
682
+ this.state;
683
+
684
+ let lastIndex: number = 0;
685
+ let newActiveKey: string | undefined = activeKey;
686
+ let newListenRouterState = [];
687
+ let newListenRouterKey = [];
688
+
689
+ if (targetKey === activeKey) {
690
+ listenRouterState.forEach((pane, i) => {
691
+ if (pane.key === targetKey) {
692
+ lastIndex = i - 1;
693
+ }
694
+ });
695
+
696
+ newListenRouterState = listenRouterState.filter(
697
+ (item) => item.key !== targetKey,
698
+ );
699
+ newListenRouterKey = listenRouterKey.filter(
700
+ (item) => item !== targetKey,
701
+ );
702
+
703
+ if (lastIndex < 0) {
704
+ lastIndex = 0;
705
+ }
706
+
707
+ newActiveKey = newListenRouterState[lastIndex].key;
708
+ } else {
709
+ newListenRouterState = listenRouterState.filter(
710
+ (item) => item.key !== targetKey,
711
+ );
712
+ newListenRouterKey = listenRouterKey.filter(
713
+ (item) => item !== targetKey,
714
+ );
715
+ }
716
+
717
+ this.setState(
718
+ {
719
+ activeKey: newActiveKey,
720
+ listenRouterState: newListenRouterState,
721
+ listenRouterKey: newListenRouterKey,
722
+ },
723
+ () => {
724
+ let newKey = encodeUrlQuery(newActiveKey);
725
+ history.push({
726
+ pathname: newKey,
727
+ });
728
+ this.checkisNavSlide();
729
+ },
730
+ );
731
+ },
732
+ };
733
+
734
+ updateState = (newListenRouterState, newListenRouterKey, cb) => {
735
+ this.setState(
736
+ {
737
+ listenRouterState: newListenRouterState,
738
+ listenRouterKey: newListenRouterKey,
739
+ },
740
+ () => {
741
+ this.checkisNavSlide();
742
+ if (cb) cb();
743
+ },
744
+ );
745
+ };
746
+
747
+ handleClose = () => {
748
+ this.setState({
749
+ drawerLeftParams: {
750
+ ...this.state.drawerLeftParams,
751
+ visible: false,
752
+ },
753
+ isCollapse: true,
754
+ });
755
+ this.allFunc.current?.close?.();
756
+ this.customerMenuRef.current?.close?.();
757
+ };
758
+
759
+ handleMenuClick = (item: any) => {
760
+ if (item.children || !item.component) return;
761
+ let newKey = encodeUrlQuery(item.path);
762
+ history.push({
763
+ pathname: newKey,
764
+ });
765
+ this.setShowMenu(false);
766
+ };
767
+
768
+ getMenuDom = (menuData) => {
769
+ return menuData.map((item) => (
770
+ <div>
771
+ <div
772
+ onClick={() => {
773
+ this.handleMenuClick(item);
774
+ }}
775
+ className={`${'menu_item'} ${item.children || !item.component ? '' : 'link_style'
776
+ }`}
777
+ style={{
778
+ fontWeight: item.children || !item.component ? 'bolder' : '400',
779
+ paddingLeft: '10px',
780
+ marginTop: item.children || !item.component ? '5px' : '0px',
781
+ fontSize: item.children || !item.component ? '14px' : '12px',
782
+ }}
783
+ >
784
+ {item.name}
785
+ </div>
786
+ {!!item.children &&
787
+ !!item.children.length &&
788
+ this.getMenuDom(item.children)}
789
+ </div>
790
+ ));
791
+ };
792
+
793
+ setShowMenu = debounce((isShow) => {
794
+ this.setState({
795
+ showSubMenu: isShow,
796
+ });
797
+ }, 500);
798
+
799
+ //设置tabs标签左右滚动
800
+ setTabNavTransLate = (num) => {
801
+ let globalTabsNav = document
802
+ .getElementById('globalTabs')
803
+ ?.getElementsByClassName('ant-tabs-nav-list')?.[0];
804
+ let globalTabsNavWrap = document
805
+ .getElementById('globalTabs')
806
+ ?.getElementsByClassName('ant-tabs-nav-wrap')?.[0];
807
+ let wrapWidth = globalTabsNavWrap.offsetWidth; //tabsNav父节点宽度
808
+ let navListWidth = globalTabsNav.offsetWidth; //tabsNav总宽度
809
+ if (navListWidth - wrapWidth <= 0) return;
810
+ let maxTransX = navListWidth - wrapWidth; // 允许移动最大宽度
811
+ let transXStr = document.defaultView?.getComputedStyle(
812
+ globalTabsNav,
813
+ null,
814
+ ).transform;
815
+ let transx = transXStr?.split(',')[4]; //当前translateX的值
816
+
817
+ let targetTransX = Math.abs(Number(transx)) + num;
818
+ if (targetTransX <= 0) targetTransX = 0;
819
+ if (targetTransX >= Number(maxTransX)) targetTransX = Number(maxTransX);
820
+ globalTabsNav.style.transform = 'translateX(-' + targetTransX + 'px)';
821
+ };
822
+
823
+ checkisNavSlide = () => {
824
+ if (window.top != window) return;
825
+ //监听tabs页签总长度判断是否可点击滑动
826
+ let globalTabsNav = document
827
+ .getElementById('globalTabs')
828
+ ?.getElementsByClassName('ant-tabs-nav-list')?.[0];
829
+ let globalTabsNavWrap = document
830
+ .getElementById('globalTabs')
831
+ ?.getElementsByClassName('ant-tabs-nav-wrap')?.[0];
832
+ let wrapWidth = globalTabsNavWrap?.offsetWidth; //tabsNav父节点宽度
833
+ let navListWidth = globalTabsNav?.offsetWidth; //tabsNav总宽度
834
+ if (navListWidth - wrapWidth <= 0) {
835
+ this.setState({
836
+ isSlider: false,
837
+ });
838
+ return;
839
+ }
840
+ this.setState({
841
+ isSlider: true,
842
+ });
843
+ };
844
+
845
+ changeListenRouterState = (dragIndex: number, hoverIndex: number) => {
846
+ const { listenRouterState, listenRouterKey } = this.state;
847
+ let dragItem = listenRouterState[dragIndex];
848
+ let dragKeyItem = listenRouterKey[dragIndex];
849
+
850
+ listenRouterState.splice(dragIndex, 1);
851
+ listenRouterState.splice(hoverIndex, 0, dragItem);
852
+
853
+ listenRouterKey.splice(dragIndex, 1);
854
+ listenRouterKey.splice(hoverIndex, 0, dragKeyItem);
855
+ };
856
+
857
+ operateFun = (key, type) => {
858
+ const { listenRouterState, activeKey, listenRouterKey } = this.state;
859
+ let deleteKey = '';
860
+ let newlistenRouterState = [];
861
+ let newlistenRouterKey = [];
862
+ let newActiveKey = '';
863
+ let deleteIndex = 0;
864
+ if (type === 'self') {
865
+ deleteIndex = listenRouterState.findIndex((item) => item.key === key);
866
+ deleteKey = key;
867
+ if (deleteIndex > 0) {
868
+ newActiveKey = listenRouterState[deleteIndex - 1].key;
869
+ } else {
870
+ newActiveKey = listenRouterState[1].key;
871
+ }
872
+ newlistenRouterState = listenRouterState.filter((d) => d.key !== key);
873
+ newlistenRouterKey = listenRouterKey.filter((d) => d !== key);
874
+ this.updateState(newlistenRouterState, newlistenRouterKey, () => {
875
+ if (deleteKey === activeKey) {
876
+ let newKey = encodeUrlQuery(newActiveKey);
877
+ history.push({
878
+ pathname: newKey,
879
+ });
880
+ }
881
+ });
882
+ }
883
+ if (type === 'left') {
884
+ const index = listenRouterState.findIndex((item) => item.key === key);
885
+ newlistenRouterState = listenRouterState.filter(
886
+ (d: any, i: number) => i >= index || d.key === '/',
887
+ );
888
+ newlistenRouterKey = listenRouterKey.filter(
889
+ (d: any, i: number) => i >= index || d === '/',
890
+ );
891
+ this.updateState(newlistenRouterState, newlistenRouterKey, () => {
892
+ if (newlistenRouterKey.find((item) => item === activeKey)) {
893
+ return;
894
+ } else {
895
+ let newKey = encodeUrlQuery(key);
896
+ history.push({
897
+ pathname: newKey,
898
+ });
899
+ }
900
+ });
901
+ }
902
+ if (type === 'right') {
903
+ const index = listenRouterState.findIndex((item) => item.key === key);
904
+ newlistenRouterState = listenRouterState.filter(
905
+ (d: any, i: number) => i <= index || d.key === '/',
906
+ );
907
+ newlistenRouterKey = listenRouterKey.filter(
908
+ (d: any, i: number) => i <= index || d === '/',
909
+ );
910
+ this.updateState(
911
+ listenRouterState.filter(
912
+ (d: any, i: number) => i <= index || d.key === '/',
913
+ ),
914
+ listenRouterKey.filter((d: any, i: number) => i <= index || d === '/'),
915
+ () => {
916
+ if (newlistenRouterKey.find((item) => item === activeKey)) {
917
+ return;
918
+ } else {
919
+ let newKey = encodeUrlQuery(key);
920
+ history.push({
921
+ pathname: newKey,
922
+ });
923
+ }
924
+ },
925
+ );
926
+ }
927
+ if (type === 'all') {
928
+ this.updateState(
929
+ listenRouterState.filter((item) => item.key === '/'),
930
+ listenRouterKey.filter((item) => item === '/'),
931
+ () => {
932
+ history.push({
933
+ pathname: '/',
934
+ });
935
+ },
936
+ );
937
+ }
938
+ if (type === 'other') {
939
+ this.updateState(
940
+ listenRouterState.filter(
941
+ (item) => item.key === key || item.key === '/',
942
+ ),
943
+ listenRouterKey.filter((item) => item === key || item === '/'),
944
+ () => {
945
+ if (key !== activeKey) {
946
+ let newKey = encodeUrlQuery(key);
947
+ history.push({
948
+ pathname: newKey,
949
+ });
950
+ }
951
+ },
952
+ );
953
+ }
954
+ };
955
+
956
+ render() {
957
+ const {
958
+ listenRouterState,
959
+ activeKey,
960
+ listenRouterKey,
961
+ drawerLeftParams,
962
+ collapse,
963
+ currentSubMenuData,
964
+ showSubMenu,
965
+ currentSubPath,
966
+ } = this.state;
967
+ const { originRoutes, itemPath, defaultSettings, transparentProps={} } = this.props;
968
+ const TabTitle: React.FC<{}> = ({ item, index, updateState }) => {
969
+ return (
970
+ <div className="tab_title_content">
971
+ {item.tab}
972
+ {item.key !== '/' && (
973
+ <ItemMenu
974
+ info={item}
975
+ operateFun={this.operateFun}
976
+ listenRouterState={listenRouterState}
977
+ />
978
+ )}
979
+ </div>
980
+ );
981
+ };
982
+
983
+ // 左侧菜单 route
984
+ const dataShowRoute = this.props.routes.find(
985
+ (route) => route.path === '/homePage/data-show',
986
+ ); // 添加数据大屏
987
+ const { route, ...restPrpos } = this.props;
988
+ const exist = route.routes.find(
989
+ (route) => route.path === '/homePage/data-show',
990
+ );
991
+ if (dataShowRoute && !exist) {
992
+ route.routes.splice(1, 0, dataShowRoute);
993
+ }
994
+
995
+ const menu = (
996
+ <Menu>
997
+ <Menu.Item
998
+ key="0"
999
+ style={{
1000
+ background: '#FFFFFF',
1001
+ color: '#848484',
1002
+ fontSize: '12px',
1003
+ textAlign: 'center',
1004
+ }}
1005
+ >
1006
+ <div>已打开的页签数: {listenRouterState.length}</div>
1007
+ </Menu.Item>
1008
+ <Menu.Item key="1" style={{ fontSize: '12px', textAlign: 'center' }}>
1009
+ <a
1010
+ onClick={() => {
1011
+ // 关闭全部
1012
+ this.updateState(
1013
+ [
1014
+ {
1015
+ ...this.state.homeRouter,
1016
+ key: '/',
1017
+ tab: '欢迎',
1018
+ closable: false,
1019
+ },
1020
+ ],
1021
+ ['/'],
1022
+ () => {
1023
+ history.push('/');
1024
+ },
1025
+ );
1026
+ }}
1027
+ >
1028
+ 关闭全部标签
1029
+ </a>
1030
+ </Menu.Item>
1031
+ <Menu.Item key="2" style={{ fontSize: '12px', textAlign: 'center' }}>
1032
+ <a
1033
+ onClick={() => {
1034
+ if (activeKey === '/') return;
1035
+ const index = listenRouterState.findIndex(
1036
+ (item) => item.key === activeKey,
1037
+ );
1038
+ let newActiveKey = '';
1039
+ if (index > 0) {
1040
+ newActiveKey = listenRouterState[index - 1].key;
1041
+ } else {
1042
+ newActiveKey = listenRouterState[1].key;
1043
+ }
1044
+ this.updateState(
1045
+ listenRouterState.filter((d) => d.key !== activeKey),
1046
+ listenRouterKey.filter((d) => d !== activeKey),
1047
+ () => {
1048
+ let newKey = encodeUrlQuery(newActiveKey);
1049
+ history.push({
1050
+ pathname: newKey,
1051
+ });
1052
+ },
1053
+ );
1054
+ }}
1055
+ >
1056
+ 关闭当前标签
1057
+ </a>
1058
+ </Menu.Item>
1059
+ <Menu.Item key="3" style={{ fontSize: '12px', textAlign: 'center' }}>
1060
+ <a
1061
+ onClick={() => {
1062
+ const index = listenRouterState.findIndex(
1063
+ (item) => item.key === activeKey,
1064
+ );
1065
+ // let deleteKey = listenRouterState[index - 1]?.key;
1066
+ // if (deleteKey === '/') {
1067
+ // message.warning('首页不可关闭。');
1068
+ // return;
1069
+ // }
1070
+
1071
+ this.updateState(
1072
+ listenRouterState.filter(
1073
+ (d: any, i: number) => i >= index || d.key === '/',
1074
+ ),
1075
+ listenRouterKey.filter(
1076
+ (d: any, i: number) => i >= index || d === '/',
1077
+ ),
1078
+ );
1079
+ }}
1080
+ >
1081
+ 关闭其左侧标签
1082
+ </a>
1083
+ </Menu.Item>
1084
+ <Menu.Item key="4" style={{ fontSize: '12px', textAlign: 'center' }}>
1085
+ <a
1086
+ onClick={() => {
1087
+ let index = listenRouterState.findIndex(
1088
+ (item) => item.key === activeKey,
1089
+ );
1090
+ this.updateState(
1091
+ listenRouterState.filter(
1092
+ (d: any, i: number) => i <= index || d.key === '/',
1093
+ ),
1094
+ listenRouterKey.filter(
1095
+ (d: any, i: number) => i <= index || d === '/',
1096
+ ),
1097
+ );
1098
+ }}
1099
+ >
1100
+ 关闭其右侧标签
1101
+ </a>
1102
+ </Menu.Item>
1103
+ </Menu>
1104
+ );
1105
+
1106
+ const filterByMenuDate = (
1107
+ data: MenuDataItem[],
1108
+ keyWord: string,
1109
+ ): MenuDataItem[] =>
1110
+ data
1111
+ .map((item) => {
1112
+ if (item.name && item.name.includes(keyWord)) {
1113
+ return {
1114
+ ...item,
1115
+ };
1116
+ }
1117
+ return undefined;
1118
+ })
1119
+ .filter((item) => item) as MenuDataItem[];
1120
+
1121
+ let weiqianduanProps = {};
1122
+ let isWeiqianduan = false;
1123
+
1124
+ if (window.top != window) {
1125
+ isWeiqianduan = true;
1126
+ weiqianduanProps = {
1127
+ headerRender: false,
1128
+ footerRender: false,
1129
+ menuRender: false,
1130
+ menuHeaderRender: false,
1131
+ menuExtraRender: false,
1132
+ };
1133
+ }
1134
+
1135
+ const OperationsSlot: Record<PositionType, React.ReactNode> = {
1136
+ left: (
1137
+ <div className={'tab_left_operate'}>
1138
+ <div
1139
+ onClick={() => {
1140
+ history.push({
1141
+ pathname: '/',
1142
+ });
1143
+ }}
1144
+ >
1145
+ <HomeOutlined />
1146
+ </div>
1147
+ <div
1148
+ style={{ opacity: this.state.isSlider ? 1 : 0.5 }}
1149
+ onClick={() => {
1150
+ this.setTabNavTransLate(-100);
1151
+ }}
1152
+ >
1153
+ <DoubleLeftOutlined />
1154
+ </div>
1155
+ </div>
1156
+ ),
1157
+ right: (
1158
+ <div
1159
+ style={{ opacity: this.state.isSlider ? 1 : 0.5 }}
1160
+ className={'tab_right_operate'}
1161
+ onClick={() => {
1162
+ this.setTabNavTransLate(100);
1163
+ }}
1164
+ >
1165
+ <DoubleRightOutlined />
1166
+ </div>
1167
+ ),
1168
+ };
1169
+
1170
+ return (
1171
+ <ProLayout
1172
+ actionRef={this.actionRef}
1173
+ onMenuHeaderClick={() => history.push('/')}
1174
+ menuHeaderRender={({ }) => (
1175
+ <CustomerMenuHeader
1176
+ originRoutes={originRoutes}
1177
+ itemPath={itemPath}
1178
+ handleClose={this.handleClose}
1179
+ collapsed={collapse}
1180
+ />
1181
+ )}
1182
+ menuExtraRender={() => {
1183
+ if (!collapse) {
1184
+ return (
1185
+ <div>
1186
+ <CustomerMenu
1187
+ originRoutes={originRoutes}
1188
+ itemPath={itemPath}
1189
+ ref={this.customerMenuRef}
1190
+ actionRef={this.actionRef}
1191
+ handleClose={this.handleClose}
1192
+ isCollapse={this.state.collapse}
1193
+ />
1194
+ </div>
1195
+ );
1196
+ }
1197
+ return (
1198
+ <div className="collapse_icon_close">
1199
+ <span
1200
+ className="collapse_icon"
1201
+ onClick={() => {
1202
+ this.setState({
1203
+ collapse: !collapse,
1204
+ });
1205
+ }}
1206
+ >
1207
+ <MenuUnfoldOutlined />
1208
+ </span>
1209
+ </div>
1210
+ );
1211
+ }}
1212
+ menuProps={{
1213
+ onClick: () => {
1214
+ localStorage.setItem('isMenuClick', 'true');
1215
+ },
1216
+ }}
1217
+ collapsed={collapse}
1218
+ onCollapse={(boo: boolean) => {
1219
+ this.setState({
1220
+ collapse: boo,
1221
+ });
1222
+ }}
1223
+ menuItemRender={(menuItemProps, defaultDom) => {
1224
+ if (menuItemProps?.path === '/') {
1225
+ return (
1226
+ <>
1227
+ <div className="one_menu_wrap">
1228
+ <Link
1229
+ onClick={() => {
1230
+ localStorage.setItem('isMenuClick', 'true');
1231
+ }}
1232
+ to={menuItemProps.path}
1233
+ >
1234
+ {defaultDom}
1235
+ </Link>
1236
+ </div>
1237
+ </>
1238
+ );
1239
+ }
1240
+ return (
1241
+ <Link
1242
+ onClick={() => {
1243
+ localStorage.setItem('isMenuClick', 'true');
1244
+ }}
1245
+ to={menuItemProps.path}
1246
+ >
1247
+ {defaultDom}
1248
+ </Link>
1249
+ );
1250
+ }}
1251
+ subMenuItemRender={(menuItemProps, defaultDom) => {
1252
+ return (
1253
+ <div
1254
+ style={{
1255
+ height: '40px',
1256
+ lineHeight: '40px',
1257
+ position: 'relative',
1258
+ overflow: 'hidden',
1259
+ textOverflow: 'ellipsis',
1260
+ whiteSpace: 'nowrap',
1261
+ boxSizing: 'border-box',
1262
+ paddingRight: '10px',
1263
+ }}
1264
+ onMouseEnter={() => {
1265
+ if (
1266
+ menuItemProps.pro_layout_parentKeys &&
1267
+ menuItemProps.pro_layout_parentKeys.length
1268
+ )
1269
+ return;
1270
+ this.setState({
1271
+ currentSubMenuData: menuItemProps.children,
1272
+ currentSubPath: menuItemProps.path,
1273
+ });
1274
+ this.setShowMenu(true);
1275
+ }}
1276
+ onMouseLeave={() => {
1277
+ this.setShowMenu(false);
1278
+ }}
1279
+ >
1280
+ {defaultDom}
1281
+ {showSubMenu &&
1282
+ currentSubPath === menuItemProps.path &&
1283
+ !collapse && (
1284
+ <CaretLeftOutlined
1285
+ style={{ position: 'absolute', top: '14px', right: '-4px' }}
1286
+ />
1287
+ )}
1288
+ </div>
1289
+ );
1290
+ }}
1291
+ collapsedButtonRender={() => {
1292
+ return (
1293
+ <div
1294
+ onClick={(e) => {
1295
+ e.stopPropagation();
1296
+ }}
1297
+ className="banquan"
1298
+ >
1299
+ {''}
1300
+ </div>
1301
+ );
1302
+ }}
1303
+ postMenuData={(menus) => {
1304
+ return [...filterByMenuDate(menus || [], this.state.keyWord)];
1305
+ }}
1306
+ links={[
1307
+ !this.state.collapse ? (
1308
+ <AllFunc
1309
+ ref={this.allFunc}
1310
+ itemPath={itemPath}
1311
+ handleClose={this.handleClose}
1312
+ isCollapse={this.state.collapse}
1313
+ />
1314
+ ) : (
1315
+ ''
1316
+ ),
1317
+ ]}
1318
+ onPageChange={() => {
1319
+ const { location } = history;
1320
+ // 如果没有登录,重定向到 login
1321
+ if (
1322
+ !localStorage.getItem(ENUM.BROWSER_CACHE.USER_INFO) &&
1323
+ location.pathname !== '/user/login'
1324
+ ) {
1325
+ history.push('/user/login');
1326
+ }
1327
+ }}
1328
+ headerRender={(props) => <GlobalHeaderCom {...props} />}
1329
+ menu={{
1330
+ request: async () => {
1331
+ return JSON.parse(
1332
+ localStorage.getItem(`customerMenu_${itemPath}_front`) || '[]',
1333
+ );
1334
+ },
1335
+ type: 'group',
1336
+ }}
1337
+ route={route}
1338
+ {...restPrpos}
1339
+ {...defaultSettings}
1340
+ {...weiqianduanProps}
1341
+ >
1342
+ <div id="globalTabsContent" className="globalTabs">
1343
+ <DraggableTabs
1344
+ activeKey={activeKey}
1345
+ id="globalTabs"
1346
+ onChange={this.onChange}
1347
+ // tabBarExtraContent={operations}
1348
+ type="editable-card"
1349
+ tabBarStyle={{
1350
+ background: '#f3f3f3',
1351
+ height: '28px',
1352
+ marginRight: 0,
1353
+ fontSize: '12px',
1354
+ color: '#2C2F2E70',
1355
+ marginBottom: '-2px',
1356
+ position: 'fixed',
1357
+ top: 50,
1358
+ zIndex: 10,
1359
+ width: collapse ? 'calc(100% - 75px)' : 'calc(100% - 167px)',
1360
+ display: isWeiqianduan ? 'none' : 'flex',
1361
+ }}
1362
+ tabPosition="top"
1363
+ tabBarGutter={8}
1364
+ onEdit={this.onEdit}
1365
+ tabBarExtraContent={OperationsSlot}
1366
+ animated={false}
1367
+ hideAdd
1368
+ >
1369
+ {listenRouterState.map((item, index) => (
1370
+ <TabPane
1371
+ tab={
1372
+ <TabTitle
1373
+ item={item}
1374
+ index={index}
1375
+ updateState={this.updateState}
1376
+ />
1377
+ }
1378
+ style={{ marginTop: isWeiqianduan ? 0 : 30 }}
1379
+ key={item.key}
1380
+ closable={item.key !== '/'}
1381
+ closeIcon={<img src="./biaoqian-guanbi-icon.svg" />}
1382
+ >
1383
+ <WrapperComponent
1384
+ item={item}
1385
+ routerProps={this.props}
1386
+ getDictionarySource={this.getDictionarySource}
1387
+ getDictionaryTextByValue={this.getDictionaryTextByValue}
1388
+ timeFormat={this.timeFormat}
1389
+ transparentProps={transparentProps}
1390
+ />
1391
+ </TabPane>
1392
+ ))}
1393
+ </DraggableTabs>
1394
+ <div
1395
+ className="globalTabsOper"
1396
+ style={{
1397
+ position: 'fixed',
1398
+ top: '50px',
1399
+ zIndex: 10,
1400
+ background: '#fff',
1401
+ display: isWeiqianduan ? 'none' : 'block',
1402
+ borderLeft: '1px solid #E4E4E4',
1403
+ }}
1404
+ >
1405
+ <Dropdown overlay={menu} trigger={['click']}>
1406
+ <a
1407
+ className="ant-dropdown-link"
1408
+ onClick={(e) => e.preventDefault()}
1409
+ >
1410
+ <DashOutlined />
1411
+ </a>
1412
+ </Dropdown>
1413
+ </div>
1414
+ <SearchFunc itemPath={itemPath} {...drawerLeftParams}></SearchFunc>
1415
+ <div
1416
+ onMouseEnter={() => {
1417
+ this.setShowMenu(true);
1418
+ }}
1419
+ onMouseLeave={() => {
1420
+ this.setShowMenu(false);
1421
+ }}
1422
+ className={'sub_menu_content'}
1423
+ style={{ display: showSubMenu && !collapse ? 'block' : 'none' }}
1424
+ >
1425
+ {this.getMenuDom(currentSubMenuData)}
1426
+ </div>
1427
+ </div>
1428
+ </ProLayout>
1429
+ );
1430
+ }
1431
+ }
1432
+
1433
+ class WrapperComponent extends React.Component {
1434
+ constructor(props) {
1435
+ super(props);
1436
+ }
1437
+
1438
+ shouldComponentUpdate() {
1439
+ return false;
1440
+ }
1441
+
1442
+ render() {
1443
+ const {
1444
+ item,
1445
+ routerProps,
1446
+ getDictionarySource,
1447
+ getDictionaryTextByValue,
1448
+ timeFormat,
1449
+ transparentProps,
1450
+ } = this.props;
1451
+ return (
1452
+ <>
1453
+ {React.createElement(item.content, {
1454
+ getDictionarySource: getDictionarySource,
1455
+ getDictionaryTextByValue: getDictionaryTextByValue,
1456
+ timeFormat: timeFormat,
1457
+ ...routerProps,
1458
+ ...transparentProps,
1459
+ match: item.match,
1460
+ })}
1461
+ </>
1462
+ );
1463
+ }
1464
+ }
1465
+
1466
+ export default (props) => {
1467
+ const { initialState = {} } = useModel('@@initialState');
1468
+
1469
+ const { dictionaryData } = initialState;
1470
+ const intl = useIntl();
1471
+ const { formatMessage } = intl;
1472
+ return (
1473
+ <BasicLayout
1474
+ {...props}
1475
+ dictionaryData={dictionaryData}
1476
+ formatMessage={formatMessage}
1477
+ />
1478
+ );
1479
+ };