@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,5 +1,6 @@
1
1
  <script>
2
2
  import isEmpty from 'lodash/isEmpty';
3
+ import throttle from 'lodash/throttle';
3
4
  import { createYamlWithOptions } from '@shell/utils/create-yaml';
4
5
  import { clone, get } from '@shell/utils/object';
5
6
  import { SCHEMA, NAMESPACE } from '@shell/config/types';
@@ -11,6 +12,10 @@ import { stringify, exceptionToErrorsArray } from '@shell/utils/error';
11
12
  import CruResourceFooter from '@shell/components/CruResourceFooter';
12
13
  import { useResourceCreatePageProvider, useResourceEditPageProvider } from '@shell/composables/cruResource';
13
14
 
15
+ import { useFormSummary } from '@shell/components/TableOfContents/composables';
16
+ import { useTemplateRef } from 'vue';
17
+ import TableOfContents from '@shell/components/TableOfContents/TableOfContents.vue';
18
+
14
19
  import {
15
20
  _EDIT, _VIEW, AS, _YAML, _UNFLAG, SUB_TYPE, _CREATE
16
21
  } from '@shell/config/query-params';
@@ -31,7 +36,8 @@ export default {
31
36
  Banner,
32
37
  CruResourceFooter,
33
38
  ResourceYaml,
34
- Wizard
39
+ Wizard,
40
+ TableOfContents
35
41
  },
36
42
 
37
43
  props: {
@@ -162,9 +168,22 @@ export default {
162
168
  yamlModifiers: {
163
169
  type: Object,
164
170
  default: undefined
171
+ },
172
+
173
+ showToc: {
174
+ type: Boolean,
175
+ default: false
165
176
  }
166
177
  },
167
178
 
179
+ setup() {
180
+ const cruFormRef = useTemplateRef('cru-form');
181
+ const { locatedComponents } = useFormSummary(cruFormRef);
182
+ const accordions = locatedComponents;
183
+
184
+ return { accordions };
185
+ },
186
+
168
187
  data(props) {
169
188
  const inStore = this.$store.getters['currentStore'](this.resource);
170
189
  const schema = this.$store.getters[`${ inStore }/schemaFor`](this.resource.type);
@@ -176,27 +195,30 @@ export default {
176
195
  }
177
196
 
178
197
  return {
179
- isCancelModal: false,
180
- showAsForm: this.$route.query[AS] !== _YAML,
198
+ isCancelModal: false,
199
+ showAsForm: this.$route.query[AS] !== _YAML,
200
+ tocContainerHeight: 0,
201
+ mainLayoutEl: null,
202
+ throttledComputeTocContainerHeight: null,
181
203
  /**
182
204
  * Initialised on demand (given that it needs to make a request to fetch schema definition)
183
205
  */
184
- resourceYaml: null,
206
+ resourceYaml: null,
185
207
  /**
186
208
  * Initialised on demand (given that it needs to make a request to fetch schema definition)
187
209
  */
188
- initialYaml: null,
210
+ initialYaml: null,
189
211
  /**
190
212
  * Save a copy of the initial resource. This is used to calc the initial yaml later on
191
213
  */
192
- initialResource: clone(this.resource),
193
- abbrSizes: {
214
+ initialResource: clone(this.resource),
215
+ abbrSizes: {
194
216
  3: '24px',
195
217
  4: '18px',
196
218
  5: '16px',
197
219
  6: '14px'
198
220
  },
199
- schema
221
+ schema,
200
222
  };
201
223
  },
202
224
 
@@ -276,10 +298,11 @@ export default {
276
298
  icon: null
277
299
  }
278
300
  }), {});
279
- },
301
+ }
280
302
  },
281
303
 
282
304
  created() {
305
+ this.throttledComputeTocContainerHeight = throttle(this.computeTocContainerHeight, 20);
283
306
  if ( this._selectedSubtype ) {
284
307
  this.$emit('select-type', this._selectedSubtype);
285
308
  }
@@ -290,12 +313,42 @@ export default {
290
313
  },
291
314
 
292
315
  beforeUnmount() {
316
+ this.mainLayoutEl?.removeEventListener('scroll', this.throttledComputeTocContainerHeight);
317
+ window.removeEventListener('resize', this.throttledComputeTocContainerHeight);
318
+ this.throttledComputeTocContainerHeight?.cancel?.();
293
319
  this.$store.dispatch('cru-resource/setCreateNamespace', false);
294
320
  },
295
321
 
296
322
  methods: {
297
323
  stringify,
298
324
 
325
+ // as the user scrolls past the CruResource Masthead, the amount of vertical space available to the table of contents changes
326
+ computeTocContainerHeight() {
327
+ const root = this.$el;
328
+
329
+ if (!root) {
330
+ this.tocContainerHeight = 0;
331
+
332
+ return 0;
333
+ }
334
+
335
+ const tocEl = root.querySelector('.cru__toc');
336
+ const footerEl = root.querySelector('.cru__footer');
337
+
338
+ if (!tocEl || !footerEl) {
339
+ this.tocContainerHeight = 0;
340
+
341
+ return 0;
342
+ }
343
+
344
+ const tocTop = tocEl.getBoundingClientRect().top;
345
+ const footerTop = footerEl.getBoundingClientRect().top;
346
+ const gapLgValue = getComputedStyle(root).getPropertyValue('--gap-lg').trim();
347
+ const gapLg = Number.parseFloat(gapLgValue) || 0;
348
+
349
+ this.tocContainerHeight = Math.max(0, Math.round((footerTop - tocTop) - gapLg));
350
+ },
351
+
299
352
  confirmCancel(isCancelNotBack = true) {
300
353
  if (isCancelNotBack) {
301
354
  this.emitOrRoute();
@@ -532,13 +585,38 @@ export default {
532
585
  this.initialYaml = await this.createResourceYaml(undefined, this.initialResource);
533
586
  }
534
587
  }
588
+ },
589
+
590
+ showToc: {
591
+ handler(neu, old) {
592
+ if (neu) {
593
+ // Compute height on first render
594
+ this.$nextTick(() => {
595
+ this.throttledComputeTocContainerHeight?.();
596
+ });
597
+ // Add event listeners for computeTocContainerHeight on scroll
598
+ this.mainLayoutEl = document.querySelector('.main-layout');
599
+ this.mainLayoutEl?.addEventListener('scroll', this.throttledComputeTocContainerHeight, { passive: true });
600
+ // Add event listener for computeTocContainerHeight on window resize
601
+ window.addEventListener('resize', this.throttledComputeTocContainerHeight, { passive: true });
602
+ } else if (old) {
603
+ // Remove event listeners for computeTocContainerHeight when TOC is hidden
604
+ this.mainLayoutEl?.removeEventListener('scroll', this.throttledComputeTocContainerHeight);
605
+ window.removeEventListener('resize', this.throttledComputeTocContainerHeight);
606
+ }
607
+ },
608
+ immediate: true
535
609
  }
536
610
  }
537
611
  };
538
612
  </script>
539
613
 
540
614
  <template>
541
- <section class="cru">
615
+ <section
616
+ ref="cru-form"
617
+ :class="{'show-toc':showToc}"
618
+ class="cru"
619
+ >
542
620
  <slot name="noticeBanner" />
543
621
  <p
544
622
  v-if="description"
@@ -548,6 +626,7 @@ export default {
548
626
  </p>
549
627
  <component
550
628
  :is="(isView? 'div' : 'form')"
629
+
551
630
  :value="resource"
552
631
  data-testid="cru-form"
553
632
  class="create-resource-container cru__form"
@@ -771,15 +850,23 @@ export default {
771
850
  </template>
772
851
  <!------ SINGLE PROCESS ------>
773
852
  <template v-else-if="showAsForm">
853
+ <TableOfContents
854
+ v-if="showToc"
855
+ class="cru__toc"
856
+ :style="tocContainerHeight ? { '--toc-container-height': `${tocContainerHeight}px` } : {}"
857
+ :accordions="accordions"
858
+ />
774
859
  <div
775
860
  v-if="_selectedSubtype || !subtypes.length"
776
- class="resource-container cru__content"
861
+ class="cru__content resource-container"
862
+
777
863
  :style="[minHeight ? { 'min-height': minHeight } : {}]"
778
864
  >
779
865
  <slot name="single">
780
866
  <slot />
781
867
  </slot>
782
868
  </div>
869
+
783
870
  <slot name="form-footer">
784
871
  <CruResourceFooter
785
872
  v-if="!isView"
@@ -912,6 +999,11 @@ export default {
912
999
  </template>
913
1000
 
914
1001
  <style lang='scss' scoped>
1002
+ $logo: 60px;
1003
+ $logo-space: 100px;
1004
+
1005
+ $table-contents-width: 250px;
1006
+
915
1007
  .cru-resource-yaml-container {
916
1008
  .resource-yaml {
917
1009
  .yaml-editor {
@@ -937,9 +1029,6 @@ export default {
937
1029
  }
938
1030
  }
939
1031
 
940
- $logo: 60px;
941
- $logo-space: 100px;
942
-
943
1032
  .title {
944
1033
  margin-top: 20px;
945
1034
 
@@ -992,10 +1081,26 @@ form.create-resource-container .cru {
992
1081
  display: flex;
993
1082
  flex-direction: column;
994
1083
  flex-grow: 1;
1084
+
1085
+ }
1086
+
1087
+ &__toc {
1088
+ width: $table-contents-width;
1089
+ margin: 20px var(--gap-lg) 20px var(--gap-lg);
1090
+ min-width: $table-contents-width;
1091
+ max-width: $table-contents-width;
1092
+ position: sticky;
1093
+ top: 24px;
1094
+ align-self: flex-start;
1095
+ max-height: var(--toc-container-height, calc(100vh - 24px - $footer-height - calc( 2 * var(--gap-lg)) - 125px));
1096
+ transition: max-height 50ms ease-in-out;
1097
+ overflow-y: auto;
1098
+ overflow-x: hidden;
995
1099
  }
996
1100
 
997
1101
  &__content {
998
1102
  flex-grow: 1;
1103
+
999
1104
  &-wizard {
1000
1105
  display: flex;
1001
1106
  }
@@ -1025,6 +1130,48 @@ form.create-resource-container .cru {
1025
1130
  }
1026
1131
  }
1027
1132
 
1133
+ .show-toc.cru{
1134
+ &>.cru__form{
1135
+ display: grid;
1136
+ grid-template-columns: [content] 1fr [toc] calc(#{$table-contents-width} + var(--gap-lg));
1137
+ grid-template-rows: [errors] auto [content] 1fr [footer] min-content;
1138
+
1139
+ &>.cru__errors {
1140
+ grid-column: content;
1141
+ grid-row: errors;
1142
+ }
1143
+
1144
+ &>.cru__toc {
1145
+ grid-column: toc;
1146
+ grid-row: errors / footer;
1147
+ }
1148
+
1149
+ &>.cru__content {
1150
+ grid-column: content;
1151
+ grid-row: content;
1152
+ }
1153
+
1154
+ &>.cru__footer {
1155
+ grid-column: content / 3;
1156
+ grid-row: footer;
1157
+ }
1158
+ }
1159
+ }
1160
+
1161
+ @media (max-width: map-get($breakpoints, '--viewport-9')) {
1162
+ .show-toc.cru {
1163
+ & > .cru__form {
1164
+ display: flex;
1165
+ grid-template-columns: none;
1166
+ grid-template-rows: none;
1167
+
1168
+ & > .cru__toc {
1169
+ display: none;
1170
+ }
1171
+ }
1172
+ }
1173
+ }
1174
+
1028
1175
  .description {
1029
1176
  margin-bottom: 15px;
1030
1177
  margin-top: 5px;
@@ -3,13 +3,16 @@ import { mapGetters } from 'vuex';
3
3
 
4
4
  import AsyncButton from '@shell/components/AsyncButton';
5
5
  import ResourceCancelModal from '@shell/components/ResourceCancelModal';
6
+ import { RcButton } from '@components/RcButton';
6
7
  import { _VIEW } from '@shell/config/query-params';
7
8
 
8
9
  export default {
9
10
  emits: ['cancel-confirmed', 'finish'],
10
11
 
11
- components: { AsyncButton, ResourceCancelModal },
12
- props: {
12
+ components: {
13
+ AsyncButton, RcButton, ResourceCancelModal
14
+ },
15
+ props: {
13
16
  mode: {
14
17
  type: String,
15
18
  default: 'create',
@@ -84,16 +87,17 @@ export default {
84
87
  <div class="cru-resource-footer">
85
88
  <slot name="footer-prefix" />
86
89
  <slot name="cancel">
87
- <button
90
+ <RcButton
88
91
  v-if="!isView && showCancel"
89
92
  id="cru-cancel"
90
93
  :data-testid="componentTestid + '-cancel'"
91
94
  type="button"
92
- class="btn role-secondary"
95
+ variant="secondary"
96
+ size="large"
93
97
  @click="confirmCancelRequired ? checkCancel(true) : $emit('cancel-confirmed', true)"
94
98
  >
95
99
  <t k="generic.cancel" />
96
- </button>
100
+ </RcButton>
97
101
  </slot>
98
102
  <slot :checkCancel="checkCancel">
99
103
  <AsyncButton
@@ -12,6 +12,7 @@ import { mapGetters } from 'vuex';
12
12
  import { canViewProjectMembershipEditor } from '@shell/components/form/Members/ProjectMembershipEditor.vue';
13
13
  import { allHash } from '@shell/utils/promise';
14
14
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
15
+ import { RcButton } from '@components/RcButton';
15
16
 
16
17
  /**
17
18
  * Explorer members page.
@@ -26,7 +27,8 @@ export default {
26
27
  ResourceTable,
27
28
  Tabbed,
28
29
  Tab,
29
- SortableTable
30
+ SortableTable,
31
+ RcButton,
30
32
  },
31
33
 
32
34
  props: {
@@ -308,12 +310,14 @@ export default {
308
310
  v-if="canEditClusterMembers"
309
311
  class="row mb-10 cluster-add"
310
312
  >
311
- <router-link
313
+ <rc-button
314
+ size="large"
315
+ class="pull-right"
316
+ data-testid="button-cluster-member-add"
312
317
  :to="createLocation"
313
- class="btn role-primary pull-right"
314
318
  >
315
319
  {{ t('members.createActionLabel') }}
316
- </router-link>
320
+ </rc-button>
317
321
  </div>
318
322
  <ResourceTable
319
323
  :schema="schema"
@@ -20,6 +20,7 @@ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
20
20
  import perfSettingsUtils from '@shell/utils/perf-setting.utils';
21
21
  import ActionMenu from '@shell/components/ActionMenuShell.vue';
22
22
  import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
23
+ import { RcButton } from '@components/RcButton';
23
24
 
24
25
  export default {
25
26
  name: 'ListProjectNamespace',
@@ -29,6 +30,7 @@ export default {
29
30
  ResourceTable,
30
31
  ButtonMultiAction,
31
32
  ActionMenu,
33
+ RcButton
32
34
  },
33
35
  mixins: [ResourceFetch],
34
36
 
@@ -295,7 +297,7 @@ export default {
295
297
  return this.$store.getters['i18n/t']('resourceTable.groupLabel.notInAProject');
296
298
  },
297
299
  showCreateNsButton() {
298
- return this.groupPreference !== 'namespace';
300
+ return this.groupPreference !== 'namespace' && this.isNamespaceCreatable;
299
301
  },
300
302
  projectGroupBy() {
301
303
  return this.groupPreference === 'none' ? null : 'groupById';
@@ -445,13 +447,14 @@ export default {
445
447
  v-if="showCreateNsButton"
446
448
  #extraActions
447
449
  >
448
- <router-link
450
+ <rc-button
451
+ size="large"
452
+ class="mr-10"
449
453
  :to="createNamespaceLocationFlatList()"
450
- class="btn role-primary mr-10"
451
454
  data-testid="create_project_namespaces"
452
455
  >
453
456
  {{ t('projectNamespaces.createNamespace') }}
454
- </router-link>
457
+ </rc-button>
455
458
  </template>
456
459
  </Masthead>
457
460
  <!-- Extensions area -->
@@ -495,13 +498,14 @@ export default {
495
498
  </div>
496
499
  </div>
497
500
  <div class="right mr-10">
498
- <router-link
501
+ <rc-button
499
502
  v-if="isNamespaceCreatable && (canSeeProjectlessNamespaces || group.group.key !== notInProjectKey)"
500
- class="create-namespace btn btn-sm role-secondary mr-5"
503
+ variant="secondary"
504
+ class="mr-5"
501
505
  :to="createNamespaceLocation(group.group)"
502
506
  >
503
507
  {{ t('projectNamespaces.createNamespace') }}
504
- </router-link>
508
+ </rc-button>
505
509
  <template v-if="featureDropdownMenu">
506
510
  <ActionMenu
507
511
  v-if="showProjectActionButton(group.group)"
@@ -204,6 +204,10 @@ export default {
204
204
  > P {
205
205
  padding-top: 2px;
206
206
 
207
+ // Limit size of message and scroll just the message, not the entire growl, so that the title and icon are always visible
208
+ max-height: 200px;
209
+ overflow-y: scroll;
210
+
207
211
  &.has-title {
208
212
  margin-top: 5px;
209
213
  }
@@ -248,7 +248,7 @@ export default {
248
248
 
249
249
  };
250
250
 
251
- this.installCmd.namespace = this.targetNamespace || this.chart?.targetNamespace || 'default';
251
+ this.installCmd.namespace = this.targetNamespace || this.versionInfo?.chart?.annotations?.[CATALOG_ANNOTATIONS.NAMESPACE] || this.chart?.targetNamespace || 'default';
252
252
  }
253
253
  },
254
254
 
@@ -360,7 +360,7 @@ export default {
360
360
  this.canInstallChart = false;
361
361
  } else {
362
362
  try {
363
- const app = await this.$store.dispatch(`${ this.store }/find`, { type: CATALOG.APP, id: `${ this.targetNamespace || this.chart?.targetNamespace || 'default' }/${ this.chartName }` });
363
+ const app = await this.$store.dispatch(`${ this.store }/find`, { type: CATALOG.APP, id: `${ this.targetNamespace || this.versionInfo?.chart?.annotations?.[CATALOG_ANNOTATIONS.NAMESPACE] || this.chart?.targetNamespace || 'default' }/${ this.chartName }` });
364
364
 
365
365
  if (app) {
366
366
  this.installedVersion = app?.spec?.chart?.metadata?.appVersion;
@@ -14,10 +14,6 @@ export default {
14
14
  Select,
15
15
  },
16
16
 
17
- async fetch() {
18
- this.clusters = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER });
19
- },
20
-
21
17
  data() {
22
18
  // Store the route as it was on page load (before the user may have changed it)
23
19
  const customRoute = this.$store.getters['prefs/get'](AFTER_LOGIN_ROUTE);
@@ -90,13 +86,25 @@ export default {
90
86
  },
91
87
 
92
88
  methods: {
93
- updateLoginRoute(neu) {
89
+ async updateLoginRoute(neu) {
94
90
  if (neu) {
95
91
  this.afterLoginRoute = neu;
96
92
  } else {
93
+ this.clusters = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER });
97
94
  this.afterLoginRoute = this.routeFromDropdown?.value || this.routeDropdownOptions[0]?.value;
98
95
  }
99
96
  },
97
+ },
98
+
99
+ watch: {
100
+ afterLoginRoute: {
101
+ async handler(neu) {
102
+ if (typeof neu === 'object') {
103
+ this.clusters = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER });
104
+ }
105
+ },
106
+ immediate: true
107
+ },
100
108
  }
101
109
  };
102
110
  </script>
@@ -129,6 +137,7 @@ export default {
129
137
  />
130
138
  <Select
131
139
  v-model:value="routeFromDropdown"
140
+ :loading="clusters.length < 1"
132
141
  :aria-label="t('landing.landingPrefs.ariaLabelTakeMeToCluster')"
133
142
  :searchable="true"
134
143
  :disabled="afterLoginRoute === 'home' || afterLoginRoute === 'last-visited'"