dashboard-shell-shell 3.0.5-test.3 → 3.0.5-test.30

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.
Files changed (153) hide show
  1. package/assets/icons/iconfont.css +4 -1
  2. package/assets/images/pl/dark/logo.png +0 -0
  3. package/assets/styles/all.scss +21 -1
  4. package/assets/styles/base/_variables.scss +5 -5
  5. package/assets/styles/fonts/_icons.scss +3 -2
  6. package/assets/styles/global/_button.scss +8 -8
  7. package/assets/styles/global/_select.scss +1 -1
  8. package/assets/styles/global/_tooltip.scss +9 -5
  9. package/assets/styles/themes/_light.scss +3 -1
  10. package/assets/styles/vendor/vue-select.scss +2 -1
  11. package/assets/translations/zh-hans.yaml +150 -13
  12. package/components/ActionDropdown.vue +1 -1
  13. package/components/ButtonDropdown.vue +3 -1
  14. package/components/CodeMirror.vue +6 -4
  15. package/components/ContainerResourceLimit.vue +2 -2
  16. package/components/CopyToClipboard.vue +15 -0
  17. package/components/Drawer/Chrome.vue +2 -2
  18. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +30 -27
  19. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +1 -1
  20. package/components/Drawer/ResourceDetailDrawer/index.vue +5 -4
  21. package/components/ExplorerMembers.vue +28 -4
  22. package/components/GlobalRoleBindings.vue +48 -112
  23. package/components/PodSecurityAdmission.vue +2 -2
  24. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +1 -3
  25. package/components/Resource/Detail/Metadata/KeyValue.vue +8 -4
  26. package/components/Resource/Detail/Metadata/index.vue +3 -1
  27. package/components/Resource/Detail/TitleBar/Title.vue +4 -3
  28. package/components/Resource/Detail/TitleBar/Top.vue +2 -0
  29. package/components/Resource/Detail/TitleBar/composables.ts +16 -1
  30. package/components/Resource/Detail/TitleBar/index.vue +123 -25
  31. package/components/ResourceDetail/Masthead/index.vue +1 -1
  32. package/components/ResourceDetail/Masthead/latest.vue +1 -1
  33. package/components/ResourceDetail/Masthead/legacy.vue +239 -167
  34. package/components/ResourceDetail/legacy.vue +44 -28
  35. package/components/ResourceList/Masthead.vue +14 -15
  36. package/components/SideNav.vue +21 -21
  37. package/components/SortableTable/THead.vue +21 -1
  38. package/components/SortableTable/index.vue +21 -6
  39. package/components/Tabbed/index.vue +6 -1
  40. package/components/auth/Principal.vue +42 -13
  41. package/components/auth/RoleDetailEdit.vue +11 -7
  42. package/components/breadcrumb/index.vue +119 -0
  43. package/components/form/ArrayList.vue +164 -147
  44. package/components/form/ArrayListGrouped.vue +3 -1
  45. package/components/form/ChangePassword.vue +1 -1
  46. package/components/form/Command.vue +4 -5
  47. package/components/form/Conditions.vue +15 -1
  48. package/components/form/Footer.vue +1 -0
  49. package/components/form/HealthCheck.vue +0 -2
  50. package/components/form/HookOption.vue +87 -58
  51. package/components/form/InputWithSelect.vue +8 -7
  52. package/components/form/KeyValue.vue +20 -2
  53. package/components/form/LabeledSelect.vue +6 -3
  54. package/components/form/Labels.vue +2 -2
  55. package/components/form/MatchExpressions.vue +3 -4
  56. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  57. package/components/form/Members/ClusterPermissionsEditor.vue +5 -5
  58. package/components/form/Members/MembershipEditor.vue +2 -2
  59. package/components/form/NameNsDescription.vue +1 -1
  60. package/components/form/Networking.vue +6 -9
  61. package/components/form/NodeAffinity.vue +29 -28
  62. package/components/form/PodAffinity.vue +23 -23
  63. package/components/form/Probe.vue +15 -11
  64. package/components/form/ResourceQuota/Namespace.vue +4 -4
  65. package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
  66. package/components/form/ResourceQuota/Project.vue +4 -4
  67. package/components/form/ResourceQuota/ProjectRow.vue +36 -30
  68. package/components/form/ResourceSelector.vue +1 -1
  69. package/components/form/Security.vue +1 -3
  70. package/components/form/Select.vue +6 -1
  71. package/components/form/ServiceNameSelect.vue +2 -5
  72. package/components/form/ServicePorts.vue +149 -75
  73. package/components/form/Taints.vue +2 -1
  74. package/components/form/Tolerations.vue +12 -9
  75. package/components/form/ValueFromResource.vue +110 -96
  76. package/components/form/WorkloadPorts.vue +143 -123
  77. package/components/formatter/WorkloadHealthScale.vue +4 -3
  78. package/components/nav/Group.vue +6 -0
  79. package/components/nav/Header.vue +7 -4
  80. package/components/nav/NamespaceFilter.vue +15 -21
  81. package/components/nav/TopLevelMenu.vue +99 -125
  82. package/components/nav/Type.vue +15 -3
  83. package/config/menuRouteMap.js +10 -0
  84. package/config/product/explorer.js +5 -1
  85. package/config/router/navigation-guards/index.js +61 -3
  86. package/detail/node.vue +28 -23
  87. package/dialog/AddCustomBadgeDialog.vue +17 -9
  88. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  89. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  90. package/edit/autoscaling.horizontalpodautoscaler/index.vue +3 -1
  91. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  92. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  93. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  94. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  95. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  96. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  97. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  98. package/edit/configmap.vue +4 -0
  99. package/edit/networking.k8s.io.ingress/Certificate.vue +7 -5
  100. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  101. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  102. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  103. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -3
  104. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  105. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +12 -11
  106. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  107. package/edit/persistentvolume/index.vue +3 -1
  108. package/edit/persistentvolumeclaim.vue +2 -0
  109. package/edit/secret/index.vue +2 -2
  110. package/edit/service.vue +4 -1
  111. package/edit/storage.k8s.io.storageclass/index.vue +10 -8
  112. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  113. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  114. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  115. package/edit/workload/Job.vue +31 -34
  116. package/edit/workload/Upgrading.vue +5 -5
  117. package/edit/workload/index.vue +22 -18
  118. package/edit/workload/storage/Mount.vue +1 -0
  119. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  120. package/edit/workload/storage/azureDisk.vue +14 -10
  121. package/edit/workload/storage/azureFile.vue +9 -7
  122. package/edit/workload/storage/csi/index.vue +6 -9
  123. package/edit/workload/storage/emptyDir.vue +7 -5
  124. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  125. package/edit/workload/storage/hostPath.vue +7 -5
  126. package/edit/workload/storage/nfs.vue +8 -6
  127. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  128. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  129. package/edit/workload/storage/secret.vue +9 -6
  130. package/edit/workload/storage/vsphereVolume.vue +11 -7
  131. package/initialize/app-extended.js +7 -1
  132. package/models/provisioning.cattle.io.cluster.js +19 -18
  133. package/package.json +1 -1
  134. package/pages/account/index.vue +95 -115
  135. package/pages/auth/setup.vue +35 -16
  136. package/pages/c/_cluster/auth/roles/index.vue +38 -5
  137. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  138. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  139. package/pages/home.vue +3 -4
  140. package/pkg/tsconfig.json +9 -9
  141. package/pkg/vue.config.js +1 -1
  142. package/plugins/dashboard-store/resource-class.js +28 -27
  143. package/rancher-components/BadgeState/BadgeState.vue +33 -52
  144. package/rancher-components/Banner/Banner.vue +4 -1
  145. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +31 -2
  146. package/rancher-components/RcDropdown/RcDropdownMenu.vue +8 -7
  147. package/scripts/publish-shell.sh +1 -1
  148. package/store/i18n.js +4 -0
  149. package/store/type-map.js +1 -1
  150. package/types/shell/index.d.ts +4 -30
  151. package/utils/error.js +3 -1
  152. package/utils/errorTranslate.json +351 -2
  153. package/vue.config.js +1 -1
@@ -418,7 +418,7 @@ export default {
418
418
  demoDisplay() {
419
419
  const product = this.$store.getters['productId'];
420
420
 
421
- const resources = this.location?.params?.resource || ''
421
+ const resources = this.location?.params?.resource || this.$route.params?.resource || ''
422
422
 
423
423
  const productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], resources);
424
424
 
@@ -441,9 +441,10 @@ export default {
441
441
  menuIcon() {
442
442
  const product = this.$store.getters['productId'];
443
443
 
444
- const resources = this.location?.params?.resource || ''
444
+ const resources = this.location?.params?.resource || this.$route.params?.resource || ''
445
445
 
446
- return this.$store.getters['type-map/groupsForVirTypes'](product, resources);
446
+
447
+ return this.$store.getters['type-map/groupsForVirTypes'](product, resources) || 'default menuIcon';
447
448
  },
448
449
 
449
450
  location() {
@@ -491,192 +492,263 @@ export default {
491
492
  </script>
492
493
 
493
494
  <template>
494
-
495
- <!-- 顶部区域的容器 -->
496
495
  <div class="masthead">
497
496
  <div class="title">
498
-
499
- <!-- 面包屑导航(创建 API 密钥时不显示) -->
500
- <!-- <div
497
+ <!-- 创建api密钥不需要面包屑 -->
498
+ <div
501
499
  v-if="!(parentRouteOverride === 'account' && resource=== 'token')"
502
500
  class="excram-list"
503
501
  >
504
-
505
- 遍历 demoDisplay 生成面包屑路径
506
502
  <span
507
503
  v-for="(item,index) in demoDisplay"
508
504
  :key="index"
509
505
  >
510
- <span v-if="item">{{ item }}</span>
511
- <span v-if="item">/</span>
506
+ <span>{{ item }}</span>
507
+ <span>/</span>
512
508
  </span>
513
-
514
- 最后一个面包屑显示当前操作(查看/编辑/创建)+ 父资源名称
515
509
  <span class="excram-last-name">
516
- {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + parent.displayName }}
510
+ {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + parent?.displayName }}
517
511
  </span>
518
- </div> -->
519
-
520
- <header>
521
- <div class="title">
522
- <div class="primaryheader">
523
- <span class="primary-title">
524
-
525
- <!-- 图标区 -->
526
- <span v-if="menuIcon && !(parentRouteOverride === 'account' && resource=== 'token')" class="detailIcon-span">
527
- <!-- 如果是账户 API token,则显示图片,否则显示 icon -->
528
- <img
529
- v-if="parentRouteOverride === 'account' && resource=== 'token'"
530
- :src="Svg"
531
- style="margin-top: 4px; margin-left: 5px;"
532
- >
533
- <i
534
- v-else
535
- :class="'icon-'+ menuIcon + ' detailIcon'"
536
- />
537
- </span>
538
-
539
- <!-- 资源标题(创建时只显示“创建+名称”,否则显示“名称:”) -->
540
- <span class="detailIcon-span-title">{{ realMode=== 'create'? '创建': '' }}{{ parent.displayName }}{{ realMode=== 'create'? '': '名称:' }}</span>
541
-
542
- <!-- 如果不是创建模式,显示操作描述 -->
543
- <span v-if="realMode !== 'create'">
544
-
545
- <!-- 如果有覆盖方法,优先显示覆盖内容 -->
546
- <span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
547
-
548
- <!-- 否则用 t 组件国际化显示 -->
549
- <t
550
- v-else
551
- :k="'resourceDetail.header.' + realMode"
552
- :subtype="resourceSubtype"
553
- :name="displayName"
554
- :escapehtml="false"
555
- />
556
- </span>
557
-
558
- <!-- 状态点(DotState 组件) -->
559
- <DotState
560
- v-if="!isCreate && parent.showState"
561
- class="masthead-state"
562
- :value="value"
563
- />
564
-
565
- <!-- Istio 注入状态 -->
566
- <span
567
- v-if="!isCreate && value.injectionEnabled"
568
- class="masthead-istio"
512
+ </div>
513
+ <header>
514
+ <div class="title">
515
+ <div class="primaryheader">
516
+ <span class="primary-title">
517
+ <!-- <nuxt-link
518
+ v-if="location"
519
+ :to="location"
520
+ >
521
+ {{ parent.displayName }}:
522
+ </nuxt-link> -->
523
+ <span class="detailIcon-span">
524
+ <img
525
+ v-if="parentRouteOverride === 'account' && resource=== 'token'"
526
+ :src="Svg"
527
+ style="margin-top: 4px; margin-left: 5px;"
569
528
  >
570
- <i
571
- v-clean-tooltip="t('projectNamespaces.isIstioInjectionEnabled')"
572
- class="icon icon-sm icon-istio"
573
- />
574
- </span>
529
+ <i
530
+ v-else
531
+ :class="'icon-'+ menuIcon + ' detailIcon'"
532
+ />
575
533
  </span>
576
-
577
- <!-- 如果有返回路径,显示分隔符和“返回”链接 -->
534
+ <span class="detailIcon-span-title">{{ realMode=== 'create'? '创建': '' }}{{ parent?.displayName }}{{ realMode=== 'create'? '': '名称:' }}</span>
535
+ <span v-if="realMode !== 'create'">
536
+ <span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
537
+ <t
538
+ v-else
539
+ :k="'resourceDetail.header.' + realMode"
540
+ :subtype="resourceSubtype"
541
+ :name="displayName"
542
+ :escapehtml="false"
543
+ />
544
+ </span>
545
+ <DotState
546
+ v-if="!isCreate && parent.showState"
547
+ class="masthead-state"
548
+ :value="value"
549
+ />
578
550
  <span
579
- v-if="location"
580
- class="valid"
581
- >|</span>
582
- <router-link
583
- v-if="location"
584
- :to="location"
551
+ v-if="!isCreate && value.injectionEnabled"
552
+ class="masthead-istio"
585
553
  >
586
- 返回
587
- </router-link>
588
- </div>
554
+ <i
555
+ v-clean-tooltip="t('projectNamespaces.isIstioInjectionEnabled')"
556
+ class="icon icon-sm icon-istio"
557
+ />
558
+ </span>
559
+ </span>
560
+ <span
561
+ v-if="location"
562
+ class="valid"
563
+ >|</span>
564
+ <router-link
565
+ v-if="location"
566
+ :to="location"
567
+ >
568
+ 返回
569
+ </router-link>
570
+ <!-- <h1>
571
+ <TabTitle
572
+ v-if="isCreate"
573
+ :showChild="false"
574
+ >
575
+ {{ parent.displayName }}
576
+ </TabTitle>
577
+ <TabTitle
578
+ v-else
579
+ :showChild="false"
580
+ >
581
+ {{ displayName }}
582
+ </TabTitle>
583
+ <router-link
584
+ v-if="location"
585
+ :to="location"
586
+ role="link"
587
+ class="masthead-resource-list-link"
588
+ :aria-label="parent.displayName"
589
+ >
590
+ {{ parent.displayName }}:
591
+ </router-link>
592
+ <span v-else>{{ parent.displayName }}:</span>
593
+ <span v-if="value?.detailPageHeaderActionOverride && value?.detailPageHeaderActionOverride(realMode)">{{ value?.detailPageHeaderActionOverride(realMode) }}</span>
594
+ <t
595
+ v-else
596
+ class="masthead-resource-title"
597
+ :k="'resourceDetail.header.' + realMode"
598
+ :subtype="resourceSubtype"
599
+ :name="displayName"
600
+ :escapehtml="false"
601
+ />
602
+ <BadgeState
603
+ v-if="!isCreate && parent.showState"
604
+ class="masthead-state"
605
+ :value="value"
606
+ />
607
+ <span
608
+ v-if="!isCreate && value.injectionEnabled"
609
+ class="masthead-istio"
610
+ >
611
+ <i
612
+ v-clean-tooltip="t('projectNamespaces.isIstioInjectionEnabled')"
613
+ class="icon icon-sm icon-istio"
614
+ />
615
+ </span>
616
+ <a
617
+ v-if="dev && !!resourceExternalLink"
618
+ v-clean-tooltip="t(resourceExternalLink.tipsKey || 'generic.resourceExternalLinkTips')"
619
+ class="resource-external"
620
+ rel="nofollow noopener noreferrer"
621
+ target="_blank"
622
+ :href="resourceExternalLink.url"
623
+ >
624
+ <i class="icon icon-external-link" />
625
+ </a>
626
+ </h1> -->
589
627
  </div>
590
-
591
- <!-- 右侧操作按钮区域(支持通过 slot 覆盖) -->
592
- <slot name="right">
593
- <div class="actions-container align-start" style="padding-right: 15px;">
594
- <div class="actions">
595
-
596
- <!-- 详情模式下的主操作按钮 -->
628
+ <!-- <div
629
+ v-if="!isCreate"
630
+ class="subheader"
631
+ >
632
+ <span v-if="isNamespace && project">{{ t("resourceDetail.masthead.project") }}: <router-link :to="project.detailLocation">{{ project.nameDisplay }}</router-link></span>
633
+ <span v-else-if="isWorkspace">{{ t("resourceDetail.masthead.workspace") }}: <router-link :to="workspaceLocation">{{ namespace }}</router-link></span>
634
+ <span v-else-if="namespace && !hasMultipleNamespaces">
635
+ {{ t("resourceDetail.masthead.namespace") }}:
636
+ <router-link
637
+ v-if="!hideNamespaceLocation"
638
+ :to="namespaceLocation"
639
+ data-testid="masthead-subheader-namespace"
640
+ >
641
+ {{ namespace }}
642
+ </router-link>
643
+ <span v-else>
644
+ {{ namespace }}
645
+ </span>
646
+ </span>
647
+ <span v-if="parent.showAge">
648
+ {{ t("resourceDetail.masthead.age") }}:
649
+ <LiveDate
650
+ class="live-date"
651
+ :value="value.creationTimestamp"
652
+ />
653
+ </span>
654
+ <span
655
+ v-if="value.showCreatedBy"
656
+ data-testid="masthead-subheader-createdBy"
657
+ >
658
+ {{ t("resourceDetail.masthead.createdBy") }}:
659
+ <router-link
660
+ v-if="value.createdBy.location"
661
+ :to="value.createdBy.location"
662
+ data-testid="masthead-subheader-createdBy-link"
663
+ >
664
+ {{ value.createdBy.displayName }}
665
+ </router-link>
666
+ <span
667
+ v-else
668
+ data-testid="masthead-subheader-createdBy_plain-text"
669
+ >
670
+ {{ value.createdBy.displayName }}
671
+ </span>
672
+ </span>
673
+ <span v-if="value.showPodRestarts">{{ t("resourceDetail.masthead.restartCount") }}:<span class="live-data"> {{ value.restartCount }}</span></span>
674
+ </div> -->
675
+ </div>
676
+ <slot name="right">
677
+ <div class="actions-container align-start">
678
+ <div class="actions">
679
+ <button
680
+ v-if="detailsAction && currentView === DETAIL_VIEW && isView"
681
+ type="button"
682
+ class="btn role-primary actions mr-10"
683
+ :disabled="!detailsAction.enabled"
684
+ @click="invokeDetailsAction"
685
+ >
686
+ {{ detailsAction.label }}
687
+ </button>
688
+ <ButtonGroup
689
+ v-if="showSensitiveToggle"
690
+ :value="!!hideSensitiveData"
691
+ icon-size="lg"
692
+ :options="sensitiveOptions"
693
+ class="mr-10"
694
+ @update:value="toggleSensitiveData"
695
+ />
696
+
697
+ <ButtonGroup
698
+ v-if="viewOptions && isView"
699
+ v-model:value="currentView"
700
+ :options="viewOptions"
701
+ class="mr-10"
702
+ />
703
+
704
+ <template v-if="featureDropdownMenu">
705
+ <ActionMenu
706
+ v-if="isView"
707
+ button-role="multiAction"
708
+ button-size="compact"
709
+ :resource="value"
710
+ data-testid="masthead-action-menu"
711
+ />
712
+ </template>
713
+ <template v-else>
597
714
  <button
598
- v-if="detailsAction && currentView === DETAIL_VIEW && isView && isManuallyHide"
715
+ v-if="isView"
716
+ ref="actions"
717
+ data-testid="masthead-action-menu"
718
+ aria-haspopup="true"
599
719
  type="button"
600
- class="btn role-primary actions mr-10"
601
- :disabled="!detailsAction.enabled"
602
- @click="invokeDetailsAction"
720
+ class="btn role-multi-action actions"
721
+ @click="showActions"
603
722
  >
604
- {{ detailsAction.label }}
723
+ <i class="icon icon-actions" />
605
724
  </button>
606
-
607
- <!-- 敏感信息显示/隐藏切换 -->
608
- <ButtonGroup
609
- v-if="showSensitiveToggle"
610
- :value="!!hideSensitiveData"
611
- icon-size="lg"
612
- :options="sensitiveOptions"
613
- class="mr-10"
614
- @update:value="toggleSensitiveData"
615
- />
616
-
617
- <!-- 视图切换按钮 -->
618
- <ButtonGroup
619
- v-if="viewOptions && isView"
620
- v-model:value="currentView"
621
- :options="viewOptions"
622
- class="mr-10"
623
- />
624
-
625
- <!-- 功能菜单:优先使用 ActionMenu 组件 -->
626
- <template v-if="featureDropdownMenu">
627
- <ActionMenu
628
- v-if="isView"
629
- button-role="multiAction"
630
- button-size="compact"
631
- :resource="value"
632
- data-testid="masthead-action-menu"
633
- />
634
- </template>
635
-
636
- <!-- 如果没有 featureDropdownMenu,则使用普通的多操作按钮 -->
637
- <template v-else>
638
- <button
639
- v-if="isView"
640
- ref="actions"
641
- data-testid="masthead-action-menu"
642
- aria-haspopup="true"
643
- type="button"
644
- class="btn role-multi-action actions"
645
- @click="showActions"
646
- >
647
- <i class="icon icon-actions" />
648
- </button>
649
- </template>
650
- </div>
725
+ </template>
651
726
  </div>
652
- </slot>
653
- </header>
654
-
655
- <!-- 扩展区域 -->
656
- <ExtensionPanel
657
- :resource="value"
658
- :type="extensionType"
659
- :location="extensionLocation"
660
- />
661
-
662
- <!-- 顶部状态 Banner -->
663
- <Banner
664
- v-if="banner && isView && !parent.hideBanner"
665
- class="state-banner mb-10"
666
- :color="banner.color"
667
- :label="banner.message == 'Waiting for API to be available' ? '等待 API 可用' : banner.message"
668
- />
669
-
670
- <!-- 管理警告 Banner -->
671
- <Banner
672
- v-if="managedWarning.show"
673
- color="warning"
674
- class="mb-20"
675
- :label="t('resourceDetail.masthead.managedWarning', managedWarning)"
676
- />
677
-
678
- <!-- 内容插槽 -->
679
- <slot />
727
+ </div>
728
+ </slot>
729
+ </header>
730
+
731
+ <!-- Extension area -->
732
+ <ExtensionPanel
733
+ :resource="value"
734
+ :type="extensionType"
735
+ :location="extensionLocation"
736
+ />
737
+
738
+ <Banner
739
+ v-if="banner && isView && !parent.hideBanner"
740
+ class="state-banner mb-10"
741
+ :color="banner.color"
742
+ :label="banner.message"
743
+ />
744
+ <Banner
745
+ v-if="managedWarning.show"
746
+ color="warning"
747
+ class="mb-20"
748
+ :label="t('resourceDetail.masthead.managedWarning', managedWarning)"
749
+ />
750
+
751
+ <slot />
680
752
  </div>
681
753
  </div>
682
754
  </template>
@@ -6,13 +6,14 @@ import {
6
6
  _VIEW, _EDIT, _CLONE, _IMPORT, _STAGE, _CREATE,
7
7
  AS, _YAML, _DETAIL, _CONFIG, _GRAPH, PREVIEW, MODE,
8
8
  } from '@shell/config/query-params';
9
- import { SCHEMA } from '@shell/config/types';
9
+ import { FLEET, SCHEMA } from '@shell/config/types';
10
10
  import { createYaml } from '@shell/utils/create-yaml';
11
11
  import Masthead from '@shell/components/ResourceDetail/Masthead';
12
12
  import DetailTop from '@shell/components/DetailTop';
13
13
  import { clone, diff } from '@shell/utils/object';
14
14
  import IconMessage from '@shell/components/IconMessage';
15
15
  import ForceDirectedTreeChart from '@shell/components/ForceDirectedTreeChart';
16
+ import { checkSchemasForFindAllHash } from '@shell/utils/auth';
16
17
  import { stringify } from '@shell/utils/error';
17
18
  import { Banner } from '@components/Banner';
18
19
 
@@ -171,6 +172,28 @@ export default {
171
172
  yaml = createYaml(schemas, resourceType, data);
172
173
  }
173
174
  } else {
175
+ if ( as === _GRAPH ) {
176
+ const graphSchema = await checkSchemasForFindAllHash({
177
+ cluster: {
178
+ inStoreType: 'management',
179
+ type: FLEET.CLUSTER
180
+ },
181
+ bundle: {
182
+ inStoreType: 'management',
183
+ type: FLEET.BUNDLE,
184
+ opt: { excludeFields: ['metadata.managedFields', 'spec.resources'] },
185
+ },
186
+
187
+ bundleDeployment: {
188
+ inStoreType: 'management',
189
+ type: FLEET.BUNDLE_DEPLOYMENT
190
+ }
191
+
192
+ }, this.$store);
193
+
194
+ this.canViewChart = graphSchema.cluster && graphSchema.bundle && graphSchema.bundleDeployment;
195
+ }
196
+
174
197
  let fqid = id;
175
198
 
176
199
  if ( schema.attributes?.namespaced && namespace ) {
@@ -273,6 +296,7 @@ export default {
273
296
  value: null,
274
297
  model: null,
275
298
  notFound: null,
299
+ canViewChart: true,
276
300
  canViewYaml: null,
277
301
  errors: []
278
302
  };
@@ -451,17 +475,16 @@ export default {
451
475
  :has-graph="hasGraph"
452
476
  :has-detail="hasCustomDetail"
453
477
  :has-edit="hasCustomEdit"
454
- :can-view-yaml="canViewYaml"
455
478
  :resource-subtype="resourceSubtype"
456
479
  :parent-route-override="parentRouteOverride"
457
480
  :store-override="storeOverride"
458
481
 
459
482
  :isManuallyHide="false"
460
483
  >
461
- <DetailTop
484
+ <!-- <DetailTop
462
485
  v-if="isView && isDetail"
463
486
  :value="liveModel"
464
- />
487
+ /> -->
465
488
  </Masthead>
466
489
  <div
467
490
  v-if="hasErrors"
@@ -481,7 +504,7 @@ export default {
481
504
  </div>
482
505
 
483
506
  <ForceDirectedTreeChart
484
- v-if="isGraph"
507
+ v-if="isGraph && canViewChart"
485
508
  :data="chartData"
486
509
  :fdc-config="getGraphConfig"
487
510
  />
@@ -495,27 +518,26 @@ export default {
495
518
  :offer-preview="offerPreview"
496
519
  :done-route="doneRoute"
497
520
  :done-override="value ? value.doneOverride : null"
498
- :show-errors="false"
499
521
  @update:value="$emit('input', $event)"
500
- @error="onYamlError"
522
+ @error="e=>errors.push(e)"
501
523
  />
502
524
 
503
525
  <component
504
- :is="showComponent"
505
- v-else
506
- ref="comp"
507
- v-model:value="value"
508
- v-bind="$data"
509
- :done-params="doneParams"
510
- :done-route="doneRoute"
511
- :mode="mode"
512
- :initial-value="initialModel"
513
- :live-value="liveModel"
514
- :real-mode="realMode"
515
- :class="{'flex-content': flexContent}"
516
- @update:value="$emit('input', $event)"
517
- @update:mode="setMode"
518
- @set-subtype="setSubtype"
526
+ :is="showComponent"
527
+ v-else
528
+ ref="comp"
529
+ v-model:value="value"
530
+ v-bind="$data"
531
+ :done-params="doneParams"
532
+ :done-route="doneRoute"
533
+ :mode="mode"
534
+ :initial-value="initialModel"
535
+ :live-value="liveModel"
536
+ :real-mode="realMode"
537
+ :class="{'flex-content': flexContent}"
538
+ @update:value="$emit('input', $event)"
539
+ @update:mode="setMode"
540
+ @set-subtype="setSubtype"
519
541
  />
520
542
 
521
543
  <button
@@ -555,10 +577,4 @@ export default {
555
577
  flex-direction: column;
556
578
  flex-grow: 1;
557
579
  }
558
- .cru__errors {
559
- position: sticky;
560
- top: 0;
561
- z-index: 1;
562
- background-color: var(--header-bg);
563
- }
564
580
  </style>
@@ -156,37 +156,37 @@ export default {
156
156
  demoDisplay() {
157
157
 
158
158
  const product = this.$store.getters['productId'];
159
- const productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], this._createLocation.params.resource);
160
- const parts = productId?.split('::');
161
- const newString = 'root';
162
-
163
- // const product = this.$store.getters['productId'];
164
- // const productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], this._createLocation.params.resource);
159
+ const productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], this._createLocation?.params?.resource);
160
+ console.log(product, 'product')
161
+ console.log(productId, 'productId')
162
+ console.log(this._createLocation?.params?.resource, 'this._createLocation?.params?.resource')
165
163
 
166
- // const parts = productId?.split('::') || [];
167
- // const newString = 'root';
164
+ let parts = productId?.split('::');
165
+ console.log(parts, 'parts11111')
166
+ const newString = 'root';
168
167
 
168
+ if (!parts) {
169
+ if (this.$route.path.includes('/c/local/explorer/secret')) {
170
+ parts = ['storage']
171
+ }
172
+ }
169
173
 
170
174
  const breadcrumbList = {
171
175
  'harvesterhci.io.management.cluster': {
172
176
  origin: 'Harvester 集群',
173
177
  bread: ['虚拟化管理'],
174
- description: '提供虚拟化集群的实时健康状态监控、版本号管理及资源负载管理,支持批量导入/删除集群、配置调优与权限分级功能,实现高效运维管控。'
175
178
  },
176
179
  'management.cattle.io.user': {
177
180
  origin: '用户',
178
181
  bread: ['用户 & 认证'],
179
- description: '用于管理用户账号,支持创建、维护用户信息,可设置用户权限、管理密码等,保障系统资源仅由授权用户访问,提升系统安全性。'
180
182
  },
181
183
  'management.cattle.io.setting':{
182
184
  origin: '基础设置',
183
185
  bread: ['全局设置'],
184
- description: '统一配置平台基础选项与全局设置,支持CA证书、密码规则、域名、Token时效等核心配置。'
185
186
  },
186
187
  'management.cattle.io.feature':{
187
188
  origin: '功能开关',
188
189
  bread: ['全局设置'],
189
- description: '还没有添加描述。。。。'
190
190
  },
191
191
  }
192
192
  const resourcePath = this.$route.params.resource || ''
@@ -194,7 +194,6 @@ export default {
194
194
  const breadcrumb = []
195
195
  if (breadcrumbList[resourcePath] && Object.keys(breadcrumbList[resourcePath]).length > 0) {
196
196
  breadcrumb.push(...breadcrumbList[resourcePath].bread)
197
- this.description = breadcrumbList[resourcePath].description
198
197
  return breadcrumb
199
198
  } else {
200
199
  if (!parts?.includes(newString)) {
@@ -325,7 +324,7 @@ export default {
325
324
  <!-- 操作按钮区域 -->
326
325
  <div
327
326
  ref="actionsContainer"
328
- v-if="!(tabList.includes(_typeDisplay)) && mainButtonVisible"
327
+ v-if="!(tabList.includes(_typeDisplay))"
329
328
  class="actions-container actions-positioning"
330
329
  style="min-height: 32px;align-self: flex-end;"
331
330
  >
@@ -419,6 +418,6 @@ export default {
419
418
  .actions-positioning {
420
419
  position: absolute;
421
420
  bottom: -48px;
422
- z-index: 20;
421
+ z-index: 15;
423
422
  }
424
423
  </style>