@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
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { useI18n } from '@shell/composables/useI18n';
3
+ import { _VIEW } from '@shell/config/query-params';
4
+ import { useStore } from 'vuex';
5
+ import Tab from '@shell/components/Tabbed/Tab.vue';
6
+ import { useTemplateRef } from 'vue';
7
+ import ResourceYaml from '@shell/components/ResourceYaml.vue';
8
+
9
+ export interface Props {
10
+ resource: any;
11
+ yaml: string;
12
+ }
13
+ </script>
14
+ <script setup lang="ts">
15
+ const props = defineProps<Props>();
16
+ const store = useStore();
17
+ const i18n = useI18n(store);
18
+ const yamlComponent: any = useTemplateRef('yaml');
19
+ </script>
20
+ <template>
21
+ <Tab
22
+ class="yaml-tab"
23
+ name="yaml-tab"
24
+ :label="i18n.t('component.drawer.resourceDetailDrawer.yamlTab.title')"
25
+ @active="() => yamlComponent?.refresh()"
26
+ >
27
+ <ResourceYaml
28
+ ref="yaml"
29
+ :value="props.resource"
30
+ :yaml="props.yaml"
31
+ :mode="_VIEW"
32
+ />
33
+ </Tab>
34
+ </template>
35
+
36
+ <style lang="scss" scoped>
37
+ .yaml-tab {
38
+ :deep() .codemirror-container {
39
+ background-color: var(--body-bg);
40
+ border-radius: var(--border-radius-md);
41
+ padding: 16px;
42
+
43
+ .CodeMirror, .CodeMirror-gutter {
44
+ background-color: var(--body-bg);
45
+ }
46
+ }
47
+ }
48
+ </style>
@@ -0,0 +1,54 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import ConfigTab from '@shell/components/Drawer/ResourceDetailDrawer/ConfigTab.vue';
3
+ import { createStore } from 'vuex';
4
+ import { defineComponent, markRaw } from 'vue';
5
+ import Tab from '@shell/components/Tabbed/Tab.vue';
6
+ import { _VIEW } from '@shell/config/query-params';
7
+
8
+ const DynamicComponent = defineComponent({
9
+ template: '<div>DynamicComponent</div>',
10
+ props: {
11
+ value: { type: Object, required: true },
12
+ mode: { type: String, required: true },
13
+ initialValue: { type: Object, required: true },
14
+ useTabbedHash: { type: Boolean, required: true }
15
+ }
16
+ });
17
+
18
+ describe('component: ResourceDetailDrawer/ConfigTab', () => {
19
+ const resource = { resource: 'RESOURCE' };
20
+ const global = {
21
+ provide: {
22
+ addTab: jest.fn(), removeTab: jest.fn(), sideTabs: false, store: createStore({})
23
+ },
24
+ directives: { 'clean-tooltip': jest.fn() }
25
+
26
+ };
27
+
28
+ it('should render container with config-tab class and correct label and name', async() => {
29
+ const wrapper = mount(ConfigTab, {
30
+ props: { resource, component: markRaw(DynamicComponent) },
31
+ global
32
+ });
33
+
34
+ const component = wrapper.getComponent(Tab);
35
+
36
+ expect(wrapper.classes().includes('config-tab')).toBeTruthy();
37
+ expect(component.props('label')).toStrictEqual('component.drawer.resourceDetailDrawer.configTab.title');
38
+ expect(component.props('name')).toStrictEqual('config-tab');
39
+ });
40
+
41
+ it('should render a dynamic component within the .container and pass the correct props', () => {
42
+ const wrapper = mount(ConfigTab, {
43
+ props: { resource, component: markRaw(DynamicComponent) },
44
+ global
45
+ });
46
+
47
+ const component = wrapper.find('.container').getComponent(DynamicComponent);
48
+
49
+ expect(component.props('value')).toStrictEqual(resource);
50
+ expect(component.props('mode')).toStrictEqual(_VIEW);
51
+ expect(component.props('initialValue')).toStrictEqual(resource);
52
+ expect(component.props('useTabbedHash')).toStrictEqual(false);
53
+ });
54
+ });
@@ -0,0 +1,80 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import YamlTab from '@shell/components/Drawer/ResourceDetailDrawer/YamlTab.vue';
3
+ import { createStore } from 'vuex';
4
+
5
+ import Tab from '@shell/components/Tabbed/Tab.vue';
6
+ import { _VIEW } from '@shell/config/query-params';
7
+ import ResourceYaml from '@shell/components/ResourceYaml.vue';
8
+ import { nextTick } from 'vue';
9
+
10
+ jest.mock('@shell/components/ResourceYaml.vue', () => ({
11
+ template: `<div>ResourceYaml</div>`,
12
+ props: {
13
+ value: {
14
+ type: Object,
15
+ required: true
16
+ },
17
+ yaml: {
18
+ type: String,
19
+ required: true
20
+ },
21
+ mode: {
22
+ type: String,
23
+ required: true
24
+ },
25
+ },
26
+ methods: { refresh: jest.fn() }
27
+ }));
28
+
29
+ describe('component: ResourceDetailDrawer/ConfigTab', () => {
30
+ const resource = { resource: 'RESOURCE' };
31
+ const yaml = 'YAML';
32
+ const global = {
33
+ provide: {
34
+ addTab: jest.fn(), removeTab: jest.fn(), sideTabs: false, store: createStore({})
35
+ },
36
+ directives: { 'clean-tooltip': jest.fn() }
37
+
38
+ };
39
+
40
+ it('should render container with yaml-tab class and correct label and name', async() => {
41
+ const wrapper = mount(YamlTab, {
42
+ props: { resource, yaml },
43
+ global
44
+ });
45
+
46
+ const component = wrapper.getComponent(Tab);
47
+
48
+ expect(wrapper.classes().includes('yaml-tab')).toBeTruthy();
49
+ expect(component.props('label')).toStrictEqual('component.drawer.resourceDetailDrawer.yamlTab.title');
50
+ expect(component.props('name')).toStrictEqual('yaml-tab');
51
+ });
52
+
53
+ it('should render a ResourceYaml component and pass the correct props', () => {
54
+ const wrapper = mount(YamlTab, {
55
+ props: { resource, yaml },
56
+ global
57
+ });
58
+
59
+ const component = wrapper.getComponent(ResourceYaml);
60
+
61
+ expect(component.props('value')).toStrictEqual(resource);
62
+ expect(component.props('yaml')).toStrictEqual(yaml);
63
+ expect(component.props('mode')).toStrictEqual(_VIEW);
64
+ });
65
+
66
+ it('should refresh yaml editor when tab is activated, without it the editor will not resize', async() => {
67
+ const wrapper = mount(YamlTab, {
68
+ props: { resource, yaml },
69
+ global
70
+ });
71
+
72
+ const tabComponent = wrapper.getComponent(Tab);
73
+
74
+ expect(ResourceYaml.methods?.refresh).toHaveBeenCalledTimes(0);
75
+ tabComponent.vm.$emit('active');
76
+ await nextTick();
77
+
78
+ expect(ResourceYaml.methods?.refresh).toHaveBeenCalledTimes(1);
79
+ });
80
+ });
@@ -0,0 +1,106 @@
1
+ import { useDefaultConfigTabProps, useDefaultYamlTabProps, useResourceDetailDrawer } from '@shell/components/Drawer/ResourceDetailDrawer/composables';
2
+ import * as helpers from '@shell/components/Drawer/ResourceDetailDrawer/helpers';
3
+ import * as vuex from 'vuex';
4
+ import * as drawer from '@shell/composables/drawer';
5
+
6
+ jest.mock('@shell/components/Drawer/ResourceDetailDrawer/helpers');
7
+ jest.mock('vuex');
8
+ jest.mock('@shell/composables/drawer');
9
+ jest.mock('@shell/components/Drawer/ResourceDetailDrawer/index.vue', () => ({ name: 'ResourceDetailDrawer' } as any));
10
+
11
+ describe('composables: ResourceDetailDrawer', () => {
12
+ const resource = { type: 'RESOURCE' };
13
+ const yaml = 'YAML';
14
+
15
+ describe('useDefaultYamlTabProps', () => {
16
+ it('should return the appropriate values based on input', async() => {
17
+ const getYamlSpy = jest.spyOn(helpers, 'getYaml').mockImplementation(() => Promise.resolve(yaml));
18
+ const props = await useDefaultYamlTabProps(resource);
19
+
20
+ expect(getYamlSpy).toHaveBeenCalledWith(resource);
21
+ expect(props.yaml).toStrictEqual(yaml);
22
+ expect(props.resource).toStrictEqual(resource);
23
+ });
24
+ });
25
+
26
+ describe('useDefaultConfigTabProps', () => {
27
+ const hasCustomEdit = jest.fn();
28
+ const importEdit = jest.fn();
29
+ const hasCustomDetail = jest.fn();
30
+ const editComponent = { component: 'EDIT_COMPONENT' };
31
+ const store: any = {
32
+ getters: {
33
+ 'type-map/hasCustomEdit': hasCustomEdit,
34
+ 'type-map/importEdit': importEdit,
35
+ 'type-map/hasCustomDetail': hasCustomDetail,
36
+ }
37
+ };
38
+
39
+ it('should return undefined if it does not have a customEdit', async() => {
40
+ jest.spyOn(vuex, 'useStore').mockImplementation(() => store);
41
+ const hasCustomEditSpy = hasCustomEdit.mockImplementation(() => false);
42
+ const props = useDefaultConfigTabProps(resource);
43
+
44
+ expect(hasCustomEditSpy).toHaveBeenCalledWith(resource.type);
45
+ expect(props).toBeUndefined();
46
+ });
47
+
48
+ it('should return undefined if it does not have a customDetail', async() => {
49
+ jest.spyOn(vuex, 'useStore').mockImplementation(() => store);
50
+ const hasCustomEditSpy = hasCustomEdit.mockImplementation(() => true);
51
+ const hasCustomDetailSpy = hasCustomDetail.mockImplementation(() => false);
52
+ const props = useDefaultConfigTabProps(resource);
53
+
54
+ expect(hasCustomEditSpy).toHaveBeenCalledWith(resource.type);
55
+ expect(hasCustomDetailSpy).toHaveBeenCalledWith(resource.type);
56
+ expect(props).toBeUndefined();
57
+ });
58
+
59
+ it('should return undefined if resource disableResourceDetailDrawerConfigTab is true', async() => {
60
+ jest.spyOn(vuex, 'useStore').mockImplementation(() => store);
61
+ const hasCustomDetailSpy = hasCustomDetail.mockImplementation(() => false);
62
+ const props = useDefaultConfigTabProps({ ...resource, disableResourceDetailDrawerConfigTab: true });
63
+
64
+ expect(hasCustomDetailSpy).toHaveBeenCalledWith(resource.type);
65
+ expect(props).toBeUndefined();
66
+ });
67
+
68
+ it('should return props if it has a customEdit', async() => {
69
+ jest.spyOn(vuex, 'useStore').mockImplementation(() => store);
70
+ const hasCustomEditSpy = hasCustomEdit.mockImplementation(() => true);
71
+ const hasCustomDetailSpy = hasCustomDetail.mockImplementation(() => true);
72
+ const importEditSpy = importEdit.mockImplementation(() => editComponent);
73
+ const props = useDefaultConfigTabProps(resource);
74
+
75
+ expect(hasCustomEditSpy).toHaveBeenCalledWith(resource.type);
76
+ expect(hasCustomDetailSpy).toHaveBeenCalledWith(resource.type);
77
+ expect(importEditSpy).toHaveBeenCalledWith(resource.type);
78
+ expect(props?.component).toStrictEqual(editComponent);
79
+ expect(props?.resource).toStrictEqual(resource);
80
+ });
81
+ });
82
+
83
+ describe('useResourceDetailDrawer', () => {
84
+ it('should create a wrapper that passes that appropriate properties to the drawer methods', () => {
85
+ const openSpy = jest.fn();
86
+ const closeSpy = jest.fn();
87
+ const selector = '.selector';
88
+ const useDrawerSpy = jest.spyOn(drawer, 'useDrawer').mockImplementation(() => ({ open: openSpy, close: closeSpy }));
89
+ const resourceDetailDrawer = useResourceDetailDrawer();
90
+
91
+ resourceDetailDrawer.openResourceDetailDrawer(resource, selector);
92
+
93
+ expect(useDrawerSpy).toHaveBeenCalledTimes(1);
94
+ expect(openSpy).toHaveBeenCalledWith({ name: 'ResourceDetailDrawer' }, selector, {
95
+ resource,
96
+ onClose: closeSpy,
97
+ width: '73%',
98
+ // We want this to be full viewport height top to bottom
99
+ height: '100vh',
100
+ top: '0',
101
+ 'z-index': 101, // We want this to be above the main side menu
102
+ closeOnRouteChange: ['name', 'params', 'query']
103
+ });
104
+ });
105
+ });
106
+ });
@@ -0,0 +1,42 @@
1
+ import { getYaml } from '@shell/components/Drawer/ResourceDetailDrawer/helpers';
2
+
3
+ describe('helpers: ResourceDetailDrawer', () => {
4
+ describe('getYaml', () => {
5
+ const resource = {
6
+ hasLink: jest.fn(),
7
+ followLink: jest.fn(),
8
+ cleanForDownload: jest.fn()
9
+ };
10
+
11
+ const yaml = 'YAML';
12
+
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ });
16
+
17
+ it('should skip following a link if it does not have a view link', async() => {
18
+ resource.hasLink.mockImplementation(() => false);
19
+ resource.cleanForDownload.mockImplementation(() => yaml);
20
+
21
+ const response = await getYaml(resource);
22
+
23
+ expect(resource.hasLink).toHaveBeenCalledWith('view');
24
+ expect(resource.followLink).toHaveBeenCalledTimes(0);
25
+ expect(resource.cleanForDownload).toHaveBeenCalledWith(undefined);
26
+ expect(response).toStrictEqual(yaml);
27
+ });
28
+
29
+ it('should follow link if it has a view link', async() => {
30
+ resource.hasLink.mockImplementation(() => true);
31
+ resource.followLink.mockImplementation(() => Promise.resolve({ data: yaml }));
32
+ resource.cleanForDownload.mockImplementation(() => yaml);
33
+
34
+ const response = await getYaml(resource);
35
+
36
+ expect(resource.hasLink).toHaveBeenCalledWith('view');
37
+ expect(resource.followLink).toHaveBeenCalledWith('view', { headers: { accept: 'application/yaml' } });
38
+ expect(resource.cleanForDownload).toHaveBeenCalledWith(yaml);
39
+ expect(response).toStrictEqual(yaml);
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,53 @@
1
+ import ResourceDetailDrawer from '@shell/components/Drawer/ResourceDetailDrawer/index.vue';
2
+ import { Props as YamlTabProps } from '@shell/components/Drawer/ResourceDetailDrawer/YamlTab.vue';
3
+ import { Props as ConfigTabProps } from '@shell/components/Drawer/ResourceDetailDrawer/ConfigTab.vue';
4
+ import { useStore } from 'vuex';
5
+ import { useDrawer } from '@shell/composables/drawer';
6
+ import { getYaml } from '@shell/components/Drawer/ResourceDetailDrawer/helpers';
7
+
8
+ export function useResourceDetailDrawer() {
9
+ const { open, close } = useDrawer();
10
+
11
+ const openResourceDetailDrawer = (resource: any, returnFocusSelector: string) => {
12
+ open(ResourceDetailDrawer,
13
+ returnFocusSelector,
14
+ {
15
+ resource,
16
+ onClose: close,
17
+ width: '73%',
18
+ // We want this to be full viewport height top to bottom
19
+ height: '100vh',
20
+ top: '0',
21
+ 'z-index': 101, // We want this to be above the main side menu
22
+ closeOnRouteChange: ['name', 'params', 'query'] // We want to ignore hash changes, tables in extensions can trigger the drawer to close while opening
23
+ });
24
+ };
25
+
26
+ return { openResourceDetailDrawer };
27
+ }
28
+
29
+ export async function useDefaultYamlTabProps(resource: any): Promise<YamlTabProps> {
30
+ const yaml = await getYaml(resource);
31
+
32
+ return {
33
+ resource,
34
+ yaml
35
+ };
36
+ }
37
+
38
+ export function useDefaultConfigTabProps(resource: any): ConfigTabProps | undefined {
39
+ const store = useStore();
40
+
41
+ // You don't want to show the Config tab if there isn't a an edit page to show and you don't want to show it if there isn't
42
+ // a detail page because we default to showing the existing edit page if the detail page doesn't exist. Showing them again
43
+ // wouldn't be worth while.
44
+ if (!store.getters['type-map/hasCustomEdit'](resource.type) || !store.getters['type-map/hasCustomDetail'](resource.type) || resource.disableResourceDetailDrawerConfigTab) {
45
+ return;
46
+ }
47
+
48
+ return {
49
+ resource,
50
+ component: store.getters['type-map/importEdit'](resource.type),
51
+ resourceType: resource.type
52
+ };
53
+ }
@@ -0,0 +1,10 @@
1
+ export async function getYaml(resource: any): Promise<string> {
2
+ let yaml;
3
+ const opt = { headers: { accept: 'application/yaml' } };
4
+
5
+ if (resource.hasLink('view')) {
6
+ yaml = (await resource.followLink('view', opt)).data;
7
+ }
8
+
9
+ return resource.cleanForDownload(yaml);
10
+ }
@@ -0,0 +1,111 @@
1
+ <script lang="ts">
2
+ import Drawer from '@shell/components/Drawer/Chrome.vue';
3
+ import { useI18n } from '@shell/composables/useI18n';
4
+ import { useStore } from 'vuex';
5
+ import Tabbed from '@shell/components/Tabbed/index.vue';
6
+ import YamlTab, { Props as YamlProps } from '@shell/components/Drawer/ResourceDetailDrawer/YamlTab.vue';
7
+ import { useDefaultConfigTabProps, useDefaultYamlTabProps } from '@shell/components/Drawer/ResourceDetailDrawer/composables';
8
+ import ConfigTab from '@shell/components/Drawer/ResourceDetailDrawer/ConfigTab.vue';
9
+ import { computed, ref } from 'vue';
10
+ import RcButton from '@components/RcButton/RcButton.vue';
11
+ import StateDot from '@shell/components/StateDot/index.vue';
12
+
13
+ export interface Props {
14
+ resource: any;
15
+
16
+ onClose?: () => void;
17
+ }
18
+ </script>
19
+ <script setup lang="ts">
20
+ const props = defineProps<Props>();
21
+ const emit = defineEmits(['close']);
22
+ const store = useStore();
23
+ const i18n = useI18n(store);
24
+
25
+ const yamlTabProps = ref<YamlProps | null>(null);
26
+ const configTabProps = useDefaultConfigTabProps(props.resource);
27
+
28
+ useDefaultYamlTabProps(props.resource).then((props) => {
29
+ yamlTabProps.value = props;
30
+ });
31
+
32
+ const title = computed(() => {
33
+ const resourceType = store.getters['type-map/labelFor']({ id: props.resource.type });
34
+ const resourceName = props.resource.nameDisplay;
35
+
36
+ return i18n.t('component.drawer.resourceDetailDrawer.title', { resourceType, resourceName });
37
+ });
38
+
39
+ const activeTab = ref<string>(configTabProps ? 'config-tab' : 'yaml-tab');
40
+
41
+ const action = computed(() => {
42
+ const isConfig = activeTab.value === 'config-tab';
43
+ const ariaLabel = isConfig ? i18n.t('component.drawer.resourceDetailDrawer.ariaLabel.editConfig') : i18n.t('component.drawer.resourceDetailDrawer.ariaLabel.editYaml');
44
+ const label = isConfig ? i18n.t('component.drawer.resourceDetailDrawer.ariaLabel.editConfig') : i18n.t('component.drawer.resourceDetailDrawer.ariaLabel.editYaml');
45
+ const action = isConfig ? () => props.resource.goToEdit() : () => props.resource.goToEditYaml();
46
+
47
+ return {
48
+ ariaLabel,
49
+ label,
50
+ action
51
+ };
52
+ });
53
+ </script>
54
+ <template>
55
+ <Drawer
56
+ class="resource-detail-drawer"
57
+ :ariaTarget="title"
58
+ @close="emit('close')"
59
+ >
60
+ <template #title>
61
+ <StateDot
62
+ :color="resource.stateSimpleColor"
63
+ class="mmr-3"
64
+ />
65
+ {{ title }}
66
+ </template>
67
+ <template #body>
68
+ <Tabbed
69
+ class="tabbed"
70
+ :useHash="false"
71
+ :showExtensionTabs="false"
72
+ @changed="({selectedName}) => {activeTab = selectedName;}"
73
+ >
74
+ <ConfigTab
75
+ v-if="configTabProps"
76
+ v-bind="configTabProps"
77
+ />
78
+ <YamlTab
79
+ v-if="yamlTabProps"
80
+ v-bind="yamlTabProps"
81
+ />
82
+ </Tabbed>
83
+ </template>
84
+ <template #additional-actions>
85
+ <RcButton
86
+ :primary="true"
87
+ :aria-label="action.ariaLabel"
88
+ @click="action.action"
89
+ >
90
+ {{ action.label }}
91
+ </RcButton>
92
+ </template>
93
+ </Drawer>
94
+ </template>
95
+
96
+ <style lang="scss" scoped>
97
+ .resource-detail-drawer {
98
+ :deep() .tabbed {
99
+ & > .tabs {
100
+ border: none;
101
+ }
102
+
103
+ & > .tab-container {
104
+ border: none;
105
+ border-top: 1px solid var(--border);
106
+ padding: 0;
107
+ padding-top: 24px;
108
+ }
109
+ }
110
+ }
111
+ </style>
@@ -25,10 +25,18 @@ export default {
25
25
  },
26
26
 
27
27
  methods: {
28
- close(growl) {
28
+ remove(growl) {
29
29
  this.$store.dispatch('growl/remove', growl.id);
30
30
  },
31
31
 
32
+ close(growl) {
33
+ this.$store.dispatch('growl/close', growl.id);
34
+
35
+ // If a user closes a growl, we won't get the mouse leave event, so we won't start the auto removal
36
+ // again, leaving to stuck growls that should timeout
37
+ this.startAutoRemove();
38
+ },
39
+
32
40
  closeAll() {
33
41
  this.$store.dispatch('growl/clear');
34
42
  },
@@ -36,13 +44,18 @@ export default {
36
44
  closeExpired() {
37
45
  const now = new Date().getTime();
38
46
 
47
+ // Check that we should still be running the auto-close interval timer
48
+ if (!this.shouldRun) {
49
+ this.stopAutoRemove();
50
+ }
51
+
39
52
  for ( const growl of this.stack ) {
40
53
  if ( !growl.timeout ) {
41
54
  continue;
42
55
  }
43
56
 
44
57
  if ( growl.started + growl.timeout < now ) {
45
- this.close(growl);
58
+ this.remove(growl);
46
59
  }
47
60
  }
48
61
  },
@@ -124,18 +137,6 @@ export default {
124
137
  </div>
125
138
  </div>
126
139
  </div>
127
- <div
128
- v-if="stack.length > 1"
129
- class="text-right mr-10 mt-10"
130
- >
131
- <button
132
- type="button"
133
- class="btn btn-sm role-primary"
134
- @click="closeAll()"
135
- >
136
- {{ t('growl.clearAll') }}
137
- </button>
138
- </div>
139
140
  </div>
140
141
  </template>
141
142
 
@@ -143,7 +144,7 @@ export default {
143
144
  .growl-container {
144
145
  z-index: 1000;
145
146
  position: absolute;
146
- top: 0;
147
+ top: var(--header-height);
147
148
  right: 0;
148
149
  width: 100%;
149
150
 
@@ -44,6 +44,10 @@ export default {
44
44
  type: String,
45
45
  default: () => undefined,
46
46
  },
47
+ imgAlt: {
48
+ type: String,
49
+ default: () => undefined,
50
+ },
47
51
  color: {
48
52
  type: String,
49
53
  default: () => 'primary',
@@ -143,6 +147,7 @@ export default {
143
147
  :src="src"
144
148
  class="svg-icon"
145
149
  :class="className"
150
+ :alt="imgAlt"
146
151
  >
147
152
  <i
148
153
  v-else-if="icon"
@@ -225,7 +225,7 @@ export default {
225
225
  .key-value {
226
226
  width: 100%;
227
227
 
228
- .kv-container{
228
+ .kv-container {
229
229
  display: grid;
230
230
  align-items: center;
231
231
  grid-template-columns: auto 1fr;
@@ -59,7 +59,7 @@ export default {
59
59
  <style lang="scss" scoped>
60
60
  .overlay {
61
61
  align-items: center;
62
- background-color: var(--overlay-bg);
62
+ background-color: var(--subtle-overlay-bg);
63
63
  display: flex;
64
64
  justify-content: center;
65
65
  position: absolute;
@@ -71,7 +71,12 @@ export default {
71
71
  <template>
72
72
  <div>
73
73
  <div v-if="mode === 'login'">
74
- <rc-dropdown v-if="showLocale">
74
+ <rc-dropdown
75
+ v-if="showLocale"
76
+ :aria-label="$attrs['aria-label'] || undefined"
77
+ :aria-labelledby="$attrs['aria-labelledby'] || undefined"
78
+ :aria-describedby="$attrs['aria-describedby'] || undefined"
79
+ >
75
80
  <rc-dropdown-trigger
76
81
  data-testid="locale-selector"
77
82
  link
@@ -105,6 +110,9 @@ export default {
105
110
  </div>
106
111
  <div v-else>
107
112
  <Select
113
+ :aria-label="$attrs['aria-label'] || undefined"
114
+ :aria-labelledby="$attrs['aria-labelledby'] || undefined"
115
+ :aria-describedby="$attrs['aria-describedby'] || undefined"
108
116
  :value="selectedOption"
109
117
  :options="localesOptions"
110
118
  :is-lang-select="true"