cfel-base-components 2.5.47 → 2.5.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/src/index.jsx +41 -80
- package/package.json +1 -1
- package/src/.umi/core/helmet.ts +1 -1
- package/src/components/layout/index.scss +387 -211
- package/src/components/layout/index.tsx +237 -103
- package/src/components/{layout → layout-console}/index-console.scss +208 -84
- package/src/components/layout-console/index.tsx +712 -0
- package/src/components/layout-console/user-card/index.scss +180 -0
- package/src/components/layout-console/user-card/index.tsx +162 -0
- package/src/global.d.ts +2 -0
- package/src/index.tsx +25 -27
- package/.vscode/settings.json +0 -3
|
@@ -4,6 +4,12 @@ import UserCard from './user-card'
|
|
|
4
4
|
import RcMenu, { SubMenu, MenuItem } from 'rc-menu'
|
|
5
5
|
import { CloseCircleOutlined } from '@ant-design/icons'
|
|
6
6
|
const { Sider } = Layout
|
|
7
|
+
import './index.scss'
|
|
8
|
+
|
|
9
|
+
interface TreeNode {
|
|
10
|
+
key: string
|
|
11
|
+
children?: TreeNode[]
|
|
12
|
+
}
|
|
7
13
|
|
|
8
14
|
export interface LiosLayoutlProps {
|
|
9
15
|
appName?: any
|
|
@@ -35,6 +41,8 @@ export interface LiosLayoutlProps {
|
|
|
35
41
|
isHideHeader?: boolean //是否隐藏header
|
|
36
42
|
onCollapse?: (value: boolean) => void
|
|
37
43
|
type?: string
|
|
44
|
+
|
|
45
|
+
umiHistory: any
|
|
38
46
|
}
|
|
39
47
|
|
|
40
48
|
export default function LiosLayout(props: LiosLayoutlProps) {
|
|
@@ -56,17 +64,35 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
56
64
|
isHideHeader,
|
|
57
65
|
onCollapse,
|
|
58
66
|
type,
|
|
67
|
+
umiHistory
|
|
59
68
|
} = props
|
|
60
69
|
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
const findKeyPath = (pathname: string) => {
|
|
71
|
+
const path: string[] = []
|
|
72
|
+
const findPath = (nodes: TreeNode[], target: string): boolean => {
|
|
73
|
+
for (const node of nodes) {
|
|
74
|
+
if (node.key === target) {
|
|
75
|
+
path.unshift(node.key)
|
|
76
|
+
return true
|
|
77
|
+
}
|
|
78
|
+
if (node.children && findPath(node.children, target)) {
|
|
79
|
+
path.unshift(node.key)
|
|
80
|
+
return true
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return false
|
|
68
84
|
}
|
|
69
|
-
|
|
85
|
+
|
|
86
|
+
findPath(menuList, pathname)
|
|
87
|
+
return path
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 初始化选中菜单
|
|
91
|
+
const [selectKey, setSelectKey] = useState<any>(
|
|
92
|
+
findKeyPath('/' + location.pathname.split('/')[2])
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
const [infoOpen, setInfoOpen] = useState<string | null>(null)
|
|
70
96
|
|
|
71
97
|
const logoUrl =
|
|
72
98
|
type === 'console'
|
|
@@ -81,13 +107,10 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
81
107
|
const { user, logo, subLogo, productCode } = (window as any)?.g_config
|
|
82
108
|
const { name, avatar } = user || {}
|
|
83
109
|
|
|
110
|
+
// 初始化展开菜单
|
|
84
111
|
const [openKeys, setOpenKeys] = useState<any>(defaultOpenKeys || [])
|
|
85
112
|
|
|
86
113
|
//处理搜索菜单后自动展开目录
|
|
87
|
-
interface TreeNode {
|
|
88
|
-
key: string
|
|
89
|
-
children?: TreeNode[]
|
|
90
|
-
}
|
|
91
114
|
const findParentMenu = (menuList: any[], pathname: string) => {
|
|
92
115
|
const result: TreeNode[] = []
|
|
93
116
|
|
|
@@ -112,22 +135,23 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
112
135
|
//在这里找到当前菜单的上层目录
|
|
113
136
|
const paMenu = findParentMenu(menuList, '/' + location.pathname.split('/')[2])
|
|
114
137
|
//去重
|
|
115
|
-
const set = new Set(paMenu.map(
|
|
138
|
+
const set = new Set(paMenu.map(item => item.key))
|
|
116
139
|
openKeys.forEach((element: string) => {
|
|
117
140
|
set.add(element)
|
|
118
141
|
})
|
|
119
142
|
setOpenKeys(Array.from(set))
|
|
120
143
|
}, [location.pathname])
|
|
121
144
|
|
|
145
|
+
// 初始化折叠状态
|
|
122
146
|
const [collapsed, setCollapsed] = useState(localStorage.getItem('layout_collapsed') === 'true')
|
|
123
147
|
const [isCopied, setIsCopied] = useState({
|
|
124
148
|
account: false,
|
|
125
149
|
id: false,
|
|
126
150
|
tenantName: false,
|
|
127
|
-
tenantId: false
|
|
151
|
+
tenantId: false
|
|
128
152
|
})
|
|
129
153
|
|
|
130
|
-
const onOpenChange: MenuProps['onOpenChange'] =
|
|
154
|
+
const onOpenChange: MenuProps['onOpenChange'] = keys => {
|
|
131
155
|
setOpenKeys(keys)
|
|
132
156
|
}
|
|
133
157
|
|
|
@@ -138,9 +162,10 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
138
162
|
} catch (err) {}
|
|
139
163
|
}
|
|
140
164
|
|
|
165
|
+
// 菜单动画
|
|
141
166
|
const collapseNode = () => {
|
|
142
167
|
return {
|
|
143
|
-
height: 0
|
|
168
|
+
height: 0
|
|
144
169
|
}
|
|
145
170
|
}
|
|
146
171
|
const expandNode = (node: any) => {
|
|
@@ -154,26 +179,26 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
154
179
|
onEnterStart: collapseNode,
|
|
155
180
|
onEnterActive: expandNode,
|
|
156
181
|
onLeaveStart: expandNode,
|
|
157
|
-
onLeaveActive: collapseNode
|
|
182
|
+
onLeaveActive: collapseNode
|
|
158
183
|
}
|
|
159
184
|
|
|
160
185
|
const verticalMotion = {
|
|
161
186
|
motionName: 'rc-menu-open-zoom',
|
|
162
187
|
motionAppear: true,
|
|
163
188
|
motionEnter: true,
|
|
164
|
-
motionLeave: true
|
|
189
|
+
motionLeave: true
|
|
165
190
|
}
|
|
166
191
|
|
|
167
192
|
return (
|
|
168
|
-
<Layout className=
|
|
193
|
+
<Layout className='layout-warps'>
|
|
169
194
|
{Array.isArray(menuList) && menuList.length > 0 && (
|
|
170
195
|
<Sider
|
|
171
|
-
className=
|
|
196
|
+
className='layout-side'
|
|
172
197
|
collapsible
|
|
173
198
|
trigger={null}
|
|
174
199
|
collapsed={collapsed}
|
|
175
200
|
width={260}
|
|
176
|
-
onCollapse={
|
|
201
|
+
onCollapse={value => {
|
|
177
202
|
if (onCollapse) {
|
|
178
203
|
onCollapse(value)
|
|
179
204
|
}
|
|
@@ -181,9 +206,12 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
181
206
|
setCollapsed(value)
|
|
182
207
|
}}
|
|
183
208
|
>
|
|
184
|
-
<div className=
|
|
209
|
+
<div className='layout-side-mask1'></div>
|
|
185
210
|
|
|
186
|
-
<div
|
|
211
|
+
<div
|
|
212
|
+
className='header-logo'
|
|
213
|
+
style={{ justifyContent: collapsed ? 'center' : '', paddingLeft: collapsed ? '0' : '' }}
|
|
214
|
+
>
|
|
187
215
|
<div
|
|
188
216
|
onClick={() => {
|
|
189
217
|
window.open('/home')
|
|
@@ -209,7 +237,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
209
237
|
{collapsed && (
|
|
210
238
|
<div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>
|
|
211
239
|
<div
|
|
212
|
-
className=
|
|
240
|
+
className='close-trigger'
|
|
213
241
|
onClick={() => {
|
|
214
242
|
setCollapsed(false)
|
|
215
243
|
}}
|
|
@@ -222,12 +250,19 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
222
250
|
<div style={{ height: 24 }}></div>
|
|
223
251
|
|
|
224
252
|
<div style={{ width: '100%', padding: '0 16px' }}>
|
|
225
|
-
<Search
|
|
253
|
+
<Search
|
|
254
|
+
menuList={menuList}
|
|
255
|
+
collapsed={collapsed}
|
|
256
|
+
type={type || ''}
|
|
257
|
+
umiHistory={umiHistory}
|
|
258
|
+
setSelectKey={setSelectKey}
|
|
259
|
+
findKeyPath={findKeyPath}
|
|
260
|
+
/>
|
|
226
261
|
</div>
|
|
227
262
|
|
|
228
263
|
{!collapsed && <div style={{ height: 12 }}></div>}
|
|
229
264
|
|
|
230
|
-
<div className=
|
|
265
|
+
<div className='layout-menu'>
|
|
231
266
|
<RcMenu
|
|
232
267
|
mode={collapsed ? 'vertical' : 'inline'}
|
|
233
268
|
className={`menu${collapsed ? '-collapsed' : ''}`}
|
|
@@ -241,7 +276,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
241
276
|
onMenuClick(item)
|
|
242
277
|
}
|
|
243
278
|
}}
|
|
244
|
-
triggerSubMenuAction=
|
|
279
|
+
triggerSubMenuAction='hover'
|
|
245
280
|
>
|
|
246
281
|
{menuList.map((item: any) => {
|
|
247
282
|
const isSelected = selectKey.includes(item.key)
|
|
@@ -252,13 +287,17 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
252
287
|
}
|
|
253
288
|
return (
|
|
254
289
|
<SubMenu
|
|
255
|
-
popupClassName=
|
|
290
|
+
popupClassName='rc-menu-submenu-popup'
|
|
256
291
|
key={item.key}
|
|
257
|
-
className=
|
|
292
|
+
className='menu-item-content'
|
|
258
293
|
title={
|
|
259
|
-
<div className=
|
|
260
|
-
<div className=
|
|
261
|
-
<span
|
|
294
|
+
<div className='sub-list'>
|
|
295
|
+
<div className='menu-item-inner'>
|
|
296
|
+
<span
|
|
297
|
+
className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}
|
|
298
|
+
>
|
|
299
|
+
{item.icon}
|
|
300
|
+
</span>
|
|
262
301
|
{!collapsed && <span className={classNames}>{item.label}</span>}
|
|
263
302
|
</div>
|
|
264
303
|
</div>
|
|
@@ -275,10 +314,20 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
275
314
|
if (child.children) {
|
|
276
315
|
return (
|
|
277
316
|
<SubMenu
|
|
278
|
-
popupClassName=
|
|
279
|
-
className=
|
|
317
|
+
popupClassName='rc-menu-submenu-popup'
|
|
318
|
+
className='menu-item-content sub-li'
|
|
280
319
|
key={child.key}
|
|
281
|
-
title={
|
|
320
|
+
title={
|
|
321
|
+
<div className='sub-list'>
|
|
322
|
+
{!collapsed && (
|
|
323
|
+
<span
|
|
324
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
325
|
+
>
|
|
326
|
+
{child.label}
|
|
327
|
+
</span>
|
|
328
|
+
)}
|
|
329
|
+
</div>
|
|
330
|
+
}
|
|
282
331
|
>
|
|
283
332
|
{child.children.map((grandChild: any) => {
|
|
284
333
|
const isSelected = selectKey.includes(grandChild.key)
|
|
@@ -289,8 +338,16 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
289
338
|
}
|
|
290
339
|
}
|
|
291
340
|
return (
|
|
292
|
-
<MenuItem key={grandChild.key} className=
|
|
293
|
-
<div className=
|
|
341
|
+
<MenuItem key={grandChild.key} className='grand-li'>
|
|
342
|
+
<div className='menu-item-content'>
|
|
343
|
+
{!collapsed && (
|
|
344
|
+
<span
|
|
345
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
346
|
+
>
|
|
347
|
+
{grandChild.label}
|
|
348
|
+
</span>
|
|
349
|
+
)}
|
|
350
|
+
</div>
|
|
294
351
|
</MenuItem>
|
|
295
352
|
)
|
|
296
353
|
})}
|
|
@@ -298,8 +355,16 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
298
355
|
)
|
|
299
356
|
}
|
|
300
357
|
return (
|
|
301
|
-
<MenuItem key={child.key} className=
|
|
302
|
-
<div className=
|
|
358
|
+
<MenuItem key={child.key} className='sub-li'>
|
|
359
|
+
<div className='menu-item-content'>
|
|
360
|
+
{!collapsed && (
|
|
361
|
+
<span
|
|
362
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
363
|
+
>
|
|
364
|
+
{child.label}
|
|
365
|
+
</span>
|
|
366
|
+
)}
|
|
367
|
+
</div>
|
|
303
368
|
</MenuItem>
|
|
304
369
|
)
|
|
305
370
|
})}
|
|
@@ -313,9 +378,11 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
313
378
|
classNames += ' submenu-selected'
|
|
314
379
|
}
|
|
315
380
|
return (
|
|
316
|
-
<MenuItem key={item.key} className=
|
|
381
|
+
<MenuItem key={item.key} className='menu-item-content'>
|
|
317
382
|
<div>
|
|
318
|
-
<span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>
|
|
383
|
+
<span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>
|
|
384
|
+
{item.icon}
|
|
385
|
+
</span>
|
|
319
386
|
{!collapsed && <span className={classNames}>{item.label}</span>}
|
|
320
387
|
</div>
|
|
321
388
|
</MenuItem>
|
|
@@ -327,21 +394,21 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
327
394
|
</Sider>
|
|
328
395
|
)}
|
|
329
396
|
|
|
330
|
-
<div className=
|
|
397
|
+
<div className='layout-main'>
|
|
331
398
|
{!isHideHeader && (
|
|
332
|
-
<div className=
|
|
399
|
+
<div className='layout-header'>
|
|
333
400
|
{appName && (
|
|
334
|
-
<div className=
|
|
401
|
+
<div className='app-name'>
|
|
335
402
|
<strong>{appName}</strong>
|
|
336
403
|
</div>
|
|
337
404
|
)}
|
|
338
405
|
|
|
339
|
-
<div className=
|
|
406
|
+
<div className='layout-header-fill' />
|
|
340
407
|
|
|
341
|
-
<div className=
|
|
408
|
+
<div className='layout-header-actions'>
|
|
342
409
|
{actions?.map((item, index) => {
|
|
343
410
|
return (
|
|
344
|
-
<div className=
|
|
411
|
+
<div className='actions-item' key={index}>
|
|
345
412
|
{item}
|
|
346
413
|
</div>
|
|
347
414
|
)
|
|
@@ -349,33 +416,48 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
349
416
|
</div>
|
|
350
417
|
|
|
351
418
|
<Popover
|
|
352
|
-
placement=
|
|
419
|
+
placement='bottom'
|
|
353
420
|
content={
|
|
354
|
-
<UserCard
|
|
421
|
+
<UserCard
|
|
422
|
+
myWalletInfo={myWalletInfo}
|
|
423
|
+
MyLoginInfo={MyLoginInfo}
|
|
424
|
+
amountInfo={amountInfo}
|
|
425
|
+
customAction={customAction}
|
|
426
|
+
isCopied={isCopied}
|
|
427
|
+
copyTextToClipboard={copyTextToClipboard}
|
|
428
|
+
/>
|
|
355
429
|
}
|
|
356
430
|
arrow={false}
|
|
357
|
-
trigger=
|
|
358
|
-
onOpenChange={
|
|
431
|
+
trigger='click'
|
|
432
|
+
onOpenChange={e => {
|
|
433
|
+
setInfoOpen(e ? 'up' : 'down')
|
|
359
434
|
if (!e) return
|
|
360
435
|
setIsCopied({
|
|
361
436
|
account: false,
|
|
362
437
|
id: false,
|
|
363
438
|
tenantName: false,
|
|
364
|
-
tenantId: false
|
|
439
|
+
tenantId: false
|
|
365
440
|
})
|
|
366
441
|
if (myLoginInfoAction) {
|
|
367
442
|
myLoginInfoAction()
|
|
368
443
|
}
|
|
369
444
|
}}
|
|
370
445
|
>
|
|
371
|
-
<div className=
|
|
372
|
-
<img className=
|
|
373
|
-
<div className=
|
|
446
|
+
<div className='layout-header-user'>
|
|
447
|
+
<img className='avatar' src={avatar} />
|
|
448
|
+
<div className='name'>{name}</div>
|
|
449
|
+
<span
|
|
450
|
+
style={{
|
|
451
|
+
display: 'inline-block',
|
|
452
|
+
marginLeft: '8px'
|
|
453
|
+
}}
|
|
454
|
+
className={`iconfont icon-zhankai ${infoOpen ? (infoOpen === 'up' ? 'up' : 'down') : ''}`}
|
|
455
|
+
></span>
|
|
374
456
|
</div>
|
|
375
457
|
</Popover>
|
|
376
458
|
</div>
|
|
377
459
|
)}
|
|
378
|
-
<div className=
|
|
460
|
+
<div className='layout-content'>{props.children}</div>
|
|
379
461
|
</div>
|
|
380
462
|
</Layout>
|
|
381
463
|
)
|
|
@@ -383,33 +465,63 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
383
465
|
|
|
384
466
|
function Arrow({ collapsed, type }: { collapsed?: boolean; type?: string }) {
|
|
385
467
|
return (
|
|
386
|
-
<svg
|
|
468
|
+
<svg
|
|
469
|
+
style={{ transform: !collapsed ? 'rotate(180deg)' : 'rotate(0deg)' }}
|
|
470
|
+
viewBox='0 0 1024 1024'
|
|
471
|
+
version='1.1'
|
|
472
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
473
|
+
width='20'
|
|
474
|
+
height='20'
|
|
475
|
+
>
|
|
387
476
|
<path
|
|
388
477
|
fill={type === 'console' ? '#FFFFFF' : '#817F9B'}
|
|
389
|
-
d=
|
|
478
|
+
d='M564.6336 775.168a41.5744 41.5744 0 0 0-13.312-28.672l-230.4-234.4448 229.9904-234.1888a42.0864 42.0864 0 0 0-26.3168-73.0112 42.0864 42.0864 0 0 0-30.6176 11.264L231.0656 481.024a41.984 41.984 0 0 0-2.4576 59.5968l1.9968 2.048 263.7824 265.6256a41.984 41.984 0 0 0 70.2464-33.0752z m254.5152 0a41.472 41.472 0 0 0-13.312-28.672L575.488 512l229.9904-234.1376a41.984 41.984 0 1 0-56.9344-61.7984L485.632 480.9728a42.0864 42.0864 0 0 0-2.4064 59.6992l0.8704 0.9216 0.8704 0.8192 0.4096 0.4096 263.5776 265.4208a41.984 41.984 0 0 0 70.1952-33.0752z'
|
|
390
479
|
></path>
|
|
391
480
|
</svg>
|
|
392
481
|
)
|
|
393
482
|
}
|
|
394
483
|
|
|
395
|
-
|
|
484
|
+
type SearchProps = {
|
|
485
|
+
menuList: TreeNode[]
|
|
486
|
+
collapsed: boolean
|
|
487
|
+
type: string
|
|
488
|
+
umiHistory: any
|
|
489
|
+
setSelectKey: any
|
|
490
|
+
findKeyPath: (pathname: string) => string[]
|
|
491
|
+
}
|
|
492
|
+
function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPath }: SearchProps) {
|
|
396
493
|
useEffect(() => {
|
|
397
494
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
398
|
-
if (
|
|
495
|
+
if (
|
|
496
|
+
(navigator.platform.toLowerCase().includes('mac') ? event.metaKey : event.ctrlKey) &&
|
|
497
|
+
event.key.toLowerCase() === 'k'
|
|
498
|
+
) {
|
|
399
499
|
event.preventDefault()
|
|
400
500
|
const searchInput = document.querySelector('#menu-input') as HTMLInputElement
|
|
401
501
|
if (searchInput) {
|
|
402
502
|
searchInput.focus()
|
|
403
|
-
|
|
503
|
+
setIsFocused(true)
|
|
404
504
|
}
|
|
405
505
|
}
|
|
406
506
|
}
|
|
407
507
|
|
|
508
|
+
// Add click outside listener to close dropdown
|
|
509
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
510
|
+
const searchContainer = document.querySelector('.search-container')
|
|
511
|
+
if (searchContainer && !searchContainer.contains(event.target as Node)) {
|
|
512
|
+
setIsFocused(false)
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
408
516
|
document.addEventListener('keydown', handleKeyDown)
|
|
517
|
+
document.addEventListener('mousedown', handleClickOutside)
|
|
518
|
+
|
|
409
519
|
return () => {
|
|
410
520
|
document.removeEventListener('keydown', handleKeyDown)
|
|
521
|
+
document.removeEventListener('mousedown', handleClickOutside)
|
|
411
522
|
}
|
|
412
523
|
}, [])
|
|
524
|
+
|
|
413
525
|
type Router = { label: string; icon?: any; key: string; children?: Router[] }
|
|
414
526
|
|
|
415
527
|
const name = (window as any).g_config.productCode
|
|
@@ -417,7 +529,7 @@ function Search({ menuList, collapsed, type }: { menuList: any; collapsed: boole
|
|
|
417
529
|
const [searchTerm, setSearchTerm] = useState('')
|
|
418
530
|
const [searchHistory, setSearchHistory] = useState<Router[]>([])
|
|
419
531
|
const [searchResult, setSearchResult] = useState<Router[]>([])
|
|
420
|
-
const [
|
|
532
|
+
const [isFocused, setIsFocused] = useState(false)
|
|
421
533
|
|
|
422
534
|
useEffect(() => {
|
|
423
535
|
const searchHistory = localStorage.getItem(name + 'searchHistory')
|
|
@@ -439,17 +551,10 @@ function Search({ menuList, collapsed, type }: { menuList: any; collapsed: boole
|
|
|
439
551
|
setSearchTerm(value)
|
|
440
552
|
//递归menulist判断是否有包含的
|
|
441
553
|
const searchResults: Router[] = []
|
|
442
|
-
search(menuList)
|
|
554
|
+
search(menuList as Router[])
|
|
443
555
|
setSearchResult(searchResults)
|
|
444
556
|
function search(data: Router[]) {
|
|
445
|
-
data.forEach(
|
|
446
|
-
if (item.key === '/quota-check') {
|
|
447
|
-
searchResults.push({
|
|
448
|
-
label: '配额列表',
|
|
449
|
-
key: '/quota-check',
|
|
450
|
-
})
|
|
451
|
-
return
|
|
452
|
-
}
|
|
557
|
+
data.forEach(item => {
|
|
453
558
|
if (typeof item.label === 'string' && item.label.includes(value.toLocaleUpperCase())) {
|
|
454
559
|
searchResults.push(item)
|
|
455
560
|
}
|
|
@@ -461,9 +566,9 @@ function Search({ menuList, collapsed, type }: { menuList: any; collapsed: boole
|
|
|
461
566
|
}
|
|
462
567
|
|
|
463
568
|
const enter = (item: Router) => {
|
|
464
|
-
|
|
569
|
+
setIsFocused(false)
|
|
465
570
|
//如果搜索历史里面有这个item,就不再添加
|
|
466
|
-
if (searchHistory.findIndex(
|
|
571
|
+
if (searchHistory.findIndex(i => i.key === item.key) === -1) {
|
|
467
572
|
setSearchHistory([...searchHistory, item])
|
|
468
573
|
}
|
|
469
574
|
//如果是目录就找到目录下第一个菜单进入
|
|
@@ -480,77 +585,106 @@ function Search({ menuList, collapsed, type }: { menuList: any; collapsed: boole
|
|
|
480
585
|
}
|
|
481
586
|
const firstItem = findFirst(item.children || [])
|
|
482
587
|
if (firstItem) {
|
|
483
|
-
|
|
588
|
+
setSelectKey(findKeyPath(firstItem.key)) // 记住keypath
|
|
589
|
+
umiHistory.push(firstItem.key, '_self')
|
|
484
590
|
}
|
|
485
591
|
} else {
|
|
486
|
-
|
|
592
|
+
setSelectKey(findKeyPath(item.key)) // 记住keypath
|
|
593
|
+
umiHistory.push(item.key, '_self')
|
|
487
594
|
}
|
|
488
595
|
}
|
|
489
596
|
|
|
490
597
|
const deleteHistory = (item: Router) => {
|
|
491
|
-
setSearchHistory(searchHistory.filter(
|
|
598
|
+
setSearchHistory(searchHistory.filter(i => i.key !== item.key))
|
|
492
599
|
}
|
|
493
600
|
return (
|
|
494
601
|
<>
|
|
495
602
|
{collapsed ? (
|
|
496
|
-
<div className=
|
|
497
|
-
<div className=
|
|
498
|
-
<svg
|
|
603
|
+
<div className='search-mobile-console'>
|
|
604
|
+
<div className='search-icon'>
|
|
605
|
+
<svg
|
|
606
|
+
viewBox='0 0 1024 1024'
|
|
607
|
+
version='1.1'
|
|
608
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
609
|
+
width='18'
|
|
610
|
+
height='18'
|
|
611
|
+
>
|
|
499
612
|
<path
|
|
500
613
|
fill={type === 'console' ? '#C2B7F6' : '#817F9B'}
|
|
501
|
-
d=
|
|
614
|
+
d='M962.048 907.776l-229.0176-229.0176a384.3072 384.3072 0 1 0-54.272 54.272l229.0176 229.0176a38.4 38.4 0 0 0 54.272-54.272zM436.1216 743.0656a306.944 306.944 0 1 1 306.944-306.944 307.3024 307.3024 0 0 1-306.944 306.944z'
|
|
502
615
|
></path>
|
|
503
616
|
</svg>
|
|
504
617
|
</div>
|
|
505
618
|
</div>
|
|
506
619
|
) : (
|
|
507
|
-
<div
|
|
508
|
-
<div className=
|
|
509
|
-
<
|
|
510
|
-
|
|
511
|
-
|
|
620
|
+
<div className='search-container'>
|
|
621
|
+
<div className='search'>
|
|
622
|
+
<div className='search-bg-mask'>
|
|
623
|
+
<img src='https://cfel-front.oss-cn-hangzhou.aliyuncs.com/logo/base-component/menu-search-bg.png' />
|
|
624
|
+
</div>
|
|
625
|
+
<input
|
|
626
|
+
autoComplete='off'
|
|
627
|
+
id='menu-input'
|
|
628
|
+
value={searchTerm}
|
|
629
|
+
onChange={e => handleSearch(e.target.value)}
|
|
630
|
+
className='search-input'
|
|
631
|
+
placeholder='搜索菜单...'
|
|
632
|
+
onFocus={() => setIsFocused(true)}
|
|
633
|
+
/>
|
|
634
|
+
<div className='search-icon'>
|
|
635
|
+
<svg
|
|
636
|
+
viewBox='0 0 1024 1024'
|
|
637
|
+
version='1.1'
|
|
638
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
639
|
+
width='18'
|
|
640
|
+
height='18'
|
|
641
|
+
>
|
|
512
642
|
<path
|
|
513
643
|
fill={type === 'console' ? '#C2B7F6' : '#817F9B'}
|
|
514
|
-
d=
|
|
644
|
+
d='M962.048 907.776l-229.0176-229.0176a384.3072 384.3072 0 1 0-54.272 54.272l229.0176 229.0176a38.4 38.4 0 0 0 54.272-54.272zM436.1216 743.0656a306.944 306.944 0 1 1 306.944-306.944 307.3024 307.3024 0 0 1-306.944 306.944z'
|
|
515
645
|
></path>
|
|
516
646
|
</svg>
|
|
517
647
|
</div>
|
|
518
|
-
<div
|
|
519
|
-
{navigator.platform.toLowerCase().includes('mac') ? '⌘' : 'Ctrl+'}K
|
|
520
|
-
</div>
|
|
521
|
-
|
|
522
|
-
{/* <div
|
|
648
|
+
<div
|
|
523
649
|
className='search-command'
|
|
524
|
-
style={{ width: '50px' }}
|
|
650
|
+
style={{ width: navigator.platform.toLowerCase().includes('mac') ? '' : '50px' }}
|
|
525
651
|
>
|
|
526
|
-
{'Ctrl+'}K
|
|
527
|
-
</div>
|
|
652
|
+
{navigator.platform.toLowerCase().includes('mac') ? '⌘' : 'Ctrl+'}K
|
|
653
|
+
</div>
|
|
528
654
|
</div>
|
|
529
655
|
<div>
|
|
530
|
-
{
|
|
656
|
+
{isFocused && (
|
|
531
657
|
<>
|
|
532
658
|
{searchTerm ? (
|
|
533
|
-
<List
|
|
659
|
+
<List
|
|
660
|
+
split={false}
|
|
661
|
+
className='lists'
|
|
662
|
+
size='small'
|
|
663
|
+
bordered
|
|
664
|
+
dataSource={searchResult}
|
|
665
|
+
renderItem={item => (
|
|
666
|
+
<List.Item onClick={() => enter(item)}>{item.label}</List.Item>
|
|
667
|
+
)}
|
|
668
|
+
/>
|
|
534
669
|
) : (
|
|
535
670
|
<List
|
|
536
671
|
split={false}
|
|
537
|
-
className=
|
|
538
|
-
header=
|
|
539
|
-
size=
|
|
672
|
+
className='lists'
|
|
673
|
+
header='最近访问'
|
|
674
|
+
size='small'
|
|
540
675
|
bordered
|
|
541
676
|
dataSource={searchHistory}
|
|
542
|
-
renderItem={
|
|
677
|
+
renderItem={item => {
|
|
543
678
|
return (
|
|
544
679
|
<div
|
|
545
680
|
className={'search-item'}
|
|
546
681
|
style={{
|
|
547
682
|
display: 'flex',
|
|
548
683
|
justifyContent: 'space-between',
|
|
549
|
-
alignItems: 'center'
|
|
684
|
+
alignItems: 'center'
|
|
550
685
|
}}
|
|
551
|
-
onClick={() => enter(item)}
|
|
552
686
|
>
|
|
553
|
-
<List.Item>{item.label}</List.Item>
|
|
687
|
+
<List.Item onClick={() => enter(item)}>{item.label}</List.Item>
|
|
554
688
|
<div
|
|
555
689
|
style={{ paddingRight: 10, cursor: 'pointer' }}
|
|
556
690
|
onClick={() => {
|