@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.7

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 (361) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/base/_variables.scss +17 -11
  5. package/assets/styles/global/_form.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -1
  7. package/assets/styles/themes/_dark.scss +5 -0
  8. package/assets/styles/themes/_light.scss +11 -2
  9. package/assets/styles/vendor/vue-select.scss +1 -1
  10. package/assets/translations/en-us.yaml +426 -64
  11. package/assets/translations/zh-hans.yaml +3 -4
  12. package/cloud-credential/gcp.vue +9 -1
  13. package/components/AppModal.vue +2 -0
  14. package/components/CodeMirror.vue +2 -2
  15. package/components/ConfigMapSettings/Settings.vue +377 -0
  16. package/components/ConfigMapSettings/index.vue +354 -0
  17. package/components/CruResource.vue +1 -2
  18. package/components/DetailText.vue +61 -11
  19. package/components/Drawer/Chrome.vue +115 -0
  20. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  21. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  25. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  26. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  27. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  28. package/components/Drawer/ResourceDetailDrawer/index.vue +111 -0
  29. package/components/GrowlManager.vue +16 -15
  30. package/components/IconOrSvg.vue +5 -0
  31. package/components/KeyValueView.vue +1 -1
  32. package/components/Loading.vue +1 -1
  33. package/components/LocaleSelector.vue +9 -1
  34. package/components/PaginatedResourceTable.vue +46 -1
  35. package/components/ProgressBarMulti.vue +1 -0
  36. package/components/PromptModal.vue +6 -1
  37. package/components/PromptRestore.vue +22 -44
  38. package/components/RelatedResources.vue +4 -12
  39. package/components/Resource/Detail/Additional.vue +46 -0
  40. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  41. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  42. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  43. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +47 -256
  44. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  45. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +34 -5
  46. package/components/Resource/Detail/Metadata/KeyValue.vue +32 -22
  47. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  48. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  49. package/components/Resource/Detail/Metadata/Rectangle.vue +3 -1
  50. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  51. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  52. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  53. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  54. package/components/Resource/Detail/Metadata/index.vue +12 -5
  55. package/components/Resource/Detail/Page.vue +15 -0
  56. package/components/Resource/Detail/ResourceRow.vue +37 -18
  57. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  58. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  59. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  60. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  61. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  62. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  63. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  76. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  77. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  78. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  79. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  80. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  81. package/components/Resource/Detail/SpacedRow.vue +1 -1
  82. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  83. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  84. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  85. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  86. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  87. package/components/Resource/Detail/TitleBar/composables.ts +45 -0
  88. package/components/Resource/Detail/TitleBar/index.vue +85 -13
  89. package/components/Resource/Detail/composables.ts +45 -0
  90. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  91. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  92. package/components/ResourceDetail/Masthead/index.vue +65 -0
  93. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  94. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +1 -1
  95. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  96. package/components/ResourceDetail/index.vue +33 -17
  97. package/components/ResourceDetail/legacy.vue +18 -1
  98. package/components/ResourceList/Masthead.vue +6 -0
  99. package/components/ResourceList/index.vue +1 -0
  100. package/components/ResourceTable.vue +6 -1
  101. package/components/ResourceYaml.vue +15 -2
  102. package/components/RichTranslation.vue +106 -0
  103. package/components/SlideInPanelManager.vue +46 -11
  104. package/components/SortableTable/index.vue +1 -1
  105. package/components/SortableTable/selection.js +0 -1
  106. package/components/StateDot/index.vue +28 -0
  107. package/components/Tabbed/index.vue +17 -16
  108. package/components/Wizard.vue +4 -2
  109. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  110. package/components/__tests__/GrowlManager.test.ts +0 -25
  111. package/components/__tests__/PromptRestore.test.ts +1 -65
  112. package/components/__tests__/RichTranslation.test.ts +115 -0
  113. package/components/auth/login/ldap.vue +1 -1
  114. package/components/fleet/FleetApplications.vue +0 -7
  115. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  116. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  117. package/components/fleet/FleetClusters.vue +25 -6
  118. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  119. package/components/fleet/FleetHelmOps.vue +8 -0
  120. package/components/fleet/FleetRepos.vue +1 -6
  121. package/components/fleet/FleetResources.vue +4 -5
  122. package/components/fleet/FleetValuesFrom.vue +295 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  124. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  125. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  127. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  128. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  129. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  130. package/components/fleet/dashboard/ResourcePanel.vue +17 -9
  131. package/components/form/ArrayList.vue +13 -2
  132. package/components/form/ChangePassword.vue +3 -1
  133. package/components/form/FileImageSelector.vue +1 -1
  134. package/components/form/Footer.vue +10 -4
  135. package/components/form/KeyValue.vue +81 -43
  136. package/components/form/LabeledSelect.vue +56 -16
  137. package/components/form/Labels.vue +90 -17
  138. package/components/form/MatchExpressions.vue +46 -5
  139. package/components/form/NameNsDescription.vue +2 -1
  140. package/components/form/Networking.vue +24 -19
  141. package/components/form/ResourceLabeledSelect.vue +4 -3
  142. package/components/form/ResourceSelector.vue +1 -0
  143. package/components/form/ResourceTabs/index.vue +5 -0
  144. package/components/form/SecretSelector.vue +9 -2
  145. package/components/form/Select.vue +57 -19
  146. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  147. package/components/form/SimpleSecretSelector.vue +9 -2
  148. package/components/form/Taints.vue +21 -2
  149. package/components/form/UnitInput.vue +8 -0
  150. package/components/form/ValueFromResource.vue +1 -1
  151. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  152. package/components/form/__tests__/Labels.test.ts +360 -0
  153. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  154. package/components/form/__tests__/Networking.test.ts +116 -0
  155. package/components/form/__tests__/Select.test.ts +5 -2
  156. package/components/formatter/FleetApplicationSource.vue +1 -1
  157. package/components/formatter/PodImages.vue +1 -1
  158. package/components/formatter/WorkloadHealthScale.vue +1 -1
  159. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  160. package/components/google/AccountAccess.vue +209 -0
  161. package/components/google/types/gcp.d.ts +136 -0
  162. package/components/google/types/index.d.ts +101 -0
  163. package/components/google/util/__mocks__/gcp.ts +465 -0
  164. package/components/google/util/formatter.ts +82 -0
  165. package/components/google/util/gcp.ts +134 -0
  166. package/components/google/util/index.d.ts +11 -0
  167. package/components/nav/Favorite.vue +1 -1
  168. package/components/nav/Group.vue +71 -45
  169. package/components/nav/Header.vue +5 -1
  170. package/components/nav/NamespaceFilter.vue +13 -1
  171. package/components/nav/NotificationCenter/Notification.vue +510 -0
  172. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  173. package/components/nav/NotificationCenter/index.vue +148 -0
  174. package/composables/drawer.ts +26 -0
  175. package/composables/resources.test.ts +63 -0
  176. package/composables/resources.ts +38 -0
  177. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  178. package/config/labels-annotations.js +8 -0
  179. package/config/pagination-table-headers.js +8 -1
  180. package/config/product/auth.js +16 -1
  181. package/config/product/{cis.js → compliance.js} +23 -26
  182. package/config/product/explorer.js +32 -3
  183. package/config/product/fleet.js +7 -0
  184. package/config/product/manager.js +0 -1
  185. package/config/product/settings.js +22 -11
  186. package/config/query-params.js +13 -0
  187. package/config/roles.ts +1 -1
  188. package/config/router/navigation-guards/authentication.js +51 -2
  189. package/config/router/routes.js +47 -31
  190. package/config/settings.ts +21 -3
  191. package/config/store.js +2 -0
  192. package/config/system-namespaces.js +1 -1
  193. package/config/table-headers.js +32 -3
  194. package/config/types.js +16 -7
  195. package/config/version.js +1 -1
  196. package/core/plugin.ts +32 -7
  197. package/core/types.ts +18 -1
  198. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  199. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  200. package/detail/management.cattle.io.oidcclient.vue +369 -0
  201. package/detail/node.vue +2 -2
  202. package/detail/pod.vue +2 -2
  203. package/detail/provisioning.cattle.io.cluster.vue +3 -47
  204. package/detail/service.vue +10 -1
  205. package/detail/workload/index.vue +8 -2
  206. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  207. package/dialog/GenericPrompt.vue +1 -1
  208. package/dialog/ImportDialog.vue +8 -8
  209. package/dialog/OidcClientSecretDialog.vue +117 -0
  210. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  211. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  212. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  213. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  214. package/edit/auth/ldap/config.vue +24 -0
  215. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  216. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  217. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  218. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  219. package/edit/configmap.vue +8 -2
  220. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  221. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  222. package/edit/fleet.cattle.io.helmop.vue +44 -269
  223. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  224. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  225. package/edit/logging-flow/index.vue +1 -0
  226. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  227. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  228. package/edit/management.cattle.io.oidcclient.vue +162 -0
  229. package/edit/management.cattle.io.project.vue +4 -1
  230. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  231. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  232. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  233. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  234. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  235. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  236. package/edit/monitoring.coreos.com.route.vue +1 -0
  237. package/edit/namespace.vue +1 -0
  238. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  239. package/edit/networking.k8s.io.ingress/Certificate.vue +12 -12
  240. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +165 -0
  241. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  242. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  243. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  244. package/edit/node.vue +1 -0
  245. package/edit/persistentvolume/index.vue +4 -1
  246. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +3 -2
  247. package/edit/provisioning.cattle.io.cluster/rke2.vue +516 -426
  248. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  249. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  250. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  251. package/edit/resources.cattle.io.restore.vue +1 -1
  252. package/edit/secret/basic.vue +1 -0
  253. package/edit/secret/index.vue +127 -15
  254. package/edit/service.vue +4 -1
  255. package/edit/serviceaccount.vue +4 -1
  256. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  257. package/edit/workload/index.vue +5 -0
  258. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  259. package/list/management.cattle.io.oidcclient.vue +108 -0
  260. package/list/node.vue +2 -0
  261. package/list/projectsecret.vue +345 -0
  262. package/list/secret.vue +109 -0
  263. package/machine-config/amazonec2.vue +3 -24
  264. package/machine-config/components/GCEImage.vue +374 -0
  265. package/machine-config/google.vue +617 -0
  266. package/mixins/__tests__/brand.spec.ts +170 -0
  267. package/mixins/brand.js +16 -17
  268. package/mixins/create-edit-view/impl.js +10 -1
  269. package/mixins/create-edit-view/index.js +5 -0
  270. package/mixins/resource-fetch-api-pagination.js +24 -8
  271. package/mixins/resource-fetch.js +3 -1
  272. package/mixins/vue-select-overrides.js +1 -0
  273. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  274. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  275. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  276. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  277. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  278. package/models/fleet-application.js +8 -79
  279. package/models/fleet.cattle.io.cluster.js +13 -2
  280. package/models/fleet.cattle.io.gitrepo.js +2 -2
  281. package/models/fleet.cattle.io.helmop.js +9 -39
  282. package/models/management.cattle.io.fleetworkspace.js +2 -1
  283. package/models/management.cattle.io.oidcclient.js +18 -0
  284. package/models/management.cattle.io.registration.js +3 -0
  285. package/models/provisioning.cattle.io.cluster.js +29 -33
  286. package/models/secret.js +157 -2
  287. package/models/service.js +4 -0
  288. package/models/workload.js +5 -0
  289. package/package.json +2 -2
  290. package/pages/about.vue +4 -58
  291. package/pages/auth/login.vue +1 -1
  292. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  293. package/pages/c/_cluster/apps/charts/index.vue +296 -81
  294. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  295. package/pages/c/_cluster/explorer/index.vue +3 -3
  296. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  297. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  298. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  299. package/pages/c/_cluster/fleet/index.vue +94 -57
  300. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  301. package/pages/c/_cluster/longhorn/index.vue +5 -2
  302. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  303. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  304. package/pages/explorer/resource/detail/configmap.vue +30 -7
  305. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  306. package/pages/explorer/resource/detail/secret.vue +63 -0
  307. package/pages/home.vue +9 -55
  308. package/pages/support/index.vue +4 -6
  309. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  310. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  311. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  312. package/plugins/dashboard-store/actions.js +19 -5
  313. package/plugins/dashboard-store/getters.js +4 -0
  314. package/plugins/dashboard-store/normalize.js +29 -17
  315. package/plugins/dashboard-store/resource-class.js +68 -19
  316. package/plugins/steve/steve-pagination-utils.ts +38 -19
  317. package/plugins/steve/subscribe.js +6 -1
  318. package/rancher-components/Banner/Banner.vue +13 -0
  319. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  320. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  321. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  322. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  323. package/store/auth.js +2 -0
  324. package/store/catalog.js +23 -1
  325. package/store/growl.js +97 -8
  326. package/store/index.js +6 -0
  327. package/store/notifications.ts +426 -0
  328. package/store/prefs.js +0 -1
  329. package/store/type-map.js +19 -16
  330. package/store/uiplugins.ts +15 -1
  331. package/types/fleet.d.ts +24 -0
  332. package/types/kube/kube-api.ts +12 -0
  333. package/types/notifications/index.ts +74 -0
  334. package/types/shell/index.d.ts +661 -589
  335. package/types/store/dashboard-store.types.ts +16 -0
  336. package/types/store/pagination.types.ts +16 -6
  337. package/utils/__tests__/create-yaml.test.ts +235 -0
  338. package/utils/__tests__/fleet.test.ts +148 -0
  339. package/utils/__tests__/object.test.ts +54 -1
  340. package/utils/__tests__/string.test.ts +273 -1
  341. package/utils/__tests__/time.test.ts +31 -0
  342. package/utils/auth.js +9 -2
  343. package/utils/create-yaml.js +103 -9
  344. package/utils/crypto/encryption.ts +103 -0
  345. package/utils/cspAdaptor.ts +51 -0
  346. package/utils/fleet.ts +54 -65
  347. package/utils/object.js +36 -0
  348. package/utils/pagination-utils.ts +19 -1
  349. package/utils/release-notes.ts +48 -0
  350. package/utils/selector-typed.ts +7 -2
  351. package/utils/string.js +24 -0
  352. package/utils/{time.js → time.ts} +25 -6
  353. package/utils/uiplugins.ts +22 -0
  354. package/utils/validators/formRules/index.ts +3 -0
  355. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  356. package/config/product/legacy.js +0 -62
  357. package/models/etcdbackup.js +0 -45
  358. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  359. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  360. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  361. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -4,8 +4,9 @@ import AsyncButton from '@shell/components/AsyncButton';
4
4
  import Loading from '@shell/components/Loading';
5
5
  import { Banner } from '@components/Banner';
6
6
  import {
7
- REPO_TYPE, REPO, CHART, VERSION, SEARCH_QUERY, _FLAGGED, CATEGORY, DEPRECATED, HIDDEN, TAG, STATUS
7
+ REPO_TYPE, REPO, CHART, VERSION, SEARCH_QUERY, SORT_BY, _FLAGGED, CATEGORY, DEPRECATED, HIDDEN, TAG, STATUS
8
8
  } from '@shell/config/query-params';
9
+ import { DOCS_BASE } from '@shell/config/private-label';
9
10
  import { APP_STATUS, compatibleVersionsFor, filterAndArrangeCharts, normalizeFilterQuery } from '@shell/store/catalog';
10
11
  import { lcFirst } from '@shell/utils/string';
11
12
  import { sortBy } from '@shell/utils/sort';
@@ -16,12 +17,21 @@ import { CATALOG } from '@shell/config/labels-annotations';
16
17
  import { isUIPlugin } from '@shell/config/uiplugins';
17
18
  import { RcItemCard } from '@components/RcItemCard';
18
19
  import { get } from '@shell/utils/object';
19
- import { CATALOG as CATALOG_TYPES } from '@shell/config/types';
20
+ import { CATALOG as CATALOG_TYPES, CATALOG_SORT_OPTIONS } from '@shell/config/types';
20
21
  import FilterPanel from '@shell/components/FilterPanel';
21
22
  import AppChartCardSubHeader from '@shell/pages/c/_cluster/apps/charts/AppChartCardSubHeader';
22
23
  import AppChartCardFooter from '@shell/pages/c/_cluster/apps/charts/AppChartCardFooter';
23
24
  import AddRepoLink from '@shell/pages/c/_cluster/apps/charts/AddRepoLink';
24
25
  import StatusLabel from '@shell/pages/c/_cluster/apps/charts/StatusLabel';
26
+ import RichTranslation from '@shell/components/RichTranslation.vue';
27
+ import Select from '@shell/components/form/Select';
28
+
29
+ const createInitialFilters = () => ({
30
+ repos: [],
31
+ categories: [],
32
+ statuses: [],
33
+ tags: []
34
+ });
25
35
 
26
36
  export default {
27
37
  name: 'Charts',
@@ -32,7 +42,9 @@ export default {
32
42
  RcItemCard,
33
43
  FilterPanel,
34
44
  AppChartCardSubHeader,
35
- AppChartCardFooter
45
+ AppChartCardFooter,
46
+ Select,
47
+ RichTranslation
36
48
  },
37
49
 
38
50
  async fetch() {
@@ -42,6 +54,7 @@ export default {
42
54
 
43
55
  this.searchQuery = query[SEARCH_QUERY] || '';
44
56
  this.debouncedSearchQuery = query[SEARCH_QUERY] || '';
57
+ this.selectedSortOption = query[SORT_BY] || CATALOG_SORT_OPTIONS.RECOMMENDED;
45
58
  this.showHidden = query[HIDDEN] === _FLAGGED;
46
59
  this.filters.repos = normalizeFilterQuery(query[REPO]) || [];
47
60
  this.filters.categories = normalizeFilterQuery(query[CATEGORY]) || [];
@@ -53,24 +66,17 @@ export default {
53
66
 
54
67
  data() {
55
68
  return {
69
+ DOCS_BASE,
56
70
  searchQuery: null,
57
71
  debouncedSearchQuery: null,
58
72
  showDeprecated: null,
59
73
  showHidden: null,
60
- filters: {
61
- repos: [],
62
- categories: [],
63
- statuses: [],
64
- tags: []
65
- },
66
- internalFilters: { // in order to update the filter checkboxes smoothly
67
- repos: [],
68
- categories: [],
69
- statuses: [],
70
- tags: []
71
- },
72
- installedApps: [],
73
- statusOptions: [
74
+ filters: createInitialFilters(),
75
+ // to optimize UI responsiveness by immediately updating the filter state
76
+ internalFilters: createInitialFilters(),
77
+ isFilterUpdating: false,
78
+ installedApps: [],
79
+ statusOptions: [
74
80
  {
75
81
  value: APP_STATUS.INSTALLED,
76
82
  label: {
@@ -79,7 +85,7 @@ export default {
79
85
  label: this.t('generic.installed'),
80
86
  icon: 'icon-warning',
81
87
  iconColor: 'warning',
82
- tooltip: this.t('catalog.charts.experimentalStatus.tooltip')
88
+ tooltip: this.t('catalog.charts.statusFilterCautions.installation')
83
89
  }
84
90
  }
85
91
  },
@@ -95,12 +101,20 @@ export default {
95
101
  label: this.t('generic.upgradeable'),
96
102
  icon: 'icon-warning',
97
103
  iconColor: 'warning',
98
- tooltip: this.t('catalog.charts.experimentalStatus.tooltip')
104
+ tooltip: this.t('catalog.charts.statusFilterCautions.upgradeable')
99
105
  }
100
106
  }
101
107
  }
102
108
  ],
103
- appCardsCache: {},
109
+ appCardsCache: {},
110
+ selectedSortOption: CATALOG_SORT_OPTIONS.RECOMMENDED,
111
+ sortOptions: [
112
+ { kind: 'group', label: this.t('catalog.charts.sort.prefix') },
113
+ { value: CATALOG_SORT_OPTIONS.RECOMMENDED, label: this.t('catalog.charts.sort.recommended') },
114
+ { value: CATALOG_SORT_OPTIONS.LAST_UPDATED_DESC, label: this.t('catalog.charts.sort.lastUpdatedDesc') },
115
+ { value: CATALOG_SORT_OPTIONS.ALPHABETICAL_ASC, label: this.t('catalog.charts.sort.alphaAscending') },
116
+ { value: CATALOG_SORT_OPTIONS.ALPHABETICAL_DESC, label: this.t('catalog.charts.sort.alphaDescending') },
117
+ ]
104
118
  };
105
119
  },
106
120
 
@@ -171,7 +185,8 @@ export default {
171
185
  category: categories,
172
186
  searchQuery: this.debouncedSearchQuery,
173
187
  repo: repos,
174
- tag: tags
188
+ tag: tags,
189
+ sort: this.selectedSortOption
175
190
  });
176
191
 
177
192
  // status filtering is separated from other filters because "isInstalled" and "upgradeable" statuses are already calculated in models/chart.js
@@ -262,6 +277,20 @@ export default {
262
277
 
263
278
  clusterId() {
264
279
  return this.$store.getters['clusterId'];
280
+ },
281
+
282
+ noFiltersApplied() {
283
+ return Object.values(this.internalFilters).every((arr) => arr.length === 0) && !this.searchQuery;
284
+ },
285
+
286
+ totalMessage() {
287
+ const count = !this.isFilterUpdating ? this.appChartCards.length : '. . .';
288
+
289
+ if (this.noFiltersApplied) {
290
+ return this.t('catalog.charts.totalChartsMessage', { count });
291
+ } else {
292
+ return this.t('catalog.charts.totalMatchedChartsMessage', { count });
293
+ }
265
294
  }
266
295
  },
267
296
 
@@ -287,13 +316,21 @@ export default {
287
316
  this.$router.applyQuery(query);
288
317
  this.internalFilters = JSON.parse(JSON.stringify(newFilters));
289
318
  }
290
- }
319
+ },
320
+
321
+ selectedSortOption: {
322
+ handler(neu) {
323
+ this.$router.applyQuery({ [SORT_BY]: neu || undefined });
324
+ },
325
+ immediate: false
326
+ },
291
327
  },
292
328
 
293
329
  methods: {
294
330
  get,
295
331
 
296
332
  onFilterChange(newFilters) {
333
+ this.isFilterUpdating = true;
297
334
  this.internalFilters = newFilters;
298
335
 
299
336
  this.applyFiltersDebounced(newFilters);
@@ -301,6 +338,7 @@ export default {
301
338
 
302
339
  applyFiltersDebounced: debounce(function(newFilters) {
303
340
  this.filters = newFilters;
341
+ this.isFilterUpdating = false;
304
342
  }, 100),
305
343
 
306
344
  selectChart(chart) {
@@ -369,7 +407,7 @@ export default {
369
407
  },
370
408
 
371
409
  filterCharts({
372
- repo, category, tag, searchQuery
410
+ repo, category, tag, searchQuery, sort
373
411
  }) {
374
412
  const enabledCharts = (this.enabledCharts || []);
375
413
  const clusterProvider = this.currentCluster.status.provider || 'other';
@@ -384,8 +422,15 @@ export default {
384
422
  showHidden: this.showHidden,
385
423
  hideTypes: [CATALOG._CLUSTER_TPL],
386
424
  showPrerelease: this.$store.getters['prefs/get'](SHOW_PRE_RELEASE),
425
+ sort
387
426
  });
388
427
  },
428
+
429
+ resetAllFilters() {
430
+ this.internalFilters = createInitialFilters();
431
+ this.filters = createInitialFilters();
432
+ this.searchQuery = '';
433
+ },
389
434
  },
390
435
  };
391
436
  </script>
@@ -401,24 +446,34 @@ export default {
401
446
  {{ t('catalog.chart.header.charts') }}
402
447
  </h1>
403
448
  <AsyncButton
449
+ class="refresh-repo-button"
450
+ :action-label="t('catalog.charts.refreshButton.label')"
451
+ :waitingLabel="t('catalog.charts.refreshButton.label')"
452
+ :success-label="t('catalog.charts.refreshButton.label')"
453
+ mode="refresh"
404
454
  role="button"
405
455
  :aria-label="t('catalog.charts.refresh')"
406
- :label="t('catalog.charts.refresh')"
407
- class="refresh-btn"
408
- mode="refresh"
456
+ actionColor="role-secondary"
457
+ successColor="bg-success"
409
458
  @click="refresh"
410
459
  />
411
460
  </div>
412
- <input
413
- ref="searchQuery"
414
- v-model="searchQuery"
415
- type="search"
416
- class="input search-input"
417
- :placeholder="t('catalog.charts.search')"
418
- data-testid="charts-filter-input"
419
- :aria-label="t('catalog.charts.search')"
420
- role="textbox"
421
- >
461
+ <div class="search-input">
462
+ <input
463
+ ref="searchQuery"
464
+ v-model="searchQuery"
465
+ type="search"
466
+ class="input"
467
+ :placeholder="t('catalog.charts.search')"
468
+ data-testid="charts-filter-input"
469
+ :aria-label="t('catalog.charts.search')"
470
+ role="textbox"
471
+ >
472
+ <i
473
+ v-if="!searchQuery"
474
+ class="icon icon-search"
475
+ />
476
+ </div>
422
477
  <button
423
478
  v-shortkey.once="['/']"
424
479
  class="hide"
@@ -441,44 +496,139 @@ export default {
441
496
 
442
497
  <div
443
498
  v-if="filteredCharts.length === 0"
444
- class="app-chart-cards-empty-state"
499
+ class="charts-empty-state"
500
+ data-testid="charts-empty-state"
445
501
  >
446
- <h1>{{ t('catalog.charts.noCharts') }}</h1>
502
+ <h1
503
+ class="empty-state-title"
504
+ data-testid="charts-empty-state-title"
505
+ >
506
+ {{ t('catalog.charts.noCharts.title') }}
507
+ </h1>
508
+ <div class="empty-state-tips">
509
+ <RichTranslation
510
+ k="catalog.charts.noCharts.message"
511
+ :raw="true"
512
+ >
513
+ <template #resetAllFilters="{ content }">
514
+ <a
515
+ tabindex="0"
516
+ role="button"
517
+ class="link"
518
+ data-testid="charts-empty-state-reset-filters"
519
+ @click="resetAllFilters"
520
+ @keyup.enter="resetAllFilters"
521
+ @keyup.space="resetAllFilters"
522
+ >{{ content }}</a>
523
+ </template>
524
+ <template #repositoriesUrl="{ content }">
525
+ <router-link :to="{ name: 'c-cluster-apps-catalog-repo'}">
526
+ {{ content }}
527
+ </router-link>
528
+ </template>
529
+ </RichTranslation>
530
+ <RichTranslation
531
+ k="catalog.charts.noCharts.docsMessage"
532
+ tag="div"
533
+ :raw="true"
534
+ >
535
+ <template #docsUrl="{ content }">
536
+ <a
537
+ :href="`${DOCS_BASE}/how-to-guides/new-user-guides/helm-charts-in-rancher`"
538
+ class="secondary-text-link"
539
+ tabindex="0"
540
+ target="_blank"
541
+ rel="noopener noreferrer nofollow"
542
+ >
543
+ <span class="sr-only">{{ t('generic.opensInNewTab') }}</span>
544
+ {{ content }} <i class="icon icon-external-link" />
545
+ </a>
546
+ </template>
547
+ </RichTranslation>
548
+ </div>
447
549
  </div>
448
550
  <div
449
551
  v-else
450
- class="app-chart-cards"
451
- data-testid="app-chart-cards-container"
552
+ class="right-section"
452
553
  >
453
- <rc-item-card
454
- v-for="card in appChartCards"
455
- :id="card.id"
456
- :key="card.id"
457
- :pill="card.pill"
458
- :header="card.header"
459
- :image="card.image"
460
- :content="card.content"
461
- :value="card.rawChart"
462
- variant="medium"
463
- :clickable="true"
464
- @card-click="selectChart"
465
- >
466
- <template
467
- v-once
468
- #item-card-sub-header
554
+ <div class="total-and-sort">
555
+ <div class="total">
556
+ <p class="total-message">
557
+ {{ totalMessage }}
558
+ </p>
559
+ <a
560
+ v-if="!noFiltersApplied"
561
+ class="reset-filters"
562
+ role="button"
563
+ :aria-label="t('catalog.charts.resetFilters.title')"
564
+ @click="resetAllFilters"
565
+ >
566
+ {{ t('catalog.charts.resetFilters.title') }}
567
+ </a>
568
+ </div>
569
+ <Select
570
+ v-model:value="selectedSortOption"
571
+ :clearable="false"
572
+ :searchable="false"
573
+ :options="sortOptions"
574
+ placement="bottom"
575
+ class="charts-sort-select"
469
576
  >
470
- <AppChartCardSubHeader :items="card.subHeaderItems" />
471
- </template>
472
- <template
473
- v-once
474
- #item-card-footer
577
+ <template #selected-option="{ label }">
578
+ <span class="mmr-1">{{ t('catalog.charts.sort.prefix') }}:</span>{{ label }}
579
+ </template>
580
+
581
+ <template #option="{ label, kind }">
582
+ <span
583
+ v-if="kind === 'group'"
584
+ class="mml-2 mmr-2"
585
+ >
586
+ {{ label }}:
587
+ </span>
588
+ <span
589
+ v-else
590
+ class="mml-6"
591
+ >
592
+ {{ label }}
593
+ </span>
594
+ </template>
595
+ </Select>
596
+ </div>
597
+ <div
598
+ class="app-chart-cards"
599
+ data-testid="app-chart-cards-container"
600
+ >
601
+ <rc-item-card
602
+ v-for="card in appChartCards"
603
+ :id="card.id"
604
+ :key="card.id"
605
+ :pill="card.pill"
606
+ :header="card.header"
607
+ :image="card.image"
608
+ :content="card.content"
609
+ :value="card.rawChart"
610
+ variant="medium"
611
+ :class="{ 'single-card': appChartCards.length === 1 }"
612
+ :clickable="true"
613
+ @card-click="selectChart"
475
614
  >
476
- <AppChartCardFooter
477
- :items="card.footerItems"
478
- @click:item="handleFooterItemClick"
479
- />
480
- </template>
481
- </rc-item-card>
615
+ <template
616
+ v-once
617
+ #item-card-sub-header
618
+ >
619
+ <AppChartCardSubHeader :items="card.subHeaderItems" />
620
+ </template>
621
+ <template
622
+ v-once
623
+ #item-card-footer
624
+ >
625
+ <AppChartCardFooter
626
+ :items="card.footerItems"
627
+ @click:item="handleFooterItemClick"
628
+ />
629
+ </template>
630
+ </rc-item-card>
631
+ </div>
482
632
  </div>
483
633
  </div>
484
634
  </div>
@@ -491,24 +641,76 @@ export default {
491
641
  justify-content: space-between;
492
642
  align-items: center;
493
643
  margin-bottom: 24px;
644
+
645
+ .refresh-repo-button {
646
+
647
+ :deep(.icon) {
648
+ font-size: 14px;
649
+ }
650
+ }
494
651
  }
495
652
 
496
653
  .search-input {
654
+ position: relative;
497
655
  margin-bottom: 24px;
498
- }
499
656
 
500
- .checkbox-select {
501
- .vs__search {
657
+ input {
658
+ height: 48px;
659
+ padding-left: 16px;
660
+ padding-right: 16px;
661
+ }
662
+
663
+ .icon-search {
502
664
  position: absolute;
503
- right: 0
665
+ top: 16px;
666
+ right: 16px;
667
+ font-size: 16px;
504
668
  }
669
+ }
670
+
671
+ .right-section {
672
+ display: flex;
673
+ flex-direction: column;
674
+ gap: var(--gap-md);
675
+ flex: 1;
676
+ }
505
677
 
506
- .vs__selected-options {
507
- overflow: hidden;
508
- white-space: nowrap;
509
- text-overflow: ellipsis;
510
- display: inline-block;
511
- line-height: 2.4rem;
678
+ .total-and-sort {
679
+ display: flex;
680
+ align-items: center;
681
+ justify-content: space-between;
682
+ flex-wrap: wrap;
683
+ gap: var(--gap-md);
684
+ padding: 8px 0;
685
+
686
+ .total {
687
+ display: flex;
688
+
689
+ .total-message {
690
+ font-size: 16px;
691
+ font-weight: 600;
692
+ color: var(--body-text);
693
+ text-overflow: ellipsis;
694
+ white-space: nowrap;
695
+ overflow: hidden;
696
+ }
697
+
698
+ .reset-filters {
699
+ font-size: 16px;
700
+ font-weight: 600;
701
+ margin-left: 8px;
702
+ cursor: pointer;
703
+ }
704
+ }
705
+
706
+ .charts-sort-select {
707
+ width: 300px;
708
+
709
+ // make the color of the selected item consistent with the group title when the select dropdown is open
710
+ :deep(.v-select.inline.vs--single.vs--open .vs__selected) {
711
+ opacity: 1;
712
+ color: var(--dropdown-disabled-text);
713
+ }
512
714
  }
513
715
  }
514
716
 
@@ -517,20 +719,33 @@ export default {
517
719
  gap: var(--gap-lg);
518
720
  }
519
721
 
520
- .app-chart-cards-empty-state {
722
+ .charts-empty-state {
521
723
  width: 100%;
522
- margin-top: 32px;
523
- padding: 32px;
724
+ padding: 72px 120px;
524
725
  text-align: center;
726
+
727
+ .empty-state-title {
728
+ margin-bottom: 24px;
729
+ }
730
+
731
+ .empty-state-tips {
732
+ margin-bottom: 12px;
733
+ font-size: 16px;
734
+ line-height: 32px;
735
+ }
525
736
  }
526
737
 
527
738
  .app-chart-cards {
528
739
  display: grid;
529
- grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
740
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
530
741
  grid-gap: var(--gap-md);
531
742
  width: 100%;
532
743
  height: max-content;
533
744
  overflow: hidden;
745
+
746
+ .single-card {
747
+ max-width: 500px;
748
+ }
534
749
  }
535
750
 
536
751
  </style>