@rancher/shell 0.2.5 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_layout.scss +1 -2
  4. package/assets/styles/global/_select.scss +1 -4
  5. package/assets/styles/themes/_dark.scss +8 -4
  6. package/assets/styles/themes/_light.scss +9 -3
  7. package/assets/styles/themes/_suse.scss +1 -1
  8. package/assets/styles/vendor/vue-select.scss +4 -3
  9. package/assets/translations/en-us.yaml +682 -74
  10. package/assets/translations/zh-hans.yaml +554 -170
  11. package/chart/istio.vue +1 -1
  12. package/chart/monitoring/grafana/index.vue +1 -1
  13. package/chart/monitoring/index.vue +1 -1
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  16. package/cloud-credential/azure.vue +23 -0
  17. package/cloud-credential/harvester.vue +25 -62
  18. package/cloud-credential/pnap.vue +80 -0
  19. package/components/AdvancedSection.vue +9 -2
  20. package/components/Alert.vue +2 -2
  21. package/components/AlertTable.vue +1 -1
  22. package/components/AssignTo.vue +1 -1
  23. package/components/AsyncButton.vue +2 -2
  24. package/components/BrandImage.vue +1 -1
  25. package/components/ButtonDropdown.vue +0 -2
  26. package/components/ButtonGroup.vue +2 -1
  27. package/components/ClusterProviderIcon.vue +2 -2
  28. package/components/Collapse.vue +6 -2
  29. package/components/CollapsibleCard.vue +2 -3
  30. package/components/ConsumptionGauge.vue +4 -4
  31. package/components/ContainerResourceLimit.vue +1 -1
  32. package/components/CountBox.vue +1 -1
  33. package/components/CountGauge.vue +1 -1
  34. package/components/CruResource.vue +43 -5
  35. package/components/DashboardMetrics.vue +2 -2
  36. package/components/DetailTop.vue +58 -3
  37. package/components/DisableAuthProviderModal.vue +106 -0
  38. package/components/DraggableZone.vue +181 -0
  39. package/components/ExplorerMembers.vue +253 -30
  40. package/components/ExplorerProjectsNamespaces.vue +82 -38
  41. package/components/FixedBanner.vue +6 -6
  42. package/components/GlobalRoleBindings.vue +6 -6
  43. package/components/GradientBox.vue +2 -2
  44. package/components/GrowlManager.vue +3 -3
  45. package/components/IconMessage.vue +4 -4
  46. package/components/IconOrSvg.vue +149 -0
  47. package/components/Import.vue +5 -5
  48. package/components/InputOrDisplay.vue +1 -1
  49. package/components/KeyValueView.vue +1 -1
  50. package/components/LabelValue.vue +1 -1
  51. package/components/LogItem.vue +69 -0
  52. package/components/ModalWithCard.vue +1 -1
  53. package/components/MoveModal.vue +1 -1
  54. package/components/PercentageBar.vue +2 -2
  55. package/components/PodSecurityAdmission.vue +302 -0
  56. package/components/PromptChangePassword.vue +1 -1
  57. package/components/PromptModal.vue +2 -1
  58. package/components/PromptRemove.vue +2 -2
  59. package/components/PromptRestore.vue +13 -13
  60. package/components/Questions/Question.js +1 -1
  61. package/components/ResourceCancelModal.vue +3 -3
  62. package/components/ResourceDetail/Masthead.vue +55 -3
  63. package/components/ResourceDetail/index.vue +12 -5
  64. package/components/ResourceList/Masthead.vue +12 -2
  65. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  66. package/components/ResourceList/index.vue +53 -12
  67. package/components/ResourceList/resource-list.config.js +7 -0
  68. package/components/ResourceSummary.vue +4 -4
  69. package/components/ResourceTable.vue +31 -6
  70. package/components/RoleBindings.vue +19 -19
  71. package/components/SimpleBox.vue +6 -2
  72. package/components/SingleClusterInfo.vue +5 -5
  73. package/components/SortableTable/THead.vue +20 -6
  74. package/components/SortableTable/actions.js +4 -2
  75. package/components/SortableTable/index.vue +30 -19
  76. package/components/SortableTable/selection.js +2 -2
  77. package/components/Tabbed/index.vue +20 -15
  78. package/components/TableSparkLine.vue +1 -1
  79. package/components/TypeDescription.vue +1 -1
  80. package/components/Wizard.vue +1 -1
  81. package/components/YamlEditor.vue +6 -6
  82. package/components/__tests__/ApplicationCard.test.ts +27 -0
  83. package/components/__tests__/AsyncButton.test.ts +140 -0
  84. package/components/__tests__/BackLink.test.ts +33 -0
  85. package/components/__tests__/ButtonGroup.test.ts +124 -0
  86. package/components/__tests__/ClusterBadge.test.ts +32 -0
  87. package/components/__tests__/Collapse.spec.ts +44 -0
  88. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  89. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  90. package/components/__tests__/CruResource.test.ts +6 -5
  91. package/components/__tests__/FixedBanner.test.ts +129 -0
  92. package/components/__tests__/GrowlManager.test.ts +147 -0
  93. package/components/__tests__/NamespaceFilter.test.ts +221 -0
  94. package/components/__tests__/PercentageBar.test.ts +32 -0
  95. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  96. package/components/__tests__/SimpleBox.spec.ts +28 -0
  97. package/components/auth/AuthBanner.vue +20 -10
  98. package/components/auth/RoleDetailEdit.vue +41 -30
  99. package/components/auth/SelectPrincipal.vue +45 -5
  100. package/components/auth/login/ldap.vue +3 -0
  101. package/components/cards/ApplicationCard.vue +10 -5
  102. package/components/fleet/FleetBundleResources.vue +8 -8
  103. package/components/fleet/FleetClusters.vue +10 -10
  104. package/components/fleet/FleetRepos.vue +5 -5
  105. package/components/fleet/FleetResources.vue +6 -6
  106. package/components/fleet/FleetSummary.vue +5 -5
  107. package/components/fleet/ResourcesSummary.vue +1 -1
  108. package/components/form/ArrayList.vue +3 -35
  109. package/components/form/ArrayListGrouped.vue +14 -5
  110. package/components/form/ArrayListSelect.vue +8 -8
  111. package/components/form/BannerSettings.vue +6 -6
  112. package/components/form/ChangePassword.vue +3 -3
  113. package/components/form/Error.vue +10 -2
  114. package/components/form/FileSelector.vue +3 -3
  115. package/components/form/Footer.vue +1 -1
  116. package/components/form/GithubPicker.vue +4 -4
  117. package/components/form/KeyValue.vue +41 -9
  118. package/components/form/LabeledSelect.vue +5 -2
  119. package/components/form/Labels.vue +46 -16
  120. package/components/form/MatchExpressions.vue +1 -1
  121. package/components/form/Members/ClusterPermissionsEditor.vue +28 -28
  122. package/components/form/Members/MembershipEditor.vue +14 -14
  123. package/components/form/NameNsDescription.vue +1 -1
  124. package/components/form/NodeAffinity.vue +1 -1
  125. package/components/form/NodeScheduling.vue +1 -1
  126. package/components/form/Password.vue +3 -3
  127. package/components/form/PodAffinity.vue +1 -1
  128. package/components/form/Probe.vue +3 -3
  129. package/components/form/ProjectMemberEditor.vue +1 -1
  130. package/components/form/ResourceQuota/Project.vue +6 -6
  131. package/components/form/ResourceQuota/shared.js +12 -12
  132. package/components/form/ResourceTabs/index.vue +1 -6
  133. package/components/form/SecretSelector.vue +1 -1
  134. package/components/form/Security.vue +8 -7
  135. package/components/form/Select.vue +7 -2
  136. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  137. package/components/form/ServicePorts.vue +8 -0
  138. package/components/form/SimpleSecretSelector.vue +1 -1
  139. package/components/form/Taints.vue +1 -1
  140. package/components/form/UnitInput.vue +7 -7
  141. package/components/form/ValueFromResource.vue +1 -1
  142. package/components/form/WorkloadPorts.vue +8 -2
  143. package/components/form/__tests__/ArrayList.test.ts +74 -0
  144. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  145. package/components/formatter/AppSummaryGraph.vue +4 -4
  146. package/components/formatter/BadgeStateFormatter.vue +2 -2
  147. package/components/formatter/Checked.vue +2 -2
  148. package/components/formatter/ClusterLink.vue +8 -3
  149. package/components/formatter/Date.vue +1 -1
  150. package/components/formatter/DelayedValue.vue +1 -1
  151. package/components/formatter/Endpoints.vue +1 -1
  152. package/components/formatter/FleetSummaryGraph.vue +4 -4
  153. package/components/formatter/IconIsDefault.vue +3 -3
  154. package/components/formatter/IconText.vue +4 -4
  155. package/components/formatter/ImagePercentageBar.vue +4 -4
  156. package/components/formatter/IngressFullPath.vue +1 -1
  157. package/components/formatter/InternalExternalIP.vue +11 -8
  158. package/components/formatter/LinkDetail.vue +3 -3
  159. package/components/formatter/List.vue +1 -1
  160. package/components/formatter/ListLink.vue +1 -1
  161. package/components/formatter/ListLinkDetail.vue +1 -1
  162. package/components/formatter/LiveDate.vue +3 -3
  163. package/components/formatter/LiveDuration.vue +78 -0
  164. package/components/formatter/LivePodRestarts.vue +1 -1
  165. package/components/formatter/Number.vue +1 -1
  166. package/components/formatter/Percentage.vue +2 -2
  167. package/components/formatter/PercentageBar.vue +3 -3
  168. package/components/formatter/PodImages.vue +1 -1
  169. package/components/formatter/Principal.vue +1 -1
  170. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  171. package/components/formatter/QualityText.vue +1 -1
  172. package/components/formatter/ReceiverIcons.vue +2 -2
  173. package/components/formatter/Scale.vue +1 -1
  174. package/components/formatter/ScanResult.vue +1 -1
  175. package/components/formatter/SecretData.vue +1 -1
  176. package/components/formatter/ServiceType.vue +1 -1
  177. package/components/formatter/Shortened.vue +1 -1
  178. package/components/formatter/VerticalScroll.vue +2 -2
  179. package/components/formatter/VirtualServiceGateways.vue +3 -3
  180. package/components/formatter/Weight.vue +2 -2
  181. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  182. package/components/formatter/WorkloadHealthScale.vue +7 -5
  183. package/components/formatter/__tests__/Date.test.ts +60 -0
  184. package/components/formatter/__tests__/LinkDetail.test.ts +72 -0
  185. package/components/formatter/__tests__/LiveDate.test.ts +84 -0
  186. package/components/formatter/__tests__/Si.test.ts +35 -0
  187. package/components/graph/LinePlot.vue +1 -1
  188. package/components/graph/ProgressArc.vue +5 -5
  189. package/components/nav/GlobalLoading.vue +1 -1
  190. package/components/nav/Header.vue +6 -4
  191. package/components/nav/Jump.vue +3 -3
  192. package/components/nav/NamespaceFilter.vue +200 -68
  193. package/components/nav/TopLevelMenu.vue +24 -21
  194. package/components/nav/Type.vue +1 -1
  195. package/components/nav/WindowManager/ChartReadme.vue +1 -1
  196. package/components/nav/WindowManager/ContainerLogs.vue +84 -127
  197. package/components/nav/WindowManager/ContainerShell.vue +28 -7
  198. package/components/nav/WindowManager/KubectlShell.vue +6 -6
  199. package/components/nav/WindowManager/MachineSsh.vue +1 -1
  200. package/components/nav/WindowManager/Window.vue +2 -0
  201. package/components/nav/WindowManager/index.vue +206 -25
  202. package/config/elemental-types.js +9 -0
  203. package/config/features.js +2 -0
  204. package/config/home-links.js +4 -1
  205. package/config/labels-annotations.js +19 -19
  206. package/config/pod-security-admission.ts +82 -0
  207. package/config/product/apps.js +5 -5
  208. package/config/product/auth.js +22 -21
  209. package/config/product/cis.js +24 -24
  210. package/config/product/explorer.js +25 -24
  211. package/config/product/fleet.js +7 -7
  212. package/config/product/gatekeeper.js +7 -7
  213. package/config/product/istio.js +7 -7
  214. package/config/product/legacy.js +21 -21
  215. package/config/product/logging.js +90 -90
  216. package/config/product/manager.js +19 -15
  217. package/config/product/monitoring.js +36 -36
  218. package/config/product/multi-cluster-apps.js +24 -24
  219. package/config/product/settings.js +42 -42
  220. package/config/secret.js +0 -1
  221. package/config/settings.ts +39 -22
  222. package/config/table-headers.js +70 -52
  223. package/config/types.js +11 -8
  224. package/config/uiplugins.js +4 -4
  225. package/content/docs/zh-hans/getting-started.md +113 -137
  226. package/content/docs/zh-hans/whats-new.md +8 -46
  227. package/creators/app/app.package.json +4 -1
  228. package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
  229. package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
  230. package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
  231. package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
  232. package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
  233. package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
  234. package/creators/app/init +16 -17
  235. package/creators/app/package.json +7 -1
  236. package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
  237. package/creators/pkg/{index.ts → files/index.ts} +0 -0
  238. package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
  239. package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
  240. package/creators/pkg/init +1 -1
  241. package/creators/pkg/package.json +2 -2
  242. package/creators/update/init +56 -0
  243. package/creators/update/package.json +20 -0
  244. package/creators/update/upgrade +56 -0
  245. package/detail/catalog.cattle.io.app.vue +1 -1
  246. package/detail/cis.cattle.io.clusterscan.vue +6 -6
  247. package/detail/configmap.vue +1 -1
  248. package/detail/constraints.gatekeeper.sh.constraint.vue +1 -1
  249. package/detail/fleet.cattle.io.bundle.vue +5 -5
  250. package/detail/fleet.cattle.io.gitrepo.vue +5 -5
  251. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  252. package/detail/management.cattle.io.user.vue +3 -3
  253. package/detail/namespace.vue +13 -13
  254. package/detail/node.vue +2 -2
  255. package/detail/pod.vue +2 -2
  256. package/detail/provisioning.cattle.io.cluster.vue +47 -10
  257. package/detail/secret.vue +2 -2
  258. package/detail/service.vue +2 -9
  259. package/detail/workload/index.vue +1 -2
  260. package/dialog/AddClusterMemberDialog.vue +23 -29
  261. package/dialog/AddCustomBadgeDialog.vue +4 -4
  262. package/dialog/AddProjectMemberDialog.vue +81 -30
  263. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  264. package/dialog/DiagnosticTimingsDialog.vue +9 -8
  265. package/dialog/DrainNode.vue +56 -60
  266. package/dialog/ForceMachineRemoveDialog.vue +6 -8
  267. package/dialog/GenericPrompt.vue +16 -21
  268. package/dialog/RollbackWorkloadDialog.vue +22 -53
  269. package/dialog/RotateCertificatesDialog.vue +9 -11
  270. package/dialog/RotateEncryptionKeyDialog.vue +6 -10
  271. package/dialog/SaveAsRKETemplateDialog.vue +6 -14
  272. package/dialog/ScaleMachineDownDialog.vue +2 -2
  273. package/dialog/ScalePoolDownDialog.vue +121 -0
  274. package/edit/__tests__/management.cattle.io.setting.test.ts +4 -4
  275. package/edit/auth/azuread.vue +18 -18
  276. package/edit/auth/github.vue +10 -2
  277. package/edit/auth/googleoauth.vue +10 -1
  278. package/edit/auth/ldap/index.vue +14 -4
  279. package/edit/auth/oidc.vue +13 -3
  280. package/edit/auth/saml.vue +14 -4
  281. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +2 -2
  282. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  283. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  284. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  285. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +2 -2
  286. package/edit/cis.cattle.io.clusterscan.vue +2 -2
  287. package/edit/cloudcredential.vue +3 -7
  288. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  289. package/edit/fleet.cattle.io.clustergroup.vue +3 -3
  290. package/edit/fleet.cattle.io.gitrepo.vue +9 -9
  291. package/edit/group.principal.vue +2 -2
  292. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  293. package/edit/logging-flow/Match.vue +39 -8
  294. package/edit/logging-flow/index.vue +28 -5
  295. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +1 -1
  296. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  297. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +1 -1
  298. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +1 -1
  299. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +1 -1
  300. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  301. package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -1
  302. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +213 -0
  303. package/edit/logging.banzaicloud.io.output/providers/redis.vue +142 -0
  304. package/edit/logging.banzaicloud.io.output/providers/s3.vue +1 -1
  305. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  306. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +1 -1
  307. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  308. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  309. package/edit/management.cattle.io.project.vue +11 -4
  310. package/edit/management.cattle.io.projectroletemplatebinding.vue +5 -5
  311. package/edit/management.cattle.io.setting.vue +6 -3
  312. package/edit/management.cattle.io.user.vue +11 -5
  313. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +33 -17
  314. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +1 -1
  315. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  316. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +5 -5
  317. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +3 -3
  318. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +3 -3
  319. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +4 -4
  320. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  321. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  322. package/edit/monitoring.coreos.com.receiver/index.vue +1 -1
  323. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  324. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +1 -1
  325. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +1 -1
  326. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  327. package/edit/monitoring.coreos.com.route.vue +1 -1
  328. package/edit/namespace.vue +18 -4
  329. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +1 -1
  330. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  331. package/edit/networking.k8s.io.ingress/Certificates.vue +3 -3
  332. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  333. package/edit/networking.k8s.io.ingress/IngressClass.vue +9 -7
  334. package/edit/networking.k8s.io.ingress/Rule.vue +1 -1
  335. package/edit/networking.k8s.io.ingress/RulePath.vue +17 -11
  336. package/edit/networking.k8s.io.ingress/Rules.vue +7 -7
  337. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  338. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -1
  339. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  340. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -1
  341. package/edit/networking.k8s.io.networkpolicy/index.vue +5 -5
  342. package/edit/persistentvolume/index.vue +30 -27
  343. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +1 -1
  344. package/edit/persistentvolume/plugins/azureDisk.vue +1 -1
  345. package/edit/persistentvolume/plugins/azureFile.vue +1 -1
  346. package/edit/persistentvolume/plugins/cephfs.vue +31 -31
  347. package/edit/persistentvolume/plugins/cinder.vue +1 -1
  348. package/edit/persistentvolume/plugins/csi.vue +104 -64
  349. package/edit/persistentvolume/plugins/fc.vue +21 -21
  350. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  351. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  352. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +1 -1
  353. package/edit/persistentvolume/plugins/glusterfs.vue +1 -1
  354. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  355. package/edit/persistentvolume/plugins/iscsi.vue +47 -47
  356. package/edit/persistentvolume/plugins/local.vue +1 -1
  357. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  358. package/edit/persistentvolume/plugins/nfs.vue +1 -1
  359. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  360. package/edit/persistentvolume/plugins/portworxVolume.vue +1 -1
  361. package/edit/persistentvolume/plugins/quobyte.vue +1 -1
  362. package/edit/persistentvolume/plugins/rbd.vue +41 -41
  363. package/edit/persistentvolume/plugins/scaleIO.vue +1 -1
  364. package/edit/persistentvolume/plugins/storageos.vue +1 -1
  365. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  366. package/edit/persistentvolumeclaim.vue +78 -75
  367. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +1 -1
  368. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +12 -8
  369. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  370. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  371. package/edit/provisioning.cattle.io.cluster/S3Config.vue +1 -1
  372. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  373. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -1
  374. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
  375. package/edit/provisioning.cattle.io.cluster/import.vue +3 -3
  376. package/edit/provisioning.cattle.io.cluster/index.vue +31 -8
  377. package/edit/provisioning.cattle.io.cluster/rke2.vue +458 -164
  378. package/edit/resources.cattle.io.backup.vue +2 -2
  379. package/edit/secret/generic.vue +1 -0
  380. package/edit/secret/index.vue +3 -7
  381. package/edit/service.vue +3 -1
  382. package/edit/storage.k8s.io.storageclass/index.vue +101 -17
  383. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  384. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/no-provisioner.vue +1 -1
  385. package/edit/token.vue +1 -1
  386. package/edit/ui.cattle.io.navlink.vue +8 -8
  387. package/edit/workload/Job.vue +3 -3
  388. package/edit/workload/Upgrading.vue +1 -1
  389. package/edit/workload/VolumeClaimTemplate.vue +1 -1
  390. package/edit/workload/__tests__/index.test.ts +98 -0
  391. package/edit/workload/index.vue +61 -11
  392. package/edit/workload/mixins/workload.js +128 -91
  393. package/edit/workload/storage/ContainerMountPaths.vue +1 -11
  394. package/edit/workload/storage/Mount.vue +1 -1
  395. package/edit/workload/storage/azureDisk.vue +1 -1
  396. package/edit/workload/storage/azureFile.vue +1 -1
  397. package/edit/workload/storage/csi/index.vue +1 -1
  398. package/edit/workload/storage/emptyDir.vue +88 -0
  399. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  400. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  401. package/edit/workload/storage/hostPath.vue +1 -1
  402. package/edit/workload/storage/index.vue +8 -0
  403. package/edit/workload/storage/nfs.vue +1 -1
  404. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  405. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -1
  406. package/edit/workload/storage/secret.vue +1 -1
  407. package/edit/workload/storage/vsphereVolume.vue +1 -1
  408. package/layouts/default.vue +132 -58
  409. package/list/__tests__/workload.test.ts +53 -0
  410. package/list/catalog.cattle.io.app.vue +1 -0
  411. package/list/cis.cattle.io.clusterscan.vue +1 -0
  412. package/list/fleet.cattle.io.bundle.vue +5 -6
  413. package/list/fleet.cattle.io.cluster.vue +6 -3
  414. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  415. package/list/fleet.cattle.io.gitrepo.vue +5 -10
  416. package/list/group.principal.vue +8 -8
  417. package/list/helm.cattle.io.projecthelmchart.vue +2 -6
  418. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  419. package/list/logging.banzaicloud.io.flow.vue +6 -5
  420. package/list/management.cattle.io.cluster.vue +1 -0
  421. package/list/management.cattle.io.feature.vue +4 -5
  422. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  423. package/list/management.cattle.io.setting.vue +2 -2
  424. package/list/management.cattle.io.user.vue +4 -10
  425. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  426. package/list/node.vue +9 -6
  427. package/list/persistentvolume.vue +3 -3
  428. package/list/persistentvolumeclaim.vue +3 -4
  429. package/list/provisioning.cattle.io.cluster.vue +21 -22
  430. package/list/service.vue +6 -14
  431. package/list/workload.vue +43 -38
  432. package/machine-config/amazonec2.vue +1 -1
  433. package/machine-config/azure.vue +429 -60
  434. package/machine-config/pnap.vue +288 -0
  435. package/mixins/__tests__/create-edit-view.test.ts +1 -1
  436. package/mixins/auth-config.js +1 -3
  437. package/mixins/browser-tab-visibility.js +8 -14
  438. package/mixins/chart.js +15 -15
  439. package/mixins/create-edit-view/impl.js +4 -0
  440. package/mixins/create-edit-view/index.js +9 -7
  441. package/mixins/form-validation.js +1 -1
  442. package/mixins/labeled-form-element.ts +6 -6
  443. package/mixins/resource-fetch-namespaced.js +98 -0
  444. package/mixins/resource-fetch.js +82 -48
  445. package/mixins/resource-manager.js +2 -24
  446. package/models/apps.controllerrevision.js +7 -0
  447. package/models/apps.daemonset.js +18 -0
  448. package/models/apps.deployment.js +44 -0
  449. package/models/apps.replicaset.js +7 -0
  450. package/models/apps.statefulset.js +18 -0
  451. package/models/autoscaling.horizontalpodautoscaler.js +5 -5
  452. package/models/batch.cronjob.js +15 -15
  453. package/models/batch.job.js +15 -0
  454. package/models/catalog.cattle.io.app.js +6 -6
  455. package/models/catalog.cattle.io.clusterrepo.js +7 -7
  456. package/models/catalog.cattle.io.operation.js +5 -5
  457. package/models/chart.js +4 -4
  458. package/models/cis.cattle.io.clusterscan.js +10 -10
  459. package/models/cluster/node.js +46 -38
  460. package/models/cluster.x-k8s.io.machine.js +39 -17
  461. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  462. package/models/constraints.gatekeeper.sh.constraint.js +1 -1
  463. package/models/etcdbackup.js +4 -4
  464. package/models/event.js +7 -0
  465. package/models/fleet.cattle.io.cluster.js +15 -15
  466. package/models/fleet.cattle.io.clustergroup.js +1 -1
  467. package/models/fleet.cattle.io.gitrepo.js +15 -15
  468. package/models/group.principal.js +1 -1
  469. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  470. package/models/logging.banzaicloud.io.flow.js +6 -2
  471. package/models/logging.banzaicloud.io.output.js +15 -3
  472. package/models/management.cattle.io.authconfig.js +4 -4
  473. package/models/management.cattle.io.cluster.js +10 -10
  474. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -9
  475. package/models/management.cattle.io.globalrole.js +26 -5
  476. package/models/management.cattle.io.node.js +46 -11
  477. package/models/management.cattle.io.nodepool.js +3 -3
  478. package/models/management.cattle.io.nodetemplate.js +21 -21
  479. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  480. package/models/management.cattle.io.project.js +32 -13
  481. package/models/management.cattle.io.projectroletemplatebinding.js +6 -6
  482. package/models/management.cattle.io.roletemplate.js +54 -31
  483. package/models/management.cattle.io.setting.js +1 -1
  484. package/models/management.cattle.io.user.js +41 -5
  485. package/models/monitoring.coreos.com.alertmanagerconfig.js +4 -4
  486. package/models/monitoring.coreos.com.receiver.js +7 -7
  487. package/models/monitoring.coreos.com.route.js +2 -2
  488. package/models/namespace.js +55 -5
  489. package/models/persistentvolume.js +14 -2
  490. package/models/persistentvolumeclaim.js +4 -4
  491. package/models/pod.js +25 -10
  492. package/models/projectroletemplatebinding.js +7 -0
  493. package/models/provisioning.cattle.io.cluster.js +89 -38
  494. package/models/rbac.authorization.k8s.io.role.js +4 -4
  495. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  496. package/models/rke.cattle.io.etcdsnapshot.js +4 -4
  497. package/models/service.js +29 -28
  498. package/models/storage.k8s.io.storageclass.js +41 -26
  499. package/models/workload.js +66 -35
  500. package/nuxt.config.js +59 -34
  501. package/package.json +7 -7
  502. package/pages/about.vue +15 -3
  503. package/pages/account/index.vue +1 -1
  504. package/pages/auth/login.vue +37 -7
  505. package/pages/auth/setup.vue +11 -11
  506. package/pages/c/_cluster/_product/_resource/_id.vue +2 -2
  507. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  508. package/pages/c/_cluster/apps/charts/index.vue +21 -20
  509. package/pages/c/_cluster/apps/charts/install.vue +73 -36
  510. package/pages/c/_cluster/auth/config/_id.vue +8 -2
  511. package/pages/c/_cluster/auth/config/index.vue +8 -6
  512. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  513. package/pages/c/_cluster/auth/roles/_resource/_id.vue +2 -2
  514. package/pages/c/_cluster/auth/roles/index.vue +5 -7
  515. package/pages/c/_cluster/explorer/EventsTable.vue +8 -8
  516. package/pages/c/_cluster/explorer/index.vue +26 -20
  517. package/pages/c/_cluster/explorer/tools/index.vue +4 -4
  518. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +2 -2
  519. package/pages/c/_cluster/fleet/index.vue +10 -10
  520. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  521. package/pages/c/_cluster/legacy/index.vue +1 -1
  522. package/pages/c/_cluster/longhorn/index.vue +2 -2
  523. package/pages/c/_cluster/mcapps/index.vue +1 -1
  524. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  525. package/pages/c/_cluster/monitoring/index.vue +1 -1
  526. package/pages/c/_cluster/navlinks/_group.vue +1 -1
  527. package/pages/c/_cluster/neuvector/index.vue +2 -2
  528. package/pages/c/_cluster/settings/banners.vue +30 -30
  529. package/pages/c/_cluster/settings/brand.vue +9 -9
  530. package/pages/c/_cluster/settings/links.vue +6 -6
  531. package/pages/c/_cluster/settings/performance.vue +48 -2
  532. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +1 -1
  533. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  534. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +59 -9
  535. package/pages/c/_cluster/uiplugins/index.vue +30 -4
  536. package/pages/diagnostic.vue +5 -4
  537. package/pages/home.vue +105 -30
  538. package/pages/prefs.vue +23 -12
  539. package/pages/rio/mesh.vue +5 -5
  540. package/pages/support/index.vue +7 -7
  541. package/pkg/dynamic-importer.lib.js +8 -0
  542. package/pkg/vue.config.js +14 -1
  543. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  544. package/plugins/dashboard-store/actions.js +32 -25
  545. package/plugins/dashboard-store/getters.js +50 -33
  546. package/plugins/dashboard-store/mutations.js +134 -28
  547. package/plugins/dashboard-store/normalize.js +1 -1
  548. package/plugins/dashboard-store/resource-class.js +121 -141
  549. package/plugins/steve/actions.js +30 -0
  550. package/plugins/steve/caches/resourceCache.js +60 -0
  551. package/plugins/steve/getters.js +44 -1
  552. package/plugins/steve/mutations.js +97 -36
  553. package/plugins/steve/resourceWatcher.js +277 -0
  554. package/plugins/steve/schema.utils.js +25 -0
  555. package/plugins/steve/subscribe.js +292 -119
  556. package/plugins/steve/worker/index.js +17 -0
  557. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  558. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +6 -47
  559. package/promptRemove/management.cattle.io.project.vue +1 -1
  560. package/promptRemove/mixin/roleDeletionCheck.js +7 -7
  561. package/promptRemove/pod.vue +2 -2
  562. package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
  563. package/rancher-components/components/BadgeState/BadgeState.vue +111 -0
  564. package/rancher-components/components/BadgeState/index.ts +1 -0
  565. package/rancher-components/components/Banner/Banner.test.ts +57 -0
  566. package/rancher-components/components/Banner/Banner.vue +242 -0
  567. package/rancher-components/components/Banner/index.ts +1 -0
  568. package/rancher-components/components/Card/Card.test.ts +37 -0
  569. package/rancher-components/components/Card/Card.vue +166 -0
  570. package/rancher-components/components/Card/index.ts +1 -0
  571. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +68 -0
  572. package/rancher-components/components/Form/Checkbox/Checkbox.vue +418 -0
  573. package/rancher-components/components/Form/Checkbox/index.ts +1 -0
  574. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +23 -0
  575. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +355 -0
  576. package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
  577. package/rancher-components/components/Form/Radio/RadioButton.vue +276 -0
  578. package/rancher-components/components/Form/Radio/RadioGroup.vue +253 -0
  579. package/rancher-components/components/Form/Radio/index.ts +2 -0
  580. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  581. package/rancher-components/components/Form/TextArea/index.ts +1 -0
  582. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +94 -0
  583. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +149 -0
  584. package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
  585. package/rancher-components/components/Form/index.ts +5 -0
  586. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +151 -0
  587. package/rancher-components/components/LabeledTooltip/index.ts +1 -0
  588. package/rancher-components/components/StringList/StringList.test.ts +483 -0
  589. package/rancher-components/components/StringList/StringList.vue +611 -0
  590. package/rancher-components/components/StringList/index.ts +1 -0
  591. package/scripts/publish-shell.sh +38 -5
  592. package/scripts/record-deps.js +37 -0
  593. package/scripts/test-plugins-build.sh +19 -7
  594. package/scripts/typegen.sh +84 -0
  595. package/static/loading-indicator.html +1 -1
  596. package/store/action-menu.js +3 -3
  597. package/store/auth.js +4 -4
  598. package/store/aws.js +4 -4
  599. package/store/catalog.js +22 -22
  600. package/store/index.js +58 -7
  601. package/store/plugins.js +2 -19
  602. package/store/pnap.js +128 -0
  603. package/store/prefs.js +13 -3
  604. package/store/type-map.js +101 -44
  605. package/store/uiplugins.ts +2 -2
  606. package/store/wm.js +10 -0
  607. package/types/pod-security-admission.ts +36 -0
  608. package/types/shell/index.d.ts +3159 -0
  609. package/types/vue-shim.d +20 -0
  610. package/utils/__tests__/object.test.ts +17 -1
  611. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  612. package/utils/alertmanagerconfig.js +6 -6
  613. package/utils/async.ts +36 -0
  614. package/utils/color.js +45 -0
  615. package/utils/crypto/browserHashUtils.js +18 -0
  616. package/utils/dynamic-importer.js +8 -0
  617. package/utils/gc/gc-types.ts +1 -1
  618. package/utils/install-redirect.js +1 -1
  619. package/utils/object.js +26 -2
  620. package/utils/parse-externalid.js +5 -5
  621. package/utils/pod-security-admission.ts +39 -0
  622. package/utils/socket.js +61 -24
  623. package/utils/string.js +2 -0
  624. package/utils/svg-filter.js +301 -0
  625. package/utils/time.js +55 -0
  626. package/utils/validators/cidr.js +4 -0
  627. package/utils/validators/formRules/__tests__/index.test.ts +26 -6
  628. package/utils/validators/formRules/index.ts +14 -0
  629. package/config/product/harvester-manager.js +0 -162
  630. package/creators/pkg/nuxt.config.js +0 -6
  631. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  632. package/list/harvesterhci.io.management.cluster.vue +0 -241
  633. package/machine-config/harvester.vue +0 -693
  634. package/models/harvesterhci.io.management.cluster.js +0 -228
  635. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
@@ -10,8 +10,8 @@ export default {
10
10
  data() {
11
11
  return {
12
12
  isMac,
13
- value: '',
14
- groups: null,
13
+ value: '',
14
+ groups: null,
15
15
  };
16
16
  },
17
17
 
@@ -91,7 +91,7 @@ export default {
91
91
  </template>
92
92
 
93
93
  <style lang="scss" scoped>
94
- .search, .search:hover, search:focus {
94
+ .search, .search:hover, .search:focus {
95
95
  position: relative;
96
96
  background-color: var(--dropdown-bg);
97
97
  border-radius: 0;
@@ -19,16 +19,17 @@ import { KEY } from '@shell/utils/platform';
19
19
  export default {
20
20
  data() {
21
21
  return {
22
- isOpen: false,
23
- filter: '',
24
- hidden: 0,
25
- total: 0,
26
- activeElement: null,
22
+ isOpen: false,
23
+ filter: '',
24
+ hidden: 0,
25
+ total: 0,
26
+ activeElement: null,
27
+ cachedFiltered: [],
27
28
  };
28
29
  },
29
30
 
30
31
  computed: {
31
- ...mapGetters(['currentProduct']),
32
+ ...mapGetters(['currentProduct', 'namespaceFilterMode']),
32
33
 
33
34
  hasFilter() {
34
35
  return this.filter.length > 0;
@@ -37,11 +38,26 @@ export default {
37
38
  filtered() {
38
39
  let out = this.options;
39
40
 
40
- // Filter by the current filter
41
- if (this.hasFilter) {
42
- out = out.filter((item) => {
41
+ out = out.filter((item) => {
42
+ // Filter out anything not applicable to singleton selection
43
+ if (this.namespaceFilterMode) {
44
+ // We always show dividers, projects and namespaces
45
+ if (!['divider', 'project', this.namespaceFilterMode].includes(item.kind)) {
46
+ // Hide any invalid option that's not selected
47
+ return this.value.findIndex(v => v.id === item.id) >= 0;
48
+ }
49
+ }
50
+
51
+ // Filter by the current filter
52
+ if (this.hasFilter) {
43
53
  return item.kind !== SPECIAL && item.label.toLowerCase().includes(this.filter.toLowerCase());
44
- });
54
+ }
55
+
56
+ return true;
57
+ });
58
+
59
+ if (out?.[0]?.kind === 'divider') {
60
+ out.splice(0, 1);
45
61
  }
46
62
 
47
63
  const mapped = this.value.reduce((m, v) => {
@@ -54,6 +70,8 @@ export default {
54
70
  out.forEach((i) => {
55
71
  i.selected = !!mapped[i.id] || (i.id === ALL && this.value && this.value.length === 0);
56
72
  i.elementId = (i.id || '').replace('://', '_');
73
+ // Are we in singleton resource type mode, if so is this an allowed type?
74
+ i.enabled = !this.namespaceFilterMode || i.kind === this.namespaceFilterMode;
57
75
  });
58
76
 
59
77
  return out;
@@ -87,7 +105,8 @@ export default {
87
105
  const t = this.$store.getters['i18n/t'];
88
106
  let out = [];
89
107
 
90
- if (this.currentProduct.customNamespaceFilter) {
108
+ // TODO: Add return info
109
+ if (this.currentProduct?.customNamespaceFilter && this.currentProduct?.inStore) {
91
110
  // Sometimes the component can show before the 'currentProduct' has caught up, so access the product via the getter rather
92
111
  // than caching it in the `fetch`
93
112
  return this.$store.getters[`${ this.currentProduct.inStore }/namespaceFilterOptions`]({
@@ -96,6 +115,7 @@ export default {
96
115
  });
97
116
  }
98
117
 
118
+ // TODO: Add return info
99
119
  if (!this.currentProduct?.hideSystemResources) {
100
120
  out = [
101
121
  {
@@ -129,6 +149,11 @@ export default {
129
149
  }
130
150
 
131
151
  const inStore = this.$store.getters['currentStore'](NAMESPACE);
152
+
153
+ if (!inStore) {
154
+ return out;
155
+ }
156
+
132
157
  let namespaces = sortBy(
133
158
  this.$store.getters[`${ inStore }/all`](NAMESPACE),
134
159
  ['nameDisplay']
@@ -249,19 +274,21 @@ export default {
249
274
 
250
275
  value: {
251
276
  get() {
277
+ // Use last picked filter from user preferences
252
278
  const prefs = this.$store.getters['prefs/get'](NAMESPACE_FILTERS);
253
- const prefDefault = this.currentProduct.customNamespaceFilter ? [] : [ALL_USER];
254
- const values = prefs[this.key] || prefDefault;
279
+
280
+ const prefDefault = this.currentProduct?.customNamespaceFilter ? [] : [ALL_USER];
281
+ const values = prefs && prefs[this.key] ? prefs[this.key] : prefDefault;
255
282
  const options = this.options;
256
283
 
257
284
  // Remove values that are not valid options
258
- const out = values
285
+ const filters = values
259
286
  .map((value) => {
260
287
  return findBy(options, 'id', value);
261
288
  })
262
289
  .filter(x => !!x);
263
290
 
264
- return out;
291
+ return filters;
265
292
  },
266
293
 
267
294
  set(neu) {
@@ -291,7 +318,7 @@ export default {
291
318
  // If there was something selected and you remove it, go back to user by default
292
319
  // Unless it was user or all
293
320
  if (neu.length === 0 && !hadUser && !hadAll) {
294
- ids = this.currentProduct.customNamespaceFilter ? [] : [ALL_USER];
321
+ ids = this.currentProduct?.customNamespaceFilter ? [] : [ALL_USER];
295
322
  } else {
296
323
  ids = neu.map(x => x.id);
297
324
  }
@@ -317,6 +344,21 @@ export default {
317
344
  watch: {
318
345
  value(neu) {
319
346
  this.layout();
347
+ },
348
+
349
+ /**
350
+ * When there are thousands of entries certain actions (drop down opened, selection changed, etc) take a long time to complete (upwards
351
+ * of 5 seconds)
352
+ *
353
+ * This is caused by churn of the filtered and options computed properties causing multiple renders for each action.
354
+ *
355
+ * To break this multiple-render per cycle behaviour detatch `filtered` from the value used in `v-for`.
356
+ *
357
+ */
358
+ filtered(neu) {
359
+ if (!!neu) {
360
+ this.cachedFiltered = neu;
361
+ }
320
362
  }
321
363
  },
322
364
 
@@ -418,7 +460,10 @@ export default {
418
460
  e.preventDefault();
419
461
  e.stopPropagation();
420
462
  this.up();
421
- } else if (e.keyCode === KEY.SPACE) {
463
+ } else if (e.keyCode === KEY.SPACE || e.keyCode === KEY.CR) {
464
+ if (this.namespaceFilterMode && !opt.enabled) {
465
+ return;
466
+ }
422
467
  e.preventDefault();
423
468
  e.stopPropagation();
424
469
  this.selectOption(opt);
@@ -426,14 +471,23 @@ export default {
426
471
  }
427
472
  },
428
473
  inputKeyHandler(e) {
429
- if (e.keyCode === KEY.DOWN ) {
474
+ switch (e.keyCode) {
475
+ case KEY.DOWN:
430
476
  e.preventDefault();
431
477
  e.stopPropagation();
432
478
  this.down(true);
433
- } else if (e.keyCode === KEY.TAB) {
479
+ break;
480
+ case KEY.TAB:
434
481
  // Tab out of the input box
435
482
  this.close();
436
483
  e.target.blur();
484
+ break;
485
+ case KEY.CR:
486
+ if (this.filtered.length === 1) {
487
+ this.selectOption(this.filtered[0]);
488
+ this.filter = '';
489
+ }
490
+ break;
437
491
  }
438
492
  },
439
493
  mouseOver(event) {
@@ -527,9 +581,22 @@ export default {
527
581
 
528
582
  const current = this.value;
529
583
  const exists = current.findIndex(v => v.id === option.id);
584
+ const optionIsSelected = exists !== -1;
585
+
586
+ // Any type of mode means only a single resource can be selected. So clear out any stale
587
+ // values (multiple selected in another context OR a single one selected in this context)
588
+ if (this.namespaceFilterMode) {
589
+ if (current.length === 1 && optionIsSelected) {
590
+ // Don't deselect the only selected option
591
+ return;
592
+ }
593
+ current.length = 0;
594
+ }
595
+
596
+ const remove = !this.namespaceFilterMode && optionIsSelected;
530
597
 
531
- // Remove if it exists, add if it does not
532
- if (exists !== -1) {
598
+ // Remove if it exists (or always add if in singleton mode - we've reset the list above)
599
+ if (remove) {
533
600
  current.splice(exists, 1);
534
601
  } else {
535
602
  current.push(option);
@@ -541,6 +608,14 @@ export default {
541
608
  document.activeElement.blur();
542
609
  }
543
610
  },
611
+ handleValueMouseDown(ns, event) {
612
+ this.removeOption(ns, event);
613
+
614
+ if (this.value.length === 0) {
615
+ this.open();
616
+ }
617
+ },
618
+
544
619
  removeOption(ns, event) {
545
620
  this.selectOption(ns);
546
621
  event.preventDefault();
@@ -553,6 +628,7 @@ export default {
553
628
  <template>
554
629
  <div
555
630
  class="ns-filter"
631
+ data-testid="namespaces-filter"
556
632
  tabindex="0"
557
633
  @focus="open()"
558
634
  >
@@ -561,53 +637,70 @@ export default {
561
637
  class="ns-glass"
562
638
  @click="close()"
563
639
  />
564
- <!-- Dropdown control -->
640
+
641
+ <!-- Select Dropdown control -->
565
642
  <div
566
643
  ref="dropdown"
567
644
  class="ns-dropdown"
645
+ data-testid="namespaces-dropdown"
568
646
  :class="{ 'ns-open': isOpen }"
569
647
  @click="toggle()"
570
648
  >
649
+ <!-- No filters found or available -->
571
650
  <div
572
651
  v-if="value.length === 0"
573
652
  ref="values"
653
+ data-testid="namespaces-values-none"
574
654
  class="ns-values"
575
655
  >
576
656
  {{ t('nav.ns.all') }}
577
657
  </div>
658
+
659
+ <!-- Filtered by set with custom label E.g. "All namespaces" -->
578
660
  <div
579
661
  v-else-if="isSingleSpecial"
580
662
  ref="values"
663
+ data-testid="namespaces-values-label"
581
664
  class="ns-values"
582
665
  >
583
666
  {{ value[0].label }}
584
667
  </div>
668
+
669
+ <!-- All the selected namespaces -->
585
670
  <div
586
671
  v-else
587
672
  ref="values"
588
673
  v-tooltip="tooltip"
674
+ data-testid="namespaces-values"
589
675
  class="ns-values"
590
676
  >
591
677
  <div
592
678
  v-if="total"
593
679
  ref="total"
680
+ data-testid="namespaces-values-total"
594
681
  class="ns-value ns-abs"
595
682
  >
596
683
  {{ t('namespaceFilter.selected.label', { total }) }}
597
684
  </div>
598
685
  <div
599
- v-for="ns in value"
686
+ v-for="(ns, j) in value"
600
687
  ref="value"
601
688
  :key="ns.id"
689
+ :data-testid="`namespaces-value-${j}`"
602
690
  class="ns-value"
603
691
  >
604
692
  <div>{{ ns.label }}</div>
605
693
  <i
694
+ v-if="!namespaceFilterMode"
606
695
  class="icon icon-close"
696
+ :data-testid="`namespaces-values-close-${j}`"
607
697
  @click="removeOption(ns, $event)"
698
+ @mousedown="handleValueMouseDown(ns, $event)"
608
699
  />
609
700
  </div>
610
701
  </div>
702
+
703
+ <!-- Inform user if more namespaces are selected -->
611
704
  <div
612
705
  v-if="hidden > 0"
613
706
  ref="more"
@@ -630,9 +723,12 @@ export default {
630
723
  class="hide"
631
724
  @shortkey="open()"
632
725
  />
726
+
727
+ <!-- Dropdown menu -->
633
728
  <div
634
729
  v-if="isOpen"
635
730
  class="ns-dropdown-menu"
731
+ data-testid="namespaces-menu"
636
732
  >
637
733
  <div class="ns-controls">
638
734
  <div class="ns-input">
@@ -649,7 +745,19 @@ export default {
649
745
  @click="filter = ''"
650
746
  />
651
747
  </div>
652
- <div class="ns-clear">
748
+ <div
749
+ v-if="namespaceFilterMode"
750
+ class="ns-singleton-info"
751
+ >
752
+ <i
753
+ v-tooltip="t('resourceList.nsFilterToolTip', { mode: namespaceFilterMode})"
754
+ class="icon icon-info"
755
+ />
756
+ </div>
757
+ <div
758
+ v-else
759
+ class="ns-clear"
760
+ >
653
761
  <i
654
762
  class="icon icon-close"
655
763
  @click="clear()"
@@ -663,14 +771,19 @@ export default {
663
771
  role="list"
664
772
  >
665
773
  <div
666
- v-for="opt in filtered"
774
+ v-for="(opt, i) in cachedFiltered"
667
775
  :id="opt.elementId"
668
776
  :key="opt.id"
669
777
  tabindex="0"
670
778
  class="ns-option"
671
- :class="{'ns-selected': opt.selected}"
672
- @click="selectOption(opt)"
673
- @mouseover="mouseOver($event)"
779
+ :disabled="!opt.enabled"
780
+ :class="{
781
+ 'ns-selected': opt.selected,
782
+ 'ns-single-match': cachedFiltered.length === 1 && !opt.selected,
783
+ }"
784
+ :data-testid="`namespaces-option-${i}`"
785
+ @click="opt.enabled && selectOption(opt)"
786
+ @mouseover="opt.enabled && mouseOver($event)"
674
787
  @keydown="itemKeyHandler($event, opt)"
675
788
  >
676
789
  <div
@@ -693,8 +806,9 @@ export default {
693
806
  </div>
694
807
  </div>
695
808
  <div
696
- v-if="filtered.length === 0"
809
+ v-if="cachedFiltered.length === 0"
697
810
  class="ns-none"
811
+ data-testid="namespaces-option-none"
698
812
  >
699
813
  {{ t('namespaceFilter.noMatchingOptions') }}
700
814
  </div>
@@ -733,16 +847,17 @@ export default {
733
847
  }
734
848
 
735
849
  .ns-clear {
850
+ &:hover {
851
+ color: var(--primary);
852
+ cursor: pointer;
853
+ }
854
+ }
855
+
856
+ .ns-singleton-info, .ns-clear {
736
857
  align-items: center;
737
858
  display: flex;
738
859
  > i {
739
- font-size: 24px;
740
- padding: 0 5px;
741
- }
742
-
743
- &:hover {
744
- color: var(--link);
745
- cursor: pointer;
860
+ padding-right: 5px;
746
861
  }
747
862
  }
748
863
 
@@ -761,7 +876,6 @@ export default {
761
876
  position: absolute;
762
877
  right: 10px;
763
878
  top: 5px;
764
- font-size: 16px;
765
879
  line-height: 24px;
766
880
  text-align: center;
767
881
  width: 24px;
@@ -769,7 +883,7 @@ export default {
769
883
 
770
884
  .ns-dropdown-menu {
771
885
  background-color: var(--header-bg);
772
- border: 1px solid var(--link-border);
886
+ border: 1px solid var(--primary-border);
773
887
  border-bottom-left-radius: var(--border-radius);
774
888
  border-bottom-right-radius: var(--border-radius);
775
889
  color: var(--header-btn-text);
@@ -795,12 +909,49 @@ export default {
795
909
  padding-bottom: 10px;
796
910
  }
797
911
 
798
- .ns-option:focus {
799
- background-color: var(--dropdown-hover-bg);
800
- color: var(--dropdown-hover-text);
801
- }
802
-
803
912
  .ns-option {
913
+
914
+ &[disabled] {
915
+ cursor: default;
916
+ }
917
+
918
+ &:not([disabled]) {
919
+ &:focus {
920
+ background-color: var(--dropdown-hover-bg);
921
+ color: var(--dropdown-hover-text);
922
+ }
923
+ .ns-item {
924
+ &:hover, &:focus {
925
+ background-color: var(--dropdown-hover-bg);
926
+ color: var(--dropdown-hover-text);
927
+ cursor: pointer;
928
+
929
+ > i {
930
+ color: var(--dropdown-hover-text);
931
+ }
932
+ }
933
+ }
934
+
935
+ &.ns-selected {
936
+ &:hover,&:focus {
937
+ .ns-item {
938
+ > * {
939
+ background-color: var(--dropdown-hover-bg);
940
+ color: var(--dropdown-hover-text);
941
+ }
942
+ }
943
+ }
944
+ }
945
+
946
+ &.ns-selected:not(:hover) {
947
+ .ns-item {
948
+ > * {
949
+ color: var(--dropdown-hover-bg);
950
+ }
951
+ }
952
+ }
953
+ }
954
+
804
955
  .ns-item {
805
956
  align-items: center;
806
957
  display: flex;
@@ -820,35 +971,17 @@ export default {
820
971
  white-space: nowrap;
821
972
  }
822
973
 
823
- &:hover, &:focus {
824
- background-color: var(--dropdown-hover-bg);
825
- color: var(--dropdown-hover-text);
826
- cursor: pointer;
827
-
828
- > i {
829
- color: var(--dropdown-hover-text);
830
- }
831
- }
832
- }
833
- &.ns-selected:not(:hover) {
834
- .ns-item {
835
- > * {
836
- color: var(--dropdown-hover-bg);
837
- }
838
974
  }
839
- }
840
- &.ns-selected {
841
- &:hover,&:focus {
975
+
976
+ &.ns-single-match {
842
977
  .ns-item {
978
+ background-color: var(--dropdown-hover-bg);
843
979
  > * {
844
- background-color: var(--dropdown-hover-bg);
845
980
  color: var(--dropdown-hover-text);
846
981
  }
847
982
  }
848
983
  }
849
984
  }
850
-
851
- }
852
985
  }
853
986
 
854
987
  .ns-dropdown {
@@ -866,7 +999,7 @@ export default {
866
999
  &.ns-open {
867
1000
  border-bottom-left-radius: 0;
868
1001
  border-bottom-right-radius: 0;
869
- border-color: var(--link-border);
1002
+ border-color: var(--primary-border);
870
1003
  }
871
1004
 
872
1005
  > .ns-values {
@@ -875,14 +1008,13 @@ export default {
875
1008
 
876
1009
  &:hover {
877
1010
  > i {
878
- color: var(--link);
1011
+ color: var(--primary);
879
1012
  }
880
1013
  }
881
1014
 
882
1015
  > i {
883
1016
  height: $ns_dropdown_size;
884
1017
  width: $ns_dropdown_size;
885
- font-size: 20px;
886
1018
  cursor: pointer;
887
1019
  text-align: center;
888
1020
  line-height: $ns_dropdown_size;
@@ -914,7 +1046,7 @@ export default {
914
1046
  margin-left: 5px;
915
1047
 
916
1048
  &:hover {
917
- color: var(--link);
1049
+ color: var(--primary);
918
1050
  };
919
1051
  }
920
1052
 
@@ -1,6 +1,7 @@
1
1
  <script>
2
2
  import BrandImage from '@shell/components/BrandImage';
3
3
  import ClusterProviderIcon from '@shell/components/ClusterProviderIcon';
4
+ import IconOrSvg from '../IconOrSvg';
4
5
  import { mapGetters } from 'vuex';
5
6
  import $ from 'jquery';
6
7
  import { CAPI, MANAGEMENT } from '@shell/config/types';
@@ -14,25 +15,23 @@ import { SETTING } from '@shell/config/settings';
14
15
  import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
15
16
  import { isRancherPrime } from '@shell/config/version';
16
17
 
17
- const UNKNOWN = 'unknown';
18
- const UI_VERSION = process.env.VERSION || UNKNOWN;
19
- const UI_COMMIT = process.env.COMMIT || UNKNOWN;
20
-
21
18
  export default {
22
19
 
23
- components: { BrandImage, ClusterProviderIcon },
20
+ components: {
21
+ BrandImage,
22
+ ClusterProviderIcon,
23
+ IconOrSvg
24
+ },
24
25
 
25
26
  data() {
26
27
  const { displayVersion, fullVersion } = getVersionInfo(this.$store);
27
28
  const hasProvCluster = this.$store.getters[`management/schemaFor`](CAPI.RANCHER_CLUSTER);
28
29
 
29
30
  return {
30
- shown: false,
31
+ shown: false,
31
32
  displayVersion,
32
33
  fullVersion,
33
- uiCommit: UI_COMMIT,
34
- uiVersion: UI_VERSION,
35
- clusterFilter: '',
34
+ clusterFilter: '',
36
35
  hasProvCluster,
37
36
  };
38
37
  },
@@ -145,6 +144,7 @@ export default {
145
144
  return {
146
145
  label: this.$store.getters['i18n/withFallback'](`product."${ p.name }"`, null, ucFirst(p.name)),
147
146
  icon: `icon-${ p.icon || 'copy' }`,
147
+ svg: p.svg,
148
148
  value: p.name,
149
149
  removable: p.removable !== false,
150
150
  inStore: p.inStore || 'cluster',
@@ -347,9 +347,9 @@ export default {
347
347
  class="option"
348
348
  :to="a.to"
349
349
  >
350
- <i
351
- class="icon group-icon"
352
- :class="a.icon"
350
+ <IconOrSvg
351
+ :icon="a.icon"
352
+ :src="a.svg"
353
353
  />
354
354
  <div>{{ a.label }}</div>
355
355
  </nuxt-link>
@@ -368,9 +368,9 @@ export default {
368
368
  class="option"
369
369
  :to="a.to"
370
370
  >
371
- <i
372
- class="icon group-icon"
373
- :class="a.icon"
371
+ <IconOrSvg
372
+ :icon="a.icon"
373
+ :src="a.svg"
374
374
  />
375
375
  <div>{{ a.label }}</div>
376
376
  </nuxt-link>
@@ -389,9 +389,9 @@ export default {
389
389
  class="option"
390
390
  :to="a.to"
391
391
  >
392
- <i
393
- class="icon group-icon"
394
- :class="a.icon"
392
+ <IconOrSvg
393
+ :icon="a.icon"
394
+ :src="a.svg"
395
395
  />
396
396
  <div>{{ a.label }}</div>
397
397
  </nuxt-link>
@@ -410,11 +410,11 @@ export default {
410
410
  </div>
411
411
  <div @click="hide()">
412
412
  <nuxt-link
413
- v-tooltip="{ content: fullVersion, classes: 'footer-tooltip' }"
414
413
  :to="{ name: 'about' }"
415
414
  class="version"
416
- v-html="displayVersion"
417
- />
415
+ >
416
+ {{ t('about.title') }}
417
+ </nuxt-link>
418
418
  </div>
419
419
  </div>
420
420
  </div>
@@ -505,6 +505,9 @@ export default {
505
505
  margin-right: 8px;
506
506
  fill: var(--link);
507
507
  }
508
+ img {
509
+ margin-right: 8px;
510
+ }
508
511
 
509
512
  > div {
510
513
  color: var(--link);
@@ -8,7 +8,7 @@ export default {
8
8
 
9
9
  components: { Favorite },
10
10
 
11
- props: {
11
+ props: {
12
12
  type: {
13
13
  type: Object,
14
14
  required: true
@@ -5,7 +5,7 @@ import Window from './Window';
5
5
  export default {
6
6
  components: { Window, ChartReadme },
7
7
 
8
- props: {
8
+ props: {
9
9
  // The definition of the tab itself
10
10
  tab: {
11
11
  type: Object,