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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (761) hide show
  1. package/assets/brand/csp/favicon.png +0 -0
  2. package/assets/data/aws-regions.json +3 -0
  3. package/assets/icons/demo.css:Zone.Identifier +0 -0
  4. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  5. package/assets/icons/iconfont.css +4 -1
  6. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  8. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  10. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  11. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  12. package/assets/iconsNew/demo.css +539 -0
  13. package/assets/iconsNew/demo.css:Zone.Identifier +0 -0
  14. package/assets/iconsNew/demo_index.html +303 -0
  15. package/assets/iconsNew/demo_index.html:Zone.Identifier +0 -0
  16. package/assets/iconsNew/iconfont.css +43 -0
  17. package/assets/iconsNew/iconfont.css:Zone.Identifier +0 -0
  18. package/assets/iconsNew/iconfont.js +1 -0
  19. package/assets/iconsNew/iconfont.js:Zone.Identifier +0 -0
  20. package/assets/iconsNew/iconfont.json +44 -0
  21. package/assets/iconsNew/iconfont.json:Zone.Identifier +0 -0
  22. package/assets/iconsNew/iconfont.ttf +0 -0
  23. package/assets/iconsNew/iconfont.ttf:Zone.Identifier +0 -0
  24. package/assets/iconsNew/iconfont.woff +0 -0
  25. package/assets/iconsNew/iconfont.woff2 +0 -0
  26. package/assets/iconsNew/iconfont.woff2:Zone.Identifier +0 -0
  27. package/assets/iconsNew/iconfont.woff:Zone.Identifier +0 -0
  28. package/assets/images/icons/document.svg +3 -0
  29. package/assets/images/key.svg +17 -0
  30. package/assets/images/pl/dark/logo.png +0 -0
  31. package/assets/images/providers/sks.svg +1 -0
  32. package/assets/images/vendor/cognito.svg +1 -0
  33. package/assets/styles/all.scss +23 -3
  34. package/assets/styles/app.scss +4 -0
  35. package/assets/styles/base/_basic.scss +10 -0
  36. package/assets/styles/base/_helpers.scss +1 -1
  37. package/assets/styles/base/_spacing.scss +29 -0
  38. package/assets/styles/base/_variables.scss +21 -15
  39. package/assets/styles/fonts/_icons.scss +3 -2
  40. package/assets/styles/global/_button.scss +8 -8
  41. package/assets/styles/global/_form.scss +1 -0
  42. package/assets/styles/global/_labeled-input.scss +1 -1
  43. package/assets/styles/global/_layout.scss +1 -1
  44. package/assets/styles/global/_select.scss +1 -1
  45. package/assets/styles/global/_tooltip.scss +9 -5
  46. package/assets/styles/themes/_dark.scss +30 -0
  47. package/assets/styles/themes/_light.scss +85 -5
  48. package/assets/styles/vendor/vue-select.scss +2 -1
  49. package/assets/translations/en-us.yaml +886 -105
  50. package/assets/translations/zh-hans.yaml +298 -25
  51. package/chart/__tests__/S3.test.ts +2 -1
  52. package/chart/monitoring/index.vue +1 -1
  53. package/cloud-credential/gcp.vue +9 -1
  54. package/components/ActionDropdown.vue +1 -1
  55. package/components/ActionMenuShell.vue +3 -7
  56. package/components/AppModal.vue +9 -28
  57. package/components/AsyncButton.vue +2 -0
  58. package/components/BrandImage.vue +0 -21
  59. package/components/ButtonDropdown.vue +3 -1
  60. package/components/Certificates.vue +5 -0
  61. package/components/ClusterIconMenu.vue +1 -1
  62. package/components/CodeMirror.vue +9 -7
  63. package/components/CommunityLinks.vue +3 -58
  64. package/components/ConfigMapSettings/Settings.vue +377 -0
  65. package/components/ConfigMapSettings/index.vue +354 -0
  66. package/components/ConsumptionGauge.vue +1 -1
  67. package/components/ContainerResourceLimit.vue +2 -2
  68. package/components/CopyToClipboard.vue +15 -0
  69. package/components/CruResource.vue +106 -18
  70. package/components/DetailText.vue +61 -11
  71. package/components/Drawer/Chrome.vue +115 -0
  72. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +64 -0
  73. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  74. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  75. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  76. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  77. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  78. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  79. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  80. package/components/Drawer/ResourceDetailDrawer/index.vue +124 -0
  81. package/components/ExplorerMembers.vue +28 -4
  82. package/components/ExplorerProjectsNamespaces.vue +46 -29
  83. package/components/FilterPanel.vue +156 -0
  84. package/components/FixedBanner.vue +19 -5
  85. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  86. package/components/GlobalRoleBindings.vue +69 -114
  87. package/components/GrowlManager.vue +16 -15
  88. package/components/IconOrSvg.vue +19 -35
  89. package/components/KeyValueView.vue +1 -1
  90. package/components/LandingPagePreference.vue +2 -0
  91. package/components/Loading.vue +1 -1
  92. package/components/LocaleSelector.vue +10 -2
  93. package/components/PaginatedResourceTable.vue +53 -1
  94. package/components/PodSecurityAdmission.vue +2 -2
  95. package/components/ProgressBarMulti.vue +1 -0
  96. package/components/PromptModal.vue +38 -7
  97. package/components/PromptRemove.vue +28 -2
  98. package/components/PromptRestore.vue +22 -44
  99. package/components/RelatedResources.vue +7 -12
  100. package/components/Resource/Detail/Additional.vue +46 -0
  101. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  102. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  103. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  104. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  105. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  106. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  107. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  108. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  109. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  110. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  111. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  112. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  113. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  114. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  115. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  116. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  117. package/components/Resource/Detail/Card/index.vue +56 -0
  118. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  119. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  120. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  121. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  122. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  123. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  124. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  125. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +138 -0
  126. package/components/Resource/Detail/Metadata/KeyValue.vue +144 -0
  127. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  128. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  129. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  130. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  131. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  132. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  133. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  134. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  135. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  136. package/components/Resource/Detail/Metadata/index.vue +90 -0
  137. package/components/Resource/Detail/Page.vue +37 -0
  138. package/components/Resource/Detail/PercentageBar.vue +40 -0
  139. package/components/Resource/Detail/ResourceRow.vue +138 -0
  140. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  141. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  142. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  143. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  144. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  145. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  146. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  147. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  148. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  149. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  150. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  151. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  152. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  153. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  154. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  155. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  156. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  157. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  158. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  159. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  160. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  161. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  162. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  163. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  164. package/components/Resource/Detail/SpacedRow.vue +14 -0
  165. package/components/Resource/Detail/StatusBar.vue +59 -0
  166. package/components/Resource/Detail/StatusRow.vue +61 -0
  167. package/components/Resource/Detail/TitleBar/Title.vue +15 -0
  168. package/components/Resource/Detail/TitleBar/Top.vue +16 -0
  169. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  170. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  171. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  172. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  173. package/components/Resource/Detail/TitleBar/composables.ts +61 -0
  174. package/components/Resource/Detail/TitleBar/index.vue +302 -0
  175. package/components/Resource/Detail/Top/index.vue +34 -0
  176. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  177. package/components/Resource/Detail/composables.ts +45 -0
  178. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  179. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  180. package/components/ResourceDetail/Masthead/index.vue +65 -0
  181. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  182. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +240 -169
  183. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  184. package/components/ResourceDetail/index.vue +75 -575
  185. package/components/ResourceDetail/legacy.vue +580 -0
  186. package/components/ResourceList/Masthead.vue +74 -29
  187. package/components/ResourceList/index.vue +3 -2
  188. package/components/ResourceTable.vue +75 -85
  189. package/components/ResourceYaml.vue +15 -2
  190. package/components/RichTranslation.vue +106 -0
  191. package/components/SideNav.vue +21 -21
  192. package/components/SingleClusterInfo.vue +2 -1
  193. package/components/SlideInPanelManager.vue +116 -14
  194. package/components/SortableTable/THead.vue +46 -1
  195. package/components/SortableTable/index.vue +66 -22
  196. package/components/SortableTable/paging.js +15 -16
  197. package/components/SortableTable/selection.js +22 -10
  198. package/components/StateDot/index.vue +28 -0
  199. package/components/StatusBadge.vue +6 -4
  200. package/components/SubtleLink.vue +25 -0
  201. package/components/Tabbed/index.vue +43 -22
  202. package/components/Wizard.vue +16 -3
  203. package/components/YamlEditor.vue +1 -2
  204. package/components/__tests__/AsyncButton.test.ts +39 -0
  205. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  206. package/components/__tests__/CruResource.test.ts +63 -0
  207. package/components/__tests__/FilterPanel.test.ts +81 -0
  208. package/components/__tests__/GrowlManager.test.ts +0 -25
  209. package/components/__tests__/PromptModal.test.ts +146 -0
  210. package/components/__tests__/PromptRestore.test.ts +1 -65
  211. package/components/__tests__/RichTranslation.test.ts +115 -0
  212. package/components/auth/AuthBanner.vue +15 -14
  213. package/components/auth/Principal.vue +50 -19
  214. package/components/auth/RoleDetailEdit.vue +55 -11
  215. package/components/auth/login/ldap.vue +2 -2
  216. package/components/auth/login/oidc.vue +6 -1
  217. package/components/breadcrumb/index.vue +119 -0
  218. package/components/fleet/FleetApplications.vue +174 -0
  219. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  220. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  221. package/components/fleet/FleetClusters.vue +25 -6
  222. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  223. package/components/fleet/FleetHelmOps.vue +123 -0
  224. package/components/fleet/FleetIntro.vue +58 -28
  225. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  226. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  227. package/components/fleet/FleetRepos.vue +37 -80
  228. package/components/fleet/FleetResources.vue +69 -27
  229. package/components/fleet/FleetSummary.vue +26 -51
  230. package/components/fleet/FleetValuesFrom.vue +295 -0
  231. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  232. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  233. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  234. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  235. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  236. package/components/fleet/dashboard/Empty.vue +73 -0
  237. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  238. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  239. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  240. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  241. package/components/form/ArrayList.vue +187 -142
  242. package/components/form/ArrayListGrouped.vue +5 -3
  243. package/components/form/BannerSettings.vue +117 -50
  244. package/components/form/ChangePassword.vue +4 -2
  245. package/components/form/ClusterAppearance.vue +4 -3
  246. package/components/form/ColorInput.vue +35 -6
  247. package/components/form/Command.vue +4 -5
  248. package/components/form/Conditions.vue +15 -1
  249. package/components/form/FileImageSelector.vue +1 -1
  250. package/components/form/Footer.vue +11 -4
  251. package/components/form/HealthCheck.vue +0 -2
  252. package/components/form/HookOption.vue +87 -58
  253. package/components/form/InputWithSelect.vue +8 -7
  254. package/components/form/KeyValue.vue +112 -53
  255. package/components/form/LabeledSelect.vue +76 -55
  256. package/components/form/Labels.vue +92 -22
  257. package/components/form/MatchExpressions.vue +59 -12
  258. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  259. package/components/form/Members/ClusterPermissionsEditor.vue +60 -41
  260. package/components/form/Members/MembershipEditor.vue +4 -4
  261. package/components/form/Members/ProjectMembershipEditor.vue +1 -1
  262. package/components/form/NameNsDescription.vue +15 -10
  263. package/components/form/Networking.vue +30 -28
  264. package/components/form/NodeAffinity.vue +29 -28
  265. package/components/form/NotificationSettings.vue +15 -1
  266. package/components/form/PodAffinity.vue +23 -23
  267. package/components/form/Probe.vue +15 -11
  268. package/components/form/ProjectMemberEditor.vue +66 -48
  269. package/components/form/ResourceLabeledSelect.vue +22 -8
  270. package/components/form/ResourceQuota/Namespace.vue +4 -4
  271. package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
  272. package/components/form/ResourceQuota/Project.vue +4 -4
  273. package/components/form/ResourceQuota/ProjectRow.vue +36 -30
  274. package/components/form/ResourceSelector.vue +28 -24
  275. package/components/form/ResourceTabs/index.vue +7 -1
  276. package/components/form/SSHKnownHosts/index.vue +14 -11
  277. package/components/form/SecretSelector.vue +40 -23
  278. package/components/form/Security.vue +1 -3
  279. package/components/form/Select.vue +64 -27
  280. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  281. package/components/form/ServiceNameSelect.vue +2 -5
  282. package/components/form/ServicePorts.vue +149 -75
  283. package/components/form/SimpleSecretSelector.vue +17 -4
  284. package/components/form/Taints.vue +23 -3
  285. package/components/form/Tolerations.vue +13 -9
  286. package/components/form/UnitInput.vue +21 -0
  287. package/components/form/ValueFromResource.vue +136 -110
  288. package/components/form/WorkloadPorts.vue +143 -123
  289. package/components/form/__tests__/ArrayList.test.ts +32 -0
  290. package/components/form/__tests__/ColorInput.test.ts +35 -0
  291. package/components/form/__tests__/KeyValue.test.ts +36 -0
  292. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  293. package/components/form/__tests__/Labels.test.ts +360 -0
  294. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  295. package/components/form/__tests__/Networking.test.ts +116 -0
  296. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  297. package/components/form/__tests__/Select.test.ts +37 -1
  298. package/components/form/__tests__/UnitInput.test.ts +23 -1
  299. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  300. package/components/formatter/ClusterLink.vue +5 -8
  301. package/components/formatter/Description.vue +30 -0
  302. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  303. package/components/formatter/FleetApplicationSource.vue +79 -0
  304. package/components/formatter/FleetSummaryGraph.vue +7 -0
  305. package/components/formatter/PodImages.vue +1 -1
  306. package/components/formatter/WorkloadHealthScale.vue +5 -4
  307. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  308. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  309. package/components/google/AccountAccess.vue +209 -0
  310. package/components/google/types/gcp.d.ts +136 -0
  311. package/components/google/types/index.d.ts +101 -0
  312. package/components/google/util/__mocks__/gcp.ts +465 -0
  313. package/components/google/util/formatter.ts +82 -0
  314. package/components/google/util/gcp.ts +134 -0
  315. package/components/google/util/index.d.ts +11 -0
  316. package/components/nav/Favorite.vue +1 -1
  317. package/components/nav/Group.vue +13 -1
  318. package/components/nav/Header.vue +44 -179
  319. package/components/nav/NamespaceFilter.vue +126 -75
  320. package/components/nav/NotificationCenter/Notification.vue +484 -0
  321. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  322. package/components/nav/NotificationCenter/index.vue +148 -0
  323. package/components/nav/TopLevelMenu.helper.ts +55 -34
  324. package/components/nav/TopLevelMenu.vue +110 -125
  325. package/components/nav/Type.vue +15 -4
  326. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  327. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  328. package/components/nav/WindowManager/index.vue +3 -2
  329. package/components/templates/default.vue +0 -3
  330. package/components/templates/plain.vue +0 -3
  331. package/composables/drawer.ts +26 -0
  332. package/composables/focusTrap.ts +3 -3
  333. package/composables/resources.test.ts +63 -0
  334. package/composables/resources.ts +38 -0
  335. package/composables/useI18n.ts +12 -11
  336. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  337. package/config/labels-annotations.js +22 -11
  338. package/config/menuRouteMap.js +10 -0
  339. package/config/pagination-table-headers.js +8 -1
  340. package/config/private-label.js +0 -1
  341. package/config/product/auth.js +20 -3
  342. package/config/product/{cis.js → compliance.js} +23 -26
  343. package/config/product/explorer.js +80 -26
  344. package/config/product/fleet.js +77 -17
  345. package/config/product/manager.js +29 -46
  346. package/config/product/settings.js +23 -11
  347. package/config/product/uiplugins.js +13 -10
  348. package/config/query-params.js +16 -1
  349. package/config/roles.ts +2 -1
  350. package/config/router/navigation-guards/authentication.js +51 -2
  351. package/config/router/navigation-guards/index.js +16 -20
  352. package/config/router/routes.js +65 -31
  353. package/config/secret.ts +15 -0
  354. package/config/settings.ts +33 -16
  355. package/config/store.js +2 -0
  356. package/config/system-namespaces.js +1 -1
  357. package/config/table-headers.js +91 -30
  358. package/config/types.js +18 -7
  359. package/config/version.js +1 -1
  360. package/core/plugin-helpers.ts +3 -2
  361. package/core/plugin.ts +32 -7
  362. package/core/types.ts +25 -7
  363. package/detail/catalog.cattle.io.app.vue +5 -1
  364. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  365. package/detail/fleet.cattle.io.bundle.vue +70 -6
  366. package/detail/fleet.cattle.io.cluster.vue +28 -15
  367. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  368. package/detail/fleet.cattle.io.helmop.vue +157 -0
  369. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  370. package/detail/management.cattle.io.oidcclient.vue +369 -0
  371. package/detail/namespace.vue +0 -3
  372. package/detail/node.vue +48 -39
  373. package/detail/pod.vue +2 -2
  374. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  375. package/detail/service.vue +10 -2
  376. package/detail/workload/index.vue +48 -39
  377. package/dialog/AddCustomBadgeDialog.vue +17 -10
  378. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  379. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  380. package/dialog/AssignToDialog.vue +176 -0
  381. package/dialog/ChangePasswordDialog.vue +106 -0
  382. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  383. package/dialog/DisableAuthProviderDialog.vue +101 -0
  384. package/dialog/DrainNode.vue +1 -1
  385. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  386. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  387. package/dialog/FeatureFlagListDialog.vue +288 -0
  388. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  389. package/dialog/GenericPrompt.vue +1 -1
  390. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  391. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  392. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  393. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  394. package/dialog/MoveNamespaceDialog.vue +157 -0
  395. package/dialog/OidcClientSecretDialog.vue +117 -0
  396. package/dialog/RedeployWorkloadDialog.vue +164 -0
  397. package/dialog/RollbackWorkloadDialog.vue +1 -1
  398. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  399. package/dialog/ScalePoolDownDialog.vue +1 -1
  400. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  401. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  402. package/dialog/WechatDialog.vue +57 -0
  403. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  404. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  405. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  406. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  407. package/edit/__tests__/service.test.ts +2 -1
  408. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  409. package/edit/auth/ldap/config.vue +24 -0
  410. package/edit/auth/oidc.vue +159 -93
  411. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  412. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  413. package/edit/autoscaling.horizontalpodautoscaler/index.vue +7 -2
  414. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  415. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  416. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  417. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  418. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  419. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  420. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  421. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  422. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  423. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  424. package/edit/configmap.vue +12 -2
  425. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  426. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  427. package/edit/fleet.cattle.io.helmop.vue +786 -0
  428. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  429. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  430. package/edit/logging-flow/index.vue +2 -2
  431. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  432. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +8 -9
  433. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +19 -19
  434. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +23 -23
  435. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +19 -19
  436. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +14 -14
  437. package/edit/logging.banzaicloud.io.output/providers/forward.vue +12 -12
  438. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +23 -23
  439. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +6 -6
  440. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +10 -10
  441. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +8 -8
  442. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +17 -17
  443. package/edit/logging.banzaicloud.io.output/providers/logz.vue +7 -7
  444. package/edit/logging.banzaicloud.io.output/providers/loki.vue +12 -12
  445. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +3 -3
  446. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +14 -14
  447. package/edit/logging.banzaicloud.io.output/providers/redis.vue +6 -6
  448. package/edit/logging.banzaicloud.io.output/providers/s3.vue +23 -23
  449. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +13 -13
  450. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +2 -2
  451. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +54 -54
  452. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  453. package/edit/management.cattle.io.oidcclient.vue +162 -0
  454. package/edit/management.cattle.io.project.vue +4 -1
  455. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  456. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  457. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  458. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  459. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  460. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  461. package/edit/monitoring.coreos.com.route.vue +1 -0
  462. package/edit/namespace.vue +2 -4
  463. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  464. package/edit/networking.k8s.io.ingress/Certificate.vue +25 -8
  465. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  466. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  467. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  468. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  469. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  470. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +6 -17
  471. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  472. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +69 -73
  473. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  474. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  475. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  476. package/edit/networking.k8s.io.networkpolicy/index.vue +24 -32
  477. package/edit/node.vue +1 -0
  478. package/edit/persistentvolume/index.vue +7 -2
  479. package/edit/persistentvolumeclaim.vue +2 -0
  480. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  481. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  482. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  483. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  484. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  485. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +49 -40
  486. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  487. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  488. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  489. package/edit/resources.cattle.io.restore.vue +1 -1
  490. package/edit/secret/basic.vue +1 -0
  491. package/edit/secret/index.vue +129 -17
  492. package/edit/service.vue +21 -30
  493. package/edit/serviceaccount.vue +4 -1
  494. package/edit/storage.k8s.io.storageclass/index.vue +14 -9
  495. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  496. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  497. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  498. package/edit/workload/Job.vue +31 -34
  499. package/edit/workload/Upgrading.vue +5 -5
  500. package/edit/workload/index.vue +32 -32
  501. package/edit/workload/mixins/workload.js +0 -2
  502. package/edit/workload/storage/Mount.vue +1 -0
  503. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  504. package/edit/workload/storage/azureDisk.vue +14 -10
  505. package/edit/workload/storage/azureFile.vue +9 -7
  506. package/edit/workload/storage/csi/index.vue +6 -9
  507. package/edit/workload/storage/emptyDir.vue +7 -5
  508. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  509. package/edit/workload/storage/hostPath.vue +7 -5
  510. package/edit/workload/storage/nfs.vue +8 -6
  511. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  512. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  513. package/edit/workload/storage/secret.vue +9 -6
  514. package/edit/workload/storage/vsphereVolume.vue +11 -7
  515. package/initialize/app-extended.js +7 -1
  516. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  517. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  518. package/list/fleet.cattle.io.helmop.vue +108 -0
  519. package/list/harvesterhci.io.management.cluster.vue +0 -17
  520. package/list/management.cattle.io.feature.vue +4 -288
  521. package/list/management.cattle.io.oidcclient.vue +108 -0
  522. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +8 -6
  523. package/list/management.cattle.io.user.vue +13 -20
  524. package/list/namespace.vue +6 -2
  525. package/list/node.vue +2 -0
  526. package/list/projectsecret.vue +345 -0
  527. package/list/secret.vue +109 -0
  528. package/list/workload.vue +6 -2
  529. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  530. package/machine-config/amazonec2.vue +3 -24
  531. package/machine-config/components/GCEImage.vue +374 -0
  532. package/machine-config/google.vue +617 -0
  533. package/machine-config/vmwarevsphere.vue +7 -17
  534. package/mixins/__tests__/brand.spec.ts +170 -0
  535. package/mixins/auth-config.js +8 -1
  536. package/mixins/brand.js +16 -17
  537. package/mixins/create-edit-view/impl.js +20 -1
  538. package/mixins/create-edit-view/index.js +5 -0
  539. package/mixins/preset.js +100 -0
  540. package/mixins/resource-fetch-api-pagination.js +73 -44
  541. package/mixins/resource-fetch.js +18 -8
  542. package/mixins/resource-table-watch.js +45 -0
  543. package/mixins/vue-select-overrides.js +1 -4
  544. package/models/__tests__/chart.test.ts +296 -0
  545. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  546. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  547. package/models/__tests__/node.test.ts +7 -63
  548. package/models/__tests__/workload.test.ts +1 -0
  549. package/models/chart.js +157 -2
  550. package/models/cluster/node.js +2 -1
  551. package/models/cluster.js +32 -2
  552. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  553. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  554. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  555. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  556. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  557. package/models/fleet-application.js +297 -0
  558. package/models/fleet.cattle.io.bundle.js +9 -8
  559. package/models/fleet.cattle.io.cluster.js +21 -4
  560. package/models/fleet.cattle.io.gitrepo.js +46 -382
  561. package/models/fleet.cattle.io.helmop.js +202 -0
  562. package/models/management.cattle.io.authconfig.js +1 -0
  563. package/models/management.cattle.io.cluster.js +0 -20
  564. package/models/management.cattle.io.feature.js +7 -1
  565. package/models/management.cattle.io.fleetworkspace.js +14 -1
  566. package/models/management.cattle.io.node.js +7 -22
  567. package/models/management.cattle.io.nodepool.js +12 -0
  568. package/models/management.cattle.io.oidcclient.js +18 -0
  569. package/models/management.cattle.io.registration.js +3 -0
  570. package/models/management.cattle.io.setting.js +0 -1
  571. package/models/namespace.js +12 -1
  572. package/models/provisioning.cattle.io.cluster.js +79 -115
  573. package/models/secret.js +157 -2
  574. package/models/service.js +28 -9
  575. package/models/storage.k8s.io.storageclass.js +2 -2
  576. package/models/workload.js +93 -53
  577. package/package.json +6 -5
  578. package/pages/about.vue +17 -61
  579. package/pages/account/index.vue +105 -116
  580. package/pages/auth/login.vue +2 -3
  581. package/pages/auth/setup.vue +36 -17
  582. package/pages/auth/verify.vue +13 -1
  583. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  584. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  585. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  586. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  587. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  588. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  589. package/pages/c/_cluster/auth/roles/index.vue +72 -44
  590. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  591. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  592. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  593. package/pages/c/_cluster/explorer/index.vue +16 -4
  594. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  595. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  596. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  597. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  598. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  599. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  600. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  601. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  602. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  603. package/pages/c/_cluster/fleet/index.vue +866 -328
  604. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  605. package/pages/c/_cluster/longhorn/index.vue +5 -2
  606. package/pages/c/_cluster/settings/banners.vue +56 -2
  607. package/pages/c/_cluster/settings/brand.vue +2 -1
  608. package/pages/c/_cluster/settings/performance.vue +7 -26
  609. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  610. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  611. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  612. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  613. package/pages/explorer/resource/detail/configmap.vue +42 -0
  614. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  615. package/pages/explorer/resource/detail/secret.vue +63 -0
  616. package/pages/home.vue +63 -117
  617. package/pages/prefs.vue +0 -1
  618. package/pages/support/index.vue +4 -6
  619. package/pkg/tsconfig.json +9 -9
  620. package/pkg/vue.config.js +1 -1
  621. package/plugins/clean-html.js +2 -0
  622. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  623. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  624. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  625. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  626. package/plugins/dashboard-store/actions.js +213 -56
  627. package/plugins/dashboard-store/getters.js +112 -24
  628. package/plugins/dashboard-store/mutations.js +61 -12
  629. package/plugins/dashboard-store/normalize.js +29 -19
  630. package/plugins/dashboard-store/resource-class.js +105 -21
  631. package/plugins/steve/__tests__/getters.test.ts +19 -12
  632. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  633. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  634. package/plugins/steve/actions.js +37 -24
  635. package/plugins/steve/getters.js +47 -12
  636. package/plugins/steve/resourceWatcher.js +10 -3
  637. package/plugins/steve/steve-class.js +5 -0
  638. package/plugins/steve/steve-pagination-utils.ts +225 -43
  639. package/plugins/steve/subscribe.js +418 -53
  640. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  641. package/public/favicon.png +0 -0
  642. package/public/index.html +1 -1
  643. package/rancher-components/BadgeState/BadgeState.vue +33 -52
  644. package/rancher-components/Banner/Banner.test.ts +51 -3
  645. package/rancher-components/Banner/Banner.vue +53 -10
  646. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  647. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  648. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  649. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  650. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  651. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  652. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  653. package/rancher-components/Form/Radio/RadioGroup.vue +90 -39
  654. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  655. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  656. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +32 -2
  657. package/rancher-components/RcButton/RcButton.vue +1 -1
  658. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  659. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  660. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  661. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  662. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  663. package/rancher-components/RcDropdown/index.ts +2 -0
  664. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  665. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  666. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  667. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  668. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  669. package/rancher-components/RcItemCard/index.ts +2 -0
  670. package/rancher-components/StringList/StringList.vue +1 -1
  671. package/scripts/build-pkg.sh +18 -23
  672. package/scripts/extension/publish +1 -1
  673. package/scripts/publish-shell.sh +1 -1
  674. package/static/loading-indicator.html +1 -1
  675. package/store/action-menu.js +26 -56
  676. package/store/auth.js +3 -0
  677. package/store/catalog.js +85 -25
  678. package/store/features.js +0 -1
  679. package/store/growl.js +97 -8
  680. package/store/i18n.js +5 -1
  681. package/store/index.js +48 -18
  682. package/store/notifications.ts +426 -0
  683. package/store/prefs.js +2 -8
  684. package/store/slideInPanel.ts +6 -0
  685. package/store/type-map.js +35 -20
  686. package/store/type-map.utils.ts +49 -6
  687. package/store/uiplugins.ts +15 -1
  688. package/types/fleet.d.ts +60 -1
  689. package/types/kube/kube-api.ts +34 -0
  690. package/types/notifications/index.ts +74 -0
  691. package/types/resources/fleet.d.ts +43 -0
  692. package/types/resources/pod-security-admission.ts +36 -0
  693. package/types/resources/settings.d.ts +107 -0
  694. package/types/resources/userPreferences.d.ts +13 -0
  695. package/types/shell/index.d.ts +949 -741
  696. package/types/store/dashboard-store.types.ts +57 -4
  697. package/types/store/pagination.types.ts +41 -9
  698. package/types/store/subscribe.types.ts +50 -0
  699. package/utils/__mocks__/tabbable.js +13 -0
  700. package/utils/__tests__/back-off.test.ts +354 -0
  701. package/utils/__tests__/create-yaml.test.ts +235 -0
  702. package/utils/__tests__/fleet.test.ts +148 -0
  703. package/utils/__tests__/kontainer.test.ts +19 -0
  704. package/utils/__tests__/object.test.ts +54 -1
  705. package/utils/__tests__/string.test.ts +273 -1
  706. package/utils/__tests__/time.test.ts +31 -0
  707. package/utils/auth.js +41 -6
  708. package/utils/back-off.ts +176 -0
  709. package/utils/cluster.js +24 -20
  710. package/utils/create-yaml.js +103 -9
  711. package/utils/crypto/encryption.ts +103 -0
  712. package/utils/cspAdaptor.ts +51 -0
  713. package/utils/error.js +26 -9
  714. package/utils/errorTranslate.json +410 -6
  715. package/utils/errorTranslateNew.json +39 -0
  716. package/utils/fleet-types.ts +0 -0
  717. package/utils/fleet.ts +204 -74
  718. package/utils/grafana.js +1 -0
  719. package/utils/kontainer.ts +3 -5
  720. package/utils/object.js +36 -12
  721. package/utils/pagination-utils.ts +50 -3
  722. package/utils/pagination-wrapper.ts +132 -50
  723. package/utils/perf-setting.utils.ts +28 -0
  724. package/utils/release-notes.ts +48 -0
  725. package/utils/roleFiltering.js +33 -0
  726. package/utils/selector-typed.ts +210 -0
  727. package/utils/selector.js +29 -6
  728. package/utils/settings.ts +4 -1
  729. package/utils/string.js +24 -0
  730. package/utils/style.ts +39 -0
  731. package/utils/{time.js → time.ts} +25 -6
  732. package/utils/uiplugins.ts +41 -8
  733. package/utils/v-sphere.ts +5 -1
  734. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  735. package/utils/validators/formRules/index.ts +99 -4
  736. package/utils/window.js +11 -7
  737. package/vue.config.js +1 -1
  738. package/.DS_Store +0 -0
  739. package/components/AssignTo.vue +0 -199
  740. package/components/DisableAuthProviderModal.vue +0 -115
  741. package/components/MoveModal.vue +0 -167
  742. package/components/PromptChangePassword.vue +0 -123
  743. package/components/ResourceList/Masthead-btn.vue +0 -225
  744. package/components/__tests__/ApplicationCard.test.ts +0 -27
  745. package/components/cards/ApplicationCard.vue +0 -145
  746. package/components/fleet/FleetBundleResources.vue +0 -86
  747. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  748. package/components/formatter/RKETemplateName.vue +0 -37
  749. package/config/product/legacy.js +0 -62
  750. package/config/secret.js +0 -14
  751. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  752. package/models/etcdbackup.js +0 -45
  753. package/pages/auth copy/login.vue +0 -595
  754. package/pages/auth copy/logout.vue +0 -47
  755. package/pages/auth copy/setup.vue +0 -523
  756. package/pages/auth copy/verify.vue +0 -203
  757. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  758. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  759. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  760. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  761. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -1,70 +1,152 @@
1
1
  import paginationUtils from '@shell/utils/pagination-utils';
2
- import { PaginationArgs, PaginationResourceContext, StorePagination } from '@shell/types/store/pagination.types';
2
+ import { PaginationArgs, PaginationResourceContext } from '@shell/types/store/pagination.types';
3
3
  import { VuexStore } from '@shell/types/store/vuex';
4
- import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
4
+ import { ActionFindPageArgs, ActionFindPageTransientResult } from '@shell/types/store/dashboard-store.types';
5
+ import {
6
+ STEVE_WATCH_EVENT_LISTENER_CALLBACK, STEVE_UNWATCH_EVENT_PARAMS, STEVE_WATCH_EVENT, STEVE_WATCH_EVENT_PARAMS, STEVE_WATCH_EVENT_PARAMS_COMMON, STEVE_WATCH_MODE
7
+ } from '@shell/types/store/subscribe.types';
8
+ import { Reactive, reactive } from 'vue';
5
9
 
6
- interface Result<T> {
7
- data: Array<T>
8
- pagination: StorePagination
10
+ interface Args {
11
+ $store: VuexStore,
12
+ /**
13
+ * Unique ID for this request. Used for watch purposes
14
+ */
15
+ id: string,
16
+ /**
17
+ * Args used when determining if this resource type supports SSP
18
+ */
19
+ enabledFor: PaginationResourceContext,
20
+ /**
21
+ * Callback called when the resource is changed (notified by socket)
22
+ */
23
+ onChange?: () => void,
24
+
25
+ formatResponse?: {
26
+ /**
27
+ * Convert the response into a model class instance
28
+ */
29
+ classify?: boolean,
30
+ reactive?: boolean,
31
+ }
32
+ }
33
+
34
+ interface Result<T> extends Omit<ActionFindPageTransientResult<T>, 'data'> {
35
+ data: Reactive<T[]>
9
36
  }
10
37
 
11
38
  /**
12
- * This is a helper class that will assist in fetching a resource
13
- * - Handle if the resource can be fetched by the new pagination api
14
- * - Make a request to get a page (including classify)
15
- * - Provide updates when the resource changes
39
+ * This is a helper class that will assist in fetching a resource via the new Server-Side Pagination API
16
40
  *
17
41
  * This is designed to work in places where we don't/can't store the resource in the store
18
42
  * - There already exists a resource we don't want to overwrite
19
- * - We're transient and want something nicer than just cluster/request
43
+ * - We're transient and want something nicer than just `cluster/request` + all the trimmings
44
+ *
45
+ * It ...
46
+ * - Handles if the resource can be fetched by the new pagination api
47
+ * - Makes a request to get a page (including optional classify & reactive)
48
+ * - Provide updates when the resource changes
20
49
  */
21
- class PaginationWrapper<T = any> {
22
- private $store: VuexStore;
23
- private enabledFor: PaginationResourceContext;
24
-
25
- // Blocked on https://github.com/rancher/rancher/issues/40773 / https://github.com/rancher/dashboard/issues/12734
26
- private onUpdate: (out: Result<T>) => void;
27
-
28
- public isEnabled: boolean;
29
-
30
- constructor({
31
- $store,
32
- enabledFor,
33
- onUpdate,
34
- }: {
35
- $store: VuexStore,
36
- onUpdate: (res: Result<T>) => void,
37
- enabledFor: PaginationResourceContext,
38
- }) {
39
- this.$store = $store;
40
- this.isEnabled = paginationUtils.isEnabled({ rootGetters: $store.getters }, enabledFor);
41
- this.enabledFor = enabledFor;
42
- this.onUpdate = onUpdate;
50
+ class PaginationWrapper<T extends object> {
51
+ private $store: VuexStore;
52
+ private enabledFor: PaginationResourceContext;
53
+ private onChange?: STEVE_WATCH_EVENT_LISTENER_CALLBACK;
54
+ private id: string;
55
+ private classify: boolean;
56
+ private reactive: boolean;
57
+
58
+ public isEnabled: boolean;
59
+ private steveWatchParams: STEVE_WATCH_EVENT_PARAMS_COMMON | undefined;
60
+
61
+ constructor(args: Args) {
62
+ const {
63
+ $store, id, enabledFor, onChange, formatResponse
64
+ } = args;
65
+
66
+ this.$store = $store;
67
+ this.id = id;
68
+ this.enabledFor = enabledFor;
69
+ this.onChange = onChange;
70
+ this.classify = formatResponse?.classify || false;
71
+ this.reactive = formatResponse?.reactive || false;
72
+
73
+ this.isEnabled = paginationUtils.isEnabled({ rootGetters: $store.getters }, enabledFor);
74
+ }
75
+
76
+ async request(args: {
77
+ pagination: PaginationArgs,
78
+ }): Promise<Result<T>> {
79
+ if (!this.isEnabled) {
80
+ throw new Error(`Wrapper for type '${ this.enabledFor.store }/${ this.enabledFor.resource?.id }' in context '${ this.enabledFor.resource?.context }' not supported`);
81
+ }
82
+ const { pagination } = args;
83
+ const opt: ActionFindPageArgs = {
84
+ watch: false,
85
+ pagination,
86
+ transient: true,
87
+ };
88
+
89
+ // Fetch
90
+ const out: ActionFindPageTransientResult<T> = await this.$store.dispatch(`${ this.enabledFor.store }/findPage`, { opt, type: this.enabledFor.resource?.id });
91
+
92
+ // Watch
93
+ if (this.onChange && !this.steveWatchParams) {
94
+ this.steveWatchParams = {
95
+ event: STEVE_WATCH_EVENT.CHANGES,
96
+ id: this.id,
97
+ params: {
98
+ type: this.enabledFor.resource?.id as string,
99
+ mode: STEVE_WATCH_MODE.RESOURCE_CHANGES,
100
+ }
101
+ };
102
+
103
+ this.watch();
43
104
  }
44
105
 
45
- async request(args: {
46
- pagination: PaginationArgs,
47
- classify?: boolean,
48
- }): Promise<Result<T>> {
49
- if (!this.isEnabled) {
50
- throw new Error(`Wrapper for type '${ this.enabledFor.store }/${ this.enabledFor.resource?.id }' in context '${ this.enabledFor.resource?.context }' not supported`);
51
- }
52
- const { pagination, classify: doClassify } = args;
53
- const opt: ActionFindPageArgs = {
54
- transient: true,
55
- pagination
106
+ // Convert Response
107
+ if (this.classify) {
108
+ out.data = await this.$store.dispatch(`${ this.enabledFor.store }/createMany`, out.data);
109
+ }
110
+
111
+ if (this.reactive) {
112
+ return {
113
+ ...out,
114
+ data: reactive(out.data)
56
115
  };
116
+ }
57
117
 
58
- const out: Result<T> = await this.$store.dispatch(`${ this.enabledFor.store }/findPage`, { opt, type: this.enabledFor.resource?.id });
118
+ return out;
119
+ }
59
120
 
60
- if (doClassify) {
61
- for (let i = 0; i < out.data.length; i++) {
62
- out.data[i] = await this.$store.dispatch(`${ this.enabledFor.store }/create`, out.data[i]);
63
- }
64
- }
121
+ private async watch() {
122
+ if (!this.steveWatchParams) {
123
+ console.error('Calling watch but no watch params created'); // eslint-disable-line no-console
65
124
 
66
- return out;
125
+ return;
67
126
  }
127
+ const watchParams: STEVE_WATCH_EVENT_PARAMS = {
128
+ ...this.steveWatchParams,
129
+ callback: this.onChange as STEVE_WATCH_EVENT_LISTENER_CALLBACK, // we must have it by now
130
+ };
131
+
132
+ await this.$store.dispatch(`${ this.enabledFor.store }/watchEvent`, watchParams);
133
+ }
134
+
135
+ private async unWatch() {
136
+ if (!this.steveWatchParams) {
137
+ console.error('Calling unWatch but no watch params created'); // eslint-disable-line no-console
138
+
139
+ return;
140
+ }
141
+
142
+ const unWatchParams: STEVE_UNWATCH_EVENT_PARAMS = { ...this.steveWatchParams };
143
+
144
+ await this.$store.dispatch(`${ this.enabledFor.store }/unwatchEvent`, unWatchParams);
145
+ }
146
+
147
+ async onDestroy() {
148
+ await this.unWatch();
149
+ }
68
150
  }
69
151
 
70
152
  export default PaginationWrapper;
@@ -0,0 +1,28 @@
1
+ import { PerfSettings } from '@shell/config/settings';
2
+
3
+ type PaginationSupersedesSettings = 'incrementalLoading' | 'manualRefresh'
4
+
5
+ class _Utils {
6
+ private setting: PaginationSupersedesSettings;
7
+ constructor(setting: PaginationSupersedesSettings) {
8
+ this.setting = setting;
9
+ }
10
+
11
+ /**
12
+ * This is a centralised point to ensure SSP takes precedence over the performance setting
13
+ */
14
+ isEnabled(paginationEnabled: boolean, perfSettings: PerfSettings): boolean {
15
+ return !paginationEnabled && perfSettings[this.setting].enabled;
16
+ }
17
+ }
18
+
19
+ export default {
20
+ /**
21
+ * Helper functions for the 'incremental loading indicator' performance settings
22
+ */
23
+ incrementalLoadingUtils: new _Utils('incrementalLoading'),
24
+ /**
25
+ * Helper functions for the 'manual refresh' performance settings
26
+ */
27
+ manualRefreshUtils: new _Utils('manualRefresh'),
28
+ };
@@ -0,0 +1,48 @@
1
+ import { getVersionData } from '@shell/config/version';
2
+ import { READ_WHATS_NEW } from '@shell/store/prefs';
3
+ import { NotificationLevel } from '@shell/types/notifications';
4
+
5
+ export async function addReleaseNotesNotification(dispatch: any, getters: any) {
6
+ const rancherVersion = getVersionData().Version.split('-')[0];
7
+ const prefix = 'release-notes-';
8
+ const id = `${ prefix }${ rancherVersion }`;
9
+ let found = false;
10
+ const all = getters['notifications/all'];
11
+ const lastReadVersion = getters['prefs/get'](READ_WHATS_NEW) || '';
12
+ const t = getters['i18n/t'];
13
+ const releaseNotesUrl = getters['releaseNotesUrl'];
14
+
15
+ // Delete notification(s) for old release notes
16
+ for (let i = 0; i < all.length; i++) {
17
+ const notification = all[i];
18
+
19
+ if (notification.id.startsWith(prefix)) {
20
+ if (notification.id === id) {
21
+ found = true;
22
+ } else {
23
+ await dispatch('notifications/delete', notification.id);
24
+ }
25
+ }
26
+ }
27
+
28
+ // Also use pref, so if we expired it, we don't add it back
29
+ if (!found && lastReadVersion !== rancherVersion) {
30
+ // Register notification
31
+ const notification = {
32
+ id,
33
+ level: NotificationLevel.Info,
34
+ title: t('landing.whatsNew.title', { version: rancherVersion }),
35
+ message: t('landing.whatsNew.message'),
36
+ preference: {
37
+ key: READ_WHATS_NEW,
38
+ value: rancherVersion
39
+ },
40
+ primaryAction: {
41
+ label: t('landing.whatsNew.link'),
42
+ target: releaseNotesUrl
43
+ }
44
+ };
45
+
46
+ await dispatch('notifications/add', notification);
47
+ }
48
+ }
@@ -0,0 +1,33 @@
1
+ export function globalRoleFilteringfn (ary) {
2
+ const roleList = ['admin', 'tenant', 'safe-admin']
3
+ if (ary && ary.length > 0) {
4
+ return ary.filter(item => { return roleList.includes(item.id) })
5
+ }
6
+ return []
7
+ }
8
+
9
+ export function clusterRoleFilteringfn (ary) {
10
+ const roleList = ['cluster-tenant']
11
+ if (ary && ary.length > 0) {
12
+ ary.map(m => {
13
+ if (m.id === 'cluster-tenant') {
14
+ m['displayName'] = '租户'
15
+ }
16
+ })
17
+ return ary.filter(item => { return roleList.includes(item.id) })
18
+ }
19
+ return []
20
+ }
21
+
22
+ export function projectRoleFilteringfn (ary) {
23
+ const roleList = ['project-tenant']
24
+ ary.map(m => {
25
+ if (m.id === 'project-tenant') {
26
+ m['displayName'] = '租户'
27
+ }
28
+ })
29
+ if (ary && ary.length > 0) {
30
+ return ary.filter(item => { return roleList.includes(item.id) })
31
+ }
32
+ return []
33
+ }
@@ -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
+ }