@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4

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 (473) hide show
  1. package/apis/impl/apis.ts +6 -0
  2. package/apis/index.ts +26 -0
  3. package/apis/intf/resources-api/cluster-api.ts +18 -0
  4. package/apis/intf/resources-api/mgmt-api.ts +15 -0
  5. package/apis/intf/resources-api/resource-base.ts +107 -0
  6. package/apis/intf/resources-api/resource-constants.ts +147 -0
  7. package/apis/intf/resources-api/resources-api.ts +143 -0
  8. package/apis/intf/resources.ts +49 -0
  9. package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
  10. package/apis/intf/shell-api/proxy.ts +216 -0
  11. package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
  12. package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
  13. package/apis/intf/shell.ts +12 -6
  14. package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
  15. package/apis/resources/index.ts +22 -0
  16. package/apis/resources/resources-api-class.ts +187 -0
  17. package/apis/shell/__tests__/proxy.test.ts +369 -0
  18. package/apis/shell/index.ts +8 -1
  19. package/apis/shell/modal.ts +4 -1
  20. package/apis/shell/notifications.ts +9 -6
  21. package/apis/shell/proxy.ts +256 -0
  22. package/apis/shell/slide-in.ts +4 -1
  23. package/apis/vue-shim.d.ts +2 -1
  24. package/assets/data/aws-regions.json +4 -0
  25. package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
  26. package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
  27. package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
  28. package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
  29. package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
  30. package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
  31. package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
  32. package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
  33. package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
  34. package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
  35. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
  36. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
  37. package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
  38. package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
  39. package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
  40. package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
  41. package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
  42. package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
  43. package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
  44. package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
  45. package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
  46. package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
  47. package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
  48. package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
  49. package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
  50. package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
  51. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
  52. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
  53. package/assets/styles/base/_variables.scss +2 -0
  54. package/assets/styles/fonts/_fontstack.scss +132 -8
  55. package/assets/styles/global/_layout.scss +4 -0
  56. package/assets/translations/en-us.yaml +165 -45
  57. package/assets/translations/zh-hans.yaml +1 -7
  58. package/chart/monitoring/ClusterSelector.vue +0 -21
  59. package/chart/monitoring/index.vue +10 -1
  60. package/chart/monitoring/prometheus/index.vue +6 -3
  61. package/components/ActionDropdownShell.vue +2 -1
  62. package/components/CruResource.vue +161 -14
  63. package/components/CruResourceFooter.vue +9 -5
  64. package/components/ExplorerMembers.vue +8 -4
  65. package/components/ExplorerProjectsNamespaces.vue +11 -7
  66. package/components/GrowlManager.vue +4 -0
  67. package/components/InstallHelmCharts.vue +2 -2
  68. package/components/LandingPagePreference.vue +14 -5
  69. package/components/MgmtNodeList.vue +184 -0
  70. package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
  72. package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
  73. package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
  74. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
  75. package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
  76. package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
  77. package/components/Resource/Detail/Metadata/index.vue +6 -0
  78. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  79. package/components/Resource/Detail/SpacedRow.vue +3 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  81. package/components/ResourceDetail/index.vue +1 -1
  82. package/components/ResourceList/Masthead.vue +19 -9
  83. package/components/ResourceList/index.vue +82 -1
  84. package/components/RichTranslation.vue +5 -2
  85. package/components/SelectIconGrid.vue +0 -10
  86. package/components/Setting.vue +1 -0
  87. package/components/SingleClusterInfo.vue +1 -0
  88. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  89. package/components/SortableTable/index.vue +6 -9
  90. package/components/SortableTable/selection.js +23 -5
  91. package/components/SortableTable/sorting.js +6 -3
  92. package/components/SubtleLink.vue +31 -6
  93. package/components/Tabbed/Tab.vue +29 -3
  94. package/components/Tabbed/index.vue +25 -3
  95. package/components/TableOfContents/TableOfContents.vue +109 -0
  96. package/components/TableOfContents/composables.ts +258 -0
  97. package/components/Window/ContainerShell.vue +21 -11
  98. package/components/Window/__tests__/ContainerShell.test.ts +107 -37
  99. package/components/Wizard.vue +23 -17
  100. package/components/fleet/AppCoChartGrid.vue +401 -0
  101. package/components/fleet/AppCoEmptyState.vue +127 -0
  102. package/components/fleet/AppCoPageHeader.vue +119 -0
  103. package/components/fleet/AppCoVersionSelect.vue +70 -0
  104. package/components/fleet/FleetBundles.vue +100 -12
  105. package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
  106. package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
  107. package/components/fleet/FleetClusterTargets/index.vue +226 -161
  108. package/components/fleet/FleetIntro.vue +7 -3
  109. package/components/fleet/FleetNoWorkspaces.vue +7 -3
  110. package/components/fleet/FleetSecretSelector.vue +5 -3
  111. package/components/fleet/FleetValuesFrom.vue +8 -2
  112. package/components/fleet/GitRepoTargetTab.vue +0 -2
  113. package/components/fleet/HelmOpAdvancedTab.vue +19 -53
  114. package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
  115. package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
  116. package/components/fleet/HelmOpResourcesSection.vue +82 -0
  117. package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
  118. package/components/fleet/HelmOpTargetTab.vue +64 -60
  119. package/components/fleet/HelmOpValuesTab.vue +129 -105
  120. package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
  121. package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
  122. package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
  124. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  125. package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
  127. package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
  128. package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
  129. package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
  130. package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
  131. package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
  132. package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
  133. package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
  134. package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
  135. package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
  136. package/components/fleet/dashboard/Empty.vue +8 -4
  137. package/components/fleet/dashboard/ResourceCard.vue +28 -0
  138. package/components/fleet/dashboard/ResourceDetails.vue +28 -0
  139. package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
  140. package/components/form/ArrayList.vue +61 -4
  141. package/components/form/KeyValue.vue +23 -2
  142. package/components/form/LabeledSelect.vue +59 -4
  143. package/components/form/Labels.vue +22 -3
  144. package/components/form/NameNsDescription.vue +24 -5
  145. package/components/form/ResourceTabs/index.vue +1 -0
  146. package/components/form/Security.vue +6 -2
  147. package/components/form/WorkloadPorts.vue +2 -7
  148. package/components/form/__tests__/NameNsDescription.test.ts +75 -0
  149. package/components/form/__tests__/Security.test.ts +76 -0
  150. package/components/formatter/Autoscaler.vue +4 -4
  151. package/components/formatter/ClusterKubeVersion.vue +27 -0
  152. package/components/formatter/ClusterLink.vue +1 -7
  153. package/components/formatter/ClusterProvider.vue +6 -10
  154. package/components/formatter/FleetSummaryGraph.vue +0 -3
  155. package/components/formatter/InternalExternalIP.vue +10 -4
  156. package/components/formatter/MachineSummaryGraph.vue +1 -1
  157. package/components/formatter/PodsUsage.vue +2 -2
  158. package/components/formatter/ServiceTargets.vue +26 -7
  159. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  160. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  161. package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
  162. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  163. package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
  164. package/components/nav/Header.vue +4 -0
  165. package/components/nav/NamespaceFilter.vue +2 -2
  166. package/components/nav/TopLevelMenu.helper.ts +15 -3
  167. package/components/nav/TopLevelMenu.vue +22 -6
  168. package/components/nav/__tests__/Header.test.ts +15 -0
  169. package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
  170. package/components/templates/default.vue +9 -4
  171. package/components/templates/home.vue +23 -0
  172. package/components/templates/plain.vue +23 -0
  173. package/components/templates/standalone.vue +17 -0
  174. package/composables/useFormValidation.ts +93 -0
  175. package/composables/useHelmOpResources.test.ts +56 -0
  176. package/composables/useHelmOpResources.ts +32 -0
  177. package/composables/useStateColor.test.ts +325 -0
  178. package/composables/useStateColor.ts +128 -0
  179. package/composables/useVeeValidateField.test.ts +159 -0
  180. package/composables/useVeeValidateField.ts +67 -0
  181. package/config/home-links.js +1 -1
  182. package/config/labels-annotations.js +1 -0
  183. package/config/pagination-table-headers.js +18 -1
  184. package/config/product/explorer.js +17 -4
  185. package/config/product/manager.js +84 -21
  186. package/config/router/index.js +16 -0
  187. package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
  188. package/config/router/navigation-guards/authentication.js +10 -4
  189. package/config/router/routes.js +26 -6
  190. package/config/settings.ts +0 -2
  191. package/config/table-headers.js +23 -5
  192. package/config/types.js +11 -1
  193. package/core/__tests__/plugin-products.test.ts +904 -20
  194. package/core/plugin-products-base.ts +110 -10
  195. package/core/plugin-products.ts +4 -0
  196. package/core/plugin-types.ts +194 -31
  197. package/core/plugin.ts +18 -7
  198. package/core/productDebugger.js +9 -4
  199. package/core/types-provisioning.ts +77 -31
  200. package/core/types.ts +72 -22
  201. package/detail/__tests__/pod.test.ts +41 -0
  202. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
  203. package/detail/__tests__/workload.test.ts +3 -152
  204. package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
  205. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  206. package/detail/pod.vue +1 -1
  207. package/detail/provisioning.cattle.io.cluster.vue +34 -14
  208. package/detail/workload/index.vue +12 -55
  209. package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
  210. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
  211. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  212. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
  213. package/edit/auth/__tests__/azuread.test.ts +247 -39
  214. package/edit/auth/__tests__/github.test.ts +234 -0
  215. package/edit/auth/__tests__/oidc.test.ts +26 -6
  216. package/edit/auth/__tests__/saml.test.ts +196 -0
  217. package/edit/auth/azuread.vue +197 -56
  218. package/edit/auth/github.vue +72 -13
  219. package/edit/auth/ldap/__tests__/index.test.ts +206 -0
  220. package/edit/auth/ldap/config.vue +8 -0
  221. package/edit/auth/ldap/index.vue +75 -1
  222. package/edit/auth/oidc.vue +119 -73
  223. package/edit/auth/saml.vue +76 -12
  224. package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
  225. package/edit/fleet.cattle.io.helmop.vue +491 -136
  226. package/edit/management.cattle.io.user.vue +5 -2
  227. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  228. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  229. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  230. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  231. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  232. package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
  233. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
  234. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  235. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  236. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  237. package/edit/secret/__tests__/ssh.test.ts +5 -6
  238. package/edit/secret/basic.vue +31 -0
  239. package/edit/secret/index.vue +68 -17
  240. package/edit/secret/registry.vue +38 -0
  241. package/edit/secret/ssh.vue +29 -0
  242. package/edit/secret/tls.vue +30 -0
  243. package/edit/service.vue +4 -4
  244. package/edit/workload/Upgrading.vue +3 -3
  245. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  246. package/edit/workload/mixins/workload.js +2 -1
  247. package/list/fleet.cattle.io.bundle.vue +7 -104
  248. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  249. package/list/group.principal.vue +5 -4
  250. package/list/harvesterhci.io.management.cluster.vue +8 -9
  251. package/list/management.cattle.io.user.vue +12 -9
  252. package/list/provisioning.cattle.io.cluster.vue +268 -180
  253. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  254. package/mixins/__tests__/auth-config.test.ts +90 -0
  255. package/mixins/__tests__/chart.test.ts +206 -0
  256. package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
  257. package/mixins/auth-config.js +7 -0
  258. package/mixins/brand.js +2 -1
  259. package/mixins/chart.js +22 -9
  260. package/mixins/child-hook.js +12 -6
  261. package/mixins/create-edit-view/impl.js +5 -3
  262. package/mixins/resource-fetch-api-pagination.js +62 -6
  263. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
  264. package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
  265. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  266. package/models/__tests__/fleet-application.test.ts +175 -0
  267. package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
  268. package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
  269. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  270. package/models/__tests__/management.cattle.io.node.ts +28 -5
  271. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  272. package/models/__tests__/namespace.test.ts +36 -0
  273. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
  274. package/models/__tests__/workload.test.ts +401 -26
  275. package/models/base-cluster.x-k8s.io.js +26 -0
  276. package/models/catalog.cattle.io.clusterrepo.js +28 -4
  277. package/models/cluster.js +1 -1
  278. package/models/cluster.x-k8s.io.machine.js +4 -22
  279. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  280. package/models/cluster.x-k8s.io.machineset.js +2 -20
  281. package/models/compliance.cattle.io.clusterscan.js +165 -2
  282. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  283. package/models/fleet-application.js +7 -1
  284. package/models/fleet.cattle.io.helmop.js +20 -1
  285. package/models/management.cattle.io.cluster.js +434 -41
  286. package/models/management.cattle.io.node.js +50 -7
  287. package/models/management.cattle.io.nodepool.js +1 -1
  288. package/models/namespace.js +1 -1
  289. package/models/networking.k8s.io.ingress.js +12 -4
  290. package/models/pod.js +33 -1
  291. package/models/provisioning.cattle.io.cluster.js +51 -334
  292. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  293. package/models/workload.js +108 -13
  294. package/models/workload.service.js +5 -0
  295. package/package.json +22 -39
  296. package/pages/__tests__/readme.test.ts +49 -0
  297. package/pages/about.vue +5 -6
  298. package/pages/auth/login.vue +0 -35
  299. package/pages/auth/setup.vue +13 -3
  300. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
  301. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
  302. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  303. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
  304. package/pages/c/_cluster/apps/charts/chart.vue +62 -9
  305. package/pages/c/_cluster/apps/charts/index.vue +48 -10
  306. package/pages/c/_cluster/apps/charts/install.vue +122 -113
  307. package/pages/c/_cluster/auth/roles/index.vue +5 -4
  308. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  309. package/pages/c/_cluster/explorer/index.vue +5 -49
  310. package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
  311. package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
  312. package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
  313. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
  314. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
  315. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
  316. package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
  317. package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
  318. package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
  319. package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
  320. package/pages/c/_cluster/fleet/application/create.vue +187 -136
  321. package/pages/c/_cluster/fleet/application/index.vue +5 -3
  322. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
  323. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
  324. package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
  325. package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
  326. package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
  327. package/pages/c/_cluster/fleet/index.vue +2 -2
  328. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  329. package/pages/c/_cluster/istio/index.vue +21 -6
  330. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  331. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
  332. package/pages/c/_cluster/uiplugins/index.vue +218 -197
  333. package/pages/diagnostic.vue +13 -17
  334. package/pages/fail-whale.vue +30 -7
  335. package/pages/home.vue +93 -306
  336. package/pages/readme.vue +88 -0
  337. package/plugins/clean-html.d.ts +9 -0
  338. package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
  339. package/plugins/dashboard-store/actions.js +40 -18
  340. package/plugins/dashboard-store/resource-class.js +67 -9
  341. package/plugins/steve/__tests__/actions.test.ts +212 -0
  342. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  343. package/plugins/steve/actions.js +96 -0
  344. package/plugins/steve/steve-pagination-utils.ts +12 -4
  345. package/plugins/steve/subscribe.js +35 -5
  346. package/rancher-components/Accordion/Accordion.vue +53 -9
  347. package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
  348. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  349. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  350. package/rancher-components/Form/Radio/RadioButton.vue +17 -1
  351. package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
  352. package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
  353. package/rancher-components/RcButton/RcButton.test.ts +140 -1
  354. package/rancher-components/RcButton/RcButton.vue +126 -17
  355. package/rancher-components/RcButton/types.ts +3 -0
  356. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  357. package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
  358. package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
  359. package/rancher-components/RcSection/RcSection.vue +28 -3
  360. package/scripts/extension/helm/package/Dockerfile +1 -1
  361. package/scripts/test-plugins-build.sh +2 -1
  362. package/store/__tests__/catalog.test.ts +115 -1
  363. package/store/__tests__/notifications.test.ts +434 -0
  364. package/store/__tests__/type-map.test.ts +556 -1
  365. package/store/action-menu.js +8 -3
  366. package/store/auth.js +1 -1
  367. package/store/aws.js +27 -16
  368. package/store/catalog.js +84 -3
  369. package/store/digitalocean.js +20 -38
  370. package/store/index.js +2 -0
  371. package/store/linode.js +25 -40
  372. package/store/plugins.js +7 -4
  373. package/store/pnap.js +1 -0
  374. package/store/type-map.js +111 -29
  375. package/tsconfig.paths.json +8 -8
  376. package/types/components/buttonGroup.ts +5 -0
  377. package/types/kube/kube-api.ts +14 -1
  378. package/types/rancher/steve.api.ts +12 -12
  379. package/types/resources/settings.d.ts +2 -1
  380. package/types/shell/index.d.ts +206 -72
  381. package/types/store/dashboard-store.types.ts +108 -11
  382. package/types/store/pagination.types.ts +6 -3
  383. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  384. package/utils/__tests__/async.test.ts +87 -0
  385. package/utils/__tests__/auth.test.ts +273 -0
  386. package/utils/__tests__/aws.test.ts +140 -0
  387. package/utils/__tests__/banners.test.ts +176 -0
  388. package/utils/__tests__/chart.test.ts +64 -1
  389. package/utils/__tests__/color.test.ts +226 -0
  390. package/utils/__tests__/computed.test.ts +193 -0
  391. package/utils/__tests__/cspAdaptor.test.ts +163 -0
  392. package/utils/__tests__/dom.test.ts +81 -0
  393. package/utils/__tests__/duration.test.ts +176 -0
  394. package/utils/__tests__/dynamic-importer.test.ts +102 -0
  395. package/utils/__tests__/fleet-appco.test.ts +312 -0
  396. package/utils/__tests__/fleet.test.ts +340 -0
  397. package/utils/__tests__/ingress.test.ts +553 -0
  398. package/utils/__tests__/kube.test.ts +68 -0
  399. package/utils/__tests__/monitoring.test.ts +130 -0
  400. package/utils/__tests__/namespace-filter.test.ts +109 -0
  401. package/utils/__tests__/object.test.ts +22 -0
  402. package/utils/__tests__/pagination-utils.test.ts +361 -0
  403. package/utils/__tests__/parse-externalid.test.ts +137 -0
  404. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  405. package/utils/__tests__/platform.test.ts +91 -0
  406. package/utils/__tests__/poller-sequential.test.ts +177 -0
  407. package/utils/__tests__/poller.test.ts +170 -0
  408. package/utils/__tests__/position.test.ts +237 -0
  409. package/utils/__tests__/promise.test.ts +346 -0
  410. package/utils/__tests__/provider.test.ts +51 -1
  411. package/utils/__tests__/queue.test.ts +232 -0
  412. package/utils/__tests__/release-notes.test.ts +221 -0
  413. package/utils/__tests__/router.test.js +254 -1
  414. package/utils/__tests__/select.test.ts +208 -0
  415. package/utils/__tests__/settings.test.ts +140 -0
  416. package/utils/__tests__/sort-utils.test.ts +301 -0
  417. package/utils/__tests__/string-utils.test.ts +798 -0
  418. package/utils/__tests__/string.test.ts +23 -1
  419. package/utils/__tests__/style.test.ts +154 -0
  420. package/utils/__tests__/svg-filter.test.ts +184 -0
  421. package/utils/__tests__/time.test.ts +265 -1
  422. package/utils/__tests__/title.test.ts +47 -0
  423. package/utils/__tests__/units.test.ts +417 -0
  424. package/utils/__tests__/versions.test.ts +128 -0
  425. package/utils/__tests__/width.test.ts +53 -0
  426. package/utils/__tests__/window.test.ts +158 -0
  427. package/utils/__tests__/xccdf.test.ts +511 -0
  428. package/utils/chart.js +36 -0
  429. package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
  430. package/utils/crypto/__tests__/index.test.ts +144 -0
  431. package/utils/duration.ts +104 -0
  432. package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
  433. package/utils/dynamic-content/info.ts +2 -1
  434. package/utils/error.js +13 -0
  435. package/utils/fleet-appco.ts +323 -0
  436. package/utils/fleet.ts +13 -3
  437. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  438. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  439. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  440. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  441. package/utils/gc/__tests__/gc.test.ts +487 -0
  442. package/utils/ingress.ts +9 -1
  443. package/utils/object.js +22 -2
  444. package/utils/pagination-utils.ts +2 -1
  445. package/utils/provider.ts +12 -0
  446. package/utils/string.js +25 -2
  447. package/utils/uiplugins.ts +5 -5
  448. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  449. package/utils/validators/__tests__/container-images.test.ts +104 -0
  450. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  451. package/utils/validators/__tests__/flow-output.test.ts +91 -0
  452. package/utils/validators/__tests__/index.test.ts +481 -0
  453. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  454. package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
  455. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  456. package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
  457. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  458. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  459. package/utils/validators/__tests__/role-template.test.ts +149 -0
  460. package/utils/validators/__tests__/service.test.ts +283 -0
  461. package/utils/validators/__tests__/setting.test.js +32 -0
  462. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  463. package/utils/validators/formRules/index.ts +5 -5
  464. package/utils/validators/machine-pool.ts +1 -1
  465. package/utils/validators/setting.js +18 -3
  466. package/utils/xccdf.ts +415 -0
  467. package/vue.config.js +1 -1
  468. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  469. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  470. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  471. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  472. package/pages/support/index.vue +0 -264
  473. package/utils/duration.js +0 -43
@@ -5,9 +5,12 @@ import jsyaml from 'js-yaml';
5
5
  import { saferDump } from '@shell/utils/create-yaml';
6
6
  import { mapGetters } from 'vuex';
7
7
  import { base64Encode } from '@shell/utils/crypto';
8
- import { _CREATE, _EDIT } from '@shell/config/query-params';
8
+ import { _CREATE, _EDIT, SUB_TYPE } from '@shell/config/query-params';
9
9
  import { checkSchemasForFindAllHash } from '@shell/utils/auth';
10
- import { AUTH_TYPE, CONFIG_MAP, NORMAN, SECRET } from '@shell/config/types';
10
+ import {
11
+ AUTH_TYPE, CONFIG_MAP, FLEET, AUTH_GENERATE_NAME, NORMAN, SECRET
12
+ } from '@shell/config/types';
13
+ import { FLEET_APPCO_AUTH_GENERATE_NAME, IMAGE_PULL_SECRET_SUFFIX, SUSE_APP_COLLECTION_REPO_URL, deriveRepoName } from '@shell/utils/fleet-appco';
11
14
  import { CATALOG, FLEET as FLEET_LABELS } from '@shell/config/labels-annotations';
12
15
  import { SOURCE_TYPE } from '@shell/config/product/fleet';
13
16
  import CreateEditView from '@shell/mixins/create-edit-view';
@@ -27,6 +30,7 @@ import HelmOpChartTab from '@shell/components/fleet/HelmOpChartTab.vue';
27
30
  import HelmOpValuesTab from '@shell/components/fleet/HelmOpValuesTab.vue';
28
31
  import HelmOpTargetTab from '@shell/components/fleet/HelmOpTargetTab.vue';
29
32
  import HelmOpAdvancedTab from '@shell/components/fleet/HelmOpAdvancedTab.vue';
33
+ import HelmOpAppCoConfigTab from '@shell/components/fleet/HelmOpAppCoConfigTab.vue';
30
34
 
31
35
  const MINIMUM_POLLING_INTERVAL = 15;
32
36
 
@@ -35,6 +39,22 @@ const VALUES_STATE = {
35
39
  DIFF: 'DIFF'
36
40
  };
37
41
 
42
+ function checkIsSuseAppCollection(route, value) {
43
+ // CREATE: route query param set by the subtype selector
44
+ // EDIT: annotation set on the resource during create, or URL fallback for older resources
45
+ return route.query[SUB_TYPE] === FLEET.SUSE_APP_COLLECTION ||
46
+ value.isSuseAppCollectionFromUI;
47
+ }
48
+
49
+ function getInitialSourceType(route, value, modelSourceType) {
50
+ if (checkIsSuseAppCollection(route, value)) {
51
+ return SOURCE_TYPE.OCI;
52
+ }
53
+
54
+ // REPO is the default value
55
+ return modelSourceType || SOURCE_TYPE.REPO;
56
+ }
57
+
38
58
  export default {
39
59
  name: 'CruHelmOp',
40
60
 
@@ -53,6 +73,7 @@ export default {
53
73
  HelmOpValuesTab,
54
74
  HelmOpTargetTab,
55
75
  HelmOpAdvancedTab,
76
+ HelmOpAppCoConfigTab,
56
77
  },
57
78
 
58
79
  mixins: [CreateEditView, FormValidation],
@@ -61,12 +82,12 @@ export default {
61
82
  // Fetch Secrets and ConfigMaps to mask the loading phase in FleetValuesFrom.vue
62
83
  checkSchemasForFindAllHash({
63
84
  allSecrets: {
64
- inStoreType: 'management',
85
+ inStoreType: CATALOG._MANAGEMENT,
65
86
  type: SECRET
66
87
  },
67
88
 
68
89
  allConfigMaps: {
69
- inStoreType: 'management',
90
+ inStoreType: CATALOG._MANAGEMENT,
70
91
  type: CONFIG_MAP
71
92
  }
72
93
  }, this.$store);
@@ -81,10 +102,10 @@ export default {
81
102
  return {
82
103
  VALUES_STATE,
83
104
  SOURCE_TYPE,
84
- allWorkspaces: [],
105
+ currentUser: null,
85
106
  pollingInterval: toSeconds(this.value.spec.pollingInterval) || this.value.spec.pollingInterval,
86
107
  sourceTypeInit: this.value.sourceType,
87
- sourceType: this.value.sourceType || SOURCE_TYPE.REPO,
108
+ sourceType: getInitialSourceType(this.$route, this.value, this.value.sourceType),
88
109
  helmSpecInit: clone(this.value.spec.helm),
89
110
  yamlForm: VALUES_STATE.YAML,
90
111
  chartValues,
@@ -95,6 +116,11 @@ export default {
95
116
  isRealModeEdit: this.realMode === _EDIT,
96
117
  targetsCreated: '',
97
118
  fvFormRuleSets: [],
119
+
120
+ // Raw chart index entries from the ClusterRepo, keyed by chart name
121
+ appCoChartEntries: {},
122
+ // True while fetching the chart index from the ClusterRepo
123
+ appCoChartsLoading: false,
98
124
  };
99
125
  },
100
126
 
@@ -110,12 +136,59 @@ export default {
110
136
  mounted() {
111
137
  this.value.applyDefaults();
112
138
  this.updateValidationRules(this.sourceType);
139
+
140
+ if (this.isSuseAppCollection) {
141
+ const repo = this.value.spec?.helm?.repo || '';
142
+
143
+ if (!repo) {
144
+ set(this.value, 'spec.helm.repo', SUSE_APP_COLLECTION_REPO_URL);
145
+ } else if (repo.startsWith(SUSE_APP_COLLECTION_REPO_URL) && repo.length > SUSE_APP_COLLECTION_REPO_URL.length) {
146
+ const chart = repo.slice(SUSE_APP_COLLECTION_REPO_URL.length).replace(/^\//, '');
147
+
148
+ set(this.value, 'spec.helm.repo', SUSE_APP_COLLECTION_REPO_URL);
149
+ set(this.value, 'spec.helm.chart', chart);
150
+ }
151
+
152
+ if (this.realMode === _CREATE) {
153
+ const queryChart = this.$route.query.chart;
154
+ const querySecret = this.$route.query.secret;
155
+ const queryVersion = this.$route.query.version;
156
+
157
+ if (queryChart) {
158
+ set(this.value, 'spec.helm.chart', queryChart);
159
+ }
160
+
161
+ if (queryVersion) {
162
+ set(this.value, 'spec.helm.version', queryVersion);
163
+ }
164
+
165
+ if (querySecret) {
166
+ const ns = this.value.metadata.namespace;
167
+
168
+ this.updateAuth(`${ ns }/${ querySecret }`, 'helmSecretName');
169
+ this.addAppCoImagePullSecretToSpec(`${ querySecret }${ IMAGE_PULL_SECRET_SUFFIX }`);
170
+
171
+ this.fetchAppCoCharts(deriveRepoName(querySecret));
172
+ }
173
+ } else {
174
+ const rawSecret = this.value.spec?.helmSecretName || '';
175
+ const secretName = rawSecret.includes('/') ? rawSecret.split('/')[1] : rawSecret;
176
+
177
+ if (secretName) {
178
+ this.fetchAppCoCharts(deriveRepoName(secretName));
179
+ }
180
+ }
181
+ }
113
182
  },
114
183
 
115
184
  computed: {
116
185
  ...mapGetters(['workspace']),
117
186
 
118
187
  steps() {
188
+ if (this.isSuseAppCollection) {
189
+ return [];
190
+ }
191
+
119
192
  return [
120
193
  {
121
194
  name: 'basics',
@@ -165,6 +238,10 @@ export default {
165
238
  ];
166
239
  },
167
240
 
241
+ isSuseAppCollection() {
242
+ return checkIsSuseAppCollection(this.$route, this.value);
243
+ },
244
+
168
245
  sourceTypeOptions() {
169
246
  return Object.values(SOURCE_TYPE).map((value) => ({
170
247
  value,
@@ -234,6 +311,71 @@ export default {
234
311
  downstreamConfigMapsList() {
235
312
  return (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'ConfigMap').map((r) => r.name);
236
313
  },
314
+
315
+ appCoConfigProps() {
316
+ return {
317
+ value: this.value,
318
+ mode: this.mode,
319
+ realMode: this.realMode,
320
+ appCoChartEntries: this.appCoChartEntries,
321
+ appCoChartsLoading: this.appCoChartsLoading,
322
+ chartValues: this.chartValues,
323
+ chartValuesInit: this.chartValuesInit,
324
+ yamlForm: this.yamlForm,
325
+ yamlFormOptions: this.yamlFormOptions,
326
+ yamlDiffModeOptions: this.yamlDiffModeOptions,
327
+ isYamlDiff: this.isYamlDiff,
328
+ editorMode: this.editorMode,
329
+ diffMode: this.diffMode,
330
+ isRealModeEdit: this.isRealModeEdit,
331
+ targetsCreated: this.targetsCreated,
332
+ correctDriftEnabled: this.correctDriftEnabled,
333
+ downstreamSecretsList: this.downstreamSecretsList,
334
+ downstreamConfigMapsList: this.downstreamConfigMapsList,
335
+ registerBeforeHook: this.registerBeforeHook,
336
+ };
337
+ },
338
+
339
+ appCoConfigListeners() {
340
+ return {
341
+ 'update:value': this.emitInput,
342
+ 'update:yaml-form': this.updateYamlForm,
343
+ 'update:chart-values': this.updateChartValues,
344
+ 'update:diff-mode': (e) => {
345
+ this.diffMode = e;
346
+ },
347
+ 'update:targets': this.updateTargets,
348
+ 'targets-created': (e) => {
349
+ this.targetsCreated = e;
350
+ },
351
+ 'update:auth': (e) => this.updateAuth(e.value, e.key),
352
+ 'update:cached-auth': (e) => this.updateCachedAuthVal(e.value, e.key),
353
+ 'update:correct-drift': (e) => {
354
+ this.correctDriftEnabled = e;
355
+ },
356
+ 'update:downstream-resources': (e) => this.updateDownstreamResources(e.kind, e.list),
357
+ };
358
+ },
359
+
360
+ appCoViewTabs() {
361
+ return [
362
+ {
363
+ name: 'chartConfig',
364
+ label: this.t('fleet.helmOp.appCoView.chartConfig'),
365
+ weight: 3
366
+ },
367
+ {
368
+ name: 'targetDetails',
369
+ label: this.t('fleet.helmOp.appCoView.targetDetails'),
370
+ weight: 2
371
+ },
372
+ {
373
+ name: 'advanced',
374
+ label: this.t('fleet.helmOp.appCoView.advanced'),
375
+ weight: 1
376
+ },
377
+ ];
378
+ },
237
379
  },
238
380
 
239
381
  watch: {
@@ -245,7 +387,66 @@ export default {
245
387
  },
246
388
 
247
389
  methods: {
390
+ emitInput(e) {
391
+ this.$emit('input', e);
392
+ },
393
+
394
+ async handleSave(btnCb) {
395
+ if (!this.isSuseAppCollection) {
396
+ return this.save(btnCb);
397
+ }
398
+
399
+ const origRepo = this.value.spec?.helm?.repo;
400
+ const origChart = this.value.spec?.helm?.chart;
401
+
402
+ if (this.sourceType === SOURCE_TYPE.OCI && origChart) {
403
+ const repo = (origRepo || '').replace(/\/$/, '');
404
+
405
+ set(this.value, 'spec.helm.repo', `${ repo }/${ origChart }`);
406
+ delete this.value.spec.helm.chart;
407
+ }
408
+
409
+ await this.save((success) => {
410
+ if (!success && origChart) {
411
+ set(this.value, 'spec.helm.repo', origRepo);
412
+ set(this.value, 'spec.helm.chart', origChart);
413
+ }
414
+ btnCb(success);
415
+ });
416
+ },
417
+
418
+ refreshAppCoAdvancedYaml() {
419
+ this.$refs.appCoAdvancedRef?.refreshYamlEditor?.();
420
+ },
421
+
422
+ onCancel() {
423
+ if (this.isSuseAppCollection && this.realMode === _CREATE) {
424
+ const querySecret = this.$route.query.secret;
425
+ const queryChart = this.$route.query.chart;
426
+ const repoName = deriveRepoName(querySecret || '');
427
+
428
+ this.$router.push({
429
+ name: 'c-cluster-fleet-application-appco-chart',
430
+ params: { cluster: this.$route.params.cluster },
431
+ query: {
432
+ 'repo-type': 'cluster',
433
+ repo: repoName,
434
+ chart: queryChart,
435
+ version: this.$route.query.version,
436
+ secret: querySecret,
437
+ },
438
+ });
439
+
440
+ return;
441
+ }
442
+
443
+ this.done();
444
+ },
445
+
248
446
  onSourceTypeSelect(type) {
447
+ if (this.isSuseAppCollection) {
448
+ return;
449
+ }
249
450
  this.sourceType = type;
250
451
  delete this.value.spec.helm.repo;
251
452
  delete this.value.spec.helm.chart;
@@ -302,8 +503,6 @@ export default {
302
503
  } else {
303
504
  delete spec[key];
304
505
  }
305
-
306
- this.updateCachedAuthVal(val, key);
307
506
  },
308
507
 
309
508
  async doCreateSecrets() {
@@ -311,7 +510,7 @@ export default {
311
510
  await this.doCreate('clientSecretName', this.tempCachedValues.clientSecretName);
312
511
  }
313
512
 
314
- if (this.tempCachedValues.helmSecretName) {
513
+ if (!this.isSuseAppCollection && this.tempCachedValues.helmSecretName) {
315
514
  await this.doCreate('helmSecretName', this.tempCachedValues.helmSecretName);
316
515
  }
317
516
  },
@@ -343,7 +542,7 @@ export default {
343
542
  type: SECRET,
344
543
  metadata: {
345
544
  namespace: this.value.metadata.namespace,
346
- generateName: 'auth-',
545
+ generateName: AUTH_GENERATE_NAME,
347
546
  labels: { [FLEET_LABELS.MANAGED]: 'true' }
348
547
  }
349
548
  });
@@ -386,6 +585,36 @@ export default {
386
585
  return secret;
387
586
  },
388
587
 
588
+ /**
589
+ * Adds the image-pull-secret to downstreamResources (Secret kind) and
590
+ * to spec.helm.values.global.imagePullSecrets.
591
+ */
592
+ addAppCoImagePullSecretToSpec(imagePullSecretName) {
593
+ // Replace downstream resources: remove stale fleet-appco-auth-* image-pull-secrets, add the current one
594
+ const existingSecrets = (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'Secret');
595
+ const nonAppcoSecrets = existingSecrets.filter((r) => !r.name.startsWith(FLEET_APPCO_AUTH_GENERATE_NAME));
596
+
597
+ this.updateDownstreamResources('Secret', [
598
+ ...nonAppcoSecrets.map((r) => r.name),
599
+ imagePullSecretName,
600
+ ]);
601
+
602
+ // Replace spec.helm.values.global.imagePullSecrets: remove stale fleet-appco-auth-* entries, add the current one
603
+ const currentValues = this.value.spec.helm.values || {};
604
+
605
+ const newValues = {
606
+ ...currentValues,
607
+ global: {
608
+ ...(currentValues.global || {}),
609
+ imagePullSecrets: [imagePullSecretName],
610
+ },
611
+ };
612
+
613
+ set(this.value, 'spec.helm.values', newValues);
614
+ this.chartValuesInit = saferDump(clone(newValues));
615
+ this.chartValues = saferDump(clone(newValues));
616
+ },
617
+
389
618
  updateYamlForm() {
390
619
  if (this.$refs.yaml) {
391
620
  this.$refs.yaml.updateValue(this.chartValues);
@@ -393,6 +622,8 @@ export default {
393
622
  },
394
623
 
395
624
  updateChartValues(value) {
625
+ this.chartValues = value;
626
+
396
627
  try {
397
628
  const chartValues = jsyaml.load(value);
398
629
 
@@ -406,6 +637,20 @@ export default {
406
637
 
407
638
  if (this.mode === _CREATE) {
408
639
  this.value.metadata.labels[FLEET_LABELS.CREATED_BY_USER_ID] = this.currentUser.id;
640
+
641
+ if (this.isSuseAppCollection) {
642
+ if (!this.value.metadata.annotations) {
643
+ this.value.metadata.annotations = {};
644
+ }
645
+
646
+ this.value.metadata.annotations[CATALOG.SUSE_APP_COLLECTION] = 'true';
647
+ }
648
+ }
649
+
650
+ const helmSecret = this.value.spec?.helmSecretName || '';
651
+
652
+ if (helmSecret.includes('/')) {
653
+ this.value.spec.helmSecretName = helmSecret.split('/').pop();
409
654
  }
410
655
  },
411
656
 
@@ -431,9 +676,14 @@ export default {
431
676
  this.fvFormRuleSets = [{
432
677
  path: 'spec.helm.repo',
433
678
  rules: ['ociRegistry'],
434
- }, {
679
+ },
680
+ ...(this.isSuseAppCollection ? [{
681
+ path: 'spec.helm.chart',
682
+ rules: ['required'],
683
+ }] : []),
684
+ {
435
685
  path: 'spec.helm.version',
436
- rules: ['semanticVersion'],
686
+ rules: this.isSuseAppCollection ? ['required', 'semanticVersion'] : ['semanticVersion'],
437
687
  }];
438
688
  break;
439
689
  case SOURCE_TYPE.TARBALL:
@@ -445,6 +695,34 @@ export default {
445
695
  }
446
696
  },
447
697
 
698
+ async fetchAppCoCharts(repoName) {
699
+ if (!repoName) {
700
+ return;
701
+ }
702
+
703
+ this.appCoChartsLoading = true;
704
+
705
+ try {
706
+ await this.$store.dispatch('catalog/loadRepo', { repoName });
707
+
708
+ const chartName = this.value.spec.helm.chart;
709
+ const catalogChart = chartName ? this.$store.getters['catalog/chart']({
710
+ repoType: 'cluster',
711
+ repoName,
712
+ chartName,
713
+ includeHidden: true,
714
+ }) : null;
715
+
716
+ if (catalogChart?.versions?.length) {
717
+ this.appCoChartEntries = { [chartName]: catalogChart.versions };
718
+ }
719
+ } catch (e) {
720
+ console.error('Failed to fetch AppCo chart list:', e); // eslint-disable-line no-console
721
+ } finally {
722
+ this.appCoChartsLoading = false;
723
+ }
724
+ },
725
+
448
726
  updateDownstreamResources(kind, list) {
449
727
  switch (kind) {
450
728
  case 'Secret':
@@ -470,6 +748,7 @@ export default {
470
748
 
471
749
  <CruResource
472
750
  v-else
751
+ ref="cruResource"
473
752
  :done-route="doneRouteList"
474
753
  :mode="mode"
475
754
  :resource="value"
@@ -478,21 +757,30 @@ export default {
478
757
  :errors="errors"
479
758
  :steps="!isView ? steps : undefined"
480
759
  :finish-mode="'finish'"
760
+ :cancel-event="true"
481
761
  class="wizard"
482
- @cancel="done"
762
+ data-testid="helmop-cru-resource"
763
+ @cancel="onCancel"
483
764
  @error="e=>errors = e"
484
- @finish="save"
765
+ @finish="handleSave"
485
766
  >
486
- <template #basics>
767
+ <template
768
+ v-if="!isSuseAppCollection"
769
+ #basics
770
+ >
487
771
  <HelmOpMetadataTab
488
772
  :value="value"
489
773
  :mode="mode"
490
774
  :is-view="isView"
775
+ data-testid="helmop-metadata-tab"
491
776
  @update:value="$emit('input', $event)"
492
777
  />
493
778
  </template>
494
779
 
495
- <template #chart>
780
+ <template
781
+ v-if="!isSuseAppCollection"
782
+ #chart
783
+ >
496
784
  <HelmOpChartTab
497
785
  :value="value"
498
786
  :mode="mode"
@@ -500,16 +788,19 @@ export default {
500
788
  :source-type="sourceType"
501
789
  :source-type-options="sourceTypeOptions"
502
790
  :fv-get-and-report-path-rules="fvGetAndReportPathRules"
791
+ data-testid="helmop-chart-tab"
503
792
  @update:source-type="onSourceTypeSelect"
504
793
  />
505
794
  </template>
506
795
 
507
- <template #values>
796
+ <template
797
+ v-if="!isSuseAppCollection"
798
+ #values
799
+ >
508
800
  <HelmOpValuesTab
509
801
  :value="value"
510
802
  :mode="mode"
511
803
  :real-mode="realMode"
512
- :is-view="isView"
513
804
  :chart-values="chartValues"
514
805
  :chart-values-init="chartValuesInit"
515
806
  :yaml-form="yamlForm"
@@ -519,30 +810,38 @@ export default {
519
810
  :editor-mode="editorMode"
520
811
  :diff-mode="diffMode"
521
812
  :is-real-mode-edit="isRealModeEdit"
813
+ data-testid="helmop-values-tab"
522
814
  @update:yaml-form="updateYamlForm"
523
815
  @update:chart-values="updateChartValues"
524
816
  @update:diff-mode="diffMode = $event"
525
817
  />
526
818
  </template>
527
819
 
528
- <template #target>
820
+ <template
821
+ v-if="!isSuseAppCollection"
822
+ #target
823
+ >
529
824
  <HelmOpTargetTab
530
825
  :value="value"
531
826
  :mode="mode"
532
827
  :real-mode="realMode"
533
- :is-view="isView"
534
828
  :targets-created="targetsCreated"
829
+ data-testid="helmop-target-tab"
535
830
  @update:targets="updateTargets"
536
831
  @targets-created="targetsCreated=$event"
537
832
  />
538
833
  </template>
539
834
 
540
- <template #advanced>
835
+ <template
836
+ v-if="!isSuseAppCollection"
837
+ #advanced
838
+ >
541
839
  <HelmOpAdvancedTab
542
840
  :value="value"
543
841
  :mode="mode"
544
842
  :is-view="isView"
545
843
  :source-type="sourceType"
844
+ :is-suse-app-collection="isSuseAppCollection"
546
845
  :temp-cached-values="tempCachedValues"
547
846
  :correct-drift-enabled="correctDriftEnabled"
548
847
  :polling-interval="pollingInterval"
@@ -553,6 +852,7 @@ export default {
553
852
  :downstream-secrets-list="downstreamSecretsList"
554
853
  :downstream-config-maps-list="downstreamConfigMapsList"
555
854
  :register-before-hook="registerBeforeHook"
855
+ data-testid="helmop-advanced-tab"
556
856
  @update:auth="updateAuth($event.value, $event.key)"
557
857
  @update:cached-auth="updateCachedAuthVal($event.value, $event.key)"
558
858
  @update:correct-drift="correctDriftEnabled = $event"
@@ -564,143 +864,198 @@ export default {
564
864
  </template>
565
865
 
566
866
  <template
567
- v-if="isView && steps.length === 5"
867
+ v-if="isView || isSuseAppCollection"
568
868
  #single
569
869
  >
570
- <NameNsDescription
571
- :value="value"
572
- :namespaced="false"
573
- :mode="mode"
574
- @update:value="$emit('input', $event)"
575
- />
576
-
870
+ <!-- Non-AppCo view -->
871
+ <div v-if="!isSuseAppCollection">
872
+ <NameNsDescription
873
+ :value="value"
874
+ :namespaced="false"
875
+ :mode="mode"
876
+ data-testid="helmop-view-name-ns-description"
877
+ @update:value="$emit('input', $event)"
878
+ />
879
+
880
+ <Tabbed
881
+ v-if="isView"
882
+ :side-tabs="true"
883
+ :use-hash="true"
884
+ >
885
+ <Tab
886
+ v-if="steps[1]"
887
+ :name="steps[1].name"
888
+ :label="steps[1].label"
889
+ :weight="4"
890
+ >
891
+ <HelmOpChartTab
892
+ :value="value"
893
+ :mode="mode"
894
+ :is-view="isView"
895
+ :source-type="sourceType"
896
+ :source-type-options="sourceTypeOptions"
897
+ :fv-get-and-report-path-rules="fvGetAndReportPathRules"
898
+ data-testid="helmop-view-chart-tab"
899
+ @update:source-type="onSourceTypeSelect"
900
+ />
901
+ </Tab>
902
+ <Tab
903
+ v-if="steps[2]"
904
+ :name="steps[2].name"
905
+ :label="steps[2].label"
906
+ :weight="3"
907
+ >
908
+ <HelmOpValuesTab
909
+ :value="value"
910
+ :mode="mode"
911
+ :real-mode="realMode"
912
+ :is-view="isView"
913
+ :chart-values="chartValues"
914
+ :chart-values-init="chartValuesInit"
915
+ :yaml-form="yamlForm"
916
+ :yaml-form-options="yamlFormOptions"
917
+ :yaml-diff-mode-options="yamlDiffModeOptions"
918
+ :is-yaml-diff="isYamlDiff"
919
+ :editor-mode="editorMode"
920
+ :diff-mode="diffMode"
921
+ :is-real-mode-edit="isRealModeEdit"
922
+ data-testid="helmop-view-values-tab"
923
+ @update:yaml-form="updateYamlForm"
924
+ @update:chart-values="updateChartValues"
925
+ @update:diff-mode="diffMode = $event"
926
+ />
927
+ </Tab>
928
+ <Tab
929
+ v-if="steps[3]"
930
+ :name="steps[3].name"
931
+ :label="steps[3].label"
932
+ :weight="2"
933
+ >
934
+ <HelmOpTargetTab
935
+ :value="value"
936
+ :mode="mode"
937
+ :real-mode="realMode"
938
+ :targets-created="targetsCreated"
939
+ data-testid="helmop-view-target-tab"
940
+ @update:targets="updateTargets"
941
+ @targets-created="targetsCreated=$event"
942
+ />
943
+ </Tab>
944
+ <Tab
945
+ v-if="steps[4]"
946
+ :name="steps[4].name"
947
+ :label="steps[4].label"
948
+ :weight="1"
949
+ >
950
+ <HelmOpAdvancedTab
951
+ :value="value"
952
+ :mode="mode"
953
+ :is-view="isView"
954
+ :source-type="sourceType"
955
+ :is-suse-app-collection="isSuseAppCollection"
956
+ :temp-cached-values="tempCachedValues"
957
+ :correct-drift-enabled="correctDriftEnabled"
958
+ :polling-interval="pollingInterval"
959
+ :is-polling-enabled="isPollingEnabled"
960
+ :show-polling-interval-min-value-warning="showPollingIntervalMinValueWarning"
961
+ :enable-polling-tooltip="enablePollingTooltip"
962
+ :is-null-or-static-version="isNullOrStaticVersion"
963
+ :downstream-secrets-list="downstreamSecretsList"
964
+ :downstream-config-maps-list="downstreamConfigMapsList"
965
+ :register-before-hook="registerBeforeHook"
966
+ data-testid="helmop-view-advanced-tab"
967
+ @update:auth="updateAuth($event.value, $event.key)"
968
+ @update:cached-auth="updateCachedAuthVal($event.value, $event.key)"
969
+ @update:correct-drift="correctDriftEnabled = $event"
970
+ @update:downstream-resources="updateDownstreamResources($event.kind, $event.list)"
971
+ @toggle-polling="togglePolling"
972
+ @update:polling-interval="updatePollingInterval"
973
+ @update:validate-polling-interval="validatePollingInterval"
974
+ />
975
+ </Tab>
976
+ <Tab
977
+ name="labels"
978
+ label-key="generic.labelsAndAnnotations"
979
+ :weight="5"
980
+ >
981
+ <HelmOpMetadataTab
982
+ :value="value"
983
+ :mode="mode"
984
+ :is-view="isView"
985
+ data-testid="helmop-view-metadata-tab"
986
+ @update:value="$emit('input', $event)"
987
+ />
988
+ </Tab>
989
+ </Tabbed>
990
+ </div>
991
+
992
+ <!-- AppCo view -->
577
993
  <Tabbed
578
- v-if="isView"
994
+ v-else-if="isSuseAppCollection && isView"
579
995
  :side-tabs="true"
580
996
  :use-hash="true"
997
+ data-testid="helmop-appco-view-tabbed"
581
998
  >
582
999
  <Tab
583
- v-if="steps[1]"
584
- :name="steps[1].name"
585
- :label="steps[1].label"
586
- :weight="4"
1000
+ :name="appCoViewTabs[0].name"
1001
+ :label="appCoViewTabs[0].label"
1002
+ :weight="appCoViewTabs[0].weight"
1003
+ :show-header="false"
587
1004
  >
588
- <HelmOpChartTab
589
- :value="value"
590
- :mode="mode"
591
- :is-view="isView"
592
- :source-type="sourceType"
593
- :source-type-options="sourceTypeOptions"
594
- :fv-get-and-report-path-rules="fvGetAndReportPathRules"
595
- @update:source-type="onSourceTypeSelect"
596
- />
597
- </Tab>
598
- <Tab
599
- v-if="steps[2]"
600
- :name="steps[2].name"
601
- :label="steps[2].label"
602
- :weight="3"
603
- >
604
- <HelmOpValuesTab
605
- :value="value"
606
- :mode="mode"
607
- :real-mode="realMode"
608
- :is-view="isView"
609
- :chart-values="chartValues"
610
- :chart-values-init="chartValuesInit"
611
- :yaml-form="yamlForm"
612
- :yaml-form-options="yamlFormOptions"
613
- :yaml-diff-mode-options="yamlDiffModeOptions"
614
- :is-yaml-diff="isYamlDiff"
615
- :editor-mode="editorMode"
616
- :diff-mode="diffMode"
617
- :is-real-mode-edit="isRealModeEdit"
618
- @update:yaml-form="updateYamlForm"
619
- @update:chart-values="updateChartValues"
620
- @update:diff-mode="diffMode = $event"
621
- />
622
- </Tab>
623
- <Tab
624
- v-if="steps[3]"
625
- :name="steps[3].name"
626
- :label="steps[3].label"
627
- :weight="2"
628
- >
629
- <HelmOpTargetTab
630
- :value="value"
631
- :mode="mode"
632
- :real-mode="realMode"
633
- :is-view="isView"
634
- :targets-created="targetsCreated"
635
- @update:targets="updateTargets"
636
- @targets-created="targetsCreated=$event"
1005
+ <HelmOpAppCoConfigTab
1006
+ v-bind="appCoConfigProps"
1007
+ :hide-target="true"
1008
+ :hide-advanced="true"
1009
+ :hide-chart-config="false"
1010
+ data-testid="helmop-appco-view-chart-config"
1011
+ v-on="appCoConfigListeners"
637
1012
  />
638
1013
  </Tab>
1014
+
639
1015
  <Tab
640
- v-if="steps[4]"
641
- :name="steps[4].name"
642
- :label="steps[4].label"
643
- :weight="1"
1016
+ :name="appCoViewTabs[1].name"
1017
+ :label="appCoViewTabs[1].label"
1018
+ :weight="appCoViewTabs[1].weight"
1019
+ :show-header="false"
644
1020
  >
645
- <HelmOpAdvancedTab
646
- :value="value"
647
- :mode="mode"
648
- :is-view="isView"
649
- :source-type="sourceType"
650
- :temp-cached-values="tempCachedValues"
651
- :correct-drift-enabled="correctDriftEnabled"
652
- :polling-interval="pollingInterval"
653
- :is-polling-enabled="isPollingEnabled"
654
- :show-polling-interval-min-value-warning="showPollingIntervalMinValueWarning"
655
- :enable-polling-tooltip="enablePollingTooltip"
656
- :is-null-or-static-version="isNullOrStaticVersion"
657
- :downstream-secrets-list="downstreamSecretsList"
658
- :downstream-config-maps-list="downstreamConfigMapsList"
659
- :register-before-hook="registerBeforeHook"
660
- @update:auth="updateAuth($event.value, $event.key)"
661
- @update:cached-auth="updateCachedAuthVal($event.value, $event.key)"
662
- @update:correct-drift="correctDriftEnabled = $event"
663
- @update:downstream-resources="updateDownstreamResources($event.kind, $event.list)"
664
- @toggle-polling="togglePolling"
665
- @update:polling-interval="updatePollingInterval"
666
- @update:validate-polling-interval="validatePollingInterval"
1021
+ <HelmOpAppCoConfigTab
1022
+ v-bind="appCoConfigProps"
1023
+ :hide-chart-config="true"
1024
+ :hide-advanced="true"
1025
+ data-testid="helmop-appco-view-target-details"
1026
+ v-on="appCoConfigListeners"
667
1027
  />
668
1028
  </Tab>
1029
+
669
1030
  <Tab
670
- name="labels"
671
- label-key="generic.labelsAndAnnotations"
672
- :weight="5"
1031
+ :name="appCoViewTabs[2].name"
1032
+ :label="appCoViewTabs[2].label"
1033
+ :weight="appCoViewTabs[2].weight"
1034
+ @active="refreshAppCoAdvancedYaml"
673
1035
  >
674
- <HelmOpMetadataTab
675
- :value="value"
676
- :mode="mode"
677
- :is-view="isView"
678
- @update:value="$emit('input', $event)"
1036
+ <HelmOpAppCoConfigTab
1037
+ ref="appCoAdvancedRef"
1038
+ v-bind="appCoConfigProps"
1039
+ :hide-chart-config="true"
1040
+ :hide-target="true"
1041
+ data-testid="helmop-appco-view-advanced"
1042
+ v-on="appCoConfigListeners"
679
1043
  />
680
1044
  </Tab>
681
1045
  </Tabbed>
1046
+ <div
1047
+ v-else-if="isSuseAppCollection && (isEdit || isCreate)"
1048
+ data-testid="helmop-appco-edit"
1049
+ >
1050
+ <HelmOpAppCoConfigTab
1051
+ v-bind="appCoConfigProps"
1052
+ data-testid="helmop-appco-edit-config-tab"
1053
+ v-on="appCoConfigListeners"
1054
+ />
1055
+ </div>
682
1056
  </template>
683
1057
  </CruResource>
684
1058
  </template>
685
1059
 
686
1060
  <style lang="scss" scoped>
687
- .yaml-form-controls {
688
- display: flex;
689
- margin-bottom: 15px;
690
- }
691
- :deep() .yaml-editor {
692
- .root {
693
- height: auto !important;
694
- }
695
- }
696
- .resource-handling {
697
- display: flex;
698
- flex-direction: column;
699
- gap: 5px;
700
- }
701
- .polling {
702
- display: flex;
703
- flex-direction: column;
704
- gap: 5px;
705
- }
706
1061
  </style>