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,210 @@
1
+ import { COUNT } from '@shell/config/types';
2
+ import { KubeLabelSelector, KubeLabelSelectorExpression } from '@shell/types/kube/kube-api';
3
+ import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
4
+ import { FilterArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
5
+ import { isEmpty } from '@shell/utils/object';
6
+ import { convert, matching as rootMatching } from '@shell/utils/selector';
7
+
8
+ type MatchingResponse = {
9
+ matched: number,
10
+ matches: any[],
11
+ none: boolean,
12
+ sample: any,
13
+ total: number,
14
+ }
15
+
16
+ /**
17
+ * Find resources that match a labelSelector. This behaves differently if vai based pagination is on
18
+ * a) Pagination Enabled - fetch matching resources filtered on backend - findPage
19
+ * b) Pagination Disabled - fetch all resources and then filter locally - findAll --> root `matching` fn
20
+ *
21
+ * This is a much smarter version of root matching fn `matching` from shell/utils/selector.js (which just does local filtering)
22
+ *
23
+ * If fetching all of a resource should be avoided or we don't want to mess around with the cache the action `findLabelSelector` should be used
24
+ * - sometimes some legacy code expects all resources are fetched
25
+ * - sometimes we want to fetch a resource but not override the cache
26
+ * - already have a pods list cached, don't want to overwrite that when finding pods associated with a service
27
+ *
28
+ * Resources are returned in a common format which includes metadata
29
+ */
30
+ export async function matching({
31
+ labelSelector,
32
+ type,
33
+ inStore,
34
+ $store,
35
+ inScopeCount = undefined,
36
+ namespace = undefined,
37
+ transient = true,
38
+ }: {
39
+ /**
40
+ * Standard kube label selector object.
41
+ *
42
+ * If this is 'empty' (no matchLabels or matchExpressions) it will return all results
43
+ *
44
+ * If this is 'null' it will return no results
45
+ */
46
+ labelSelector: KubeLabelSelector,
47
+ /**
48
+ * Resource type
49
+ */
50
+ type: string,
51
+ /**
52
+ * Store in which resources will be cached
53
+ */
54
+ inStore: string,
55
+ /**
56
+ * Standard vuex store object
57
+ */
58
+ $store: any,
59
+ /**
60
+ * Number of resources that are applicable when filtering.
61
+ *
62
+ * Used to skip any potential http request if we know the result will be zero
63
+ *
64
+ * If this property is not supplied we'll try and discover it from the COUNTS resource.
65
+ */
66
+ inScopeCount?: number
67
+ /**
68
+ * Optional namespace or namespaces to apply selector to
69
+ *
70
+ * If this is undefined then namespaces will totally be ignored
71
+ *
72
+ * If this is provided all resources must be within them. If an empty array is provided then no resources will be matched
73
+ *
74
+ */
75
+ namespace?: string | string[],
76
+ /**
77
+ * Should the result bypass the store?
78
+ */
79
+ transient?: boolean,
80
+ }): Promise<MatchingResponse> {
81
+ const isNamespaced = $store.getters[`${ inStore }/schemaFor`](type)?.attributes.namespaced;
82
+ const safeNamespaces = Array.isArray(namespace) ? namespace : !!namespace ? [namespace] : [];
83
+ const filterByNamespaces = isNamespaced && !!namespace ; // Result set must come from a resource in a namespace
84
+
85
+ // Determine if there's actually anything to filter on
86
+ if (typeof inScopeCount === 'undefined') {
87
+ const counts = $store.getters[`${ inStore }/all`](COUNT)?.[0]?.counts || {};
88
+
89
+ if (filterByNamespaces) {
90
+ inScopeCount = 0;
91
+ safeNamespaces.forEach((n) => {
92
+ inScopeCount += counts?.[type]?.namespaces[n]?.count || 0;
93
+ });
94
+ } else {
95
+ inScopeCount = counts?.[type]?.summary?.count || 0;
96
+ }
97
+ }
98
+
99
+ // Exit early if there are any situations that always return nothing
100
+ const noCandidates = (inScopeCount || 0) === 0;
101
+ const filterByNamespaceButNoNamespace = isNamespaced && !!namespace && (!safeNamespaces || safeNamespaces.length === 0);
102
+ const explicityNullLabelSelector = labelSelector === null || (labelSelector?.matchLabels === null && !labelSelector.matchExpressions === null);
103
+
104
+ // If we have matchLabels or matchExpression entries they must have a key
105
+ const matchLabelKeys = Object.keys(labelSelector.matchLabels || {});
106
+ const invalidMatchLabelKeys = matchLabelKeys.length && matchLabelKeys.filter((k) => !k).length;
107
+ const invalidMatchExpressionKeys = labelSelector?.matchExpressions?.length && labelSelector.matchExpressions.filter((me) => !me.key).length;
108
+
109
+ if (noCandidates || filterByNamespaceButNoNamespace || explicityNullLabelSelector || invalidMatchLabelKeys || invalidMatchExpressionKeys) {
110
+ return generateMatchingResponse([], inScopeCount || 0);
111
+ }
112
+
113
+ if ($store.getters[`${ inStore }/paginationEnabled`]?.({ id: type })) {
114
+ if (isLabelSelectorEmpty(labelSelector) && (!!namespace && !safeNamespaces?.length)) {
115
+ // no namespaces - ALL resources are candidates
116
+ // no labels - return all candidates
117
+ // too many to fetch...
118
+ throw new Error('Either populated labelSelector or namespace/s must be supplied in order to call findPage');
119
+ }
120
+
121
+ const findPageArgs: ActionFindPageArgs = {
122
+ pagination: new FilterArgs({
123
+ labelSelector,
124
+ filters: PaginationParamFilter.createMultipleFields(
125
+ safeNamespaces.map(
126
+ (n) => new PaginationFilterField({
127
+ field: 'metadata.namespace', // API only compatible with steve atm...
128
+ value: n,
129
+ })
130
+ )
131
+ ),
132
+ }),
133
+ transient,
134
+ };
135
+
136
+ let match = await $store.dispatch(`${ inStore }/findPage`, { type, opt: findPageArgs });
137
+
138
+ if (transient) {
139
+ match = match.data;
140
+ }
141
+
142
+ return generateMatchingResponse(match, inScopeCount || 0);
143
+ } else {
144
+ // Start off with everything as a candidate
145
+ let candidates = await $store.dispatch(`${ inStore }/findAll`, { type });
146
+
147
+ inScopeCount = candidates.length;
148
+
149
+ // Filter out namespace specific stuff
150
+ if (isNamespaced && safeNamespaces?.length > 0) {
151
+ candidates = candidates.filter((e: any) => safeNamespaces.includes(e.metadata?.namespace));
152
+ inScopeCount = candidates.length;
153
+ }
154
+
155
+ // Apply labelSelector
156
+ if (labelSelector.matchLabels || labelSelector.matchExpressions) {
157
+ candidates = matches(candidates, labelSelector, 'metadata.labels');
158
+ }
159
+
160
+ return generateMatchingResponse(candidates, inScopeCount || 0);
161
+ }
162
+ }
163
+
164
+ const generateMatchingResponse = <T extends { [key: string]: any, nameDisplay: string}>(match: T[], inScopeCount: number): MatchingResponse => {
165
+ const matched = match.length || 0;
166
+ const sample = match[0]?.nameDisplay;
167
+
168
+ return {
169
+ matched,
170
+ matches: match,
171
+ none: matched === 0,
172
+ sample,
173
+ total: inScopeCount || 0,
174
+ };
175
+ };
176
+
177
+ /**
178
+ * This is similar to shell/utils/selector.js `matches`, but accepts a kube labelSelector
179
+ */
180
+ function matches<T = any>(candidates: T[], labelSelector: KubeLabelSelector, labelKey: string): T[] {
181
+ const convertedObject = convert(labelSelector.matchLabels, labelSelector.matchExpressions);
182
+
183
+ return rootMatching(candidates, convertedObject, labelKey);
184
+ }
185
+
186
+ export function isLabelSelectorEmpty(labelSelector?: KubeLabelSelector): boolean {
187
+ return !labelSelector?.matchExpressions?.length && isEmpty(labelSelector?.matchLabels);
188
+ }
189
+
190
+ export function labelSelectorToSelector(labelSelector?: KubeLabelSelector): string {
191
+ if (isLabelSelectorEmpty(labelSelector)) {
192
+ return '';
193
+ }
194
+
195
+ const res: string[] = [];
196
+
197
+ Object.entries(labelSelector?.matchLabels || {}).forEach(([key, value]) => {
198
+ res.push(`${ key }=${ value }`);
199
+ });
200
+
201
+ (labelSelector?.matchExpressions || []).forEach((value: KubeLabelSelectorExpression) => {
202
+ if (value.operator === 'In' && value.values?.length === 1) {
203
+ res.push(`${ value.key }=${ value.values[0] }`);
204
+ } else {
205
+ throw new Error(`Unsupported matchExpression found when converting to selector string. ${ value }`);
206
+ }
207
+ });
208
+
209
+ return res.join(',');
210
+ }
package/utils/selector.js CHANGED
@@ -11,7 +11,14 @@ const OP_MAP = {
11
11
  '>': 'Gt',
12
12
  };
13
13
 
14
- // Parse a labelSelector string
14
+ /**
15
+ * Convert a string to a matchExpression object
16
+ *
17
+ * *string* is from https://github.com/kubernetes/apimachinery/blob/master/pkg/labels/selector.go#L1010.
18
+ * However... it seems to contain more operators than just `=` which the labels.Selector `String` does not use
19
+ *
20
+ * matchExpression is an array of 'key' 'operator' 'values'
21
+ */
15
22
  export function parse(labelSelector) {
16
23
  // matchLabels:
17
24
  // comma-separated list, all rules ANDed together
@@ -32,6 +39,10 @@ export function parse(labelSelector) {
32
39
  // operator: In, NotIn, Exists, or DoesNotExist
33
40
  // values: [array, of, values, even, if, only, one]
34
41
 
42
+ if (!labelSelector) {
43
+ return [];
44
+ }
45
+
35
46
  labelSelector = labelSelector.replace(/\+/g, ' ');
36
47
 
37
48
  if ( parseCache[labelSelector] ) {
@@ -101,13 +112,17 @@ export function parse(labelSelector) {
101
112
  return out;
102
113
  }
103
114
 
104
- // Convert a Selector object to matchExpressions
115
+ /**
116
+ * Convert a Selector object to matchExpressions
117
+ */
105
118
  export function convertSelectorObj(obj) {
106
119
  return convert(obj.matchLabels || {}, obj.matchExpressions || []);
107
120
  }
108
121
 
109
- // Convert matchLabels to matchExpressions
110
- // Optionally combining with an existing set of matchExpressions
122
+ /**
123
+ * Convert matchLabels to matchExpressions
124
+ * Optionally combining with an existing set of matchExpressions
125
+ */
111
126
  export function convert(matchLabelsObj, matchExpressions) {
112
127
  const keys = Object.keys(matchLabelsObj || {});
113
128
  const out = matchExpressions || [];
@@ -130,8 +145,10 @@ export function convert(matchLabelsObj, matchExpressions) {
130
145
  return out;
131
146
  }
132
147
 
133
- // Convert matchExpressions to matchLabels when possible,
134
- // returning the simplest combination of them.
148
+ /**
149
+ * Convert matchExpressions to matchLabels when possible,
150
+ * returning the simplest combination of them.
151
+ */
135
152
  export function simplify(matchExpressionsInput) {
136
153
  const matchLabels = {};
137
154
  const matchExpressions = [];
@@ -163,6 +180,12 @@ export function simplify(matchExpressionsInput) {
163
180
  return { matchLabels, matchExpressions };
164
181
  }
165
182
 
183
+ /**
184
+ *
185
+ * For a fn that accepts a kube labelSelector object see shell/utils/selector-typed.ts `matches`
186
+ *
187
+ * @param {*} selector Is NOT a labelSelector object
188
+ */
166
189
  export function matches(obj, selector, labelKey = 'metadata.labels') {
167
190
  let rules = [];
168
191
 
package/utils/settings.ts CHANGED
@@ -59,7 +59,10 @@ export const fetchInitialSettings = async(store: Store<any>): Promise<any> => {
59
59
  // We're authed, we will always get the full list
60
60
  return await store.dispatch('management/findAll', {
61
61
  type: MANAGEMENT.SETTING,
62
- opt: { url: `/v1/${ pluralize(MANAGEMENT.SETTING) }` }
62
+ opt: {
63
+ url: `/v1/${ pluralize(MANAGEMENT.SETTING) }`,
64
+ watch: false, // Watch requires FF and Settings, see `loadManagement` to see how this is handled
65
+ }
63
66
  } );
64
67
  }
65
68
 
package/utils/string.js CHANGED
@@ -361,3 +361,27 @@ export function isBase64(value) {
361
361
  export function generateRandomAlphaString(length) {
362
362
  return Array.from({ length }, () => String.fromCharCode(97 + Math.random() * 26 | 0)).join('');
363
363
  }
364
+
365
+ /**
366
+ * Generate a key-value nested object from a list of paths that represents a directory tree.
367
+ *
368
+ * Each key is a subpath
369
+ * Each value contains the children of the subpath
370
+ */
371
+ export function pathArrayToTree(paths) {
372
+ const result = [];
373
+ const level = { result };
374
+
375
+ paths.forEach((path) => {
376
+ path?.split('/').reduce((r, name) => {
377
+ if (!r[name]) {
378
+ r[name] = { result: [] };
379
+ r.result.push({ name, children: r[name].result });
380
+ }
381
+
382
+ return r[name];
383
+ }, level);
384
+ });
385
+
386
+ return result;
387
+ }
package/utils/style.ts ADDED
@@ -0,0 +1,39 @@
1
+ export type StateColor = 'success' | 'warning' | 'error' | 'info' | 'disabled';
2
+ export const ALL_STATE_COLORS: StateColor[] = ['success', 'warning', 'error', 'info', 'disabled'];
3
+
4
+ export function stateColorCssVar(color: StateColor) {
5
+ return `var(--${ color })`;
6
+ }
7
+
8
+ export function toBgColor(color?: StateColor) {
9
+ const withDefaultColor = color || 'info';
10
+
11
+ return `bg-${ withDefaultColor }`;
12
+ }
13
+
14
+ /**
15
+ * Checks if 'a' is considered a higher alert than 'b'
16
+ * @param a target
17
+ * @param b comparison
18
+ * @returns true if 'a' is a higher alert than 'b' and false otherwise.
19
+ */
20
+ export function isHigherAlert(a: StateColor, b: StateColor) {
21
+ const order: StateColor[] = ['info', 'success', 'warning', 'error'];
22
+
23
+ const aIndex = order.indexOf(a);
24
+ const bIndex = order.indexOf(b);
25
+
26
+ return aIndex > bIndex;
27
+ }
28
+
29
+ export function getHighestAlertColor(colors: StateColor[]) {
30
+ let highestAlert: StateColor = 'info';
31
+
32
+ for (const color of colors) {
33
+ if (isHigherAlert(color, highestAlert)) {
34
+ highestAlert = color;
35
+ }
36
+ }
37
+
38
+ return highestAlert;
39
+ }
@@ -1,4 +1,7 @@
1
1
  import day from 'dayjs';
2
+ import { escapeHtml } from '@shell/utils/string';
3
+ import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
4
+ import { type Store } from 'vuex';
2
5
 
3
6
  const FACTORS = [60, 60, 24];
4
7
  const LABELS = ['sec', 'min', 'hour', 'day'];
@@ -6,7 +9,7 @@ const LABELS = ['sec', 'min', 'hour', 'day'];
6
9
  // Diff two dates and return an object with values for presentation
7
10
  // If 't' is also passed, 'string' property is set on the return object with the diff formatted as a string
8
11
  // e.g. formats a date difference to return '1 day', '20 hours' etc
9
- export function diffFrom(value, from, t) {
12
+ export function diffFrom(value: any, from: any, t: any) {
10
13
  const now = day();
11
14
 
12
15
  from = from || now;
@@ -15,7 +18,7 @@ export function diffFrom(value, from, t) {
15
18
  let absDiff = Math.abs(diff);
16
19
 
17
20
  let next = 1;
18
- let label = '?';
21
+ let label: any = '?';
19
22
 
20
23
  let i = 0;
21
24
 
@@ -30,7 +33,7 @@ export function diffFrom(value, from, t) {
30
33
  } else {
31
34
  label = Math.floor(absDiff);
32
35
  }
33
- const ret = {
36
+ const ret: any = {
34
37
  diff,
35
38
  absDiff,
36
39
  label,
@@ -47,7 +50,7 @@ export function diffFrom(value, from, t) {
47
50
  return ret;
48
51
  }
49
52
 
50
- export function safeSetTimeout(timeout, callback, that) {
53
+ export function safeSetTimeout(timeout: any, callback: any, that: any) {
51
54
  if (timeout <= 2147483647) {
52
55
  // Max value setTimeout can take is max 32 bit int (about 24.9 days)
53
56
  return setTimeout(() => {
@@ -56,7 +59,7 @@ export function safeSetTimeout(timeout, callback, that) {
56
59
  }
57
60
  }
58
61
 
59
- export function getSecondsDiff(startDate, endDate) {
62
+ export function getSecondsDiff(startDate: any, endDate: any) {
60
63
  return Math.round(
61
64
  Math.abs(Date.parse(endDate) - Date.parse(startDate)) / 1000
62
65
  );
@@ -68,7 +71,7 @@ export function getSecondsDiff(startDate, endDate) {
68
71
  * diff: update frequency in seconds
69
72
  * label: content of the cell's column
70
73
  */
71
- export function elapsedTime(seconds) {
74
+ export function elapsedTime(seconds: any) {
72
75
  if (!seconds) {
73
76
  return {};
74
77
  }
@@ -119,3 +122,19 @@ export function elapsedTime(seconds) {
119
122
  label: `${ hours }h${ minutes - (hours * 60) }m`,
120
123
  };
121
124
  }
125
+
126
+ /**
127
+ * Format date and time using user preferences
128
+ * @param value Date string to format
129
+ * @returns Formatted date string
130
+ */
131
+ export const dateTimeFormat = (value: string | undefined, store: Store<any>): string => {
132
+ if (!value) return '';
133
+
134
+ const dateFormat = escapeHtml( store.getters['prefs/get'](DATE_FORMAT));
135
+ const timeFormat = escapeHtml( store.getters['prefs/get'](TIME_FORMAT));
136
+
137
+ const format = `${ dateFormat } ${ timeFormat }`;
138
+
139
+ return day(value).format(format);
140
+ };
@@ -1,7 +1,7 @@
1
1
  import { matchesSomeRegex } from '@shell/utils/string';
2
2
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
3
3
  import { CATALOG } from '@shell/config/types';
4
- import { UI_PLUGIN_BASE_URL, isSupportedChartVersion } from '@shell/config/uiplugins';
4
+ import { UI_PLUGIN_BASE_URL, isSupportedChartVersion, UI_PLUGIN_LABELS } from '@shell/config/uiplugins';
5
5
 
6
6
  const MAX_RETRIES = 10;
7
7
  const RETRY_WAIT = 2500;
@@ -44,9 +44,11 @@ export async function getLatestExtensionVersion(
44
44
  *
45
45
  * @param store Vue store
46
46
  * @param name Name of the extension
47
+ * @param maxRetries Number of times to check for availability
48
+ * @param retryWait Gap (in ms) between availability checks
47
49
  * @returns the extension object when available, null if timed out waiting for it to be available
48
50
  */
49
- export async function waitForUIExtension(store: any, name: string): Promise<any> {
51
+ export async function waitForUIExtension(store: any, name: string, maxRetries = MAX_RETRIES, retryWait = RETRY_WAIT): Promise<any> {
50
52
  let tries = 0;
51
53
 
52
54
  while (true) {
@@ -69,11 +71,11 @@ export async function waitForUIExtension(store: any, name: string): Promise<any>
69
71
 
70
72
  tries++;
71
73
 
72
- if (tries > MAX_RETRIES) {
74
+ if (tries > maxRetries) {
73
75
  return null;
74
76
  }
75
77
 
76
- await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
78
+ await new Promise((resolve) => setTimeout(resolve, retryWait));
77
79
  }
78
80
  }
79
81
 
@@ -82,9 +84,11 @@ export async function waitForUIExtension(store: any, name: string): Promise<any>
82
84
  *
83
85
  * @param store Vue store
84
86
  * @param extension Extension object
87
+ * @param maxRetries Number of times to check for availability
88
+ * @param retryWait Gap (in MS) between availability checks
85
89
  * @returns true when available, false if timed out waiting for it to be available
86
90
  */
87
- export async function waitForUIPackage(store: any, extension: any): Promise<boolean> {
91
+ export async function waitForUIPackage(store: any, extension: any, maxRetries = MAX_RETRIES, retryWait = RETRY_WAIT): Promise<boolean> {
88
92
  let tries = 0;
89
93
 
90
94
  const { name, version } = extension;
@@ -104,11 +108,11 @@ export async function waitForUIPackage(store: any, extension: any): Promise<bool
104
108
 
105
109
  tries++;
106
110
 
107
- if (tries > MAX_RETRIES) {
111
+ if (tries > maxRetries) {
108
112
  return false;
109
113
  }
110
114
 
111
- await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
115
+ await new Promise((resolve) => setTimeout(resolve, retryWait));
112
116
  }
113
117
  }
114
118
 
@@ -176,10 +180,17 @@ export async function getHelmRepositoryExact(store: any, url: string): Promise<H
176
180
  *
177
181
  * @param store Vue store
178
182
  * @param urlRegexes Regex to match a community repository
183
+ * @param catalogImages Catalog images to match against the repository's labels
179
184
  * @returns HelmRepository
180
185
  */
181
- export async function getHelmRepositoryMatch(store: any, urlRegexes: string[]): Promise<HelmRepository> {
186
+ export async function getHelmRepositoryMatch(store: any, urlRegexes: string[], catalogImages: string[]): Promise<HelmRepository> {
182
187
  return await getHelmRepository(store, (repository: any) => {
188
+ // if installed from rancher/ui-plugin-catalog or rancher/ui-extension-harvester-ui-extension
189
+ const catalog = repository?.metadata?.labels?.[UI_PLUGIN_LABELS.CATALOG_IMAGE] || '';
190
+
191
+ if (catalogImages.includes(catalog)) {
192
+ return true;
193
+ }
183
194
  const target = repository.spec?.gitBranch ? repository.spec?.gitRepo : repository.spec?.url;
184
195
 
185
196
  return matchesSomeRegex(target, urlRegexes);
@@ -317,3 +328,25 @@ export async function getHelmChart(store: any, repository: any, chartName: strin
317
328
  await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
318
329
  }
319
330
  }
331
+
332
+ export async function onExtensionsReady(store: any) {
333
+ const alreadyReady = store.getters['uiplugins/ready'];
334
+
335
+ if (alreadyReady) {
336
+ return;
337
+ }
338
+
339
+ const extensions = store.getters['uiplugins/plugins'] || [];
340
+
341
+ for (let i = 0; i < extensions.length; i++) {
342
+ const ext = extensions[i];
343
+
344
+ try {
345
+ await ext.onLogIn(store);
346
+ } catch (e) {
347
+ console.error(`Exception caught in onReady for extension ${ ext.name }`, e); // eslint-disable-line no-console
348
+ }
349
+ }
350
+
351
+ await store.dispatch('uiplugins/setReady', true);
352
+ }
package/utils/v-sphere.ts CHANGED
@@ -40,7 +40,11 @@ class VSphereUtils {
40
40
  generateName, upstreamClusterName, upstreamNamespace, downstreamName, downstreamNamespace
41
41
  }: SecretDetails): Promise<SecretJson | undefined> {
42
42
  // Fetch secrets in a specific namespace and partially matching the name to the generate name
43
- const secrets = await $store.dispatch('management/request', { url: `/v1/${ SECRET }/${ upstreamNamespace }?filter=metadata.name=${ generateName }` });
43
+ const url = $store.getters['management/urlOptions'](
44
+ `/v1/${ SECRET }/${ upstreamNamespace }`,
45
+ { filter: { 'metadata.name': generateName } }
46
+ );
47
+ const secrets = await $store.dispatch('management/request', { url });
44
48
 
45
49
  // Filter by specific annotations
46
50
  const applicableSecret = secrets.data?.filter((s: any) => {