dashboard-shell-shell 1.0.121 → 1.0.1000000081

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 +89 -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 +9 -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 +540 -554
  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 +2 -1
  343. package/types/cloud-shell/index.d.ts +11014 -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
@@ -22,10 +22,12 @@ import { _CREATE, _EDIT, _VIEW } from '@shell/config/query-params';
22
22
  import { findBy, removeObject, clear } from '@shell/utils/array';
23
23
  import { createYaml } from '@shell/utils/create-yaml';
24
24
  import {
25
- clone, diff, set, get, isEmpty, mergeWithReplaceArrays
25
+ clone, diff, set, get, isEmpty, mergeWithReplace
26
26
  } from '@shell/utils/object';
27
27
  import { allHash } from '@shell/utils/promise';
28
- import { getAllOptionsAfterCurrentVersion, filterOutDeprecatedPatchVersions, isHarvesterSatisfiesVersion, labelForAddon } from '@shell/utils/cluster';
28
+ import {
29
+ getAllOptionsAfterCurrentVersion, filterOutDeprecatedPatchVersions, isHarvesterSatisfiesVersion, labelForAddon, initSchedulingCustomization
30
+ } from '@shell/utils/cluster';
29
31
 
30
32
  import { BadgeState } from '@components/BadgeState';
31
33
  import { Banner } from '@components/Banner';
@@ -63,7 +65,6 @@ import ClusterAppearance from '@shell/components/form/ClusterAppearance';
63
65
  import AddOnAdditionalManifest from '@shell/edit/provisioning.cattle.io.cluster/tabs/AddOnAdditionalManifest';
64
66
  import VsphereUtils, { VMWARE_VSPHERE } from '@shell/utils/v-sphere';
65
67
  import { mapGetters } from 'vuex';
66
- import { SCHEDULING_CUSTOMIZATION } from '@shell/store/features';
67
68
  const HARVESTER = 'harvester';
68
69
  const HARVESTER_CLOUD_PROVIDER = 'harvester-cloud-provider';
69
70
  const NETBIOS_TRUNCATION_LENGTH = 15;
@@ -149,7 +150,13 @@ export default {
149
150
  await this.initSpecs();
150
151
  await this.initAddons();
151
152
  await this.initRegistry();
152
- await this.initSchedulingCustomization();
153
+ const sc = await initSchedulingCustomization(this.value.spec, this.features, this.$store, this.mode);
154
+
155
+ this.clusterAgentDefaultPC = sc.clusterAgentDefaultPC;
156
+ this.clusterAgentDefaultPDB = sc.clusterAgentDefaultPDB;
157
+ this.schedulingCustomizationFeatureEnabled = sc.schedulingCustomizationFeatureEnabled;
158
+ this.schedulingCustomizationOriginallyEnabled = sc.schedulingCustomizationOriginallyEnabled;
159
+ this.errors = this.errors.concat(sc.errors);
153
160
 
154
161
  Object.entries(this.chartValues).forEach(([name, value]) => {
155
162
  const key = this.chartVersionKey(name);
@@ -243,20 +250,21 @@ export default {
243
250
  fvFormRuleSets: [{
244
251
  path: 'metadata.name', rules: ['subDomain'], translationKey: 'nameNsDescription.name.label'
245
252
  }],
246
- harvesterVersionRange: {},
247
- cisOverride: false,
253
+ harvesterVersionRange: {},
254
+ cisOverride: false,
248
255
  truncateLimit,
249
- busy: false,
250
- machinePoolValidation: {}, // map of validation states for each machine pool
251
- machinePoolErrors: {},
252
- addonConfigValidation: {}, // validation state of each addon config (boolean of whether codemirror's yaml lint passed)
253
- allNamespaces: [],
254
- extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.CLUSTER_CREATE_RKE2, this.$route, this),
255
- clusterAgentDeploymentCustomization: null,
256
- schedulingCustomizationFeatureEnabled: false,
257
- clusterAgentDefaultPC: null,
258
- clusterAgentDefaultPDB: null,
259
- activeTab: null,
256
+ busy: false,
257
+ machinePoolValidation: {}, // map of validation states for each machine pool
258
+ machinePoolErrors: {},
259
+ addonConfigValidation: {}, // validation state of each addon config (boolean of whether codemirror's yaml lint passed)
260
+ allNamespaces: [],
261
+ extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.CLUSTER_CREATE_RKE2, this.$route, this),
262
+ clusterAgentDeploymentCustomization: null,
263
+ schedulingCustomizationFeatureEnabled: false,
264
+ schedulingCustomizationOriginallyEnabled: false,
265
+ clusterAgentDefaultPC: null,
266
+ clusterAgentDefaultPDB: null,
267
+ activeTab: null,
260
268
  REGISTRIES_TAB_NAME,
261
269
  labelForAddon
262
270
 
@@ -568,7 +576,7 @@ export default {
568
576
  out.tooltip[role] = this.t(`cluster.machinePool.nodeTotals.tooltip.${ role }`, { count: counts[role] });
569
577
  }
570
578
 
571
- if (counts.etcd === 0) {
579
+ if (counts.etcd <= 0) {
572
580
  out.color.etcd = NODE_TOTAL.error.color;
573
581
  out.icon.etcd = NODE_TOTAL.error.icon;
574
582
  } else if (counts.etcd === 1 || counts.etcd % 2 === 0 || counts.etcd > 7) {
@@ -576,7 +584,7 @@ export default {
576
584
  out.icon.etcd = NODE_TOTAL.warning.icon;
577
585
  }
578
586
 
579
- if (counts.controlPlane === 0) {
587
+ if (counts.controlPlane <= 0) {
580
588
  out.color.controlPlane = NODE_TOTAL.error.color;
581
589
  out.icon.controlPlane = NODE_TOTAL.error.icon;
582
590
  } else if (counts.controlPlane === 1) {
@@ -584,7 +592,7 @@ export default {
584
592
  out.icon.controlPlane = NODE_TOTAL.warning.icon;
585
593
  }
586
594
 
587
- if (counts.worker === 0) {
595
+ if (counts.worker <= 0) {
588
596
  out.color.worker = NODE_TOTAL.error.color;
589
597
  out.icon.worker = NODE_TOTAL.error.icon;
590
598
  } else if (counts.worker === 1) {
@@ -1062,24 +1070,6 @@ export default {
1062
1070
  }
1063
1071
  },
1064
1072
 
1065
- async initSchedulingCustomization() {
1066
- this.schedulingCustomizationFeatureEnabled = this.features(SCHEDULING_CUSTOMIZATION);
1067
- try {
1068
- this.clusterAgentDefaultPC = JSON.parse((await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.CLUSTER_AGENT_DEFAULT_PRIORITY_CLASS })).value) || null;
1069
- } catch (e) {
1070
- this.errors.push(e);
1071
- }
1072
- try {
1073
- this.clusterAgentDefaultPDB = JSON.parse((await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.CLUSTER_AGENT_DEFAULT_POD_DISTRIBUTION_BUDGET })).value) || null;
1074
- } catch (e) {
1075
- this.errors.push(e);
1076
- }
1077
-
1078
- if (this.schedulingCustomizationFeatureEnabled && this.mode === _CREATE && isEmpty(this.value?.spec?.clusterAgentDeploymentCustomization?.schedulingCustomization)) {
1079
- set(this.value, 'spec.clusterAgentDeploymentCustomization.schedulingCustomization', { priorityClass: this.clusterAgentDefaultPC, podDisruptionBudget: this.clusterAgentDefaultPDB });
1080
- }
1081
- },
1082
-
1083
1073
  setSchedulingCustomization(val) {
1084
1074
  if (val) {
1085
1075
  set(this.value, 'spec.clusterAgentDeploymentCustomization.schedulingCustomization', { priorityClass: this.clusterAgentDefaultPC, podDisruptionBudget: this.clusterAgentDefaultPDB });
@@ -1315,7 +1305,7 @@ export default {
1315
1305
  delete clonedCurrentConfig.metadata;
1316
1306
 
1317
1307
  if (this.provider === VMWARE_VSPHERE) {
1318
- machinePool.config = mergeWithReplaceArrays(clonedLatestConfig, clonedCurrentConfig);
1308
+ machinePool.config = mergeWithReplace(clonedLatestConfig, clonedCurrentConfig, { mutateOriginal: true });
1319
1309
  } else {
1320
1310
  machinePool.config = merge(clonedLatestConfig, clonedCurrentConfig);
1321
1311
  }
@@ -1701,7 +1691,7 @@ export default {
1701
1691
  const defaultChartValue = this.versionInfo[name];
1702
1692
  const key = this.chartVersionKey(name);
1703
1693
 
1704
- return mergeWithReplaceArrays(defaultChartValue?.values, this.userChartValues[key]);
1694
+ return mergeWithReplace(defaultChartValue?.values, this.userChartValues[key]);
1705
1695
  },
1706
1696
 
1707
1697
  initServerAgentArgs() {
@@ -2450,6 +2440,7 @@ export default {
2450
2440
  :scheduling-customization-feature-enabled="schedulingCustomizationFeatureEnabled"
2451
2441
  :default-p-c="clusterAgentDefaultPC"
2452
2442
  :default-p-d-b="clusterAgentDefaultPDB"
2443
+ :scheduling-customization-originally-enabled="schedulingCustomizationOriginallyEnabled"
2453
2444
  @scheduling-customization-changed="setSchedulingCustomization"
2454
2445
  />
2455
2446
  </Tab>
@@ -119,14 +119,17 @@ export default {
119
119
  >
120
120
  <template #default="{row, i}">
121
121
  <template v-if="row.value.machineLabelSelector">
122
- <h3>{{ t('cluster.advanced.argInfo.machineSelector.title') }}</h3>
123
122
  <MatchExpressions
124
123
  v-model:value="row.value.machineLabelSelector"
125
124
  class="mb-20"
126
125
  :mode="mode"
127
126
  :show-remove="false"
128
127
  :initial-empty-row="true"
129
- />
128
+ >
129
+ <template #header>
130
+ <h3>{{ t('cluster.advanced.argInfo.machineSelector.title') }}</h3>
131
+ </template>
132
+ </MatchExpressions>
130
133
  <h3>{{ t('cluster.advanced.argInfo.machineSelector.subTitle') }}</h3>
131
134
  </template>
132
135
  <h3 v-else>
@@ -48,6 +48,11 @@ export default {
48
48
  type: Boolean,
49
49
  required: false
50
50
  },
51
+ schedulingCustomizationOriginallyEnabled: {
52
+ type: Boolean,
53
+ default: false
54
+ },
55
+
51
56
  defaultPC: {
52
57
  type: Object,
53
58
  default: () => {},
@@ -149,7 +154,7 @@ export default {
149
154
  },
150
155
 
151
156
  schedulingCustomizationVisible() {
152
- return this.schedulingCustomizationFeatureEnabled || (this.isEdit && this.value.schedulingCustomization );
157
+ return this.schedulingCustomizationFeatureEnabled || this.schedulingCustomizationOriginallyEnabled;
153
158
  },
154
159
 
155
160
  affinityOptions() {
@@ -8,6 +8,8 @@ import AdvancedSection from '@shell/components/AdvancedSection.vue';
8
8
  import { Banner } from '@components/Banner';
9
9
  import UnitInput from '@shell/components/form/UnitInput.vue';
10
10
  import { randomStr } from '@shell/utils/string';
11
+ import FormValidation from '@shell/mixins/form-validation';
12
+ import { MACHINE_POOL_VALIDATION } from '@shell/utils/validators/machine-pool';
11
13
 
12
14
  export default {
13
15
 
@@ -25,6 +27,8 @@ export default {
25
27
  UnitInput
26
28
  },
27
29
 
30
+ mixins: [FormValidation],
31
+
28
32
  props: {
29
33
  value: {
30
34
  type: Object,
@@ -122,6 +126,12 @@ export default {
122
126
  uuid: randomStr(),
123
127
 
124
128
  unhealthyNodeTimeoutInteger: this.value.pool.unhealthyNodeTimeout ? parseDuration(this.value.pool.unhealthyNodeTimeout) : 0,
129
+
130
+ validationErrors: [],
131
+
132
+ MACHINE_POOL_VALIDATION,
133
+
134
+ fvFormRuleSets: MACHINE_POOL_VALIDATION.RULESETS,
125
135
  };
126
136
  },
127
137
 
@@ -136,7 +146,7 @@ export default {
136
146
 
137
147
  isWindows() {
138
148
  return this.value?.config?.os === 'windows';
139
- },
149
+ }
140
150
  },
141
151
 
142
152
  watch: {
@@ -148,6 +158,20 @@ export default {
148
158
  } else {
149
159
  this.value.pool.machineOS = 'linux';
150
160
  }
161
+ },
162
+
163
+ validationErrors: {
164
+ handler(newValue) {
165
+ this.$emit('validationChanged', newValue.length === 0);
166
+ },
167
+ deep: true
168
+ },
169
+
170
+ fvFormIsValid: {
171
+ handler(newValue) {
172
+ this.$emit('validationChanged', newValue);
173
+ },
174
+ deep: true
151
175
  }
152
176
  },
153
177
 
@@ -227,6 +251,8 @@ export default {
227
251
  :label="t('cluster.machinePool.name.label')"
228
252
  :required="true"
229
253
  :disabled="!value.config || !!value.config.id || busy"
254
+ :rules="fvGetAndReportPathRules(MACHINE_POOL_VALIDATION.FIELDS.NAME)"
255
+ data-testid="machine-pool-name-input"
230
256
  />
231
257
  </div>
232
258
  <div class="col span-4">
@@ -238,6 +264,8 @@ export default {
238
264
  type="number"
239
265
  min="0"
240
266
  :required="true"
267
+ :rules="fvGetAndReportPathRules(MACHINE_POOL_VALIDATION.FIELDS.QUANTITY)"
268
+ data-testid="machine-pool-quantity-input"
241
269
  />
242
270
  </div>
243
271
  <div class="col span-4 pt-5">
@@ -264,7 +292,10 @@ export default {
264
292
  />
265
293
  </div>
266
294
  </div>
267
- <hr class="mt-10">
295
+ <hr
296
+ class="mt-10"
297
+ role="none"
298
+ >
268
299
  <component
269
300
  :is="configComponent"
270
301
  v-if="value.config && configComponent"
@@ -48,7 +48,7 @@ export default {
48
48
  return this.value.spec.rkeConfig.etcd;
49
49
  },
50
50
  argsEtcdExposeMetrics() {
51
- return !!this.selectedVersion?.serverArgs['etcd-expose-metrics'];
51
+ return !!this.selectedVersion?.serverArgs?.['etcd-expose-metrics'];
52
52
  },
53
53
  configEtcdExposeMetrics() {
54
54
  return !!this.value.spec.rkeConfig.machineGlobalConfig['etcd-expose-metrics'];
@@ -90,8 +90,8 @@ export default {
90
90
  v-model:value="etcd.snapshotRetention"
91
91
  :mode="mode"
92
92
  :label="t('cluster.rke2.etcd.snapshotRetention.label')"
93
- :suffix="t('cluster.rke2.snapshots.suffix')"
94
- :tooltip="t('cluster.rke2.etcd.snapshotRetention.tooltip')"
93
+ :suffix="s3Backup ? t('cluster.rke2.snapshots.s3Suffix') : t('cluster.rke2.snapshots.suffix')"
94
+ :tooltip="s3Backup ? t('cluster.rke2.etcd.snapshotRetention.tooltip') : undefined"
95
95
  />
96
96
  </div>
97
97
  </div>
package/edit/service.vue CHANGED
@@ -521,9 +521,6 @@ export default {
521
521
  "
522
522
  :label="t('servicesPage.affinity.timeout.label')"
523
523
  :placeholder="t('servicesPage.affinity.timeout.placeholder')"
524
- @input="
525
- (e) => value.spec.sessionAffinityConfig.clientIP.timeoutSeconds = e
526
- "
527
524
  />
528
525
  </div>
529
526
  </div>
package/edit/token.vue CHANGED
@@ -175,6 +175,15 @@ export default {
175
175
 
176
176
  <template>
177
177
  <div v-if="!created">
178
+ <div
179
+ v-for="(err,idx) in errors"
180
+ :key="idx"
181
+ >
182
+ <Banner
183
+ color="error"
184
+ :label="err"
185
+ />
186
+ </div>
178
187
  <div class="pl-10 pr-10">
179
188
  <LabeledInput
180
189
  key="description"
@@ -184,19 +193,20 @@ export default {
184
193
  mode="edit"
185
194
  :min-height="30"
186
195
  />
196
+ <div class="mt-20">
197
+ <LabeledSelect
198
+ v-model:value="value.clusterId"
199
+ class="scope-select"
200
+ label-key="accountAndKeys.apiKeys.add.scope"
201
+ :options="scopes"
202
+ />
203
+ </div>
187
204
 
188
- <LabeledSelect
189
- v-model:value="value.clusterId"
190
- class="mt-20 scope-select"
191
- label-key="accountAndKeys.apiKeys.add.scope"
192
- :options="scopes"
193
- />
194
-
195
- <h5 class="pt-20">
205
+ <div style="font-size: 14px; margin-top: 32px;">
196
206
  {{ t('accountAndKeys.apiKeys.add.expiry.label') }}
197
- </h5>
207
+ </div>
198
208
 
199
- <div class="ml-10">
209
+ <div class="mt-20">
200
210
  <RadioGroup
201
211
  v-model:value="form.expiryType"
202
212
  :options="expiryOptions"
@@ -204,12 +214,14 @@ export default {
204
214
  class="mr-20"
205
215
  name="expiryGroup"
206
216
  />
207
- <div class="ml-20 mt-10 expiry">
217
+ <div class="mt-20 expiry">
208
218
  <input
209
219
  v-model="form.customExpiry"
210
220
  :disabled="form.expiryType !== 'custom'"
211
221
  type="number"
222
+ class="expire-input"
212
223
  :mode="mode"
224
+ :aria-label="t('accountAndKeys.apiKeys.add.ariaLabel.expiration')"
213
225
  >
214
226
  <Select
215
227
  v-model:value="form.customExpiryUnits"
@@ -217,6 +229,7 @@ export default {
217
229
  :options="expiryUnitsOptions"
218
230
  :clearable="false"
219
231
  :reduce="opt=>opt.value"
232
+ :aria-label="t('accountAndKeys.apiKeys.add.ariaLabel.expirationUnits')"
220
233
  />
221
234
  </div>
222
235
  </div>
@@ -297,6 +310,14 @@ export default {
297
310
  flex: 0 0 200px;
298
311
  margin-right: 10px;
299
312
  }
313
+ .expire-input{
314
+ border: solid var(--border-width) var(--input-border);
315
+ padding: 0px 0px 0px 11px;
316
+ line-height: 30px;
317
+ /* &['disabled']{
318
+ border: solid var(--border-width) var(--input-border);
319
+ } */
320
+ }
300
321
  }
301
322
 
302
323
  .buttons {
@@ -161,7 +161,7 @@ export default {
161
161
  :suffix="t('suffix.times', {count: completions})"
162
162
  label-key="workload.job.completions.label"
163
163
  tooltip-key="workload.job.completions.tip"
164
- @input="update"
164
+ @update:value="update"
165
165
  />
166
166
  </div>
167
167
  <div
@@ -174,7 +174,7 @@ export default {
174
174
  :suffix="t('suffix.times', {count: parallelism})"
175
175
  label-key="workload.job.parallelism.label"
176
176
  tooltip-key="workload.job.parallelism.tip"
177
- @input="update"
177
+ @update:value="update"
178
178
  />
179
179
  </div>
180
180
  </div>
@@ -189,7 +189,7 @@ export default {
189
189
  :suffix="t('suffix.times', {count: backoffLimit})"
190
190
  label-key="workload.job.backoffLimit.label"
191
191
  tooltip-key="workload.job.backoffLimit.tip"
192
- @input="update"
192
+ @update:value="update"
193
193
  />
194
194
  </div>
195
195
  <div
@@ -202,7 +202,7 @@ export default {
202
202
  :suffix="t('suffix.seconds', {count: activeDeadlineSeconds})"
203
203
  label-key="workload.job.activeDeadlineSeconds.label"
204
204
  tooltip-key="workload.job.activeDeadlineSeconds.tip"
205
- @input="update"
205
+ @update:value="update"
206
206
  />
207
207
  </div>
208
208
  </div>
@@ -245,7 +245,7 @@ export default {
245
245
  :suffix="t('suffix.seconds', {count: startingDeadlineSeconds})"
246
246
  label-key="workload.job.startingDeadlineSeconds.label"
247
247
  tooltip-key="workload.job.startingDeadlineSeconds.tip"
248
- @input="update"
248
+ @update:value="update"
249
249
  />
250
250
  </div>
251
251
  <div
@@ -257,7 +257,7 @@ export default {
257
257
  :suffix="t('suffix.seconds', { count: terminationGracePeriodSeconds })"
258
258
  :label="t('workload.upgrading.activeDeadlineSeconds.label')"
259
259
  :mode="mode"
260
- @input="update"
260
+ @update:value="update"
261
261
  >
262
262
  <template #label>
263
263
  <label
@@ -64,7 +64,6 @@ describe('component: Job', () => {
64
64
  const newValue = 123;
65
65
 
66
66
  input.setValue(newValue);
67
- input.trigger('blur');
68
67
 
69
68
  expect(wrapper.emitted('update:value')).toHaveLength(1);
70
69
  });
@@ -599,6 +599,7 @@ export default {
599
599
  v-if="!isView"
600
600
  type="button"
601
601
  class="btn-sm role-link"
602
+ data-testid="workload-button-add-container"
602
603
  @click="addContainerBtn"
603
604
  >
604
605
  <i class="icon icon-plus pr-5" /> {{ t('workload.container.addContainer') }}
@@ -52,6 +52,8 @@ import { TYPES as SECRET_TYPES } from '@shell/models/secret';
52
52
  import { defaultContainer } from '@shell/models/workload';
53
53
  import { allHash } from '@shell/utils/promise';
54
54
 
55
+ import { harvesterhci2cloud, cloud2harvesterhci } from '@shell/utils/router'
56
+
55
57
  const TAB_WEIGHT_MAP = {
56
58
  general: 99,
57
59
  healthCheck: 98,
@@ -169,7 +171,7 @@ export default {
169
171
  data() {
170
172
  serialMaker.setPrefix('container-');
171
173
  serialMaker.setSeq(0);
172
- let type = this.$route.params.resource;
174
+ let type = cloud2harvesterhci(this.$route.params.resource);
173
175
  const createSidecar = !!this.$route.query.sidecar;
174
176
 
175
177
  if (type === 'workload') {
@@ -618,8 +620,6 @@ export default {
618
620
  this.registerBeforeHook(this.getPorts, 'getPorts');
619
621
 
620
622
  this.registerAfterHook(this.saveService, 'saveService');
621
-
622
- this.selectContainer(this.container);
623
623
  },
624
624
 
625
625
  methods: {
@@ -26,6 +26,7 @@ import replaceAll from '@shell/plugins/replaceall';
26
26
  import steveCreateWorker from '@shell/plugins/steve-create-worker';
27
27
  import emberCookie from '@shell/plugins/ember-cookie';
28
28
  import ShortKey from '@shell/plugins/shortkey';
29
+ import internalApiPlugin from '@shell/plugins/internal-api';
29
30
 
30
31
  import 'floating-vue/dist/style.css';
31
32
  import { floatingVueOptions } from '@shell/plugins/floating-vue';
@@ -46,7 +47,7 @@ export async function installPlugins(vueApp) {
46
47
  }
47
48
 
48
49
  export async function installInjectedPlugins(app, vueApp) {
49
- const pluginDefinitions = [config, cookieUniversal, axios, plugins, pluginsLoader, axiosShell, intNumber, codeMirror, nuxtClientInit, replaceAll, plugin, steveCreateWorker, emberCookie];
50
+ const pluginDefinitions = [config, cookieUniversal, axios, plugins, pluginsLoader, axiosShell, intNumber, codeMirror, nuxtClientInit, replaceAll, plugin, steveCreateWorker, emberCookie, internalApiPlugin];
50
51
 
51
52
  const installations = pluginDefinitions.map(async(pluginDefinition) => {
52
53
  if (typeof pluginDefinition === 'function') {
@@ -178,7 +178,10 @@ export default {
178
178
  <div class="no-clusters">
179
179
  {{ t('harvesterManager.cluster.none') }}
180
180
  </div>
181
- <hr class="info-section">
181
+ <hr
182
+ class="info-section"
183
+ role="none"
184
+ >
182
185
  <div class="logo">
183
186
  <BrandImage
184
187
  file-name="harvester.png"
@@ -225,6 +225,7 @@ export default {
225
225
  height="auto"
226
226
  styles="max-height: 100vh;"
227
227
  :click-to-close="!restart || !waiting"
228
+ :trigger-focus-trap="true"
228
229
  @close="close"
229
230
  >
230
231
  <Card
@@ -41,7 +41,9 @@ export default {
41
41
  },
42
42
  headers() {
43
43
  const headersFromSchema = this.$store.getters['type-map/headersFor'](this.schema);
44
-
44
+ [headersFromSchema[0], headersFromSchema[1]] = [headersFromSchema[1], headersFromSchema[0]];
45
+ headersFromSchema[0].width = '200px';
46
+ headersFromSchema[1].width = '100px';
45
47
  if (this.hasHarvesterResourceQuotaSchema) {
46
48
  headersFromSchema.splice(2, 0, NS_SNAPSHOT_QUOTA);
47
49
  }
@@ -113,24 +113,32 @@ export default {
113
113
  },
114
114
 
115
115
  createLocation() {
116
- return {
117
- name: 'c-cluster-product-resource-create',
118
- params: {
119
- product: this.$store.getters['currentProduct'].name,
120
- resource: this.resource
121
- },
116
+ const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
117
+ const params = {
118
+ product: this.$store.getters['currentProduct'].name,
119
+ resource: this.resource
120
+ };
121
+ const defaultLocation = {
122
+ name: 'c-cluster-product-resource-create',
123
+ params
122
124
  };
125
+
126
+ return options.createLocation ? options.createLocation(params) : defaultLocation;
123
127
  },
124
128
 
125
129
  importLocation() {
126
- return {
127
- name: 'c-cluster-product-resource-create',
128
- params: {
129
- product: this.$store.getters['currentProduct'].name,
130
- resource: this.resource
131
- },
130
+ const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
131
+ const params = {
132
+ product: this.$store.getters['currentProduct'].name,
133
+ resource: this.resource
134
+ };
135
+ const defaultLocation = {
136
+ name: 'c-cluster-product-resource-create',
137
+ params,
132
138
  query: { [MODE]: _IMPORT }
133
139
  };
140
+
141
+ return options.importLocation ? options.importLocation(params) : defaultLocation;
134
142
  },
135
143
 
136
144
  canImport() {
package/list/workload.vue CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  } from '@shell/config/types';
6
6
  import ResourceFetch from '@shell/mixins/resource-fetch';
7
7
  import PaginatedResourceTable from '@shell/components/PaginatedResourceTable';
8
+ import { harvesterhci2cloud, cloud2harvesterhci } from '@shell/utils/router'
8
9
 
9
10
  const workloadSchema = {
10
11
  id: 'workload',
@@ -26,10 +27,10 @@ const $loadingResources = ($route, $store) => {
26
27
  }
27
28
  });
28
29
 
29
- const allTypes = $route.params.resource === workloadSchema.id;
30
+ const allTypes = cloud2harvesterhci($route.params.resource) === workloadSchema.id;
30
31
 
31
32
  return {
32
- loadResources: allTypes ? allowedResources : [$route.params.resource],
33
+ loadResources: allTypes ? allowedResources : [cloud2harvesterhci($route.params.resource)],
33
34
  loadIndeterminate: allTypes,
34
35
  };
35
36
  };
@@ -54,7 +55,7 @@ export default {
54
55
  if (this.allTypes && this.loadResources.length) {
55
56
  this.$initializeFetchData(this.loadResources[0], this.loadResources);
56
57
  } else {
57
- this.$initializeFetchData(this.$route.params.resource);
58
+ this.$initializeFetchData(cloud2harvesterhci(this.$route.params.resource));
58
59
  }
59
60
 
60
61
  try {
@@ -73,7 +74,7 @@ export default {
73
74
  return this.$fetchType(allowed, this.loadResources);
74
75
  }));
75
76
  } else {
76
- const type = this.$route.params.resource;
77
+ const type = cloud2harvesterhci(this.$route.params.resource);
77
78
 
78
79
  if ( this.$store.getters['cluster/schemaFor'](type) ) {
79
80
  const resource = await this.$fetchType(type);
@@ -88,7 +89,7 @@ export default {
88
89
  const { loadResources, loadIndeterminate } = $loadingResources(this.$route, this.$store);
89
90
 
90
91
  const { params:{ resource: type } } = this.$route;
91
- const allTypes = this.$route.params.resource === workloadSchema.id;
92
+ const allTypes = cloud2harvesterhci(this.$route.params.resource) === workloadSchema.id;
92
93
  const schema = type !== workloadSchema.id ? this.$store.getters['cluster/schemaFor'](type) : workloadSchema;
93
94
  const paginationEnabled = !allTypes && this.$store.getters[`cluster/paginationEnabled`]?.({ id: type });
94
95
 
@@ -143,7 +144,7 @@ export default {
143
144
  this.$fetchType(POD);
144
145
  this.$fetchType(WORKLOAD_TYPES.JOB);
145
146
  } else {
146
- const type = this.$route.params.resource;
147
+ const type = cloud2harvesterhci(this.$route.params.resource);
147
148
 
148
149
  if (type === WORKLOAD_TYPES.JOB || type === POD) {
149
150
  // Ignore job and pods (we're fetching this anyway, plus they contain their own state)