dashboard-shell-shell 3.0.5-test.9 → 3.0.5-tsh.10

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 (213) hide show
  1. package/assets/brand/csp/favicon.png +0 -0
  2. package/assets/icons/iconfont.css +4 -1
  3. package/assets/iconsNew/demo.css +539 -0
  4. package/assets/iconsNew/demo.css:Zone.Identifier +0 -0
  5. package/assets/iconsNew/demo_index.html +303 -0
  6. package/assets/iconsNew/demo_index.html:Zone.Identifier +0 -0
  7. package/assets/iconsNew/iconfont.css +43 -0
  8. package/assets/iconsNew/iconfont.css:Zone.Identifier +0 -0
  9. package/assets/iconsNew/iconfont.js +1 -0
  10. package/assets/iconsNew/iconfont.js:Zone.Identifier +0 -0
  11. package/assets/iconsNew/iconfont.json +44 -0
  12. package/assets/iconsNew/iconfont.json:Zone.Identifier +0 -0
  13. package/assets/iconsNew/iconfont.ttf +0 -0
  14. package/assets/iconsNew/iconfont.ttf:Zone.Identifier +0 -0
  15. package/assets/iconsNew/iconfont.woff +0 -0
  16. package/assets/iconsNew/iconfont.woff2 +0 -0
  17. package/assets/iconsNew/iconfont.woff2:Zone.Identifier +0 -0
  18. package/assets/iconsNew/iconfont.woff:Zone.Identifier +0 -0
  19. package/assets/images/login-logo.svg +37 -12
  20. package/assets/images/logo.svg +47 -0
  21. package/assets/images/pl/dark/logo.png +0 -0
  22. package/assets/styles/all.scss +23 -3
  23. package/assets/styles/app.scss +1 -0
  24. package/assets/styles/base/_helpers.scss +1 -1
  25. package/assets/styles/base/_variables.scss +2 -2
  26. package/assets/styles/fonts/_icons.scss +3 -2
  27. package/assets/styles/global/_button.scss +1 -1
  28. package/assets/styles/global/_form.scss +1 -0
  29. package/assets/styles/global/_select.scss +1 -1
  30. package/assets/styles/global/_tooltip.scss +5 -1
  31. package/assets/styles/themes/_light.scss +3 -3
  32. package/assets/styles/vendor/vue-select.scss +2 -1
  33. package/assets/translations/en-us.yaml +64 -0
  34. package/assets/translations/zh-hans.yaml +221 -22
  35. package/components/ButtonDropdown.vue +3 -1
  36. package/components/ClusterIconMenu.vue +1 -1
  37. package/components/CodeMirror.vue +6 -4
  38. package/components/ConsumptionGauge.vue +1 -1
  39. package/components/ContainerResourceLimit.vue +2 -2
  40. package/components/CruResource.vue +3 -2
  41. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +22 -19
  42. package/components/Drawer/ResourceDetailDrawer/index.vue +3 -3
  43. package/components/ExplorerMembers.vue +10 -1
  44. package/components/GlobalRoleBindings.vue +69 -114
  45. package/components/PodSecurityAdmission.vue +1 -1
  46. package/components/PromptRemove.vue +23 -1
  47. package/components/RelatedResources.vue +3 -0
  48. package/components/Resource/Detail/TitleBar/composables.ts +16 -1
  49. package/components/Resource/Detail/TitleBar/index.vue +37 -24
  50. package/components/ResourceDetail/Masthead/index.vue +1 -1
  51. package/components/ResourceDetail/Masthead/latest.vue +1 -1
  52. package/components/ResourceDetail/Masthead/legacy.vue +8 -7
  53. package/components/ResourceDetail/legacy.vue +15 -15
  54. package/components/ResourceList/Masthead.vue +11 -15
  55. package/components/ResourceTable.vue +16 -0
  56. package/components/SideNav.vue +21 -21
  57. package/components/SingleClusterInfo.vue +2 -1
  58. package/components/SortableTable/THead.vue +46 -1
  59. package/components/SortableTable/index.vue +54 -18
  60. package/components/Tabbed/index.vue +6 -1
  61. package/components/auth/Principal.vue +16 -8
  62. package/components/auth/RoleDetailEdit.vue +11 -7
  63. package/components/breadcrumb/index.vue +13 -210
  64. package/components/form/ArrayList.vue +164 -147
  65. package/components/form/ArrayListGrouped.vue +5 -3
  66. package/components/form/ChangePassword.vue +1 -1
  67. package/components/form/ClusterAppearance.vue +4 -3
  68. package/components/form/Command.vue +4 -5
  69. package/components/form/Conditions.vue +15 -1
  70. package/components/form/Footer.vue +1 -0
  71. package/components/form/HealthCheck.vue +0 -2
  72. package/components/form/HookOption.vue +87 -58
  73. package/components/form/InputWithSelect.vue +8 -7
  74. package/components/form/KeyValue.vue +20 -2
  75. package/components/form/LabeledSelect.vue +3 -1
  76. package/components/form/Labels.vue +2 -2
  77. package/components/form/MatchExpressions.vue +4 -4
  78. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  79. package/components/form/Members/ClusterPermissionsEditor.vue +60 -41
  80. package/components/form/Members/MembershipEditor.vue +4 -4
  81. package/components/form/Members/ProjectMembershipEditor.vue +1 -1
  82. package/components/form/NameNsDescription.vue +17 -1
  83. package/components/form/Networking.vue +6 -9
  84. package/components/form/NodeAffinity.vue +29 -28
  85. package/components/form/PodAffinity.vue +23 -23
  86. package/components/form/Probe.vue +15 -11
  87. package/components/form/ProjectMemberEditor.vue +66 -48
  88. package/components/form/ResourceQuota/Namespace.vue +4 -4
  89. package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
  90. package/components/form/ResourceQuota/Project.vue +4 -4
  91. package/components/form/ResourceQuota/ProjectRow.vue +36 -30
  92. package/components/form/ResourceSelector.vue +1 -1
  93. package/components/form/SecretSelector.vue +24 -23
  94. package/components/form/Security.vue +1 -3
  95. package/components/form/Select.vue +7 -1
  96. package/components/form/ServiceNameSelect.vue +2 -5
  97. package/components/form/ServicePorts.vue +149 -75
  98. package/components/form/Tolerations.vue +13 -9
  99. package/components/form/ValueFromResource.vue +110 -96
  100. package/components/formatter/WorkloadHealthScale.vue +4 -3
  101. package/components/nav/Group.vue +8 -1
  102. package/components/nav/Header.vue +51 -174
  103. package/components/nav/NamespaceFilter.vue +14 -19
  104. package/components/nav/TopLevelMenu.vue +99 -125
  105. package/components/nav/Type.vue +11 -3
  106. package/config/menuRouteMap.js +10 -0
  107. package/config/private-label.js +2 -3
  108. package/config/product/explorer.js +32 -10
  109. package/config/product/manager.js +28 -17
  110. package/config/product/uiplugins.js +13 -10
  111. package/config/router/navigation-guards/index.js +61 -3
  112. package/detail/node.vue +28 -23
  113. package/dialog/AddCustomBadgeDialog.vue +17 -9
  114. package/dialog/RollbackWorkloadDialog.vue +1 -1
  115. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  116. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  117. package/edit/autoscaling.horizontalpodautoscaler/index.vue +3 -1
  118. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  119. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  120. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  121. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  122. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  123. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  124. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  125. package/edit/configmap.vue +4 -0
  126. package/edit/logging-flow/index.vue +1 -2
  127. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +3 -3
  128. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +19 -19
  129. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +23 -23
  130. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +19 -19
  131. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +14 -14
  132. package/edit/logging.banzaicloud.io.output/providers/forward.vue +12 -12
  133. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +23 -23
  134. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +6 -6
  135. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +10 -10
  136. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +8 -8
  137. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +17 -17
  138. package/edit/logging.banzaicloud.io.output/providers/logz.vue +7 -7
  139. package/edit/logging.banzaicloud.io.output/providers/loki.vue +12 -12
  140. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +3 -3
  141. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +14 -14
  142. package/edit/logging.banzaicloud.io.output/providers/redis.vue +6 -6
  143. package/edit/logging.banzaicloud.io.output/providers/s3.vue +23 -23
  144. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +13 -13
  145. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +2 -2
  146. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +54 -54
  147. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +32 -8
  148. package/edit/monitoring.coreos.com.alertmanagerconfig/types/dingding.vue +32 -0
  149. package/edit/monitoring.coreos.com.alertmanagerconfig/types/message.vue +52 -0
  150. package/edit/monitoring.coreos.com.alertmanagerconfig/types/snmp.vue +45 -0
  151. package/edit/monitoring.coreos.com.alertmanagerconfig/types/work.vue +31 -0
  152. package/edit/networking.k8s.io.ingress/Certificate.vue +14 -5
  153. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  154. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  155. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  156. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -3
  157. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  158. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +12 -11
  159. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  160. package/edit/persistentvolume/index.vue +3 -1
  161. package/edit/persistentvolumeclaim.vue +2 -0
  162. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +1 -1
  163. package/edit/secret/index.vue +2 -2
  164. package/edit/service.vue +4 -1
  165. package/edit/storage.k8s.io.storageclass/index.vue +10 -8
  166. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  167. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  168. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  169. package/edit/workload/Job.vue +31 -34
  170. package/edit/workload/Upgrading.vue +5 -5
  171. package/edit/workload/index.vue +19 -15
  172. package/edit/workload/storage/Mount.vue +1 -0
  173. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  174. package/edit/workload/storage/azureDisk.vue +14 -10
  175. package/edit/workload/storage/azureFile.vue +9 -7
  176. package/edit/workload/storage/csi/index.vue +6 -9
  177. package/edit/workload/storage/emptyDir.vue +7 -5
  178. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  179. package/edit/workload/storage/hostPath.vue +7 -5
  180. package/edit/workload/storage/nfs.vue +8 -6
  181. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  182. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  183. package/edit/workload/storage/secret.vue +9 -6
  184. package/edit/workload/storage/vsphereVolume.vue +11 -7
  185. package/initialize/app-extended.js +7 -1
  186. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +8 -6
  187. package/mixins/create-edit-view/impl.js +10 -0
  188. package/models/provisioning.cattle.io.cluster.js +19 -18
  189. package/models/workload.js +2 -2
  190. package/package.json +1 -1
  191. package/pages/account/index.vue +93 -58
  192. package/pages/auth/login.vue +24 -27
  193. package/pages/auth/setup.vue +36 -17
  194. package/pages/c/_cluster/auth/roles/index.vue +27 -3
  195. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  196. package/pages/c/_cluster/explorer/index.vue +2 -1
  197. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  198. package/pages/home.vue +55 -13
  199. package/plugins/dashboard-store/actions.js +1 -1
  200. package/public/index.html +1 -1
  201. package/rancher-components/Banner/Banner.vue +14 -2
  202. package/rancher-components/Form/Radio/RadioGroup.vue +9 -1
  203. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +31 -2
  204. package/scripts/build-pkg.sh +18 -23
  205. package/scripts/publish-shell.sh +1 -1
  206. package/store/i18n.js +1 -0
  207. package/store/type-map.js +0 -2
  208. package/types/shell/index.d.ts +8 -0
  209. package/utils/error.js +23 -3
  210. package/utils/errorTranslate.json +397 -8
  211. package/utils/errorTranslateNew.json +39 -0
  212. package/utils/roleFiltering.js +33 -0
  213. package/utils/title.ts +1 -1
@@ -284,128 +284,141 @@ export default {
284
284
 
285
285
  <template>
286
286
  <div class="var-row">
287
- <div class="type">
288
- <LabeledSelect
289
- v-model:value="type"
290
- :mode="mode"
291
- :multiple="false"
292
- :options="options"
293
- option-label="label"
294
- :searchable="false"
295
- :reduce="e=>e.value"
296
- :label="t('workload.container.command.fromResource.type')"
297
- @update:value="updateRow"
298
- />
299
- </div>
300
-
301
- <div
302
- v-if="!hideVariableName"
303
- class="name"
304
- >
305
- <LabeledInput
306
- v-model:value="name"
307
- :label="nameLabel"
308
- :placeholder="t('workload.container.command.fromResource.name.placeholder')"
309
- :mode="mode"
310
- @update:value="updateRow"
311
- />
312
- </div>
313
-
314
- <div
315
- v-if="type==='simple'"
316
- class="single-value"
317
- >
318
- <LabeledInput
319
- v-model:value="valStr"
320
- :label="t('workload.container.command.fromResource.value.label')"
321
- :placeholder="t('workload.container.command.fromResource.value.placeholder')"
322
- :mode="mode"
323
- @update:value="updateRow"
324
- />
287
+ <div class="row">
288
+ <div class="remove">
289
+ <button
290
+ v-if="!isView"
291
+ type="button"
292
+ class="btn role-link"
293
+ @click.stop="$emit('remove')"
294
+ >
295
+ {{ t('generic.remove') }}
296
+ </button>
297
+ </div>
325
298
  </div>
326
299
 
327
- <template v-else-if="needsSource">
328
- <div :class="{'single-value': type === 'configMapRef' || type === 'secretRef'}">
300
+ <div class="row">
301
+ <div class="type span-6 col">
329
302
  <LabeledSelect
330
- v-model:value="referenced"
331
- :options="sourceOptions"
332
- :multiple="false"
333
- :get-option-label="opt=>get(opt, 'metadata.name') || opt"
334
- :get-option-key="opt=>opt.id|| opt"
303
+ v-model:value="type"
335
304
  :mode="mode"
336
- :label="sourceLabel"
337
- :loading="loading"
338
- />
339
- </div>
340
- <div v-if="type!=='secretRef' && type!== 'configMapRef'">
341
- <LabeledSelect
342
- v-model:value="key"
343
305
  :multiple="false"
344
- :options="keys"
345
- :mode="mode"
306
+ :options="options"
346
307
  option-label="label"
347
- :label="t('workload.container.command.fromResource.key.label')"
348
- :loading="loading"
308
+ :searchable="false"
309
+ :reduce="e=>e.value"
310
+ :label="t('workload.container.command.fromResource.type')"
349
311
  @update:value="updateRow"
350
312
  />
351
313
  </div>
352
- </template>
353
-
354
- <template v-else-if="type==='resourceFieldRef'">
355
- <div>
314
+
315
+ <div
316
+ v-if="!hideVariableName"
317
+ class="name span-6 col"
318
+ >
356
319
  <LabeledInput
357
- v-model:value="refName"
358
- :label="t('workload.container.command.fromResource.containerName')"
359
- :placeholder="t('workload.container.command.fromResource.source.placeholder')"
320
+ v-model:value="name"
321
+ :label="nameLabel"
322
+ :placeholder="t('workload.container.command.fromResource.name.placeholder')"
360
323
  :mode="mode"
361
324
  @update:value="updateRow"
362
325
  />
363
326
  </div>
364
- <div>
365
- <LabeledSelect
366
- v-model:value="key"
367
- :label="t('workload.container.command.fromResource.key.label')"
368
- :multiple="false"
369
- :options="resourceKeyOpts"
370
- :mode="mode"
371
- :searchable="false"
372
- :placeholder="t('workload.container.command.fromResource.key.placeholder', null, true)"
373
- @update:value="updateRow"
374
- />
375
- </div>
376
- </template>
327
+ </div>
377
328
 
378
- <template v-else>
379
- <div class="single-value">
329
+ <div class="row">
330
+ <div
331
+ v-if="type==='simple'"
332
+ class="single-value span-6 col"
333
+ >
380
334
  <LabeledInput
381
- v-model:value="fieldPath"
382
- :placeholder="t('workload.container.command.fromResource.key.placeholder', null, true)"
383
- :label="t('workload.container.command.fromResource.key.label')"
335
+ v-model:value="valStr"
336
+ :label="t('workload.container.command.fromResource.value.label')"
337
+ :placeholder="t('workload.container.command.fromResource.value.placeholder')"
384
338
  :mode="mode"
385
339
  @update:value="updateRow"
386
340
  />
387
341
  </div>
388
- </template>
389
- <div class="remove">
390
- <button
391
- v-if="!isView"
392
- type="button"
393
- class="btn role-link"
394
- @click.stop="$emit('remove')"
395
- >
396
- {{ t('generic.remove') }}
397
- </button>
342
+
343
+ <template v-else-if="needsSource">
344
+ <div
345
+ :class="{'single-value': type === 'configMapRef' || type === 'secretRef'}"
346
+ class="span-6 col"
347
+ >
348
+ <LabeledSelect
349
+ v-model:value="referenced"
350
+ :options="sourceOptions"
351
+ :multiple="false"
352
+ :get-option-label="opt=>get(opt, 'metadata.name') || opt"
353
+ :get-option-key="opt=>opt.id|| opt"
354
+ :mode="mode"
355
+ :label="sourceLabel"
356
+ :loading="loading"
357
+ />
358
+ </div>
359
+ <div
360
+ v-if="type!=='secretRef' && type!== 'configMapRef'"
361
+ class="span-6 col"
362
+ >
363
+ <LabeledSelect
364
+ v-model:value="key"
365
+ :multiple="false"
366
+ :options="keys"
367
+ :mode="mode"
368
+ option-label="label"
369
+ :label="t('workload.container.command.fromResource.key.label')"
370
+ :loading="loading"
371
+ @update:value="updateRow"
372
+ />
373
+ </div>
374
+ </template>
375
+
376
+ <template v-else-if="type==='resourceFieldRef'">
377
+ <div class="span-6 col">
378
+ <LabeledInput
379
+ v-model:value="refName"
380
+ :label="t('workload.container.command.fromResource.containerName')"
381
+ :placeholder="t('workload.container.command.fromResource.source.placeholder')"
382
+ :mode="mode"
383
+ @update:value="updateRow"
384
+ />
385
+ </div>
386
+ <div class="span-6 col">
387
+ <LabeledSelect
388
+ v-model:value="key"
389
+ :label="t('workload.container.command.fromResource.key.label')"
390
+ :multiple="false"
391
+ :options="resourceKeyOpts"
392
+ :mode="mode"
393
+ :searchable="false"
394
+ :placeholder="t('workload.container.command.fromResource.key.placeholder', null, true)"
395
+ @update:value="updateRow"
396
+ />
397
+ </div>
398
+ </template>
399
+
400
+ <template v-else>
401
+ <div class="single-value span-6 col">
402
+ <LabeledInput
403
+ v-model:value="fieldPath"
404
+ :placeholder="t('workload.container.command.fromResource.key.placeholder', null, true)"
405
+ :label="t('workload.container.command.fromResource.key.label')"
406
+ :mode="mode"
407
+ @update:value="updateRow"
408
+ />
409
+ </div>
410
+ </template>
398
411
  </div>
399
412
  </div>
400
413
  </template>
401
414
 
402
415
  <style lang='scss' scoped>
403
416
  .var-row{
404
- display: grid;
405
- grid-template-columns: 1fr 1fr 1fr 1fr 100px;
406
- grid-column-gap: 20px;
407
- margin-bottom: 10px;
408
- align-items: center;
417
+ // display: grid;
418
+ // grid-template-columns: 1fr 1fr 1fr 1fr 100px;
419
+ // grid-column-gap: 20px;
420
+ // margin-bottom: 10px;
421
+ // align-items: center;
409
422
 
410
423
  .single-value {
411
424
  grid-column: span 2;
@@ -413,6 +426,7 @@ export default {
413
426
 
414
427
  .remove BUTTON {
415
428
  padding: 0px;
429
+ min-width: auto;
416
430
  }
417
431
  }
418
432
 
@@ -204,6 +204,7 @@ export default {
204
204
  <div
205
205
  :id="id"
206
206
  class="hs-popover__content"
207
+ style="width: auto;padding-right: 10px;"
207
208
  :class="{expanded, [id]:true}"
208
209
  >
209
210
  <div>
@@ -212,14 +213,14 @@ export default {
212
213
  :key="i"
213
214
  class="counts"
214
215
  >
215
- <span class="counts-label">{{ obj.label }}</span>
216
- <span>{{ obj.value }}</span>
216
+ <span class="counts-label" style="white-space: normal;">{{ obj.label }}</span>
217
+ <span style="white-space: normal;">{{ obj.value }}</span>
217
218
  </div>
218
219
  <div
219
220
  v-if="canScale"
220
221
  class="text-center scale"
221
222
  >
222
- <span>{{ t('tableHeaders.scale') }} </span>
223
+ <span style="white-space: nowrap;margin-right: 5px;">{{ t('tableHeaders.scale') }} </span>
223
224
  <PlusMinus
224
225
  :value="row.spec.replicas"
225
226
  :disabled="disabled"
@@ -1,5 +1,7 @@
1
1
  <script>
2
2
  import Type from '@shell/components/nav/Type';
3
+ import { menuRouteMap } from '@shell/config/menuRouteMap';
4
+
3
5
  export default {
4
6
  name: 'Group',
5
7
 
@@ -56,7 +58,8 @@ export default {
56
58
  '网络管理': 'icon-networks',
57
59
  '镜像管理': 'icon-imagelist',
58
60
  '资源管理': 'icon-sorcetype',
59
- '运维管理': 'icon-monitoringandlogging'
61
+ '运维管理': 'icon-monitoringandlogging',
62
+ '日志管理': 'icon-new-Logging'
60
63
  }
61
64
 
62
65
 
@@ -178,6 +181,7 @@ export default {
178
181
 
179
182
  let parentPath = '';
180
183
  const cluster = this.$route.params?.cluster;
184
+ const resource = this.$route?.params?.resource || ''
181
185
 
182
186
  // Where we use nested route configuration, consider the parent route when trying to identify the nav location
183
187
  if (this.$route.matched.length > 1) {
@@ -201,6 +205,9 @@ export default {
201
205
  return true;
202
206
  } else if (parentPath && itemFullPath === parentPath) {
203
207
  return true;
208
+ // === 新增映射逻辑 ===
209
+ } else if (menuRouteMap[item.name] && menuRouteMap[item.name].includes(resource)) {
210
+ return true;
204
211
  }
205
212
  }
206
213
  }
@@ -80,7 +80,7 @@ export default {
80
80
  ctx: this,
81
81
  showImportModal: false,
82
82
  showSearchModal: false,
83
- userIcon: require('@shell/assets/images/logo.png'),
83
+ userIcon: require('@shell/assets/images/logo.svg'),
84
84
  };
85
85
  },
86
86
 
@@ -277,14 +277,14 @@ export default {
277
277
 
278
278
  methods: {
279
279
 
280
- LogOutfn (type) {
281
- sessionStorage.removeItem('TOPLEVELPERMISSIONS')
280
+ LogOutfn(type) {
281
+ sessionStorage.removeItem('TOPLEVELPERMISSIONS');
282
282
  if (type === '1') {
283
- this.$router.push({ name: 'account'})
283
+ this.$router.push({ name: 'account' });
284
284
  } else if (type === '2') {
285
- this.showSloModal()
285
+ this.showSloModal();
286
286
  } else if (type === '3') {
287
- this.$router.push(this.generateLogoutRoute)
287
+ this.$router.push(this.generateLogoutRoute);
288
288
  }
289
289
  },
290
290
 
@@ -413,160 +413,35 @@ export default {
413
413
  </script>
414
414
 
415
415
  <template>
416
-
417
416
  <!-- 整个页面的顶部 header -->
418
417
  <header
419
418
  ref="header"
420
419
  data-testid="header"
421
420
  >
422
421
  <div>
423
-
424
422
  <!-- 顶部一级菜单(根据不同产品/集群条件决定是否显示) -->
425
423
  <TopLevelMenu v-if="isRancherInHarvester || isMultiCluster || !isSingleProduct" />
426
424
  </div>
427
425
 
428
- <!-- <div
429
- class="menu-spacer"
430
- :class="{'isSingleProduct': isSingleProduct }"
431
- >
432
- <router-link
433
- v-if="isSingleProduct && !isRancherInHarvester"
434
- :to="singleProductLogoRoute"
435
- role="link"
436
- :alt="t('branding.logos.home')"
437
- >
438
- <BrandImage
439
- v-if="isSingleProduct.supportCustomLogo && isHarvester"
440
- class="side-menu-logo"
441
- file-name="harvester.svg"
442
- :support-custom-logo="true"
443
- :alt="t('branding.logos.label')"
444
- />
445
- <img
446
- v-else
447
- class="side-menu-logo"
448
- :src="isSingleProduct.logo"
449
- :alt="t('branding.logos.label')"
450
- >
451
- </router-link>
452
- </div>
453
-
454
- <div
455
- v-if="!simple"
456
- ref="product"
457
- class="product"
458
- >
459
- <div
460
- v-if="currentProduct && currentProduct.showClusterSwitcher"
461
- v-clean-tooltip="nameTooltip"
462
- class="cluster cluster-clipped"
463
- >
464
- <div
465
- v-if="isSingleProduct && !isRancherInHarvester"
466
- class="product-name"
467
- >
468
- <template v-if="isSingleProduct.supportCustomLogo">
469
- {{ vendor }}
470
- </template>
471
- <template v-else>
472
- {{ t(isSingleProduct.productNameKey) }}
473
- </template>
474
- </div>
475
- <template v-else>
476
- <ClusterProviderIcon
477
- v-if="currentCluster"
478
- :cluster="currentCluster"
479
- class="mr-10"
480
- :alt="t('branding.logos.label')"
481
- />
482
- <div
483
- v-if="currentCluster"
484
- ref="clusterName"
485
- class="cluster-name"
486
- >
487
- {{ currentCluster.spec.displayName }}
488
- </div>
489
- <ClusterBadge
490
- v-if="currentCluster"
491
- :cluster="currentCluster"
492
- class="ml-10"
493
- :alt="t('branding.logos.label')"
494
- />
495
- <div
496
- v-if="!currentCluster"
497
- class="simple-title"
498
- >
499
- <BrandImage
500
- class="side-menu-logo-img"
501
- file-name="rancher-logo.svg"
502
- :alt="t('branding.logos.label')"
503
- />
504
- </div>
505
- </template>
506
- </div>
507
- <div
508
- v-if="currentProduct && !currentProduct.showClusterSwitcher"
509
- class="cluster"
510
- >
511
- <img
512
- v-if="currentProduct.iconHeader"
513
- v-bind="$attrs"
514
- :src="currentProduct.iconHeader"
515
- class="cluster-os-logo mr-10"
516
- style="width: 44px; height: 36px;"
517
- :alt="t('branding.logos.label')"
518
- >
519
- <div class="product-name">
520
- {{ prod }}
521
- </div>
522
- </div>
523
- </div>
524
-
525
- <div
526
- v-else
527
- class="simple-title"
528
- >
529
- <div
530
- v-if="isSingleProduct"
531
- class="product-name"
532
- >
533
- {{ t(isSingleProduct.productNameKey) }}
534
- </div>
535
-
536
- <div
537
- v-else
538
- class="side-menu-logo"
539
- >
540
- <BrandImage
541
- class="side-menu-logo-img"
542
- data-testid="header__brand-img"
543
- file-name="rancher-logo.svg"
544
- :alt="t('branding.logos.label')"
545
- />
546
- </div>
547
- </div> -->
548
-
549
- <!-- ===== 左侧 logo 区域 ===== -->
426
+ <!-- ===== 左侧 logo 区域 ===== -->
550
427
  <div class="menu-spacer">
551
428
  <!-- 如果是单产品模式且不是 RancherInHarvester,就显示 logo 路由跳转 -->
552
429
  <router-link
553
430
  v-if="isSingleProduct && !isRancherInHarvester"
554
431
  :to="singleProductLogoRoute"
555
432
  >
556
-
557
433
  <!-- 显示用户头像或 logo 图片 -->
558
434
  <img
559
435
  :src="userIcon"
560
436
  >
561
437
  </router-link>
562
438
  </div>
563
-
439
+
564
440
  <!-- ===== 中间占位符(把左右内容分开) ===== -->
565
441
  <div class="spacer" />
566
442
 
567
443
  <!-- ===== 右侧功能区域 ===== -->
568
444
  <div class="rd-header-right">
569
-
570
445
  <!-- 动态插入右侧自定义组件(例如插件扩展的 header) -->
571
446
  <component :is="navHeaderRight" />
572
447
 
@@ -575,10 +450,9 @@ export default {
575
450
  v-if="showFilter"
576
451
  class="top"
577
452
  >
578
-
579
453
  <!-- 如果集群就绪 + 当前产品支持命名空间过滤器 或 Explorer 模式 -->
580
454
  <NamespaceFilter v-if="clusterReady && currentProduct && (currentProduct.showNamespaceFilter || isExplorer)" />
581
-
455
+
582
456
  <!-- 否则显示工作空间切换器 -->
583
457
  <WorkspaceSwitcher v-else-if="clusterReady && currentProduct && currentProduct.showWorkspaceSwitcher" />
584
458
  </div>
@@ -588,12 +462,10 @@ export default {
588
462
  v-if="currentCluster && !simple"
589
463
  class="header-buttons"
590
464
  >
591
-
592
465
  <!-- 如果当前产品支持集群切换器 -->
593
466
  <template v-if="currentProduct && currentProduct.showClusterSwitcher">
594
-
595
467
  <!-- 导入 YAML 按钮 -->
596
- <button
468
+ <!-- <button
597
469
  v-if="showImportYaml"
598
470
  v-clean-tooltip="t('nav.import')"
599
471
  :disabled="!importEnabled"
@@ -606,9 +478,9 @@ export default {
606
478
  @click="openImport()"
607
479
  >
608
480
  <i class="icon icon-upload icon-lg" />
609
- </button>
481
+ </button> -->
610
482
 
611
- <button
483
+ <!-- <button
612
484
  v-if="showKubeShell"
613
485
  id="btn-kubectl"
614
486
  v-clean-tooltip="t('nav.shellShortcut', {key: shellShortcut})"
@@ -623,10 +495,10 @@ export default {
623
495
  @click="currentCluster.openShell()"
624
496
  >
625
497
  <i class="icon icon-terminal icon-lg" />
626
- </button>
498
+ </button> -->
627
499
 
628
500
  <!-- 下载 kubeconfig 按钮 -->
629
- <button
501
+ <!-- <button
630
502
  v-if="showKubeConfig"
631
503
  v-clean-tooltip="t('nav.kubeconfig.download')"
632
504
  :disabled="!kubeConfigEnabled"
@@ -639,10 +511,10 @@ export default {
639
511
  @click="currentCluster.downloadKubeConfig()"
640
512
  >
641
513
  <i class="icon icon-file icon-lg" />
642
- </button>
514
+ </button> -->
643
515
 
644
516
  <!-- 复制 kubeconfig 按钮 -->
645
- <button
517
+ <!-- <button
646
518
  v-if="showCopyConfig"
647
519
  v-clean-tooltip="t('nav.kubeconfig.copy')"
648
520
  :disabled="!kubeConfigEnabled"
@@ -654,23 +526,22 @@ export default {
654
526
  :aria-label="t('nav.kubeconfig.copy')"
655
527
  @click="copyKubeConfig($event)"
656
528
  >
657
-
658
- <!-- 点击复制后显示对勾 -->
529
+
659
530
  <i
660
531
  v-if="kubeConfigCopying"
661
532
  class="icon icon-checkmark icon-lg"
662
533
  />
663
534
 
664
- <!-- 未复制状态显示复制图标 -->
665
535
  <i
666
536
  v-else
667
537
  class="icon icon-copy icon-lg"
668
538
  />
669
- </button>
539
+ </button> -->
670
540
  </template>
671
541
 
672
542
  <!-- 资源搜索按钮 -->
673
- <button
543
+ <!-- 2025/9/30 隐藏 -->
544
+ <!-- <button
674
545
  v-if="showSearch"
675
546
  id="header-btn-search"
676
547
  v-clean-tooltip="t('nav.resourceSearch.toolTip', {key: searchShortcut})"
@@ -685,7 +556,7 @@ export default {
685
556
  @click="openSearch()"
686
557
  >
687
558
  <i class="icon icon-search icon-lg" />
688
- </button>
559
+ </button> -->
689
560
 
690
561
  <!-- 搜索弹窗 -->
691
562
  <app-modal
@@ -697,8 +568,7 @@ export default {
697
568
  :trigger-focus-trap="true"
698
569
  return-focus-selector="#header-btn-search"
699
570
  @close="hideSearch()"
700
- >
701
- </app-modal>
571
+ />
702
572
  </div>
703
573
 
704
574
  <!-- ===== 插件扩展按钮区 ===== -->
@@ -706,28 +576,33 @@ export default {
706
576
  v-if="extensionHeaderActions.length"
707
577
  class="header-buttons"
708
578
  >
709
- <button
579
+ <template
710
580
  v-for="action, i in extensionHeaderActions"
711
581
  :key="`${action.label}${i}`"
712
- v-clean-tooltip="handleExtensionTooltip(action)"
713
- v-shortkey="action.shortcutKey"
714
- :disabled="action.enabled ? !action.enabled(ctx) : false"
715
- type="button"
716
- class="btn header-btn role-tertiary"
717
- :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
718
- role="button"
719
- tabindex="0"
720
- :aria-label="action.label"
721
- @shortkey="handleExtensionAction(action, $event)"
722
- @click="handleExtensionAction(action, $event)"
723
582
  >
724
- <IconOrSvg
725
- class="icon icon-lg"
726
- :icon="action.icon"
727
- :src="action.svg"
728
- color="header"
729
- />
730
- </button>
583
+ <!-- kubectl-explain.action | 2025/9/30隐藏 -->
584
+ <button
585
+ v-if="action.labelKey !== 'kubectl-explain.action'"
586
+ v-clean-tooltip="handleExtensionTooltip(action)"
587
+ v-shortkey="action.shortcutKey"
588
+ :disabled="action.enabled ? !action.enabled(ctx) : false"
589
+ type="button"
590
+ class="btn header-btn role-tertiary"
591
+ :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
592
+ role="button"
593
+ tabindex="0"
594
+ :aria-label="action.label"
595
+ @shortkey="handleExtensionAction(action, $event)"
596
+ @click="handleExtensionAction(action, $event)"
597
+ >
598
+ <IconOrSvg
599
+ class="icon icon-lg"
600
+ :icon="action.icon"
601
+ :src="action.svg"
602
+ color="header"
603
+ />
604
+ </button>
605
+ </template>
731
606
  </div>
732
607
 
733
608
  <!-- ===== 用户菜单(右上角头像 + 下拉) ===== -->
@@ -738,7 +613,6 @@ export default {
738
613
  v-if="showUserMenu"
739
614
  :aria-label="t('nav.userMenu.label')"
740
615
  >
741
-
742
616
  <!-- 头像触发按钮 -->
743
617
  <rc-dropdown-trigger
744
618
  ghost
@@ -758,7 +632,10 @@ export default {
758
632
  v-else
759
633
  class="icon icon-user icon-3x avatar"
760
634
  /> -->
761
- <i class="icon icon-usericon" style="padding-bottom: 5px;" />
635
+ <i
636
+ class="icon icon-usericon"
637
+ style="padding-bottom: 5px;"
638
+ />
762
639
  <span class="login-name">{{ principal.loginName }}</span>
763
640
  </rc-dropdown-trigger>
764
641
 
@@ -1021,7 +898,7 @@ export default {
1021
898
  border: none;
1022
899
  background: var(--header-btn-bg);
1023
900
  color: var(--header-btn-text);
1024
- padding: 0 15px 0 10px;
901
+ padding: 0 10px 0 10px;
1025
902
  line-height: 32px;
1026
903
  min-height: 32px;
1027
904
  width: 30px;