@rancher/shell 3.0.12-rc.3 → 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 (258) hide show
  1. package/assets/styles/global/_layout.scss +4 -0
  2. package/assets/translations/en-us.yaml +144 -41
  3. package/assets/translations/zh-hans.yaml +1 -7
  4. package/chart/monitoring/ClusterSelector.vue +0 -21
  5. package/chart/monitoring/prometheus/index.vue +6 -3
  6. package/components/CruResource.vue +161 -14
  7. package/components/ExplorerMembers.vue +8 -4
  8. package/components/ExplorerProjectsNamespaces.vue +10 -6
  9. package/components/GrowlManager.vue +4 -0
  10. package/components/MgmtNodeList.vue +184 -0
  11. package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
  12. package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
  13. package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
  14. package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
  15. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +2 -0
  16. package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
  17. package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
  18. package/components/ResourceDetail/index.vue +1 -1
  19. package/components/ResourceList/Masthead.vue +7 -1
  20. package/components/ResourceList/index.vue +82 -1
  21. package/components/RichTranslation.vue +5 -2
  22. package/components/Setting.vue +1 -0
  23. package/components/SubtleLink.vue +31 -6
  24. package/components/Tabbed/Tab.vue +29 -3
  25. package/components/Tabbed/index.vue +25 -3
  26. package/components/TableOfContents/TableOfContents.vue +109 -0
  27. package/components/TableOfContents/composables.ts +258 -0
  28. package/components/Window/ContainerShell.vue +21 -11
  29. package/components/Window/__tests__/ContainerShell.test.ts +107 -37
  30. package/components/Wizard.vue +9 -4
  31. package/components/fleet/AppCoChartGrid.vue +401 -0
  32. package/components/fleet/AppCoEmptyState.vue +127 -0
  33. package/components/fleet/AppCoPageHeader.vue +119 -0
  34. package/components/fleet/AppCoVersionSelect.vue +70 -0
  35. package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
  36. package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
  37. package/components/fleet/FleetClusterTargets/index.vue +189 -146
  38. package/components/fleet/FleetIntro.vue +7 -3
  39. package/components/fleet/FleetNoWorkspaces.vue +7 -3
  40. package/components/fleet/FleetSecretSelector.vue +5 -3
  41. package/components/fleet/FleetValuesFrom.vue +8 -2
  42. package/components/fleet/GitRepoTargetTab.vue +0 -2
  43. package/components/fleet/HelmOpAdvancedTab.vue +19 -53
  44. package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
  45. package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
  46. package/components/fleet/HelmOpResourcesSection.vue +82 -0
  47. package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
  48. package/components/fleet/HelmOpTargetTab.vue +64 -60
  49. package/components/fleet/HelmOpValuesTab.vue +129 -105
  50. package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
  51. package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
  52. package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
  53. package/components/fleet/__tests__/FleetClusterTargets.test.ts +253 -0
  54. package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
  55. package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
  56. package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
  57. package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
  58. package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
  59. package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
  60. package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
  61. package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
  62. package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
  63. package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
  64. package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
  65. package/components/fleet/dashboard/Empty.vue +8 -4
  66. package/components/fleet/dashboard/ResourceCard.vue +28 -0
  67. package/components/fleet/dashboard/ResourceDetails.vue +28 -0
  68. package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
  69. package/components/form/ArrayList.vue +61 -4
  70. package/components/form/KeyValue.vue +23 -2
  71. package/components/form/LabeledSelect.vue +39 -1
  72. package/components/form/Labels.vue +22 -3
  73. package/components/form/NameNsDescription.vue +13 -5
  74. package/components/form/ResourceTabs/index.vue +1 -0
  75. package/components/form/__tests__/NameNsDescription.test.ts +75 -0
  76. package/components/formatter/InternalExternalIP.vue +10 -4
  77. package/components/formatter/ServiceTargets.vue +26 -7
  78. package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
  79. package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
  80. package/components/nav/Header.vue +4 -0
  81. package/components/nav/TopLevelMenu.vue +7 -2
  82. package/components/nav/__tests__/Header.test.ts +15 -0
  83. package/components/nav/__tests__/TopLevelMenu.test.ts +120 -2
  84. package/components/templates/default.vue +9 -4
  85. package/components/templates/home.vue +9 -4
  86. package/components/templates/plain.vue +9 -4
  87. package/composables/useHelmOpResources.test.ts +56 -0
  88. package/composables/useHelmOpResources.ts +32 -0
  89. package/composables/useStateColor.test.ts +325 -0
  90. package/composables/useStateColor.ts +128 -0
  91. package/config/home-links.js +1 -1
  92. package/config/labels-annotations.js +1 -0
  93. package/config/product/explorer.js +17 -4
  94. package/config/product/manager.js +2 -0
  95. package/config/router/index.js +16 -0
  96. package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
  97. package/config/router/navigation-guards/authentication.js +10 -4
  98. package/config/router/routes.js +20 -6
  99. package/config/settings.ts +0 -2
  100. package/config/table-headers.js +3 -4
  101. package/config/types.js +9 -0
  102. package/core/plugin-products-base.ts +3 -3
  103. package/core/plugin-types.ts +83 -30
  104. package/core/plugin.ts +3 -0
  105. package/core/types-provisioning.ts +34 -1
  106. package/core/types.ts +15 -2
  107. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
  108. package/detail/__tests__/workload.test.ts +3 -152
  109. package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
  110. package/detail/provisioning.cattle.io.cluster.vue +30 -4
  111. package/detail/workload/index.vue +12 -55
  112. package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
  113. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
  114. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  115. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
  116. package/edit/auth/__tests__/azuread.test.ts +34 -9
  117. package/edit/auth/__tests__/github.test.ts +234 -0
  118. package/edit/auth/__tests__/oidc.test.ts +26 -6
  119. package/edit/auth/__tests__/saml.test.ts +196 -0
  120. package/edit/auth/azuread.vue +128 -95
  121. package/edit/auth/github.vue +72 -13
  122. package/edit/auth/ldap/__tests__/index.test.ts +206 -0
  123. package/edit/auth/ldap/config.vue +8 -0
  124. package/edit/auth/ldap/index.vue +75 -1
  125. package/edit/auth/oidc.vue +119 -73
  126. package/edit/auth/saml.vue +76 -12
  127. package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
  128. package/edit/fleet.cattle.io.helmop.vue +491 -136
  129. package/edit/management.cattle.io.user.vue +5 -2
  130. package/edit/provisioning.cattle.io.cluster/rke2.vue +84 -10
  131. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  132. package/list/group.principal.vue +5 -4
  133. package/list/harvesterhci.io.management.cluster.vue +8 -9
  134. package/list/management.cattle.io.user.vue +12 -9
  135. package/list/provisioning.cattle.io.cluster.vue +16 -10
  136. package/mixins/__tests__/auth-config.test.ts +90 -0
  137. package/mixins/__tests__/chart.test.ts +94 -0
  138. package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
  139. package/mixins/auth-config.js +7 -0
  140. package/mixins/chart.js +11 -2
  141. package/mixins/child-hook.js +12 -6
  142. package/mixins/create-edit-view/impl.js +5 -3
  143. package/mixins/resource-fetch-api-pagination.js +21 -1
  144. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
  145. package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
  146. package/models/__tests__/fleet-application.test.ts +175 -0
  147. package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
  148. package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
  149. package/models/__tests__/management.cattle.io.node.ts +22 -0
  150. package/models/__tests__/namespace.test.ts +36 -0
  151. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +49 -0
  152. package/models/__tests__/workload.test.ts +401 -26
  153. package/models/catalog.cattle.io.clusterrepo.js +28 -4
  154. package/models/compliance.cattle.io.clusterscan.js +39 -4
  155. package/models/fleet-application.js +4 -0
  156. package/models/fleet.cattle.io.helmop.js +20 -1
  157. package/models/management.cattle.io.cluster.js +18 -2
  158. package/models/management.cattle.io.node.js +44 -3
  159. package/models/namespace.js +1 -1
  160. package/models/pod.js +33 -1
  161. package/models/provisioning.cattle.io.cluster.js +5 -5
  162. package/models/workload.js +108 -13
  163. package/models/workload.service.js +5 -0
  164. package/package.json +14 -13
  165. package/pages/about.vue +5 -6
  166. package/pages/auth/login.vue +0 -35
  167. package/pages/auth/setup.vue +11 -0
  168. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
  169. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
  170. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
  171. package/pages/c/_cluster/apps/charts/chart.vue +2 -1
  172. package/pages/c/_cluster/apps/charts/index.vue +48 -10
  173. package/pages/c/_cluster/apps/charts/install.vue +122 -116
  174. package/pages/c/_cluster/auth/roles/index.vue +5 -4
  175. package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
  176. package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
  177. package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
  178. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
  179. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
  180. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
  181. package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
  182. package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
  183. package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
  184. package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
  185. package/pages/c/_cluster/fleet/application/create.vue +187 -136
  186. package/pages/c/_cluster/fleet/application/index.vue +5 -3
  187. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
  188. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
  189. package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
  190. package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
  191. package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
  192. package/pages/c/_cluster/fleet/index.vue +2 -2
  193. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +96 -0
  194. package/pages/c/_cluster/uiplugins/index.vue +15 -0
  195. package/pages/fail-whale.vue +16 -11
  196. package/pages/home.vue +16 -46
  197. package/plugins/clean-html.d.ts +9 -0
  198. package/plugins/dashboard-store/__tests__/resource-class.test.ts +93 -0
  199. package/plugins/dashboard-store/resource-class.js +62 -7
  200. package/plugins/steve/__tests__/actions.test.ts +212 -0
  201. package/plugins/steve/actions.js +96 -0
  202. package/plugins/steve/steve-pagination-utils.ts +1 -1
  203. package/rancher-components/Accordion/Accordion.vue +53 -9
  204. package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
  205. package/rancher-components/Form/Radio/RadioButton.vue +17 -1
  206. package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
  207. package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
  208. package/rancher-components/RcButton/RcButton.test.ts +103 -0
  209. package/rancher-components/RcButton/RcButton.vue +94 -15
  210. package/rancher-components/RcButton/types.ts +3 -0
  211. package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
  212. package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
  213. package/rancher-components/RcSection/RcSection.vue +28 -3
  214. package/scripts/extension/helm/package/Dockerfile +1 -1
  215. package/scripts/test-plugins-build.sh +2 -1
  216. package/store/__tests__/notifications.test.ts +434 -0
  217. package/store/catalog.js +57 -0
  218. package/store/plugins.js +7 -4
  219. package/types/components/buttonGroup.ts +5 -0
  220. package/types/shell/index.d.ts +104 -70
  221. package/utils/__tests__/auth.test.ts +273 -0
  222. package/utils/__tests__/computed.test.ts +193 -0
  223. package/utils/__tests__/cspAdaptor.test.ts +163 -0
  224. package/utils/__tests__/dom.test.ts +81 -0
  225. package/utils/__tests__/duration.test.ts +37 -1
  226. package/utils/__tests__/dynamic-importer.test.ts +102 -0
  227. package/utils/__tests__/fleet-appco.test.ts +312 -0
  228. package/utils/__tests__/monitoring.test.ts +130 -0
  229. package/utils/__tests__/object.test.ts +22 -0
  230. package/utils/__tests__/platform.test.ts +91 -0
  231. package/utils/__tests__/position.test.ts +237 -0
  232. package/utils/__tests__/provider.test.ts +51 -1
  233. package/utils/__tests__/queue.test.ts +232 -0
  234. package/utils/__tests__/release-notes.test.ts +221 -0
  235. package/utils/__tests__/router.test.js +254 -1
  236. package/utils/__tests__/select.test.ts +208 -0
  237. package/utils/__tests__/time.test.ts +265 -1
  238. package/utils/__tests__/title.test.ts +47 -0
  239. package/utils/__tests__/width.test.ts +53 -0
  240. package/utils/__tests__/window.test.ts +158 -0
  241. package/utils/__tests__/xccdf.test.ts +126 -6
  242. package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
  243. package/utils/crypto/__tests__/index.test.ts +144 -0
  244. package/utils/duration.ts +104 -0
  245. package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
  246. package/utils/dynamic-content/info.ts +2 -1
  247. package/utils/error.js +13 -0
  248. package/utils/fleet-appco.ts +323 -0
  249. package/utils/object.js +22 -2
  250. package/utils/provider.ts +12 -0
  251. package/utils/validators/__tests__/container-images.test.ts +104 -0
  252. package/utils/validators/__tests__/flow-output.test.ts +91 -0
  253. package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
  254. package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
  255. package/utils/xccdf.ts +39 -42
  256. package/vue.config.js +1 -1
  257. package/pages/support/index.vue +0 -264
  258. 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>