@rancher/shell 3.0.5-rc.3 → 3.0.5-rc.6

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 (424) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/icons/document.svg +3 -0
  3. package/assets/images/key.svg +17 -0
  4. package/assets/images/vendor/cognito.svg +1 -0
  5. package/assets/styles/app.scss +1 -0
  6. package/assets/styles/base/_basic.scss +10 -0
  7. package/assets/styles/base/_spacing.scss +29 -0
  8. package/assets/styles/global/_form.scss +1 -1
  9. package/assets/styles/global/_labeled-input.scss +1 -1
  10. package/assets/styles/global/_layout.scss +1 -1
  11. package/assets/styles/themes/_dark.scss +28 -0
  12. package/assets/styles/themes/_light.scss +68 -0
  13. package/assets/styles/vendor/vue-select.scss +1 -1
  14. package/assets/translations/en-us.yaml +721 -83
  15. package/assets/translations/zh-hans.yaml +11 -9
  16. package/cloud-credential/gcp.vue +9 -1
  17. package/components/AppModal.vue +2 -0
  18. package/components/Certificates.vue +5 -0
  19. package/components/CodeMirror.vue +1 -1
  20. package/components/ConfigMapSettings/Settings.vue +377 -0
  21. package/components/ConfigMapSettings/index.vue +354 -0
  22. package/components/CruResource.vue +1 -2
  23. package/components/DetailText.vue +61 -11
  24. package/components/Drawer/Chrome.vue +116 -0
  25. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  26. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  27. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  28. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  29. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  30. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  31. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  32. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  33. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  34. package/components/FilterPanel.vue +156 -0
  35. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  36. package/components/GrowlManager.vue +16 -15
  37. package/components/IconOrSvg.vue +19 -35
  38. package/components/KeyValueView.vue +1 -1
  39. package/components/LocaleSelector.vue +9 -1
  40. package/components/ProgressBarMulti.vue +1 -0
  41. package/components/PromptModal.vue +6 -1
  42. package/components/PromptRemove.vue +5 -1
  43. package/components/RelatedResources.vue +4 -12
  44. package/components/Resource/Detail/Additional.vue +46 -0
  45. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  46. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  47. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  48. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  49. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  50. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  51. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  52. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  53. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  54. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  55. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  56. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  57. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  58. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  59. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  60. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  61. package/components/Resource/Detail/Card/index.vue +56 -0
  62. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  63. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  64. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  65. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  66. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  67. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +64 -0
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +133 -0
  70. package/components/Resource/Detail/Metadata/KeyValue.vue +138 -0
  71. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  72. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  73. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  74. package/components/Resource/Detail/Metadata/Rectangle.vue +32 -0
  75. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  76. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  77. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  78. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  79. package/components/Resource/Detail/Metadata/composables.ts +78 -0
  80. package/components/Resource/Detail/Metadata/index.vue +73 -0
  81. package/components/Resource/Detail/Page.vue +37 -0
  82. package/components/Resource/Detail/PercentageBar.vue +40 -0
  83. package/components/Resource/Detail/ResourceRow.vue +138 -0
  84. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  85. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  86. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  87. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  88. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  89. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  90. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  91. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  92. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  93. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  94. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  95. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  96. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  97. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  98. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  99. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  100. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  101. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  102. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  103. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  104. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  105. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  106. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  107. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  108. package/components/Resource/Detail/SpacedRow.vue +14 -0
  109. package/components/Resource/Detail/StatusBar.vue +59 -0
  110. package/components/Resource/Detail/StatusRow.vue +61 -0
  111. package/components/Resource/Detail/TitleBar/Title.vue +14 -0
  112. package/components/Resource/Detail/TitleBar/Top.vue +14 -0
  113. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  114. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  115. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  116. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  117. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  118. package/components/Resource/Detail/TitleBar/index.vue +196 -0
  119. package/components/Resource/Detail/Top/index.vue +34 -0
  120. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  121. package/components/Resource/Detail/composables.ts +45 -0
  122. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  123. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  124. package/components/ResourceDetail/Masthead/index.vue +65 -0
  125. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  126. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  127. package/components/ResourceDetail/index.vue +73 -557
  128. package/components/ResourceDetail/legacy.vue +562 -0
  129. package/components/ResourceList/Masthead.vue +6 -0
  130. package/components/ResourceTable.vue +41 -7
  131. package/components/ResourceYaml.vue +14 -1
  132. package/components/SlideInPanelManager.vue +117 -10
  133. package/components/SortableTable/index.vue +13 -2
  134. package/components/SortableTable/selection.js +21 -8
  135. package/components/StateDot/index.vue +28 -0
  136. package/components/StatusBadge.vue +6 -4
  137. package/components/SubtleLink.vue +25 -0
  138. package/components/Tabbed/index.vue +11 -15
  139. package/components/Wizard.vue +16 -3
  140. package/components/YamlEditor.vue +1 -1
  141. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  142. package/components/__tests__/FilterPanel.test.ts +81 -0
  143. package/components/__tests__/GrowlManager.test.ts +0 -25
  144. package/components/auth/AuthBanner.vue +2 -3
  145. package/components/auth/RoleDetailEdit.vue +45 -3
  146. package/components/auth/login/ldap.vue +1 -1
  147. package/components/auth/login/oidc.vue +6 -1
  148. package/components/fleet/FleetApplications.vue +174 -0
  149. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  150. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  151. package/components/fleet/FleetClusters.vue +25 -6
  152. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  153. package/components/fleet/FleetHelmOps.vue +123 -0
  154. package/components/fleet/FleetIntro.vue +58 -28
  155. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  156. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  157. package/components/fleet/FleetRepos.vue +37 -80
  158. package/components/fleet/FleetResources.vue +53 -26
  159. package/components/fleet/FleetSummary.vue +26 -51
  160. package/components/fleet/FleetValuesFrom.vue +295 -0
  161. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  162. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  163. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  164. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  165. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  166. package/components/fleet/dashboard/Empty.vue +73 -0
  167. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  168. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  169. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  170. package/components/fleet/dashboard/ResourcePanel.vue +383 -0
  171. package/components/form/ArrayList.vue +19 -2
  172. package/components/form/ChangePassword.vue +3 -1
  173. package/components/form/Footer.vue +10 -4
  174. package/components/form/KeyValue.vue +81 -43
  175. package/components/form/LabeledSelect.vue +56 -16
  176. package/components/form/Labels.vue +90 -17
  177. package/components/form/MatchExpressions.vue +46 -5
  178. package/components/form/NameNsDescription.vue +1 -1
  179. package/components/form/ResourceSelector.vue +1 -0
  180. package/components/form/ResourceTabs/index.vue +5 -0
  181. package/components/form/SecretSelector.vue +9 -2
  182. package/components/form/Select.vue +57 -19
  183. package/components/form/SimpleSecretSelector.vue +17 -4
  184. package/components/form/Taints.vue +21 -2
  185. package/components/form/UnitInput.vue +8 -0
  186. package/components/form/ValueFromResource.vue +31 -19
  187. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  188. package/components/form/__tests__/Labels.test.ts +360 -0
  189. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  190. package/components/form/__tests__/Select.test.ts +5 -2
  191. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  192. package/components/formatter/FleetApplicationSource.vue +71 -0
  193. package/components/formatter/FleetSummaryGraph.vue +7 -0
  194. package/components/formatter/WorkloadHealthScale.vue +1 -1
  195. package/components/google/AccountAccess.vue +211 -0
  196. package/components/google/types/gcp.d.ts +136 -0
  197. package/components/google/types/index.d.ts +101 -0
  198. package/components/google/util/__mocks__/gcp.ts +465 -0
  199. package/components/google/util/formatter.ts +82 -0
  200. package/components/google/util/gcp.ts +134 -0
  201. package/components/google/util/index.d.ts +11 -0
  202. package/components/nav/Favorite.vue +1 -1
  203. package/components/nav/Group.vue +70 -47
  204. package/components/nav/Header.vue +13 -8
  205. package/components/nav/NamespaceFilter.vue +13 -1
  206. package/components/nav/NotificationCenter/Notification.vue +510 -0
  207. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  208. package/components/nav/NotificationCenter/index.vue +148 -0
  209. package/components/nav/TopLevelMenu.helper.ts +55 -34
  210. package/components/nav/TopLevelMenu.vue +11 -0
  211. package/components/nav/Type.vue +4 -1
  212. package/composables/drawer.ts +26 -0
  213. package/composables/resources.test.ts +63 -0
  214. package/composables/resources.ts +38 -0
  215. package/composables/useI18n.ts +12 -11
  216. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  217. package/config/labels-annotations.js +20 -11
  218. package/config/product/auth.js +17 -1
  219. package/config/product/{cis.js → compliance.js} +23 -26
  220. package/config/product/explorer.js +5 -1
  221. package/config/product/fleet.js +77 -17
  222. package/config/product/settings.js +22 -11
  223. package/config/query-params.js +6 -1
  224. package/config/roles.ts +2 -1
  225. package/config/router/navigation-guards/authentication.js +51 -2
  226. package/config/router/routes.js +45 -31
  227. package/config/secret.ts +15 -0
  228. package/config/settings.ts +24 -5
  229. package/config/store.js +2 -0
  230. package/config/system-namespaces.js +1 -1
  231. package/config/table-headers.js +53 -23
  232. package/config/types.js +17 -6
  233. package/core/plugin-helpers.ts +3 -2
  234. package/core/plugin.ts +32 -7
  235. package/core/types.ts +18 -1
  236. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  237. package/detail/fleet.cattle.io.cluster.vue +28 -15
  238. package/detail/fleet.cattle.io.gitrepo.vue +10 -1
  239. package/detail/fleet.cattle.io.helmop.vue +157 -0
  240. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  241. package/detail/management.cattle.io.oidcclient.vue +369 -0
  242. package/detail/node.vue +2 -2
  243. package/detail/pod.vue +2 -2
  244. package/detail/service.vue +10 -1
  245. package/detail/workload/index.vue +8 -2
  246. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  247. package/dialog/GenericPrompt.vue +1 -1
  248. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  249. package/dialog/ImportDialog.vue +8 -8
  250. package/dialog/OidcClientSecretDialog.vue +117 -0
  251. package/dialog/RedeployWorkloadDialog.vue +164 -0
  252. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  253. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  254. package/edit/auth/oidc.vue +159 -93
  255. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  256. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  257. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  258. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  259. package/edit/configmap.vue +4 -1
  260. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  261. package/edit/fleet.cattle.io.gitrepo.vue +70 -255
  262. package/edit/fleet.cattle.io.helmop.vue +772 -0
  263. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  264. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  265. package/edit/logging-flow/index.vue +1 -0
  266. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  267. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  268. package/edit/management.cattle.io.oidcclient.vue +162 -0
  269. package/edit/management.cattle.io.project.vue +4 -1
  270. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  271. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  272. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  273. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  274. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  275. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  276. package/edit/monitoring.coreos.com.route.vue +1 -0
  277. package/edit/namespace.vue +1 -0
  278. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  279. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  280. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  281. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  282. package/edit/node.vue +1 -0
  283. package/edit/persistentvolume/index.vue +4 -1
  284. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  285. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  286. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  287. package/edit/resources.cattle.io.restore.vue +1 -1
  288. package/edit/secret/index.vue +1 -0
  289. package/edit/service.vue +4 -1
  290. package/edit/serviceaccount.vue +4 -1
  291. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  292. package/edit/workload/index.vue +5 -0
  293. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  294. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  295. package/list/fleet.cattle.io.helmop.vue +108 -0
  296. package/list/management.cattle.io.oidcclient.vue +108 -0
  297. package/list/namespace.vue +5 -2
  298. package/list/node.vue +2 -0
  299. package/machine-config/amazonec2.vue +3 -24
  300. package/machine-config/components/GCEImage.vue +374 -0
  301. package/machine-config/google.vue +617 -0
  302. package/mixins/__tests__/brand.spec.ts +170 -0
  303. package/mixins/auth-config.js +8 -1
  304. package/mixins/brand.js +16 -17
  305. package/mixins/create-edit-view/index.js +5 -0
  306. package/mixins/preset.js +100 -0
  307. package/mixins/resource-fetch-api-pagination.js +18 -0
  308. package/mixins/resource-fetch.js +1 -1
  309. package/mixins/resource-table-watch.js +45 -0
  310. package/mixins/vue-select-overrides.js +1 -0
  311. package/models/__tests__/chart.test.ts +273 -0
  312. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  313. package/models/chart.js +144 -2
  314. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  315. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  316. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  317. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  318. package/models/fleet-application.js +314 -0
  319. package/models/fleet.cattle.io.bundle.js +9 -8
  320. package/models/fleet.cattle.io.cluster.js +11 -0
  321. package/models/fleet.cattle.io.gitrepo.js +41 -365
  322. package/models/fleet.cattle.io.helmop.js +198 -0
  323. package/models/management.cattle.io.authconfig.js +1 -0
  324. package/models/management.cattle.io.fleetworkspace.js +14 -1
  325. package/models/management.cattle.io.oidcclient.js +18 -0
  326. package/models/management.cattle.io.registration.js +3 -0
  327. package/models/provisioning.cattle.io.cluster.js +5 -5
  328. package/models/service.js +4 -0
  329. package/models/workload.js +19 -18
  330. package/package.json +2 -1
  331. package/pages/about.vue +4 -58
  332. package/pages/auth/login.vue +1 -1
  333. package/pages/auth/verify.vue +13 -1
  334. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  335. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  336. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +54 -0
  337. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  338. package/pages/c/_cluster/apps/charts/index.vue +487 -465
  339. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  340. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  341. package/pages/c/_cluster/explorer/index.vue +3 -3
  342. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  343. package/pages/c/_cluster/fleet/__tests__/index.test.ts +426 -0
  344. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  345. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  346. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  347. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  348. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  349. package/pages/c/_cluster/fleet/index.vue +809 -329
  350. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  351. package/pages/c/_cluster/longhorn/index.vue +5 -2
  352. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  353. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  354. package/pages/explorer/resource/detail/configmap.vue +42 -0
  355. package/pages/explorer/resource/detail/secret.vue +50 -0
  356. package/pages/home.vue +9 -55
  357. package/pages/support/index.vue +4 -6
  358. package/plugins/dashboard-store/actions.js +50 -14
  359. package/plugins/dashboard-store/getters.js +38 -21
  360. package/plugins/dashboard-store/mutations.js +51 -7
  361. package/plugins/dashboard-store/resource-class.js +30 -4
  362. package/plugins/steve/__tests__/subscribe.spec.ts +66 -1
  363. package/plugins/steve/actions.js +3 -0
  364. package/plugins/steve/steve-pagination-utils.ts +17 -8
  365. package/plugins/steve/subscribe.js +235 -43
  366. package/rancher-components/BadgeState/BadgeState.vue +3 -1
  367. package/rancher-components/Banner/Banner.vue +13 -0
  368. package/rancher-components/Form/Checkbox/Checkbox.vue +11 -6
  369. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  370. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  371. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  372. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  373. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  374. package/rancher-components/RcItemCard/index.ts +2 -0
  375. package/store/auth.js +3 -0
  376. package/store/catalog.js +85 -25
  377. package/store/growl.js +97 -8
  378. package/store/index.js +39 -14
  379. package/store/notifications.ts +426 -0
  380. package/store/prefs.js +0 -1
  381. package/store/slideInPanel.ts +6 -0
  382. package/store/type-map.js +19 -15
  383. package/store/uiplugins.ts +15 -1
  384. package/types/fleet.d.ts +59 -0
  385. package/types/notifications/index.ts +74 -0
  386. package/types/resources/settings.d.ts +19 -1
  387. package/types/shell/index.d.ts +388 -307
  388. package/types/store/dashboard-store.types.ts +33 -3
  389. package/types/store/pagination.types.ts +6 -1
  390. package/types/store/subscribe.types.ts +50 -0
  391. package/utils/__tests__/fleet.test.ts +148 -0
  392. package/utils/__tests__/object.test.ts +54 -1
  393. package/utils/__tests__/string.test.ts +273 -1
  394. package/utils/__tests__/time.test.ts +31 -0
  395. package/utils/auth.js +41 -5
  396. package/utils/crypto/encryption.ts +103 -0
  397. package/utils/cspAdaptor.ts +51 -0
  398. package/utils/fleet-types.ts +0 -0
  399. package/utils/fleet.ts +190 -2
  400. package/utils/object.js +36 -0
  401. package/utils/pagination-utils.ts +27 -2
  402. package/utils/pagination-wrapper.ts +132 -50
  403. package/utils/release-notes.ts +48 -0
  404. package/utils/selector-typed.ts +7 -2
  405. package/utils/settings.ts +4 -1
  406. package/utils/string.js +24 -0
  407. package/utils/style.ts +39 -0
  408. package/utils/{time.js → time.ts} +25 -6
  409. package/utils/uiplugins.ts +22 -0
  410. package/utils/validators/formRules/__tests__/index.test.ts +36 -3
  411. package/utils/validators/formRules/index.ts +13 -3
  412. package/utils/window.js +11 -7
  413. package/components/__tests__/ApplicationCard.test.ts +0 -27
  414. package/components/cards/ApplicationCard.vue +0 -145
  415. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  416. package/config/product/legacy.js +0 -62
  417. package/config/secret.js +0 -14
  418. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  419. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  420. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  421. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  422. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  423. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
  424. /package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +0 -0
@@ -0,0 +1,134 @@
1
+ import { addParams, QueryParams } from '@shell/utils/url';
2
+ import {
3
+ getGKEMachineTypesResponse,
4
+ getGKEClustersResponse,
5
+ getGKENetworksResponse,
6
+ getGKESharedSubnetworksResponse,
7
+ getGKESubnetworksResponse,
8
+ getGKEVersionsResponse,
9
+ GKEZone,
10
+ getGKEZonesResponse,
11
+ getGKEServiceAccountsResponse,
12
+ getGKEImageFamiliesResponse
13
+ } from 'types/gcp';
14
+ import { Store } from 'vuex';
15
+
16
+ // If any of these defaults are not available in the actual list from gcp, the ui will default to the first option in the (sorted) list
17
+ export const DEFAULT_GCP_ZONE = 'us-central1-c';
18
+ export const DEFAULT_GCP_REGION = 'us-central1';
19
+
20
+ export const DEFAULT_GCP_SERVICE_ACCOUNT = 'Compute Engine default service account';
21
+ /**
22
+ * @param resource gcp resource to fetch eg gkeZones
23
+ * @param store vuex store used to dispatch management/request
24
+ * @param cloudCredentialId gcp credential id - will be in the form cattle-global-data:<random string>
25
+ * @param projectId gcp project in which to make the request
26
+ * @param location object containing either gcp region or zone in which to make the request - defaults to DEFAULT_GCP_ZONE if both zone and region are undefined. region preempts zone
27
+ * @param extraParams any additional parameters required by requests
28
+ * @returns
29
+ */
30
+ function getGKEOptions(resource: string, store: any, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}, clusterId?:string, extraParams?: object ) {
31
+ if (!cloudCredentialId || !projectId) {
32
+ return;
33
+ }
34
+ if (!location.zone && !location.region) {
35
+ location.zone = DEFAULT_GCP_ZONE;
36
+ }
37
+ let params: QueryParams = {};
38
+
39
+ if (location.region) {
40
+ params = {
41
+ cloudCredentialId, projectId, region: location.region
42
+ };
43
+ } else if (location.zone) {
44
+ params = {
45
+ cloudCredentialId, projectId, zone: location.zone
46
+
47
+ };
48
+ }
49
+ if (clusterId) {
50
+ params.clusterId = clusterId;
51
+ }
52
+ if (extraParams) {
53
+ params = { ...params, ...extraParams };
54
+ }
55
+
56
+ const url = addParams(`/meta/${ resource }`, params);
57
+
58
+ return store.dispatch('management/request', {
59
+ url,
60
+ method: 'POST',
61
+ redirectUnauthorized: false,
62
+ });
63
+ }
64
+
65
+ export function getGKEZones(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEZonesResponse> {
66
+ return getGKEOptions('gkeZones', store, cloudCredentialId, projectId, location);
67
+ }
68
+
69
+ export async function getGKEVersions(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEVersionsResponse> {
70
+ return await getGKEOptions('gkeVersions', store, cloudCredentialId, projectId, location);
71
+ }
72
+
73
+ export function getGKEMachineTypes(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEMachineTypesResponse> {
74
+ return getGKEOptions('gkeMachineTypes', store, cloudCredentialId, projectId, { zone: location.zone });
75
+ }
76
+
77
+ export function getGKENetworks(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKENetworksResponse> {
78
+ return getGKEOptions('gkeNetworks', store, cloudCredentialId, projectId, location);
79
+ }
80
+
81
+ export function getGKESubnetworks(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKESubnetworksResponse> {
82
+ return getGKEOptions('gkeSubnetworks', store, cloudCredentialId, projectId, location);
83
+ }
84
+
85
+ export function getGKESharedSubnetworks(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKESharedSubnetworksResponse> {
86
+ return getGKEOptions('gkeSharedSubnets', store, cloudCredentialId, projectId, location);
87
+ }
88
+
89
+ export function getGKEClusters(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEClustersResponse> {
90
+ return getGKEOptions('gkeClusters', store, cloudCredentialId, projectId, location);
91
+ }
92
+
93
+ export function getGKEServiceAccounts(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEServiceAccountsResponse> {
94
+ return getGKEOptions('gkeServiceAccounts', store, cloudCredentialId, projectId, location);
95
+ }
96
+ /**
97
+ * we fetch GKE zones and etrapolate available regions from that list. Zones include a url to the region they are in.
98
+ * @param zone
99
+ * @returns region the zone is contained in
100
+ */
101
+ export function getGKERegionFromZone(zone: GKEZone): string|undefined {
102
+ const regionUrl = zone.region || '';
103
+
104
+ return regionUrl.split('/').pop();
105
+ }
106
+
107
+ export function getGKEFamiliesFromProject(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}, imageProjects: string, showDeprecated = false): Promise<getGKEServiceAccountsResponse> {
108
+ const extraParams = { imageProjects, showDeprecated };
109
+
110
+ return getGKEOptions('gkeFamiliesFromProject', store, cloudCredentialId, projectId, location, '', extraParams);
111
+ }
112
+
113
+ export function getGKEImageFamilies(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}, imageFamilies: string, imageProject: string, showDeprecated = false): Promise<getGKEImageFamiliesResponse> {
114
+ const extraParams = {
115
+ imageFamilies, imageProject, showDeprecated
116
+ };
117
+
118
+ return getGKEOptions('gkeImageFamilies', store, cloudCredentialId, projectId, location, '', extraParams);
119
+ }
120
+ export function getGKEDiskTypes(store: Store<any>, cloudCredentialId: string, projectId: string, location: {zone?: string, region?: string}): Promise<getGKEServiceAccountsResponse> {
121
+ return getGKEOptions('gkeDiskTypes', store, cloudCredentialId, projectId, location);
122
+ }
123
+
124
+ /** The Ember logic around image types is more complicated; it includes docker variants and windows SAC, with version-dependent availability
125
+ * the gke versions supporting those options are well outside the versions that will be supported in rancher 2.9
126
+ * No windows SAC since 2022 https://cloud.google.com/kubernetes-engine/docs/deprecations/windows-server-sac
127
+ * No more docker (non _containerd) since gke 1.24 https://cloud.google.com/kubernetes-engine/docs/concepts/node-images
128
+ * We will simply exclude those options from the UI and display a warning if the user is editing a cluster with one of them already configured
129
+ */
130
+ export const GKEImageTypes = [
131
+ 'COS_CONTAINERD',
132
+ 'WINDOWS_LTSC_CONTAINERD',
133
+ 'UBUNTU_CONTAINERD',
134
+ ];
@@ -0,0 +1,11 @@
1
+ import { GKENetwork, GKESubnetwork } from '@shell/components/google/types/gcp';
2
+
3
+ export interface GKENetworkOption extends Partial<GKENetwork>{
4
+ label: string,
5
+ kind?: string,
6
+ disabled?: boolean,
7
+ }
8
+
9
+ export interface GKESubnetworkOption extends Partial<GKESubnetwork>{
10
+ label: string,
11
+ }
@@ -34,7 +34,7 @@ export default {
34
34
  :aria-pressed="!!isFavorite"
35
35
  class="favorite icon"
36
36
  :class="{'icon-star-open': !isFavorite, 'icon-star': isFavorite}"
37
- aria-role="button"
37
+ role="button"
38
38
  :aria-label="ariaLabel"
39
39
  @click.stop.prevent="toggle"
40
40
  @keydown.enter.prevent="toggle"
@@ -226,34 +226,36 @@ export default {
226
226
  class="accordion"
227
227
  :class="{[`depth-${depth}`]: true, 'expanded': isExpanded, 'has-children': hasChildren, 'group-highlight': isGroupActive }"
228
228
  >
229
- <div
230
- v-if="showHeader"
231
- class="header"
232
- :class="{'active': isOverview, 'noHover': !canCollapse || fixedOpen}"
233
- role="button"
234
- :tabindex="fixedOpen ? -1 : 0"
235
- :aria-label="group.labelDisplay || group.label || ''"
236
- @click="groupSelected()"
237
- @keyup.enter="groupSelected()"
238
- @keyup.space="groupSelected()"
239
- >
240
- <slot name="header">
241
- <router-link
242
- v-if="hasOverview"
243
- :to="group.children[0].route"
244
- :exact="group.children[0].exact"
245
- :tabindex="-1"
246
- >
247
- <h6>
229
+ <div class="accordion-item">
230
+ <div
231
+ v-if="showHeader"
232
+ class="header"
233
+ :class="{'active': isOverview, 'noHover': !canCollapse || fixedOpen}"
234
+ role="button"
235
+ :tabindex="fixedOpen ? -1 : 0"
236
+ :aria-label="group.labelDisplay || group.label || ''"
237
+ @click="groupSelected()"
238
+ @keyup.enter="groupSelected()"
239
+ @keyup.space="groupSelected()"
240
+ >
241
+ <slot name="header">
242
+ <router-link
243
+ v-if="hasOverview"
244
+ :to="group.children[0].route"
245
+ :exact="group.children[0].exact"
246
+ :tabindex="-1"
247
+ >
248
+ <h6>
249
+ <span v-clean-html="group.labelDisplay || group.label" />
250
+ </h6>
251
+ </router-link>
252
+ <h6
253
+ v-else
254
+ >
248
255
  <span v-clean-html="group.labelDisplay || group.label" />
249
256
  </h6>
250
- </router-link>
251
- <h6
252
- v-else
253
- >
254
- <span v-clean-html="group.labelDisplay || group.label" />
255
- </h6>
256
- </slot>
257
+ </slot>
258
+ </div>
257
259
  <i
258
260
  v-if="!onlyHasOverview && canCollapse"
259
261
  class="icon toggle toggle-accordion"
@@ -330,6 +332,12 @@ export default {
330
332
  font-size: 14px;
331
333
  }
332
334
 
335
+ > H6 {
336
+ text-transform: none;
337
+ height: 100%;
338
+ padding: 8px 0 8px 16px;
339
+ }
340
+
333
341
  > A {
334
342
  display: block;
335
343
  box-sizing:border-box;
@@ -348,6 +356,19 @@ export default {
348
356
  }
349
357
 
350
358
  .accordion {
359
+ .accordion-item {
360
+ position: relative;
361
+ cursor: pointer;
362
+ color: var(--body-text);
363
+ height: 33px;
364
+ outline: none;
365
+
366
+ .toggle-accordion:focus-visible {
367
+ @include focus-outline;
368
+ outline-offset: -6px;
369
+ }
370
+ }
371
+
351
372
  .header {
352
373
  &:focus-visible {
353
374
  h6 span {
@@ -355,10 +376,6 @@ export default {
355
376
  outline-offset: 2px;
356
377
  }
357
378
  }
358
- .toggle-accordion:focus-visible {
359
- @include focus-outline;
360
- outline-offset: -6px;
361
- }
362
379
 
363
380
  &.active {
364
381
  color: var(--primary-hover-text);
@@ -373,6 +390,10 @@ export default {
373
390
  &:hover {
374
391
  background-color: var(--primary-hover-bg);
375
392
  }
393
+
394
+ ~ I {
395
+ color: var(--primary-hover-text);
396
+ }
376
397
  }
377
398
  &:hover:not(.active) {
378
399
  background-color: var(--nav-hover);
@@ -395,14 +416,14 @@ export default {
395
416
  text-transform: none;
396
417
  padding: 8px 0 8px 16px;
397
418
  }
419
+ }
398
420
 
399
- > I {
400
- position: absolute;
401
- right: 0;
402
- top: 0;
403
- padding: 10px 10px 9px 7px;
404
- user-select: none;
405
- }
421
+ .accordion-item > I {
422
+ position: absolute;
423
+ right: 0;
424
+ top: 0;
425
+ padding: 10px 10px 9px 7px;
426
+ user-select: none;
406
427
  }
407
428
 
408
429
  > .body {
@@ -421,9 +442,11 @@ export default {
421
442
  line-height: 18px;
422
443
  padding: 8px 0 7px 5px !important;
423
444
  }
424
- > I {
425
- padding: 10px 7px 9px 7px !important;
426
- }
445
+
446
+ }
447
+
448
+ .accordion-item > I {
449
+ padding: 10px 7px 9px 7px !important;
427
450
  }
428
451
 
429
452
  &:deep() .type-link > .label {
@@ -438,19 +461,19 @@ export default {
438
461
  display: inline-block;
439
462
  padding: 5px 0 5px 5px;
440
463
  }
464
+ }
441
465
 
442
- > I {
443
- position: absolute;
444
- right: 0;
445
- top: 0;
446
- padding: 6px 8px 6px 8px;
447
- }
466
+ .accordion-item > I {
467
+ position: absolute;
468
+ right: 0;
469
+ top: 0;
470
+ padding: 6px 8px 6px 8px;
448
471
  }
449
472
  }
450
473
  }
451
474
 
452
475
  .body :deep() > .child.router-link-active,
453
- .header :deep() > .child.router-link-exact-active {
476
+ .accordion-item :deep() > .child.router-link-exact-active {
454
477
  padding: 0;
455
478
 
456
479
  A, A I {
@@ -22,6 +22,7 @@ import IconOrSvg from '@shell/components/IconOrSvg';
22
22
  import { wait } from '@shell/utils/async';
23
23
  import { configType } from '@shell/models/management.cattle.io.authconfig';
24
24
  import HeaderPageActionMenu from './HeaderPageActionMenu.vue';
25
+ import NotificationCenter from './NotificationCenter';
25
26
  import {
26
27
  RcDropdown,
27
28
  RcDropdownItem,
@@ -40,6 +41,7 @@ export default {
40
41
  ClusterProviderIcon,
41
42
  IconOrSvg,
42
43
  AppModal,
44
+ NotificationCenter,
43
45
  HeaderPageActionMenu,
44
46
  RcDropdown,
45
47
  RcDropdownItem,
@@ -93,7 +95,8 @@ export default {
93
95
  'isSingleProduct',
94
96
  'isRancherInHarvester',
95
97
  'showTopLevelMenu',
96
- 'isMultiCluster'
98
+ 'isMultiCluster',
99
+ 'showWorkspaceSwitcher'
97
100
  ]),
98
101
 
99
102
  samlAuthProviderEnabled() {
@@ -238,16 +241,16 @@ export default {
238
241
  },
239
242
 
240
243
  watch: {
241
- currentCluster(nue, old) {
242
- if (nue && old && nue.id !== old.id) {
244
+ currentCluster(neu, old) {
245
+ if (neu && old && neu.id !== old.id) {
243
246
  this.checkClusterName();
244
247
  }
245
248
  },
246
249
  // since the Header is a "persistent component" we need to update it at every route change...
247
250
  $route: {
248
- handler(nue) {
249
- if (nue) {
250
- this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, nue);
251
+ handler(neu) {
252
+ if (neu) {
253
+ this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, neu);
251
254
 
252
255
  this.navHeaderRight = this.$plugin?.getDynamic('component', 'NavHeaderRight');
253
256
  }
@@ -533,7 +536,7 @@ export default {
533
536
  class="top"
534
537
  >
535
538
  <NamespaceFilter v-if="clusterReady && currentProduct && (currentProduct.showNamespaceFilter || isExplorer)" />
536
- <WorkspaceSwitcher v-else-if="clusterReady && currentProduct && currentProduct.showWorkspaceSwitcher" />
539
+ <WorkspaceSwitcher v-else-if="clusterReady && currentProduct && currentProduct.showWorkspaceSwitcher && showWorkspaceSwitcher" />
537
540
  </div>
538
541
  <div
539
542
  v-if="currentCluster && !simple"
@@ -644,7 +647,7 @@ export default {
644
647
  :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
645
648
  role="button"
646
649
  tabindex="0"
647
- :aria-label="action.label"
650
+ :aria-label="action.labelKey ? t(action.labelKey) : action.label"
648
651
  @shortkey="handleExtensionAction(action, $event)"
649
652
  @click="handleExtensionAction(action, $event)"
650
653
  >
@@ -652,6 +655,7 @@ export default {
652
655
  class="icon icon-lg"
653
656
  :icon="action.icon"
654
657
  :src="action.svg"
658
+ :img-alt="action.tooltipKey ? t(action.tooltipKey) : action.labelKey ? t(action.labelKey) : action.label ? action.label : t('generic.imageAlt')"
655
659
  color="header"
656
660
  />
657
661
  </button>
@@ -659,6 +663,7 @@ export default {
659
663
 
660
664
  <div class="center-self">
661
665
  <header-page-action-menu v-if="showPageActions" />
666
+ <NotificationCenter />
662
667
  <rc-dropdown
663
668
  v-if="showUserMenu"
664
669
  :aria-label="t('nav.userMenu.label')"
@@ -63,6 +63,9 @@ export default {
63
63
  return this.$store.getters[`${ this.currentProduct.inStore }/paginationEnabled`](this.$route.params?.resource) ? paginationUtils.validNsProjectFilters : null;
64
64
  },
65
65
 
66
+ /**
67
+ * Create visible options (filtered version of `options`)
68
+ */
66
69
  filtered() {
67
70
  let out = this.options;
68
71
 
@@ -142,6 +145,9 @@ export default {
142
145
  return createNamespaceFilterKey(this.$store.getters['clusterId'], this.currentProduct);
143
146
  },
144
147
 
148
+ /**
149
+ * Create options (see `filtered` for visible collection)
150
+ */
145
151
  options() {
146
152
  const t = this.$store.getters['i18n/t'];
147
153
  let out = [];
@@ -341,6 +347,11 @@ export default {
341
347
  })
342
348
  .filter((x) => !!x);
343
349
 
350
+ if (filters.length !== values.length) {
351
+ // filter has changed, ensure we persist these to store
352
+ this.value = filters;
353
+ }
354
+
344
355
  return filters;
345
356
  },
346
357
 
@@ -401,7 +412,7 @@ export default {
401
412
  *
402
413
  * This is caused by churn of the filtered and options computed properties causing multiple renders for each action.
403
414
  *
404
- * To break this multiple-render per cycle behaviour detatch `filtered` from the value used in `v-for`.
415
+ * To break this multiple-render per cycle behaviour detach `filtered` from the value used in `v-for`.
405
416
  *
406
417
  */
407
418
  filtered(neu) {
@@ -700,6 +711,7 @@ export default {
700
711
  :aria-activedescendant="containerId"
701
712
  class="ns-filter"
702
713
  data-testid="namespaces-filter"
714
+ :aria-label="t('generic.namespaceFilter')"
703
715
  tabindex="0"
704
716
  @mousedown.prevent
705
717
  @keydown.self.down.enter.space.prevent="open"