@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
@@ -1,18 +1,22 @@
1
1
  <script>
2
- import { ref, watch, computed } from 'vue';
2
+ import { ref, watch, computed, toRef } from 'vue';
3
3
  import debounce from 'lodash/debounce';
4
4
  import { _EDIT, _VIEW } from '@shell/config/query-params';
5
5
  import { removeAt } from '@shell/utils/array';
6
6
  import { TextAreaAutoGrow } from '@components/Form/TextArea';
7
7
  import { clone } from '@shell/utils/object';
8
8
  import { LabeledInput } from '@components/Form/LabeledInput';
9
+ import Banner from '@components/Banner/Banner.vue';
10
+ import { useVeeValidateField } from '@shell/composables/useVeeValidateField';
9
11
  const DEFAULT_PROTIP = 'Tip: Paste lines into any list field for easy bulk entry';
10
12
 
11
13
  export default {
12
14
  emits: ['add', 'remove', 'update:value'],
13
15
 
14
- components: { TextAreaAutoGrow, LabeledInput },
15
- props: {
16
+ components: {
17
+ TextAreaAutoGrow, LabeledInput, Banner
18
+ },
19
+ props: {
16
20
  value: {
17
21
  type: Array,
18
22
  default: null,
@@ -106,7 +110,17 @@ export default {
106
110
  componentTestid: {
107
111
  type: String,
108
112
  default: 'array-list',
109
- }
113
+ },
114
+
115
+ /**
116
+ * Field name for vee-validate integration. When provided, the component
117
+ * registers with a parent form context for schema-level validation.
118
+ */
119
+ name: {
120
+ type: String,
121
+ default: null,
122
+ },
123
+
110
124
  },
111
125
 
112
126
  setup(props, { emit }) {
@@ -126,6 +140,26 @@ export default {
126
140
  return props.mode === _VIEW;
127
141
  });
128
142
 
143
+ // vee-validate integration: array-level validation via a parent form schema.
144
+ // Per-item validation continues to use the existing `rules` prop on
145
+ // LabeledInput.
146
+ const arrayValue = computed(() => props.value || []);
147
+ const { effectiveValidationMessage, veeHandleBlur, veeValidate } = useVeeValidateField({
148
+ name: toRef(props, 'name'),
149
+ rules: ref([]),
150
+ value: arrayValue,
151
+ validationMessage: ref(null),
152
+ });
153
+
154
+ // Only structural changes (add, delete, paste) mark trigger validation
155
+ // when invoking update()
156
+ const isStructuralChange = ref(false);
157
+
158
+ const validate = () => {
159
+ veeHandleBlur(undefined, false);
160
+ veeValidate();
161
+ };
162
+
129
163
  /**
130
164
  * Cleanup rows and emit input
131
165
  */
@@ -144,6 +178,10 @@ export default {
144
178
  }
145
179
  }
146
180
  emit('update:value', out);
181
+ if (isStructuralChange.value) {
182
+ validate();
183
+ isStructuralChange.value = false;
184
+ }
147
185
  };
148
186
 
149
187
  const lastUpdateWasFromValue = ref(false);
@@ -177,6 +215,9 @@ export default {
177
215
  queueUpdate,
178
216
  isView,
179
217
  update,
218
+ effectiveValidationMessage,
219
+ isStructuralChange,
220
+ validate,
180
221
  };
181
222
  },
182
223
 
@@ -211,6 +252,7 @@ export default {
211
252
  },
212
253
  methods: {
213
254
  add() {
255
+ this.isStructuralChange = true;
214
256
  this.rows.push({ value: clone(this.defaultAddValue) });
215
257
  if (this.defaultAddValue) {
216
258
  this.queueUpdate();
@@ -229,6 +271,7 @@ export default {
229
271
  */
230
272
  remove(row, index) {
231
273
  this.$emit('remove', { row, index });
274
+ this.isStructuralChange = true;
232
275
  removeAt(this.rows, index);
233
276
  this.queueUpdate();
234
277
  },
@@ -240,6 +283,7 @@ export default {
240
283
  event.preventDefault();
241
284
  const text = event.clipboardData.getData('text/plain');
242
285
 
286
+ this.isStructuralChange = true;
243
287
  if (this.valueMultiline) {
244
288
  // Allow to paste multiple lines
245
289
  this.rows[index].value = text;
@@ -285,6 +329,12 @@ export default {
285
329
  </h3>
286
330
  </slot>
287
331
  </div>
332
+ <Banner
333
+ v-if="effectiveValidationMessage"
334
+ class="validation-banner"
335
+ color="error"
336
+ :label="effectiveValidationMessage"
337
+ />
288
338
 
289
339
  <div>
290
340
  <template v-if="rows.length">
@@ -335,6 +385,7 @@ export default {
335
385
  :aria-label="a11yLabel ? `${a11yLabel} ${t('generic.ariaLabel.genericRow', {index: idx+1})}` : undefined"
336
386
  @paste="onPaste(idx, $event)"
337
387
  @update:value="queueUpdate"
388
+ @blur="validate"
338
389
  />
339
390
  <LabeledInput
340
391
  v-else-if="rules.length > 0"
@@ -348,6 +399,7 @@ export default {
348
399
  :aria-label="a11yLabel ? `${a11yLabel} ${t('generic.ariaLabel.genericRow', {index: idx+1})}` : undefined"
349
400
  @paste="onPaste(idx, $event)"
350
401
  @update:value="queueUpdate"
402
+ @blur="validate"
351
403
  />
352
404
  <input
353
405
  v-else
@@ -358,6 +410,7 @@ export default {
358
410
  :disabled="isView || disabled"
359
411
  :aria-label="a11yLabel ? `${a11yLabel} ${t('generic.ariaLabel.genericRow', {index: idx+1})}` : undefined"
360
412
  @paste="onPaste(idx, $event)"
413
+ @blur="validate"
361
414
  >
362
415
  </slot>
363
416
  </div>
@@ -443,6 +496,10 @@ export default {
443
496
  color: var(--error);
444
497
  }
445
498
 
499
+ .validation-banner {
500
+ margin-top: 0;
501
+ }
502
+
446
503
  .box {
447
504
  display: grid;
448
505
  grid-template-columns: auto $array-list-remove-margin;
@@ -13,6 +13,7 @@ import { asciiLike } from '@shell/utils/string';
13
13
  import CodeMirror from '@shell/components/CodeMirror';
14
14
  import isEqual from 'lodash/isEqual';
15
15
  import { LabeledTooltip } from '@components/LabeledTooltip';
16
+ import { RcButton } from '@components/RcButton';
16
17
 
17
18
  export default {
18
19
  name: 'KeyValue',
@@ -24,7 +25,8 @@ export default {
24
25
  Select,
25
26
  TextAreaAutoGrow,
26
27
  FileSelector,
27
- LabeledTooltip
28
+ LabeledTooltip,
29
+ RcButton
28
30
  },
29
31
  props: {
30
32
  value: {
@@ -241,6 +243,10 @@ export default {
241
243
  keyErrors: {
242
244
  type: Object,
243
245
  default: () => ({})
246
+ },
247
+ useRcButton: {
248
+ type: Boolean,
249
+ default: false
244
250
  }
245
251
  },
246
252
  data() {
@@ -879,8 +885,23 @@ export default {
879
885
  name="add"
880
886
  :add="add"
881
887
  >
888
+ <RcButton
889
+ v-if="addAllowed && useRcButton"
890
+ size="small"
891
+ variant="secondary"
892
+ :class="[addClass]"
893
+ data-testid="add_row_item_button"
894
+ :disabled="loading || disabled || (keyOptions && filteredKeyOptions.length === 0)"
895
+ :aria-label="t('generic.ariaLabel.addKeyValue')"
896
+ @click="add()"
897
+ >
898
+ <i
899
+ class="mr-5 icon"
900
+ :class="loading ? ['icon-lg', 'icon-spinner','icon-spin']: [addIcon]"
901
+ /> {{ _addLabel }}
902
+ </RcButton>
882
903
  <button
883
- v-if="addAllowed"
904
+ v-else-if="addAllowed"
884
905
  type="button"
885
906
  role="button"
886
907
  class="btn role-tertiary add"
@@ -12,7 +12,8 @@ import { _VIEW } from '@shell/config/query-params';
12
12
  import { useClickOutside } from '@shell/composables/useClickOutside';
13
13
  import { useLabeledFormElement, labeledFormElementProps } from '@shell/composables/useLabeledFormElement';
14
14
  import { useLabeledSelect } from '@shell/composables/useLabeledSelect';
15
- import { ref } from 'vue';
15
+ import { ref, toRef } from 'vue';
16
+ import { useVeeValidateField } from '@shell/composables/useVeeValidateField';
16
17
 
17
18
  export default {
18
19
  name: 'LabeledSelect',
@@ -115,6 +116,15 @@ export default {
115
116
  noOptionsLabelKey: {
116
117
  type: String,
117
118
  default: 'labelSelect.noOptions.empty'
119
+ },
120
+ lockedOptions: {
121
+ type: Array,
122
+ default: () => []
123
+ },
124
+
125
+ name: {
126
+ type: String,
127
+ default: null
118
128
  }
119
129
  },
120
130
 
@@ -161,6 +171,13 @@ export default {
161
171
  resizeHandlerFn(select);
162
172
  };
163
173
 
174
+ const { effectiveValidationMessage, veeHandleBlur, veeValidate } = useVeeValidateField({
175
+ name: toRef(props, 'name'),
176
+ rules: toRef(props, 'rules'),
177
+ value: toRef(props, 'value'),
178
+ validationMessage,
179
+ });
180
+
164
181
  return {
165
182
  isOpen,
166
183
  select,
@@ -172,7 +189,7 @@ export default {
172
189
  onFocusLabeled,
173
190
  onBlurLabeled,
174
191
  isDisabled,
175
- validationMessage,
192
+ validationMessage: effectiveValidationMessage,
176
193
  requiredField,
177
194
  isSearchable,
178
195
  isFilterable,
@@ -186,6 +203,8 @@ export default {
186
203
  paginating,
187
204
  loadMore,
188
205
  setPaginationFilter,
206
+ veeHandleBlur,
207
+ veeValidate,
189
208
  };
190
209
  },
191
210
 
@@ -221,7 +240,7 @@ export default {
221
240
  // update placeholder text to inform user they can add their own opts when none are found
222
241
  showTagPrompts() {
223
242
  return !this.options.length && this.$attrs.taggable && this.isSearchable;
224
- }
243
+ },
225
244
  },
226
245
 
227
246
  methods: {
@@ -272,6 +291,8 @@ export default {
272
291
  this.$emit('on-blur');
273
292
  this.selectedVisibility = 'visible';
274
293
  this.onBlurLabeled();
294
+ this.veeHandleBlur(undefined, false);
295
+ this.veeValidate();
275
296
  },
276
297
 
277
298
  onOpen() {
@@ -365,7 +386,17 @@ export default {
365
386
  }
366
387
 
367
388
  return this.getOptionLabel(opt);
368
- }
389
+ },
390
+
391
+ isOptionLocked(option) {
392
+ if (!this.lockedOptions.length) {
393
+ return false;
394
+ }
395
+
396
+ const label = this.getOptionLabel(option);
397
+
398
+ return this.lockedOptions.includes(typeof label === 'string' ? label.trim() : String(label));
399
+ },
369
400
  },
370
401
  };
371
402
  </script>
@@ -496,6 +527,14 @@ export default {
496
527
  />
497
528
  </div>
498
529
  </template>
530
+ <template
531
+ v-if="lockedOptions.length"
532
+ #selected-option="option"
533
+ >
534
+ <span :data-locked="isOptionLocked(option) || undefined">
535
+ {{ getOptionLabel(option) }}
536
+ </span>
537
+ </template>
499
538
  <!-- Pass down templates provided by the caller -->
500
539
  <template
501
540
  v-for="(_, slot) of $slots"
@@ -659,6 +698,14 @@ export default {
659
698
  min-height: unset !important;
660
699
  padding: 0 0 0 7px !important;
661
700
 
701
+ &:has([data-locked]) {
702
+ padding: 0 7px 0 7px !important;
703
+
704
+ .vs__deselect {
705
+ display: none;
706
+ }
707
+ }
708
+
662
709
  > button {
663
710
  height: 20px;
664
711
  line-height: 14px;
@@ -674,6 +721,14 @@ export default {
674
721
  }
675
722
  }
676
723
  }
724
+
725
+ :deep() .vs--disabled .vs__selected-options .vs__selected {
726
+ padding: 0 7px 0 7px !important;
727
+
728
+ .vs__deselect {
729
+ display: none;
730
+ }
731
+ }
677
732
  }
678
733
 
679
734
  :deep() .vs__selected-options {
@@ -126,6 +126,16 @@ export default {
126
126
  type: String,
127
127
  default: '',
128
128
  },
129
+
130
+ compact: {
131
+ type: Boolean,
132
+ default: false
133
+ },
134
+
135
+ useRcButton: {
136
+ type: Boolean,
137
+ default: false
138
+ }
129
139
  },
130
140
 
131
141
  data(): DataType {
@@ -162,9 +172,12 @@ export default {
162
172
  <div :class="defaultSectionClass">
163
173
  <div class="labels">
164
174
  <div class="labels__header">
165
- <h3 v-if="showLabelTitle">
175
+ <component
176
+ :is="!compact ? 'h3' : 'h4'"
177
+ v-if="showLabelTitle"
178
+ >
166
179
  <t k="labels.labels.title" />
167
- </h3>
180
+ </component>
168
181
  <ToggleSwitch
169
182
  v-if="showToggler"
170
183
  v-model:value="toggler"
@@ -186,13 +199,14 @@ export default {
186
199
  :read-allowed="false"
187
200
  :value-can-be-empty="true"
188
201
  :key-errors="labels.keyErrors"
202
+ :use-rc-button="useRcButton"
189
203
  @update:value="labels.update($event, (x) => value.setLabels(x))"
190
204
  />
191
205
  </slot>
192
206
  </div>
193
207
  </div>
194
208
  </div>
195
- <div class="spacer" />
209
+ <div :class="compact ? 'compact-spacer' : 'spacer'" />
196
210
  <div
197
211
  v-if="showAnnotations"
198
212
  :class="sectionClass"
@@ -208,6 +222,7 @@ export default {
208
222
  :read-allowed="false"
209
223
  :value-can-be-empty="true"
210
224
  :key-errors="annotations.keyErrors"
225
+ :use-rc-button="useRcButton"
211
226
  @update:value="annotations.update($event, (x) => value.setAnnotations(x))"
212
227
  />
213
228
  </div>
@@ -221,4 +236,8 @@ export default {
221
236
  justify-content: space-between;
222
237
  }
223
238
  }
239
+
240
+ .compact-spacer {
241
+ height: 24px;
242
+ }
224
243
  </style>
@@ -156,6 +156,14 @@ export default {
156
156
  type: Boolean,
157
157
  default: true,
158
158
  },
159
+ nameColSpan: {
160
+ type: Number,
161
+ default: 3,
162
+ },
163
+ noBottomMargin: {
164
+ type: Boolean,
165
+ default: false,
166
+ },
159
167
  rules: {
160
168
  default: () => ({
161
169
  namespace: [],
@@ -164,6 +172,14 @@ export default {
164
172
  }),
165
173
  type: Object,
166
174
  },
175
+ nameFieldName: {
176
+ type: String,
177
+ default: null,
178
+ },
179
+ namespaceFieldName: {
180
+ type: String,
181
+ default: null,
182
+ },
167
183
 
168
184
  /**
169
185
  * Inherited global identifier prefix for tests
@@ -302,8 +318,8 @@ export default {
302
318
 
303
319
  if (props.namespaced) {
304
320
  if (props.forceNamespace) {
305
- namespace.value = toRef(props.forceNamespace);
306
- updateNamespace(namespace);
321
+ namespace.value = props.forceNamespace;
322
+ updateNamespace(namespace.value);
307
323
  } else if (props.namespaceKey) {
308
324
  namespace.value = get(v.value, props.namespaceKey);
309
325
  } else {
@@ -313,7 +329,7 @@ export default {
313
329
  if (!namespace.value && !props.noDefaultNamespace) {
314
330
  namespace.value = store.getters['defaultNamespace'];
315
331
  if (metadata) {
316
- metadata.namespace = namespace;
332
+ metadata.namespace = namespace.value;
317
333
  }
318
334
  }
319
335
  }
@@ -428,7 +444,7 @@ export default {
428
444
  </script>
429
445
 
430
446
  <template>
431
- <div class="row mb-20">
447
+ <div :class="['row', { 'mb-20': !noBottomMargin }]">
432
448
  <slot name="project-selector" />
433
449
  <div
434
450
  v-if="namespaced && !nameNsHidden && createNamespace"
@@ -438,6 +454,7 @@ export default {
438
454
  <LabeledInput
439
455
  ref="namespaceInput"
440
456
  v-model:value="namespace"
457
+ :name="namespaceFieldName"
441
458
  :label="t('namespace.label')"
442
459
  :placeholder="t('namespace.createNamespace')"
443
460
  :disabled="namespaceReallyDisabled"
@@ -464,6 +481,7 @@ export default {
464
481
  <LabeledSelect
465
482
  v-show="!createNamespace"
466
483
  v-model:value="namespace"
484
+ :name="namespaceFieldName"
467
485
  :clearable="true"
468
486
  :options="options"
469
487
  :disabled="namespaceReallyDisabled"
@@ -481,12 +499,13 @@ export default {
481
499
  <div
482
500
  v-if="!nameHidden && !nameNsHidden"
483
501
  :data-testid="componentTestid + '-name'"
484
- class="col span-3"
502
+ :class="['col', `span-${nameColSpan}`]"
485
503
  >
486
504
  <LabeledInput
487
505
  ref="nameInput"
488
506
  key="name"
489
507
  v-model:value="name"
508
+ :name="nameFieldName"
490
509
  data-testid="NameNsDescriptionNameInput"
491
510
  :label="t(nameLabel)"
492
511
  :placeholder="t(namePlaceholder)"
@@ -244,6 +244,7 @@ export default {
244
244
  :default-tab="defaultTab"
245
245
  :resource="value"
246
246
  :use-hash="useHash"
247
+ :extension-params="extensionParams"
247
248
  >
248
249
  <slot />
249
250
  <Tab
@@ -140,11 +140,12 @@ export default {
140
140
  this.afterPrivilegedTickedMessage = this.t('workload.container.security.privileged.afterTick.false');
141
141
  }
142
142
 
143
- if (securityContext.fsGroup === '') {
143
+ // Drop empty values so we don't send a string for int64 fields.
144
+ if (securityContext.fsGroup === '' || securityContext.fsGroup === null || securityContext.fsGroup === undefined) {
144
145
  delete securityContext.fsGroup;
145
146
  }
146
147
 
147
- if (securityContext.runAsUser === '') {
148
+ if (securityContext.runAsUser === '' || securityContext.runAsUser === null || securityContext.runAsUser === undefined) {
148
149
  delete securityContext.runAsUser;
149
150
  }
150
151
 
@@ -175,6 +176,7 @@ export default {
175
176
  ref="firstFocusable"
176
177
  v-model:value.number="securityContext.fsGroup"
177
178
  type="number"
179
+ min="0"
178
180
  :mode="mode"
179
181
  :label="t('workload.container.security.fsGroup')"
180
182
  @update:value="update"
@@ -283,6 +285,8 @@ export default {
283
285
  </legend>
284
286
  <LabeledInput
285
287
  v-model:value.number="securityContext.runAsUser"
288
+ type="number"
289
+ min="0"
286
290
  :label="t('workload.container.security.runAsUser.label')"
287
291
  :mode="mode"
288
292
  @update:value="update"
@@ -130,14 +130,11 @@ export default {
130
130
  const version = this.provisioningCluster?.kubernetesVersion;
131
131
 
132
132
  if (this.provisioningCluster?.isRke2) {
133
+ // This is a candidate for using the prov cluster provisioner (or now the mgmt cluster provisioner directly)
133
134
  const machineSelectorConfig = this.provisioningCluster?.spec?.rkeConfig?.machineSelectorConfig || {};
134
135
  const agentConfig = (machineSelectorConfig[0] || {}).config;
135
136
 
136
137
  cloudProvider = agentConfig?.['cloud-provider-name'];
137
- } else if (this.provisioningCluster?.isRke1) {
138
- const currentCluster = this.$store.getters['currentCluster'];
139
-
140
- cloudProvider = currentCluster?.spec?.rancherKubernetesEngineConfig?.cloudProvider?.name;
141
138
  }
142
139
 
143
140
  return cloudProvider === HARVESTER &&
@@ -145,9 +142,7 @@ export default {
145
142
  },
146
143
 
147
144
  provisioningCluster() {
148
- const out = this.$store.getters['management/all'](CAPI.RANCHER_CLUSTER).find((c) => c?.status?.clusterName === this.currentCluster.metadata.name);
149
-
150
- return out;
145
+ return this.$store.getters['management/byId'](CAPI.RANCHER_CLUSTER, this.currentCluster.provClusterId);
151
146
  },
152
147
  },
153
148
 
@@ -170,6 +170,81 @@ describe('component: NameNsDescription', () => {
170
170
  expect(nameInput.element.value).toBe('Default');
171
171
  });
172
172
 
173
+ it('should set namespace to a plain string when forceNamespace prop is provided', () => {
174
+ const forcedNs = 'cert-manager';
175
+ const store = createStore({
176
+ getters: {
177
+ allowedNamespaces: () => () => ({}),
178
+ currentStore: () => () => 'cluster',
179
+ 'cluster/schemaFor': () => jest.fn()
180
+ }
181
+ });
182
+
183
+ const wrapper = mount(NameNsDescription, {
184
+ props: {
185
+ value: {
186
+ setAnnotation: jest.fn(),
187
+ metadata: { namespace: '' }
188
+ },
189
+ mode: 'create',
190
+ forceNamespace: forcedNs,
191
+ },
192
+ global: {
193
+ provide: { store },
194
+ mocks: {
195
+ $store: {
196
+ dispatch: jest.fn(),
197
+ getters: {
198
+ namespaces: jest.fn(),
199
+ 'i18n/t': jest.fn(),
200
+ },
201
+ },
202
+ },
203
+ },
204
+ });
205
+
206
+ expect(typeof (wrapper.vm as any).namespace).toBe('string');
207
+ expect((wrapper.vm as any).namespace).toBe(forcedNs);
208
+ });
209
+
210
+ it('should set metadata.namespace to a plain string when falling back to defaultNamespace', () => {
211
+ const defaultNs = 'default';
212
+ const metadata: Record<string, unknown> = {};
213
+ const store = createStore({
214
+ getters: {
215
+ allowedNamespaces: () => () => ({}),
216
+ currentStore: () => () => 'cluster',
217
+ 'cluster/schemaFor': () => jest.fn(),
218
+ defaultNamespace: () => defaultNs,
219
+ }
220
+ });
221
+
222
+ mount(NameNsDescription, {
223
+ props: {
224
+ value: {
225
+ setAnnotation: jest.fn(),
226
+ metadata,
227
+ },
228
+ mode: 'create',
229
+ },
230
+ global: {
231
+ provide: { store },
232
+ mocks: {
233
+ $store: {
234
+ dispatch: jest.fn(),
235
+ getters: {
236
+ namespaces: jest.fn(),
237
+ 'i18n/t': jest.fn(),
238
+ },
239
+ },
240
+ },
241
+ },
242
+ });
243
+
244
+ expect(typeof metadata.namespace).toBe('string');
245
+ expect(metadata.namespace).toBe(defaultNs);
246
+ });
247
+
173
248
  it('sets the name using the nameKey prop', () => {
174
249
  const namespaceName = 'test';
175
250
  const store = createStore({