@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
@@ -22,7 +22,6 @@ import Tabbed from '@shell/components/Tabbed';
22
22
  import UnitInput from '@shell/components/form/UnitInput';
23
23
  import YamlEditor, { EDITOR_MODES } from '@shell/components/YamlEditor';
24
24
  import Wizard from '@shell/components/Wizard';
25
- import TypeDescription from '@shell/components/TypeDescription';
26
25
  import ChartMixin from '@shell/mixins/chart';
27
26
  import ChildHook, { BEFORE_SAVE_HOOKS, AFTER_SAVE_HOOKS } from '@shell/mixins/child-hook';
28
27
  import {
@@ -41,7 +40,7 @@ import {
41
40
  import { ignoreVariables } from './install.helpers';
42
41
  import { findBy, insertAt } from '@shell/utils/array';
43
42
  import { saferDump } from '@shell/utils/create-yaml';
44
- import { LINUX, WINDOWS } from '@shell/store/catalog';
43
+ import { WINDOWS } from '@shell/store/catalog';
45
44
  import { SETTING } from '@shell/config/settings';
46
45
  import SelectOrCreateAuthSecret from '@shell/components/form/SelectOrCreateAuthSecret.vue';
47
46
  import { generateRandomAlphaString } from '@shell/utils/string';
@@ -96,7 +95,6 @@ export default {
96
95
  UnitInput,
97
96
  YamlEditor,
98
97
  Wizard,
99
- TypeDescription,
100
98
  SelectOrCreateAuthSecret
101
99
  },
102
100
 
@@ -601,6 +599,10 @@ export default {
601
599
  return out;
602
600
  },
603
601
 
602
+ selectedVersionOption() {
603
+ return this.filteredVersions?.find((v) => v.id === this.query.versionName) || this.query.versionName;
604
+ },
605
+
604
606
  showSelectVersionOrChart() {
605
607
  // Allow the user to choose a version if:
606
608
  // - the app exists (editing/upgrading)
@@ -680,7 +682,7 @@ export default {
680
682
  },
681
683
 
682
684
  stepperSubtext() {
683
- return this.existing && this.currentVersion !== this.targetVersion ? `${ this.currentVersion } > ${ this.targetVersion }` : this.targetVersion;
685
+ return this.mappedVersions?.find((v) => v.id === this.targetVersion)?.label || this.targetVersion;
684
686
  },
685
687
 
686
688
  readmeWindowName() {
@@ -765,21 +767,6 @@ export default {
765
767
  return { name: 'c-cluster-legacy-project' };
766
768
  },
767
769
 
768
- windowsIncompatible() {
769
- if (this.chart?.windowsIncompatible) {
770
- return this.t('catalog.charts.windowsIncompatible');
771
- }
772
- if (this.versionInfo) {
773
- const incompatibleVersion = !(this.versionInfo?.chart?.annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS] || LINUX).includes('windows');
774
-
775
- if (incompatibleVersion && !this.chart.windowsIncompatible) {
776
- return this.t('catalog.charts.versionWindowsIncompatible');
777
- }
778
- }
779
-
780
- return null;
781
- },
782
-
783
770
  /**
784
771
  * Check if the chart contains `systemDefaultRegistry` properties.
785
772
  * If not we shouldn't apply the setting, because if the option
@@ -1551,10 +1538,9 @@ export default {
1551
1538
  <Loading v-if="$fetchState.pending" />
1552
1539
  <div
1553
1540
  v-else-if="!legacyApp && !mcapp"
1554
- class="install-steps pt-20"
1541
+ class="install-steps"
1555
1542
  :class="{ 'isPlainLayout': isPlainLayout}"
1556
1543
  >
1557
- <TypeDescription resource="chart" />
1558
1544
  <Wizard
1559
1545
  v-if="value"
1560
1546
  :steps="steps"
@@ -1564,25 +1550,45 @@ export default {
1564
1550
  :banner-title-subtext="stepperSubtext"
1565
1551
  :finish-mode="action.name"
1566
1552
  :header-mode="action.tKey"
1553
+ :show-step-header="false"
1567
1554
  class="wizard"
1568
- :class="{'windowsIncompatible': windowsIncompatible}"
1569
1555
  @cancel="cancel"
1570
1556
  @finish="finish"
1571
1557
  >
1572
- <template #bannerTitleImage>
1573
- <div>
1574
- <div class="logo-bg">
1575
- <LazyImage
1576
- :src="chart ? chart.icon : ''"
1577
- class="logo"
1578
- />
1558
+ <template #bannerTitle>
1559
+ <div class="chart-title-container">
1560
+ <div class="logo-container">
1561
+ <div class="logo-box">
1562
+ <LazyImage
1563
+ :src="chart ? chart.icon : ''"
1564
+ class="logo"
1565
+ />
1566
+ </div>
1567
+ </div>
1568
+ <div class="chart-title">
1569
+ <h1>
1570
+ <router-link
1571
+ v-if="chart"
1572
+ :to="chartLocation()"
1573
+ data-testid="chart-install-name-link"
1574
+ >
1575
+ {{ stepperName }}
1576
+ </router-link>
1577
+ <span v-else>
1578
+ {{ stepperName }}
1579
+ </span>: {{ t(`wizard.${action.tKey}`) }}
1580
+ </h1>
1581
+ <span
1582
+ v-if="stepperSubtext"
1583
+ class="subtext"
1584
+ >
1585
+ <i
1586
+ v-clean-tooltip="t('tableHeaders.version')"
1587
+ class="icon icon-version-alt"
1588
+ />
1589
+ {{ stepperSubtext }}
1590
+ </span>
1579
1591
  </div>
1580
- <label
1581
- v-if="windowsIncompatible"
1582
- class="os-label"
1583
- >
1584
- {{ windowsIncompatible }}
1585
- </label>
1586
1592
  </div>
1587
1593
  </template>
1588
1594
  <template #basics>
@@ -1626,20 +1632,26 @@ export default {
1626
1632
  v-if="showSelectVersionOrChart"
1627
1633
  class="row mb-20"
1628
1634
  >
1629
- <div class="col span-4">
1630
- <!-- We have a chart for the app, let the user select a new version -->
1635
+ <!-- We have a chart for the app, let the user select a new version -->
1636
+ <div
1637
+ v-if="chart"
1638
+ class="col span-4"
1639
+ >
1631
1640
  <LabeledSelect
1632
- v-if="chart"
1633
1641
  data-testid="chart-version-selector"
1634
1642
  :label="t('catalog.install.version')"
1635
- :value="query.versionName"
1643
+ :value="selectedVersionOption"
1636
1644
  :options="filteredVersions"
1637
1645
  :selectable="version => !version.disabled"
1638
1646
  @update:value="selectVersion"
1639
1647
  />
1640
- <!-- Can't find the chart for the app, let the user try to select one -->
1648
+ </div>
1649
+ <!-- Can't find the chart for the app, let the user try to select one -->
1650
+ <div
1651
+ v-else
1652
+ class="col span-4"
1653
+ >
1641
1654
  <LabeledSelect
1642
- v-else
1643
1655
  :label="t('catalog.install.chart')"
1644
1656
  :value="chart"
1645
1657
  :options="charts"
@@ -1788,7 +1800,7 @@ export default {
1788
1800
  <LabeledSelect
1789
1801
  v-if="chart"
1790
1802
  :label="t('catalog.install.version')"
1791
- :value="query.versionName"
1803
+ :value="selectedVersionOption"
1792
1804
  :options="filteredVersions"
1793
1805
  :selectable="version => !version.disabled"
1794
1806
  @update:value="selectVersion"
@@ -2043,30 +2055,37 @@ export default {
2043
2055
  :class="{ 'isPlainLayout': isPlainLayout}"
2044
2056
  >
2045
2057
  <div class="outer-container">
2046
- <div class="header mb-20">
2047
- <div class="title">
2048
- <div class="top choice-banner">
2049
- <div class="title">
2050
- <!-- Logo -->
2051
- <slot name="bannerTitleImage">
2052
- <div class="round-image">
2053
- <LazyImage
2054
- :src="chart ? chart.icon : ''"
2055
- class="logo"
2056
- />
2057
- </div>
2058
- </slot>
2059
- <!-- Title with subtext -->
2060
- <div class="subtitle">
2061
- <h2 v-if="stepperName">
2062
- {{ stepperName }}
2063
- </h2>
2064
- <span
2065
- v-if="stepperSubtext"
2066
- class="subtext"
2067
- >{{ stepperSubtext }}</span>
2058
+ <div class="header mmt-6 mmb-6">
2059
+ <div class="top choice-banner">
2060
+ <div class="chart-title-container mmb-6">
2061
+ <div class="logo-container">
2062
+ <div class="logo-box">
2063
+ <LazyImage
2064
+ :src="chart ? chart.icon : ''"
2065
+ class="logo"
2066
+ />
2068
2067
  </div>
2069
2068
  </div>
2069
+ <div class="chart-title">
2070
+ <h2 v-if="stepperName">
2071
+ <router-link
2072
+ :to="chartLocation()"
2073
+ data-testid="chart-install-name-link"
2074
+ >
2075
+ {{ stepperName }}
2076
+ </router-link>
2077
+ </h2>
2078
+ <span
2079
+ v-if="stepperSubtext"
2080
+ class="subtext"
2081
+ >
2082
+ <i
2083
+ v-clean-tooltip="t('tableHeaders.version')"
2084
+ class="icon icon-version-alt"
2085
+ />
2086
+ {{ stepperSubtext }}
2087
+ </span>
2088
+ </div>
2070
2089
  </div>
2071
2090
  </div>
2072
2091
  </div>
@@ -2097,12 +2116,16 @@ export default {
2097
2116
  </template>
2098
2117
 
2099
2118
  <style lang="scss" scoped>
2119
+ .chart-version-footnote {
2120
+ margin-top: 8px;
2121
+ color: var(--input-label);
2122
+ }
2123
+
2100
2124
  $title-height: 50px;
2101
2125
  $padding: 5px;
2102
2126
  $slideout-width: 35%;
2103
2127
 
2104
2128
  .install-steps {
2105
- padding-top: 0;
2106
2129
  height: 0;
2107
2130
  position: relative;
2108
2131
  overflow: hidden;
@@ -2118,37 +2141,29 @@ export default {
2118
2141
  }
2119
2142
  }
2120
2143
 
2121
- .wizard {
2122
- .logo-bg {
2123
- margin-right: 10px;
2124
- height: $title-height;
2125
- width: $title-height;
2126
- background-color: white;
2127
- border: $padding solid white;
2128
- border-radius: calc( 3 * var(--border-radius));
2129
- position: relative;
2130
- }
2144
+ .logo-container {
2145
+ display: flex;
2146
+ flex-direction: column;
2147
+ align-items: center;
2131
2148
 
2132
- .logo {
2133
- max-height: $title-height - 2 * $padding;
2134
- max-width: $title-height - 2 * $padding;
2135
- position: absolute;
2136
- width: auto;
2137
- height: auto;
2138
- top: 0;
2139
- right: 0;
2140
- bottom: 0;
2141
- left: 0;
2142
- margin: auto;
2143
- }
2149
+ .logo-box {
2150
+ width: 60px;
2151
+ height: 60px;
2152
+ display: flex;
2153
+ justify-content: center;
2154
+ align-items: center;
2155
+ background: #fff;
2156
+ border-radius: var(--border-radius);
2144
2157
 
2145
- // Hack - We're adding an absolute tag under the logo that we want to consume space without breaking vertical alignment of row.
2146
- // W ith the slots available this isn't possible without adding tag specific styles to the root wizard classes
2147
- &.windowsIncompatible {
2148
- :deep() .header {
2149
- padding-bottom: 15px;
2158
+ .logo {
2159
+ width: 48px;
2160
+ height: 48px;
2161
+ object-fit: contain;
2150
2162
  }
2151
2163
  }
2164
+ }
2165
+
2166
+ .wizard {
2152
2167
 
2153
2168
  .os-label {
2154
2169
  position: absolute;
@@ -2297,38 +2312,43 @@ export default {
2297
2312
 
2298
2313
  border-bottom: var(--header-border-size) solid var(--header-border);
2299
2314
 
2300
- & > .title {
2315
+ & > .chart-title-container {
2301
2316
  flex: 1;
2302
2317
  min-height: 75px;
2303
2318
  }
2304
2319
 
2305
2320
  .choice-banner {
2306
2321
 
2307
- flex-basis: 40%;
2322
+ flex-basis: 100%;
2308
2323
  display: flex;
2309
2324
  align-items: center;
2310
2325
 
2311
2326
  &.top {
2312
2327
 
2313
- H2 {
2328
+ H1, H2 {
2314
2329
  margin: 0px;
2315
2330
  }
2316
2331
 
2317
- .title{
2332
+ .chart-title-container {
2318
2333
  display: flex;
2319
- align-items: center;
2334
+ align-items: flex-start;
2320
2335
  justify-content: space-evenly;
2321
-
2322
- & > .subtitle {
2323
- margin: 0 20px;
2324
- }
2336
+ gap: 24px;
2325
2337
  }
2326
2338
 
2327
- .subtitle{
2339
+ .chart-title {
2328
2340
  display: flex;
2329
2341
  flex-direction: column;
2330
2342
  & .subtext {
2343
+ display: flex;
2344
+ align-items: center;
2345
+ gap: 8px;
2331
2346
  color: var(--input-label);
2347
+ margin-top: 8px;
2348
+
2349
+ .icon-version-alt {
2350
+ font-size: 19px;
2351
+ }
2332
2352
  }
2333
2353
  }
2334
2354
 
@@ -2345,17 +2365,6 @@ export default {
2345
2365
  }
2346
2366
  }
2347
2367
 
2348
- & .round-image {
2349
- min-width: 50px;
2350
- height: 50px;
2351
- margin: 10px 10px 10px 0;
2352
- border-radius: 50%;
2353
- overflow: hidden;
2354
- .logo {
2355
- min-width: 50px;
2356
- height: 50px;
2357
- }
2358
- }
2359
2368
  }
2360
2369
  }
2361
2370
 
@@ -7,6 +7,7 @@ import Loading from '@shell/components/Loading';
7
7
  import { SUBTYPE_MAPPING, CREATE_VERBS } from '@shell/models/management.cattle.io.roletemplate';
8
8
  import { NAME } from '@shell/config/product/auth';
9
9
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
10
+ import { RcButton } from '@components/RcButton';
10
11
 
11
12
  const GLOBAL = SUBTYPE_MAPPING.GLOBAL.key;
12
13
  const CLUSTER = SUBTYPE_MAPPING.CLUSTER.key;
@@ -31,7 +32,7 @@ export default {
31
32
  name: 'Roles',
32
33
 
33
34
  components: {
34
- Tab, Tabbed, ResourceTable, Loading
35
+ Tab, Tabbed, ResourceTable, Loading, RcButton
35
36
  },
36
37
 
37
38
  async fetch() {
@@ -162,13 +163,13 @@ export default {
162
163
  </div>
163
164
  <div class="actions-container">
164
165
  <div class="actions">
165
- <router-link
166
+ <rc-button
166
167
  v-if="canCreate"
168
+ size="large"
167
169
  :to="createLocation"
168
- class="btn role-primary"
169
170
  >
170
171
  {{ createLabel }}
171
- </router-link>
172
+ </rc-button>
172
173
  </div>
173
174
  </div>
174
175
  </header>
@@ -1,12 +1,11 @@
1
- import { clone } from '@shell/utils/object';
1
+ import { mergeWithReplace } from '@shell/utils/object';
2
2
  import Dashboard from '@shell/pages/c/_cluster/explorer/index.vue';
3
3
  import { shallowMount } from '@vue/test-utils';
4
4
  import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
5
- import { NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
6
5
  import { WORKLOAD_TYPES } from '@shell/config/types';
7
6
 
8
7
  describe('page: cluster dashboard', () => {
9
- const mountOptions = {
8
+ const createMountOptions = () => ({
10
9
  global: {
11
10
  stubs: {
12
11
  'router-link': true,
@@ -17,12 +16,11 @@ describe('page: cluster dashboard', () => {
17
16
  dispatch: jest.fn(),
18
17
  getters: {
19
18
  currentCluster: {
20
- id: 'cluster',
21
- metadata: { creationTimestamp: Date.now() },
22
- status: { provider: 'foo' },
23
- kubernetesVersionBase: '0.0.0',
24
- kubernetesVersionExtension: 'k3s',
19
+ id: 'cluster',
20
+ metadata: { creationTimestamp: Date.now() },
21
+ status: { provider: 'foo' },
25
22
  },
23
+ 'management/byId': jest.fn(),
26
24
  'cluster/inError': () => false,
27
25
  'cluster/schemaFor': jest.fn(),
28
26
  'cluster/canList': jest.fn(),
@@ -36,7 +34,7 @@ describe('page: cluster dashboard', () => {
36
34
  }
37
35
  },
38
36
  }
39
- };
37
+ });
40
38
 
41
39
  describe.each([
42
40
  'etcd',
@@ -49,7 +47,7 @@ describe('page: cluster dashboard', () => {
49
47
  [STATES_ENUM.HEALTHY, 'icon-checkmark', `${ componentId }foo`, [{ status: 'True' }]],
50
48
  [STATES_ENUM.UNHEALTHY, 'icon-warning', `${ componentId }foo`, [{ status: 'False' }]],
51
49
  ])('should show %p status', (status, iconClass, name, conditions) => {
52
- const options = clone(mountOptions);
50
+ const options = createMountOptions();
53
51
 
54
52
  options.global.mocks.$store.getters.currentCluster.status = {
55
53
  provider: 'provider',
@@ -100,7 +98,7 @@ describe('page: cluster dashboard', () => {
100
98
  ]]
101
99
  ])('%p cluster - %p agent health box :', (_, agentId, isLocal, agentResources, statuses) => {
102
100
  it.each(statuses)('should NOT show %p status due to missing canList permissions', (status, iconClass, isLoaded, disconnected, error, conditions, readyReplicas, unavailableReplicas) => {
103
- const options = clone(mountOptions);
101
+ const options = createMountOptions();
104
102
 
105
103
  options.global.mocks.$store.getters.currentCluster.isLocal = isLocal;
106
104
 
@@ -168,7 +166,7 @@ describe('page: cluster dashboard', () => {
168
166
  it.each(statuses)('should show %p status', async(status, iconClass, clickable, isLoaded, disconnected, error, conditions, readyReplicas, unavailableReplicas) => {
169
167
  let agentRoute = null;
170
168
 
171
- const options = clone(mountOptions);
169
+ const options = createMountOptions();
172
170
 
173
171
  options.global.mocks.$store.getters.currentCluster.isLocal = isLocal;
174
172
 
@@ -221,7 +219,7 @@ describe('page: cluster dashboard', () => {
221
219
  });
222
220
 
223
221
  it('local cluster - cattle agent health box - should be hidden', () => {
224
- const options = clone(mountOptions);
222
+ const options = createMountOptions();
225
223
 
226
224
  options.global.mocks.$store.getters.currentCluster.isLocal = true;
227
225
 
@@ -241,18 +239,18 @@ describe('page: cluster dashboard', () => {
241
239
 
242
240
  describe('cluster details', () => {
243
241
  it.each([
244
- ['clusterProvider', 'other', []],
245
- ['kubernetesVersion', 'glance.version', []],
246
- ['created', 'glance.created', []],
247
- ['architecture', 'mixed', [{ labels: { [NODE_ARCHITECTURE]: 'amd64' } }, { labels: { [NODE_ARCHITECTURE]: 'intel' } }]],
248
- ['architecture', 'mixed', [{ labels: { [NODE_ARCHITECTURE]: 'amd64' } }, { labels: { } }]],
249
- ['architecture', 'amd64', [{ labels: { [NODE_ARCHITECTURE]: 'amd64' } }]],
250
- ['architecture', 'unknown', [{ labels: { } }]],
251
- ['architecture', 'glance.architecture', [{ metadata: { state: { transitioning: true } } }]],
252
- ])('should show %p label %p', (label, text, nodes) => {
253
- const options = clone(mountOptions);
254
-
255
- options.global.mocks.$store.getters['cluster/all'] = () => nodes;
242
+ ['clusterProvider', 'abc', { provisionerDisplay: 'abc' }],
243
+ ['kubernetesVersion', 'glance.version', null],
244
+ ['created', 'glance.created', null],
245
+ ['architecture', 'mixed', { architecture: { label: 'mixed' } }],
246
+ ['architecture', 'amd64', { architecture: { label: 'amd64' } }],
247
+ ['architecture', 'glance.architecture', { architecture: { label: null } }],
248
+ ])('should show %p label %p', (label, text, mgmtCluster) => {
249
+ const options = createMountOptions();
250
+
251
+ const currentCluster = options.global.mocks.$store.getters['currentCluster'];
252
+
253
+ options.global.mocks.$store.getters['currentCluster'] = mgmtCluster ? mergeWithReplace(currentCluster, mgmtCluster) : currentCluster; // eslint-disable-line jest/no-if
256
254
 
257
255
  const wrapper = shallowMount(Dashboard, options);
258
256
 
@@ -17,7 +17,6 @@ import {
17
17
  CATALOG,
18
18
  SECRET
19
19
  } from '@shell/config/types';
20
- import { NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
21
20
  import { setPromiseResult } from '@shell/utils/promise';
22
21
  import AlertTable from '@shell/components/AlertTable';
23
22
  import { Banner } from '@components/Banner';
@@ -220,51 +219,11 @@ export default {
220
219
  },
221
220
 
222
221
  displayProvider() {
223
- const other = 'other';
224
-
225
- let provider = this.currentCluster?.status?.provider || this.currentCluster?.status?.driver.toLowerCase() || other;
226
-
227
- if (provider === 'rke.windows') {
228
- provider = 'rkeWindows';
229
- }
230
-
231
- if (!this.$store.getters['i18n/exists'](`cluster.provider.${ provider }`)) {
232
- provider = 'other';
233
- }
234
-
235
- return this.t(`cluster.provider.${ provider }`);
236
- },
237
-
238
- nodesArchitecture() {
239
- const obj = {};
240
-
241
- this.nodes?.forEach((node) => {
242
- if (!node.metadata?.state?.transitioning) {
243
- const architecture = node.labels?.[NODE_ARCHITECTURE];
244
-
245
- const key = architecture || this.t('cluster.architecture.label.unknown');
246
-
247
- obj[key] = (obj[key] || 0) + 1;
248
- }
249
- });
250
-
251
- return obj;
222
+ return this.currentCluster?.provisionerDisplay;
252
223
  },
253
224
 
254
225
  architecture() {
255
- const keys = Object.keys(this.nodesArchitecture);
256
-
257
- switch (keys.length) {
258
- case 0:
259
- return { label: this.t('generic.provisioning') };
260
- case 1:
261
- return { label: keys[0] };
262
- default:
263
- return {
264
- label: this.t('cluster.architecture.label.mixed'),
265
- tooltip: keys.reduce((acc, k) => `${ acc }${ k }: ${ this.nodesArchitecture[k] }<br>`, '')
266
- };
267
- }
226
+ return this.currentCluster?.architecture;
268
227
  },
269
228
 
270
229
  isHarvesterCluster() {
@@ -395,6 +354,7 @@ export default {
395
354
 
396
355
  metricAggregations() {
397
356
  const metrics = this.nodeMetrics.filter((nodeMetrics) => {
357
+ // This should use cluster/byId getter
398
358
  const node = this.nodes.find((nd) => nd.id === nodeMetrics.id);
399
359
 
400
360
  return node;
@@ -464,9 +424,6 @@ export default {
464
424
  }
465
425
  };
466
426
  },
467
- hasNodes() {
468
- return this.nodes?.length > 0;
469
- },
470
427
  kubernetesVersion() {
471
428
  const base = this.currentCluster?.kubernetesVersionBase || '';
472
429
  const extension = this.currentCluster?.kubernetesVersionExtension || '';
@@ -584,8 +541,7 @@ export default {
584
541
 
585
542
  async goToHarvesterCluster() {
586
543
  try {
587
- const provClusters = await this.$store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER });
588
- const provCluster = provClusters.find((p) => p.mgmt.id === this.currentCluster.id);
544
+ const provCluster = await this.$store.dispatch('management/find', { type: CAPI.RANCHER_CLUSTER, id: this.currentCluster.provClusterId });
589
545
 
590
546
  await provCluster.goToHarvesterCluster();
591
547
  } catch {
@@ -653,7 +609,7 @@ export default {
653
609
  <span>{{ kubernetesVersion }}</span>
654
610
  </div>
655
611
  <div
656
- v-if="hasNodes"
612
+ v-if="architecture"
657
613
  data-testid="architecture__label"
658
614
  >
659
615
  <label>{{ t('glance.architecture') }}: </label>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import WorkloadNamespaceCard from './WorkloadNamespaceCard.vue';
3
+ import type { WorkloadDashboardByNamespaceCard, WorkloadDashboardNamespaceNavigateFn, WorkloadDashboardFilterByNamespaceFn } from './types';
4
+
5
+ defineProps<{
6
+ cards: WorkloadDashboardByNamespaceCard[];
7
+ navigateToNamespace: WorkloadDashboardNamespaceNavigateFn;
8
+ filterByNamespace: WorkloadDashboardFilterByNamespaceFn;
9
+ }>();
10
+ </script>
11
+
12
+ <template>
13
+ <div class="card-grid">
14
+ <WorkloadNamespaceCard
15
+ v-for="card in cards"
16
+ :key="card.title"
17
+ :title="card.title"
18
+ :rows="card.rows"
19
+ :navigate-to-namespace="navigateToNamespace"
20
+ :filter-by-namespace="filterByNamespace"
21
+ />
22
+ </div>
23
+ </template>
24
+
25
+ <style lang="scss" scoped>
26
+ .card-grid {
27
+ display: grid;
28
+ grid-template-columns: repeat(3, 1fr);
29
+ gap: 15px;
30
+ }
31
+ </style>