dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.2

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 (628) hide show
  1. package/assets/data/aws-regions.json +3 -0
  2. package/assets/icons/demo.css:Zone.Identifier +0 -0
  3. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  4. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  5. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  6. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  8. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  10. package/assets/images/icons/document.svg +3 -0
  11. package/assets/images/key.svg +17 -0
  12. package/assets/images/providers/sks.svg +1 -0
  13. package/assets/images/vendor/cognito.svg +1 -0
  14. package/assets/styles/app.scss +3 -0
  15. package/assets/styles/base/_basic.scss +10 -0
  16. package/assets/styles/base/_spacing.scss +29 -0
  17. package/assets/styles/base/_variables.scss +16 -10
  18. package/assets/styles/global/_labeled-input.scss +1 -1
  19. package/assets/styles/global/_layout.scss +1 -1
  20. package/assets/styles/themes/_dark.scss +30 -0
  21. package/assets/styles/themes/_light.scss +80 -2
  22. package/assets/translations/en-us.yaml +822 -105
  23. package/assets/translations/zh-hans.yaml +13 -3
  24. package/chart/__tests__/S3.test.ts +2 -1
  25. package/chart/monitoring/index.vue +1 -1
  26. package/cloud-credential/gcp.vue +9 -1
  27. package/components/ActionMenuShell.vue +3 -7
  28. package/components/AppModal.vue +9 -28
  29. package/components/AsyncButton.vue +2 -0
  30. package/components/BrandImage.vue +0 -21
  31. package/components/Certificates.vue +5 -0
  32. package/components/CodeMirror.vue +3 -3
  33. package/components/CommunityLinks.vue +3 -58
  34. package/components/ConfigMapSettings/Settings.vue +377 -0
  35. package/components/ConfigMapSettings/index.vue +354 -0
  36. package/components/CruResource.vue +103 -16
  37. package/components/DetailText.vue +61 -11
  38. package/components/Drawer/Chrome.vue +115 -0
  39. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  40. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  41. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  42. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  43. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  44. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  45. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  46. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  47. package/components/Drawer/ResourceDetailDrawer/index.vue +123 -0
  48. package/components/ExplorerProjectsNamespaces.vue +46 -29
  49. package/components/FilterPanel.vue +156 -0
  50. package/components/FixedBanner.vue +19 -5
  51. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  52. package/components/GrowlManager.vue +16 -15
  53. package/components/IconOrSvg.vue +19 -35
  54. package/components/KeyValueView.vue +1 -1
  55. package/components/LandingPagePreference.vue +2 -0
  56. package/components/Loading.vue +1 -1
  57. package/components/LocaleSelector.vue +10 -2
  58. package/components/PaginatedResourceTable.vue +53 -1
  59. package/components/ProgressBarMulti.vue +1 -0
  60. package/components/PromptModal.vue +38 -7
  61. package/components/PromptRemove.vue +5 -1
  62. package/components/PromptRestore.vue +22 -44
  63. package/components/RelatedResources.vue +4 -12
  64. package/components/Resource/Detail/Additional.vue +46 -0
  65. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  66. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  67. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  68. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  69. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  70. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  72. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  73. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  74. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  75. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  76. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  77. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  78. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  79. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  80. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  81. package/components/Resource/Detail/Card/index.vue +56 -0
  82. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  83. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  84. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  85. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  86. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  87. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  88. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  89. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +140 -0
  90. package/components/Resource/Detail/Metadata/KeyValue.vue +140 -0
  91. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  92. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  93. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  94. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  95. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  96. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  97. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  98. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  99. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  100. package/components/Resource/Detail/Metadata/index.vue +88 -0
  101. package/components/Resource/Detail/Page.vue +37 -0
  102. package/components/Resource/Detail/PercentageBar.vue +40 -0
  103. package/components/Resource/Detail/ResourceRow.vue +138 -0
  104. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  105. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  106. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  107. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  108. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  109. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  110. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  111. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  112. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  113. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  114. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  115. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  116. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  117. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  118. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  119. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  120. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  121. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  122. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  123. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  124. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  125. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  126. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  127. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  128. package/components/Resource/Detail/SpacedRow.vue +14 -0
  129. package/components/Resource/Detail/StatusBar.vue +59 -0
  130. package/components/Resource/Detail/StatusRow.vue +61 -0
  131. package/components/Resource/Detail/TitleBar/Title.vue +14 -0
  132. package/components/Resource/Detail/TitleBar/Top.vue +14 -0
  133. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  134. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  135. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  136. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  137. package/components/Resource/Detail/TitleBar/composables.ts +46 -0
  138. package/components/Resource/Detail/TitleBar/index.vue +204 -0
  139. package/components/Resource/Detail/Top/index.vue +34 -0
  140. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  141. package/components/Resource/Detail/composables.ts +45 -0
  142. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  143. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  144. package/components/ResourceDetail/Masthead/index.vue +65 -0
  145. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  146. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -1
  147. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  148. package/components/ResourceDetail/index.vue +75 -575
  149. package/components/ResourceDetail/legacy.vue +564 -0
  150. package/components/ResourceList/Masthead.vue +69 -20
  151. package/components/ResourceList/index.vue +3 -2
  152. package/components/ResourceTable.vue +59 -85
  153. package/components/ResourceYaml.vue +15 -2
  154. package/components/RichTranslation.vue +106 -0
  155. package/components/SlideInPanelManager.vue +116 -14
  156. package/components/SortableTable/index.vue +10 -2
  157. package/components/SortableTable/paging.js +15 -16
  158. package/components/SortableTable/selection.js +22 -10
  159. package/components/StateDot/index.vue +28 -0
  160. package/components/StatusBadge.vue +6 -4
  161. package/components/SubtleLink.vue +25 -0
  162. package/components/Tabbed/index.vue +38 -22
  163. package/components/Wizard.vue +16 -3
  164. package/components/YamlEditor.vue +1 -2
  165. package/components/__tests__/AsyncButton.test.ts +39 -0
  166. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  167. package/components/__tests__/CruResource.test.ts +63 -0
  168. package/components/__tests__/FilterPanel.test.ts +81 -0
  169. package/components/__tests__/GrowlManager.test.ts +0 -25
  170. package/components/__tests__/PromptModal.test.ts +146 -0
  171. package/components/__tests__/PromptRestore.test.ts +1 -65
  172. package/components/__tests__/RichTranslation.test.ts +115 -0
  173. package/components/auth/AuthBanner.vue +15 -14
  174. package/components/auth/Principal.vue +0 -1
  175. package/components/auth/RoleDetailEdit.vue +44 -4
  176. package/components/auth/login/ldap.vue +2 -2
  177. package/components/auth/login/oidc.vue +6 -1
  178. package/components/fleet/FleetApplications.vue +174 -0
  179. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  180. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  181. package/components/fleet/FleetClusters.vue +25 -6
  182. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  183. package/components/fleet/FleetHelmOps.vue +123 -0
  184. package/components/fleet/FleetIntro.vue +58 -28
  185. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  186. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  187. package/components/fleet/FleetRepos.vue +37 -80
  188. package/components/fleet/FleetResources.vue +69 -27
  189. package/components/fleet/FleetSummary.vue +26 -51
  190. package/components/fleet/FleetValuesFrom.vue +295 -0
  191. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  192. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  193. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  194. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  195. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  196. package/components/fleet/dashboard/Empty.vue +73 -0
  197. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  198. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  199. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  200. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  201. package/components/form/ArrayList.vue +144 -116
  202. package/components/form/BannerSettings.vue +117 -50
  203. package/components/form/ChangePassword.vue +3 -1
  204. package/components/form/ColorInput.vue +35 -6
  205. package/components/form/FileImageSelector.vue +1 -1
  206. package/components/form/Footer.vue +10 -4
  207. package/components/form/KeyValue.vue +92 -51
  208. package/components/form/LabeledSelect.vue +72 -54
  209. package/components/form/Labels.vue +91 -21
  210. package/components/form/MatchExpressions.vue +56 -9
  211. package/components/form/NameNsDescription.vue +12 -8
  212. package/components/form/Networking.vue +24 -19
  213. package/components/form/NotificationSettings.vue +15 -1
  214. package/components/form/ResourceLabeledSelect.vue +22 -8
  215. package/components/form/ResourceSelector.vue +27 -23
  216. package/components/form/ResourceTabs/index.vue +7 -1
  217. package/components/form/SSHKnownHosts/index.vue +14 -11
  218. package/components/form/SecretSelector.vue +18 -2
  219. package/components/form/Select.vue +57 -26
  220. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  221. package/components/form/SimpleSecretSelector.vue +17 -4
  222. package/components/form/Taints.vue +21 -2
  223. package/components/form/UnitInput.vue +21 -0
  224. package/components/form/ValueFromResource.vue +31 -19
  225. package/components/form/__tests__/ArrayList.test.ts +32 -0
  226. package/components/form/__tests__/ColorInput.test.ts +35 -0
  227. package/components/form/__tests__/KeyValue.test.ts +36 -0
  228. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  229. package/components/form/__tests__/Labels.test.ts +360 -0
  230. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  231. package/components/form/__tests__/Networking.test.ts +116 -0
  232. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  233. package/components/form/__tests__/Select.test.ts +37 -1
  234. package/components/form/__tests__/UnitInput.test.ts +23 -1
  235. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  236. package/components/formatter/ClusterLink.vue +5 -8
  237. package/components/formatter/Description.vue +30 -0
  238. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  239. package/components/formatter/FleetApplicationSource.vue +79 -0
  240. package/components/formatter/FleetSummaryGraph.vue +7 -0
  241. package/components/formatter/PodImages.vue +1 -1
  242. package/components/formatter/WorkloadHealthScale.vue +1 -1
  243. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  244. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  245. package/components/google/AccountAccess.vue +209 -0
  246. package/components/google/types/gcp.d.ts +136 -0
  247. package/components/google/types/index.d.ts +101 -0
  248. package/components/google/util/__mocks__/gcp.ts +465 -0
  249. package/components/google/util/formatter.ts +82 -0
  250. package/components/google/util/gcp.ts +134 -0
  251. package/components/google/util/index.d.ts +11 -0
  252. package/components/nav/Favorite.vue +1 -1
  253. package/components/nav/Group.vue +5 -0
  254. package/components/nav/Header.vue +24 -38
  255. package/components/nav/NamespaceFilter.vue +141 -84
  256. package/components/nav/NotificationCenter/Notification.vue +484 -0
  257. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  258. package/components/nav/NotificationCenter/index.vue +148 -0
  259. package/components/nav/TopLevelMenu.helper.ts +55 -34
  260. package/components/nav/TopLevelMenu.vue +11 -0
  261. package/components/nav/Type.vue +4 -1
  262. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  263. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  264. package/components/nav/WindowManager/index.vue +3 -2
  265. package/components/templates/default.vue +0 -3
  266. package/components/templates/plain.vue +0 -3
  267. package/composables/drawer.ts +26 -0
  268. package/composables/focusTrap.ts +3 -3
  269. package/composables/resources.test.ts +63 -0
  270. package/composables/resources.ts +38 -0
  271. package/composables/useI18n.ts +12 -11
  272. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  273. package/config/labels-annotations.js +22 -11
  274. package/config/pagination-table-headers.js +8 -1
  275. package/config/private-label.js +0 -1
  276. package/config/product/auth.js +20 -3
  277. package/config/product/{cis.js → compliance.js} +23 -26
  278. package/config/product/explorer.js +49 -17
  279. package/config/product/fleet.js +77 -17
  280. package/config/product/manager.js +1 -29
  281. package/config/product/settings.js +23 -11
  282. package/config/query-params.js +16 -1
  283. package/config/roles.ts +2 -1
  284. package/config/router/navigation-guards/authentication.js +51 -2
  285. package/config/router/navigation-guards/index.js +5 -67
  286. package/config/router/routes.js +65 -31
  287. package/config/secret.ts +15 -0
  288. package/config/settings.ts +33 -16
  289. package/config/store.js +2 -0
  290. package/config/system-namespaces.js +1 -1
  291. package/config/table-headers.js +91 -30
  292. package/config/types.js +18 -7
  293. package/config/version.js +1 -1
  294. package/core/plugin-helpers.ts +3 -2
  295. package/core/plugin.ts +32 -7
  296. package/core/types.ts +25 -7
  297. package/detail/catalog.cattle.io.app.vue +5 -1
  298. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  299. package/detail/fleet.cattle.io.bundle.vue +70 -6
  300. package/detail/fleet.cattle.io.cluster.vue +28 -15
  301. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  302. package/detail/fleet.cattle.io.helmop.vue +157 -0
  303. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  304. package/detail/management.cattle.io.oidcclient.vue +369 -0
  305. package/detail/namespace.vue +0 -3
  306. package/detail/node.vue +20 -16
  307. package/detail/pod.vue +2 -2
  308. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  309. package/detail/service.vue +10 -2
  310. package/detail/workload/index.vue +48 -39
  311. package/dialog/AddCustomBadgeDialog.vue +0 -1
  312. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  313. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  314. package/dialog/AssignToDialog.vue +176 -0
  315. package/dialog/ChangePasswordDialog.vue +106 -0
  316. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  317. package/dialog/DisableAuthProviderDialog.vue +101 -0
  318. package/dialog/DrainNode.vue +1 -1
  319. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  320. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  321. package/dialog/FeatureFlagListDialog.vue +288 -0
  322. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  323. package/dialog/GenericPrompt.vue +1 -1
  324. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  325. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  326. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  327. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  328. package/dialog/MoveNamespaceDialog.vue +157 -0
  329. package/dialog/OidcClientSecretDialog.vue +117 -0
  330. package/dialog/RedeployWorkloadDialog.vue +164 -0
  331. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  332. package/dialog/ScalePoolDownDialog.vue +1 -1
  333. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  334. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  335. package/dialog/WechatDialog.vue +57 -0
  336. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  337. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  338. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  339. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  340. package/edit/__tests__/service.test.ts +2 -1
  341. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  342. package/edit/auth/ldap/config.vue +24 -0
  343. package/edit/auth/oidc.vue +159 -93
  344. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  345. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  346. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  347. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  348. package/edit/configmap.vue +8 -2
  349. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  350. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  351. package/edit/fleet.cattle.io.helmop.vue +786 -0
  352. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  353. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  354. package/edit/logging-flow/index.vue +1 -0
  355. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  356. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
  357. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  358. package/edit/management.cattle.io.oidcclient.vue +162 -0
  359. package/edit/management.cattle.io.project.vue +4 -1
  360. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  361. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  362. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  363. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  364. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  365. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  366. package/edit/monitoring.coreos.com.route.vue +1 -0
  367. package/edit/namespace.vue +2 -4
  368. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  369. package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
  370. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  371. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  372. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
  373. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
  374. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  375. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  376. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  377. package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
  378. package/edit/node.vue +1 -0
  379. package/edit/persistentvolume/index.vue +4 -1
  380. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  381. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  382. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  383. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  384. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  385. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  386. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  387. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  388. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  389. package/edit/resources.cattle.io.restore.vue +1 -1
  390. package/edit/secret/basic.vue +1 -0
  391. package/edit/secret/index.vue +127 -15
  392. package/edit/service.vue +17 -29
  393. package/edit/serviceaccount.vue +4 -1
  394. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  395. package/edit/workload/index.vue +11 -15
  396. package/edit/workload/mixins/workload.js +0 -2
  397. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  398. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  399. package/list/fleet.cattle.io.helmop.vue +108 -0
  400. package/list/harvesterhci.io.management.cluster.vue +0 -17
  401. package/list/management.cattle.io.feature.vue +4 -288
  402. package/list/management.cattle.io.oidcclient.vue +108 -0
  403. package/list/management.cattle.io.user.vue +13 -20
  404. package/list/namespace.vue +6 -2
  405. package/list/node.vue +2 -0
  406. package/list/projectsecret.vue +345 -0
  407. package/list/secret.vue +109 -0
  408. package/list/workload.vue +6 -2
  409. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  410. package/machine-config/amazonec2.vue +3 -24
  411. package/machine-config/components/GCEImage.vue +374 -0
  412. package/machine-config/google.vue +617 -0
  413. package/machine-config/vmwarevsphere.vue +7 -17
  414. package/mixins/__tests__/brand.spec.ts +170 -0
  415. package/mixins/auth-config.js +8 -1
  416. package/mixins/brand.js +16 -17
  417. package/mixins/create-edit-view/impl.js +10 -1
  418. package/mixins/create-edit-view/index.js +5 -0
  419. package/mixins/preset.js +100 -0
  420. package/mixins/resource-fetch-api-pagination.js +73 -44
  421. package/mixins/resource-fetch.js +18 -8
  422. package/mixins/resource-table-watch.js +45 -0
  423. package/mixins/vue-select-overrides.js +1 -4
  424. package/models/__tests__/chart.test.ts +296 -0
  425. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  426. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  427. package/models/__tests__/node.test.ts +7 -63
  428. package/models/__tests__/workload.test.ts +1 -0
  429. package/models/chart.js +157 -2
  430. package/models/cluster/node.js +2 -1
  431. package/models/cluster.js +32 -2
  432. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  433. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  434. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  435. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  436. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  437. package/models/fleet-application.js +297 -0
  438. package/models/fleet.cattle.io.bundle.js +9 -8
  439. package/models/fleet.cattle.io.cluster.js +21 -4
  440. package/models/fleet.cattle.io.gitrepo.js +46 -382
  441. package/models/fleet.cattle.io.helmop.js +202 -0
  442. package/models/management.cattle.io.authconfig.js +1 -0
  443. package/models/management.cattle.io.cluster.js +0 -20
  444. package/models/management.cattle.io.feature.js +7 -1
  445. package/models/management.cattle.io.fleetworkspace.js +14 -1
  446. package/models/management.cattle.io.node.js +7 -22
  447. package/models/management.cattle.io.nodepool.js +12 -0
  448. package/models/management.cattle.io.oidcclient.js +18 -0
  449. package/models/management.cattle.io.registration.js +3 -0
  450. package/models/management.cattle.io.setting.js +0 -1
  451. package/models/namespace.js +12 -1
  452. package/models/provisioning.cattle.io.cluster.js +60 -97
  453. package/models/secret.js +157 -2
  454. package/models/service.js +28 -9
  455. package/models/storage.k8s.io.storageclass.js +2 -2
  456. package/models/workload.js +91 -51
  457. package/package.json +6 -5
  458. package/pages/about.vue +17 -61
  459. package/pages/account/index.vue +9 -1
  460. package/pages/auth/login.vue +2 -3
  461. package/pages/auth/verify.vue +13 -1
  462. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  463. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  464. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  465. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  466. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  467. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  468. package/pages/c/_cluster/auth/roles/index.vue +19 -48
  469. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  470. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  471. package/pages/c/_cluster/explorer/index.vue +14 -3
  472. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  473. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  474. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  475. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  476. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  477. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  478. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  479. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  480. package/pages/c/_cluster/fleet/index.vue +866 -328
  481. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  482. package/pages/c/_cluster/longhorn/index.vue +5 -2
  483. package/pages/c/_cluster/settings/banners.vue +56 -2
  484. package/pages/c/_cluster/settings/brand.vue +2 -1
  485. package/pages/c/_cluster/settings/performance.vue +7 -26
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  487. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  488. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  489. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  490. package/pages/explorer/resource/detail/configmap.vue +42 -0
  491. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  492. package/pages/explorer/resource/detail/secret.vue +63 -0
  493. package/pages/home.vue +8 -104
  494. package/pages/prefs.vue +0 -1
  495. package/pages/support/index.vue +4 -6
  496. package/plugins/clean-html.js +2 -0
  497. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  498. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  499. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  500. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  501. package/plugins/dashboard-store/actions.js +212 -55
  502. package/plugins/dashboard-store/getters.js +112 -24
  503. package/plugins/dashboard-store/mutations.js +61 -12
  504. package/plugins/dashboard-store/normalize.js +29 -19
  505. package/plugins/dashboard-store/resource-class.js +132 -49
  506. package/plugins/steve/__tests__/getters.test.ts +19 -12
  507. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  508. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  509. package/plugins/steve/actions.js +37 -24
  510. package/plugins/steve/getters.js +47 -12
  511. package/plugins/steve/resourceWatcher.js +10 -3
  512. package/plugins/steve/steve-class.js +5 -0
  513. package/plugins/steve/steve-pagination-utils.ts +225 -43
  514. package/plugins/steve/subscribe.js +418 -53
  515. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  516. package/rancher-components/Banner/Banner.test.ts +51 -3
  517. package/rancher-components/Banner/Banner.vue +37 -6
  518. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  519. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  520. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  521. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  522. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  523. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  524. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  525. package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
  526. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  527. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  528. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  529. package/rancher-components/RcButton/RcButton.vue +1 -1
  530. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  531. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  532. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  533. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  534. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  535. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
  536. package/rancher-components/RcDropdown/index.ts +2 -0
  537. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  538. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  539. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  540. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  541. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  542. package/rancher-components/RcItemCard/index.ts +2 -0
  543. package/rancher-components/StringList/StringList.vue +1 -1
  544. package/scripts/extension/publish +1 -1
  545. package/static/loading-indicator.html +1 -1
  546. package/store/action-menu.js +26 -56
  547. package/store/auth.js +3 -0
  548. package/store/catalog.js +85 -25
  549. package/store/features.js +0 -1
  550. package/store/growl.js +97 -8
  551. package/store/i18n.js +1 -1
  552. package/store/index.js +44 -14
  553. package/store/notifications.ts +426 -0
  554. package/store/prefs.js +2 -8
  555. package/store/slideInPanel.ts +6 -0
  556. package/store/type-map.js +34 -17
  557. package/store/type-map.utils.ts +49 -6
  558. package/store/uiplugins.ts +15 -1
  559. package/types/fleet.d.ts +60 -1
  560. package/types/kube/kube-api.ts +34 -0
  561. package/types/notifications/index.ts +74 -0
  562. package/types/resources/fleet.d.ts +43 -0
  563. package/types/resources/pod-security-admission.ts +36 -0
  564. package/types/resources/settings.d.ts +107 -0
  565. package/types/resources/userPreferences.d.ts +13 -0
  566. package/types/shell/index.d.ts +971 -745
  567. package/types/store/dashboard-store.types.ts +57 -4
  568. package/types/store/pagination.types.ts +41 -9
  569. package/types/store/subscribe.types.ts +50 -0
  570. package/utils/__mocks__/tabbable.js +13 -0
  571. package/utils/__tests__/back-off.test.ts +354 -0
  572. package/utils/__tests__/create-yaml.test.ts +235 -0
  573. package/utils/__tests__/fleet.test.ts +148 -0
  574. package/utils/__tests__/kontainer.test.ts +19 -0
  575. package/utils/__tests__/object.test.ts +54 -1
  576. package/utils/__tests__/string.test.ts +273 -1
  577. package/utils/__tests__/time.test.ts +31 -0
  578. package/utils/auth.js +41 -6
  579. package/utils/back-off.ts +176 -0
  580. package/utils/cluster.js +24 -20
  581. package/utils/create-yaml.js +103 -9
  582. package/utils/crypto/encryption.ts +103 -0
  583. package/utils/cspAdaptor.ts +51 -0
  584. package/utils/error.js +0 -5
  585. package/utils/fleet-types.ts +0 -0
  586. package/utils/fleet.ts +204 -74
  587. package/utils/grafana.js +1 -0
  588. package/utils/kontainer.ts +3 -5
  589. package/utils/object.js +36 -12
  590. package/utils/pagination-utils.ts +50 -3
  591. package/utils/pagination-wrapper.ts +132 -50
  592. package/utils/perf-setting.utils.ts +28 -0
  593. package/utils/release-notes.ts +48 -0
  594. package/utils/selector-typed.ts +210 -0
  595. package/utils/selector.js +29 -6
  596. package/utils/settings.ts +4 -1
  597. package/utils/string.js +24 -0
  598. package/utils/style.ts +39 -0
  599. package/utils/{time.js → time.ts} +25 -6
  600. package/utils/uiplugins.ts +41 -8
  601. package/utils/v-sphere.ts +5 -1
  602. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  603. package/utils/validators/formRules/index.ts +99 -4
  604. package/utils/window.js +11 -7
  605. package/.DS_Store +0 -0
  606. package/components/AssignTo.vue +0 -199
  607. package/components/DisableAuthProviderModal.vue +0 -115
  608. package/components/MoveModal.vue +0 -167
  609. package/components/PromptChangePassword.vue +0 -123
  610. package/components/ResourceList/Masthead-btn.vue +0 -225
  611. package/components/__tests__/ApplicationCard.test.ts +0 -27
  612. package/components/cards/ApplicationCard.vue +0 -145
  613. package/components/fleet/FleetBundleResources.vue +0 -86
  614. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  615. package/components/formatter/RKETemplateName.vue +0 -37
  616. package/config/product/legacy.js +0 -62
  617. package/config/secret.js +0 -14
  618. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  619. package/models/etcdbackup.js +0 -45
  620. package/pages/auth copy/login.vue +0 -595
  621. package/pages/auth copy/logout.vue +0 -47
  622. package/pages/auth copy/setup.vue +0 -523
  623. package/pages/auth copy/verify.vue +0 -203
  624. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  625. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  626. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  627. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  628. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
package/models/chart.js CHANGED
@@ -1,9 +1,12 @@
1
- import { compatibleVersionsFor } from '@shell/store/catalog';
1
+ import { compatibleVersionsFor, APP_UPGRADE_STATUS } from '@shell/store/catalog';
2
2
  import {
3
- REPO_TYPE, REPO, CHART, VERSION, _FLAGGED, HIDE_SIDE_NAV
3
+ REPO_TYPE, REPO, CHART, VERSION, _FLAGGED, HIDE_SIDE_NAV, CATEGORY, TAG
4
4
  } from '@shell/config/query-params';
5
5
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
6
6
  import SteveModel from '@shell/plugins/steve/steve-class';
7
+ import { CATALOG, ZERO_TIME } from '@shell/config/types';
8
+ import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
9
+ import day from 'dayjs';
7
10
 
8
11
  export default class Chart extends SteveModel {
9
12
  queryParams(from, hideSideNav) {
@@ -47,4 +50,156 @@ export default class Chart extends SteveModel {
47
50
  query,
48
51
  });
49
52
  }
53
+
54
+ /**
55
+ * Returns the list of installed apps that match this chart by:
56
+ * - chart name
57
+ * - repository name
58
+ * - and either:
59
+ * - the home URL matches the latest version’s home URL
60
+ * - or version + home URL match any other known version
61
+ *
62
+ * Inverse logic of `matchingCharts` in `catalog.cattle.io.app.js`.
63
+ *
64
+ * @returns {Array<Object>} List of matching installed app objects.
65
+ */
66
+ get matchingInstalledApps() {
67
+ const latestVersion = this.versions?.[0] || [];
68
+ const appHome = latestVersion?.home;
69
+ const installedApps = this.$rootGetters['cluster/all'](CATALOG.APP);
70
+
71
+ return installedApps.filter((installedApp) => {
72
+ const metadata = installedApp?.spec?.chart?.metadata;
73
+ const name = metadata?.name;
74
+ const version = metadata?.version;
75
+ const home = metadata?.home;
76
+
77
+ const repoName = metadata?.annotations?.[CATALOG_ANNOTATIONS.SOURCE_REPO_NAME] ||
78
+ installedApp?.metadata?.labels?.[CATALOG_ANNOTATIONS.CLUSTER_REPO_NAME];
79
+
80
+ // name and repo should match
81
+ if (name !== this.chartName || !repoName || repoName !== this.repoName) {
82
+ return false;
83
+ }
84
+
85
+ // match by comparing home URL in the latest version vs home URL from the installed app
86
+ if (appHome && home === appHome) {
87
+ return true;
88
+ }
89
+
90
+ // match by version + home for the rest
91
+ return this.versions?.some((v) => v.version === version && home === appHome);
92
+ });
93
+ }
94
+
95
+ /**
96
+ * Determines if the chart is installed by checking if exactly one matching installed app is found.
97
+ *
98
+ * @returns {boolean} `true` if the chart is currently installed.
99
+ */
100
+ get isInstalled() {
101
+ return this.matchingInstalledApps.length === 1;
102
+ }
103
+
104
+ /**
105
+ * Determines if the installed app has a single available upgrade.
106
+ * Requires the chart to be installed.
107
+ *
108
+ * @returns {boolean} `true` if the app is installed and has a single upgrade available.
109
+ */
110
+ get upgradeable() {
111
+ return this.isInstalled && this.matchingInstalledApps[0].upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
112
+ }
113
+
114
+ /**
115
+ * Builds structured metadata for display in RcItemCard.vue:
116
+ * - Sub-header (version and last updated)
117
+ * - Footer (repository, categories, tags)
118
+ * - Status indicators (e.g. deprecated, upgradeable, installed)
119
+ *
120
+ * @returns {Object} Card content object with `subHeaderItems`, `footerItems`, and `statuses` arrays.
121
+ */
122
+ get cardContent() {
123
+ if (!this._cardContent) {
124
+ const latestVersion = this.versions?.[0] || {};
125
+ const subHeaderItems = [];
126
+
127
+ if (latestVersion) {
128
+ const hasZeroTime = latestVersion.created === ZERO_TIME;
129
+
130
+ subHeaderItems.push({
131
+ icon: 'icon-version-alt',
132
+ iconTooltip: { key: 'tableHeaders.version' },
133
+ label: latestVersion.version
134
+ });
135
+
136
+ const lastUpdatedItem = {
137
+ icon: 'icon-refresh-alt',
138
+ iconTooltip: { key: 'tableHeaders.lastUpdated' },
139
+ label: hasZeroTime ? this.t('generic.na') : day(latestVersion.created).format('MMM D, YYYY')
140
+ };
141
+
142
+ if (hasZeroTime) {
143
+ lastUpdatedItem.labelTooltip = this.t('catalog.charts.appChartCard.subHeaderItem.missingVersionDate');
144
+ }
145
+
146
+ subHeaderItems.push(lastUpdatedItem);
147
+ }
148
+
149
+ const footerItems = [
150
+ {
151
+ type: REPO,
152
+ icon: 'icon-repository-alt',
153
+ iconTooltip: { key: 'tableHeaders.repoName' },
154
+ labels: [this.repoNameDisplay]
155
+ }
156
+ ];
157
+
158
+ if (this.categories.length) {
159
+ footerItems.push( {
160
+ type: CATEGORY,
161
+ icon: 'icon-category-alt',
162
+ iconTooltip: { key: 'generic.category' },
163
+ labels: this.categories
164
+ });
165
+ }
166
+
167
+ if (this.tags.length) {
168
+ footerItems.push({
169
+ type: TAG,
170
+ icon: 'icon-tag-alt',
171
+ iconTooltip: { key: 'generic.tags' },
172
+ labels: this.tags
173
+ });
174
+ }
175
+
176
+ const statuses = [];
177
+
178
+ if (this.deprecated) {
179
+ statuses.push({
180
+ icon: 'icon-alert-alt', color: 'error', tooltip: { key: 'generic.deprecated' }
181
+ });
182
+ }
183
+
184
+ if (this.upgradeable) {
185
+ statuses.push({
186
+ icon: 'icon-upgrade-alt', color: 'info', tooltip: { key: 'generic.upgradeable' }
187
+ });
188
+ }
189
+
190
+ if (this.isInstalled) {
191
+ statuses.push({
192
+ icon: 'icon-confirmation-alt', color: 'success', tooltip: { key: 'generic.installed' }
193
+ });
194
+ }
195
+
196
+ this._cardContent = {
197
+ subHeaderItems,
198
+ footerItems,
199
+ statuses
200
+ };
201
+ }
202
+
203
+ return this._cardContent;
204
+ }
50
205
  }
@@ -227,7 +227,7 @@ export default class ClusterNode extends SteveModel {
227
227
  }
228
228
 
229
229
  get podCapacity() {
230
- return Number.parseInt(this.status.capacity?.pods);
230
+ return parseSi(this.status.capacity?.pods);
231
231
  }
232
232
 
233
233
  get podConsumed() {
@@ -408,6 +408,7 @@ export default class ClusterNode extends SteveModel {
408
408
  }
409
409
 
410
410
  get pods() {
411
+ // This fetches all pods that are in the store, rather than all pods in the cluster
411
412
  const allPods = this.$rootGetters['cluster/all'](POD);
412
413
 
413
414
  return allPods.filter((pod) => pod.spec.nodeName === this.name);
package/models/cluster.js CHANGED
@@ -33,10 +33,40 @@ export default class NormanCluster extends NormanModel {
33
33
  return !!(this.systemAnnotations || []).length;
34
34
  }
35
35
 
36
+ /**
37
+ * Return the namespace of the v1 prov cluster.
38
+ *
39
+ * Used to construct the prov cluster id
40
+ *
41
+ * objectset.rio.cattle.io/owner-namespace annotation is applied to v3 clusters that were automatically created following the creation of a v1 prov cluster
42
+ */
43
+ get provisioningClusterNs() {
44
+ return this.annotations?.['objectset.rio.cattle.io/owner-namespace'] || 'fleet-default';
45
+ }
46
+
47
+ /**
48
+ * Return the name of the v1 prov cluster (note - not the human name, but usually is)
49
+ *
50
+ * Used to construct the prov cluster id.
51
+ *
52
+ * It could be two different forms. If the v1 prov cluster was created ..
53
+ * - automatically following the creation of a v3 cluster = id is the v3 cluster id
54
+ * - directly by the user = id is the (roughly) human name, which is this.id
55
+ *
56
+ * objectset.rio.cattle.io/owner-namespace annotation is applied to v3 clusters that were automatically created following the creation of a v1 prov cluster
57
+ *
58
+ */
59
+ get provisioningClusterName() {
60
+ return this.annotations?.['objectset.rio.cattle.io/owner-name'] || this.id;
61
+ }
62
+
63
+ get provisioningClusterId() {
64
+ return `${ this.provisioningClusterNs }/${ this.provisioningClusterName }`;
65
+ }
66
+
36
67
  waitForProvisioning(timeout = 60000, interval) {
37
68
  return this.waitForTestFn(() => {
38
- const ns = this.annotations['objectset.rio.cattle.io/owner-namespace'] || 'fleet-default';
39
- const id = `${ ns }/${ this.id }`;
69
+ const id = this.provisioningClusterId;
40
70
 
41
71
  return id && !!this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, id);
42
72
  }, this.$rootGetters['i18n/t']('cluster.managementTimeout'), timeout, interval);
@@ -125,7 +125,7 @@ export default class CapiMachineDeployment extends SteveModel {
125
125
  return;
126
126
  }
127
127
 
128
- const initialValue = this.cluster.toJSON();
128
+ const initialValue = this.cluster;
129
129
 
130
130
  this.inClusterSpec.quantity += delta;
131
131
 
@@ -145,7 +145,16 @@ export default class CapiMachineDeployment extends SteveModel {
145
145
  let errors = exceptionToErrorsArray(err);
146
146
 
147
147
  if ( err.status === 409 && depth < 2 ) {
148
- const conflicts = await handleConflict(initialValue, value, liveModel, this.$rootGetters, { dispatch: this.$dispatch }, 'management');
148
+ const conflicts = await handleConflict(
149
+ initialValue,
150
+ value,
151
+ liveModel,
152
+ {
153
+ dispatch: this.$dispatch,
154
+ getters: this.$rootGetters
155
+ },
156
+ 'management'
157
+ );
149
158
 
150
159
  if ( conflicts === false ) {
151
160
  // It was automatically figured out, save again
@@ -1,5 +1,5 @@
1
- import { NAME as PRODUCT_NAME } from '@shell/config/product/cis';
2
- import { CIS } from '@shell/config/types';
1
+ import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
2
+ import { COMPLIANCE } from '@shell/config/types';
3
3
  import { findBy } from '@shell/utils/array';
4
4
  import { downloadFile, generateZip } from '@shell/utils/download';
5
5
  import { get, isEmpty } from '@shell/utils/object';
@@ -53,7 +53,7 @@ export default class ClusterScan extends SteveModel {
53
53
  action: 'downloadLatestReport',
54
54
  enabled: this.hasReport,
55
55
  icon: 'icon icon-fw icon-download',
56
- label: t('cis.downloadReport'),
56
+ label: t('compliance.downloadReport'),
57
57
  total: 1,
58
58
  };
59
59
 
@@ -61,7 +61,7 @@ export default class ClusterScan extends SteveModel {
61
61
  action: 'downloadAllReports',
62
62
  enabled: this.hasReport,
63
63
  icon: 'icon icon-fw icon-download',
64
- label: t('cis.downloadAllReports'),
64
+ label: t('compliance.downloadAllReports'),
65
65
  total: 1,
66
66
  };
67
67
 
@@ -69,7 +69,7 @@ export default class ClusterScan extends SteveModel {
69
69
  out.unshift({ divider: true });
70
70
  if (this.spec?.scheduledScanConfig?.cronSchedule) {
71
71
  out.unshift(downloadAllReports);
72
- downloadReport.label = t('cis.downloadLatestReport');
72
+ downloadReport.label = t('compliance.downloadLatestReport');
73
73
  }
74
74
  out.unshift(downloadReport);
75
75
  }
@@ -92,7 +92,7 @@ export default class ClusterScan extends SteveModel {
92
92
  get hasReports() {
93
93
  const { relationships = [] } = this.metadata;
94
94
 
95
- const reportRel = findBy(relationships, 'toType', CIS.REPORT);
95
+ const reportRel = findBy(relationships, 'toType', COMPLIANCE.REPORT);
96
96
 
97
97
  return !!reportRel;
98
98
  }
@@ -100,7 +100,7 @@ export default class ClusterScan extends SteveModel {
100
100
  async getReports() {
101
101
  const owned = await this.findOwned();
102
102
 
103
- const reports = owned.filter((obj) => obj.type === CIS.REPORT) || [];
103
+ const reports = owned.filter((obj) => obj.type === COMPLIANCE.REPORT) || [];
104
104
 
105
105
  return sortBy(reports, 'metadata.creationTimestamp', true);
106
106
  }
@@ -158,7 +158,7 @@ export default class ClusterScan extends SteveModel {
158
158
  return {
159
159
  name: 'c-cluster-product-resource-id',
160
160
  params: {
161
- resource: CIS.CLUSTER_SCAN_PROFILE,
161
+ resource: COMPLIANCE.CLUSTER_SCAN_PROFILE,
162
162
  product: PRODUCT_NAME,
163
163
  id: this.status?.lastRunScanProfileName
164
164
  }
@@ -3,7 +3,7 @@ import SteveModel from '@shell/plugins/steve/steve-class';
3
3
 
4
4
  export default class ClusterScanBenchmark extends SteveModel {
5
5
  warnDeletionMessage(toRemove = []) {
6
- return this.$rootGetters['i18n/t']('cis.deleteBenchmarkWarning', { count: toRemove.length });
6
+ return this.$rootGetters['i18n/t']('compliance.deleteBenchmarkWarning', { count: toRemove.length });
7
7
  }
8
8
 
9
9
  get isDefault() {
@@ -1,11 +1,11 @@
1
1
 
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
- import { NAME as PRODUCT_NAME } from '@shell/config/product/cis';
4
- import { CIS } from '@shell/config/types';
3
+ import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
4
+ import { COMPLIANCE } from '@shell/config/types';
5
5
 
6
- export default class CISProfile extends SteveModel {
6
+ export default class ComplianceProfile extends SteveModel {
7
7
  warnDeletionMessage(toRemove = []) {
8
- return this.$rootGetters['i18n/t']('cis.deleteProfileWarning', { count: toRemove.length });
8
+ return this.$rootGetters['i18n/t']('compliance.deleteProfileWarning', { count: toRemove.length });
9
9
  }
10
10
 
11
11
  get numberTestsSkipped() {
@@ -19,7 +19,7 @@ export default class CISProfile extends SteveModel {
19
19
  return {
20
20
  name: 'c-cluster-product-resource-id',
21
21
  params: {
22
- resource: CIS.BENCHMARK,
22
+ resource: COMPLIANCE.BENCHMARK,
23
23
  product: PRODUCT_NAME,
24
24
  id: this.spec?.benchmarkVersion
25
25
  }
@@ -1,7 +1,7 @@
1
1
  import { compare } from '@shell/utils/sort';
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
3
 
4
- export default class CISReport extends SteveModel {
4
+ export default class ComplianceReport extends SteveModel {
5
5
  get aggregatedTests() {
6
6
  const json = this.parsedReport;
7
7
  const results = json?.results;
@@ -0,0 +1,297 @@
1
+ import { matching, convertSelectorObj } from '@shell/utils/selector';
2
+ import isEmpty from 'lodash/isEmpty';
3
+ import { escapeHtml } from '@shell/utils/string';
4
+ import { FLEET, MANAGEMENT } from '@shell/config/types';
5
+ import { FLEET as FLEET_ANNOTATIONS } from '@shell/config/labels-annotations';
6
+ import { addObject, addObjects, findBy } from '@shell/utils/array';
7
+ import SteveModel from '@shell/plugins/steve/steve-class';
8
+ import { mapStateToEnum, primaryDisplayStatusFromCount, STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
9
+ import FleetUtils from '@shell/utils/fleet';
10
+
11
+ function normalizeStateCounts(data) {
12
+ if (isEmpty(data)) {
13
+ return {
14
+ total: 0,
15
+ states: {},
16
+ };
17
+ }
18
+ const { desiredReady, ...rest } = data ;
19
+ const states = Object.entries(rest).reduce((res, [key, value]) => {
20
+ res[mapStateToEnum(key)] = value;
21
+
22
+ return res;
23
+ }, {});
24
+
25
+ return {
26
+ total: desiredReady,
27
+ states,
28
+ };
29
+ }
30
+
31
+ export default class FleetApplication extends SteveModel {
32
+ get currentUser() {
33
+ return this.$rootGetters['auth/v3User'] || {};
34
+ }
35
+
36
+ pause() {
37
+ this.spec.paused = true;
38
+ this.save();
39
+ }
40
+
41
+ unpause() {
42
+ this.spec.paused = false;
43
+ this.save();
44
+ }
45
+
46
+ goToClone() {
47
+ if (this.metadata?.labels?.[FLEET_ANNOTATIONS.CREATED_BY_USER_ID]) {
48
+ delete this.metadata.labels[FLEET_ANNOTATIONS.CREATED_BY_USER_ID];
49
+ }
50
+
51
+ if (this.metadata?.labels?.[FLEET_ANNOTATIONS.CREATED_BY_USER_NAME]) {
52
+ delete this.metadata.labels[FLEET_ANNOTATIONS.CREATED_BY_USER_NAME];
53
+ }
54
+
55
+ super.goToClone();
56
+ }
57
+
58
+ get state() {
59
+ if (this.spec?.paused === true) {
60
+ return 'paused';
61
+ }
62
+
63
+ return this.metadata?.state?.name || 'unknown';
64
+ }
65
+
66
+ get targetClusters() {
67
+ const workspace = this.$getters['byId'](FLEET.WORKSPACE, this.metadata.namespace);
68
+ const clusters = workspace?.clusters || [];
69
+ const groups = workspace?.clusterGroups || [];
70
+
71
+ if (workspace?.id === 'fleet-local') {
72
+ // should we be getting the clusters from workspace.clusters instead of having to rely on the groups,
73
+ // which takes an additional request to be done on the Fleet dashboard screen?
74
+ const local = findBy(groups, 'id', 'fleet-local/default');
75
+
76
+ if (local) {
77
+ return local.targetClusters;
78
+ }
79
+
80
+ return [];
81
+ }
82
+
83
+ if (!this.spec.targets) {
84
+ return [];
85
+ }
86
+
87
+ const out = [];
88
+
89
+ for (const tgt of this.spec.targets) {
90
+ if (tgt.clusterName) {
91
+ const cluster = findBy(clusters, 'metadata.name', tgt.clusterName);
92
+
93
+ if (cluster) {
94
+ addObject(out, cluster);
95
+ }
96
+ } else if (tgt.clusterGroup) {
97
+ const group = findBy(groups, {
98
+ 'metadata.namespace': this.metadata.namespace,
99
+ 'metadata.name': tgt.clusterGroup,
100
+ });
101
+
102
+ if (group) {
103
+ addObjects(out, group.targetClusters);
104
+ }
105
+ } else if (tgt.clusterGroupSelector) {
106
+ const expressions = convertSelectorObj(tgt.clusterGroupSelector);
107
+ const matchingGroups = matching(groups, expressions);
108
+
109
+ for (const group of matchingGroups) {
110
+ addObjects(out, group.targetClusters);
111
+ }
112
+ } else if (tgt.clusterSelector) {
113
+ const expressions = convertSelectorObj(tgt.clusterSelector);
114
+ const matchingClusters = matching(clusters, expressions);
115
+
116
+ addObjects(out, matchingClusters);
117
+ }
118
+ }
119
+
120
+ return out;
121
+ }
122
+
123
+ get targetInfo() {
124
+ const mode = FleetUtils.Application.getTargetMode(this.spec.targets || [], this.metadata.namespace);
125
+
126
+ return {
127
+ mode,
128
+ modeDisplay: this.t(`fleet.gitRepo.targetDisplay."${ mode }"`),
129
+ };
130
+ }
131
+
132
+ get groupByLabel() {
133
+ const name = this.metadata.namespace;
134
+
135
+ if (name) {
136
+ return this.$rootGetters['i18n/t']('resourceTable.groupLabel.workspace', { name: escapeHtml(name) });
137
+ } else {
138
+ return this.$rootGetters['i18n/t']('resourceTable.groupLabel.notInAWorkspace');
139
+ }
140
+ }
141
+
142
+ get allResourceStatuses() {
143
+ return normalizeStateCounts(this.status?.resourceCounts || {});
144
+ }
145
+
146
+ statusResourceCountsForCluster(clusterId) {
147
+ if (!this.targetClusters.some((c) => c.id === clusterId)) {
148
+ return {};
149
+ }
150
+
151
+ return this.status?.perClusterResourceCounts[clusterId] || { desiredReady: 0 };
152
+ }
153
+
154
+ get resourcesStatuses() {
155
+ if (isEmpty(this.status?.resources)) {
156
+ return [];
157
+ }
158
+
159
+ const clusters = (this.targetClusters || []).reduce((res, c) => {
160
+ res[c.id] = c;
161
+
162
+ return res;
163
+ }, {});
164
+
165
+ const resources = this.status?.resources?.reduce((acc, resourceInfo) => {
166
+ const { perClusterState, ...resource } = resourceInfo;
167
+
168
+ if (Object.entries(perClusterState).length === 0) {
169
+ (this.targetClusters || []).forEach((cluster) => {
170
+ acc.push(Object.assign({}, resource, { clusterId: cluster.id, state: resource.state }));
171
+ });
172
+ } else {
173
+ Object.entries(perClusterState).forEach(([state, clusterIds]) => {
174
+ clusterIds.filter((id) => !!clusters[id]).forEach((clusterId) => {
175
+ acc.push(Object.assign({}, resource, { clusterId, state }));
176
+ });
177
+ });
178
+ }
179
+
180
+ return acc;
181
+ }, []);
182
+
183
+ return resources.map((r) => {
184
+ const { namespace, name, clusterId } = r;
185
+ const type = FleetUtils.resourceType(r);
186
+ const c = clusters[clusterId];
187
+
188
+ return {
189
+ key: `${ clusterId }-${ type }-${ namespace }-${ name }`,
190
+
191
+ // Needed?
192
+ id: FleetUtils.resourceId(r),
193
+ type,
194
+ clusterId,
195
+
196
+ // columns, see FleetResources.vue
197
+ state: mapStateToEnum(r.state),
198
+ clusterName: c.nameDisplay,
199
+ apiVersion: r.apiVersion,
200
+ kind: r.kind,
201
+ name,
202
+ namespace,
203
+
204
+ // other properties
205
+ detailLocation: FleetUtils.detailLocation(r, c.metadata.labels[FLEET_ANNOTATIONS.CLUSTER_NAME]),
206
+ };
207
+ });
208
+ }
209
+
210
+ get clusterInfo() {
211
+ const ready = this.status?.readyClusters || 0;
212
+ const total = this.status?.desiredReadyClusters || 0;
213
+
214
+ return {
215
+ ready,
216
+ unready: total - ready,
217
+ total,
218
+ };
219
+ }
220
+
221
+ clusterState(clusterId) {
222
+ const resourceCounts = this.statusResourceCountsForCluster(clusterId);
223
+
224
+ return primaryDisplayStatusFromCount(resourceCounts) || STATES_ENUM.ACTIVE;
225
+ }
226
+
227
+ get authorId() {
228
+ return this.metadata?.labels?.[FLEET_ANNOTATIONS.CREATED_BY_USER_ID];
229
+ }
230
+
231
+ get author() {
232
+ if (this.authorId) {
233
+ return this.$rootGetters['management/byId'](MANAGEMENT.USER, this.authorId);
234
+ }
235
+
236
+ return null;
237
+ }
238
+
239
+ get createdBy() {
240
+ const displayName = this.metadata?.labels?.[FLEET_ANNOTATIONS.CREATED_BY_USER_NAME];
241
+
242
+ if (!displayName) {
243
+ return null;
244
+ }
245
+
246
+ return {
247
+ displayName,
248
+ location: !this.author ? null : {
249
+ name: 'c-cluster-product-resource-id',
250
+ params: {
251
+ cluster: '_',
252
+ product: 'auth',
253
+ resource: MANAGEMENT.USER,
254
+ id: this.author.id,
255
+ }
256
+ }
257
+ };
258
+ }
259
+
260
+ get showCreatedBy() {
261
+ return !!this.createdBy;
262
+ }
263
+
264
+ get clustersList() {
265
+ return this.$getters['all'](FLEET.CLUSTER);
266
+ }
267
+
268
+ get readyClusters() {
269
+ return this.status?.readyClusters || 0;
270
+ }
271
+
272
+ get meta() {
273
+ return this.currentRoute()?.meta || {};
274
+ }
275
+
276
+ get _detailLocation() {
277
+ return {
278
+ ...super._detailLocation,
279
+ name: this.meta.detailLocation || super._detailLocation.name
280
+ };
281
+ }
282
+
283
+ get doneOverride() {
284
+ return {
285
+ ...super.listLocation,
286
+ name: this.meta.doneOverride || super.listLocation.name
287
+ };
288
+ }
289
+
290
+ get doneRoute() {
291
+ return this.doneOverride?.name;
292
+ }
293
+
294
+ get parentNameOverride() {
295
+ return this.$rootGetters['i18n/t'](`typeLabel."${ FLEET.APPLICATION }"`, { count: 1 })?.trim();
296
+ }
297
+ }
@@ -1,6 +1,5 @@
1
1
  import { escapeHtml, ucFirst } from '@shell/utils/string';
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
- import typeHelper from '@shell/utils/type-helpers';
4
3
  import { addObject, addObjects, findBy } from '@shell/utils/array';
5
4
  import { FLEET, MANAGEMENT } from '@shell/config/types';
6
5
  import { FLEET as FLEET_ANNOTATIONS } from '@shell/config/labels-annotations';
@@ -11,18 +10,20 @@ export default class FleetBundle extends SteveModel {
11
10
  return this.status?.conditions?.[0].lastUpdateTime;
12
11
  }
13
12
 
14
- get bundleType() {
15
- if (typeHelper.memberOfObject(this.spec, 'helm')) {
16
- return 'helm';
17
- }
13
+ get repoName() {
14
+ const labels = this.metadata?.labels || {};
18
15
 
19
- return '';
16
+ return labels[FLEET_ANNOTATIONS.REPO_NAME];
20
17
  }
21
18
 
22
- get repoName() {
19
+ get helmName() {
23
20
  const labels = this.metadata?.labels || {};
24
21
 
25
- return labels[FLEET_ANNOTATIONS.REPO_NAME];
22
+ return labels[FLEET_ANNOTATIONS.HELM_NAME];
23
+ }
24
+
25
+ get appSourceName() {
26
+ return this.helmName || this.repoName;
26
27
  }
27
28
 
28
29
  get targetClusters() {