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