dashboard-shell-shell 3.0.5-test.12 → 3.0.5-test.14
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/icons/iconfont.css +4 -1
- package/assets/images/pl/dark/logo.png +0 -0
- package/assets/styles/global/_select.scss +1 -1
- package/assets/styles/global/_tooltip.scss +5 -1
- package/assets/translations/zh-hans.yaml +5 -4
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +22 -19
- package/components/ExplorerMembers.vue +10 -1
- package/components/GlobalRoleBindings.vue +1 -58
- package/components/Resource/Detail/TitleBar/index.vue +26 -23
- package/components/ResourceDetail/Masthead/index.vue +1 -1
- package/components/ResourceDetail/Masthead/latest.vue +1 -1
- package/components/ResourceDetail/Masthead/legacy.vue +4 -4
- package/components/SortableTable/index.vue +2 -2
- package/components/Tabbed/index.vue +5 -1
- package/components/auth/Principal.vue +8 -3
- package/components/auth/RoleDetailEdit.vue +1 -1
- package/components/form/ArrayList.vue +163 -147
- package/components/form/Command.vue +4 -5
- package/components/form/Footer.vue +1 -0
- package/components/form/HealthCheck.vue +0 -2
- package/components/form/HookOption.vue +83 -58
- package/components/form/InputWithSelect.vue +8 -7
- package/components/form/KeyValue.vue +16 -2
- package/components/form/Labels.vue +1 -1
- package/components/form/MatchExpressions.vue +3 -4
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/Networking.vue +0 -1
- package/components/form/NodeAffinity.vue +29 -28
- package/components/form/PodAffinity.vue +19 -21
- package/components/form/Probe.vue +15 -11
- package/components/form/ResourceQuota/NamespaceRow.vue +1 -1
- package/components/form/ResourceQuota/Project.vue +1 -1
- package/components/form/ResourceQuota/ProjectRow.vue +1 -1
- package/components/form/ResourceSelector.vue +1 -1
- package/components/form/ServiceNameSelect.vue +1 -3
- package/components/form/ServicePorts.vue +149 -75
- package/components/form/Tolerations.vue +12 -9
- package/components/form/ValueFromResource.vue +110 -96
- package/components/nav/NamespaceFilter.vue +14 -19
- package/components/nav/TopLevelMenu.vue +98 -125
- package/config/router/navigation-guards/index.js +52 -3
- package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +3 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
- package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
- package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
- package/edit/networking.k8s.io.ingress/Certificate.vue +7 -5
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
- package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
- package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -3
- package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +12 -11
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
- package/edit/secret/index.vue +2 -2
- package/edit/service.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +10 -8
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
- package/edit/workload/Job.vue +27 -29
- package/edit/workload/Upgrading.vue +3 -3
- package/edit/workload/index.vue +2 -2
- package/edit/workload/storage/Mount.vue +1 -0
- package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
- package/edit/workload/storage/azureDisk.vue +14 -10
- package/edit/workload/storage/azureFile.vue +9 -7
- package/edit/workload/storage/csi/index.vue +6 -9
- package/edit/workload/storage/emptyDir.vue +7 -5
- package/edit/workload/storage/gcePersistentDisk.vue +9 -7
- package/edit/workload/storage/hostPath.vue +7 -5
- package/edit/workload/storage/nfs.vue +8 -6
- package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +18 -15
- package/edit/workload/storage/secret.vue +9 -6
- package/edit/workload/storage/vsphereVolume.vue +11 -7
- package/initialize/app-extended.js +7 -1
- package/package.json +1 -1
- package/pages/account/index.vue +90 -56
- package/pages/home.vue +3 -4
- package/rancher-components/Banner/Banner.vue +4 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +31 -2
- package/store/i18n.js +1 -0
- package/utils/errorTranslate.json +82 -2
|
@@ -748,7 +748,7 @@ export default {
|
|
|
748
748
|
data-testid="namespaces-values-label"
|
|
749
749
|
class="ns-values"
|
|
750
750
|
>
|
|
751
|
-
{{ value[0].label }}
|
|
751
|
+
{{ value[0].label.replace('harvester', 'cloud') }}
|
|
752
752
|
</div>
|
|
753
753
|
|
|
754
754
|
<!-- All the selected namespaces -->
|
|
@@ -774,20 +774,18 @@ export default {
|
|
|
774
774
|
:data-testid="`namespaces-value-${j}`"
|
|
775
775
|
class="ns-value"
|
|
776
776
|
>
|
|
777
|
-
<div>{{ ns.label }}</div>
|
|
777
|
+
<div>{{ ns.label.replace('harvester', 'cloud') }}</div>
|
|
778
778
|
<!-- block user from removing the last selection if ns forced filtering is on -->
|
|
779
|
-
<
|
|
779
|
+
<i
|
|
780
780
|
v-if="!namespaceFilterMode || value.length > 1"
|
|
781
781
|
small
|
|
782
782
|
ghost
|
|
783
|
-
class="ns-chip-button"
|
|
783
|
+
class="ns-chip-button icon icon-close"
|
|
784
784
|
:data-testid="`namespaces-values-close-${j}`"
|
|
785
785
|
@click="removeOption(ns, $event)"
|
|
786
786
|
@keydown.enter.space.stop="removeOption(ns, $event)"
|
|
787
787
|
@mousedown="handleValueMouseDown(ns, $event)"
|
|
788
|
-
|
|
789
|
-
<i class="icon icon-close" />
|
|
790
|
-
</RcButton>
|
|
788
|
+
/>
|
|
791
789
|
</div>
|
|
792
790
|
</div>
|
|
793
791
|
|
|
@@ -836,19 +834,15 @@ export default {
|
|
|
836
834
|
@click="focusFilter"
|
|
837
835
|
@keydown="inputKeyHandler($event)"
|
|
838
836
|
>
|
|
839
|
-
<
|
|
837
|
+
<i
|
|
840
838
|
v-if="hasFilter"
|
|
841
839
|
small
|
|
842
840
|
ghost
|
|
843
|
-
class="ns-filter-clear"
|
|
841
|
+
class="ns-filter-clear icon icon-close"
|
|
844
842
|
:aria-label="t('namespaceFilter.button.clearFilter')"
|
|
845
843
|
@click="clearFilter"
|
|
846
844
|
@keydown.enter.stop="clearFilter"
|
|
847
|
-
|
|
848
|
-
<i
|
|
849
|
-
class="icon icon-close"
|
|
850
|
-
/>
|
|
851
|
-
</RcButton>
|
|
845
|
+
/>
|
|
852
846
|
</div>
|
|
853
847
|
<div
|
|
854
848
|
v-if="namespaceFilterMode"
|
|
@@ -859,7 +853,7 @@ export default {
|
|
|
859
853
|
class="icon icon-info"
|
|
860
854
|
/>
|
|
861
855
|
</div>
|
|
862
|
-
<
|
|
856
|
+
<div
|
|
863
857
|
v-else
|
|
864
858
|
small
|
|
865
859
|
ghost
|
|
@@ -871,8 +865,9 @@ export default {
|
|
|
871
865
|
>
|
|
872
866
|
<i
|
|
873
867
|
class="icon icon-close"
|
|
868
|
+
@click="clear()"
|
|
874
869
|
/>
|
|
875
|
-
</
|
|
870
|
+
</div>
|
|
876
871
|
</div>
|
|
877
872
|
<div class="ns-divider mt-0" />
|
|
878
873
|
<div
|
|
@@ -889,12 +884,12 @@ export default {
|
|
|
889
884
|
v-for="(opt, i) in cachedFiltered"
|
|
890
885
|
:key="opt.id"
|
|
891
886
|
>
|
|
892
|
-
<
|
|
887
|
+
<div
|
|
893
888
|
v-if="opt.kind === NAMESPACE_FILTER_KINDS.DIVIDER"
|
|
894
889
|
role="separator"
|
|
895
890
|
aria-orientation="horizontal"
|
|
896
891
|
class="ns-divider"
|
|
897
|
-
|
|
892
|
+
/>
|
|
898
893
|
<div
|
|
899
894
|
v-else
|
|
900
895
|
:id="opt.elementId"
|
|
@@ -919,7 +914,7 @@ export default {
|
|
|
919
914
|
v-if="opt.kind === NAMESPACE_FILTER_KINDS.NAMESPACE"
|
|
920
915
|
class="icon icon-folder"
|
|
921
916
|
/>
|
|
922
|
-
<div>{{ opt.label }}</div>
|
|
917
|
+
<div>{{ opt.label.replace('harvester', 'cloud') }}</div>
|
|
923
918
|
<i
|
|
924
919
|
v-if="opt.selected"
|
|
925
920
|
class="icon icon-checkmark"
|
|
@@ -52,10 +52,7 @@ export default {
|
|
|
52
52
|
helper.update(args);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS') || ''
|
|
56
|
-
|
|
57
55
|
return {
|
|
58
|
-
topLevelPermissions,
|
|
59
56
|
shown: false,
|
|
60
57
|
displayVersion,
|
|
61
58
|
fullVersion,
|
|
@@ -523,7 +520,7 @@ export default {
|
|
|
523
520
|
</div>
|
|
524
521
|
|
|
525
522
|
<!-- 品牌Logo -->
|
|
526
|
-
<div
|
|
523
|
+
<div class="side-menu-logo">
|
|
527
524
|
<BrandImage
|
|
528
525
|
data-testid="side-menu__brand-img"
|
|
529
526
|
:alt="t('nav.alt.mainMenuRancherLogo')"
|
|
@@ -534,7 +531,7 @@ export default {
|
|
|
534
531
|
|
|
535
532
|
<!-- ====================== 菜单内容区 ====================== -->
|
|
536
533
|
<div class="body">
|
|
537
|
-
<div
|
|
534
|
+
<div>
|
|
538
535
|
|
|
539
536
|
<!-- 首页按钮 -->
|
|
540
537
|
<div @click="hide()">
|
|
@@ -650,7 +647,7 @@ export default {
|
|
|
650
647
|
</template>
|
|
651
648
|
|
|
652
649
|
<!-- ====================== 集群列表 ====================== -->
|
|
653
|
-
<template v-if="
|
|
650
|
+
<template v-if="!!allClustersCount">
|
|
654
651
|
<div
|
|
655
652
|
ref="clusterList"
|
|
656
653
|
class="clusters"
|
|
@@ -833,7 +830,7 @@ export default {
|
|
|
833
830
|
</div>
|
|
834
831
|
</div>
|
|
835
832
|
|
|
836
|
-
<!--
|
|
833
|
+
<!-- See all clusters -->
|
|
837
834
|
<router-link
|
|
838
835
|
v-if="allClustersCount > maxClustersToShow"
|
|
839
836
|
class="clusters-all"
|
|
@@ -853,128 +850,104 @@ export default {
|
|
|
853
850
|
</template>
|
|
854
851
|
|
|
855
852
|
<!-- ====================== 多集群应用区 ====================== -->
|
|
856
|
-
<div
|
|
853
|
+
<div class="category">
|
|
857
854
|
<!-- 多集群应用 -->
|
|
858
855
|
<template v-if="multiClusterApps.length">
|
|
859
|
-
<
|
|
860
|
-
|
|
861
|
-
|
|
856
|
+
<div
|
|
857
|
+
class="category-title"
|
|
858
|
+
>
|
|
859
|
+
<hr role="none">
|
|
860
|
+
<span>
|
|
861
|
+
{{ t('nav.categories.multiCluster') }}
|
|
862
|
+
</span>
|
|
863
|
+
</div>
|
|
864
|
+
<div
|
|
865
|
+
v-for="(a, i) in appBar.multiClusterApps"
|
|
866
|
+
:key="i"
|
|
867
|
+
@click="hide()"
|
|
868
|
+
>
|
|
869
|
+
<router-link
|
|
870
|
+
class="option"
|
|
871
|
+
:class="{'active-menu-link': a.isMenuActive }"
|
|
872
|
+
:to="a.to"
|
|
873
|
+
role="link"
|
|
874
|
+
:aria-label="`${t('nav.ariaLabel.multiClusterApps')} ${ a.label }`"
|
|
862
875
|
>
|
|
863
|
-
<
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
<
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
>
|
|
873
|
-
<router-link
|
|
874
|
-
class="option"
|
|
875
|
-
:class="{'active-menu-link': a.isMenuActive }"
|
|
876
|
-
:to="a.to"
|
|
877
|
-
role="link"
|
|
878
|
-
:aria-label="`${t('nav.ariaLabel.multiClusterApps')} ${ a.label }`"
|
|
879
|
-
>
|
|
880
|
-
<IconOrSvg
|
|
881
|
-
v-clean-tooltip="getTooltipConfig(a.label)"
|
|
882
|
-
class="app-icon"
|
|
883
|
-
:icon="a.icon"
|
|
884
|
-
:src="a.svg"
|
|
885
|
-
/>
|
|
886
|
-
<span class="option-link">{{ a.label }}</span>
|
|
887
|
-
</router-link>
|
|
888
|
-
</div>
|
|
889
|
-
</template>
|
|
890
|
-
</template>
|
|
891
|
-
<template v-else>
|
|
892
|
-
<template v-for="(a, i) in appBar.multiClusterApps" :key="i">
|
|
893
|
-
<div
|
|
894
|
-
v-if="a.value === 'harvesterManager'"
|
|
895
|
-
@click="hide()"
|
|
896
|
-
>
|
|
897
|
-
<router-link
|
|
898
|
-
class="option"
|
|
899
|
-
:class="{'active-menu-link': a.isMenuActive }"
|
|
900
|
-
:to="a.to"
|
|
901
|
-
role="link"
|
|
902
|
-
:aria-label="`${t('nav.ariaLabel.multiClusterApps')} ${ a.label }`"
|
|
903
|
-
>
|
|
904
|
-
<IconOrSvg
|
|
905
|
-
v-clean-tooltip="getTooltipConfig(a.label)"
|
|
906
|
-
class="app-icon"
|
|
907
|
-
:icon="a.icon"
|
|
908
|
-
:src="a.svg"
|
|
909
|
-
/>
|
|
910
|
-
<span class="option-link">{{ a.label }}</span>
|
|
911
|
-
</router-link>
|
|
912
|
-
</div>
|
|
913
|
-
</template>
|
|
914
|
-
</template>
|
|
876
|
+
<IconOrSvg
|
|
877
|
+
v-clean-tooltip="getTooltipConfig(a.label)"
|
|
878
|
+
class="app-icon"
|
|
879
|
+
:icon="a.icon"
|
|
880
|
+
:src="a.svg"
|
|
881
|
+
/>
|
|
882
|
+
<span class="option-link">{{ a.label }}</span>
|
|
883
|
+
</router-link>
|
|
884
|
+
</div>
|
|
915
885
|
</template>
|
|
916
886
|
|
|
917
|
-
<!--
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
887
|
+
<!-- Configuration apps menu -->
|
|
888
|
+
<template v-if="configurationApps.length">
|
|
889
|
+
<div
|
|
890
|
+
class="category-title"
|
|
891
|
+
>
|
|
892
|
+
<hr role="none">
|
|
893
|
+
<span>
|
|
894
|
+
{{ t('nav.categories.configuration') }}
|
|
895
|
+
</span>
|
|
896
|
+
</div>
|
|
897
|
+
<div
|
|
898
|
+
v-for="(a, i) in appBar.configurationApps"
|
|
899
|
+
:key="i"
|
|
900
|
+
@click="hide()"
|
|
901
|
+
>
|
|
902
|
+
<router-link
|
|
903
|
+
class="option"
|
|
904
|
+
:class="{'active-menu-link': a.isMenuActive }"
|
|
905
|
+
:to="a.to"
|
|
906
|
+
role="link"
|
|
907
|
+
:aria-label="`${t('nav.ariaLabel.configurationApps')} ${ a.label }`"
|
|
908
|
+
>
|
|
909
|
+
<IconOrSvg
|
|
910
|
+
v-clean-tooltip="getTooltipConfig(a.label)"
|
|
911
|
+
class="app-icon"
|
|
912
|
+
:icon="a.icon"
|
|
913
|
+
:src="a.svg"
|
|
914
|
+
/>
|
|
915
|
+
<div>{{ a.label }}</div>
|
|
916
|
+
</router-link>
|
|
917
|
+
</div>
|
|
918
|
+
</template>
|
|
919
|
+
</div>
|
|
920
|
+
</div>
|
|
921
|
+
|
|
922
|
+
<!-- Footer -->
|
|
923
|
+
<div
|
|
924
|
+
class="footer"
|
|
925
|
+
>
|
|
926
|
+
<div
|
|
927
|
+
v-if="canEditSettings"
|
|
928
|
+
class="support"
|
|
929
|
+
@click="hide()"
|
|
930
|
+
>
|
|
931
|
+
<router-link
|
|
932
|
+
:to="{name: 'support'}"
|
|
933
|
+
role="link"
|
|
934
|
+
:aria-label="t('nav.ariaLabel.support')"
|
|
935
|
+
>
|
|
936
|
+
{{ t('nav.support', {hasSupport}) }}
|
|
937
|
+
</router-link>
|
|
938
|
+
</div>
|
|
939
|
+
<div
|
|
940
|
+
class="version"
|
|
941
|
+
:class="{'version-small': largeAboutText}"
|
|
942
|
+
@click="hide()"
|
|
943
|
+
>
|
|
944
|
+
<router-link
|
|
945
|
+
:to="{ name: 'about' }"
|
|
946
|
+
role="link"
|
|
947
|
+
:aria-label="t('nav.ariaLabel.about')"
|
|
948
|
+
>
|
|
949
|
+
{{ aboutText }}
|
|
950
|
+
</router-link>
|
|
978
951
|
</div>
|
|
979
952
|
</div>
|
|
980
953
|
</div>
|
|
@@ -1644,7 +1617,7 @@ export default {
|
|
|
1644
1617
|
}
|
|
1645
1618
|
|
|
1646
1619
|
:deep() .v-popper__arrow-container {
|
|
1647
|
-
display: none;
|
|
1620
|
+
display: none !important;
|
|
1648
1621
|
}
|
|
1649
1622
|
|
|
1650
1623
|
:deep() .v-popper:focus {
|
|
@@ -11,13 +11,62 @@ import { install as installPageTitle } from '@shell/config/router/navigation-gua
|
|
|
11
11
|
import { install as installServerUpgradeGrowl } from '@shell/config/router/navigation-guards/server-upgrade-growl';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Install
|
|
14
|
+
* Install router navigation guards
|
|
15
|
+
* 1. 保留原有导航守卫顺序
|
|
16
|
+
* 2. 不在 beforeEach 改 params,只在 push/replace & afterEach 改 URL
|
|
15
17
|
*/
|
|
16
18
|
export function installNavigationGuards(router, context) {
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
+
// 最早执行:保证进入逻辑时 params 始终是 harvester
|
|
20
|
+
router.beforeEach((to, from, next) => {
|
|
21
|
+
let changed = false;
|
|
22
|
+
const params = { ...to.params };
|
|
23
|
+
|
|
24
|
+
if (params?.product?.includes('cloud')) {
|
|
25
|
+
params.product = params.product.replace(/cloud/g, 'harvester');
|
|
26
|
+
changed = true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (params?.cluster?.includes('cloud')) {
|
|
30
|
+
params.cluster = params.cluster.replace(/cloud/g, 'harvester');
|
|
31
|
+
changed = true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (params?.resource?.includes('cloud')) {
|
|
35
|
+
params.resource = params.resource.replace(/cloud/g, 'harvester');
|
|
36
|
+
changed = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (changed) {
|
|
40
|
+
// 触发路由重定向
|
|
41
|
+
return next({ ...to, params });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
next();
|
|
45
|
+
});
|
|
46
|
+
|
|
19
47
|
|
|
20
48
|
const navigationGuardInstallers = [installLoadInitialSettings, installAttemptFirstLogin, installAuthentication, installProducts, installClusters, installRuntimeExtensionRoute, installI18N, installHandleInstallRedirect, installPageTitle, installRecordLastRoute, installServerUpgradeGrowl];
|
|
21
49
|
|
|
22
50
|
navigationGuardInstallers.forEach((installer) => installer(router, context));
|
|
51
|
+
|
|
52
|
+
// 🔹 最后执行:只改地址栏,不改内部
|
|
53
|
+
router.afterEach((to) => {
|
|
54
|
+
const base = router.options.history?.base || ''; // 获取 router base,防止丢失
|
|
55
|
+
let cloudPath = to.fullPath.replace(/harvester/g, 'cloud');
|
|
56
|
+
|
|
57
|
+
// fullPath 可能已经不带 base,需要拼回去
|
|
58
|
+
if (!cloudPath.startsWith(base)) {
|
|
59
|
+
cloudPath = base + cloudPath;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 获取当前地址栏完整 URL(path + search + hash)
|
|
63
|
+
const currentLocation = window.location.pathname + window.location.search + window.location.hash;
|
|
64
|
+
|
|
65
|
+
// 只有在地址栏实际不同的时候才替换,避免死循环
|
|
66
|
+
if (cloudPath !== currentLocation) {
|
|
67
|
+
console.info('[URL Replace] Updating address bar:', currentLocation, '→', cloudPath);
|
|
68
|
+
window.history.replaceState({}, '', cloudPath);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
23
71
|
}
|
|
72
|
+
|
|
@@ -215,7 +215,7 @@ export default {
|
|
|
215
215
|
:label="t('hpa.tabs.target')"
|
|
216
216
|
:weight="10"
|
|
217
217
|
>
|
|
218
|
-
<div class="row
|
|
218
|
+
<div class="row">
|
|
219
219
|
<div class="col span-6">
|
|
220
220
|
<LabeledSelect
|
|
221
221
|
v-model:value="value.spec.scaleTargetRef"
|
|
@@ -242,6 +242,8 @@ export default {
|
|
|
242
242
|
type="number"
|
|
243
243
|
/>
|
|
244
244
|
</div>
|
|
245
|
+
</div>
|
|
246
|
+
<div class="row">
|
|
245
247
|
<div class="col span-6">
|
|
246
248
|
<LabeledInput
|
|
247
249
|
v-model:value.number="value.spec.maxReplicas"
|
|
@@ -21,9 +21,9 @@ export default {
|
|
|
21
21
|
</script>
|
|
22
22
|
|
|
23
23
|
<template>
|
|
24
|
-
<div class="
|
|
25
|
-
<div class="row
|
|
26
|
-
<div class="col
|
|
24
|
+
<div class="span-12">
|
|
25
|
+
<div class="row">
|
|
26
|
+
<div class="col">
|
|
27
27
|
<LabeledInput
|
|
28
28
|
v-model:value="value.apiVersion"
|
|
29
29
|
:mode="mode"
|
|
@@ -33,7 +33,9 @@ export default {
|
|
|
33
33
|
type="text"
|
|
34
34
|
/>
|
|
35
35
|
</div>
|
|
36
|
-
|
|
36
|
+
</div>
|
|
37
|
+
<div class="row">
|
|
38
|
+
<div class="col">
|
|
37
39
|
<LabeledInput
|
|
38
40
|
v-model:value="value.kind"
|
|
39
41
|
:mode="mode"
|
|
@@ -45,7 +47,7 @@ export default {
|
|
|
45
47
|
</div>
|
|
46
48
|
</div>
|
|
47
49
|
<div class="row">
|
|
48
|
-
<div class="col
|
|
50
|
+
<div class="col">
|
|
49
51
|
<LabeledInput
|
|
50
52
|
v-model:value="value.name"
|
|
51
53
|
:mode="mode"
|
|
@@ -149,7 +149,7 @@ export default {
|
|
|
149
149
|
<template>
|
|
150
150
|
<div class="metric-target">
|
|
151
151
|
<div class="row">
|
|
152
|
-
<div class="col
|
|
152
|
+
<div class="col">
|
|
153
153
|
<LabeledSelect
|
|
154
154
|
v-model:value="value.type"
|
|
155
155
|
:mode="mode"
|
|
@@ -157,9 +157,11 @@ export default {
|
|
|
157
157
|
:options="targetTypes"
|
|
158
158
|
/>
|
|
159
159
|
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="row">
|
|
160
162
|
<div
|
|
161
163
|
v-if="isResourceMetricType"
|
|
162
|
-
class="col
|
|
164
|
+
class="col"
|
|
163
165
|
>
|
|
164
166
|
<UnitInput
|
|
165
167
|
v-if="value.type === 'Utilization'"
|
|
@@ -197,7 +199,7 @@ export default {
|
|
|
197
199
|
</div>
|
|
198
200
|
<div
|
|
199
201
|
v-else
|
|
200
|
-
class="col
|
|
202
|
+
class="col"
|
|
201
203
|
>
|
|
202
204
|
<LabeledInput
|
|
203
205
|
v-model:value="quantity"
|
|
@@ -159,8 +159,8 @@ export default {
|
|
|
159
159
|
:label="t('hpa.warnings.resource')"
|
|
160
160
|
color="warning"
|
|
161
161
|
/>
|
|
162
|
-
<div class="row
|
|
163
|
-
<div class="col
|
|
162
|
+
<div class="row">
|
|
163
|
+
<div class="col">
|
|
164
164
|
<LabeledSelect
|
|
165
165
|
v-model:value="value.type"
|
|
166
166
|
:reduce="(val) => val.label"
|
|
@@ -48,14 +48,14 @@ export default {
|
|
|
48
48
|
|
|
49
49
|
<template>
|
|
50
50
|
<div>
|
|
51
|
-
<div class="row
|
|
51
|
+
<div class="row">
|
|
52
52
|
<MetricTarget
|
|
53
53
|
v-model:value="value.target"
|
|
54
54
|
:mode="mode"
|
|
55
55
|
metric-resource="object"
|
|
56
56
|
/>
|
|
57
57
|
</div>
|
|
58
|
-
<div class="row
|
|
58
|
+
<div class="row">
|
|
59
59
|
<MetricObjectReference
|
|
60
60
|
v-model:value="value.describedObject"
|
|
61
61
|
:mode="mode"
|
|
@@ -89,10 +89,10 @@ export default {
|
|
|
89
89
|
|
|
90
90
|
<template>
|
|
91
91
|
<div
|
|
92
|
-
class="cert row"
|
|
92
|
+
class="cert row mb-10"
|
|
93
93
|
@update:value="update"
|
|
94
94
|
>
|
|
95
|
-
<div
|
|
95
|
+
<div>
|
|
96
96
|
<LabeledSelect
|
|
97
97
|
v-model:value="secretVal"
|
|
98
98
|
class="secret-name"
|
|
@@ -107,7 +107,9 @@ export default {
|
|
|
107
107
|
@update:value="onSecretInput"
|
|
108
108
|
/>
|
|
109
109
|
</div>
|
|
110
|
-
|
|
110
|
+
</div>
|
|
111
|
+
<div class="row">
|
|
112
|
+
<div style="padding-left: 160px;">
|
|
111
113
|
<ArrayList
|
|
112
114
|
:value="hosts"
|
|
113
115
|
:add-label="t('ingress.certificates.addHost')"
|
|
@@ -135,8 +137,8 @@ export default {
|
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
&:not(:last-of-type) {
|
|
138
|
-
padding-bottom: 10px;
|
|
139
|
-
margin-bottom: 30px;
|
|
140
|
+
// padding-bottom: 10px;
|
|
141
|
+
// margin-bottom: 30px;
|
|
140
142
|
}
|
|
141
143
|
}
|
|
142
144
|
</style>
|
|
@@ -96,7 +96,7 @@ export default {
|
|
|
96
96
|
v-if="serviceName || !isView"
|
|
97
97
|
class="row"
|
|
98
98
|
>
|
|
99
|
-
<div class="col span-
|
|
99
|
+
<div class="col span-6">
|
|
100
100
|
<LabeledSelect
|
|
101
101
|
v-model:value="serviceName"
|
|
102
102
|
:taggable="true"
|
|
@@ -111,7 +111,7 @@ export default {
|
|
|
111
111
|
/>
|
|
112
112
|
</div>
|
|
113
113
|
<div
|
|
114
|
-
class="col span-
|
|
114
|
+
class="col span-6"
|
|
115
115
|
:style="{'margin-right': '0px'}"
|
|
116
116
|
>
|
|
117
117
|
<LabeledInput
|