@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
@@ -0,0 +1,162 @@
1
+ <script setup lang="ts">
2
+ import { toRef } from 'vue';
3
+ import { useI18n } from '@shell/composables/useI18n';
4
+ import { useHelmOpResources } from '@shell/composables/useHelmOpResources';
5
+ import { useStore } from 'vuex';
6
+ import Banner from '@components/Banner/Banner.vue';
7
+ import Checkbox from '@components/Form/Checkbox/Checkbox.vue';
8
+ import { RcSection } from '@components/RcSection';
9
+ import FleetSecretSelector from '@shell/components/fleet/FleetSecretSelector.vue';
10
+ import FleetConfigMapSelector from '@shell/components/fleet/FleetConfigMapSelector.vue';
11
+ import { RcIcon } from '@components/RcIcon';
12
+ import { getVersionData } from '@shell/config/version';
13
+ import { getDownstreamResourcesDocsUrl } from '@shell/utils/fleet-appco';
14
+
15
+ const props = withDefaults(defineProps<{
16
+ value: Record<string, any>;
17
+ mode: string;
18
+ correctDriftEnabled: boolean;
19
+ downstreamSecretsList: string[];
20
+ downstreamConfigMapsList: string[];
21
+ lockedSecrets?: string[];
22
+ }>(), { lockedSecrets: () => [] });
23
+
24
+ // eslint-disable-next-line func-call-spacing
25
+ const emit = defineEmits<{
26
+ (e: 'update:correct-drift', value: boolean): void;
27
+ (e: 'update:downstream-resources', value: { kind: string; list: string[] }): void;
28
+ }>();
29
+
30
+ const store = useStore();
31
+ const { t } = useI18n(store);
32
+
33
+ const DOCS_URL = getDownstreamResourcesDocsUrl(getVersionData()?.Version);
34
+
35
+ const { updateCorrectDrift, updateSecrets, updateDownstreamResources } = useHelmOpResources(emit, toRef(props, 'lockedSecrets'));
36
+ </script>
37
+
38
+ <template>
39
+ <div
40
+ class="gap-md"
41
+ data-testid="helmop-appco-resources-section"
42
+ >
43
+ <!-- Helm chart resources settings -->
44
+ <RcSection
45
+ :title="t('fleet.helmOp.appCoResources.helmChartSettings')"
46
+ mode="with-header"
47
+ type="secondary"
48
+ expandable
49
+ :expanded="true"
50
+ data-testid="helmop-appco-resources-chart-settings"
51
+ >
52
+ <div class="resource-handling">
53
+ <Checkbox
54
+ :value="correctDriftEnabled"
55
+ :tooltip="t('fleet.helmOp.resources.correctDriftTooltip')"
56
+ type="checkbox"
57
+ label-key="fleet.helmOp.resources.correctDrift"
58
+ :use-body-text-color="true"
59
+ :mode="mode"
60
+ data-testid="helmop-appco-resources-correct-drift"
61
+ @update:value="updateCorrectDrift"
62
+ />
63
+ <Checkbox
64
+ v-model:value="value.spec.keepResources"
65
+ :tooltip="t('fleet.helmOp.resources.keepResourcesTooltip')"
66
+ type="checkbox"
67
+ label-key="fleet.helmOp.resources.keepResources"
68
+ :use-body-text-color="true"
69
+ :mode="mode"
70
+ data-testid="helmop-appco-resources-keep-resources"
71
+ />
72
+ </div>
73
+ </RcSection>
74
+
75
+ <!-- Additional resources to sync -->
76
+ <RcSection
77
+ :title="t('fleet.helmOp.appCoResources.additionalResources')"
78
+ mode="with-header"
79
+ type="secondary"
80
+ expandable
81
+ :expanded="true"
82
+ data-testid="helmop-appco-resources-additional"
83
+ >
84
+ <div class="gap-md">
85
+ <p>
86
+ {{ t('fleet.helmOp.appCoResources.additionalResourcesDescription') }}<br>
87
+ {{ t('fleet.helmOp.appCoResources.additionalResourcesLinkDescription') }}
88
+ <a
89
+ :href="DOCS_URL"
90
+ target="_blank"
91
+ rel="noopener noreferrer nofollow"
92
+ >
93
+ {{ t('fleet.helmOp.appCoResources.additionalResourcesLink') }}
94
+ <RcIcon
95
+ type="external-link"
96
+ size="small"
97
+ aria-hidden="true"
98
+ /></a>
99
+ </p>
100
+
101
+ <div class="gap-12">
102
+ <Banner
103
+ v-if="lockedSecrets.length > 0"
104
+ color="info"
105
+ class="mb-0 mt-0"
106
+ data-testid="helmop-appco-resources-locked-secret-banner"
107
+ >
108
+ {{ t('fleet.helmOp.resources.lockedSecretBanner') }}
109
+ </Banner>
110
+
111
+ <div
112
+ class="row"
113
+ >
114
+ <div class="col span-6">
115
+ <FleetSecretSelector
116
+ :value="downstreamSecretsList"
117
+ :namespace="value.metadata.namespace"
118
+ :mode="mode"
119
+ :locked-options="lockedSecrets"
120
+ data-testid="helmop-appco-resources-secret-selector"
121
+ @update:value="updateSecrets"
122
+ />
123
+ </div>
124
+ </div>
125
+ </div>
126
+ <div
127
+ class="row"
128
+ >
129
+ <div class="col span-6">
130
+ <FleetConfigMapSelector
131
+ :value="downstreamConfigMapsList"
132
+ :namespace="value.metadata.namespace"
133
+ :mode="mode"
134
+ data-testid="helmop-appco-resources-configmap-selector"
135
+ @update:value="updateDownstreamResources('ConfigMap', $event)"
136
+ />
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </RcSection>
141
+ </div>
142
+ </template>
143
+
144
+ <style lang="scss" scoped>
145
+ .resource-handling {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 5px;
149
+ }
150
+
151
+ .gap-12 {
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 12px;
155
+ }
156
+
157
+ .gap-md {
158
+ display: flex;
159
+ flex-direction: column;
160
+ gap: var(--gap-md);
161
+ }
162
+ </style>
@@ -0,0 +1,82 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue';
3
+ import { useI18n } from '@shell/composables/useI18n';
4
+ import { useHelmOpResources } from '@shell/composables/useHelmOpResources';
5
+ import { useStore } from 'vuex';
6
+ import Checkbox from '@components/Form/Checkbox/Checkbox.vue';
7
+ import FleetSecretSelector from '@shell/components/fleet/FleetSecretSelector.vue';
8
+ import FleetConfigMapSelector from '@shell/components/fleet/FleetConfigMapSelector.vue';
9
+
10
+ defineProps<{
11
+ value: Record<string, any>;
12
+ mode: string;
13
+ correctDriftEnabled: boolean;
14
+ downstreamSecretsList: string[];
15
+ downstreamConfigMapsList: string[];
16
+ }>();
17
+
18
+ // eslint-disable-next-line func-call-spacing
19
+ const emit = defineEmits<{
20
+ (e: 'update:correct-drift', value: boolean): void;
21
+ (e: 'update:downstream-resources', value: { kind: string; list: string[] }): void;
22
+ }>();
23
+
24
+ const store = useStore();
25
+ const { t } = useI18n(store);
26
+
27
+ const { updateCorrectDrift, updateSecrets, updateDownstreamResources } = useHelmOpResources(emit, ref([]));
28
+ </script>
29
+
30
+ <template>
31
+ <div data-testid="helmop-resources-section">
32
+ <div class="row mt-20 mb-20">
33
+ <div class="col span-6">
34
+ <FleetSecretSelector
35
+ :value="downstreamSecretsList"
36
+ :namespace="value.metadata.namespace"
37
+ :mode="mode"
38
+ data-testid="helmop-resources-secret-selector"
39
+ @update:value="updateSecrets"
40
+ />
41
+ </div>
42
+ </div>
43
+ <div class="row mt-20 mb-20">
44
+ <div class="col span-6">
45
+ <FleetConfigMapSelector
46
+ :value="downstreamConfigMapsList"
47
+ :namespace="value.metadata.namespace"
48
+ :mode="mode"
49
+ data-testid="helmop-resources-configmap-selector"
50
+ @update:value="updateDownstreamResources('ConfigMap', $event)"
51
+ />
52
+ </div>
53
+ </div>
54
+ <div class="resource-handling">
55
+ <Checkbox
56
+ :value="correctDriftEnabled"
57
+ :tooltip="t('fleet.helmOp.resources.correctDriftTooltip')"
58
+ type="checkbox"
59
+ label-key="fleet.helmOp.resources.correctDrift"
60
+ :mode="mode"
61
+ data-testid="helmop-resources-correct-drift"
62
+ @update:value="updateCorrectDrift"
63
+ />
64
+ <Checkbox
65
+ v-model:value="value.spec.keepResources"
66
+ :tooltip="t('fleet.helmOp.resources.keepResourcesTooltip')"
67
+ type="checkbox"
68
+ label-key="fleet.helmOp.resources.keepResources"
69
+ :mode="mode"
70
+ data-testid="helmop-resources-keep-resources"
71
+ />
72
+ </div>
73
+ </div>
74
+ </template>
75
+
76
+ <style lang="scss" scoped>
77
+ .resource-handling {
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 5px;
81
+ }
82
+ </style>
@@ -0,0 +1,89 @@
1
+ <script setup lang="ts">
2
+ import { useStore } from 'vuex';
3
+ import { useI18n } from '@shell/composables/useI18n';
4
+ import LabeledInput from '@components/Form/LabeledInput/LabeledInput.vue';
5
+ import { RcIcon } from '@components/RcIcon';
6
+
7
+ withDefaults(defineProps<{
8
+ value: { spec: { serviceAccount?: string; namespace?: string } };
9
+ mode: string;
10
+ compact?: boolean;
11
+ }>(), { compact: false });
12
+
13
+ const store = useStore();
14
+ const { t } = useI18n(store);
15
+
16
+ const DOCS_URL = 'https://fleet.rancher.io/reference/ref-crds#_bundledeploymentoptions';
17
+ </script>
18
+
19
+ <template>
20
+ <div
21
+ :class="{ row: !compact, 'col gap-md': compact }"
22
+ data-testid="helmop-target-options-section"
23
+ >
24
+ <p v-if="compact">
25
+ {{ t('fleet.helmOp.target.clusterDeploymentDescription') }}<br>
26
+ {{ t('generic.learnMoreAbout') }}
27
+ <a
28
+ :href="DOCS_URL"
29
+ target="_blank"
30
+ rel="noopener noreferrer nofollow"
31
+ >
32
+ {{ t('fleet.helmOp.target.clusterDeploymentLink') }}
33
+ <RcIcon
34
+ type="external-link"
35
+ size="small"
36
+ aria-hidden="true"
37
+ />
38
+ </a>
39
+ </p>
40
+ <div class="col span-6 cluster-deployment-settings-input">
41
+ <LabeledInput
42
+ v-model:value="value.spec.serviceAccount"
43
+ :mode="mode"
44
+ label-key="fleet.helmOp.serviceAccount.label"
45
+ :placeholder-key="compact ? 'fleet.helmOp.serviceAccount.compactPlaceholder' : 'fleet.helmOp.serviceAccount.placeholder'"
46
+ data-testid="helmop-target-options-service-account"
47
+ />
48
+ <p
49
+ v-if="compact"
50
+ class="sub-description"
51
+ >
52
+ {{ t('fleet.helmOp.serviceAccount.compactDescription') }}
53
+ </p>
54
+ </div>
55
+ <div class="col span-6 cluster-deployment-settings-input">
56
+ <LabeledInput
57
+ v-model:value="value.spec.namespace"
58
+ :mode="mode"
59
+ label-key="fleet.helmOp.targetNamespace.label"
60
+ :placeholder-key="compact ? 'fleet.helmOp.targetNamespace.compactPlaceholder' : 'fleet.helmOp.targetNamespace.placeholder'"
61
+ data-testid="helmop-target-options-namespace"
62
+ />
63
+ <p
64
+ v-if="compact"
65
+ class="sub-description"
66
+ >
67
+ {{ t('fleet.helmOp.targetNamespace.compactDescription') }}
68
+ </p>
69
+ </div>
70
+ </div>
71
+ </template>
72
+
73
+ <style lang="scss" scoped>
74
+ .gap-md {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: var(--gap-md);
78
+ }
79
+
80
+ .cluster-deployment-settings-input {
81
+ display: flex;
82
+ gap: 4px;
83
+ flex-direction: column;
84
+ }
85
+
86
+ .sub-description {
87
+ font-size: 12px;
88
+ }
89
+ </style>
@@ -1,84 +1,88 @@
1
- <script setup>
1
+ <script setup lang="ts">
2
2
  import { useI18n } from '@shell/composables/useI18n';
3
3
  import { useStore } from 'vuex';
4
- import LabeledInput from '@components/Form/LabeledInput/LabeledInput.vue';
5
4
  import FleetClusterTargets from '@shell/components/fleet/FleetClusterTargets/index.vue';
5
+ import HelmOpTargetOptionsSection from '@shell/components/fleet/HelmOpTargetOptionsSection.vue';
6
6
 
7
- defineProps({
8
- value: {
9
- type: Object,
10
- required: true
11
- },
12
- mode: {
13
- type: String,
14
- required: true
15
- },
16
- realMode: {
17
- type: String,
18
- required: true
19
- },
20
- isView: {
21
- type: Boolean,
22
- default: false
23
- },
24
- targetsCreated: {
25
- type: String,
26
- default: ''
27
- }
7
+ import type { Target } from '@shell/types/fleet';
8
+
9
+ interface HelmOpValue {
10
+ spec: {
11
+ targets: Target[];
12
+ serviceAccount?: string;
13
+ namespace?: string;
14
+ };
15
+ metadata: { namespace: string };
16
+ targetClusters: object[];
17
+ }
18
+
19
+ withDefaults(defineProps<{
20
+ value: HelmOpValue;
21
+ mode: string;
22
+ realMode: string;
23
+ targetsCreated?: string;
24
+ hideAdditionalOptions?: boolean;
25
+ compact?: boolean;
26
+ }>(), {
27
+ targetsCreated: '',
28
+ hideAdditionalOptions: false,
29
+ compact: false,
28
30
  });
29
31
 
30
- const emit = defineEmits(['update:targets', 'targets-created']);
32
+ // eslint-disable-next-line func-call-spacing
33
+ const emit = defineEmits<{
34
+ (e: 'update:targets', value: Target[]): void;
35
+ (e: 'targets-created', value: string): void;
36
+ }>();
31
37
 
32
38
  const store = useStore();
33
39
  const { t } = useI18n(store);
34
40
 
35
- const updateTargets = (value) => {
41
+ const updateTargets = (value: Target[]) => {
36
42
  emit('update:targets', value);
37
43
  };
38
44
 
39
- const onTargetsCreated = (value) => {
45
+ const onTargetsCreated = (value: string) => {
40
46
  emit('targets-created', value);
41
47
  };
42
48
  </script>
43
49
 
44
50
  <template>
45
- <div>
46
- <h2>{{ t('fleet.helmOp.target.label') }}</h2>
47
- <FleetClusterTargets
48
- :targets="value.spec.targets"
49
- :matching="value.targetClusters"
50
- :namespace="value.metadata.namespace"
51
- :mode="realMode"
52
- :created="targetsCreated"
53
- @update:value="updateTargets"
54
- @created="onTargetsCreated"
55
- />
56
-
57
- <h3 class="mmt-16">
58
- {{ t('fleet.helmOp.target.additionalOptions') }}
59
- </h3>
60
- <div class="row mt-20">
61
- <div class="col span-6">
62
- <LabeledInput
63
- v-model:value="value.spec.serviceAccount"
64
- :mode="mode"
65
- label-key="fleet.helmOp.serviceAccount.label"
66
- placeholder-key="fleet.helmOp.serviceAccount.placeholder"
67
- />
68
- </div>
69
- <div class="col span-6">
70
- <LabeledInput
71
- v-model:value="value.spec.namespace"
72
- :mode="mode"
73
- label-key="fleet.helmOp.targetNamespace.label"
74
- placeholder-key="fleet.helmOp.targetNamespace.placeholder"
75
- label="Target Namespace"
76
- placeholder="Optional: Require all resources to be in this namespace"
77
- />
78
- </div>
51
+ <div data-testid="helmop-target-tab">
52
+ <div :class="{ 'gap-6': compact }">
53
+ <h2 v-if="!compact || realMode === 'view'">
54
+ {{ t('fleet.helmOp.target.label') }}
55
+ </h2>
56
+ <FleetClusterTargets
57
+ :targets="value.spec.targets"
58
+ :matching="value.targetClusters"
59
+ :namespace="value.metadata.namespace"
60
+ :mode="realMode"
61
+ :created="targetsCreated"
62
+ :compact="compact"
63
+ data-testid="helmop-target-cluster-targets"
64
+ @update:value="updateTargets"
65
+ @created="onTargetsCreated"
66
+ />
79
67
  </div>
68
+
69
+ <template v-if="!hideAdditionalOptions">
70
+ <h3 class="mmt-16 mb-20">
71
+ {{ t('fleet.helmOp.target.additionalOptions') }}
72
+ </h3>
73
+ <HelmOpTargetOptionsSection
74
+ :value="value"
75
+ :mode="mode"
76
+ data-testid="helmop-target-options"
77
+ />
78
+ </template>
80
79
  </div>
81
80
  </template>
82
81
 
83
82
  <style lang="scss" scoped>
83
+ .gap-6 {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: 6px;
87
+ }
84
88
  </style>