@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
@@ -66,6 +66,7 @@ export default {
66
66
  kubeVersion: null,
67
67
  activeTab: '',
68
68
  installing: {},
69
+ installedFromRepo: {},
69
70
  errors: {},
70
71
  plugins: [], // The installed plugins
71
72
  helmOps: [], // Helm operations
@@ -256,224 +257,51 @@ export default {
256
257
  },
257
258
 
258
259
  available() {
259
- let all = this.charts.filter((c) => isUIPlugin(c));
260
+ let all = this.charts
261
+ .filter((c) => isUIPlugin(c))
262
+ .filter((c) => !uiPluginHasAnnotation(c, CATALOG_ANNOTATIONS.HIDDEN, 'true'))
263
+ .map((chart) => this.mapChartToPluginItem(chart))
264
+ .filter((c) => c.versions.length > 0);
260
265
 
261
- // Filter out hidden charts
262
- all = all.filter((c) => !uiPluginHasAnnotation(c, CATALOG_ANNOTATIONS.HIDDEN, 'true'));
263
-
264
- all = all.map((chart) => {
265
- // Label can be overridden by chart annotation
266
- const label = uiPluginAnnotation(chart, UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME) || chart.chartNameDisplay;
267
- const item = {
268
- name: chart.chartName,
269
- label,
270
- description: chart.chartDescription,
271
- id: chart.id,
272
- versions: [],
273
- installed: false,
274
- builtin: false,
275
- };
276
-
277
- item.versions = [...chart.versions];
278
- item.chart = chart;
279
- item.incompatibilityMessage = '';
280
-
281
- // Filter the versions available to install (plugins-api version and current dashboard version)
282
- item.installableVersions = item.versions.filter((version) => isSupportedChartVersion({
283
- version, rancherVersion: this.rancherVersion, kubeVersion: this.kubeVersion
284
- }));
285
-
286
- // add prop to version object if version is compatible with the current dashboard version
287
- item.versions = item.versions.map((version) => isSupportedChartVersion({
288
- version, rancherVersion: this.rancherVersion, kubeVersion: this.kubeVersion
289
- }, true));
290
-
291
- const latestCompatible = item.installableVersions?.[0];
292
- const latestNotCompatible = item.versions.find((version) => !version.isVersionCompatible);
293
-
294
- if (latestCompatible) {
295
- item.primeOnly = latestCompatible?.annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true';
296
- item.experimental = latestCompatible?.annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL] === 'true';
297
- item.certified = latestCompatible?.annotations?.[CATALOG_ANNOTATIONS.CERTIFIED] === CATALOG_ANNOTATIONS._RANCHER;
298
-
299
- item.displayVersion = latestCompatible.version;
300
- item.displayVersionLabel = getPluginChartVersionLabel(latestCompatible);
301
- item.icon = latestCompatible.icon;
302
- item.created = latestCompatible.created;
303
- } else {
304
- item.primeOnly = uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.PRIME_ONLY, 'true');
305
- item.experimental = uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.EXPERIMENTAL, 'true');
306
- item.certified = uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.CERTIFIED, CATALOG_ANNOTATIONS._RANCHER);
307
-
308
- item.displayVersion = item.versions?.[0]?.version;
309
- item.displayVersionLabel = getPluginChartVersionLabel(item.versions?.[0]);
310
- item.icon = chart.icon || latestCompatible?.annotations?.['catalog.cattle.io/ui-icon'];
311
- item.created = item.versions?.[0]?.created;
312
- }
313
-
314
- // add message of extension card if there's a newer version of the extension, but it's not available to be installed
315
- if (latestNotCompatible && item.installableVersions.length && isChartVersionHigher(latestNotCompatible.version, item.installableVersions?.[0].version)) {
316
- switch (latestNotCompatible.versionIncompatibilityData?.type) {
317
- case EXTENSIONS_INCOMPATIBILITY_TYPES.HOST:
318
- item.incompatibilityMessage = this.t(latestNotCompatible.versionIncompatibilityData?.cardMessageKey, {
319
- version: latestNotCompatible.version, required: latestNotCompatible.versionIncompatibilityData?.required, mainHost: latestNotCompatible.versionIncompatibilityData?.mainHost
320
- }, true);
321
- break;
322
- default:
323
- item.incompatibilityMessage = this.t(latestNotCompatible.versionIncompatibilityData?.cardMessageKey, {
324
- version: latestNotCompatible.version,
325
- required: latestNotCompatible.versionIncompatibilityData?.required
326
- }, true);
327
- break;
328
- }
329
- }
330
-
331
- if (this.installing[item.id]) {
332
- item.installing = this.installing[item.id];
333
- }
334
-
335
- return item;
336
- });
337
-
338
- // Remove charts with no installable versions
339
- all = all.filter((c) => c.versions.length > 0);
340
-
341
- // Check that all of the loaded plugins are represented
342
266
  this.uiplugins.forEach((p) => {
343
- const chart = all.find((c) => c.name === p.name);
344
-
345
- if (!chart) {
346
- // A plugin is loaded, but there is no chart, so add an item so that it shows up
347
- const rancher = typeof p.metadata?.rancher === 'object' ? p.metadata.rancher : {};
348
-
349
- const label = rancher.annotations?.[UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME] || p.name;
350
- const item = {
351
- name: p.name,
352
- label,
353
- description: p.metadata?.description,
354
- icon: p.metadata?.icon,
355
- id: p.id,
356
- versions: [],
357
- displayVersion: p.metadata?.version,
358
- displayVersionLabel: p.metadata?.version || '-',
359
- installed: true,
360
- installedVersion: p.metadata?.version,
361
- builtin: !!p.builtin,
362
- primeOnly: rancher?.annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true',
363
- experimental: rancher?.annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL] === 'true',
364
- certified: rancher?.annotations?.[CATALOG_ANNOTATIONS.CERTIFIED] === CATALOG_ANNOTATIONS._RANCHER
365
- };
366
-
367
- // Built-in plugins can chose to be hidden - used where we implement as extensions
368
- // but don't want to shows them individually on the extensions page
369
- if (!(item.builtin && rancher[UI_PLUGIN_CHART_ANNOTATIONS.HIDDEN_BUILTIN])) {
267
+ if (!all.find((c) => c.name === p.name)) {
268
+ const item = this.buildLoadedPluginItem(p);
269
+
270
+ if (item) {
370
271
  all.push(item);
371
272
  }
372
273
  }
373
274
  });
374
275
 
375
- // Go through the CRs for the plugins and wire them into the catalog
376
- this.plugins.forEach((p) => {
377
- let chart;
378
- const app = this.apps.find((a) => a.metadata.name === p.name && a.metadata.namespace === UI_PLUGIN_NAMESPACE);
379
- const originalRepoName = app?.spec?.chart?.metadata?.annotations?.[CATALOG_ANNOTATIONS.SOURCE_REPO_NAME] || app?.metadata?.labels?.[CATALOG_ANNOTATIONS.CLUSTER_REPO_NAME];
276
+ this.plugins.forEach((p) => this.wirePluginCRToChart(p, all));
380
277
 
381
- // Find the chart from the original repo to avoid picking a wrong chart with the same name
382
- if (originalRepoName) {
383
- chart = all.find((c) => c.name === p.name && c.chart?.repoName === originalRepoName);
384
- }
385
-
386
- // If original repo was removed, don't fall back to another repo's chart (would break Available tab)
387
- if (chart) {
388
- chart.installed = true;
389
- chart.uiplugin = p;
390
- chart.installedVersion = p.version;
278
+ this.mergePluginErrors(all);
391
279
 
392
- // Can't do this here
393
- chart.installing = this.installing[chart.id];
280
+ // Remove duplicate installed plugins - keep only ones with uiplugin (correct CR data)
281
+ const installedByName = {};
394
282
 
395
- // Check for upgrade
396
- const latestInstallableVersion = chart.installableVersions?.[0];
397
-
398
- if (latestInstallableVersion && p.version !== (latestInstallableVersion.appVersion ?? latestInstallableVersion.version)) {
399
- // Use the currently installed version's metadata to show/hide the experimental and certified labels
400
- const installedVersion = (chart.installableVersions || []).find((v) => (v.appVersion ?? v.version) === p.version);
401
-
402
- if (installedVersion) {
403
- chart.primeOnly = installedVersion?.annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true';
404
- chart.experimental = installedVersion?.annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL] === 'true';
405
- chart.certified = installedVersion?.annotations?.[CATALOG_ANNOTATIONS.CERTIFIED] === CATALOG_ANNOTATIONS._RANCHER;
406
- }
407
-
408
- chart.upgrade = getPluginChartVersionLabel(latestInstallableVersion);
409
- }
410
- } else {
411
- // No chart available - original repo was removed or developer-loaded plugin
412
- const appChartMeta = app?.spec?.chart?.metadata;
413
- const appAnnotations = appChartMeta?.annotations || {};
414
- let originalRepoDisplayName = null;
415
-
416
- if (originalRepoName) {
417
- originalRepoDisplayName = this.$store.getters['i18n/withFallback'](`catalog.repo.name."${ originalRepoName }"`, null, originalRepoName);
418
- }
419
-
420
- const item = {
421
- name: p.name,
422
- label: appAnnotations[UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME] || appChartMeta?.name || p.name,
423
- description: appChartMeta?.description || p.description || '-',
424
- icon: appChartMeta?.icon || appAnnotations['catalog.cattle.io/ui-icon'],
425
- id: `${ p.name }-${ p.version }`,
426
- versions: [],
427
- displayVersion: p.version,
428
- displayVersionLabel: p.version || '-',
429
- isDeveloper: p.isDeveloper,
430
- installed: true,
431
- installedVersion: p.version,
432
- installing: false,
433
- builtin: false,
434
- uiplugin: p,
435
- primeOnly: appAnnotations[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true',
436
- experimental: appAnnotations[CATALOG_ANNOTATIONS.EXPERIMENTAL] === 'true',
437
- certified: appAnnotations[CATALOG_ANNOTATIONS.CERTIFIED] === CATALOG_ANNOTATIONS._RANCHER,
438
- originalRepoNameDisplay: originalRepoDisplayName,
439
- };
440
-
441
- all.push(item);
283
+ all.forEach((plugin) => {
284
+ if (plugin.description && plugin.description.length > MAX_DESCRIPTION_LENGTH) {
285
+ plugin.description = `${ plugin.description.substr(0, MAX_DESCRIPTION_LENGTH) } ...`;
442
286
  }
443
- });
444
287
 
445
- // Merge in the plugin load errors
446
- Object.keys(this.uiErrors).forEach((e) => {
447
- const chart = all.find((c) => c.name === e);
448
-
449
- if (chart) {
450
- const error = this.uiErrors[e];
288
+ if (plugin.installed) {
289
+ const existing = installedByName[plugin.name];
451
290
 
452
- if (error && typeof error === 'string') {
453
- chart.installedError = this.t(this.uiErrors[e]);
454
- } else {
455
- chart.installedError = '';
291
+ if (!existing || plugin.uiplugin) {
292
+ installedByName[plugin.name] = plugin;
456
293
  }
457
294
  }
458
295
  });
459
296
 
460
- // Merge in the plugin load errors from help ops
461
- Object.keys(this.errors).forEach((e) => {
462
- const chart = all.find((c) => c.id === e);
463
-
464
- if (chart) {
465
- chart.helmError = !!this.errors[e];
297
+ all = all.filter((plugin) => {
298
+ if (!plugin.installed) {
299
+ return true;
466
300
  }
467
- });
468
301
 
469
- all.forEach((plugin) => {
470
- // Clamp the lengths of the descriptions
471
- if (plugin.description && plugin.description.length > MAX_DESCRIPTION_LENGTH) {
472
- plugin.description = `${ plugin.description.substr(0, MAX_DESCRIPTION_LENGTH) } ...`;
473
- }
302
+ return installedByName[plugin.name] === plugin;
474
303
  });
475
304
 
476
- // Sort by name
477
305
  return sortBy(all, 'name', false);
478
306
  }
479
307
  },
@@ -701,6 +529,9 @@ export default {
701
529
  this.updatePluginInstallStatus(pluginId, type);
702
530
  },
703
531
  closed: (res) => {
532
+ if (res && plugin?.chart?.repoName) {
533
+ this.installedFromRepo[plugin.name] = plugin.chart.repoName;
534
+ }
704
535
  this.didInstall(res);
705
536
  }
706
537
  }
@@ -1021,6 +852,196 @@ export default {
1021
852
  }
1022
853
 
1023
854
  return statuses;
855
+ },
856
+
857
+ extractCertificationFlags(annotations) {
858
+ return {
859
+ primeOnly: annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true',
860
+ experimental: annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL] === 'true',
861
+ certified: annotations?.[CATALOG_ANNOTATIONS.CERTIFIED] === CATALOG_ANNOTATIONS._RANCHER,
862
+ };
863
+ },
864
+
865
+ buildIncompatibilityMessage(versionData) {
866
+ const { versionIncompatibilityData, version } = versionData;
867
+ const params = {
868
+ version,
869
+ required: versionIncompatibilityData?.required,
870
+ };
871
+
872
+ if (versionIncompatibilityData?.type === EXTENSIONS_INCOMPATIBILITY_TYPES.HOST) {
873
+ params.mainHost = versionIncompatibilityData?.mainHost;
874
+ }
875
+
876
+ return this.t(versionIncompatibilityData?.cardMessageKey, params, true);
877
+ },
878
+
879
+ mapChartToPluginItem(chart) {
880
+ const label = uiPluginAnnotation(chart, UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME) || chart.chartNameDisplay;
881
+ const item = {
882
+ name: chart.chartName,
883
+ label,
884
+ description: chart.chartDescription,
885
+ id: chart.id,
886
+ versions: [...chart.versions],
887
+ installed: false,
888
+ builtin: false,
889
+ chart,
890
+ incompatibilityMessage: '',
891
+ };
892
+
893
+ item.installableVersions = item.versions.filter((version) => isSupportedChartVersion({
894
+ version, rancherVersion: this.rancherVersion, kubeVersion: this.kubeVersion
895
+ }));
896
+
897
+ item.versions = item.versions.map((version) => isSupportedChartVersion({
898
+ version, rancherVersion: this.rancherVersion, kubeVersion: this.kubeVersion
899
+ }, true));
900
+
901
+ const latestCompatible = item.installableVersions?.[0];
902
+ const latestNotCompatible = item.versions.find((version) => !version.isVersionCompatible);
903
+
904
+ if (latestCompatible) {
905
+ Object.assign(item, {
906
+ ...this.extractCertificationFlags(latestCompatible?.annotations),
907
+ displayVersion: latestCompatible.version,
908
+ displayVersionLabel: getPluginChartVersionLabel(latestCompatible),
909
+ icon: latestCompatible.icon,
910
+ created: latestCompatible.created,
911
+ });
912
+ } else {
913
+ Object.assign(item, {
914
+ primeOnly: uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.PRIME_ONLY, 'true'),
915
+ experimental: uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.EXPERIMENTAL, 'true'),
916
+ certified: uiPluginHasAnnotation(chart, CATALOG_ANNOTATIONS.CERTIFIED, CATALOG_ANNOTATIONS._RANCHER),
917
+ displayVersion: item.versions?.[0]?.version,
918
+ displayVersionLabel: getPluginChartVersionLabel(item.versions?.[0]),
919
+ icon: chart.icon || latestCompatible?.annotations?.['catalog.cattle.io/ui-icon'],
920
+ created: item.versions?.[0]?.created,
921
+ });
922
+ }
923
+
924
+ if (latestNotCompatible && item.installableVersions.length && isChartVersionHigher(latestNotCompatible.version, item.installableVersions?.[0].version)) {
925
+ item.incompatibilityMessage = this.buildIncompatibilityMessage(latestNotCompatible);
926
+ }
927
+
928
+ if (this.installing[item.id]) {
929
+ item.installing = this.installing[item.id];
930
+ }
931
+
932
+ return item;
933
+ },
934
+
935
+ buildLoadedPluginItem(plugin) {
936
+ const rancher = typeof plugin.metadata?.rancher === 'object' ? plugin.metadata.rancher : {};
937
+ const label = rancher.annotations?.[UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME] || plugin.name;
938
+
939
+ if (plugin.builtin && rancher[UI_PLUGIN_CHART_ANNOTATIONS.HIDDEN_BUILTIN]) {
940
+ return null;
941
+ }
942
+
943
+ return {
944
+ name: plugin.name,
945
+ label,
946
+ description: plugin.metadata?.description,
947
+ icon: plugin.metadata?.icon,
948
+ id: plugin.id,
949
+ versions: [],
950
+ displayVersion: plugin.metadata?.version,
951
+ displayVersionLabel: plugin.metadata?.version || '-',
952
+ installed: true,
953
+ installedVersion: plugin.metadata?.version,
954
+ builtin: !!plugin.builtin,
955
+ ...this.extractCertificationFlags(rancher?.annotations),
956
+ };
957
+ },
958
+
959
+ wirePluginCRToChart(pluginCR, all) {
960
+ const app = this.apps.find((a) => a.metadata.name === pluginCR.name && a.metadata.namespace === UI_PLUGIN_NAMESPACE);
961
+ const originalRepoName = app?.spec?.chart?.metadata?.annotations?.[CATALOG_ANNOTATIONS.SOURCE_REPO_NAME] || app?.metadata?.labels?.[CATALOG_ANNOTATIONS.CLUSTER_REPO_NAME];
962
+
963
+ let chart;
964
+
965
+ if (originalRepoName) {
966
+ chart = all.find((c) => c.name === pluginCR.name && c.chart?.repoName === originalRepoName);
967
+ }
968
+
969
+ // fallback to try and prevent https://github.com/rancher/dashboard/issues/17956
970
+ // which we believe is due to a race condition
971
+ // we fall back to plugin name which should be present when going through the "installed plugins" (uiplugins) and should be enough to find the correct chart in the majority of cases, as long as there are not multiple charts with the same name across different repos
972
+ if (!chart) {
973
+ const fallbackRepoName = this.installedFromRepo?.[pluginCR.name];
974
+
975
+ if (fallbackRepoName) {
976
+ chart = all.find((c) => c.name === pluginCR.name && c.chart?.repoName === fallbackRepoName);
977
+ }
978
+ }
979
+
980
+ if (chart) {
981
+ chart.installed = true;
982
+ chart.uiplugin = pluginCR;
983
+ chart.installedVersion = pluginCR.version;
984
+ chart.installing = this.installing[chart.id];
985
+
986
+ const latestInstallableVersion = chart.installableVersions?.[0];
987
+
988
+ if (latestInstallableVersion && pluginCR.version !== (latestInstallableVersion.appVersion ?? latestInstallableVersion.version)) {
989
+ const installedVersion = (chart.installableVersions || []).find((v) => (v.appVersion ?? v.version) === pluginCR.version);
990
+
991
+ if (installedVersion) {
992
+ Object.assign(chart, this.extractCertificationFlags(installedVersion?.annotations));
993
+ }
994
+
995
+ chart.upgrade = getPluginChartVersionLabel(latestInstallableVersion);
996
+ }
997
+ } else {
998
+ const appChartMeta = app?.spec?.chart?.metadata;
999
+ const appAnnotations = appChartMeta?.annotations || {};
1000
+ let originalRepoDisplayName = null;
1001
+
1002
+ if (originalRepoName) {
1003
+ originalRepoDisplayName = this.$store.getters['i18n/withFallback'](`catalog.repo.name."${ originalRepoName }"`, null, originalRepoName);
1004
+ }
1005
+
1006
+ all.push({
1007
+ name: pluginCR.name,
1008
+ label: appAnnotations[UI_PLUGIN_CHART_ANNOTATIONS.DISPLAY_NAME] || appChartMeta?.name || pluginCR.name,
1009
+ description: appChartMeta?.description || pluginCR.description || '-',
1010
+ icon: appChartMeta?.icon || appAnnotations['catalog.cattle.io/ui-icon'],
1011
+ id: `${ pluginCR.name }-${ pluginCR.version }`,
1012
+ versions: [],
1013
+ displayVersion: pluginCR.version,
1014
+ displayVersionLabel: pluginCR.version || '-',
1015
+ isDeveloper: pluginCR.isDeveloper,
1016
+ installed: true,
1017
+ installedVersion: pluginCR.version,
1018
+ installing: false,
1019
+ builtin: false,
1020
+ uiplugin: pluginCR,
1021
+ originalRepoNameDisplay: originalRepoDisplayName,
1022
+ ...this.extractCertificationFlags(appAnnotations),
1023
+ });
1024
+ }
1025
+ },
1026
+
1027
+ mergePluginErrors(all) {
1028
+ Object.keys(this.uiErrors).forEach((errorName) => {
1029
+ const chart = all.find((c) => c.name === errorName);
1030
+
1031
+ if (chart) {
1032
+ const error = this.uiErrors[errorName];
1033
+
1034
+ chart.installedError = (error && typeof error === 'string') ? this.t(error) : '';
1035
+ }
1036
+ });
1037
+
1038
+ Object.keys(this.errors).forEach((errorId) => {
1039
+ const chart = all.find((c) => c.id === errorId);
1040
+
1041
+ if (chart) {
1042
+ chart.helmError = !!this.errors[errorId];
1043
+ }
1044
+ });
1024
1045
  }
1025
1046
  }
1026
1047
  };
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import { CAPI, MANAGEMENT } from '@shell/config/types';
2
+ import { MANAGEMENT } from '@shell/config/types';
3
3
  import AsyncButton from '@shell/components/AsyncButton';
4
4
  import { downloadFile } from '@shell/utils/download';
5
5
  import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
@@ -12,28 +12,25 @@ export default {
12
12
  components: { AsyncButton },
13
13
 
14
14
  async fetch() {
15
- const provClusters = await this.$store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER });
16
- const readyClusters = provClusters.filter((c) => c.mgmt?.isReady);
17
- const clusterForCounts = filterHiddenLocalCluster(filterOnlyKubernetesClusters(readyClusters, this.$store), this.$store);
15
+ // Diagnostics does not scale with resources (this will be real heavy for rancher's with 1000s of clusters)
16
+ const mgmtClusters = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.CLUSTER });
17
+ const readyMgmtClusters = mgmtClusters.filter((c) => c.isReady);
18
+ const clusterForCounts = filterHiddenLocalCluster(filterOnlyKubernetesClusters(readyMgmtClusters, this.$store), this.$store);
18
19
  const finalCounts = [];
19
20
  const promises = [];
20
21
  const topFifteenForResponseTime = [];
21
22
  const schemaPromises = [];
22
23
 
23
- clusterForCounts.forEach((cluster, i) => {
24
- // Necessary to retrieve the proper display name of the cluster
25
- const mgmtCluster = this.$store.getters['management/byId'](MANAGEMENT.CLUSTER, cluster.metadata.name);
26
-
24
+ clusterForCounts.forEach((mgmtCluster, i) => {
27
25
  finalCounts.push({
28
- id: cluster.id,
29
- name: mgmtCluster?.spec?.displayName || cluster.metadata?.name,
30
- namespace: cluster.metadata?.namespace,
31
- capiId: cluster.mgmt?.id,
26
+ id: mgmtCluster.id,
27
+ name: mgmtCluster.spec.displayName || mgmtCluster.metadata?.name,
28
+ namespace: mgmtCluster.provClusterNamespace,
32
29
  counts: null,
33
30
  isTableVisible: !!(i === 0 && clusterForCounts.length === 1)
34
31
  });
35
- promises.push(this.$store.dispatch('management/request', { url: `/k8s/clusters/${ cluster.mgmt?.id }/v1/counts` }));
36
- schemaPromises.push(this.$store.dispatch('management/request', { url: `/k8s/clusters/${ cluster.mgmt?.id }/v1/schemas?exclude=metadata.managedFields` }));
32
+ promises.push(this.$store.dispatch('management/request', { url: `/k8s/clusters/${ mgmtCluster.id }/v1/counts` }));
33
+ schemaPromises.push(this.$store.dispatch('management/request', { url: `/k8s/clusters/${ mgmtCluster.id }/v1/schemas?exclude=metadata.managedFields` }));
37
34
  });
38
35
 
39
36
  const countsPerCluster = await Promise.all(promises);
@@ -62,7 +59,6 @@ export default {
62
59
 
63
60
  finalCount.forEach((item, i) => {
64
61
  finalCount[i].id = finalCounts[index].id;
65
- finalCount[i].capiId = finalCounts[index].capiId;
66
62
  });
67
63
 
68
64
  topFifteenForResponseTime.push(finalCount);
@@ -187,7 +183,7 @@ export default {
187
183
  setResourceResponseTiming(responseTimes) {
188
184
  responseTimes?.forEach((res) => {
189
185
  if ( res.outcome === 'success' ) {
190
- const cluster = this.finalCounts.find((c) => c.capiId === res.item.capiId);
186
+ const cluster = this.finalCounts.find((c) => c.id === res.item.id);
191
187
  const countIndex = cluster?.counts?.findIndex((c) => c.resource === res.item.resource);
192
188
 
193
189
  if ( (countIndex && countIndex !== -1) || countIndex === 0 ) {
@@ -218,7 +214,7 @@ export default {
218
214
  return cluster.map((item) => {
219
215
  const t = Date.now();
220
216
 
221
- return this.$store.dispatch('management/request', { url: `/k8s/clusters/${ item.capiId }/v1/${ item.resource }` })
217
+ return this.$store.dispatch('management/request', { url: `/k8s/clusters/${ item.id }/v1/${ item.resource }` })
222
218
  .then(() => ({
223
219
  outcome: 'success', item, durationMs: Date.now() - t
224
220
  }))
@@ -8,11 +8,12 @@ import FixedBanner from '@shell/components/FixedBanner';
8
8
  import GrowlManager from '@shell/components/GrowlManager';
9
9
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
10
10
  import PromptModal from '@shell/components/PromptModal';
11
+ import { RcButton } from '@components/RcButton';
11
12
 
12
13
  export default {
13
14
 
14
15
  components: {
15
- BrandImage, FixedBanner, GrowlManager, Header, PromptModal
16
+ BrandImage, FixedBanner, GrowlManager, Header, PromptModal, RcButton
16
17
  },
17
18
  mixins: [Brand, BrowserTabVisibility],
18
19
 
@@ -61,6 +62,13 @@ export default {
61
62
 
62
63
  <template>
63
64
  <div class="dashboard-root">
65
+ <rc-button
66
+ size="large"
67
+ class="skip-to-content"
68
+ :to="{ hash: '#main-content' }"
69
+ >
70
+ {{ t('nav.skipToContent') }}
71
+ </rc-button>
64
72
  <FixedBanner :header="true" />
65
73
  <PromptModal />
66
74
  <div
@@ -73,8 +81,10 @@ export default {
73
81
  />
74
82
 
75
83
  <main
84
+ id="main-content"
76
85
  class="main-layout"
77
86
  aria-label="Fail whale layout"
87
+ tabindex="-1"
78
88
  >
79
89
  <div
80
90
  v-if="error"
@@ -100,12 +110,12 @@ export default {
100
110
  {{ displayError }}
101
111
  </h2>
102
112
  <p class="mt-20">
103
- <a
113
+ <rc-button
114
+ size="large"
104
115
  :href="home"
105
- class="btn role-primary"
106
116
  >
107
117
  {{ t('nav.home') }}
108
- </a>
118
+ </rc-button>
109
119
  </p>
110
120
  <hr
111
121
  class="custom-content"
@@ -113,12 +123,13 @@ export default {
113
123
  role="none"
114
124
  >
115
125
  <p class="mt-20">
116
- <a
117
- class="btn role-secondary"
126
+ <rc-button
127
+ size="large"
128
+ variant="secondary"
118
129
  @click="$router.push(previousRoute.fullPath)"
119
130
  >
120
131
  {{ t('nav.failWhale.reload') }}
121
- </a>
132
+ </rc-button>
122
133
  </p>
123
134
  </div>
124
135
  </div>
@@ -200,4 +211,16 @@ export default {
200
211
  padding: 0;
201
212
  }
202
213
  }
214
+
215
+ .skip-to-content {
216
+ position: fixed;
217
+ top: 0;
218
+ left: 0;
219
+ z-index: 9999;
220
+ transform: translateY(-100%);
221
+
222
+ &:focus {
223
+ transform: translate(1rem, 1rem);
224
+ }
225
+ }
203
226
  </style>