cfel-base-components 2.5.47 → 2.5.49

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.
@@ -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 [selectKey, setSelectKey] = useState<any>([])
62
-
63
- useEffect(() => {
64
- if (type !== 'console') {
65
- import('./index.scss')
66
- } else {
67
- import('./index-console.scss')
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
- }, [type])
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((item) => item.key))
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'] = (keys) => {
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="layout-warps">
193
+ <Layout className='layout-warps'>
169
194
  {Array.isArray(menuList) && menuList.length > 0 && (
170
195
  <Sider
171
- className="layout-side"
196
+ className='layout-side'
172
197
  collapsible
173
198
  trigger={null}
174
199
  collapsed={collapsed}
175
200
  width={260}
176
- onCollapse={(value) => {
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="layout-side-mask"></div>
209
+ <div className='layout-side-mask1'></div>
185
210
 
186
- <div className="header-logo" style={{ justifyContent: collapsed ? 'center' : '', paddingLeft: collapsed ? '0' : '' }}>
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="close-trigger"
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 menuList={menuList} collapsed={collapsed} type={type || ''} />
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="layout-menu">
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="hover"
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="rc-menu-submenu-popup"
290
+ popupClassName='rc-menu-submenu-popup'
256
291
  key={item.key}
257
- className="menu-item-content"
292
+ className='menu-item-content'
258
293
  title={
259
- <div className="sub-list">
260
- <div className="menu-item-inner">
261
- <span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>{item.icon}</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="rc-menu-submenu-popup"
279
- className="menu-item-content sub-li"
317
+ popupClassName='rc-menu-submenu-popup'
318
+ className='menu-item-content sub-li'
280
319
  key={child.key}
281
- title={<div className="sub-list">{!collapsed && <span className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}>{child.label}</span>}</div>}
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="grand-li">
293
- <div className="menu-item-content">{!collapsed && <span className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}>{grandChild.label}</span>}</div>
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="sub-li">
302
- <div className="menu-item-content">{!collapsed && <span className={`menu-item-label ${isSelected ? 'submenu-selected' : ''}`}>{child.label}</span>}</div>
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="menu-item-content">
381
+ <MenuItem key={item.key} className='menu-item-content'>
317
382
  <div>
318
- <span className={`menu-item-icon ${isSelected ? 'submenu-selected' : ''}`}>{item.icon}</span>
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="layout-main">
397
+ <div className='layout-main'>
331
398
  {!isHideHeader && (
332
- <div className="layout-header">
399
+ <div className='layout-header'>
333
400
  {appName && (
334
- <div className="app-name">
401
+ <div className='app-name'>
335
402
  <strong>{appName}</strong>
336
403
  </div>
337
404
  )}
338
405
 
339
- <div className="layout-header-fill" />
406
+ <div className='layout-header-fill' />
340
407
 
341
- <div className="layout-header-actions">
408
+ <div className='layout-header-actions'>
342
409
  {actions?.map((item, index) => {
343
410
  return (
344
- <div className="actions-item" key={index}>
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="bottom"
419
+ placement='bottom'
353
420
  content={
354
- <UserCard myWalletInfo={myWalletInfo} MyLoginInfo={MyLoginInfo} amountInfo={amountInfo} customAction={customAction} isCopied={isCopied} copyTextToClipboard={copyTextToClipboard} />
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="click"
358
- onOpenChange={(e) => {
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="layout-header-user">
372
- <img className="avatar" src={avatar} />
373
- <div className="name">{name}</div>
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="layout-content">{props.children}</div>
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 style={{ transform: !collapsed ? 'rotate(180deg)' : 'rotate(0deg)' }} viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="20" height="20">
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="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"
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
- function Search({ menuList, collapsed, type }: { menuList: any; collapsed: boolean; type: string }) {
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 ((navigator.platform.toLowerCase().includes('mac') ? event.metaKey : event.ctrlKey) && event.key.toLowerCase() === 'k') {
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
- setIsHovered(true)
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 [isHovered, setIsHovered] = useState(false)
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((item) => {
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
- setIsHovered(false)
569
+ setIsFocused(false)
465
570
  //如果搜索历史里面有这个item,就不再添加
466
- if (searchHistory.findIndex((i) => i.key === item.key) === -1) {
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
- //history.push(firstItem.key, '_self')
588
+ setSelectKey(findKeyPath(firstItem.key)) // 记住keypath
589
+ umiHistory.push(firstItem.key, '_self')
484
590
  }
485
591
  } else {
486
- // history.push(item.key, '_self')
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((i) => i.key !== item.key))
598
+ setSearchHistory(searchHistory.filter(i => i.key !== item.key))
492
599
  }
493
600
  return (
494
601
  <>
495
602
  {collapsed ? (
496
- <div className="search-mobile">
497
- <div className="search-icon">
498
- <svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="18" height="18">
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="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"
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 onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
508
- <div className="search">
509
- <input id="menu-input" value={searchTerm} onChange={(e) => handleSearch(e.target.value)} className="search-input" placeholder="搜索菜单" />
510
- <div className="search-icon">
511
- <svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="18" height="18">
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="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"
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 className="search-command" style={{ width: navigator.platform.toLowerCase().includes('mac') ? '' : '50px' }}>
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
- {isHovered && (
656
+ {isFocused && (
531
657
  <>
532
658
  {searchTerm ? (
533
- <List split={false} className="lists" size="small" bordered dataSource={searchResult} renderItem={(item) => <List.Item onClick={() => enter(item)}>{item.label}</List.Item>} />
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="lists"
538
- header="最近访问"
539
- size="small"
672
+ className='lists'
673
+ header='最近访问'
674
+ size='small'
540
675
  bordered
541
676
  dataSource={searchHistory}
542
- renderItem={(item) => {
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={() => {