cfel-base-components 2.5.56 → 2.5.58
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.
|
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
|
|
|
2
2
|
import { Layout, List, Menu, MenuProps, Popover } from 'antd'
|
|
3
3
|
import UserCard from './user-card'
|
|
4
4
|
import RcMenu, { SubMenu, MenuItem } from 'rc-menu'
|
|
5
|
-
import { CloseCircleOutlined } from '@ant-design/icons'
|
|
5
|
+
import { CloseCircleOutlined, RightOutlined } from '@ant-design/icons'
|
|
6
6
|
const { Sider } = Layout
|
|
7
7
|
import './index.scss'
|
|
8
8
|
|
|
@@ -64,7 +64,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
64
64
|
isHideHeader,
|
|
65
65
|
onCollapse,
|
|
66
66
|
type,
|
|
67
|
-
umiHistory
|
|
67
|
+
umiHistory
|
|
68
68
|
} = props
|
|
69
69
|
|
|
70
70
|
const findKeyPath = (pathname: string) => {
|
|
@@ -88,7 +88,9 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
// 初始化选中菜单
|
|
91
|
-
const [selectKey, setSelectKey] = useState<any>(
|
|
91
|
+
const [selectKey, setSelectKey] = useState<any>(
|
|
92
|
+
findKeyPath('/' + location.pathname.split('/')[2])
|
|
93
|
+
)
|
|
92
94
|
|
|
93
95
|
const [infoOpen, setInfoOpen] = useState<string | null>(null)
|
|
94
96
|
|
|
@@ -133,7 +135,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
133
135
|
//在这里找到当前菜单的上层目录
|
|
134
136
|
const paMenu = findParentMenu(menuList, '/' + location.pathname.split('/')[2])
|
|
135
137
|
//去重
|
|
136
|
-
const set = new Set(paMenu.map(
|
|
138
|
+
const set = new Set(paMenu.map(item => item.key))
|
|
137
139
|
|
|
138
140
|
openKeys.forEach((element: string) => {
|
|
139
141
|
set.add(element)
|
|
@@ -151,20 +153,20 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
151
153
|
account: false,
|
|
152
154
|
id: false,
|
|
153
155
|
tenantName: false,
|
|
154
|
-
tenantId: false
|
|
156
|
+
tenantId: false
|
|
155
157
|
})
|
|
156
158
|
|
|
157
|
-
const onOpenChange: MenuProps['onOpenChange'] =
|
|
159
|
+
const onOpenChange: MenuProps['onOpenChange'] = keys => {
|
|
158
160
|
// Find the last opened key
|
|
159
|
-
const latestOpenKey = keys.find(
|
|
161
|
+
const latestOpenKey = keys.find(key => openKeys.indexOf(key) === -1)
|
|
160
162
|
|
|
161
163
|
if (latestOpenKey) {
|
|
162
164
|
// If opening a new key
|
|
163
|
-
const rootSubmenuKeys = menuList.map(
|
|
165
|
+
const rootSubmenuKeys = menuList.map(item => item.key)
|
|
164
166
|
|
|
165
167
|
if (rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
|
|
166
168
|
// If it's a third level menu, only keep its parent menu open
|
|
167
|
-
const parentKey = keys.find(
|
|
169
|
+
const parentKey = keys.find(key => rootSubmenuKeys.includes(key))
|
|
168
170
|
setOpenKeys(parentKey ? [parentKey, latestOpenKey] : [latestOpenKey])
|
|
169
171
|
} else {
|
|
170
172
|
// If it's a second level menu, only keep it open
|
|
@@ -186,7 +188,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
186
188
|
// 菜单动画
|
|
187
189
|
const collapseNode = () => {
|
|
188
190
|
return {
|
|
189
|
-
height: 0
|
|
191
|
+
height: 0
|
|
190
192
|
}
|
|
191
193
|
}
|
|
192
194
|
const expandNode = (node: any) => {
|
|
@@ -200,26 +202,26 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
200
202
|
onEnterStart: collapseNode,
|
|
201
203
|
onEnterActive: expandNode,
|
|
202
204
|
onLeaveStart: expandNode,
|
|
203
|
-
onLeaveActive: collapseNode
|
|
205
|
+
onLeaveActive: collapseNode
|
|
204
206
|
}
|
|
205
207
|
|
|
206
208
|
const verticalMotion = {
|
|
207
209
|
motionName: 'rc-menu-open-zoom',
|
|
208
210
|
motionAppear: true,
|
|
209
211
|
motionEnter: true,
|
|
210
|
-
motionLeave: true
|
|
212
|
+
motionLeave: true
|
|
211
213
|
}
|
|
212
214
|
|
|
213
215
|
return (
|
|
214
|
-
<Layout className=
|
|
216
|
+
<Layout className='layout-warps'>
|
|
215
217
|
{Array.isArray(menuList) && menuList.length > 0 && (
|
|
216
218
|
<Sider
|
|
217
|
-
className=
|
|
219
|
+
className='layout-side'
|
|
218
220
|
collapsible
|
|
219
221
|
trigger={null}
|
|
220
222
|
collapsed={collapsed}
|
|
221
223
|
width={260}
|
|
222
|
-
onCollapse={
|
|
224
|
+
onCollapse={value => {
|
|
223
225
|
if (onCollapse) {
|
|
224
226
|
onCollapse(value)
|
|
225
227
|
}
|
|
@@ -227,10 +229,13 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
227
229
|
setCollapsed(value)
|
|
228
230
|
}}
|
|
229
231
|
>
|
|
230
|
-
<div className=
|
|
231
|
-
<div className=
|
|
232
|
+
<div className='layout-side-mask1'></div>
|
|
233
|
+
<div className='layout-side-mask2'></div>
|
|
232
234
|
|
|
233
|
-
<div
|
|
235
|
+
<div
|
|
236
|
+
className='header-logo'
|
|
237
|
+
style={{ justifyContent: collapsed ? 'center' : '', paddingLeft: collapsed ? '0' : '' }}
|
|
238
|
+
>
|
|
234
239
|
<div
|
|
235
240
|
onClick={() => {
|
|
236
241
|
window.open('/home')
|
|
@@ -240,8 +245,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
240
245
|
{collapsed && <img className={`logo-sub`} src={subLogoUrl} />}
|
|
241
246
|
{/* {collapsed && <img className={`logo-base sub-logo`} src={logo || subLogoUrl} />} */}
|
|
242
247
|
</div>
|
|
243
|
-
|
|
244
|
-
{/* {!collapsed && (
|
|
248
|
+
{!collapsed && (
|
|
245
249
|
<div
|
|
246
250
|
className='trigger'
|
|
247
251
|
onClick={() => {
|
|
@@ -250,13 +254,13 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
250
254
|
>
|
|
251
255
|
<Arrow collapsed={true} type={type} />
|
|
252
256
|
</div>
|
|
253
|
-
)}
|
|
257
|
+
)}
|
|
254
258
|
</div>
|
|
255
259
|
|
|
256
260
|
{collapsed && (
|
|
257
261
|
<div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>
|
|
258
262
|
<div
|
|
259
|
-
className=
|
|
263
|
+
className='close-trigger'
|
|
260
264
|
onClick={() => {
|
|
261
265
|
localStorage.setItem('layout_collapsed', 'false')
|
|
262
266
|
setCollapsed(false)
|
|
@@ -267,15 +271,22 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
267
271
|
</div>
|
|
268
272
|
)}
|
|
269
273
|
|
|
270
|
-
<div style={{ height: 24 }}></div>
|
|
274
|
+
{!collapsed && <div style={{ height: 24 }}></div>}
|
|
271
275
|
|
|
272
276
|
<div style={{ width: '100%', padding: '0 16px' }}>
|
|
273
|
-
<Search
|
|
277
|
+
<Search
|
|
278
|
+
menuList={menuList}
|
|
279
|
+
collapsed={collapsed}
|
|
280
|
+
type={type || ''}
|
|
281
|
+
umiHistory={umiHistory}
|
|
282
|
+
setSelectKey={setSelectKey}
|
|
283
|
+
findKeyPath={findKeyPath}
|
|
284
|
+
/>
|
|
274
285
|
</div>
|
|
275
286
|
|
|
276
287
|
{!collapsed && <div style={{ height: 12 }}></div>}
|
|
277
288
|
|
|
278
|
-
<div className=
|
|
289
|
+
<div className='layout-menu'>
|
|
279
290
|
<RcMenu
|
|
280
291
|
mode={collapsed ? 'vertical' : 'inline'}
|
|
281
292
|
className={`menu${collapsed ? '-collapsed' : ''}`}
|
|
@@ -289,7 +300,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
289
300
|
onMenuClick(item)
|
|
290
301
|
}
|
|
291
302
|
}}
|
|
292
|
-
triggerSubMenuAction=
|
|
303
|
+
triggerSubMenuAction='hover'
|
|
293
304
|
>
|
|
294
305
|
{menuList.map((item: any) => {
|
|
295
306
|
const isSelected = selectKey.includes(item.key)
|
|
@@ -298,15 +309,112 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
298
309
|
if (isSelected) {
|
|
299
310
|
classNames += ' submenu-selected'
|
|
300
311
|
}
|
|
312
|
+
if (collapsed) {
|
|
313
|
+
return (
|
|
314
|
+
<Popover
|
|
315
|
+
key={item.key}
|
|
316
|
+
align={{
|
|
317
|
+
offset: [33, 0]
|
|
318
|
+
}}
|
|
319
|
+
placement='right'
|
|
320
|
+
arrow={false}
|
|
321
|
+
content={
|
|
322
|
+
<div className='menu-popover'>
|
|
323
|
+
{item.children.map((child: any) => {
|
|
324
|
+
const isSelected = selectKey.includes(child.key)
|
|
325
|
+
if (child.children) {
|
|
326
|
+
return (
|
|
327
|
+
<Popover
|
|
328
|
+
key={child.key}
|
|
329
|
+
align={{
|
|
330
|
+
offset: [10, 0]
|
|
331
|
+
}}
|
|
332
|
+
placement='right'
|
|
333
|
+
arrow={false}
|
|
334
|
+
content={
|
|
335
|
+
<div className='menu-popover' style={{ width: '146px' }}>
|
|
336
|
+
{child.children.map((grandChild: any) => {
|
|
337
|
+
const isSelected = selectKey.includes(grandChild.key)
|
|
338
|
+
return (
|
|
339
|
+
<MenuItem
|
|
340
|
+
onClick={() => {
|
|
341
|
+
if (onMenuClick) {
|
|
342
|
+
onMenuClick(grandChild)
|
|
343
|
+
}
|
|
344
|
+
}}
|
|
345
|
+
key={grandChild.key}
|
|
346
|
+
className={`grand-li ${isSelected ? 'sub-item-selected' : ''}`}
|
|
347
|
+
>
|
|
348
|
+
<div style={{ width: '130px' }}>
|
|
349
|
+
<span className={`menu-item-label`}>
|
|
350
|
+
{grandChild.label}
|
|
351
|
+
</span>
|
|
352
|
+
</div>
|
|
353
|
+
</MenuItem>
|
|
354
|
+
)
|
|
355
|
+
})}
|
|
356
|
+
</div>
|
|
357
|
+
}
|
|
358
|
+
>
|
|
359
|
+
<SubMenu
|
|
360
|
+
className={`menu-item-content sub-li ${isSelected ? 'sub-item-selected' : ''}`}
|
|
361
|
+
key={child.key}
|
|
362
|
+
title={
|
|
363
|
+
<div className='sub-list'>
|
|
364
|
+
<span className={`menu-item-label`}>{child.label}</span>
|
|
365
|
+
<RightOutlined />
|
|
366
|
+
</div>
|
|
367
|
+
}
|
|
368
|
+
></SubMenu>
|
|
369
|
+
</Popover>
|
|
370
|
+
)
|
|
371
|
+
}
|
|
372
|
+
return (
|
|
373
|
+
<MenuItem
|
|
374
|
+
onClick={() => {
|
|
375
|
+
if (onMenuClick) {
|
|
376
|
+
onMenuClick(child)
|
|
377
|
+
}
|
|
378
|
+
}}
|
|
379
|
+
key={child.key}
|
|
380
|
+
className={`sub-li ${isSelected ? 'sub-item-selected' : ''}`}
|
|
381
|
+
>
|
|
382
|
+
<div className='menu-item-content sub-list'>{child.label}</div>
|
|
383
|
+
</MenuItem>
|
|
384
|
+
)
|
|
385
|
+
})}
|
|
386
|
+
</div>
|
|
387
|
+
}
|
|
388
|
+
>
|
|
389
|
+
<SubMenu
|
|
390
|
+
className='menu-item-content sub-li'
|
|
391
|
+
title={
|
|
392
|
+
<div className='sub-list'>
|
|
393
|
+
<div>
|
|
394
|
+
<span
|
|
395
|
+
className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}
|
|
396
|
+
>
|
|
397
|
+
{item.icon}
|
|
398
|
+
</span>
|
|
399
|
+
</div>
|
|
400
|
+
</div>
|
|
401
|
+
}
|
|
402
|
+
></SubMenu>
|
|
403
|
+
</Popover>
|
|
404
|
+
)
|
|
405
|
+
}
|
|
301
406
|
return (
|
|
302
407
|
<SubMenu
|
|
303
|
-
popupClassName="rc-menu-submenu-popup"
|
|
304
408
|
key={item.key}
|
|
305
|
-
className=
|
|
409
|
+
className='menu-item-content'
|
|
306
410
|
title={
|
|
307
|
-
<div className=
|
|
308
|
-
<div className=
|
|
309
|
-
<span
|
|
411
|
+
<div className='sub-list'>
|
|
412
|
+
<div className='menu-item-inner'>
|
|
413
|
+
<span
|
|
414
|
+
className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}
|
|
415
|
+
>
|
|
416
|
+
{item.icon}
|
|
417
|
+
</span>
|
|
310
418
|
{!collapsed && <span className={classNames}>{item.label}</span>}
|
|
311
419
|
</div>
|
|
312
420
|
</div>
|
|
@@ -323,10 +431,19 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
323
431
|
if (child.children) {
|
|
324
432
|
return (
|
|
325
433
|
<SubMenu
|
|
326
|
-
|
|
327
|
-
className="menu-item-content sub-li"
|
|
434
|
+
className='menu-item-content sub-li'
|
|
328
435
|
key={child.key}
|
|
329
|
-
title={
|
|
436
|
+
title={
|
|
437
|
+
<div className='sub-list'>
|
|
438
|
+
{!collapsed && (
|
|
439
|
+
<span
|
|
440
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
441
|
+
>
|
|
442
|
+
{child.label}
|
|
443
|
+
</span>
|
|
444
|
+
)}
|
|
445
|
+
</div>
|
|
446
|
+
}
|
|
330
447
|
>
|
|
331
448
|
{child.children.map((grandChild: any) => {
|
|
332
449
|
const isSelected = selectKey.includes(grandChild.key)
|
|
@@ -337,8 +454,16 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
337
454
|
}
|
|
338
455
|
}
|
|
339
456
|
return (
|
|
340
|
-
<MenuItem key={grandChild.key} className=
|
|
341
|
-
<div className=
|
|
457
|
+
<MenuItem key={grandChild.key} className='grand-li'>
|
|
458
|
+
<div className='menu-item-content'>
|
|
459
|
+
{!collapsed && (
|
|
460
|
+
<span
|
|
461
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
462
|
+
>
|
|
463
|
+
{grandChild.label}
|
|
464
|
+
</span>
|
|
465
|
+
)}
|
|
466
|
+
</div>
|
|
342
467
|
</MenuItem>
|
|
343
468
|
)
|
|
344
469
|
})}
|
|
@@ -346,8 +471,16 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
346
471
|
)
|
|
347
472
|
}
|
|
348
473
|
return (
|
|
349
|
-
<MenuItem key={child.key} className=
|
|
350
|
-
<div className=
|
|
474
|
+
<MenuItem key={child.key} className='sub-li'>
|
|
475
|
+
<div className='menu-item-content'>
|
|
476
|
+
{!collapsed && (
|
|
477
|
+
<span
|
|
478
|
+
className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}
|
|
479
|
+
>
|
|
480
|
+
{child.label}
|
|
481
|
+
</span>
|
|
482
|
+
)}
|
|
483
|
+
</div>
|
|
351
484
|
</MenuItem>
|
|
352
485
|
)
|
|
353
486
|
})}
|
|
@@ -363,14 +496,16 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
363
496
|
return (
|
|
364
497
|
<MenuItem
|
|
365
498
|
key={item.key}
|
|
366
|
-
className=
|
|
499
|
+
className='menu-item-content'
|
|
367
500
|
style={{
|
|
368
501
|
position: 'relative',
|
|
369
|
-
zIndex: 99
|
|
502
|
+
zIndex: 99
|
|
370
503
|
}}
|
|
371
504
|
>
|
|
372
|
-
<div className=
|
|
373
|
-
<span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>
|
|
505
|
+
<div className='first-li'>
|
|
506
|
+
<span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>
|
|
507
|
+
{item.icon}
|
|
508
|
+
</span>
|
|
374
509
|
{!collapsed && <span className={classNames}>{item.label}</span>}
|
|
375
510
|
</div>
|
|
376
511
|
</MenuItem>
|
|
@@ -382,21 +517,21 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
382
517
|
</Sider>
|
|
383
518
|
)}
|
|
384
519
|
|
|
385
|
-
<div className=
|
|
520
|
+
<div className='layout-main'>
|
|
386
521
|
{!isHideHeader && (
|
|
387
|
-
<div className=
|
|
522
|
+
<div className='layout-header'>
|
|
388
523
|
{appName && (
|
|
389
|
-
<div className=
|
|
524
|
+
<div className='app-name'>
|
|
390
525
|
<strong>{appName}</strong>
|
|
391
526
|
</div>
|
|
392
527
|
)}
|
|
393
528
|
|
|
394
|
-
<div className=
|
|
529
|
+
<div className='layout-header-fill' />
|
|
395
530
|
|
|
396
|
-
<div className=
|
|
531
|
+
<div className='layout-header-actions'>
|
|
397
532
|
{actions?.map((item, index) => {
|
|
398
533
|
return (
|
|
399
|
-
<div className=
|
|
534
|
+
<div className='actions-item' key={index}>
|
|
400
535
|
{item}
|
|
401
536
|
</div>
|
|
402
537
|
)
|
|
@@ -404,33 +539,40 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
404
539
|
</div>
|
|
405
540
|
|
|
406
541
|
<Popover
|
|
407
|
-
placement=
|
|
542
|
+
placement='bottom'
|
|
408
543
|
content={
|
|
409
|
-
<UserCard
|
|
544
|
+
<UserCard
|
|
545
|
+
myWalletInfo={myWalletInfo}
|
|
546
|
+
MyLoginInfo={MyLoginInfo}
|
|
547
|
+
amountInfo={amountInfo}
|
|
548
|
+
customAction={customAction}
|
|
549
|
+
isCopied={isCopied}
|
|
550
|
+
copyTextToClipboard={copyTextToClipboard}
|
|
551
|
+
/>
|
|
410
552
|
}
|
|
411
553
|
arrow={false}
|
|
412
|
-
trigger=
|
|
413
|
-
onOpenChange={
|
|
554
|
+
trigger='click'
|
|
555
|
+
onOpenChange={e => {
|
|
414
556
|
setInfoOpen(e ? 'up' : 'down')
|
|
415
557
|
if (!e) return
|
|
416
558
|
setIsCopied({
|
|
417
559
|
account: false,
|
|
418
560
|
id: false,
|
|
419
561
|
tenantName: false,
|
|
420
|
-
tenantId: false
|
|
562
|
+
tenantId: false
|
|
421
563
|
})
|
|
422
564
|
if (myLoginInfoAction) {
|
|
423
565
|
myLoginInfoAction()
|
|
424
566
|
}
|
|
425
567
|
}}
|
|
426
568
|
>
|
|
427
|
-
<div className=
|
|
428
|
-
<img className=
|
|
429
|
-
<div className=
|
|
569
|
+
<div className='layout-header-user'>
|
|
570
|
+
<img className='avatar' src={avatar} />
|
|
571
|
+
<div className='name'>{name}</div>
|
|
430
572
|
<span
|
|
431
573
|
style={{
|
|
432
574
|
display: 'inline-block',
|
|
433
|
-
marginLeft: '8px'
|
|
575
|
+
marginLeft: '8px'
|
|
434
576
|
}}
|
|
435
577
|
className={`iconfont icon-zhankai ${infoOpen ? (infoOpen === 'up' ? 'up' : 'down') : ''}`}
|
|
436
578
|
></span>
|
|
@@ -438,7 +580,7 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
438
580
|
</Popover>
|
|
439
581
|
</div>
|
|
440
582
|
)}
|
|
441
|
-
<div className=
|
|
583
|
+
<div className='layout-content'>{props.children}</div>
|
|
442
584
|
</div>
|
|
443
585
|
</Layout>
|
|
444
586
|
)
|
|
@@ -446,10 +588,17 @@ export default function LiosLayout(props: LiosLayoutlProps) {
|
|
|
446
588
|
|
|
447
589
|
function Arrow({ collapsed, type }: { collapsed?: boolean; type?: string }) {
|
|
448
590
|
return (
|
|
449
|
-
<svg
|
|
591
|
+
<svg
|
|
592
|
+
style={{ transform: !collapsed ? 'rotate(180deg)' : 'rotate(0deg)' }}
|
|
593
|
+
viewBox='0 0 1024 1024'
|
|
594
|
+
version='1.1'
|
|
595
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
596
|
+
width='20'
|
|
597
|
+
height='20'
|
|
598
|
+
>
|
|
450
599
|
<path
|
|
451
|
-
fill=
|
|
452
|
-
d=
|
|
600
|
+
fill='#7D8295'
|
|
601
|
+
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'
|
|
453
602
|
></path>
|
|
454
603
|
</svg>
|
|
455
604
|
)
|
|
@@ -466,7 +615,10 @@ type SearchProps = {
|
|
|
466
615
|
function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPath }: SearchProps) {
|
|
467
616
|
useEffect(() => {
|
|
468
617
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
469
|
-
if (
|
|
618
|
+
if (
|
|
619
|
+
(navigator.platform.toLowerCase().includes('mac') ? event.metaKey : event.ctrlKey) &&
|
|
620
|
+
event.key.toLowerCase() === 'k'
|
|
621
|
+
) {
|
|
470
622
|
event.preventDefault()
|
|
471
623
|
const searchInput = document.querySelector('#menu-input') as HTMLInputElement
|
|
472
624
|
if (searchInput) {
|
|
@@ -525,7 +677,7 @@ function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPa
|
|
|
525
677
|
search(menuList as Router[])
|
|
526
678
|
setSearchResult(searchResults)
|
|
527
679
|
function search(data: Router[]) {
|
|
528
|
-
data.forEach(
|
|
680
|
+
data.forEach(item => {
|
|
529
681
|
if (typeof item.label === 'string' && item.label.includes(value.toLocaleUpperCase())) {
|
|
530
682
|
searchResults.push(item)
|
|
531
683
|
}
|
|
@@ -539,7 +691,7 @@ function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPa
|
|
|
539
691
|
const enter = (item: Router) => {
|
|
540
692
|
setIsFocused(false)
|
|
541
693
|
//如果搜索历史里面有这个item,就不再添加
|
|
542
|
-
if (searchHistory.findIndex(
|
|
694
|
+
if (searchHistory.findIndex(i => i.key === item.key) === -1) {
|
|
543
695
|
setSearchHistory([...searchHistory, item])
|
|
544
696
|
}
|
|
545
697
|
//如果是目录就找到目录下第一个菜单进入
|
|
@@ -566,45 +718,43 @@ function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPa
|
|
|
566
718
|
}
|
|
567
719
|
|
|
568
720
|
const deleteHistory = (item: Router) => {
|
|
569
|
-
setSearchHistory(searchHistory.filter(
|
|
721
|
+
setSearchHistory(searchHistory.filter(i => i.key !== item.key))
|
|
570
722
|
}
|
|
571
723
|
return (
|
|
572
724
|
<>
|
|
573
|
-
{collapsed
|
|
574
|
-
<div className=
|
|
575
|
-
<div className=
|
|
576
|
-
<
|
|
577
|
-
<
|
|
578
|
-
fill={type === 'console' ? '#C2B7F6' : '#817F9B'}
|
|
579
|
-
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"
|
|
580
|
-
></path>
|
|
581
|
-
</svg>
|
|
582
|
-
</div>
|
|
583
|
-
</div>
|
|
584
|
-
) : (
|
|
585
|
-
<div className="search-container">
|
|
586
|
-
<div className="search">
|
|
587
|
-
<div className="search-bg-mask">
|
|
588
|
-
<img src="https://cfel-front.oss-cn-hangzhou.aliyuncs.com/logo/base-component/menu-search-bg.png" />
|
|
725
|
+
{!collapsed && (
|
|
726
|
+
<div className='search-container'>
|
|
727
|
+
<div className='search'>
|
|
728
|
+
<div className='search-bg-mask'>
|
|
729
|
+
<img src='https://cfel-front.oss-cn-hangzhou.aliyuncs.com/logo/base-component/menu-search-bg.png' />
|
|
589
730
|
</div>
|
|
590
731
|
<input
|
|
591
|
-
autoComplete=
|
|
592
|
-
id=
|
|
732
|
+
autoComplete='off'
|
|
733
|
+
id='menu-input'
|
|
593
734
|
value={searchTerm}
|
|
594
|
-
onChange={
|
|
595
|
-
className=
|
|
596
|
-
placeholder=
|
|
735
|
+
onChange={e => handleSearch(e.target.value)}
|
|
736
|
+
className='search-input'
|
|
737
|
+
placeholder='搜索菜单...'
|
|
597
738
|
onFocus={() => setIsFocused(true)}
|
|
598
739
|
/>
|
|
599
|
-
<div className=
|
|
600
|
-
<svg
|
|
740
|
+
<div className='search-icon'>
|
|
741
|
+
<svg
|
|
742
|
+
viewBox='0 0 1024 1024'
|
|
743
|
+
version='1.1'
|
|
744
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
745
|
+
width='18'
|
|
746
|
+
height='18'
|
|
747
|
+
>
|
|
601
748
|
<path
|
|
602
749
|
fill={type === 'console' ? '#C2B7F6' : '#817F9B'}
|
|
603
|
-
d=
|
|
750
|
+
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'
|
|
604
751
|
></path>
|
|
605
752
|
</svg>
|
|
606
753
|
</div>
|
|
607
|
-
<div
|
|
754
|
+
<div
|
|
755
|
+
className='search-command'
|
|
756
|
+
style={{ width: navigator.platform.toLowerCase().includes('mac') ? '' : '50px' }}
|
|
757
|
+
>
|
|
608
758
|
{navigator.platform.toLowerCase().includes('mac') ? '⌘' : 'Ctrl+'}K
|
|
609
759
|
</div>
|
|
610
760
|
</div>
|
|
@@ -612,23 +762,32 @@ function Search({ menuList, collapsed, type, umiHistory, setSelectKey, findKeyPa
|
|
|
612
762
|
{isFocused && (
|
|
613
763
|
<>
|
|
614
764
|
{searchTerm ? (
|
|
615
|
-
<List
|
|
765
|
+
<List
|
|
766
|
+
split={false}
|
|
767
|
+
className='lists'
|
|
768
|
+
size='small'
|
|
769
|
+
bordered
|
|
770
|
+
dataSource={searchResult}
|
|
771
|
+
renderItem={item => (
|
|
772
|
+
<List.Item onClick={() => enter(item)}>{item.label}</List.Item>
|
|
773
|
+
)}
|
|
774
|
+
/>
|
|
616
775
|
) : (
|
|
617
776
|
<List
|
|
618
777
|
split={false}
|
|
619
|
-
className=
|
|
620
|
-
header=
|
|
621
|
-
size=
|
|
778
|
+
className='lists'
|
|
779
|
+
header='最近访问'
|
|
780
|
+
size='small'
|
|
622
781
|
bordered
|
|
623
782
|
dataSource={searchHistory}
|
|
624
|
-
renderItem={
|
|
783
|
+
renderItem={item => {
|
|
625
784
|
return (
|
|
626
785
|
<div
|
|
627
786
|
className={'search-item'}
|
|
628
787
|
style={{
|
|
629
788
|
display: 'flex',
|
|
630
789
|
justifyContent: 'space-between',
|
|
631
|
-
alignItems: 'center'
|
|
790
|
+
alignItems: 'center'
|
|
632
791
|
}}
|
|
633
792
|
>
|
|
634
793
|
<List.Item onClick={() => enter(item)}>{item.label}</List.Item>
|