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/secret.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import r from 'jsrsasign';
2
- import { CERTMANAGER, KUBERNETES } from '@shell/config/labels-annotations';
2
+ import { CERTMANAGER, KUBERNETES, UI_PROJECT_SECRET, UI_PROJECT_SECRET_COPY } from '@shell/config/labels-annotations';
3
3
  import { base64Decode, base64Encode } from '@shell/utils/crypto';
4
4
  import { removeObjects } from '@shell/utils/array';
5
- import { SERVICE_ACCOUNT } from '@shell/config/types';
5
+ import { MANAGEMENT, SERVICE_ACCOUNT, VIRTUAL_TYPES } from '@shell/config/types';
6
6
  import { set } from '@shell/utils/object';
7
7
  import { NAME as MANAGER } from '@shell/config/product/manager';
8
8
  import SteveModel from '@shell/plugins/steve/steve-class';
@@ -10,6 +10,8 @@ import { colorForState, stateDisplay, STATES_ENUM } from '@shell/plugins/dashboa
10
10
  import { diffFrom } from '@shell/utils/time';
11
11
  import day from 'dayjs';
12
12
  import { steveCleanForDownload } from '@shell/plugins/steve/resource-utils';
13
+ import { STORE } from '@shell/store/store-types';
14
+ import { escapeHtml } from '@shell/utils/string';
13
15
 
14
16
  export const TYPES = {
15
17
  OPAQUE: 'Opaque',
@@ -159,6 +161,10 @@ export default class Secret extends SteveModel {
159
161
  }
160
162
 
161
163
  get canUpdate() {
164
+ if (this.isProjectSecretCopy) {
165
+ return false;
166
+ }
167
+
162
168
  if ( !this.hasLink('update') ) {
163
169
  return false;
164
170
  }
@@ -170,6 +176,20 @@ export default class Secret extends SteveModel {
170
176
  return this.$rootGetters['type-map/optionsFor'](this.type).isEditable;
171
177
  }
172
178
 
179
+ get canDelete() {
180
+ // Deleting a copy / synced secret that was created in a namespace in a project that has a project scoped secret
181
+ // will only be temporary (the parent project scoped secret will recreate it)
182
+ return this.isProjectSecretCopy ? false : super.canDelete;
183
+ }
184
+
185
+ get canCreate() {
186
+ return this.isProjectSecretCopy ? false : super.canCreate;
187
+ }
188
+
189
+ get canEditYaml() {
190
+ return this.isProjectSecretCopy ? false : super.canEditYaml;
191
+ }
192
+
173
193
  get keysDisplay() {
174
194
  const keys = [
175
195
  ...Object.keys(this.data || []),
@@ -470,4 +490,139 @@ export default class Secret extends SteveModel {
470
490
 
471
491
  return steveCleanForDownload(yaml, { rootKeys: ['id', 'links', 'actions'] });
472
492
  }
493
+
494
+ /**
495
+ * is this a project scoped secret .... or also a cloned project scoped secret
496
+ */
497
+ get isProjectScopedRelated() {
498
+ return !!this.metadata.labels?.[UI_PROJECT_SECRET];
499
+ }
500
+
501
+ /**
502
+ * is this a project scoped secret
503
+ */
504
+ get isProjectScoped() {
505
+ return this.isProjectScopedRelated && !this.isProjectSecretCopy && this.$rootGetters['isRancher'];
506
+ }
507
+
508
+ get projectScopedClusterId() {
509
+ if (!this.projectScopedProjectId) {
510
+ return undefined;
511
+ }
512
+
513
+ const clusterId = this.metadata.namespace.replace(`-${ this.projectScopedProjectId }`, '');
514
+
515
+ // default and system pss don't follow the patter of <cluster>-<project>, so if they match assume its one of them
516
+ return clusterId === this.metadata.namespace ? 'local' : clusterId;
517
+ }
518
+
519
+ get projectScopedProjectId() {
520
+ return this.metadata.labels?.[UI_PROJECT_SECRET];
521
+ }
522
+
523
+ get isProjectSecretCopy() {
524
+ return this.metadata?.annotations?.[UI_PROJECT_SECRET_COPY] === 'true';
525
+ }
526
+
527
+ get projectCluster() {
528
+ if (!this.isProjectScoped) {
529
+ return undefined;
530
+ }
531
+
532
+ return this.$rootGetters[`${ STORE.MANAGEMENT }/byId`](MANAGEMENT.CLUSTER, this.projectScopedClusterId);
533
+ }
534
+
535
+ /**
536
+ * If this is a project scoped secret, return it
537
+ */
538
+ get project() {
539
+ if (!this.isProjectScoped ) {
540
+ return undefined;
541
+ }
542
+
543
+ return this.$rootGetters[`${ STORE.MANAGEMENT }/byId`](MANAGEMENT.PROJECT, `${ this.projectScopedClusterId }/${ this.projectScopedProjectId }`);
544
+ }
545
+
546
+ get projectScopedSecretCluster() {
547
+ if (!this.isProjectScoped ) {
548
+ return undefined;
549
+ }
550
+
551
+ return this.$rootGetters[`${ STORE.MANAGEMENT }/byId`](MANAGEMENT.PROJECT, `${ this.projectScopedClusterId }/${ this.projectScopedProjectId }`);
552
+ }
553
+
554
+ get clusterAndProjectLabel() {
555
+ if (!this.isProjectScoped) {
556
+ return '';
557
+ }
558
+ const clusterName = this.projectCluster?.nameDisplay;
559
+ // project is going to be empty if upstream and trying to show pss from downstream clusters
560
+ // we only ever have the current clusters projects. if we change this (fetch them in the list)
561
+ // we wipe out the header ns filter projects
562
+ const projectName = this.project?.nameDisplay || this.projectScopedProjectId;
563
+
564
+ if (clusterName && projectName) {
565
+ return `${ projectName } (${ clusterName })`;
566
+ }
567
+
568
+ return '';
569
+ }
570
+
571
+ get detailLocation() {
572
+ if (this.isProjectScoped) {
573
+ const id = this.id?.replace(/.*\//, '');
574
+
575
+ return {
576
+ name: `c-cluster-product-${ VIRTUAL_TYPES.PROJECT_SECRETS }-namespace-id`,
577
+ params: {
578
+ product: this.$rootGetters['productId'],
579
+ cluster: this.$rootGetters['clusterId'],
580
+ namespace: this.metadata?.namespace,
581
+ resource: VIRTUAL_TYPES.PROJECT_SECRETS,
582
+ id,
583
+ }
584
+ };
585
+ }
586
+
587
+ return this._detailLocation;
588
+ }
589
+
590
+ get listLocation() {
591
+ if (!this.isProjectScoped) {
592
+ return super.listLocation;
593
+ }
594
+
595
+ return {
596
+ name: 'c-cluster-product-resource',
597
+ params: {
598
+ product: this.$rootGetters['productId'],
599
+ cluster: this.$rootGetters['clusterId'],
600
+ resource: VIRTUAL_TYPES.PROJECT_SECRETS,
601
+ }
602
+ };
603
+ }
604
+
605
+ get parentNameOverride() {
606
+ if (!this.isProjectScoped) {
607
+ return super.parentNameOverride;
608
+ }
609
+
610
+ return this.$rootGetters['i18n/t'](`typeLabel."${ VIRTUAL_TYPES.PROJECT_SECRETS }"`, { count: 1 })?.trim();
611
+ }
612
+
613
+ get parentLocationOverride() {
614
+ if (!this.isProjectScoped) {
615
+ return super.parentNameOverride;
616
+ }
617
+
618
+ return this.listLocation;
619
+ }
620
+
621
+ get groupByProject() {
622
+ if (!this.isProjectScoped) {
623
+ return undefined;
624
+ }
625
+
626
+ return this.t('resourceTable.groupLabel.project', { name: escapeHtml(this?.project?.nameDisplay || '') }, true);
627
+ }
473
628
  }
package/models/service.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import find from 'lodash/find';
2
2
  import { POD } from '@shell/config/types';
3
3
  import SteveModel from '@shell/plugins/steve/steve-class';
4
+ import { parse } from '@shell/utils/selector';
4
5
 
5
6
  // i18n-uses servicesPage.serviceTypes.clusterIp.*, servicesPage.serviceTypes.externalName.*, servicesPage.serviceTypes.headless.*
6
7
  // i18n-uses servicesPage.serviceTypes.loadBalancer.*, servicesPage.serviceTypes.nodePort.*
@@ -49,7 +50,7 @@ export const CLUSTERIP = (() => {
49
50
  return clusterIp.id;
50
51
  })();
51
52
 
52
- export default class extends SteveModel {
53
+ export default class Service extends SteveModel {
53
54
  get customValidationRules() {
54
55
  return [
55
56
  {
@@ -137,18 +138,36 @@ export default class extends SteveModel {
137
138
  }
138
139
 
139
140
  async fetchPods() {
140
- if (this.podRelationship) {
141
- // Used in conjunction with `matches/match/label selectors`. Requires https://github.com/rancher/dashboard/issues/10417 to fix
142
- await this.$dispatch('cluster/findMatching', {
143
- type: POD,
144
- selector: this.podRelationship.selector,
145
- namespace: this.namespace
146
- }, { root: true });
141
+ if (!this.podRelationship) {
142
+ // If empty or not present, the service is assumed to have an external process managing its endpoints
143
+ return [];
147
144
  }
145
+
146
+ return await this.$dispatch('findLabelSelector', {
147
+ type: POD,
148
+ matching: {
149
+ namespace: this.metadata.namespace,
150
+ labelSelector: { matchExpressions: parse(this.podRelationship?.selector) },
151
+ }
152
+ });
148
153
  }
149
154
 
155
+ async unWatchPods() {
156
+ return await this.$dispatch('unwatch', { type: POD, all: true });
157
+ }
158
+
159
+ /**
160
+ * This getter expects a superset of workload pods to have been fetched already
161
+ *
162
+ * It assumes fetchPods has been called and should be used instead of the response of fetchPods
163
+ * (findAll --> findLabelSelector world results won't trigger change detection)
164
+ */
150
165
  get pods() {
151
- return this.podRelationship ? this.$getters.matching( POD, this.podRelationship.selector, this.namespace ) : [];
166
+ if (this.podRelationship?.selector) {
167
+ return this.$getters['matchingLabelSelector'](POD, { matchExpressions: parse(this.podRelationship?.selector) }, this.metadata.namespace);
168
+ } else {
169
+ return [];
170
+ }
152
171
  }
153
172
 
154
173
  get serviceType() {
@@ -141,14 +141,14 @@ export default class extends SteveModel {
141
141
  out.unshift({
142
142
  action: 'resetDefault',
143
143
  enabled: true,
144
- // icon: 'icon icon-fw icon-checkmark',
144
+ icon: 'icon icon-fw icon-checkmark',
145
145
  label: this.t('storageClass.actions.resetDefault'),
146
146
  });
147
147
  } else {
148
148
  out.unshift({
149
149
  action: 'setDefault',
150
150
  enabled: true,
151
- // icon: 'icon icon-fw icon-checkmark',
151
+ icon: 'icon icon-fw icon-checkmark',
152
152
  label: this.t('storageClass.actions.setAsDefault'),
153
153
  });
154
154
  }
@@ -1,11 +1,12 @@
1
1
  import { findBy, insertAt } from '@shell/utils/array';
2
- import { TIMESTAMP, CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
2
+ import { CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
3
3
  import { WORKLOAD_TYPES, SERVICE, POD } from '@shell/config/types';
4
- import { get, set } from '@shell/utils/object';
4
+ import { set } from '@shell/utils/object';
5
5
  import day from 'dayjs';
6
- import { convertSelectorObj, matching, matches } from '@shell/utils/selector';
6
+ import { convertSelectorObj, parse } from '@shell/utils/selector';
7
7
  import { SEPARATOR } from '@shell/config/workload';
8
8
  import WorkloadService from '@shell/models/workload.service';
9
+ import { matching } from '@shell/utils/selector-typed';
9
10
 
10
11
  export const defaultContainer = {
11
12
  imagePullPolicy: 'Always',
@@ -18,6 +19,7 @@ export const defaultContainer = {
18
19
  },
19
20
  volumeMounts: []
20
21
  };
22
+
21
23
  export default class Workload extends WorkloadService {
22
24
  // remove clone as yaml/edit as yaml until API supported
23
25
  get _availableActions() {
@@ -46,11 +48,12 @@ export default class Workload extends WorkloadService {
46
48
  });
47
49
 
48
50
  insertAt(out, 0, {
49
- action: 'redeploy',
50
- label: this.t('action.redeploy'),
51
- icon: 'icon icon-refresh',
52
- enabled: !!this.links.update,
53
- bulkable: true,
51
+ action: 'redeploy',
52
+ label: this.t('action.redeploy'),
53
+ icon: 'icon icon-refresh',
54
+ enabled: !!this.links.update,
55
+ bulkable: true,
56
+ bulkAction: 'redeploy'
54
57
  });
55
58
 
56
59
  insertAt(out, 0, {
@@ -205,22 +208,20 @@ export default class Workload extends WorkloadService {
205
208
  return this.goToEdit({ sidecar: true });
206
209
  }
207
210
 
208
- get showPodRestarts() {
209
- return true;
210
- }
211
-
212
211
  get restartCount() {
213
- const pods = this.pods;
212
+ return this.pods.reduce((total, pod) => {
213
+ const { status:{ containerStatuses = [] } } = pod;
214
214
 
215
- let sum = 0;
215
+ if (containerStatuses.length) {
216
+ total += containerStatuses.reduce((tot, container) => {
217
+ tot += container.restartCount || 0;
216
218
 
217
- pods.forEach((pod) => {
218
- if (pod.status.containerStatuses) {
219
- sum += pod.status?.containerStatuses[0].restartCount || 0;
219
+ return tot;
220
+ }, 0);
220
221
  }
221
- });
222
222
 
223
- return sum;
223
+ return total;
224
+ }, 0);
224
225
  }
225
226
 
226
227
  get hasSidecars() {
@@ -334,6 +335,10 @@ export default class Workload extends WorkloadService {
334
335
  const type = this._type ? this._type : this.type;
335
336
 
336
337
  const detailItem = {
338
+ restarts: {
339
+ label: this.t('resourceDetail.masthead.restartCount'),
340
+ content: this.restartCount
341
+ },
337
342
  endpoint: {
338
343
  label: 'Endpoints',
339
344
  content: this.endpoint,
@@ -400,10 +405,13 @@ export default class Workload extends WorkloadService {
400
405
  });
401
406
  }
402
407
 
403
- out.push( {
408
+ out.push({
404
409
  label: 'Image',
405
410
  content: this.imageNames,
406
411
  formatter: 'PodImages'
412
+ }, {
413
+ label: detailItem.restarts.label,
414
+ content: detailItem.restarts.content,
407
415
  });
408
416
 
409
417
  switch (type) {
@@ -437,19 +445,14 @@ export default class Workload extends WorkloadService {
437
445
  return out;
438
446
  }
439
447
 
440
- redeploy() {
441
- const now = (new Date()).toISOString().replace(/\.\d+Z$/, 'Z');
448
+ redeploy(resources = this) {
449
+ const workloads = Array.isArray(resources) ? resources : [resources];
442
450
 
443
- if ( !this.spec.template.metadata ) {
444
- set(this.spec.template, 'metadata', {});
445
- }
446
-
447
- const annotations = this.spec.template.metadata.annotations || {};
448
-
449
- annotations[TIMESTAMP] = now;
450
- set(this.spec.template.metadata, 'annotations', annotations);
451
-
452
- this.save();
451
+ this.$dispatch('promptModal', {
452
+ modalWidth: '500px',
453
+ componentProps: { workloads },
454
+ component: 'RedeployWorkloadDialog'
455
+ });
453
456
  }
454
457
 
455
458
  // match existing container ports with services created for this workload
@@ -550,30 +553,60 @@ export default class Workload extends WorkloadService {
550
553
  }
551
554
  }
552
555
 
553
- get pods() {
554
- const relationships = this.metadata?.relationships || [];
555
- const podRelationship = relationships.filter((relationship) => relationship.toType === POD)[0];
556
+ async fetchPods() {
557
+ if (this.podMatchExpression) {
558
+ return this.$dispatch('findLabelSelector', {
559
+ type: POD,
560
+ matching: {
561
+ namespace: this.metadata.namespace,
562
+ labelSelector: { matchExpressions: this.podMatchExpression },
563
+ },
564
+ });
565
+ }
556
566
 
557
- if (podRelationship) {
558
- const pods = this.$getters['podsByNamespace'](this.metadata.namespace);
567
+ return undefined;
568
+ }
559
569
 
560
- // Used in conjunction with `matches/match/label selectors`. Requires https://github.com/rancher/dashboard/issues/10417 to fix
561
- return pods.filter((obj) => {
562
- return matches(obj, podRelationship.selector);
563
- });
570
+ async unWatchPods() {
571
+ return await this.$dispatch('unwatch', { type: POD, all: true });
572
+ }
573
+
574
+ /**
575
+ * This getter expects a superset of workload pods to have been fetched already
576
+ *
577
+ * It assumes fetchPods has been called and should be used instead of the response of fetchPods
578
+ * (findAll --> findLabelSelector world results won't trigger change detection)
579
+ */
580
+ get pods() {
581
+ if (this.podMatchExpression) {
582
+ return this.$getters['matchingLabelSelector'](POD, { matchExpressions: this.podMatchExpression }, this.metadata.namespace);
564
583
  } else {
565
584
  return [];
566
585
  }
567
586
  }
568
587
 
569
- get podGauges() {
588
+ /**
589
+ * Return a string version of a matchLabel expression
590
+ */
591
+ get podSelector() {
592
+ const relationships = this.metadata?.relationships || [];
593
+ const selector = relationships.filter((relationship) => relationship.toType === POD)[0]?.selector;
594
+
595
+ return selector;
596
+ }
597
+
598
+ get podMatchExpression() {
599
+ return this.podSelector ? parse(this.podSelector) : null;
600
+ }
601
+
602
+ calcPodGauges(pods) {
570
603
  const out = { };
571
604
 
572
- if (!this.pods) {
605
+ if (!pods) {
573
606
  return out;
574
607
  }
575
608
 
576
- this.pods.map((pod) => {
609
+ pods.map((pod) => {
577
610
  const { stateColor, stateDisplay } = pod;
578
611
 
579
612
  if (out[stateDisplay]) {
@@ -589,13 +622,17 @@ export default class Workload extends WorkloadService {
589
622
  return out;
590
623
  }
591
624
 
625
+ get podGauges() {
626
+ return this.calcPodGauges(this.pods);
627
+ }
628
+
592
629
  // Job Specific
593
630
  get jobRelationships() {
594
631
  if (this.type !== WORKLOAD_TYPES.CRON_JOB) {
595
632
  return undefined;
596
633
  }
597
634
 
598
- return (get(this, 'metadata.relationships') || []).filter((relationship) => relationship.toType === WORKLOAD_TYPES.JOB);
635
+ return this.metadata?.relationships?.filter((relationship) => relationship.toType === WORKLOAD_TYPES.JOB) || [];
599
636
  }
600
637
 
601
638
  /**
@@ -664,13 +701,16 @@ export default class Workload extends WorkloadService {
664
701
  }
665
702
 
666
703
  async matchingPods() {
667
- // Used in conjunction with `matches/match/label selectors`. Requires https://github.com/rancher/dashboard/issues/10417 to fix
668
- const all = await this.$dispatch('findAll', { type: POD });
669
- const allInNamespace = all.filter((pod) => pod.metadata.namespace === this.metadata.namespace);
670
-
671
- const selector = convertSelectorObj(this.spec.selector);
704
+ const matchInfo = await matching({
705
+ labelSelector: { matchExpressions: convertSelectorObj(this.spec.selector) },
706
+ type: POD,
707
+ $store: this.$store || { getters: this.$rootGetters, dispatch: (action, args) => this.$dispatch(action.split('/')[1], args) },
708
+ inStore: this.$rootGetters['currentProduct'].inStore,
709
+ namespace: this.metadata.namespace,
710
+ transient: true,
711
+ });
672
712
 
673
- return matching(allInNamespace, selector);
713
+ return matchInfo.matches;
674
714
  }
675
715
 
676
716
  cleanForSave(data) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-shell-shell",
3
- "version": "3.0.2-test.20250913",
3
+ "version": "3.0.5-test.2",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -51,11 +51,12 @@
51
51
  "add": "2.0.6",
52
52
  "ansi_up": "5.0.0",
53
53
  "axios-retry": "3.1.9",
54
- "axios": "0.21.4",
54
+ "axios": "1.8.4",
55
55
  "babel-eslint": "10.1.0",
56
56
  "babel-plugin-module-resolver": "4.0.0",
57
57
  "babel-preset-vue": "2.0.2",
58
58
  "cache-loader": "4.1.0",
59
+ "chart.js": "4.4.8",
59
60
  "clipboard-polyfill": "4.0.1",
60
61
  "codemirror-editor-vue3": "2.8.0",
61
62
  "codemirror": ">=5.64.0 <6",
@@ -75,7 +76,7 @@
75
76
  "dayjs": "1.8.29",
76
77
  "defu": "5.0.1",
77
78
  "diff2html": "3.4.24",
78
- "dompurify": "2.5.4",
79
+ "dompurify": "3.2.5",
79
80
  "element-matches": "^0.1.2",
80
81
  "entities": "4.5.0",
81
82
  "eslint-config-standard": "16.0.3",
@@ -85,7 +86,7 @@
85
86
  "eslint-plugin-import": "2.31.0",
86
87
  "eslint-plugin-jest": "24.4.0",
87
88
  "eslint-plugin-n": "15.2.0",
88
- "eslint-plugin-vue": "9.10.0",
89
+ "eslint-plugin-vue": "9.32.0",
89
90
  "eslint": "7.32.0",
90
91
  "event-target-shim": "5.0.1",
91
92
  "express": "4.17.1",
@@ -105,7 +106,7 @@
105
106
  "js-yaml-loader": "1.2.2",
106
107
  "js-yaml": "4.1.0",
107
108
  "jsdiff": "1.1.1",
108
- "jsonpath-plus": "10.0.7",
109
+ "jsonpath-plus": "10.3.0",
109
110
  "jsrsasign": "11.0.0",
110
111
  "jszip": "3.8.0",
111
112
  "lodash": "4.17.21",
package/pages/about.vue CHANGED
@@ -5,13 +5,14 @@ import BackRoute from '@shell/mixins/back-link';
5
5
  import { MANAGEMENT } from '@shell/config/types';
6
6
  import { SETTING } from '@shell/config/settings';
7
7
  import { getVendor } from '@shell/config/private-label';
8
- import { downloadFile } from '@shell/utils/download';
9
8
  import { mapGetters } from 'vuex';
10
9
  import TabTitle from '@shell/components/TabTitle';
10
+ import { PanelLocation, ExtensionPoint } from '@shell/core/types';
11
+ import ExtensionPanel from '@shell/components/ExtensionPanel';
11
12
 
12
13
  export default {
13
14
  components: {
14
- BackLink, Loading, TabTitle
15
+ BackLink, ExtensionPanel, Loading, TabTitle
15
16
  },
16
17
  mixins: [BackRoute],
17
18
  async fetch() {
@@ -19,8 +20,10 @@ export default {
19
20
  },
20
21
  data() {
21
22
  return {
22
- dashboardVersion: this.$config.dashboardVersion,
23
- settings: null,
23
+ extensionType: ExtensionPoint.PANEL,
24
+ extensionLocation: PanelLocation.ABOUT_TOP,
25
+ dashboardVersion: this.$config.dashboardVersion,
26
+ settings: null,
24
27
  SETTING
25
28
  };
26
29
  },
@@ -43,50 +46,27 @@ export default {
43
46
  },
44
47
  downloads() {
45
48
  return [
46
- this.createOSOption('about.os.mac', 'icon-apple', this.settings?.find((s) => s.id === SETTING.CLI_URL.DARWIN)?.value, null),
47
- this.createOSOption('about.os.linux', 'icon-linux', this.settings?.find((s) => s.id === SETTING.CLI_URL.LINUX)?.value, this.downloadLinuxImages),
48
- this.createOSOption('about.os.windows', 'icon-windows', this.settings?.find((s) => s.id === SETTING.CLI_URL.WINDOWS)?.value, this.downloadWindowsImages)
49
+ this.createOSOption('about.os.mac', 'icon-apple', this.settings?.find((s) => s.id === SETTING.CLI_URL.DARWIN)?.value),
50
+ this.createOSOption('about.os.linux', 'icon-linux', this.settings?.find((s) => s.id === SETTING.CLI_URL.LINUX)?.value),
51
+ this.createOSOption('about.os.windows', 'icon-windows', this.settings?.find((s) => s.id === SETTING.CLI_URL.WINDOWS)?.value)
49
52
  ];
50
53
  },
51
- downloadImageList() {
52
- return this.downloads.filter((d) => !!d.imageList);
53
- },
54
54
  downloadCli() {
55
55
  return this.downloads.filter((d) => !!d.cliLink);
56
56
  }
57
57
  },
58
58
  methods: {
59
- createOSOption(label, icon, cliLink, imageList) {
59
+ createOSOption(label, icon, cliLink) {
60
60
  const slash = cliLink?.lastIndexOf('/');
61
61
 
62
62
  return {
63
63
  label,
64
64
  icon,
65
- imageList,
66
65
  cliLink,
67
66
  cliFile: slash >= 0 ? cliLink.substr(slash + 1, cliLink.length - 1) : cliLink
68
67
  };
69
68
  },
70
69
 
71
- async downloadLinuxImages() {
72
- const res = await this.$store.dispatch('management/request', { url: '/v3/kontainerdrivers/rancher-images' });
73
-
74
- try {
75
- await downloadFile(`.rancher-linux-images.txt`, res.data);
76
- } catch (error) {
77
- this.$store.dispatch('growl/fromError', { title: 'Error downloading Linux image list', err: error }, { root: true });
78
- }
79
- },
80
-
81
- async downloadWindowsImages() {
82
- const res = await this.$store.dispatch('management/request', { url: '/v3/kontainerdrivers/rancher-windows-images' });
83
-
84
- try {
85
- await downloadFile(`.rancher-windows-images.txt`, res.data);
86
- } catch (error) {
87
- this.$store.dispatch('growl/fromError', { title: 'Error downloading Windows image list', err: error }, { root: true });
88
- }
89
- },
90
70
  }
91
71
  };
92
72
  </script>
@@ -115,6 +95,12 @@ export default {
115
95
  {{ t('about.diagnostic.title') }}
116
96
  </router-link>
117
97
  </div>
98
+ <!-- Extensions area -->
99
+ <ExtensionPanel
100
+ :resource="{}"
101
+ :type="extensionType"
102
+ :location="extensionLocation"
103
+ />
118
104
  <h3>{{ t('about.versions.title') }}</h3>
119
105
  <table>
120
106
  <thead>
@@ -205,36 +191,6 @@ export default {
205
191
  {{ t('about.versions.releaseNotes') }}
206
192
  </a>
207
193
  </p>
208
- <template v-if="downloadImageList.length">
209
- <h3 class="pt-40">
210
- {{ t('about.downloadImageList.title') }}
211
- </h3>
212
- <table>
213
- <tr
214
- v-for="(d, i) in downloadImageList"
215
- :key="i"
216
- >
217
- <th>
218
- <div class="os">
219
- <i :class="`icon ${d.icon} mr-5`" /> {{ t(d.label) }}
220
- </div>
221
- </th>
222
- <td>
223
- <a
224
- v-if="d.imageList"
225
- tabindex="0"
226
- :data-testid="`image_list_download_link__${d.label}`"
227
- role="link"
228
- :aria-label="t('about.versions.downloadImages', { listName: t(d.label) })"
229
- @click="d.imageList"
230
- @keyup.enter="d.imageList"
231
- >
232
- {{ t('asyncButton.download.action') }}
233
- </a>
234
- </td>
235
- </tr>
236
- </table>
237
- </template>
238
194
  <template v-if="downloadCli.length">
239
195
  <h3 class="pt-40">
240
196
  {{ t('about.downloadCLI.title') }}