@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,4 +1,9 @@
1
1
  <script>
2
+ import { ref, computed, provide } from 'vue';
3
+ import { useStore } from 'vuex';
4
+ import { useForm } from 'vee-validate';
5
+ import { toTypedSchema } from '@vee-validate/zod';
6
+ import * as z from 'zod';
2
7
  import Loading from '@shell/components/Loading';
3
8
  import CreateEditView from '@shell/mixins/create-edit-view';
4
9
  import AuthConfig, { SLO_OPTION_VALUES } from '@shell/mixins/auth-config';
@@ -15,7 +20,7 @@ import { RadioGroup } from '@components/Form/Radio';
15
20
  import { Checkbox } from '@components/Form/Checkbox';
16
21
  import { BASE_SCOPES } from '@shell/store/auth';
17
22
  import CopyToClipboardText from '@shell/components/CopyToClipboardText.vue';
18
- import isUrl from 'is-url';
23
+ import { useI18n } from '@shell/composables/useI18n';
19
24
 
20
25
  const PKCE_S256 = 'S256';
21
26
 
@@ -41,7 +46,94 @@ export default {
41
46
  mixins: [CreateEditView, AuthConfig],
42
47
 
43
48
  setup() {
44
- return { PKCE_S256 };
49
+ const store = useStore();
50
+ const { t } = useI18n(store);
51
+
52
+ // These refs sync mixin-state for the composition api
53
+ const modelId = ref(null);
54
+ const sloTypeRef = ref(null);
55
+ const customEndpointEnabled = ref(false);
56
+
57
+ const requiredScopes = computed(() => {
58
+ const scopes = BASE_SCOPES[modelId.value]?.[0];
59
+
60
+ return scopes ? scopes.split(' ') : [];
61
+ });
62
+ const isAmazonCognito = computed(() => modelId.value === 'cognito');
63
+ const isKeycloak = computed(() => modelId.value === 'keycloakoidc');
64
+ const isGenericOidc = computed(() => modelId.value === 'genericoidc');
65
+ const supportsCustomClaims = computed(() => isKeycloak.value || isGenericOidc.value);
66
+ const supportsGroupSearch = computed(() => modelId.value !== 'cognito');
67
+ const requiresCert = computed(() => modelId.value !== 'cognito');
68
+ const requiresAuthEndpoint = computed(() => ['genericoidc', 'keycloakoidc'].includes(modelId.value));
69
+ const sloEndSessionEndpointUiEnabled = computed(() => [SLO_OPTION_VALUES.all, SLO_OPTION_VALUES.both].includes(sloTypeRef.value));
70
+
71
+ // z.preprocess coerces null/undefined to '' before validation. This
72
+ // prevents the raw "Expected string, received null" zod message.
73
+ const coerce = (schema) => z.preprocess((v) => v ?? '', schema);
74
+ const requiredField = (key) => coerce(z.string().min(1, t('validation.required', { key: t(key) })));
75
+ const requiredUrlField = (key) => coerce(z.string().min(1, t('validation.required', { key: t(key) })).url(t('validation.genericUrl')));
76
+ const optionalField = coerce(z.string());
77
+
78
+ // Reactive schema uses computed to reshape when provider or endpoint mode
79
+ // changes.
80
+ const validationSchema = computed(() => toTypedSchema(
81
+ z.object({
82
+ clientId: requiredField('authConfig.oidc.clientId'),
83
+ clientSecret: requiredField('authConfig.oidc.clientSecret'),
84
+
85
+ url: !customEndpointEnabled.value && !isAmazonCognito.value ? requiredUrlField('authConfig.oidc.url') : optionalField,
86
+ realm: !customEndpointEnabled.value && !isAmazonCognito.value ? requiredField('authConfig.oidc.realm') : optionalField,
87
+
88
+ rancherUrl: customEndpointEnabled.value && !isAmazonCognito.value ? requiredField('authConfig.oidc.rancherUrl') : optionalField,
89
+ issuer: customEndpointEnabled.value || isAmazonCognito.value ? requiredField('authConfig.oidc.issuer') : optionalField,
90
+
91
+ authEndpoint: requiresAuthEndpoint.value ? requiredUrlField('authConfig.oidc.authEndpoint') : optionalField,
92
+
93
+ endSessionEndpoint: sloEndSessionEndpointUiEnabled.value ? requiredUrlField('authConfig.oidc.endSessionEndpoint.title') : optionalField,
94
+
95
+ scope: z.preprocess(
96
+ (v) => (Array.isArray(v) ? v : []),
97
+ z.array(z.string()).refine(
98
+ (arr) => requiredScopes.value?.every((s) => arr.includes(s)),
99
+ (arr) => {
100
+ const missing = requiredScopes.value?.filter((s) => !arr.includes(s));
101
+
102
+ return { message: t('authConfig.oidc.scope.missingRequired', { scopes: missing?.join(', '), count: missing?.length }) };
103
+ }
104
+ )
105
+ ),
106
+ })
107
+ ));
108
+
109
+ const showAllErrors = ref(false);
110
+
111
+ provide('vee-show-all-errors', showAllErrors);
112
+
113
+ const { errors, validate } = useForm({ validationSchema });
114
+ const isFormValid = computed(() => Object.keys(errors.value).length === 0);
115
+
116
+ const validateAllFields = async() => {
117
+ await validate();
118
+ showAllErrors.value = true;
119
+ };
120
+
121
+ return {
122
+ PKCE_S256,
123
+ isFormValid,
124
+ validateAllFields,
125
+ modelId,
126
+ sloTypeRef,
127
+ customEndpointEnabled,
128
+ isAmazonCognito,
129
+ isKeycloak,
130
+ isGenericOidc,
131
+ supportsCustomClaims,
132
+ supportsGroupSearch,
133
+ requiresCert,
134
+ requiresAuthEndpoint,
135
+ sloEndSessionEndpointUiEnabled,
136
+ };
45
137
  },
46
138
 
47
139
  data() {
@@ -92,75 +184,11 @@ export default {
92
184
  },
93
185
 
94
186
  validationPassed() {
95
- if ( this.model.enabled && !this.editConfig ) {
187
+ if ( this.model?.enabled && !this.editConfig ) {
96
188
  return true;
97
189
  }
98
190
 
99
- const { clientId, clientSecret } = this.model;
100
- const isMissingAuthEndpoint = (this.requiresAuthEndpoint && !this.model.authEndpoint);
101
- const isMissingScopes = !this.requiredScopes.every((scope) => this.oidcScope.includes(scope));
102
-
103
- if (isMissingAuthEndpoint || isMissingScopes) {
104
- return false;
105
- }
106
-
107
- // make sure that if SLO options are enabled on radio group, field "endSessionEndpoint" is required
108
- if (this.isLogoutAllSupported && this.sloEndSessionEndpointUiEnabled && (!this.model.endSessionEndpoint || !isUrl(this.model.endSessionEndpoint))) {
109
- return false;
110
- }
111
-
112
- if (this.isAmazonCognito) {
113
- const { issuer } = this.model;
114
-
115
- return !!(clientId && clientSecret && issuer);
116
- } else if ( !this.customEndpoint.value ) {
117
- const { url, realm } = this.oidcUrls;
118
-
119
- return !!(clientId && clientSecret && url && realm);
120
- } else {
121
- const { rancherUrl, issuer } = this.model;
122
-
123
- return !!(clientId && clientSecret && rancherUrl && issuer);
124
- }
125
- },
126
-
127
- requiresAuthEndpoint() {
128
- return ['genericoidc', 'keycloakoidc'].includes(this.model.id);
129
- },
130
-
131
- /**
132
- * TODO #13457: Refactor scopes to be an array of terms
133
- * Return valid scopes
134
- * The scopes for given auth provider (model.id) have format of ['scope1 scope2 scope3']
135
- */
136
- requiredScopes() {
137
- return this.model.id ? (BASE_SCOPES[this.model.id] || []) ? (BASE_SCOPES[this.model.id] || [])[0].split(' ') : [] : [];
138
- },
139
-
140
- requiresCert() {
141
- // We assume all do, apart from the ones here, which do not
142
- return !(['cognito'].includes(this.model.id));
143
- },
144
-
145
- supportsGroupSearch() {
146
- // We assume all do, apart from the ones here, which do not
147
- return !(['cognito'].includes(this.model.id));
148
- },
149
-
150
- isAmazonCognito() {
151
- return this.model?.id === 'cognito';
152
- },
153
-
154
- isGenericOidc() {
155
- return this.model?.id === 'genericoidc';
156
- },
157
-
158
- isKeycloak() {
159
- return this.model?.id === 'keycloakoidc';
160
- },
161
-
162
- supportsCustomClaims() {
163
- return this.isGenericOidc || this.isKeycloak;
191
+ return this.isFormValid;
164
192
  },
165
193
 
166
194
  isLogoutAllSupported() {
@@ -180,17 +208,24 @@ export default {
180
208
 
181
209
  return sloOptionSelected?.label || '';
182
210
  },
183
-
184
- sloEndSessionEndpointUiEnabled() {
185
- return this.sloType === SLO_OPTION_VALUES.all || this.sloType === SLO_OPTION_VALUES.both;
186
- },
187
211
  },
188
212
 
189
213
  watch: {
190
- fvFormIsValid(newValue) {
214
+ validationPassed(newValue) {
191
215
  this.$emit('validationChanged', !!newValue);
192
216
  },
193
217
 
218
+ 'model.id': {
219
+ handler(newVal) {
220
+ this.modelId = newVal;
221
+ },
222
+ immediate: true,
223
+ },
224
+
225
+ 'customEndpoint.value'(v) {
226
+ this.customEndpointEnabled = v;
227
+ },
228
+
194
229
  'oidcUrls.url'() {
195
230
  this.updateEndpoints();
196
231
  },
@@ -228,6 +263,7 @@ export default {
228
263
 
229
264
  // sloType is defined on shell/mixins/auth-config.js
230
265
  sloType(neu) {
266
+ this.sloTypeRef = neu;
231
267
  switch (neu) {
232
268
  case SLO_OPTION_VALUES.rancher:
233
269
  this.model.logoutAllEnabled = false;
@@ -379,6 +415,7 @@ export default {
379
415
  <div class="col span-6">
380
416
  <LabeledInput
381
417
  v-model:value="model.clientId"
418
+ name="clientId"
382
419
  :label="t(`authConfig.oidc.clientId`)"
383
420
  :mode="mode"
384
421
  required
@@ -388,6 +425,7 @@ export default {
388
425
  <div class="col span-6">
389
426
  <LabeledInput
390
427
  v-model:value="model.clientSecret"
428
+ name="clientSecret"
391
429
  :label="t(`authConfig.oidc.clientSecret`)"
392
430
  :mode="mode"
393
431
  required
@@ -528,6 +566,7 @@ export default {
528
566
  <div class="col span-6">
529
567
  <LabeledInput
530
568
  v-model:value="oidcUrls.url"
569
+ name="url"
531
570
  :label="t(`authConfig.oidc.url`)"
532
571
  :mode="mode"
533
572
  :required="!customEndpoint.value"
@@ -538,6 +577,7 @@ export default {
538
577
  <div class="col span-6">
539
578
  <LabeledInput
540
579
  v-model:value="oidcUrls.realm"
580
+ name="realm"
541
581
  :label="t(`authConfig.oidc.realm`)"
542
582
  :mode="mode"
543
583
  :required="!customEndpoint.value"
@@ -552,6 +592,7 @@ export default {
552
592
  <div class="col span-6">
553
593
  <LabeledInput
554
594
  v-model:value="model.rancherUrl"
595
+ name="rancherUrl"
555
596
  :label="t(`authConfig.oidc.rancherUrl`)"
556
597
  :mode="mode"
557
598
  required
@@ -565,6 +606,7 @@ export default {
565
606
  <div class="col span-6">
566
607
  <LabeledInput
567
608
  v-model:value="model.issuer"
609
+ name="issuer"
568
610
  :label="t(`authConfig.oidc.issuer`)"
569
611
  :mode="mode"
570
612
  required
@@ -575,6 +617,7 @@ export default {
575
617
  <div class="col span-6">
576
618
  <LabeledInput
577
619
  v-model:value="model.authEndpoint"
620
+ name="authEndpoint"
578
621
  :label="t(`authConfig.oidc.authEndpoint`)"
579
622
  :mode="mode"
580
623
  :disabled="!customEndpoint.value"
@@ -635,6 +678,7 @@ export default {
635
678
  <div class="col span-6">
636
679
  <LabeledInput
637
680
  v-model:value="model.issuer"
681
+ name="issuer"
638
682
  :label="t(`authConfig.oidc.issuer`)"
639
683
  :mode="mode"
640
684
  required
@@ -649,6 +693,7 @@ export default {
649
693
  <div class="col span-6">
650
694
  <ArrayList
651
695
  v-model:value="oidcScope"
696
+ name="scope"
652
697
  :mode="mode"
653
698
  :title="t('authConfig.oidc.scope.label')"
654
699
  :value-placeholder="t('authConfig.oidc.scope.placeholder')"
@@ -686,6 +731,7 @@ export default {
686
731
  <div class="col span-6">
687
732
  <LabeledInput
688
733
  v-model:value="model.endSessionEndpoint"
734
+ name="endSessionEndpoint"
689
735
  :tooltip="t('authConfig.oidc.endSessionEndpoint.tooltip')"
690
736
  :label="t('authConfig.oidc.endSessionEndpoint.title')"
691
737
  :mode="mode"
@@ -1,4 +1,9 @@
1
1
  <script>
2
+ import { ref, computed, provide } from 'vue';
3
+ import { useStore } from 'vuex';
4
+ import { useForm } from 'vee-validate';
5
+ import { toTypedSchema } from '@vee-validate/zod';
6
+ import * as z from 'zod';
2
7
  import Loading from '@shell/components/Loading';
3
8
  import CreateEditView from '@shell/mixins/create-edit-view';
4
9
  import AuthConfig, { SLO_OPTION_VALUES } from '@shell/mixins/auth-config';
@@ -12,6 +17,8 @@ import AuthBanner from '@shell/components/auth/AuthBanner';
12
17
  import config, { OKTA, SHIBBOLETH } from '@shell/edit/auth/ldap/config';
13
18
  import AuthProviderWarningBanners from '@shell/edit/auth/AuthProviderWarningBanners';
14
19
  import RadioGroup from '@components/Form/Radio/RadioGroup.vue';
20
+ import { RcButton } from '@components/RcButton';
21
+ import { useI18n } from '@shell/composables/useI18n';
15
22
 
16
23
  // Standard LDAP defaults
17
24
  const LDAP_DEFAULTS = {
@@ -47,10 +54,48 @@ export default {
47
54
  FileSelector,
48
55
  config,
49
56
  AuthBanner,
50
- AuthProviderWarningBanners
57
+ AuthProviderWarningBanners,
58
+ RcButton,
51
59
  },
52
60
 
53
61
  mixins: [CreateEditView, AuthConfig],
62
+
63
+ setup() {
64
+ const store = useStore();
65
+ const { t } = useI18n(store);
66
+
67
+ const coerce = (schema) => z.preprocess((v) => v ?? '', schema);
68
+ const requiredField = (key) => coerce(z.string().min(1, t('validation.required', { key: t(key) })));
69
+ const requiredUrlField = (key) => coerce(z.string().min(1, t('validation.required', { key: t(key) })).url(t('validation.genericUrl')));
70
+
71
+ const validationSchema = computed(() => toTypedSchema(
72
+ z.object({
73
+ displayNameField: requiredField('authConfig.saml.displayName'),
74
+ userNameField: requiredField('authConfig.saml.userName'),
75
+ uidField: requiredField('authConfig.saml.UID'),
76
+ groupsField: requiredField('authConfig.saml.groups'),
77
+ rancherApiHost: requiredUrlField('authConfig.saml.api'),
78
+ spKey: requiredField('authConfig.saml.key.label'),
79
+ spCert: requiredField('authConfig.saml.cert.label'),
80
+ idpMetadataContent: requiredField('authConfig.saml.metadata.label'),
81
+ })
82
+ ));
83
+
84
+ const showAllErrors = ref(false);
85
+
86
+ provide('vee-show-all-errors', showAllErrors);
87
+
88
+ const { errors, validate } = useForm({ validationSchema });
89
+ const isFormValid = computed(() => Object.keys(errors.value).length === 0);
90
+
91
+ const validateAllFields = async() => {
92
+ await validate();
93
+ showAllErrors.value = true;
94
+ };
95
+
96
+ return { isFormValid, validateAllFields };
97
+ },
98
+
54
99
  data() {
55
100
  return {
56
101
  showLdap: false,
@@ -58,7 +103,19 @@ export default {
58
103
  };
59
104
  },
60
105
 
106
+ created() {
107
+ this.registerBeforeHook(this.validateAllFields, 'willSave');
108
+ },
109
+
61
110
  computed: {
111
+ validationPassed() {
112
+ if (this.model?.enabled && !this.editConfig) {
113
+ return true;
114
+ }
115
+
116
+ return this.isFormValid;
117
+ },
118
+
62
119
  tArgs() {
63
120
  return {
64
121
  baseUrl: this.serverSetting,
@@ -152,7 +209,7 @@ export default {
152
209
  :mode="mode"
153
210
  :resource="model"
154
211
  :subtypes="[]"
155
- :validation-passed="true"
212
+ :validation-passed="validationPassed"
156
213
  :finish-button-mode="model.enabled ? 'edit' : 'enable'"
157
214
  :can-yaml="false"
158
215
  :errors="errors"
@@ -193,13 +250,17 @@ export default {
193
250
  >
194
251
  <div>{{ t('authConfig.saml.search.on') }}</div>
195
252
  <div>
196
- <a
197
- class="toggle-btn"
253
+ <rc-button
254
+ variant="link"
198
255
  @click="showLdapDetails = !showLdapDetails"
199
256
  >
200
- <template v-if="showLdapDetails">{{ t('authConfig.saml.search.hide') }}</template>
201
- <template v-else>{{ t('authConfig.saml.search.show') }}</template>
202
- </a>
257
+ <template v-if="showLdapDetails">
258
+ {{ t('authConfig.saml.search.hide') }}
259
+ </template>
260
+ <template v-else>
261
+ {{ t('authConfig.saml.search.show') }}
262
+ </template>
263
+ </rc-button>
203
264
  </div>
204
265
  </div>
205
266
  </Banner>
@@ -244,6 +305,7 @@ export default {
244
305
  <div class="col span-6">
245
306
  <LabeledInput
246
307
  v-model:value="model.displayNameField"
308
+ name="displayNameField"
247
309
  :label="t(`authConfig.saml.displayName`)"
248
310
  :mode="mode"
249
311
  required
@@ -252,6 +314,7 @@ export default {
252
314
  <div class="col span-6">
253
315
  <LabeledInput
254
316
  v-model:value="model.userNameField"
317
+ name="userNameField"
255
318
  :label="t(`authConfig.saml.userName`)"
256
319
  :mode="mode"
257
320
  required
@@ -263,6 +326,7 @@ export default {
263
326
  <div class="col span-6">
264
327
  <LabeledInput
265
328
  v-model:value="model.uidField"
329
+ name="uidField"
266
330
  :label="t(`authConfig.saml.UID`)"
267
331
  :mode="mode"
268
332
  required
@@ -271,6 +335,7 @@ export default {
271
335
  <div class="col span-6">
272
336
  <LabeledInput
273
337
  v-model:value="model.groupsField"
338
+ name="groupsField"
274
339
  :label="t(`authConfig.saml.groups`)"
275
340
  :mode="mode"
276
341
  required
@@ -292,6 +357,7 @@ export default {
292
357
  <div class="col span-6">
293
358
  <LabeledInput
294
359
  v-model:value="model.rancherApiHost"
360
+ name="rancherApiHost"
295
361
  :label="t(`authConfig.saml.api`)"
296
362
  :mode="mode"
297
363
  required
@@ -303,6 +369,7 @@ export default {
303
369
  <div class="col span-4">
304
370
  <LabeledInput
305
371
  v-model:value="model.spKey"
372
+ name="spKey"
306
373
  :label="t(`authConfig.saml.key.label`)"
307
374
  :placeholder="t(`authConfig.saml.key.placeholder`)"
308
375
  :mode="mode"
@@ -319,6 +386,7 @@ export default {
319
386
  <div class="col span-4">
320
387
  <LabeledInput
321
388
  v-model:value="model.spCert"
389
+ name="spCert"
322
390
  :label="t(`authConfig.saml.cert.label`)"
323
391
  :placeholder="t(`authConfig.saml.cert.placeholder`)"
324
392
  :mode="mode"
@@ -335,6 +403,7 @@ export default {
335
403
  <div class="col span-4">
336
404
  <LabeledInput
337
405
  v-model:value="model.idpMetadataContent"
406
+ name="idpMetadataContent"
338
407
  :label="t(`authConfig.saml.metadata.label`)"
339
408
  :placeholder="t(`authConfig.saml.metadata.placeholder`)"
340
409
  :mode="mode"
@@ -423,10 +492,5 @@ export default {
423
492
  > :first-child {
424
493
  flex: 1;
425
494
  }
426
-
427
- .toggle-btn {
428
- cursor: pointer;
429
- user-select: none;
430
- }
431
495
  }
432
496
  </style>