dashboard-shell-shell 1.0.122 → 1.0.1000000082

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +88 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +26 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +542 -553
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +9 -1
  343. package/types/cloud-shell/index.d.ts +11020 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
@@ -0,0 +1,769 @@
1
+ <script>
2
+ import { KUBERNETES, PROJECT } from '@shell/config/labels-annotations';
3
+ import { FLEET, NAMESPACE, MANAGEMENT, HELM } from '@shell/config/types';
4
+ import ButtonGroup from '@shell/components/ButtonGroup';
5
+ // import { BadgeState } from '@components/BadgeState';
6
+ import DotState from '@shell/components/DotState.vue';
7
+ import { Banner } from '@components/Banner';
8
+ import { get } from '@shell/utils/object';
9
+ import { NAME as FLEET_NAME } from '@shell/config/product/fleet';
10
+ import { HIDE_SENSITIVE } from '@shell/store/prefs';
11
+ import {
12
+ AS, _DETAIL, _CONFIG, _YAML, MODE, _CREATE, _EDIT, _VIEW, _UNFLAG, _GRAPH
13
+ } from '@shell/config/query-params';
14
+ import { ExtensionPoint, PanelLocation } from '@shell/core/types';
15
+ import ExtensionPanel from '@shell/components/ExtensionPanel';
16
+ import TabTitle from '@shell/components/TabTitle';
17
+ import ActionMenu from '@shell/components/ActionMenuShell.vue';
18
+ import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
19
+ import { useStore } from 'vuex';
20
+ import { harvesterhci2cloud, cloud2harvesterhci } from '@shell/utils/router'
21
+
22
+ // i18n-uses resourceDetail.header.*
23
+
24
+ /**
25
+ * Resource Detail Masthead component.
26
+ *
27
+ * ToDo: this component seem to be picking up a lot of logic from special cases, could be simplified down to parameters and then customized per use-case via wrapper component
28
+ */
29
+ export default {
30
+
31
+ name: 'MastheadResourceDetail',
32
+
33
+ components: {
34
+ // BadgeState,
35
+ DotState,
36
+ Banner,
37
+ ButtonGroup,
38
+ ExtensionPanel,
39
+ TabTitle,
40
+ ActionMenu,
41
+ },
42
+ props: {
43
+ value: {
44
+ type: Object,
45
+ default: () => {
46
+ return {};
47
+ }
48
+ },
49
+
50
+ mode: {
51
+ type: String,
52
+ default: 'create'
53
+ },
54
+
55
+ realMode: {
56
+ type: String,
57
+ default: 'create'
58
+ },
59
+
60
+ as: {
61
+ type: String,
62
+ default: _YAML,
63
+ },
64
+
65
+ hasGraph: {
66
+ type: Boolean,
67
+ default: false
68
+ },
69
+
70
+ hasDetail: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+
75
+ hasEdit: {
76
+ type: Boolean,
77
+ default: false
78
+ },
79
+
80
+ storeOverride: {
81
+ type: String,
82
+ default: null,
83
+ },
84
+
85
+ resource: {
86
+ type: String,
87
+ default: null,
88
+ },
89
+
90
+ resourceSubtype: {
91
+ type: String,
92
+ default: null,
93
+ },
94
+
95
+ parentRouteOverride: {
96
+ type: String,
97
+ default: null,
98
+ },
99
+
100
+ canViewYaml: {
101
+ type: Boolean,
102
+ default: false,
103
+ }
104
+ },
105
+
106
+ setup() {
107
+ const store = useStore();
108
+ const { featureDropdownMenu } = useRuntimeFlag(store);
109
+
110
+ return { featureDropdownMenu };
111
+ },
112
+
113
+ data() {
114
+ return {
115
+ DETAIL_VIEW: _DETAIL,
116
+ extensionType: ExtensionPoint.PANEL,
117
+ extensionLocation: PanelLocation.DETAILS_MASTHEAD,
118
+ Svg: require('~shell/assets/images/API.svg')
119
+ };
120
+ },
121
+
122
+ computed: {
123
+ dev() {
124
+ return this.$store.getters['prefs/dev'];
125
+ },
126
+
127
+ schema() {
128
+ const inStore = this.storeOverride || this.$store.getters['currentStore'](this.resource);
129
+
130
+ return this.$store.getters[`${ inStore }/schemaFor`]( this.resource );
131
+ },
132
+
133
+ isView() {
134
+ return this.mode === _VIEW;
135
+ },
136
+
137
+ isEdit() {
138
+ return this.mode === _EDIT;
139
+ },
140
+
141
+ isCreate() {
142
+ return this.mode === _CREATE;
143
+ },
144
+
145
+ isNamespace() {
146
+ return this.schema?.id === NAMESPACE;
147
+ },
148
+
149
+ isProject() {
150
+ return this.schema?.id === MANAGEMENT.PROJECT;
151
+ },
152
+
153
+ isProjectHelmChart() {
154
+ return this.schema?.id === HELM.PROJECTHELMCHART;
155
+ },
156
+
157
+ hasMultipleNamespaces() {
158
+ return !!this.value.namespaces;
159
+ },
160
+
161
+ namespace() {
162
+ if (this.value?.metadata?.namespace) {
163
+ return this.value?.metadata?.namespace;
164
+ }
165
+
166
+ return null;
167
+ },
168
+
169
+ detailsAction() {
170
+ return this.value?.detailsAction;
171
+ },
172
+
173
+ shouldHifenize() {
174
+ return (this.mode === 'view' || this.mode === 'edit') && this.resourceSubtype?.length && this.value?.nameDisplay?.length;
175
+ },
176
+
177
+ namespaceLocation() {
178
+ if (!this.isNamespace) {
179
+ return this.value.namespaceLocation || {
180
+ name: 'c-cluster-product-resource-id',
181
+ params: {
182
+ cluster: this.$route.params.cluster,
183
+ product: this.$store.getters['productId'],
184
+ resource: NAMESPACE,
185
+ id: this.$route.params.namespace
186
+ }
187
+ };
188
+ }
189
+
190
+ return null;
191
+ },
192
+
193
+ isWorkspace() {
194
+ return this.$store.getters['productId'] === FLEET_NAME && !!this.value?.metadata?.namespace;
195
+ },
196
+
197
+ workspaceLocation() {
198
+ return {
199
+ name: 'c-cluster-product-resource-id',
200
+ params: {
201
+ cluster: this.$route.params.cluster,
202
+ product: this.$store.getters['productId'],
203
+ resource: FLEET.WORKSPACE,
204
+ id: this.$route.params.namespace
205
+ }
206
+ };
207
+ },
208
+
209
+ project() {
210
+ if (this.isNamespace) {
211
+ const cluster = this.$store.getters['currentCluster'];
212
+
213
+ if (cluster) {
214
+ const id = (this.value?.metadata?.labels || {})[PROJECT];
215
+
216
+ return this.$store.getters['management/byId'](MANAGEMENT.PROJECT, `${ cluster.id }/${ id }`);
217
+ }
218
+ }
219
+
220
+ return null;
221
+ },
222
+
223
+ banner() {
224
+ if (this.value?.stateObj?.error) {
225
+ const defaultErrorMessage = this.t('resourceDetail.masthead.defaultBannerMessage.error', undefined, true);
226
+
227
+ return {
228
+ color: 'error',
229
+ message: this.value.stateObj.message || defaultErrorMessage
230
+ };
231
+ }
232
+
233
+ if (this.value?.spec?.paused) {
234
+ return {
235
+ color: 'info',
236
+ message: this.t('asyncButton.pause.description')
237
+ };
238
+ }
239
+
240
+ if (this.value?.stateObj?.transitioning) {
241
+ const defaultTransitioningMessage = this.t('resourceDetail.masthead.defaultBannerMessage.transitioning', undefined, true);
242
+
243
+ return {
244
+ color: 'info',
245
+ message: this.value.stateObj.message || defaultTransitioningMessage
246
+ };
247
+ }
248
+
249
+ return null;
250
+ },
251
+
252
+ parent() {
253
+ const displayName = this.value?.parentNameOverride || this.$store.getters['type-map/labelFor'](this.schema);
254
+ const product = this.$store.getters['currentProduct'].name;
255
+
256
+ const defaultLocation = {
257
+ name: 'c-cluster-product-resource',
258
+ params: {
259
+ resource: harvesterhci2cloud(this.resource),
260
+ product,
261
+ }
262
+ };
263
+
264
+ const location = this.value?.parentLocationOverride || defaultLocation;
265
+
266
+ if (this.parentRouteOverride) {
267
+ location.name = this.parentRouteOverride;
268
+ }
269
+
270
+ const typeOptions = this.$store.getters[`type-map/optionsFor`]( this.resource );
271
+ const out = {
272
+ displayName, location, ...typeOptions
273
+ };
274
+
275
+ return out;
276
+ },
277
+
278
+ hideSensitiveData() {
279
+ return this.$store.getters['prefs/get'](HIDE_SENSITIVE);
280
+ },
281
+
282
+ sensitiveOptions() {
283
+ return [
284
+ {
285
+ tooltipKey: 'resourceDetail.masthead.sensitive.hide',
286
+ icon: 'icon-hide',
287
+ value: true,
288
+ },
289
+ {
290
+ tooltipKey: 'resourceDetail.masthead.sensitive.show',
291
+ icon: 'icon-show',
292
+ value: false
293
+ }
294
+ ];
295
+ },
296
+
297
+ viewOptions() {
298
+ const out = [];
299
+
300
+ if ( this.hasDetail ) {
301
+ out.push({
302
+ labelKey: 'resourceDetail.masthead.detail',
303
+ value: _DETAIL,
304
+ });
305
+ }
306
+
307
+ if ( this.hasEdit && this.parent?.showConfigView !== false) {
308
+ out.push({
309
+ labelKey: 'resourceDetail.masthead.config',
310
+ value: _CONFIG,
311
+ });
312
+ }
313
+
314
+ if ( this.hasGraph ) {
315
+ out.push({
316
+ labelKey: 'resourceDetail.masthead.graph',
317
+ value: _GRAPH,
318
+ });
319
+ }
320
+
321
+ if ( this.canViewYaml ) {
322
+ out.push({
323
+ labelKey: 'resourceDetail.masthead.yaml',
324
+ value: _YAML,
325
+ });
326
+ }
327
+
328
+ if ( out.length < 2 ) {
329
+ return null;
330
+ }
331
+
332
+ return out;
333
+ },
334
+
335
+ currentView: {
336
+ get() {
337
+ return this.as;
338
+ },
339
+
340
+ set(val) {
341
+ switch ( val ) {
342
+ case _DETAIL:
343
+ this.$router.applyQuery({
344
+ [MODE]: _UNFLAG,
345
+ [AS]: _UNFLAG,
346
+ });
347
+ break;
348
+ case _CONFIG:
349
+ this.$router.applyQuery({
350
+ [MODE]: _UNFLAG,
351
+ [AS]: _CONFIG,
352
+ });
353
+ break;
354
+ case _GRAPH:
355
+ this.$router.applyQuery({
356
+ [MODE]: _UNFLAG,
357
+ [AS]: _GRAPH,
358
+ });
359
+ break;
360
+ case _YAML:
361
+ this.$router.applyQuery({
362
+ [MODE]: _UNFLAG,
363
+ [AS]: _YAML,
364
+ });
365
+ break;
366
+ }
367
+ },
368
+ },
369
+
370
+ showSensitiveToggle() {
371
+ return !!this.value.hasSensitiveData && this.mode === _VIEW && this.as !== _YAML;
372
+ },
373
+
374
+ managedWarning() {
375
+ const { value } = this;
376
+ const labels = value?.metadata?.labels || {};
377
+
378
+ const managedBy = labels[KUBERNETES.MANAGED_BY] || '';
379
+ const appName = labels[KUBERNETES.MANAGED_NAME] || labels[KUBERNETES.INSTANCE] || '';
380
+
381
+ return {
382
+ show: this.mode === _EDIT && !!managedBy,
383
+ type: value?.kind || '',
384
+ hasName: appName ? 'yes' : 'no',
385
+ appName,
386
+ managedBy,
387
+ };
388
+ },
389
+
390
+ displayName() {
391
+ let displayName = this.value.nameDisplay;
392
+
393
+ if (this.isProjectHelmChart) {
394
+ displayName = this.value.projectDisplayName;
395
+ }
396
+
397
+ return this.shouldHifenize ? ` - ${ displayName }` : displayName;
398
+ },
399
+
400
+ demoDisplay() {
401
+ const product = this.$store.getters['productId'];
402
+
403
+ const productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], this.location.params.resource);
404
+
405
+ if (productId === undefined) {
406
+ return '';
407
+ }
408
+ const parts = productId.split('::');
409
+ const newString = 'root';
410
+
411
+ if (!parts?.includes(newString)) {
412
+ parts.unshift(newString); // 将字符串添加到数组第一位
413
+ }
414
+
415
+ const partsEn = parts.map((item) => {
416
+ return this.$store.getters['i18n/t'](`typeLabel."${ item.toLowerCase() }"`);
417
+ });
418
+
419
+ return partsEn;
420
+ },
421
+ menuIcon() {
422
+ const product = this.$store.getters['productId'];
423
+
424
+ const resources = this.location?.params?.resource || ''
425
+
426
+ return this.$store.getters['type-map/groupsForVirTypes'](product, cloud2harvesterhci(resources));
427
+ },
428
+
429
+ location() {
430
+ const { parent } = this;
431
+
432
+ return parent?.location;
433
+ },
434
+
435
+ hideNamespaceLocation() {
436
+ return this.$store.getters['currentProduct'].hideNamespaceLocation || this.value.namespaceLocation === null;
437
+ },
438
+
439
+ resourceExternalLink() {
440
+ return this.value.resourceExternalLink;
441
+ },
442
+ },
443
+
444
+ methods: {
445
+ get,
446
+
447
+ showActions() {
448
+ this.$store.commit('action-menu/show', {
449
+ resources: this.value,
450
+ elem: this.$refs.actions,
451
+ });
452
+ },
453
+
454
+ toggleSensitiveData(e) {
455
+ this.$store.dispatch('prefs/set', { key: HIDE_SENSITIVE, value: !!e });
456
+ },
457
+
458
+ invokeDetailsAction() {
459
+ const action = this.detailsAction;
460
+
461
+ if (action) {
462
+ const fn = this.value[action.action];
463
+
464
+ if (fn) {
465
+ fn.apply(this.value, []);
466
+ }
467
+ }
468
+ }
469
+ }
470
+ };
471
+ </script>
472
+
473
+ <template>
474
+
475
+ <!-- 顶部区域的容器 -->
476
+ <div class="masthead">
477
+ <div class="title">
478
+
479
+ <!-- 面包屑导航(创建 API 密钥时不显示) -->
480
+ <div
481
+ v-if="!(parentRouteOverride === 'account' && resource=== 'token')"
482
+ class="excram-list"
483
+ >
484
+
485
+ <!-- 遍历 demoDisplay 生成面包屑路径 -->
486
+ <span
487
+ v-for="(item,index) in demoDisplay"
488
+ :key="index"
489
+ >
490
+ <span v-if="item">{{ item }}</span>
491
+ <span v-if="item">/</span>
492
+ </span>
493
+
494
+ <!-- 最后一个面包屑显示当前操作(查看/编辑/创建)+ 父资源名称 -->
495
+ <span class="excram-last-name">
496
+ {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + parent.displayName }}
497
+ </span>
498
+ </div>
499
+
500
+ <header>
501
+ <div class="title">
502
+ <div class="primaryheader">
503
+ <span class="primary-title">
504
+
505
+ <!-- 图标区 -->
506
+ <span v-if="menuIcon && !(parentRouteOverride === 'account' && resource=== 'token')" class="detailIcon-span">
507
+ <!-- 如果是账户 API token,则显示图片,否则显示 icon -->
508
+ <img
509
+ v-if="parentRouteOverride === 'account' && resource=== 'token'"
510
+ :src="Svg"
511
+ style="margin-top: 4px; margin-left: 5px;"
512
+ >
513
+ <i
514
+ v-else
515
+ :class="'icon-'+ menuIcon + ' detailIcon'"
516
+ />
517
+ </span>
518
+
519
+ <!-- 资源标题(创建时只显示“创建+名称”,否则显示“名称:”) -->
520
+ <span class="detailIcon-span-title">{{ realMode=== 'create'? '创建': '' }}{{ parent.displayName }}{{ realMode=== 'create'? '': '名称:' }}</span>
521
+
522
+ <!-- 如果不是创建模式,显示操作描述 -->
523
+ <span v-if="realMode !== 'create'">
524
+
525
+ <!-- 如果有覆盖方法,优先显示覆盖内容 -->
526
+ <span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
527
+
528
+ <!-- 否则用 t 组件国际化显示 -->
529
+ <t
530
+ v-else
531
+ :k="'resourceDetail.header.' + realMode"
532
+ :subtype="resourceSubtype"
533
+ :name="displayName"
534
+ :escapehtml="false"
535
+ />
536
+ </span>
537
+
538
+ <!-- 状态点(DotState 组件) -->
539
+ <DotState
540
+ v-if="!isCreate && parent.showState"
541
+ class="masthead-state"
542
+ :value="value"
543
+ />
544
+
545
+ <!-- Istio 注入状态 -->
546
+ <span
547
+ v-if="!isCreate && value.injectionEnabled"
548
+ class="masthead-istio"
549
+ >
550
+ <i
551
+ v-clean-tooltip="t('projectNamespaces.isIstioInjectionEnabled')"
552
+ class="icon icon-sm icon-istio"
553
+ />
554
+ </span>
555
+ </span>
556
+
557
+ <!-- 如果有返回路径,显示分隔符和“返回”链接 -->
558
+ <span
559
+ v-if="location"
560
+ class="valid"
561
+ >|</span>
562
+ <router-link
563
+ v-if="location"
564
+ :to="location"
565
+ >
566
+ 返回
567
+ </router-link>
568
+ </div>
569
+ </div>
570
+
571
+ <!-- 右侧操作按钮区域(支持通过 slot 覆盖) -->
572
+ <slot name="right">
573
+ <div class="actions-container align-start" style="padding-right: 15px;">
574
+ <div class="actions">
575
+
576
+ <!-- 详情模式下的主操作按钮 -->
577
+ <button
578
+ v-if="detailsAction && currentView === DETAIL_VIEW && isView"
579
+ type="button"
580
+ class="btn role-primary actions mr-10"
581
+ :disabled="!detailsAction.enabled"
582
+ @click="invokeDetailsAction"
583
+ >
584
+ {{ detailsAction.label }}
585
+ </button>
586
+
587
+ <!-- 敏感信息显示/隐藏切换 -->
588
+ <ButtonGroup
589
+ v-if="showSensitiveToggle"
590
+ :value="!!hideSensitiveData"
591
+ icon-size="lg"
592
+ :options="sensitiveOptions"
593
+ class="mr-10"
594
+ @update:value="toggleSensitiveData"
595
+ />
596
+
597
+ <!-- 视图切换按钮 -->
598
+ <ButtonGroup
599
+ v-if="viewOptions && isView"
600
+ v-model:value="currentView"
601
+ :options="viewOptions"
602
+ class="mr-10"
603
+ />
604
+
605
+ <!-- 功能菜单:优先使用 ActionMenu 组件 -->
606
+ <template v-if="featureDropdownMenu">
607
+ <ActionMenu
608
+ v-if="isView"
609
+ button-role="multiAction"
610
+ button-size="compact"
611
+ :resource="value"
612
+ data-testid="masthead-action-menu"
613
+ />
614
+ </template>
615
+
616
+ <!-- 如果没有 featureDropdownMenu,则使用普通的多操作按钮 -->
617
+ <template v-else>
618
+ <button
619
+ v-if="isView"
620
+ ref="actions"
621
+ data-testid="masthead-action-menu"
622
+ aria-haspopup="true"
623
+ type="button"
624
+ class="btn role-multi-action actions"
625
+ @click="showActions"
626
+ >
627
+ <i class="icon icon-actions" />
628
+ </button>
629
+ </template>
630
+ </div>
631
+ </div>
632
+ </slot>
633
+ </header>
634
+
635
+ <!-- 扩展区域 -->
636
+ <ExtensionPanel
637
+ :resource="value"
638
+ :type="extensionType"
639
+ :location="extensionLocation"
640
+ />
641
+
642
+ <!-- 顶部状态 Banner -->
643
+ <Banner
644
+ v-if="banner && isView && !parent.hideBanner"
645
+ class="state-banner mb-10"
646
+ :color="banner.color"
647
+ :label="banner.message"
648
+ />
649
+
650
+ <!-- 管理警告 Banner -->
651
+ <Banner
652
+ v-if="managedWarning.show"
653
+ color="warning"
654
+ class="mb-20"
655
+ :label="t('resourceDetail.masthead.managedWarning', managedWarning)"
656
+ />
657
+
658
+ <!-- 内容插槽 -->
659
+ <slot />
660
+ </div>
661
+ </div>
662
+ </template>
663
+
664
+ <style lang='scss' scoped>
665
+ .masthead {
666
+ padding-bottom: 10px;
667
+ /* border-bottom: 1px solid var(--border); */
668
+ margin-bottom: 10px;
669
+ }
670
+
671
+ HEADER {
672
+ margin: 0;
673
+ }
674
+
675
+ .primaryheader {
676
+ display: flex;
677
+ flex-direction: row;
678
+ align-items: center;
679
+ font-size:14px;
680
+ height: 50px;
681
+
682
+ h1 {
683
+ margin: 0;
684
+ }
685
+ }
686
+
687
+ .subheader{
688
+ display: flex;
689
+ flex-direction: row;
690
+ color: var(--input-label);
691
+ & > * {
692
+ margin: 5px 20px 5px 0px;
693
+ }
694
+
695
+ .live-data {
696
+ color: var(--body-text)
697
+ }
698
+ }
699
+
700
+ .state-banner {
701
+ margin: 3px 0 0 0;
702
+ }
703
+
704
+ .masthead-state {
705
+ font-size: initial;
706
+ display: inline-block;
707
+ position: relative;
708
+ /* top: -2px; */
709
+ font-size: 12px;
710
+ margin-left: 5px;
711
+ }
712
+
713
+ .masthead-istio {
714
+ .icon {
715
+ vertical-align: middle;
716
+ color: var(--primary);
717
+ }
718
+ }
719
+
720
+ .left-right-split {
721
+ display: grid;
722
+ align-items: center;
723
+
724
+ .left-half {
725
+ grid-column: 1;
726
+ }
727
+
728
+ .right-half {
729
+ grid-column: 2;
730
+ }
731
+ }
732
+
733
+ .resource-external {
734
+ font-size: 18px;
735
+ }
736
+ .excram-list{
737
+ font-size: 14px;
738
+ margin-bottom: 20px;
739
+ }
740
+ .excram-last-name{
741
+ color: var(--link);
742
+ }
743
+ .valid{
744
+ color: #d7d7d7;
745
+ margin: 0px 10px;
746
+ }
747
+ .detailIcon-span{
748
+ width: 24px;
749
+ height: 24px;
750
+ display: inline-block;
751
+ position: relative;
752
+ background: var(--primary);
753
+ margin-right: 10px;
754
+ }
755
+ .detailIcon{
756
+ position: absolute;
757
+ color: #fff;
758
+ font-size: 38px;
759
+ left: 4px;
760
+ top: -2px;
761
+ }
762
+ .primary-title{
763
+ display: flex;
764
+ align-items: center;
765
+ }
766
+ .detailIcon-span-title{
767
+ font-weight: bold;
768
+ }
769
+ </style>