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
@@ -70,13 +70,14 @@ export const ACTIVELY_REMOVE = [
70
70
 
71
71
  const INDENT = 2;
72
72
 
73
- export function createYamlWithOptions(schemas, type, data, options) {
73
+ export function createYamlWithOptions(schemas, type, data, options, commentFieldsOptions) {
74
74
  return createYaml(
75
75
  schemas,
76
76
  type,
77
77
  data,
78
78
  true, 0, '', null,
79
- options
79
+ options,
80
+ commentFieldsOptions
80
81
  );
81
82
  }
82
83
 
@@ -89,6 +90,7 @@ export function createYaml(
89
90
  path = '',
90
91
  rootType = null,
91
92
  dataOptions = {},
93
+ commentFieldsOptions = null
92
94
  ) {
93
95
  data = data || {};
94
96
 
@@ -133,6 +135,10 @@ export function createYaml(
133
135
 
134
136
  const regularFields = [];
135
137
 
138
+ if ( !commentFieldsOptions ) {
139
+ commentFieldsOptions = data?.commentFieldsOptions;
140
+ }
141
+
136
142
  if (processAlwaysAdd) {
137
143
  // Add all the parents of each key so that spec.template.foo.blah
138
144
  // causes 'spec', 'template' and 'foo' keys to be created
@@ -230,6 +236,18 @@ export function createYaml(
230
236
  out = 'type:';
231
237
  }
232
238
 
239
+ commentFieldsOptions = addCommentSubFieldsOptions(commentFieldsOptions, data, path, key);
240
+
241
+ // If commentFieldOptions is defined on the model and the currentPath matches the path and key
242
+ // defined in one of the options, then comment out that line.
243
+ if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
244
+ const currentPath = path ? `${ path }.${ key }` : key;
245
+
246
+ if ( commentFieldsOptions.some((option) => `${ option.path }.${ option.key }` === currentPath) ) {
247
+ out = `#${ out }`;
248
+ }
249
+ }
250
+
233
251
  // if a key on data is not listed in the schema's resourceFields, just convert it to yaml, add indents where needed, and return
234
252
  if ( !field ) {
235
253
  if (data[key]) {
@@ -275,7 +293,7 @@ export function createYaml(
275
293
  out += `# key: ${ mapOf }`;
276
294
  } else {
277
295
  // If not a simple type ie some sort of object/array, recursively build out commented fields (note data = null here) per the type's (mapOf's) schema
278
- const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
296
+ const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
279
297
  let indented = indent(chunk);
280
298
 
281
299
  // convert "# foo" to "#foo"
@@ -296,7 +314,34 @@ export function createYaml(
296
314
  if ( cleaned?.[key] ) {
297
315
  const parsedData = jsyaml.dump(cleaned[key]);
298
316
 
299
- out += `\n${ indent(parsedData.trim()) }`;
317
+ let chunk;
318
+
319
+ // If commentFieldOptions is defined on the model and the array has the property (`key`)
320
+ // defined in one of the options, then comment out that line.
321
+ if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
322
+ let lines = parsedData.split('\n');
323
+
324
+ commentFieldsOptions.forEach((option) => {
325
+ // Assuming the path for the current array matches the option's path
326
+ // and the specific key to comment out exists in the array
327
+ if ( `${ path }.${ key }` === option.path && data[key][option.key] !== undefined ) {
328
+ // Comment out the line containing the target line
329
+ lines = lines.map((line, i) => {
330
+ if ( i === Number(option.key) ) {
331
+ return `#${ line }`;
332
+ }
333
+
334
+ return line;
335
+ });
336
+ }
337
+ });
338
+
339
+ chunk = lines.join('\n').trim();
340
+ } else {
341
+ chunk = parsedData.trim();
342
+ }
343
+
344
+ out += `\n${ indent(chunk) }`;
300
345
  }
301
346
  } catch (e) {
302
347
  console.error(`Error: Unable to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
@@ -306,7 +351,7 @@ export function createYaml(
306
351
  if ( SIMPLE_TYPES.includes(arrayOf) ) {
307
352
  out += `\n# - ${ arrayOf }`;
308
353
  } else {
309
- const chunk = createYaml(schemas, arrayOf, null, false, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
354
+ const chunk = createYaml(schemas, arrayOf, null, false, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
310
355
  let indented = indent(chunk, 2);
311
356
 
312
357
  // turn "# foo" into "# - foo"
@@ -357,19 +402,45 @@ export function createYaml(
357
402
 
358
403
  const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
359
404
 
360
- if ( subDef) {
405
+ if ( subDef ) {
361
406
  let chunk;
362
407
 
363
408
  if (subDef?.resourceFields && !isEmpty(subDef?.resourceFields)) {
364
- chunk = createYaml(schemas, type, data[key], processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
409
+ chunk = createYaml(schemas, type, data[key], processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
365
410
  } else if (data[key]) {
366
411
  // if there are no fields defined on the schema but there are in the data, just format data as yaml and add to output yaml
367
412
  try {
368
413
  const parsed = jsyaml.dump(data[key]);
369
414
 
370
- chunk = parsed.trim();
415
+ // If commentFieldOptions is defined on the model and `data[key]` has the property (`key`)
416
+ // defined in one of the options, then comment out that line.
417
+ if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
418
+ let lines = parsed.split('\n');
419
+
420
+ commentFieldsOptions.forEach((option) => {
421
+ // Assuming the path for the current data[key] matches the option's path
422
+ // and the specific key to comment out exists in the data[key]
423
+ if ( `${ path }.${ key }` === option.path && data[key][option.key] !== undefined ) {
424
+ const targetKeyString = `${ option.key }:`;
425
+
426
+ // Comment out the line containing the target key
427
+ lines = lines.map((line) => {
428
+ if ( line.trim().startsWith(targetKeyString) ) {
429
+ return `# ${ line }`;
430
+ }
431
+
432
+ return line;
433
+ });
434
+ }
435
+ });
436
+
437
+ chunk = lines.join('\n').trim();
438
+ } else {
439
+ // If commentFieldsOptions do not exist, use the original `parsed` string
440
+ chunk = parsed.trim();
441
+ }
371
442
  } catch (e) {
372
- console.error(`Error: Unale to parse data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
443
+ console.error(`Error: Unable to parse data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
373
444
  }
374
445
  }
375
446
 
@@ -380,6 +451,29 @@ export function createYaml(
380
451
 
381
452
  return out;
382
453
  }
454
+
455
+ /**
456
+ * Extends original commentFieldsOptions to cover nested objects
457
+ */
458
+ function addCommentSubFieldsOptions(options, data, path, key) {
459
+ if (!!options) {
460
+ if ( Array.isArray(options) && options.length ) {
461
+ const currentPath = path ? `${ path }.${ key }` : key;
462
+
463
+ if ( options.some((option) => `${ option.path }.${ option.key }` === currentPath) ) {
464
+ options = [
465
+ ...options,
466
+ ...Object.keys(data[key]).map((k) => ({
467
+ path: `${ path }.${ key }`,
468
+ key: k
469
+ }))
470
+ ];
471
+ }
472
+ }
473
+ }
474
+
475
+ return options;
476
+ }
383
477
  }
384
478
 
385
479
  function comment(lines) {
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Helpers for string encryption and decryption
3
+ */
4
+
5
+ // We just use a static salt
6
+ const SALT = new TextEncoder().encode('rancher-dashboard');
7
+
8
+ /**
9
+ * Type for the result of encryption
10
+ */
11
+ export type EncryptedString = {
12
+ cipher: string;
13
+ iv: string;
14
+ };
15
+
16
+ /**
17
+ * Generate an encryption key from a password
18
+ *
19
+ * @param password Password to use for the key
20
+ * @returns Encryption key
21
+ */
22
+ export async function deriveKey(password: string): Promise<CryptoKey> {
23
+ const passwordBytes = stringToBytes(password);
24
+
25
+ const initialKey = await crypto.subtle.importKey(
26
+ 'raw',
27
+ passwordBytes,
28
+ { name: 'PBKDF2' },
29
+ false,
30
+ ['deriveKey']
31
+ );
32
+
33
+ return await crypto.subtle.deriveKey(
34
+ {
35
+ name: 'PBKDF2',
36
+ salt: SALT,
37
+ iterations: 100000,
38
+ hash: 'SHA-256'
39
+ },
40
+ initialKey,
41
+ {
42
+ name: 'AES-GCM',
43
+ length: 256
44
+ },
45
+ false,
46
+ [
47
+ 'encrypt',
48
+ 'decrypt'
49
+ ]
50
+ );
51
+ }
52
+
53
+ /**
54
+ * Encrypt data
55
+ *
56
+ * @param content String to be encrypted
57
+ * @param key Encryption key
58
+ * @returns Encrypted data
59
+ */
60
+ export async function encrypt(content: string, key: CryptoKey): Promise<EncryptedString> {
61
+ const iv = crypto.getRandomValues(new Uint8Array(12));
62
+ const contentBytes = stringToBytes(content);
63
+ const cipher = new Uint8Array(
64
+ await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, contentBytes)
65
+ );
66
+
67
+ return {
68
+ iv: bytesToBase64(iv),
69
+ cipher: bytesToBase64(cipher),
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Decrypt encrypted data
75
+ * @param encryptedData Encrypted data with `cipher` and `iv` field
76
+ * @param key Key to use for decryption
77
+ * @returns Decrypted value as a string
78
+ */
79
+ export async function decrypt(encryptedData: EncryptedString, key: CryptoKey): Promise<string> {
80
+ const iv = base64ToBytes(encryptedData.iv);
81
+ const cipher = base64ToBytes(encryptedData.cipher);
82
+ const contentBytes = new Uint8Array(
83
+ await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher)
84
+ );
85
+
86
+ return bytesToString(contentBytes);
87
+ }
88
+
89
+ function bytesToString(bytes: any): string {
90
+ return new TextDecoder().decode(bytes);
91
+ }
92
+
93
+ function stringToBytes(str: string): Uint8Array {
94
+ return new TextEncoder().encode(str);
95
+ }
96
+
97
+ function bytesToBase64(arr: Uint8Array) {
98
+ return btoa(Array.from(arr, (b: number) => String.fromCharCode(b)).join(''));
99
+ }
100
+
101
+ function base64ToBytes(base64: string): Uint8Array {
102
+ return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
103
+ }
@@ -0,0 +1,51 @@
1
+ // For testing these could be changed to something like...
2
+
3
+ import { CATALOG } from '@shell/config/types';
4
+ import { FilterArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
5
+ import { VuexStore } from '@shell/types/store/vuex';
6
+
7
+ const CSP_ADAPTER_APPS = ['rancher-csp-adapter', 'rancher-csp-billing-adapter'];
8
+ // For testing above line could be replaced with below line...
9
+ // const cspAdaptorApp = ['rancher-webhooka', 'rancher-webhook'];
10
+
11
+ /**
12
+ * Helpers in order to
13
+ */
14
+ class CspAdapterUtils {
15
+ static canPagination($store: VuexStore): boolean {
16
+ return $store.getters[`management/paginationEnabled`]({ id: CATALOG.APP, context: 'branding' });
17
+ }
18
+
19
+ static fetchCspAdaptorApp($store: VuexStore): Promise<any> {
20
+ // For the login page, the schemas won't be loaded - we don't need the apps in this case
21
+ if ($store.getters['management/canList'](CATALOG.APP)) {
22
+ if (CspAdapterUtils.canPagination($store)) {
23
+ // Restrict the amount of apps we need to fetch
24
+ return $store.dispatch('management/findPage', {
25
+ type: CATALOG.APP,
26
+ opt: { // Of type ActionFindPageArgs
27
+ pagination: new FilterArgs({
28
+ filters: PaginationParamFilter.createMultipleFields(CSP_ADAPTER_APPS.map(
29
+ (t) => new PaginationFilterField({
30
+ field: 'metadata.name',
31
+ value: t,
32
+ })
33
+ )),
34
+ })
35
+ }
36
+ });
37
+ }
38
+
39
+ return $store.dispatch('management/findAll', { type: CATALOG.APP });
40
+ }
41
+
42
+ return Promise.resolve([]);
43
+ }
44
+
45
+ static hasCspAdapter({ $store, apps }: { $store: VuexStore, apps: any[]}): Object {
46
+ // In theory this should contain the filtered apps when pagination is on, and all apps when off. Keep filtering though in both cases just in case
47
+ return apps?.find((a) => CSP_ADAPTER_APPS.includes(a.metadata?.name));
48
+ }
49
+ }
50
+
51
+ export default CspAdapterUtils;
package/utils/error.js CHANGED
@@ -50,7 +50,6 @@ export class ApiError extends Error {
50
50
 
51
51
  export function stringify(err) {
52
52
  let str;
53
- console.log('00043', err);
54
53
  if ( typeof err === 'string' ) {
55
54
  str = err;
56
55
  } else if ( err && typeof err === 'object' ) {
@@ -90,7 +89,6 @@ export function stringify(err) {
90
89
  }
91
90
 
92
91
  export function exceptionToErrorsArray(err) {
93
- console.log('00055', err);
94
92
  if ( err?.response?.data ) {
95
93
  const body = err.response.data;
96
94
 
@@ -201,12 +199,9 @@ export function translateError(error) {
201
199
 
202
200
  if (matches) {
203
201
  if (matches.length == 1) {
204
- console.log('00045', error);
205
202
  error = error.replace(regex, translation.replacement);
206
203
  } else {
207
204
  error = translation.pattern.replace(/\$(.+)/g, (_, index) => matches[parseInt(index)]);
208
-
209
- console.log('00046', error);
210
205
  }
211
206
  }
212
207
  }
File without changes
package/utils/fleet.ts CHANGED
@@ -1,13 +1,16 @@
1
+ import { isEmpty, isEqual } from 'lodash';
1
2
  import {
2
3
  BundleDeploymentResource,
3
4
  BundleResourceKey,
4
5
  BundleDeployment,
5
6
  BundleDeploymentStatus,
6
- BundleStatus,
7
7
  Condition,
8
8
  } from '@shell/types/resources/fleet';
9
- import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
10
- import { FLEET as FLEET_LABELS } from '@shell/config/labels-annotations';
9
+ import { mapStateToEnum, STATES_ENUM, STATES } from '@shell/plugins/dashboard-store/resource-class';
10
+ import { FLEET as FLEET_LABELS, CAPI } from '@shell/config/labels-annotations';
11
+ import { NAME as EXPLORER_NAME } from '@shell/config/product/explorer';
12
+ import { FleetDashboardState, FleetResourceState, Target, TargetMode } from '@shell/types/fleet';
13
+ import { FLEET, VIRTUAL_HARVESTER_PROVIDER } from '@shell/config/types';
11
14
 
12
15
  interface Resource extends BundleDeploymentResource {
13
16
  state: string,
@@ -17,15 +20,6 @@ type Labels = {
17
20
  [key: string]: string,
18
21
  }
19
22
 
20
- interface StatesCounter { [state: string]: number }
21
-
22
- function incr(counter: StatesCounter, state: string) {
23
- if (!counter[state]) {
24
- counter[state] = 0;
25
- }
26
- counter[state]++;
27
- }
28
-
29
23
  function resourceKey(r: BundleResourceKey): string {
30
24
  return `${ r.kind }/${ r.namespace }/${ r.name }`;
31
25
  }
@@ -38,7 +32,139 @@ function conditionIsTrue(conditions: Condition[] | undefined, type: string): boo
38
32
  return !!conditions.find((c) => c.type === type && c.status.toLowerCase() === 'true');
39
33
  }
40
34
 
35
+ class Application {
36
+ excludeHarvesterRule = {
37
+ clusterSelector: {
38
+ matchExpressions: [{
39
+ key: CAPI.PROVIDER,
40
+ operator: 'NotIn',
41
+ values: [
42
+ VIRTUAL_HARVESTER_PROVIDER
43
+ ],
44
+ }],
45
+ },
46
+ };
47
+
48
+ getTargetMode(targets: Target[], namespace: string): TargetMode {
49
+ if (namespace === 'fleet-local') {
50
+ return 'local';
51
+ }
52
+
53
+ if (!targets.length) {
54
+ return 'none';
55
+ }
56
+
57
+ let mode: TargetMode = 'all';
58
+
59
+ for (const target of targets) {
60
+ const {
61
+ clusterName,
62
+ clusterSelector,
63
+ clusterGroup,
64
+ clusterGroupSelector,
65
+ } = target;
66
+
67
+ if (clusterGroup || clusterGroupSelector) {
68
+ return 'advanced';
69
+ }
70
+
71
+ if (clusterName) {
72
+ mode = 'clusters';
73
+ }
74
+
75
+ if (!isEmpty(clusterSelector)) {
76
+ mode = 'clusters';
77
+ }
78
+ }
79
+
80
+ const normalized = [...targets].map((target) => {
81
+ delete target.name;
82
+
83
+ return target;
84
+ });
85
+
86
+ // Check if targets contains only harvester rule after name normalizing
87
+ if (isEqual(normalized, [this.excludeHarvesterRule])) {
88
+ mode = 'all';
89
+ }
90
+
91
+ return mode;
92
+ }
93
+ }
94
+
41
95
  class Fleet {
96
+ resourceIcons = {
97
+ [FLEET.GIT_REPO]: 'icon icon-github',
98
+ [FLEET.HELM_OP]: 'icon icon-helm',
99
+ };
100
+
101
+ dashboardIcons = {
102
+ [FLEET.GIT_REPO]: 'icon icon-git',
103
+ [FLEET.HELM_OP]: 'icon icon-helm',
104
+ };
105
+
106
+ dashboardStates: FleetDashboardState[] = [
107
+ {
108
+ index: 0,
109
+ id: 'error',
110
+ label: 'Error',
111
+ color: '#F64747',
112
+ icon: 'icon icon-error',
113
+ stateBackground: 'bg-error'
114
+ },
115
+ {
116
+ index: 1,
117
+ id: 'warning',
118
+ label: 'Warning',
119
+ color: '#DAC342',
120
+ icon: 'icon icon-warning',
121
+ stateBackground: 'bg-warning'
122
+ },
123
+ {
124
+ index: 2,
125
+ id: 'success',
126
+ label: 'Active',
127
+ color: '#5D995D',
128
+ icon: 'icon icon-checkmark',
129
+ stateBackground: 'bg-success'
130
+ },
131
+ {
132
+ index: 3,
133
+ id: 'info',
134
+ label: 'Pending',
135
+ color: '#3d98d3',
136
+ icon: 'icon icon-warning',
137
+ stateBackground: 'bg-info'
138
+ },
139
+ ];
140
+
141
+ Application = new Application();
142
+
143
+ GIT_HTTPS_REGEX = /^https?:\/\/github\.com\/(.*?)(\.git)?\/*$/;
144
+ GIT_SSH_REGEX = /^git@github\.com:.*\.git$/;
145
+ HTTP_REGEX = /^(https?:\/\/[^\s]+)$/;
146
+ OCI_REGEX = /^oci:\/\//;
147
+
148
+ quacksLikeAHash(str: string) {
149
+ if (str.match(/^[a-f0-9]{40,}$/i)) {
150
+ return true;
151
+ }
152
+
153
+ return false;
154
+ }
155
+
156
+ parseSSHUrl(url: string) {
157
+ const parts = (url || '').split(':');
158
+
159
+ const sshUserAndHost = parts[0];
160
+ const repoPath = parts[1]?.replace('.git', '');
161
+
162
+ return {
163
+ sshUserAndHost,
164
+ repoPath
165
+ };
166
+ }
167
+
42
168
  resourceId(r: BundleResourceKey): string {
43
169
  return r.namespace ? `${ r.namespace }/${ r.name }` : r.name;
44
170
  }
@@ -57,6 +183,19 @@ class Fleet {
57
183
  return `${ r.apiVersion.split('/', 2)[0] }.${ type }`;
58
184
  }
59
185
 
186
+ detailLocation(r: Resource, mgmtClusterName: string): any {
187
+ return mapStateToEnum(r.state) === STATES_ENUM.MISSING ? undefined : {
188
+ name: `c-cluster-product-resource${ r.namespace ? '-namespace' : '' }-id`,
189
+ params: {
190
+ product: EXPLORER_NAME,
191
+ cluster: mgmtClusterName,
192
+ resource: this.resourceType(r),
193
+ namespace: r.namespace,
194
+ id: r.name,
195
+ },
196
+ };
197
+ }
198
+
60
199
  /**
61
200
  * resourcesFromBundleDeploymentStatus extracts the list of resources deployed by a BundleDeployment
62
201
  */
@@ -94,68 +233,6 @@ class Fleet {
94
233
  return modified.concat(Object.values(resources));
95
234
  }
96
235
 
97
- /**
98
- * resourcesFromBundleStatus extracts the list of resources deployed by a Bundle
99
- */
100
- resourcesFromBundleStatus(status: BundleStatus): Resource[] {
101
- // The state of every resource is spread all over the bundle status.
102
- // resourceKey contains one entry per resource AND cluster (built by Fleet from all the child BundleDeployments).
103
- // However, those entries do not contain the cluster that they belong to, leading to duplicate entries
104
-
105
- // 1. Fold resourceKey by using a unique key, initializing counters for multiple occurrences of the same resource
106
- const resources = (status.resourceKey || []).reduce((res, r) => {
107
- const k = resourceKey(r);
108
-
109
- if (!res[k]) {
110
- res[k] = { r, count: {} };
111
- }
112
- incr(res[k].count, STATES_ENUM.READY);
113
-
114
- return res;
115
- }, {} as { [resourceKey: string]: { r: BundleResourceKey, count: StatesCounter } });
116
-
117
- // 2. Non-ready resources are counted differently and may also appear in resourceKey, depending on their state
118
- for (const bundle of status.summary?.nonReadyResources || []) {
119
- for (const r of bundle.modifiedStatus || []) {
120
- const k = resourceKey(r);
121
-
122
- if (!resources[k]) {
123
- resources[k] = { r, count: {} };
124
- }
125
-
126
- if (r.missing) {
127
- incr(resources[k].count, STATES_ENUM.MISSING);
128
- } else if (r.delete) {
129
- resources[k].count[STATES_ENUM.READY]--;
130
- incr(resources[k].count, STATES_ENUM.ORPHANED);
131
- } else {
132
- resources[k].count[STATES_ENUM.READY]--;
133
- incr(resources[k].count, STATES_ENUM.MODIFIED);
134
- }
135
- }
136
- for (const r of bundle.nonReadyStatus || []) {
137
- const k = resourceKey(r);
138
- const state = r.summary?.state || STATES_ENUM.UNKNOWN;
139
-
140
- resources[k].count[STATES_ENUM.READY]--;
141
- incr(resources[k].count, state);
142
- }
143
- }
144
-
145
- // 3. Unfold back to an array of resources for display
146
- return Object.values(resources).reduce((res, e) => {
147
- const { r, count } = e;
148
-
149
- for (const state in count) {
150
- for (let x = 0; x < count[state]; x++) {
151
- res.push(Object.assign({ state }, r));
152
- }
153
- }
154
-
155
- return res;
156
- }, [] as Resource[]);
157
- }
158
-
159
236
  clusterIdFromBundleDeploymentLabels(labels?: Labels): string {
160
237
  const clusterNamespace = labels?.[FLEET_LABELS.CLUSTER_NAMESPACE];
161
238
  const clusterName = labels?.[FLEET_LABELS.CLUSTER];
@@ -184,6 +261,59 @@ class Fleet {
184
261
  return STATES_ENUM.READY;
185
262
  }
186
263
  }
264
+
265
+ getResourcesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
266
+ return [
267
+ STATES_ENUM.READY,
268
+ STATES_ENUM.NOT_READY,
269
+ STATES_ENUM.WAIT_APPLIED,
270
+ STATES_ENUM.MODIFIED,
271
+ STATES_ENUM.MISSING,
272
+ STATES_ENUM.ORPHANED,
273
+ STATES_ENUM.UNKNOWN,
274
+ ].reduce((acc: Record<string, any>, state) => {
275
+ acc[state] = {
276
+ count: 0,
277
+ color: STATES[state].color,
278
+ label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
279
+ status: state
280
+ };
281
+
282
+ return acc;
283
+ }, {});
284
+ }
285
+
286
+ getBundlesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
287
+ return [
288
+ STATES_ENUM.READY,
289
+ STATES_ENUM.INFO,
290
+ STATES_ENUM.WARNING,
291
+ STATES_ENUM.NOT_READY,
292
+ STATES_ENUM.ERROR,
293
+ STATES_ENUM.ERR_APPLIED,
294
+ STATES_ENUM.WAIT_APPLIED,
295
+ STATES_ENUM.UNKNOWN,
296
+ ].reduce((acc: Record<string, any>, state) => {
297
+ acc[state] = {
298
+ count: 0,
299
+ color: STATES[state].color,
300
+ label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
301
+ status: state
302
+ };
303
+
304
+ return acc;
305
+ }, {});
306
+ }
307
+
308
+ getDashboardStateId(resource: { stateColor: string }): string {
309
+ return resource?.stateColor?.replace('text-', '') || 'warning';
310
+ }
311
+
312
+ getDashboardState(resource: { stateColor: string }): FleetDashboardState | {} {
313
+ const stateId = this.getDashboardStateId(resource);
314
+
315
+ return this.dashboardStates.find(({ id }) => stateId === id) || {};
316
+ }
187
317
  }
188
318
 
189
319
  const instance = new Fleet();
package/utils/grafana.js CHANGED
@@ -24,6 +24,7 @@ export function computeDashboardUrl(monitoringVersion, embedUrl, clusterId, para
24
24
  }
25
25
  newUrl = addParam(newUrl, 'orgId', url.query.orgId);
26
26
  newUrl = addParam(newUrl, 'kiosk', null);
27
+ newUrl = addParam(newUrl, '_dash.hideTimePicker', 'true');
27
28
 
28
29
  Object.entries(params).forEach((entry) => {
29
30
  newUrl = addParam(newUrl, entry[0], entry[1]);