dashboard-shell-shell 1.0.1000000116 → 1.0.1000000117
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/assets/images/action.svg +6 -0
- package/assets/images/pl/logo.png +0 -0
- package/assets/styles/base/_functions.scss +0 -0
- package/assets/styles/base/_mixins.scss +1 -1
- package/assets/styles/global/_button.scss +17 -10
- package/assets/styles/global/_form.scss +2 -2
- package/assets/styles/global/_labeled-input.scss +6 -2
- package/assets/styles/global/_select.scss +6 -7
- package/assets/styles/global/_table.scss +3 -2
- package/assets/styles/global/_tooltip.scss +8 -1
- package/assets/styles/themes/_dark.scss +2 -0
- package/assets/styles/themes/_light.scss +5 -2
- package/assets/styles/vendor/vue-select.scss +2 -1
- package/assets/translations/en-us.yaml +1 -3
- package/assets/translations/zh-hans.yaml +51 -28
- package/components/ActionDropdown.vue +1 -0
- package/components/ActionMenuShell.vue +6 -3
- package/components/BrandImage.vue +22 -0
- package/components/ClusterIconMenu.vue +1 -1
- package/components/CodeMirror.vue +1 -0
- package/components/CruResource.vue +1 -1
- package/components/CruResourceFooter.vue +1 -1
- package/components/ExplorerProjectsNamespaces.vue +4 -24
- package/components/GlobalRoleBindings.vue +112 -48
- package/components/IndentedPanel.vue +4 -10
- package/components/PromptRemove.vue +3 -3
- package/components/ResourceDetail/Masthead.vue +190 -242
- package/components/ResourceDetail/index.vue +20 -5
- package/components/ResourceList/Masthead.vue +146 -84
- package/components/ResourceList/ResourceLoadingIndicator.vue +5 -2
- package/components/ResourceTable.vue +76 -1
- package/components/SideNav.vue +66 -29
- package/components/SortableTable/THead.vue +6 -0
- package/components/SortableTable/index.vue +481 -388
- package/components/Tabbed/index.vue +4 -5
- package/components/auth/Principal.vue +3 -2
- package/components/auth/RoleDetailEdit.vue +58 -5
- package/components/auth/SelectPrincipal.vue +1 -0
- package/components/form/BannerSettings.vue +18 -16
- package/components/form/ChangePassword.vue +4 -4
- package/components/form/ColorInput.vue +32 -8
- package/components/form/Footer.vue +1 -1
- package/components/form/InputWithSelect.vue +2 -0
- package/components/form/KeyValue.vue +31 -7
- package/components/form/LabeledSelect.vue +178 -178
- package/components/form/Members/ClusterPermissionsEditor.vue +1 -2
- package/components/form/Members/MembershipEditor.vue +1 -1
- package/components/form/NameNsDescription.vue +24 -11
- package/components/form/Password.vue +6 -2
- package/components/form/ResourceQuota/Namespace.vue +1 -1
- package/components/form/ResourceQuota/NamespaceRow.vue +13 -10
- package/components/form/ResourceQuota/ProjectRow.vue +0 -1
- package/components/form/Select.vue +2 -2
- package/components/nav/Favorite.vue +5 -1
- package/components/nav/Group.vue +69 -23
- package/components/nav/Header.vue +82 -17
- package/components/nav/HeaderPageActionMenu.vue +1 -0
- package/components/nav/NamespaceFilter.vue +0 -3
- package/components/nav/TopLevelMenu.vue +182 -119
- package/components/nav/Type.vue +48 -11
- package/composables/useClickOutside.ts +1 -1
- package/config/product/auth.js +16 -7
- package/config/product/explorer.js +1 -1
- package/config/product/settings.js +17 -8
- package/config/settings.ts +28 -0
- package/edit/management.cattle.io.user.vue +17 -4
- package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
- package/edit/token.vue +1 -1
- package/list/harvesterhci.io.management.cluster.vue +17 -0
- package/list/management.cattle.io.setting.vue +22 -13
- package/list/management.cattle.io.user.vue +25 -14
- package/list/provisioning.cattle.io.cluster.vue +6 -7
- package/mixins/brand.js +17 -0
- package/package.json +1 -1
- package/pages/auth/login.vue +84 -29
- package/pages/c/_cluster/auth/roles/index.vue +61 -14
- package/pages/c/_cluster/settings/banners.vue +174 -101
- package/pages/c/_cluster/settings/brand.vue +348 -301
- package/pages/c/_cluster/settings/performance.vue +61 -38
- package/pages/home.vue +70 -21
- package/pages/prefs.vue +25 -23
- package/pkg/tsconfig.json +9 -9
- package/pkg/vue.config.js +1 -1
- package/promptRemove/mixin/roleDeletionCheck.js +2 -2
- package/scripts/clean +0 -0
- package/scripts/extension/bundle +0 -0
- package/scripts/extension/helm/scripts/package +0 -0
- package/scripts/extension/helm/scripts/patch +0 -0
- package/scripts/extension/helm/scripts/version +0 -0
- package/scripts/extension/helmpatch +0 -0
- package/scripts/extension/parse-tag-name +0 -0
- package/scripts/extension/publish +0 -0
- package/scripts/publish-shell.sh +86 -60
- package/scripts/serve-pkgs +0 -0
- package/scripts/sync-shell-deps +0 -0
- package/scripts/typegen.sh +44 -28
- package/store/i18n.js +5 -5
- package/store/prefs.js +17 -5
- package/store/type-map.js +2 -1
- package/types/shell/index.d.ts +1 -1
- package/utils/error.js +4 -0
- package/utils/router.js +3 -3
- package/vue.config.js +1 -6
- package/components/rancherResourceDetail/Masthead.vue +0 -769
- package/components/rancherResourceDetail/__tests__/Masthead.test.ts +0 -65
- package/components/rancherResourceDetail/index.vue +0 -591
- package/components/rancherResourceList/Masthead.vue +0 -375
- package/components/rancherResourceList/ResourceLoadingIndicator.vue +0 -140
- package/components/rancherResourceList/index.vue +0 -307
- package/components/rancherResourceList/resource-list.config.js +0 -7
- package/components/rancherResourceTable.vue +0 -783
- package/components/rancherSortableTable/THead.vue +0 -561
- package/components/rancherSortableTable/actions.js +0 -153
- package/components/rancherSortableTable/advanced-filtering.js +0 -272
- package/components/rancherSortableTable/debug.js +0 -117
- package/components/rancherSortableTable/filtering.js +0 -290
- package/components/rancherSortableTable/grouping.js +0 -48
- package/components/rancherSortableTable/index.vue +0 -2712
- package/components/rancherSortableTable/paging.js +0 -155
- package/components/rancherSortableTable/selection.js +0 -629
- package/components/rancherSortableTable/sortable-config.ts +0 -4
- package/components/rancherSortableTable/sorting.js +0 -129
- package/types/cloud-shell/index.d.ts +0 -11014
- /package/components/{rancherResourceList → ResourceList}/Masthead-btn.vue +0 -0
package/components/nav/Group.vue
CHANGED
|
@@ -8,6 +8,11 @@ export default {
|
|
|
8
8
|
emits: ['expand', 'close'],
|
|
9
9
|
|
|
10
10
|
props: {
|
|
11
|
+
loginName: {
|
|
12
|
+
type: String,
|
|
13
|
+
default: '',
|
|
14
|
+
},
|
|
15
|
+
|
|
11
16
|
depth: {
|
|
12
17
|
type: Number,
|
|
13
18
|
default: 0,
|
|
@@ -46,8 +51,16 @@ export default {
|
|
|
46
51
|
|
|
47
52
|
data() {
|
|
48
53
|
const id = (this.idPrefix || '') + this.group.name;
|
|
54
|
+
const icons = {
|
|
55
|
+
'虚拟机管理': 'icon-backupandsnapshot',
|
|
56
|
+
'网络管理': 'icon-networks',
|
|
57
|
+
'镜像管理': 'icon-imagelist',
|
|
58
|
+
'资源管理': 'icon-sorcetype',
|
|
59
|
+
'运维管理': 'icon-monitoringandlogging'
|
|
60
|
+
}
|
|
61
|
+
|
|
49
62
|
|
|
50
|
-
return { id, expanded: false };
|
|
63
|
+
return { id, expanded: false, icons };
|
|
51
64
|
},
|
|
52
65
|
|
|
53
66
|
computed: {
|
|
@@ -179,8 +192,7 @@ export default {
|
|
|
179
192
|
const withoutQuery = withoutHash.split('?')[0];
|
|
180
193
|
const itemFullPath = this.$router.resolve(item.route).fullPath;
|
|
181
194
|
|
|
182
|
-
|
|
183
|
-
if (matchesNavLevel || itemFullPath === withoutQuery || withoutQuery.includes(itemFullPath)) {
|
|
195
|
+
if (matchesNavLevel || itemFullPath === withoutQuery) {
|
|
184
196
|
return true;
|
|
185
197
|
} else if (parentPath && itemFullPath === parentPath) {
|
|
186
198
|
return true;
|
|
@@ -222,6 +234,7 @@ export default {
|
|
|
222
234
|
class="accordion"
|
|
223
235
|
:class="{[`depth-${depth}`]: true, 'expanded': isExpanded, 'has-children': hasChildren, 'group-highlight': isGroupActive}"
|
|
224
236
|
>
|
|
237
|
+
<!-- 分组标题区 -->
|
|
225
238
|
<div
|
|
226
239
|
v-if="showHeader"
|
|
227
240
|
class="header"
|
|
@@ -233,26 +246,37 @@ export default {
|
|
|
233
246
|
@keyup.enter="groupSelected()"
|
|
234
247
|
@keyup.space="groupSelected()"
|
|
235
248
|
>
|
|
249
|
+
|
|
250
|
+
<!-- 具名插槽 header,允许外部自定义标题内容 -->
|
|
236
251
|
<slot name="header">
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
252
|
+
|
|
253
|
+
<!-- 如果分组有概览页(overview) 跳转到第一个子路由 -->
|
|
254
|
+
<h6 v-if="hasOverview">
|
|
255
|
+
<router-link
|
|
256
|
+
class="menuRouterLink"
|
|
257
|
+
:to="group.children[0].route"
|
|
258
|
+
:exact="group.children[0].exact"
|
|
259
|
+
:tabindex="-1"
|
|
260
|
+
>
|
|
261
|
+
<i v-if="!group.labelDisplay || (group.labelDisplay && group.labelDisplay.indexOf('</i>') === -1)" class="icon" :class="icons[group.label] ? icons[group.label] + ' init_icon' : 'icon-globe'" style="color: var(--muted);width: 32px;" />
|
|
244
262
|
<span v-clean-html="group.labelDisplay || group.label" />
|
|
245
|
-
</
|
|
246
|
-
</
|
|
263
|
+
</router-link>
|
|
264
|
+
</h6>
|
|
265
|
+
<!-- 虚拟机管理:icon-backupandsnapshot -->
|
|
266
|
+
<!-- 网络管理:icon-networks -->
|
|
267
|
+
<!-- 镜像管理:icon-imagelist -->
|
|
268
|
+
<!-- 资源管理:icon-sorcetype -->
|
|
269
|
+
<!-- 运维管理:icon-monitoringandlogging -->
|
|
270
|
+
<!-- 没有概览页的情况 -->
|
|
247
271
|
<h6
|
|
248
272
|
v-else
|
|
249
|
-
@click="peek($event, true)"
|
|
250
273
|
>
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
<!-- <span v-clean-html="group.labelDisplay || group.label" /> -->
|
|
274
|
+
<i v-if="!group.labelDisplay || (group.labelDisplay && group.labelDisplay.indexOf('</i>') === -1)" class="icon" :class="icons[group.label] ? icons[group.label] + ' init_icon' : 'icon-globe'" style="color: var(--muted);width: 32px;" />
|
|
275
|
+
<span v-clean-html="group.labelDisplay || group.label" />
|
|
254
276
|
</h6>
|
|
255
277
|
</slot>
|
|
278
|
+
|
|
279
|
+
<!-- 折叠/展开图标 -->
|
|
256
280
|
<i
|
|
257
281
|
v-if="!onlyHasOverview && canCollapse"
|
|
258
282
|
class="icon toggle toggle-accordion"
|
|
@@ -265,6 +289,8 @@ export default {
|
|
|
265
289
|
@keyup.space="peek($event, true)"
|
|
266
290
|
/>
|
|
267
291
|
</div>
|
|
292
|
+
|
|
293
|
+
<!-- 子列表(Accordion 内容) -->
|
|
268
294
|
<ul
|
|
269
295
|
v-if="isExpanded"
|
|
270
296
|
class="list-unstyled body"
|
|
@@ -274,6 +300,7 @@ export default {
|
|
|
274
300
|
v-for="(child, idx) in group[childrenKey]"
|
|
275
301
|
:key="idx"
|
|
276
302
|
>
|
|
303
|
+
<!-- <template v-if="!(loginName && loginName !== 'admin' && child.label === '资源大盘')"></template> -->
|
|
277
304
|
<li
|
|
278
305
|
v-if="child.divider"
|
|
279
306
|
:key="idx"
|
|
@@ -319,14 +346,19 @@ export default {
|
|
|
319
346
|
position: relative;
|
|
320
347
|
cursor: pointer;
|
|
321
348
|
color: var(--body-text);
|
|
322
|
-
height:
|
|
323
|
-
outline: none;
|
|
349
|
+
height: 50px;
|
|
324
350
|
|
|
325
351
|
H6 {
|
|
326
352
|
color: var(--body-text);
|
|
327
353
|
user-select: none;
|
|
328
354
|
text-transform: none;
|
|
329
355
|
font-size: 14px;
|
|
356
|
+
.menuRouterLink {
|
|
357
|
+
color: var(--body-text);
|
|
358
|
+
user-select: none;
|
|
359
|
+
text-transform: none;
|
|
360
|
+
font-size: 14px;
|
|
361
|
+
}
|
|
330
362
|
}
|
|
331
363
|
|
|
332
364
|
> A {
|
|
@@ -367,6 +399,9 @@ export default {
|
|
|
367
399
|
/* padding: 8px 0 8px 16px;
|
|
368
400
|
font-weight: bold; */
|
|
369
401
|
color: var(--nav-hover-color);
|
|
402
|
+
.menuRouterLink {
|
|
403
|
+
color: var(--nav-hover-color);
|
|
404
|
+
}
|
|
370
405
|
}
|
|
371
406
|
I{
|
|
372
407
|
color: var(--nav-hover-color);
|
|
@@ -381,6 +416,9 @@ export default {
|
|
|
381
416
|
color: var(--nav-hover-color);
|
|
382
417
|
h6{
|
|
383
418
|
color: var(--nav-hover-color);
|
|
419
|
+
.menuRouterLink {
|
|
420
|
+
color: var(--nav-hover-color);
|
|
421
|
+
}
|
|
384
422
|
}
|
|
385
423
|
}
|
|
386
424
|
}
|
|
@@ -422,6 +460,7 @@ export default {
|
|
|
422
460
|
|
|
423
461
|
&.depth-1 {
|
|
424
462
|
> .header {
|
|
463
|
+
line-height: 50px;
|
|
425
464
|
> H6 {
|
|
426
465
|
font-size: 13px;
|
|
427
466
|
line-height: 16px;
|
|
@@ -431,11 +470,13 @@ export default {
|
|
|
431
470
|
padding: 9px 7px 8px 7px !important;
|
|
432
471
|
}
|
|
433
472
|
}
|
|
473
|
+
|
|
434
474
|
}
|
|
435
475
|
|
|
436
476
|
&:not(.depth-0) {
|
|
437
477
|
> .header {
|
|
438
|
-
padding-left:
|
|
478
|
+
padding-left: 30px;
|
|
479
|
+
line-height: 50px;
|
|
439
480
|
> H6 {
|
|
440
481
|
// Child groups that aren't linked themselves
|
|
441
482
|
display: inline-block;
|
|
@@ -446,7 +487,9 @@ export default {
|
|
|
446
487
|
position: absolute;
|
|
447
488
|
right: 0;
|
|
448
489
|
top: 0;
|
|
449
|
-
padding:
|
|
490
|
+
padding: 0px 20px 0px 0px !important;
|
|
491
|
+
user-select: none;
|
|
492
|
+
line-height: 50px;
|
|
450
493
|
}
|
|
451
494
|
}
|
|
452
495
|
}
|
|
@@ -459,6 +502,9 @@ export default {
|
|
|
459
502
|
A, A I {
|
|
460
503
|
/* color: var(--primary-hover-text); */
|
|
461
504
|
color: var(--nav-hover-color);
|
|
505
|
+
.menuRouterLink {
|
|
506
|
+
color: var(--nav-hover-color);
|
|
507
|
+
}
|
|
462
508
|
}
|
|
463
509
|
|
|
464
510
|
A {
|
|
@@ -488,9 +534,9 @@ export default {
|
|
|
488
534
|
}
|
|
489
535
|
}
|
|
490
536
|
}
|
|
491
|
-
|
|
537
|
+
|
|
538
|
+
.init_icon{
|
|
492
539
|
font-size: 32px;
|
|
493
|
-
|
|
494
|
-
color: #a8abb2;
|
|
540
|
+
padding-left: 0px;
|
|
495
541
|
}
|
|
496
542
|
</style>
|
|
@@ -277,6 +277,18 @@ export default {
|
|
|
277
277
|
},
|
|
278
278
|
|
|
279
279
|
methods: {
|
|
280
|
+
|
|
281
|
+
LogOutfn (type) {
|
|
282
|
+
sessionStorage.removeItem('TOPLEVELPERMISSIONS')
|
|
283
|
+
if (type === '1') {
|
|
284
|
+
this.$router.push({ name: 'account'})
|
|
285
|
+
} else if (type === '2') {
|
|
286
|
+
this.showSloModal()
|
|
287
|
+
} else if (type === '3') {
|
|
288
|
+
this.$router.push(this.generateLogoutRoute)
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
|
|
280
292
|
showSloModal() {
|
|
281
293
|
this.$store.dispatch('management/promptModal', {
|
|
282
294
|
component: 'SloDialog',
|
|
@@ -397,11 +409,15 @@ export default {
|
|
|
397
409
|
</script>
|
|
398
410
|
|
|
399
411
|
<template>
|
|
412
|
+
|
|
413
|
+
<!-- 整个页面的顶部 header -->
|
|
400
414
|
<header
|
|
401
415
|
ref="header"
|
|
402
416
|
data-testid="header"
|
|
403
417
|
>
|
|
404
418
|
<div>
|
|
419
|
+
|
|
420
|
+
<!-- 顶部一级菜单(根据不同产品/集群条件决定是否显示) -->
|
|
405
421
|
<TopLevelMenu v-if="isRancherInHarvester || isMultiCluster || !isSingleProduct" />
|
|
406
422
|
</div>
|
|
407
423
|
|
|
@@ -526,34 +542,54 @@ export default {
|
|
|
526
542
|
</div>
|
|
527
543
|
</div> -->
|
|
528
544
|
|
|
529
|
-
<!-- logo -->
|
|
530
|
-
|
|
545
|
+
<!-- ===== 左侧 logo 区域 ===== -->
|
|
546
|
+
<div class="menu-spacer">
|
|
547
|
+
|
|
548
|
+
<!-- 如果是单产品模式且不是 RancherInHarvester,就显示 logo 路由跳转 -->
|
|
531
549
|
<router-link
|
|
532
550
|
v-if="isSingleProduct && !isRancherInHarvester"
|
|
533
551
|
:to="singleProductLogoRoute"
|
|
534
552
|
>
|
|
535
|
-
|
|
553
|
+
|
|
554
|
+
<!-- 显示用户头像或 logo 图片 -->
|
|
555
|
+
<!-- <img
|
|
536
556
|
:src="userIcon"
|
|
537
|
-
>
|
|
557
|
+
> -->
|
|
538
558
|
</router-link>
|
|
539
559
|
</div>
|
|
540
|
-
|
|
560
|
+
|
|
561
|
+
<!-- ===== 中间占位符(把左右内容分开) ===== -->
|
|
541
562
|
<div class="spacer" />
|
|
542
563
|
|
|
564
|
+
<!-- ===== 右侧功能区域 ===== -->
|
|
543
565
|
<div class="rd-header-right">
|
|
566
|
+
|
|
567
|
+
<!-- 动态插入右侧自定义组件(例如插件扩展的 header) -->
|
|
544
568
|
<component :is="navHeaderRight" />
|
|
569
|
+
|
|
570
|
+
<!-- ===== 集群/命名空间过滤器 ===== -->
|
|
545
571
|
<div
|
|
546
572
|
v-if="showFilter"
|
|
547
573
|
class="top"
|
|
548
574
|
>
|
|
575
|
+
|
|
576
|
+
<!-- 如果集群就绪 + 当前产品支持命名空间过滤器 或 Explorer 模式 -->
|
|
549
577
|
<NamespaceFilter v-if="clusterReady && currentProduct && (currentProduct.showNamespaceFilter || isExplorer)" />
|
|
578
|
+
|
|
579
|
+
<!-- 否则显示工作空间切换器 -->
|
|
550
580
|
<WorkspaceSwitcher v-else-if="clusterReady && currentProduct && currentProduct.showWorkspaceSwitcher" />
|
|
551
581
|
</div>
|
|
582
|
+
|
|
583
|
+
<!-- ===== 集群相关按钮(仅在有集群且不是 simple 模式下显示) ===== -->
|
|
552
584
|
<div
|
|
553
585
|
v-if="currentCluster && !simple"
|
|
554
586
|
class="header-buttons"
|
|
555
587
|
>
|
|
588
|
+
|
|
589
|
+
<!-- 如果当前产品支持集群切换器 -->
|
|
556
590
|
<template v-if="currentProduct && currentProduct.showClusterSwitcher">
|
|
591
|
+
|
|
592
|
+
<!-- 导入 YAML 按钮 -->
|
|
557
593
|
<button
|
|
558
594
|
v-if="showImportYaml"
|
|
559
595
|
v-clean-tooltip="t('nav.import')"
|
|
@@ -568,6 +604,8 @@ export default {
|
|
|
568
604
|
>
|
|
569
605
|
<i class="icon icon-upload icon-lg" />
|
|
570
606
|
</button>
|
|
607
|
+
|
|
608
|
+
<!-- 导入 YAML 弹窗 -->
|
|
571
609
|
<app-modal
|
|
572
610
|
v-if="showImportModal"
|
|
573
611
|
class="import-modal"
|
|
@@ -583,6 +621,7 @@ export default {
|
|
|
583
621
|
/>
|
|
584
622
|
</app-modal>
|
|
585
623
|
|
|
624
|
+
<!-- KubeShell 终端按钮 -->
|
|
586
625
|
<button
|
|
587
626
|
v-if="showKubeShell"
|
|
588
627
|
id="btn-kubectl"
|
|
@@ -600,6 +639,7 @@ export default {
|
|
|
600
639
|
<i class="icon icon-terminal icon-lg" />
|
|
601
640
|
</button>
|
|
602
641
|
|
|
642
|
+
<!-- 下载 kubeconfig 按钮 -->
|
|
603
643
|
<button
|
|
604
644
|
v-if="showKubeConfig"
|
|
605
645
|
v-clean-tooltip="t('nav.kubeconfig.download')"
|
|
@@ -615,6 +655,7 @@ export default {
|
|
|
615
655
|
<i class="icon icon-file icon-lg" />
|
|
616
656
|
</button>
|
|
617
657
|
|
|
658
|
+
<!-- 复制 kubeconfig 按钮 -->
|
|
618
659
|
<button
|
|
619
660
|
v-if="showCopyConfig"
|
|
620
661
|
v-clean-tooltip="t('nav.kubeconfig.copy')"
|
|
@@ -627,10 +668,14 @@ export default {
|
|
|
627
668
|
:aria-label="t('nav.kubeconfig.copy')"
|
|
628
669
|
@click="copyKubeConfig($event)"
|
|
629
670
|
>
|
|
671
|
+
|
|
672
|
+
<!-- 点击复制后显示对勾 -->
|
|
630
673
|
<i
|
|
631
674
|
v-if="kubeConfigCopying"
|
|
632
675
|
class="icon icon-checkmark icon-lg"
|
|
633
676
|
/>
|
|
677
|
+
|
|
678
|
+
<!-- 未复制状态显示复制图标 -->
|
|
634
679
|
<i
|
|
635
680
|
v-else
|
|
636
681
|
class="icon icon-copy icon-lg"
|
|
@@ -638,6 +683,7 @@ export default {
|
|
|
638
683
|
</button>
|
|
639
684
|
</template>
|
|
640
685
|
|
|
686
|
+
<!-- 资源搜索按钮 -->
|
|
641
687
|
<button
|
|
642
688
|
v-if="showSearch"
|
|
643
689
|
id="header-btn-search"
|
|
@@ -654,6 +700,8 @@ export default {
|
|
|
654
700
|
>
|
|
655
701
|
<i class="icon icon-search icon-lg" />
|
|
656
702
|
</button>
|
|
703
|
+
|
|
704
|
+
<!-- 搜索弹窗 -->
|
|
657
705
|
<app-modal
|
|
658
706
|
v-if="showSearch && showSearchModal"
|
|
659
707
|
class="search-modal"
|
|
@@ -668,7 +716,7 @@ export default {
|
|
|
668
716
|
</app-modal>
|
|
669
717
|
</div>
|
|
670
718
|
|
|
671
|
-
<!--
|
|
719
|
+
<!-- ===== 插件扩展按钮区 ===== -->
|
|
672
720
|
<div
|
|
673
721
|
v-if="extensionHeaderActions.length"
|
|
674
722
|
class="header-buttons"
|
|
@@ -697,12 +745,16 @@ export default {
|
|
|
697
745
|
</button>
|
|
698
746
|
</div>
|
|
699
747
|
|
|
748
|
+
<!-- ===== 用户菜单(右上角头像 + 下拉) ===== -->
|
|
700
749
|
<div class="center-self">
|
|
701
750
|
<header-page-action-menu v-if="showPageActions" />
|
|
751
|
+
|
|
702
752
|
<rc-dropdown
|
|
703
753
|
v-if="showUserMenu"
|
|
704
754
|
:aria-label="t('nav.userMenu.label')"
|
|
705
755
|
>
|
|
756
|
+
|
|
757
|
+
<!-- 头像触发按钮 -->
|
|
706
758
|
<rc-dropdown-trigger
|
|
707
759
|
ghost
|
|
708
760
|
small
|
|
@@ -721,9 +773,11 @@ export default {
|
|
|
721
773
|
v-else
|
|
722
774
|
class="icon icon-user icon-3x avatar"
|
|
723
775
|
/> -->
|
|
724
|
-
<i class="icon icon-usericon" />
|
|
776
|
+
<i class="icon icon-usericon" style="padding-bottom: 5px;" />
|
|
725
777
|
<span class="login-name">{{ principal.loginName }}</span>
|
|
726
778
|
</rc-dropdown-trigger>
|
|
779
|
+
|
|
780
|
+
<!-- 下拉菜单内容 -->
|
|
727
781
|
<template #dropdownCollection>
|
|
728
782
|
<!-- <template v-if="authEnabled">
|
|
729
783
|
<div class="user-info">
|
|
@@ -744,21 +798,27 @@ export default {
|
|
|
744
798
|
>
|
|
745
799
|
{{ t('nav.userMenu.preferences') }}
|
|
746
800
|
</rc-dropdown-item> -->
|
|
801
|
+
|
|
802
|
+
<!-- 退出登录(支持 SLO 弹窗) -->
|
|
747
803
|
<rc-dropdown-item
|
|
748
804
|
v-if="showAccountAndApiKeyLink"
|
|
749
|
-
@click="
|
|
805
|
+
@click="LogOutfn('1')"
|
|
750
806
|
>
|
|
751
807
|
{{ t('nav.userMenu.accountAndKeys', {}, true) }}
|
|
752
808
|
</rc-dropdown-item>
|
|
809
|
+
|
|
810
|
+
<!-- 普通退出登录 -->
|
|
753
811
|
<rc-dropdown-item
|
|
754
812
|
v-if="authEnabled && shouldShowSloLogoutModal"
|
|
755
|
-
@click="
|
|
813
|
+
@click="LogOutfn('2')"
|
|
756
814
|
>
|
|
757
815
|
{{ t('nav.userMenu.logOut') }}
|
|
758
816
|
</rc-dropdown-item>
|
|
817
|
+
|
|
818
|
+
<!-- 普通退出登录 -->
|
|
759
819
|
<rc-dropdown-item
|
|
760
820
|
v-else-if="authEnabled"
|
|
761
|
-
@click="
|
|
821
|
+
@click="LogOutfn('3')"
|
|
762
822
|
>
|
|
763
823
|
{{ t('nav.userMenu.logOut') }}
|
|
764
824
|
</rc-dropdown-item>
|
|
@@ -944,6 +1004,8 @@ export default {
|
|
|
944
1004
|
// Spacing between header buttons
|
|
945
1005
|
.btn:not(:last-of-type) {
|
|
946
1006
|
margin-right: 10px;
|
|
1007
|
+
width: 30px;
|
|
1008
|
+
min-width: 30px;
|
|
947
1009
|
}
|
|
948
1010
|
|
|
949
1011
|
.btn:focus {
|
|
@@ -965,6 +1027,8 @@ export default {
|
|
|
965
1027
|
|
|
966
1028
|
.header-btn {
|
|
967
1029
|
width: 40px;
|
|
1030
|
+
display: flex;
|
|
1031
|
+
align-items: center;
|
|
968
1032
|
}
|
|
969
1033
|
|
|
970
1034
|
:deep() div .btn.role-tertiary {
|
|
@@ -972,19 +1036,21 @@ export default {
|
|
|
972
1036
|
border: none;
|
|
973
1037
|
background: var(--header-btn-bg);
|
|
974
1038
|
color: var(--header-btn-text);
|
|
975
|
-
padding: 0 10px;
|
|
1039
|
+
padding: 0 15px 0 10px;
|
|
976
1040
|
line-height: 32px;
|
|
977
1041
|
min-height: 32px;
|
|
1042
|
+
width: 30px;
|
|
1043
|
+
min-width: 30px;
|
|
978
1044
|
|
|
979
1045
|
i {
|
|
980
1046
|
// Ideally same height as the parent button, but this means tooltip needs adjusting (which is it's own can of worms)
|
|
981
1047
|
line-height: 20px;
|
|
982
1048
|
}
|
|
983
1049
|
|
|
984
|
-
&:hover {
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
}
|
|
1050
|
+
// &:hover {
|
|
1051
|
+
// background: var(--primary);
|
|
1052
|
+
// color: #fff;
|
|
1053
|
+
// }
|
|
988
1054
|
|
|
989
1055
|
&[disabled=disabled] {
|
|
990
1056
|
background-color: rgba(0,0,0,0.25) !important;
|
|
@@ -1067,7 +1133,6 @@ export default {
|
|
|
1067
1133
|
> .center-self {
|
|
1068
1134
|
align-self: center;
|
|
1069
1135
|
display: flex;
|
|
1070
|
-
gap: 1rem;
|
|
1071
1136
|
align-items: center;
|
|
1072
1137
|
padding-right: 1rem;
|
|
1073
1138
|
}
|
|
@@ -1176,7 +1241,7 @@ export default {
|
|
|
1176
1241
|
.login-name{
|
|
1177
1242
|
font-size: 14px;
|
|
1178
1243
|
margin-left: 5px;
|
|
1179
|
-
margin-top: 5px;
|
|
1244
|
+
// margin-top: 5px;
|
|
1180
1245
|
line-height: 20px;
|
|
1181
1246
|
}
|
|
1182
1247
|
</style>
|
|
@@ -145,9 +145,6 @@ export default {
|
|
|
145
145
|
|
|
146
146
|
const params = { ...this.$route.params };
|
|
147
147
|
let resource = params.resource;
|
|
148
|
-
if (params.resource) {
|
|
149
|
-
resource = resource
|
|
150
|
-
}
|
|
151
148
|
|
|
152
149
|
// Sometimes, different pages may have different namespaces to filter
|
|
153
150
|
const notFilterNamespaces = this.$store.getters[`type-map/optionsFor`](resource).notFilterNamespace || [];
|