dashboard-shell-shell 3.0.2-rc.105 → 3.0.5-test.1

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 (630) 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 +49 -8
  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 +14 -5
  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/Tab.vue +1 -1
  163. package/components/Tabbed/index.vue +61 -64
  164. package/components/Wizard.vue +16 -3
  165. package/components/YamlEditor.vue +1 -2
  166. package/components/__tests__/AsyncButton.test.ts +39 -0
  167. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  168. package/components/__tests__/CruResource.test.ts +63 -0
  169. package/components/__tests__/FilterPanel.test.ts +81 -0
  170. package/components/__tests__/GrowlManager.test.ts +0 -25
  171. package/components/__tests__/PromptModal.test.ts +146 -0
  172. package/components/__tests__/PromptRestore.test.ts +1 -65
  173. package/components/__tests__/RichTranslation.test.ts +115 -0
  174. package/components/auth/AuthBanner.vue +15 -14
  175. package/components/auth/Principal.vue +0 -1
  176. package/components/auth/RoleDetailEdit.vue +44 -4
  177. package/components/auth/login/ldap.vue +2 -2
  178. package/components/auth/login/oidc.vue +6 -1
  179. package/components/fleet/FleetApplications.vue +174 -0
  180. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  181. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  182. package/components/fleet/FleetClusters.vue +25 -6
  183. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  184. package/components/fleet/FleetHelmOps.vue +123 -0
  185. package/components/fleet/FleetIntro.vue +58 -28
  186. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  187. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  188. package/components/fleet/FleetRepos.vue +37 -80
  189. package/components/fleet/FleetResources.vue +69 -27
  190. package/components/fleet/FleetSummary.vue +26 -51
  191. package/components/fleet/FleetValuesFrom.vue +295 -0
  192. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  193. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  194. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  195. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  196. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  197. package/components/fleet/dashboard/Empty.vue +73 -0
  198. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  199. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  200. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  201. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  202. package/components/form/ArrayList.vue +144 -116
  203. package/components/form/BannerSettings.vue +117 -50
  204. package/components/form/ChangePassword.vue +3 -1
  205. package/components/form/ColorInput.vue +35 -6
  206. package/components/form/FileImageSelector.vue +1 -1
  207. package/components/form/Footer.vue +10 -4
  208. package/components/form/KeyValue.vue +94 -66
  209. package/components/form/LabeledSelect.vue +72 -54
  210. package/components/form/Labels.vue +91 -21
  211. package/components/form/MatchExpressions.vue +58 -11
  212. package/components/form/NameNsDescription.vue +8 -4
  213. package/components/form/Networking.vue +24 -19
  214. package/components/form/NotificationSettings.vue +15 -1
  215. package/components/form/ResourceLabeledSelect.vue +22 -8
  216. package/components/form/ResourceSelector.vue +27 -23
  217. package/components/form/ResourceTabs/index.vue +7 -1
  218. package/components/form/SSHKnownHosts/index.vue +14 -11
  219. package/components/form/SecretSelector.vue +18 -2
  220. package/components/form/Select.vue +57 -26
  221. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  222. package/components/form/SimpleSecretSelector.vue +17 -4
  223. package/components/form/Taints.vue +21 -2
  224. package/components/form/UnitInput.vue +21 -0
  225. package/components/form/ValueFromResource.vue +31 -19
  226. package/components/form/__tests__/ArrayList.test.ts +32 -0
  227. package/components/form/__tests__/ColorInput.test.ts +35 -0
  228. package/components/form/__tests__/KeyValue.test.ts +36 -0
  229. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  230. package/components/form/__tests__/Labels.test.ts +360 -0
  231. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  232. package/components/form/__tests__/Networking.test.ts +116 -0
  233. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  234. package/components/form/__tests__/Select.test.ts +37 -1
  235. package/components/form/__tests__/UnitInput.test.ts +23 -1
  236. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  237. package/components/formatter/ClusterLink.vue +5 -8
  238. package/components/formatter/Description.vue +30 -0
  239. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  240. package/components/formatter/FleetApplicationSource.vue +79 -0
  241. package/components/formatter/FleetSummaryGraph.vue +7 -0
  242. package/components/formatter/PodImages.vue +1 -1
  243. package/components/formatter/WorkloadHealthScale.vue +1 -1
  244. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  245. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  246. package/components/google/AccountAccess.vue +209 -0
  247. package/components/google/types/gcp.d.ts +136 -0
  248. package/components/google/types/index.d.ts +101 -0
  249. package/components/google/util/__mocks__/gcp.ts +465 -0
  250. package/components/google/util/formatter.ts +82 -0
  251. package/components/google/util/gcp.ts +134 -0
  252. package/components/google/util/index.d.ts +11 -0
  253. package/components/nav/Favorite.vue +1 -1
  254. package/components/nav/Group.vue +5 -0
  255. package/components/nav/Header.vue +24 -38
  256. package/components/nav/NamespaceFilter.vue +142 -85
  257. package/components/nav/NotificationCenter/Notification.vue +484 -0
  258. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  259. package/components/nav/NotificationCenter/index.vue +148 -0
  260. package/components/nav/TopLevelMenu.helper.ts +55 -34
  261. package/components/nav/TopLevelMenu.vue +11 -0
  262. package/components/nav/Type.vue +4 -1
  263. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  264. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  265. package/components/nav/WindowManager/index.vue +3 -2
  266. package/components/templates/default.vue +0 -3
  267. package/components/templates/plain.vue +0 -3
  268. package/composables/drawer.ts +26 -0
  269. package/composables/focusTrap.ts +3 -3
  270. package/composables/resources.test.ts +63 -0
  271. package/composables/resources.ts +38 -0
  272. package/composables/useI18n.ts +12 -11
  273. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  274. package/config/labels-annotations.js +22 -11
  275. package/config/pagination-table-headers.js +8 -1
  276. package/config/private-label.js +0 -1
  277. package/config/product/auth.js +20 -3
  278. package/config/product/{cis.js → compliance.js} +23 -26
  279. package/config/product/explorer.js +49 -17
  280. package/config/product/fleet.js +77 -17
  281. package/config/product/manager.js +1 -29
  282. package/config/product/settings.js +23 -11
  283. package/config/query-params.js +16 -1
  284. package/config/roles.ts +2 -1
  285. package/config/router/navigation-guards/authentication.js +51 -2
  286. package/config/router/navigation-guards/index.js +5 -59
  287. package/config/router/routes.js +65 -31
  288. package/config/secret.ts +15 -0
  289. package/config/settings.ts +33 -16
  290. package/config/store.js +2 -0
  291. package/config/system-namespaces.js +1 -1
  292. package/config/table-headers.js +92 -31
  293. package/config/types.js +18 -7
  294. package/config/version.js +1 -1
  295. package/core/plugin-helpers.ts +3 -2
  296. package/core/plugin.ts +32 -7
  297. package/core/types.ts +25 -7
  298. package/detail/catalog.cattle.io.app.vue +5 -1
  299. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  300. package/detail/fleet.cattle.io.bundle.vue +70 -6
  301. package/detail/fleet.cattle.io.cluster.vue +28 -15
  302. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  303. package/detail/fleet.cattle.io.helmop.vue +157 -0
  304. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  305. package/detail/management.cattle.io.oidcclient.vue +369 -0
  306. package/detail/namespace.vue +0 -3
  307. package/detail/node.vue +20 -16
  308. package/detail/pod.vue +2 -2
  309. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  310. package/detail/service.vue +10 -2
  311. package/detail/workload/index.vue +48 -39
  312. package/dialog/AddCustomBadgeDialog.vue +0 -1
  313. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  314. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  315. package/dialog/AssignToDialog.vue +176 -0
  316. package/dialog/ChangePasswordDialog.vue +106 -0
  317. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  318. package/dialog/DisableAuthProviderDialog.vue +101 -0
  319. package/dialog/DrainNode.vue +1 -1
  320. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  321. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  322. package/dialog/FeatureFlagListDialog.vue +288 -0
  323. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  324. package/dialog/GenericPrompt.vue +1 -1
  325. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  326. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  327. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  328. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  329. package/dialog/MoveNamespaceDialog.vue +157 -0
  330. package/dialog/OidcClientSecretDialog.vue +117 -0
  331. package/dialog/RedeployWorkloadDialog.vue +164 -0
  332. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  333. package/dialog/ScalePoolDownDialog.vue +1 -1
  334. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  335. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  336. package/dialog/WechatDialog.vue +57 -0
  337. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  338. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  339. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  340. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  341. package/edit/__tests__/service.test.ts +2 -1
  342. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  343. package/edit/auth/ldap/config.vue +24 -0
  344. package/edit/auth/oidc.vue +159 -93
  345. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  346. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  347. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  348. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  349. package/edit/configmap.vue +8 -2
  350. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  351. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  352. package/edit/fleet.cattle.io.helmop.vue +786 -0
  353. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  354. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  355. package/edit/logging-flow/index.vue +1 -0
  356. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  357. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
  358. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  359. package/edit/management.cattle.io.oidcclient.vue +162 -0
  360. package/edit/management.cattle.io.project.vue +4 -1
  361. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  362. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  363. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  364. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  365. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  366. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  367. package/edit/monitoring.coreos.com.route.vue +1 -0
  368. package/edit/namespace.vue +2 -4
  369. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  370. package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
  371. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  372. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  373. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
  374. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
  375. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  376. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  377. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  378. package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
  379. package/edit/node.vue +1 -0
  380. package/edit/persistentvolume/index.vue +4 -1
  381. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  382. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  383. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  384. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  385. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  386. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  387. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  388. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  389. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  390. package/edit/resources.cattle.io.restore.vue +1 -1
  391. package/edit/secret/basic.vue +1 -0
  392. package/edit/secret/index.vue +127 -15
  393. package/edit/service.vue +17 -29
  394. package/edit/serviceaccount.vue +4 -1
  395. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  396. package/edit/workload/index.vue +11 -15
  397. package/edit/workload/mixins/workload.js +0 -2
  398. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  399. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  400. package/list/fleet.cattle.io.helmop.vue +108 -0
  401. package/list/harvesterhci.io.management.cluster.vue +0 -17
  402. package/list/management.cattle.io.feature.vue +4 -288
  403. package/list/management.cattle.io.oidcclient.vue +108 -0
  404. package/list/management.cattle.io.user.vue +13 -20
  405. package/list/namespace.vue +6 -2
  406. package/list/node.vue +2 -0
  407. package/list/projectsecret.vue +345 -0
  408. package/list/secret.vue +109 -0
  409. package/list/workload.vue +6 -2
  410. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  411. package/machine-config/amazonec2.vue +3 -24
  412. package/machine-config/components/GCEImage.vue +374 -0
  413. package/machine-config/google.vue +617 -0
  414. package/machine-config/vmwarevsphere.vue +7 -17
  415. package/mixins/__tests__/brand.spec.ts +170 -0
  416. package/mixins/auth-config.js +8 -1
  417. package/mixins/brand.js +16 -17
  418. package/mixins/create-edit-view/impl.js +10 -1
  419. package/mixins/create-edit-view/index.js +5 -0
  420. package/mixins/preset.js +100 -0
  421. package/mixins/resource-fetch-api-pagination.js +73 -44
  422. package/mixins/resource-fetch.js +18 -8
  423. package/mixins/resource-table-watch.js +45 -0
  424. package/mixins/vue-select-overrides.js +1 -4
  425. package/models/__tests__/chart.test.ts +296 -0
  426. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  427. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  428. package/models/__tests__/node.test.ts +7 -63
  429. package/models/__tests__/workload.test.ts +1 -0
  430. package/models/chart.js +157 -2
  431. package/models/cluster/node.js +2 -1
  432. package/models/cluster.js +32 -2
  433. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  434. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  435. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  436. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  437. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  438. package/models/fleet-application.js +297 -0
  439. package/models/fleet.cattle.io.bundle.js +9 -8
  440. package/models/fleet.cattle.io.cluster.js +21 -4
  441. package/models/fleet.cattle.io.gitrepo.js +46 -382
  442. package/models/fleet.cattle.io.helmop.js +202 -0
  443. package/models/management.cattle.io.authconfig.js +1 -0
  444. package/models/management.cattle.io.cluster.js +0 -20
  445. package/models/management.cattle.io.feature.js +7 -1
  446. package/models/management.cattle.io.fleetworkspace.js +14 -1
  447. package/models/management.cattle.io.node.js +7 -22
  448. package/models/management.cattle.io.nodepool.js +12 -0
  449. package/models/management.cattle.io.oidcclient.js +18 -0
  450. package/models/management.cattle.io.registration.js +3 -0
  451. package/models/management.cattle.io.setting.js +0 -1
  452. package/models/namespace.js +12 -1
  453. package/models/provisioning.cattle.io.cluster.js +60 -97
  454. package/models/secret.js +157 -2
  455. package/models/service.js +28 -9
  456. package/models/storage.k8s.io.storageclass.js +2 -2
  457. package/models/workload.js +91 -51
  458. package/package.json +6 -5
  459. package/pages/about.vue +17 -61
  460. package/pages/account/index.vue +9 -1
  461. package/pages/auth/login.vue +3 -38
  462. package/pages/auth/verify.vue +13 -1
  463. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  464. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  465. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  466. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  467. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  468. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  469. package/pages/c/_cluster/auth/roles/index.vue +19 -48
  470. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  471. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  472. package/pages/c/_cluster/explorer/index.vue +14 -3
  473. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  474. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  475. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  476. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  477. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  478. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  479. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  480. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  481. package/pages/c/_cluster/fleet/index.vue +866 -328
  482. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  483. package/pages/c/_cluster/longhorn/index.vue +5 -2
  484. package/pages/c/_cluster/settings/banners.vue +56 -2
  485. package/pages/c/_cluster/settings/brand.vue +2 -1
  486. package/pages/c/_cluster/settings/performance.vue +7 -26
  487. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  488. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  489. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  490. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  491. package/pages/explorer/resource/detail/configmap.vue +42 -0
  492. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  493. package/pages/explorer/resource/detail/secret.vue +63 -0
  494. package/pages/home.vue +8 -104
  495. package/pages/prefs.vue +0 -1
  496. package/pages/support/index.vue +4 -6
  497. package/plugins/clean-html.js +2 -0
  498. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  499. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  500. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  501. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  502. package/plugins/dashboard-store/actions.js +212 -55
  503. package/plugins/dashboard-store/getters.js +112 -24
  504. package/plugins/dashboard-store/mutations.js +61 -12
  505. package/plugins/dashboard-store/normalize.js +29 -19
  506. package/plugins/dashboard-store/resource-class.js +132 -49
  507. package/plugins/steve/__tests__/getters.test.ts +19 -12
  508. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  509. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  510. package/plugins/steve/actions.js +37 -24
  511. package/plugins/steve/getters.js +47 -12
  512. package/plugins/steve/resourceWatcher.js +10 -3
  513. package/plugins/steve/steve-class.js +5 -0
  514. package/plugins/steve/steve-pagination-utils.ts +225 -43
  515. package/plugins/steve/subscribe.js +418 -53
  516. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  517. package/rancher-components/Banner/Banner.test.ts +51 -3
  518. package/rancher-components/Banner/Banner.vue +37 -6
  519. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  520. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  521. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  522. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  523. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  524. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  525. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  526. package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
  527. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  528. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  529. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  530. package/rancher-components/RcButton/RcButton.vue +1 -1
  531. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  532. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  533. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  534. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  535. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  536. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
  537. package/rancher-components/RcDropdown/index.ts +2 -0
  538. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  539. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  540. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  541. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  542. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  543. package/rancher-components/RcItemCard/index.ts +2 -0
  544. package/rancher-components/StringList/StringList.vue +1 -1
  545. package/scripts/extension/publish +1 -1
  546. package/static/loading-indicator.html +1 -1
  547. package/store/action-menu.js +26 -56
  548. package/store/auth.js +3 -0
  549. package/store/catalog.js +85 -25
  550. package/store/features.js +0 -1
  551. package/store/growl.js +97 -8
  552. package/store/i18n.js +1 -1
  553. package/store/index.js +44 -14
  554. package/store/notifications.ts +426 -0
  555. package/store/prefs.js +2 -8
  556. package/store/slideInPanel.ts +6 -0
  557. package/store/type-map.js +35 -19
  558. package/store/type-map.utils.ts +49 -6
  559. package/store/uiplugins.ts +15 -1
  560. package/types/fleet.d.ts +60 -1
  561. package/types/kube/kube-api.ts +34 -0
  562. package/types/notifications/index.ts +74 -0
  563. package/types/resources/fleet.d.ts +43 -0
  564. package/types/resources/pod-security-admission.ts +36 -0
  565. package/types/resources/settings.d.ts +107 -0
  566. package/types/resources/userPreferences.d.ts +13 -0
  567. package/types/shell/index.d.ts +971 -745
  568. package/types/store/dashboard-store.types.ts +57 -4
  569. package/types/store/pagination.types.ts +41 -9
  570. package/types/store/subscribe.types.ts +50 -0
  571. package/utils/__mocks__/tabbable.js +13 -0
  572. package/utils/__tests__/back-off.test.ts +354 -0
  573. package/utils/__tests__/create-yaml.test.ts +235 -0
  574. package/utils/__tests__/fleet.test.ts +148 -0
  575. package/utils/__tests__/kontainer.test.ts +19 -0
  576. package/utils/__tests__/object.test.ts +54 -1
  577. package/utils/__tests__/string.test.ts +273 -1
  578. package/utils/__tests__/time.test.ts +31 -0
  579. package/utils/auth.js +41 -6
  580. package/utils/back-off.ts +176 -0
  581. package/utils/cluster.js +24 -20
  582. package/utils/create-yaml.js +103 -9
  583. package/utils/crypto/encryption.ts +103 -0
  584. package/utils/cspAdaptor.ts +51 -0
  585. package/utils/error.js +4 -5
  586. package/utils/fleet-types.ts +0 -0
  587. package/utils/fleet.ts +204 -74
  588. package/utils/grafana.js +1 -0
  589. package/utils/kontainer.ts +3 -5
  590. package/utils/object.js +36 -12
  591. package/utils/pagination-utils.ts +50 -3
  592. package/utils/pagination-wrapper.ts +132 -50
  593. package/utils/perf-setting.utils.ts +28 -0
  594. package/utils/release-notes.ts +48 -0
  595. package/utils/router.js +4 -4
  596. package/utils/selector-typed.ts +210 -0
  597. package/utils/selector.js +29 -6
  598. package/utils/settings.ts +4 -1
  599. package/utils/string.js +24 -0
  600. package/utils/style.ts +39 -0
  601. package/utils/{time.js → time.ts} +25 -6
  602. package/utils/uiplugins.ts +41 -8
  603. package/utils/v-sphere.ts +5 -1
  604. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  605. package/utils/validators/formRules/index.ts +99 -4
  606. package/utils/window.js +11 -7
  607. package/.DS_Store +0 -0
  608. package/components/AssignTo.vue +0 -199
  609. package/components/DisableAuthProviderModal.vue +0 -115
  610. package/components/MoveModal.vue +0 -167
  611. package/components/PromptChangePassword.vue +0 -123
  612. package/components/ResourceList/Masthead-btn.vue +0 -225
  613. package/components/__tests__/ApplicationCard.test.ts +0 -27
  614. package/components/cards/ApplicationCard.vue +0 -145
  615. package/components/fleet/FleetBundleResources.vue +0 -86
  616. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  617. package/components/formatter/RKETemplateName.vue +0 -37
  618. package/config/product/legacy.js +0 -62
  619. package/config/secret.js +0 -14
  620. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  621. package/models/etcdbackup.js +0 -45
  622. package/pages/auth copy/login.vue +0 -595
  623. package/pages/auth copy/logout.vue +0 -47
  624. package/pages/auth copy/setup.vue +0 -523
  625. package/pages/auth copy/verify.vue +0 -203
  626. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  627. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  628. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  629. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  630. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -0,0 +1,202 @@
1
+ import { parse } from '@shell/utils/url';
2
+ import { insertAt } from '@shell/utils/array';
3
+ import { set } from '@shell/utils/object';
4
+ import { SOURCE_TYPE } from '@shell/config/product/fleet';
5
+ import FleetUtils from '@shell/utils/fleet';
6
+ import { FLEET } from '@shell/config/types';
7
+ import { FLEET as FLEET_ANNOTATIONS } from '@shell/config/labels-annotations';
8
+ import FleetApplication from '@shell/models/fleet-application';
9
+
10
+ export default class HelmOp extends FleetApplication {
11
+ applyDefaults() {
12
+ const spec = this.spec || {};
13
+ const meta = this.metadata || {};
14
+
15
+ meta.namespace = this.$rootGetters['workspace'];
16
+
17
+ spec.helm = spec.helm || {};
18
+
19
+ spec['correctDrift'] = { enabled: false };
20
+
21
+ set(this, 'spec', spec);
22
+ set(this, 'metadata', meta);
23
+ }
24
+
25
+ get _availableActions() {
26
+ const out = super._availableActions;
27
+
28
+ insertAt(out, 0, {
29
+ action: 'pause',
30
+ label: this.t('fleet.helmOp.actions.pause.label'),
31
+ icon: 'icon icon-pause',
32
+ bulkable: true,
33
+ enabled: !!this.links.update && !this.spec?.paused
34
+ });
35
+
36
+ insertAt(out, 1, {
37
+ action: 'unpause',
38
+ label: this.t('fleet.helmOp.actions.unpause.label'),
39
+ icon: 'icon icon-play',
40
+ bulkable: true,
41
+ enabled: !!this.links.update && this.spec?.paused === true
42
+ });
43
+
44
+ insertAt(out, 5, { divider: true });
45
+
46
+ return out;
47
+ }
48
+
49
+ get dashboardIcon() {
50
+ return FleetUtils.dashboardIcons[FLEET.HELM_OP];
51
+ }
52
+
53
+ get resourceIcon() {
54
+ return FleetUtils.resourceIcons[FLEET.HELM_OP];
55
+ }
56
+
57
+ github(value) {
58
+ const url = (value || '');
59
+
60
+ const matchHttps = url.match(FleetUtils.GIT_HTTPS_REGEX);
61
+
62
+ if (matchHttps) {
63
+ return matchHttps[1];
64
+ }
65
+
66
+ const matchSSH = url.match(FleetUtils.GIT_SSH_REGEX);
67
+
68
+ if (matchSSH) {
69
+ return FleetUtils.parseSSHUrl(matchSSH[0]).repoPath;
70
+ }
71
+
72
+ return false;
73
+ }
74
+
75
+ sourceDisplay(repo) {
76
+ if (!repo) {
77
+ return null;
78
+ }
79
+
80
+ const github = this.github(repo);
81
+
82
+ if (github) {
83
+ return github;
84
+ }
85
+
86
+ repo = repo.replace(/.git$/, '');
87
+ repo = repo.replace(/^https:\/\//, '');
88
+ repo = repo.replace(/\/+$/, '');
89
+
90
+ return repo;
91
+ }
92
+
93
+ /**
94
+ * Source type examples:
95
+ *
96
+ * tarball:
97
+ * chart: https://github.com/rancher/fleet-helm-charts/releases/download/fleet-0.12.1-beta.2/fleet-0.12.1-beta.2.tgz
98
+ * repo:
99
+ * repo: https://rancher.github.io/fleet-helm-charts/
100
+ * chart: fleet-agent
101
+ * version: 0.12.1-beta.2
102
+ * oci:
103
+ * repo: oci://ghcr.io/rancher/fleet-test-configmap-chart
104
+ * version: the-tag
105
+ */
106
+ get sourceType() {
107
+ if (this.spec.helm?.repo?.startsWith('oci://')) {
108
+ return SOURCE_TYPE.OCI;
109
+ }
110
+
111
+ if (this.spec.helm?.repo && this.spec.helm?.chart) {
112
+ return SOURCE_TYPE.REPO;
113
+ }
114
+
115
+ if (this.spec.helm?.chart) {
116
+ return SOURCE_TYPE.TARBALL;
117
+ }
118
+
119
+ return null;
120
+ }
121
+
122
+ get source() {
123
+ let value = '';
124
+
125
+ switch (this.sourceType) {
126
+ case SOURCE_TYPE.REPO:
127
+ value = this.spec.helm?.repo || '';
128
+ break;
129
+ case SOURCE_TYPE.OCI: {
130
+ const parsed = parse(this.spec.helm?.repo || '');
131
+
132
+ value = parsed?.host ? `oci://${ parsed.host }` : '';
133
+ break;
134
+ }
135
+ case SOURCE_TYPE.TARBALL:
136
+ value = this.spec.helm?.chart || '';
137
+ }
138
+
139
+ const matchHttps = value.match(FleetUtils.HTTP_REGEX);
140
+ const matchSSH = value.match(FleetUtils.GIT_SSH_REGEX);
141
+
142
+ if (matchSSH) {
143
+ const { sshUserAndHost, repoPath } = FleetUtils.parseSSHUrl(matchSSH[0]);
144
+
145
+ value = `https://${ sshUserAndHost.replace('git@', '') }/${ repoPath }`;
146
+ }
147
+
148
+ return {
149
+ value,
150
+ display: this.sourceDisplay(value),
151
+ icon: 'icon icon-application',
152
+ showLink: !!(matchHttps || matchSSH)
153
+ };
154
+ }
155
+
156
+ get sourceSub() {
157
+ // Version label
158
+ const semanticVersion = this.spec.helm?.version || '';
159
+ const installedVersion = this.status?.version || '';
160
+
161
+ let labelVersion = semanticVersion || installedVersion || '';
162
+
163
+ if (semanticVersion && installedVersion && semanticVersion !== installedVersion) {
164
+ labelVersion = `${ semanticVersion } -> ${ installedVersion }`;
165
+ }
166
+
167
+ // Chart label
168
+ let chart = '';
169
+
170
+ switch (this.sourceType) {
171
+ case SOURCE_TYPE.REPO:
172
+ chart = this.spec.helm.chart || '';
173
+ break;
174
+ case SOURCE_TYPE.OCI: {
175
+ const parsed = parse(this.spec.helm.repo || '');
176
+
177
+ chart = parsed?.path ? parsed?.path.substring(1) : '';
178
+ break;
179
+ }
180
+ }
181
+
182
+ // Concat chart label and version label
183
+ let value = chart || labelVersion || '';
184
+
185
+ if (chart && labelVersion) {
186
+ value = `${ chart } : ${ labelVersion }`;
187
+ }
188
+
189
+ return {
190
+ value,
191
+ display: value,
192
+ };
193
+ }
194
+
195
+ get bundles() {
196
+ return this.$getters['matching'](FLEET.BUNDLE, { [FLEET_ANNOTATIONS.HELM_NAME]: this.name }, this.namespace);
197
+ }
198
+
199
+ get bundleDeployments() {
200
+ return this.$getters['matching'](FLEET.BUNDLE_DEPLOYMENT, { [FLEET_ANNOTATIONS.HELM_NAME]: this.name });
201
+ }
202
+ }
@@ -16,6 +16,7 @@ export const configType = {
16
16
  github: 'oauth',
17
17
  keycloakoidc: 'oidc',
18
18
  genericoidc: 'oidc',
19
+ cognito: 'oidc',
19
20
  };
20
21
 
21
22
  const imageOverrides = { keycloakoidc: 'keycloak', genericoidc: 'openid' };
@@ -106,10 +106,6 @@ export default class MgmtCluster extends SteveModel {
106
106
  return null;
107
107
  }
108
108
 
109
- get rkeTemplateVersion() {
110
- return this.spec?.clusterTemplateRevisionName;
111
- }
112
-
113
109
  get providerForEmberParam() {
114
110
  // Ember wants one word called provider to tell what component to show, but has much indirect mapping to figure out what it is.
115
111
  let provider;
@@ -136,14 +132,6 @@ export default class MgmtCluster extends SteveModel {
136
132
  }
137
133
 
138
134
  get emberEditPath() {
139
- let clusterTemplateRevision;
140
-
141
- // If the RKE1 cluster is created from an RKE template, we need
142
- // to get the template version to pass into the Ember UI for
143
- // the iFramed edit cluster form
144
- if (this.rkeTemplateVersion) {
145
- clusterTemplateRevision = this.rkeTemplateVersion;
146
- }
147
135
  const provider = this.providerForEmberParam;
148
136
 
149
137
  // Avoid passing falsy values as query parameters
@@ -153,10 +141,6 @@ export default class MgmtCluster extends SteveModel {
153
141
  qp['provider'] = provider;
154
142
  }
155
143
 
156
- if (clusterTemplateRevision) {
157
- qp['clusterTemplateRevision'] = clusterTemplateRevision;
158
- }
159
-
160
144
  // Copied out of https://github.com/rancher/ui/blob/20f56dc54c4fc09b5f911e533cb751c13609adaf/app/models/cluster.js#L844
161
145
  if ( provider === 'import' && isEmpty(this.eksConfig) && isEmpty(this.gkeConfig) ) {
162
146
  qp.importProvider = 'other';
@@ -168,10 +152,6 @@ export default class MgmtCluster extends SteveModel {
168
152
  qp.importProvider = KONTAINER_TO_DRIVER[provider];
169
153
  }
170
154
 
171
- if ( this.clusterTemplateRevisionId ) {
172
- qp.clusterTemplateRevision = this.clusterTemplateRevisionId;
173
- }
174
-
175
155
  const path = addParams(`/c/${ escape(this.id) }/edit`, qp);
176
156
 
177
157
  return path;
@@ -51,6 +51,12 @@ export default class Feature extends HybridModel {
51
51
  }
52
52
 
53
53
  toggleFeatureFlag(resources = this) {
54
- this.$dispatch('promptUpdate', resources);
54
+ this.$dispatch('promptModal', {
55
+ component: 'FeatureFlagListDialog',
56
+ resources: !Array.isArray(resources) ? [resources] : resources,
57
+ modalWidth: '450',
58
+ height: 'auto',
59
+ styles: 'max-height: 100vh;'
60
+ });
55
61
  }
56
62
  }
@@ -1,6 +1,7 @@
1
1
  import { COUNT, FLEET, NORMAN } from '@shell/config/types';
2
2
  import { filterBy } from '@shell/utils/array';
3
3
  import HybridModel from '@shell/plugins/steve/hybrid-class';
4
+ import { FLEET as FLEET_ANNOTATIONS } from '@shell/config/labels-annotations';
4
5
 
5
6
  export default class Workspace extends HybridModel {
6
7
  get isLocal() {
@@ -14,7 +15,8 @@ export default class Workspace extends HybridModel {
14
15
  const out = {
15
16
  clusterGroups: summary[FLEET.CLUSTER_GROUP]?.namespaces?.[name]?.count || 0,
16
17
  clusters: summary[FLEET.CLUSTER]?.namespaces?.[name]?.count || 0,
17
- gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0
18
+ gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0,
19
+ helmOps: summary[FLEET.HELM_OP]?.namespaces?.[name]?.count || 0
18
20
  };
19
21
 
20
22
  return out;
@@ -41,6 +43,13 @@ export default class Workspace extends HybridModel {
41
43
  return forWorkspace;
42
44
  }
43
45
 
46
+ get helmOps() {
47
+ const all = this.$getters['all'](FLEET.HELM_OP);
48
+ const forWorkspace = filterBy(all, 'namespace', this.id);
49
+
50
+ return forWorkspace;
51
+ }
52
+
44
53
  get basicNorman() {
45
54
  if (this.id) {
46
55
  return this.$dispatch(`rancher/find`, { id: this.id, type: NORMAN.FLEET_WORKSPACES }, { root: true });
@@ -87,4 +96,8 @@ export default class Workspace extends HybridModel {
87
96
  get confirmRemove() {
88
97
  return true;
89
98
  }
99
+
100
+ get systemAnnotations() {
101
+ return [FLEET_ANNOTATIONS.OCI_STORAGE_SECRET_DEFAULT];
102
+ }
90
103
  }
@@ -4,37 +4,22 @@ import {
4
4
  } from '@shell/config/types';
5
5
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
6
6
  import { listNodeRoles } from '@shell/models/cluster/node';
7
- import { insertAt } from '@shell/utils/array';
8
7
  import { downloadUrl } from '@shell/utils/download';
9
8
  import findLast from 'lodash/findLast';
10
9
  import HybridModel from '@shell/plugins/steve/hybrid-class';
11
10
  import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
12
11
 
12
+ const RKE1_ALLOWED_ACTIONS = [
13
+ 'goToViewYaml',
14
+ 'download',
15
+ 'viewInApi'
16
+ ];
17
+
13
18
  export default class MgmtNode extends HybridModel {
14
19
  get _availableActions() {
15
20
  const out = super._availableActions;
16
21
 
17
- const downloadKeys = {
18
- action: 'downloadKeys',
19
- enabled: !!this.norman?.links?.nodeConfig,
20
- icon: 'icon icon-fw icon-download',
21
- label: this.t('node.actions.downloadNodeConfig'),
22
- };
23
-
24
- const scaleDown = {
25
- action: 'scaleDown',
26
- bulkAction: 'scaleDown',
27
- enabled: !!this.canScaleDown,
28
- icon: 'icon icon-minus icon-fw',
29
- label: this.t('node.actions.scaleDown'),
30
- bulkable: true,
31
- };
32
-
33
- insertAt(out, 0, { divider: true });
34
- insertAt(out, 0, downloadKeys);
35
- insertAt(out, 0, scaleDown);
36
-
37
- return out;
22
+ return out.filter((a) => a.divider || RKE1_ALLOWED_ACTIONS.includes(a.action));
38
23
  }
39
24
 
40
25
  get kubeNodeName() {
@@ -3,7 +3,19 @@ import { sortBy } from '@shell/utils/sort';
3
3
  import HybridModel from '@shell/plugins/steve/hybrid-class';
4
4
  import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
5
5
 
6
+ const RKE1_ALLOWED_ACTIONS = [
7
+ 'goToViewYaml',
8
+ 'download',
9
+ 'viewInApi'
10
+ ];
11
+
6
12
  export default class MgmtNodePool extends HybridModel {
13
+ get _availableActions() {
14
+ const out = super._availableActions;
15
+
16
+ return out.filter((a) => a.divider || RKE1_ALLOWED_ACTIONS.includes(a.action));
17
+ }
18
+
7
19
  get nodeTemplateId() {
8
20
  return (this.spec?.nodeTemplateName || '').replace(/:/, '/');
9
21
  }
@@ -0,0 +1,18 @@
1
+ import SteveModel from '@shell/plugins/steve/steve-class';
2
+
3
+ export default class OIDCClient extends SteveModel {
4
+ get details() {
5
+ return [
6
+ ...this._details, {
7
+ label: this.t('oidcclient.redirectURIs.label'),
8
+ content: this.spec.redirectURIs?.join(', ')
9
+ }, {
10
+ label: this.t('oidcclient.refreshTokenExpirationSeconds.detailLabel'),
11
+ content: this.spec.refreshTokenExpirationSeconds
12
+ }, {
13
+ label: this.t('oidcclient.tokenExpirationSeconds.detailLabel'),
14
+ content: this.spec.tokenExpirationSeconds
15
+ }
16
+ ];
17
+ }
18
+ }
@@ -0,0 +1,3 @@
1
+ import SteveDescriptionModel from '@shell/plugins/steve/steve-description-class';
2
+
3
+ export default class RancherRegistration extends SteveDescriptionModel { }
@@ -2,7 +2,6 @@ import { ALLOWED_SETTINGS } from '@shell/config/settings';
2
2
  import HybridModel from '@shell/plugins/steve/hybrid-class';
3
3
  import { isServerUrl } from '@shell/utils/validators/setting';
4
4
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
5
- import { harvester2cloud } from '@shell/utils/router'
6
5
  import {
7
6
  _EDIT,
8
7
  _UNFLAG,
@@ -11,6 +11,11 @@ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
11
11
  import { hasPSALabels, getPSATooltipsDescription, getPSALabels } from '@shell/utils/pod-security-admission';
12
12
  import { PSAIconsDisplay, PSALabelsNamespaceVersion } from '@shell/config/pod-security-admission';
13
13
 
14
+ /**
15
+ * obscure namespaces are reserved and have special meaning if they're also classed as `system`
16
+ *
17
+ * (by default hidden from user given by default `show dynamic namespaces` preference is disabled and `user namespaces` filter is on)
18
+ */
14
19
  const OBSCURE_NAMESPACE_PREFIX = [
15
20
  'c-', // cluster namespace
16
21
 
@@ -73,7 +78,13 @@ export default class Namespace extends SteveModel {
73
78
  }
74
79
 
75
80
  move(resources = this) {
76
- this.$dispatch('promptMove', resources);
81
+ this.$dispatch('promptModal', {
82
+ component: 'MoveNamespaceDialog',
83
+ resources: !Array.isArray(resources) ? [resources] : resources,
84
+ modalWidth: '440',
85
+ height: 'auto',
86
+ styles: 'max-height: 100vh;'
87
+ });
77
88
  }
78
89
 
79
90
  get isSystem() {
@@ -12,6 +12,15 @@ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
12
12
  import { CAPI as CAPI_ANNOTATIONS, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
13
13
  import { KEV1 } from '@shell/models/management.cattle.io.kontainerdriver';
14
14
 
15
+ const RKE1_ALLOWED_ACTIONS = [
16
+ 'promptRemove',
17
+ 'openShell',
18
+ 'downloadKubeConfig',
19
+ 'copyKubeConfig',
20
+ 'download',
21
+ 'viewInApi'
22
+ ];
23
+
15
24
  /**
16
25
  * Class representing Cluster resource.
17
26
  * @extends SteveModel
@@ -41,17 +50,6 @@ export default class ProvCluster extends SteveModel {
41
50
  },
42
51
  ].filter((x) => !!x.content);
43
52
 
44
- // RKE Template details
45
- const rkeTemplate = this.rkeTemplate;
46
-
47
- if (rkeTemplate) {
48
- out.push({
49
- label: this.t('cluster.detail.rkeTemplate'),
50
- formatter: 'RKETemplateName',
51
- content: rkeTemplate,
52
- });
53
- }
54
-
55
53
  if (!this.machineProvider) {
56
54
  out.splice(1, 1);
57
55
 
@@ -87,6 +85,15 @@ export default class ProvCluster extends SteveModel {
87
85
  };
88
86
  }
89
87
 
88
+ get canEdit() {
89
+ // If the cluster is a KEV1 cluster or Harvester cluster then prevent edit
90
+ if (this.isKev1 || this.isHarvester) {
91
+ return false;
92
+ }
93
+
94
+ return super.canEdit;
95
+ }
96
+
90
97
  get _availableActions() {
91
98
  const out = super._availableActions;
92
99
  const isLocal = this.mgmt?.isLocal;
@@ -103,18 +110,7 @@ export default class ProvCluster extends SteveModel {
103
110
 
104
111
  const canEditRKE2cluster = this.isRke2 && ready && this.canUpdate;
105
112
 
106
- const canSnapshot = ready && ((this.isRke2 && this.canUpdate) || (this.isRke1 && this.mgmt?.hasAction('backupEtcd')));
107
-
108
- const clusterTemplatesSchema = this.$getters['schemaFor']('management.cattle.io.clustertemplate');
109
- let canUpdateClusterTemplate = false;
110
-
111
- if (clusterTemplatesSchema && (clusterTemplatesSchema.resourceMethods?.includes('blocked-PUT') || clusterTemplatesSchema.resourceMethods?.includes('PUT'))) {
112
- canUpdateClusterTemplate = true;
113
- }
114
-
115
- const normanClusterSaveTemplateAction = !!this.normanCluster?.actions?.saveAsTemplate;
116
-
117
- const canSaveRKETemplate = this.isRke1 && this.mgmt?.status?.driver === 'rancherKubernetesEngine' && !this.mgmt?.spec?.clusterTemplateName && this.hasLink('update') && canUpdateClusterTemplate && normanClusterSaveTemplateAction;
113
+ const canSnapshot = ready && this.isRke2 && this.canUpdate;
118
114
 
119
115
  const actions = [
120
116
  // Note: Actions are not supported in the Steve API, so we check
@@ -158,12 +154,7 @@ export default class ProvCluster extends SteveModel {
158
154
  action: 'rotateEncryptionKey',
159
155
  label: this.$rootGetters['i18n/t']('nav.rotateEncryptionKeys'),
160
156
  icon: 'icon icon-refresh',
161
- enabled: canEditRKE2cluster || (this.isRke1 && this.mgmt?.hasAction('rotateEncryptionKey') && ready)
162
- }, {
163
- action: 'saveAsRKETemplate',
164
- label: this.$rootGetters['i18n/t']('nav.saveAsRKETemplate'),
165
- icon: 'icon icon-folder',
166
- enabled: canSaveRKETemplate,
157
+ enabled: canEditRKE2cluster
167
158
  }, { divider: true }];
168
159
 
169
160
  // Harvester Cluster 1:1 Harvester Cloud Cred
@@ -181,8 +172,8 @@ export default class ProvCluster extends SteveModel {
181
172
 
182
173
  const all = actions.concat(out);
183
174
 
184
- // If the cluster is a KEV1 cluster then prevent edit
185
- if (this.isKev1) {
175
+ // If the cluster is a KEV1 cluster or Harvester cluster then prevent edit
176
+ if (this.isKev1 || this.isHarvester) {
186
177
  const edit = all.find((action) => action.action === 'goToEdit');
187
178
 
188
179
  if (edit) {
@@ -190,6 +181,15 @@ export default class ProvCluster extends SteveModel {
190
181
  }
191
182
  }
192
183
 
184
+ // If RKE1, then remove most of the actions
185
+ if (this.isRke1) {
186
+ all.forEach((action) => {
187
+ if (!action.divider && !RKE1_ALLOWED_ACTIONS.includes(action.action)) {
188
+ action.enabled = false;
189
+ }
190
+ });
191
+ }
192
+
193
193
  // If we have a helper that wants to modify the available actions, let it do it
194
194
  if (this.customProvisionerHelper?.availableActions) {
195
195
  // Provider can either modify the provided list or return one of its own
@@ -729,7 +729,7 @@ export default class ProvCluster extends SteveModel {
729
729
  async copyKubeConfig() {
730
730
  await this.mgmt?.copyKubeConfig();
731
731
 
732
- this.$dispatch('growl/success', {
732
+ this.$dispatch('growl/info', {
733
733
  title: this.t('cluster.copiedConfig'),
734
734
  timeout: 3000,
735
735
  }, { root: true });
@@ -746,7 +746,7 @@ export default class ProvCluster extends SteveModel {
746
746
  async snapshotAction() {
747
747
  try {
748
748
  await this.takeSnapshot();
749
- this.$dispatch('growl/success', {
749
+ this.$dispatch('growl/info', {
750
750
  title: this.$rootGetters['i18n/t']('cluster.snapshot.successTitle', { name: this.nameDisplay }),
751
751
  message: this.$rootGetters['i18n/t']('cluster.snapshot.successMessage', { name: this.nameDisplay })
752
752
  }, { root: true });
@@ -766,7 +766,7 @@ export default class ProvCluster extends SteveModel {
766
766
  const successful = res.filter( (x) => x.status === 'fulfilled').length;
767
767
 
768
768
  if ( successful ) {
769
- this.$dispatch('growl/success', {
769
+ this.$dispatch('growl/info', {
770
770
  title: this.$rootGetters['i18n/t']('cluster.snapshot.bulkSuccessTitle'),
771
771
  message: this.$rootGetters['i18n/t']('cluster.snapshot.bulkSuccessMessage', { count: successful })
772
772
  }, { root: true });
@@ -813,13 +813,6 @@ export default class ProvCluster extends SteveModel {
813
813
  this.$dispatch('promptRestore', [resource]);
814
814
  }
815
815
 
816
- saveAsRKETemplate(cluster = this) {
817
- this.$dispatch('promptModal', {
818
- componentProps: { cluster },
819
- component: 'SaveAsRKETemplateDialog'
820
- });
821
- }
822
-
823
816
  rotateCertificates(cluster = this) {
824
817
  this.$dispatch('promptModal', {
825
818
  componentProps: { cluster },
@@ -839,62 +832,6 @@ export default class ProvCluster extends SteveModel {
839
832
  return this._stateObj;
840
833
  }
841
834
 
842
- get rkeTemplate() {
843
- if (!this.isRke1 || !this.mgmt) {
844
- // Not an RKE! cluster or no management cluster available
845
- return false;
846
- }
847
-
848
- if (!this.mgmt.spec?.clusterTemplateRevisionName) {
849
- // Cluster does not use an RKE template
850
- return false;
851
- }
852
-
853
- const clusterTemplateName = this.mgmt.spec.clusterTemplateName.replace(':', '/');
854
- const clusterTemplateRevisionName = this.mgmt.spec.clusterTemplateRevisionName.replace(':', '/');
855
- const template = this.$rootGetters['management/all'](MANAGEMENT.RKE_TEMPLATE).find((t) => t.id === clusterTemplateName);
856
- const revision = this.$rootGetters['management/all'](MANAGEMENT.RKE_TEMPLATE_REVISION).find((t) => t.spec.enabled && t.id === clusterTemplateRevisionName);
857
-
858
- if (!template || !revision) {
859
- return false;
860
- }
861
-
862
- return {
863
- displayName: `${ template.spec?.displayName }/${ revision.spec?.displayName }`,
864
- upgrade: this.rkeTemplateUpgrade,
865
- template,
866
- revision,
867
- };
868
- }
869
-
870
- get rkeTemplateUpgrade() {
871
- if (!this.isRke1 || !this.mgmt) {
872
- // Not an RKE! cluster or no management cluster available
873
- return false;
874
- }
875
-
876
- if (!this.mgmt.spec?.clusterTemplateRevisionName) {
877
- // Cluster does not use an RKE template
878
- return false;
879
- }
880
-
881
- const clusterTemplateRevisionName = this.mgmt.spec.clusterTemplateRevisionName.replace(':', '/');
882
-
883
- // Get all of the template revisions for this template
884
- const revisions = this.$rootGetters['management/all'](MANAGEMENT.RKE_TEMPLATE_REVISION).filter((t) => t.spec.enabled && t.spec.clusterTemplateName === this.mgmt.spec.clusterTemplateName);
885
-
886
- if (revisions.length <= 1) {
887
- // Only one template revision
888
- return false;
889
- }
890
-
891
- revisions.sort((a, b) => {
892
- return parseInt(a.metadata.resourceVersion, 10) - parseInt(b.metadata.resourceVersion, 10);
893
- }).reverse();
894
-
895
- return revisions[0].id !== clusterTemplateRevisionName ? revisions[0].spec?.displayName : false;
896
- }
897
-
898
835
  get _stateObj() {
899
836
  if (!this.isRke2) {
900
837
  return this.mgmt?.stateObj || this.metadata?.state;
@@ -1057,6 +994,28 @@ export default class ProvCluster extends SteveModel {
1057
994
  return null;
1058
995
  }
1059
996
 
997
+ /**
998
+ * Gets the options for fields that should be commented out in the YAML representation
999
+ * of the model. This is particularly useful for conditionally commenting out certain
1000
+ * fields based on the model's configuration.
1001
+ *
1002
+ * @returns {null | Array.<{path: string, key: string}>}
1003
+ * - `path`: A dot-separated string indicating the path to the object containing the key.
1004
+ * - `key`: The specific key within the object at the given path that should be commented out.
1005
+ */
1006
+ get commentFieldsOptions() {
1007
+ if ( this.isRke2 ) {
1008
+ return [
1009
+ {
1010
+ path: 'spec.rkeConfig.machineGlobalConfig',
1011
+ key: 'profile'
1012
+ }
1013
+ ];
1014
+ }
1015
+
1016
+ return null;
1017
+ }
1018
+
1060
1019
  // JSON Paths that should be folded in the YAML editor by default
1061
1020
  get yamlFolding() {
1062
1021
  return [
@@ -1088,4 +1047,8 @@ export default class ProvCluster extends SteveModel {
1088
1047
 
1089
1048
  return expireData?.expired || expireData?.expiring;
1090
1049
  }
1050
+
1051
+ get disableResourceDetailDrawerConfigTab() {
1052
+ return !!this.isHarvester;
1053
+ }
1091
1054
  }