@rancher/shell 1.2.0 → 2.0.0

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 (689) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +299 -63
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AppModal.vue +167 -0
  31. package/components/AssignTo.vue +7 -4
  32. package/components/AsyncButton.vue +27 -5
  33. package/components/BackLink.vue +4 -4
  34. package/components/BannerGraphic.vue +1 -0
  35. package/components/BrandImage.vue +47 -1
  36. package/components/Carousel.vue +15 -8
  37. package/components/Certificates.vue +161 -0
  38. package/components/ClusterBadge.vue +12 -3
  39. package/components/ClusterIconMenu.vue +55 -12
  40. package/components/ClusterProviderIcon.vue +14 -3
  41. package/components/CodeMirror.vue +111 -17
  42. package/components/CommunityLinks.vue +12 -8
  43. package/components/CopyCode.vue +6 -2
  44. package/components/CopyToClipboard.vue +2 -1
  45. package/components/CopyToClipboardText.vue +14 -9
  46. package/components/CreateDriver.vue +81 -0
  47. package/components/CruResource.vue +52 -27
  48. package/components/DetailTop.vue +2 -2
  49. package/components/Dialog.vue +6 -5
  50. package/components/DisableAuthProviderModal.vue +14 -8
  51. package/components/DraggableZone.vue +2 -2
  52. package/components/EtcdInfoBanner.vue +5 -5
  53. package/components/ExplorerMembers.vue +3 -3
  54. package/components/ExplorerProjectsNamespaces.vue +31 -7
  55. package/components/FixedBanner.vue +48 -36
  56. package/components/GlobalRoleBindings.vue +26 -0
  57. package/components/IconOrSvg.vue +1 -1
  58. package/components/Import.vue +10 -6
  59. package/components/Inactivity.vue +1 -5
  60. package/components/KeyValueView.vue +14 -10
  61. package/components/Markdown.vue +16 -12
  62. package/components/MessageLink.vue +2 -2
  63. package/components/ModalWithCard.vue +5 -8
  64. package/components/MoveModal.vue +35 -33
  65. package/components/PodSecurityAdmission.vue +3 -3
  66. package/components/PromptChangePassword.vue +33 -33
  67. package/components/PromptModal.vue +11 -21
  68. package/components/PromptRemove.vue +11 -17
  69. package/components/PromptRestore.vue +18 -16
  70. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  71. package/components/Questions/__tests__/Float.test.ts +9 -19
  72. package/components/Questions/__tests__/Int.test.ts +9 -19
  73. package/components/Questions/__tests__/String.test.ts +9 -19
  74. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  75. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  76. package/components/Questions/index.vue +19 -3
  77. package/components/ResourceCancelModal.vue +34 -29
  78. package/components/ResourceDetail/Masthead.vue +48 -16
  79. package/components/ResourceDetail/index.vue +6 -4
  80. package/components/ResourceList/Masthead.vue +10 -9
  81. package/components/ResourceList/index.vue +65 -14
  82. package/components/ResourceTable.vue +87 -21
  83. package/components/ResourceYaml.vue +35 -5
  84. package/components/SelectIconGrid.vue +3 -3
  85. package/components/SideNav.vue +50 -94
  86. package/components/SingleClusterInfo.vue +4 -4
  87. package/components/SortableTable/THead.vue +33 -21
  88. package/components/SortableTable/filtering.js +9 -1
  89. package/components/SortableTable/grouping.js +8 -1
  90. package/components/SortableTable/index.vue +143 -44
  91. package/components/SortableTable/paging.js +36 -7
  92. package/components/SortableTable/selection.js +2 -1
  93. package/components/SortableTable/sorting.js +24 -7
  94. package/components/StatusTable.vue +5 -1
  95. package/components/Tabbed/index.vue +18 -1
  96. package/components/TableDataUserIcon.vue +47 -0
  97. package/components/TypeDescription.vue +1 -0
  98. package/components/Wizard.vue +1 -0
  99. package/components/YamlEditor.vue +1 -0
  100. package/components/__tests__/AppModal.test.ts +98 -0
  101. package/components/__tests__/AsyncButton.test.ts +1 -3
  102. package/components/__tests__/BackLink.test.ts +1 -1
  103. package/components/__tests__/ButtonGroup.test.ts +3 -6
  104. package/components/__tests__/Carousel.test.ts +43 -0
  105. package/components/__tests__/Certificates.test.ts +29 -0
  106. package/components/__tests__/CodeMirror.test.ts +87 -0
  107. package/components/__tests__/CopyCode.test.ts +5 -4
  108. package/components/__tests__/CruResource.test.ts +10 -9
  109. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  110. package/components/__tests__/FixedBanner.test.ts +5 -20
  111. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  112. package/components/__tests__/TabTitle.test.ts +129 -0
  113. package/components/auth/AzureWarning.vue +2 -2
  114. package/components/auth/RoleDetailEdit.vue +10 -0
  115. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  116. package/components/auth/login/oidc.vue +7 -1
  117. package/components/fleet/FleetBundles.vue +5 -11
  118. package/components/fleet/FleetClusters.vue +9 -9
  119. package/components/fleet/FleetIntro.vue +11 -17
  120. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  121. package/components/fleet/FleetRepos.vue +63 -27
  122. package/components/fleet/FleetResources.vue +6 -1
  123. package/components/fleet/FleetStatus.vue +3 -3
  124. package/components/fleet/FleetSummary.vue +35 -30
  125. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  126. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  127. package/components/form/ArrayList.vue +22 -18
  128. package/components/form/ArrayListSelect.vue +5 -0
  129. package/components/form/BannerSettings.vue +3 -0
  130. package/components/form/ClusterAppearance.vue +132 -0
  131. package/components/form/ColorInput.vue +1 -0
  132. package/components/form/Error.vue +3 -3
  133. package/components/form/FileSelector.vue +1 -0
  134. package/components/form/Footer.vue +2 -2
  135. package/components/form/GitPicker.vue +83 -38
  136. package/components/form/KeyValue.vue +69 -48
  137. package/components/form/LabeledSelect.vue +145 -41
  138. package/components/form/Labels.vue +3 -1
  139. package/components/form/NameNsDescription.vue +26 -9
  140. package/components/form/Password.vue +3 -1
  141. package/components/form/ResourceLabeledSelect.vue +187 -0
  142. package/components/form/ResourceTabs/index.vue +31 -15
  143. package/components/form/SecretSelector.vue +93 -18
  144. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  145. package/components/form/SimpleSecretSelector.vue +88 -28
  146. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  147. package/components/form/__tests__/KeyValue.test.ts +120 -11
  148. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  149. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  150. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  151. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  152. package/components/formatter/AppSummaryGraph.vue +2 -2
  153. package/components/formatter/Checked.vue +11 -3
  154. package/components/formatter/CloudCredPublicData.vue +30 -0
  155. package/components/formatter/ClusterLink.vue +2 -2
  156. package/components/formatter/ClusterProvider.vue +1 -18
  157. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  158. package/components/formatter/FleetSummaryGraph.vue +25 -12
  159. package/components/formatter/ImagePercentageBar.vue +0 -4
  160. package/components/formatter/IngressTarget.vue +18 -7
  161. package/components/formatter/Link.vue +2 -2
  162. package/components/formatter/LinkDetail.vue +2 -2
  163. package/components/formatter/LinkDetailImage.vue +2 -2
  164. package/components/formatter/LinkName.vue +2 -2
  165. package/components/formatter/LiveDuration.vue +1 -1
  166. package/components/formatter/PercentageBar.vue +1 -1
  167. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  168. package/components/formatter/SecretType.vue +2 -2
  169. package/components/formatter/VirtualServiceGateways.vue +2 -2
  170. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  171. package/components/formatter/__tests__/Checked.test.ts +19 -0
  172. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  173. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  174. package/components/nav/Group.vue +9 -7
  175. package/components/nav/Header.vue +84 -45
  176. package/components/nav/Jump.vue +19 -9
  177. package/components/nav/NamespaceFilter.vue +8 -1
  178. package/components/nav/TopLevelMenu.vue +391 -132
  179. package/components/nav/Type.vue +71 -106
  180. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  181. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  182. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  183. package/components/nav/WindowManager/index.vue +11 -10
  184. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  185. package/components/nav/__tests__/Type.test.ts +322 -97
  186. package/components/nuxt/nuxt-child.js +9 -78
  187. package/components/nuxt/nuxt-error.vue +1 -1
  188. package/components/nuxt/nuxt-link.client.js +13 -95
  189. package/{layouts → components/templates}/blank.vue +1 -1
  190. package/{layouts → components/templates}/default.vue +11 -101
  191. package/{layouts → components/templates}/error.vue +13 -26
  192. package/{layouts → components/templates}/home.vue +4 -1
  193. package/{layouts → components/templates}/plain.vue +4 -1
  194. package/{layouts → components/templates}/standalone.vue +1 -5
  195. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  196. package/composables/useCompactInput.test.ts +36 -0
  197. package/composables/useCompactInput.ts +20 -0
  198. package/composables/useLabeledFormElement.test.ts +135 -0
  199. package/composables/useLabeledFormElement.ts +138 -0
  200. package/config/harvester-manager-types.js +2 -0
  201. package/config/home-links.js +2 -1
  202. package/config/labels-annotations.js +2 -1
  203. package/config/middleware.js +0 -6
  204. package/config/pagination-table-headers.js +57 -0
  205. package/config/pod-security-admission.ts +1 -1
  206. package/config/private-label.js +21 -1
  207. package/config/product/auth.js +1 -0
  208. package/config/product/explorer.js +166 -45
  209. package/config/product/fleet.js +6 -1
  210. package/config/product/legacy.js +2 -11
  211. package/config/product/manager.js +51 -25
  212. package/config/query-params.js +2 -0
  213. package/config/roles.ts +23 -0
  214. package/config/router/index.js +23 -0
  215. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  216. package/config/router/navigation-guards/authentication.js +63 -0
  217. package/config/router/navigation-guards/index.js +15 -0
  218. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  219. package/config/router/routes.js +487 -0
  220. package/config/settings.ts +31 -2
  221. package/config/store.js +8 -4
  222. package/config/system-namespaces.js +3 -0
  223. package/config/table-headers.js +66 -1
  224. package/config/types.js +35 -20
  225. package/config/uiplugins.js +10 -5
  226. package/core/plugin-helpers.js +4 -6
  227. package/core/plugin-routes.ts +56 -114
  228. package/core/plugin.ts +18 -11
  229. package/core/plugins-loader.js +7 -9
  230. package/core/plugins.js +289 -285
  231. package/core/types-provisioning.ts +7 -0
  232. package/creators/app/files/.eslintignore +0 -2
  233. package/creators/app/files/.gitlab-ci.yml +14 -0
  234. package/creators/app/files/.vscode/settings.json +0 -1
  235. package/creators/app/init +19 -0
  236. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  237. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  238. package/creators/pkg/init +32 -0
  239. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
  240. package/detail/__tests__/service.test.ts +62 -0
  241. package/detail/catalog.cattle.io.app.vue +1 -1
  242. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  243. package/detail/fleet.cattle.io.bundle.vue +1 -1
  244. package/detail/fleet.cattle.io.cluster.vue +11 -1
  245. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  246. package/detail/namespace.vue +2 -2
  247. package/detail/networking.k8s.io.ingress.vue +52 -19
  248. package/detail/node.vue +22 -3
  249. package/detail/provisioning.cattle.io.cluster.vue +27 -9
  250. package/detail/service.vue +1 -1
  251. package/detail/workload/index.vue +1 -0
  252. package/dialog/AddCustomBadgeDialog.vue +318 -161
  253. package/dialog/DeactivateDriverDialog.vue +118 -0
  254. package/dialog/RollbackWorkloadDialog.vue +2 -2
  255. package/dialog/RotateCertificatesDialog.vue +0 -21
  256. package/dialog/ScaleMachineDownDialog.vue +34 -17
  257. package/directives/clean-html.js +15 -0
  258. package/directives/clean-tooltip.js +32 -0
  259. package/directives/focus.js +41 -0
  260. package/directives/int-number.js +21 -0
  261. package/directives/positive-int-number.js +19 -0
  262. package/directives/trim-whitespace.js +19 -0
  263. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  264. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  265. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  266. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  267. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  268. package/edit/__tests__/nodeDriver.test.ts +107 -0
  269. package/edit/__tests__/service.test.ts +85 -0
  270. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  271. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  272. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  273. package/edit/auth/__tests__/azuread.test.ts +241 -0
  274. package/edit/auth/__tests__/oidc.test.ts +137 -0
  275. package/edit/auth/azuread.vue +133 -31
  276. package/edit/auth/github.vue +5 -17
  277. package/edit/auth/googleoauth.vue +6 -23
  278. package/edit/auth/ldap/index.vue +5 -17
  279. package/edit/auth/oidc.vue +143 -42
  280. package/edit/auth/saml.vue +5 -14
  281. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  282. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  283. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  284. package/edit/cloudcredential.vue +28 -4
  285. package/edit/configmap.vue +10 -4
  286. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  287. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  288. package/edit/kontainerDriver.vue +65 -0
  289. package/edit/logging-flow/Match.vue +10 -9
  290. package/edit/logging-flow/index.vue +4 -19
  291. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  292. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  293. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  294. package/edit/management.cattle.io.project.vue +3 -53
  295. package/edit/management.cattle.io.setting.vue +52 -2
  296. package/edit/management.cattle.io.user.vue +2 -1
  297. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  298. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  299. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  300. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  302. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  303. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  304. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  305. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  306. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  307. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  308. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  309. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  310. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  311. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  312. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  313. package/edit/nodeDriver.vue +65 -0
  314. package/edit/persistentvolume/index.vue +2 -2
  315. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  316. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  317. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  318. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  319. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  320. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  321. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  322. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  323. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  324. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  325. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  326. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  327. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  328. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  329. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  330. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  331. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  332. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  333. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  335. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  336. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  337. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  338. package/edit/resources.cattle.io.backup.vue +139 -124
  339. package/edit/resources.cattle.io.restore.vue +146 -126
  340. package/edit/service.vue +13 -0
  341. package/edit/serviceaccount.vue +46 -4
  342. package/edit/token.vue +1 -0
  343. package/edit/workload/Upgrading.vue +3 -2
  344. package/edit/workload/__tests__/Job.test.ts +1 -3
  345. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  346. package/edit/workload/index.vue +2 -1
  347. package/edit/workload/mixins/workload.js +35 -2
  348. package/edit/workload/storage/emptyDir.vue +2 -2
  349. package/initialize/App.vue +75 -0
  350. package/initialize/app-extended.js +128 -0
  351. package/initialize/entry-helpers.js +549 -0
  352. package/initialize/entry.js +32 -0
  353. package/initialize/install-components.js +23 -0
  354. package/initialize/install-directives.js +59 -0
  355. package/initialize/install-plugins.js +123 -0
  356. package/list/__tests__/workload.test.ts +1 -1
  357. package/list/catalog.cattle.io.app.vue +1 -0
  358. package/list/cis.cattle.io.clusterscan.vue +16 -10
  359. package/list/group.principal.vue +2 -2
  360. package/list/management.cattle.io.feature.vue +12 -14
  361. package/list/management.cattle.io.setting.vue +1 -0
  362. package/list/management.cattle.io.user.vue +13 -4
  363. package/list/networking.k8s.io.ingress.vue +36 -0
  364. package/list/node.vue +212 -73
  365. package/list/provisioning.cattle.io.cluster.vue +17 -4
  366. package/list/ui.cattle.io.navlink.vue +2 -2
  367. package/list/workload.vue +22 -0
  368. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  369. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  370. package/machine-config/amazonec2.vue +1 -1
  371. package/machine-config/azure.vue +2 -1
  372. package/machine-config/generic.vue +11 -15
  373. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  374. package/machine-config/vmwarevsphere.vue +31 -27
  375. package/middleware/authenticated.js +23 -380
  376. package/mixins/__tests__/chart.test.ts +48 -6
  377. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  378. package/mixins/auth-config.js +5 -9
  379. package/mixins/brand.js +102 -96
  380. package/mixins/chart.js +27 -13
  381. package/mixins/create-edit-view/index.js +2 -2
  382. package/mixins/fetch.client.js +42 -48
  383. package/mixins/labeled-form-element.ts +27 -2
  384. package/mixins/page-actions.js +7 -5
  385. package/mixins/resource-fetch-api-pagination.js +304 -0
  386. package/mixins/resource-fetch-namespaced.js +1 -1
  387. package/mixins/resource-fetch.js +46 -5
  388. package/models/__tests__/cluster.test.ts +44 -0
  389. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  390. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  391. package/models/__tests__/management.cattle.io.node.ts +85 -0
  392. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  393. package/models/__tests__/namespace.test.ts +49 -9
  394. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  395. package/models/__tests__/schema.tests.ts +24 -0
  396. package/models/__tests__/secret.test.ts +37 -0
  397. package/models/__tests__/steve-schema.test.ts +73 -0
  398. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  399. package/models/__tests__/workload.test.ts +91 -0
  400. package/models/catalog.cattle.io.app.js +8 -0
  401. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  402. package/models/catalog.cattle.io.uiplugin.js +7 -8
  403. package/models/cis.cattle.io.clusterscan.js +29 -8
  404. package/models/cloudcredential.js +9 -1
  405. package/models/cluster/node.js +8 -4
  406. package/models/cluster/schema.js +6 -0
  407. package/models/cluster.js +33 -0
  408. package/models/cluster.x-k8s.io.machine.js +1 -1
  409. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  410. package/models/driver.js +62 -0
  411. package/models/fleet.cattle.io.cluster.js +27 -11
  412. package/models/fleet.cattle.io.gitrepo.js +66 -13
  413. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  414. package/models/kontainerdriver.js +68 -0
  415. package/models/management/schema.js +6 -0
  416. package/models/management.cattle.io.authconfig.js +3 -2
  417. package/models/management.cattle.io.cluster.js +16 -7
  418. package/models/management.cattle.io.globalrole.js +2 -0
  419. package/models/management.cattle.io.kontainerdriver.js +1 -0
  420. package/models/management.cattle.io.node.js +18 -14
  421. package/models/management.cattle.io.nodepool.js +17 -0
  422. package/models/management.cattle.io.project.js +0 -36
  423. package/models/management.cattle.io.setting.js +11 -7
  424. package/models/management.cattle.io.user.js +2 -2
  425. package/models/monitoring.coreos.com.receiver.js +3 -1
  426. package/models/monitoring.coreos.com.route.js +1 -1
  427. package/models/namespace.js +1 -1
  428. package/models/networking.k8s.io.ingress.js +2 -1
  429. package/models/nodedriver.js +68 -0
  430. package/models/pod.js +20 -0
  431. package/models/provisioning.cattle.io.cluster.js +125 -10
  432. package/models/schema.js +28 -7
  433. package/models/secret.js +126 -18
  434. package/models/service.js +2 -0
  435. package/models/steve-schema.ts +254 -0
  436. package/models/storage.k8s.io.storageclass.js +1 -1
  437. package/models/workload.js +17 -0
  438. package/models/workload.service.js +18 -0
  439. package/package.json +17 -14
  440. package/pages/about.vue +12 -6
  441. package/pages/account/create-key.vue +0 -1
  442. package/pages/account/index.vue +7 -3
  443. package/pages/auth/login.vue +106 -103
  444. package/pages/auth/logout.vue +2 -4
  445. package/pages/auth/setup.vue +92 -66
  446. package/pages/auth/verify.vue +30 -24
  447. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  448. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  449. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  450. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  451. package/pages/c/_cluster/apps/charts/install.vue +9 -9
  452. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  453. package/pages/c/_cluster/auth/config/index.vue +15 -9
  454. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  455. package/pages/c/_cluster/ecm/index.vue +0 -2
  456. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  457. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  458. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  459. package/pages/c/_cluster/explorer/index.vue +253 -91
  460. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  461. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  462. package/pages/c/_cluster/fleet/index.vue +89 -94
  463. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  464. package/pages/c/_cluster/longhorn/index.vue +52 -17
  465. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  466. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  467. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  468. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  469. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  470. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  471. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  472. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  473. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  474. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  475. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  476. package/pages/c/_cluster/neuvector/index.vue +1 -0
  477. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  478. package/pages/c/_cluster/settings/banners.vue +86 -10
  479. package/pages/c/_cluster/settings/brand.vue +261 -38
  480. package/pages/c/_cluster/settings/index.vue +4 -6
  481. package/pages/c/_cluster/settings/links.vue +3 -2
  482. package/pages/c/_cluster/settings/performance.vue +71 -3
  483. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  484. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  485. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  487. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  488. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  489. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  490. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  491. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  492. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  493. package/pages/diagnostic.vue +2 -2
  494. package/pages/fail-whale.vue +103 -42
  495. package/pages/home.vue +81 -24
  496. package/pages/prefs.vue +8 -4
  497. package/pages/support/index.vue +14 -10
  498. package/pkg/auto-import.js +1 -1
  499. package/plugins/axios.js +0 -36
  500. package/plugins/back-button.js +3 -5
  501. package/plugins/clean-html-directive.js +5 -30
  502. package/plugins/clean-html.js +53 -0
  503. package/plugins/clean-tooltip-directive.js +6 -31
  504. package/plugins/codemirror-loader.js +1 -1
  505. package/plugins/codemirror.js +41 -9
  506. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  507. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  508. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  509. package/plugins/dashboard-store/actions.js +132 -25
  510. package/plugins/dashboard-store/classify.js +1 -18
  511. package/plugins/dashboard-store/getters.js +154 -44
  512. package/plugins/dashboard-store/index.js +0 -111
  513. package/plugins/dashboard-store/mutations.js +150 -52
  514. package/plugins/dashboard-store/resource-class.js +77 -127
  515. package/plugins/directives.js +6 -39
  516. package/plugins/ember-cookie.js +13 -0
  517. package/plugins/global-formatters.js +26 -5
  518. package/plugins/i18n.js +89 -55
  519. package/plugins/int-number.js +6 -20
  520. package/plugins/plugin.js +3 -3
  521. package/plugins/positive-int-number.js +6 -17
  522. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  523. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  524. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  525. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  526. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  527. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  528. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  529. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  530. package/plugins/steve/actions.js +3 -38
  531. package/plugins/steve/getters.js +164 -61
  532. package/plugins/steve/hybrid-class.js +5 -1
  533. package/plugins/steve/mutations.js +24 -3
  534. package/plugins/steve/norman-class.js +142 -2
  535. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  536. package/plugins/steve/resource-utils.ts +38 -0
  537. package/plugins/steve/schema.d.ts +22 -0
  538. package/plugins/steve/steve-class.js +22 -0
  539. package/plugins/steve/steve-pagination-utils.ts +368 -0
  540. package/plugins/steve/subscribe.js +17 -76
  541. package/plugins/trim-whitespace.js +6 -34
  542. package/plugins/vue-js-modal.js +1 -1
  543. package/public/index.html +1 -0
  544. package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
  545. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  546. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  547. package/rancher-components/components/Banner/Banner.vue +2 -2
  548. package/rancher-components/components/Card/Card.vue +4 -4
  549. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  550. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  551. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  552. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  553. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  554. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  555. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  556. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  557. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  558. package/rancher-components/components/StringList/StringList.test.ts +270 -0
  559. package/rancher-components/components/StringList/StringList.vue +65 -26
  560. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  561. package/scripts/clean +1 -1
  562. package/scripts/extension/bundle +19 -7
  563. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  564. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  565. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  566. package/scripts/extension/helm/package/Dockerfile +1 -1
  567. package/scripts/extension/helm/scripts/package +11 -3
  568. package/scripts/extension/helm/scripts/patch +27 -0
  569. package/scripts/extension/parse-tag-name +4 -4
  570. package/scripts/extension/publish +25 -14
  571. package/scripts/publish-shell.sh +11 -1
  572. package/scripts/serve-pkgs +0 -2
  573. package/scripts/test-plugins-build.sh +87 -11
  574. package/scripts/vue-migrate.js +683 -0
  575. package/server/har-file.js +183 -0
  576. package/store/__tests__/catalog.test.ts +224 -0
  577. package/store/__tests__/type-map.test.ts +1122 -0
  578. package/store/auth.js +23 -4
  579. package/store/aws.js +53 -6
  580. package/store/catalog.js +22 -6
  581. package/store/cru-resource.ts +26 -0
  582. package/store/customisation.js +35 -0
  583. package/store/features.js +7 -4
  584. package/store/i18n.js +11 -0
  585. package/store/index.js +139 -48
  586. package/store/plugins.js +8 -4
  587. package/store/prefs.js +33 -38
  588. package/store/type-map.js +288 -213
  589. package/store/type-map.utils.ts +226 -0
  590. package/tsconfig.json +34 -9
  591. package/tsconfig.paths.json +21 -0
  592. package/types/components/labeledSelect.ts +50 -0
  593. package/types/resources/settings.d.ts +32 -0
  594. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  595. package/types/shell/index.d.ts +1042 -767
  596. package/types/store/dashboard-store.types.ts +42 -0
  597. package/types/store/pagination.types.ts +457 -0
  598. package/types/store/type-map.ts +30 -0
  599. package/types/store/vuex.d.ts +9 -0
  600. package/types/vue-shim.d.ts +51 -0
  601. package/utils/__tests__/cluster.test.ts +20 -18
  602. package/utils/__tests__/create-yaml.test.ts +359 -2
  603. package/utils/__tests__/kontainer.test.ts +92 -0
  604. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  605. package/utils/alertmanagerconfig.js +19 -0
  606. package/utils/array.ts +40 -1
  607. package/utils/async.ts +2 -0
  608. package/utils/auth.js +152 -4
  609. package/utils/axios.js +2 -21
  610. package/utils/azure.js +24 -0
  611. package/utils/banners.js +103 -0
  612. package/utils/clipboard.js +5 -0
  613. package/utils/cluster.js +1 -1
  614. package/utils/config.js +4 -0
  615. package/utils/create-yaml.js +59 -28
  616. package/utils/custom-validators.js +0 -2
  617. package/utils/error.js +41 -1
  618. package/utils/formatter.js +5 -3
  619. package/utils/git.ts +1 -1
  620. package/utils/install-redirect.js +1 -1
  621. package/utils/kontainer.ts +186 -0
  622. package/utils/object.js +24 -0
  623. package/utils/pagination-utils.ts +154 -0
  624. package/utils/pod-security-admission.ts +1 -1
  625. package/utils/router.js +86 -0
  626. package/utils/settings.ts +46 -0
  627. package/utils/time.js +2 -1
  628. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  629. package/utils/url.ts +1 -1
  630. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  631. package/utils/validators/formRules/index.ts +15 -9
  632. package/utils/validators/index.js +1 -0
  633. package/utils/validators/setting.js +6 -10
  634. package/vue.config.js +377 -401
  635. package/.DS_Store +0 -0
  636. package/assets/images/providers/aks-black.svg +0 -28
  637. package/assets/images/providers/aks.svg +0 -31
  638. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  639. package/components/ChartPsp.vue +0 -76
  640. package/components/EventsTable.vue +0 -67
  641. package/components/TabbedLinks/index.vue +0 -94
  642. package/components/__tests__/ChartPsp.test.ts +0 -75
  643. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  644. package/components/nuxt/nuxt-link.server.js +0 -16
  645. package/components/nuxt/nuxt.js +0 -101
  646. package/config/router.js +0 -408
  647. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  648. package/initialize/App.js +0 -198
  649. package/initialize/client.js +0 -875
  650. package/initialize/index.js +0 -364
  651. package/initialize/layouts.ts +0 -26
  652. package/middleware/i18n.js +0 -10
  653. package/middleware/unauthenticated.js +0 -22
  654. package/mixins/fetch.server.js +0 -73
  655. package/pages/c/_cluster/apps/index.vue +0 -17
  656. package/pages/c/_cluster/auth/index.vue +0 -19
  657. package/pages/c/_cluster/index.vue +0 -17
  658. package/pages/c/_cluster/legacy/index.vue +0 -22
  659. package/pages/c/_cluster/manager/index.vue +0 -22
  660. package/pages/c/_cluster/mcapps/index.vue +0 -21
  661. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  662. package/pages/c/index.vue +0 -9
  663. package/pages/rio/mesh.vue +0 -508
  664. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  665. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  666. package/plugins/portal-vue.js +0 -4
  667. package/plugins/portal.js +0 -4
  668. package/plugins/resize.js +0 -5
  669. package/plugins/shortkey.js +0 -4
  670. package/plugins/tooltip.js +0 -4
  671. package/plugins/transitions.js +0 -4
  672. package/plugins/v-select.js +0 -4
  673. package/plugins/vue-clipboard2.js +0 -4
  674. package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
  675. package/tsconfig.default.json +0 -46
  676. package/utils/group.js +0 -70
  677. package/utils/nuxt.js +0 -659
  678. package/utils/router.scrollBehavior.js +0 -80
  679. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  680. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  681. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  682. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  683. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  684. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  685. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  686. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  687. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  688. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  689. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -13,8 +13,10 @@ import { getVersionInfo } from '@shell/utils/version';
13
13
  import { LEGACY } from '@shell/store/features';
14
14
  import { SETTING } from '@shell/config/settings';
15
15
  import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
16
+ import { getProductFromRoute } from '@shell/utils/router';
16
17
  import { isRancherPrime } from '@shell/config/version';
17
18
  import Pinned from '@shell/components/nav/Pinned';
19
+ import { getGlobalBannerFontSizes } from '@shell/utils/banners';
18
20
 
19
21
  export default {
20
22
  components: {
@@ -38,6 +40,7 @@ export default {
38
40
  emptyCluster: BLANK_CLUSTER,
39
41
  showPinClusters: false,
40
42
  searchActive: false,
43
+ routeCombo: false,
41
44
  };
42
45
  },
43
46
 
@@ -51,42 +54,20 @@ export default {
51
54
  ...mapGetters(['clusterId']),
52
55
  ...mapGetters(['clusterReady', 'isRancher', 'currentCluster', 'currentProduct', 'isRancherInHarvester']),
53
56
  ...mapGetters({ features: 'features/get' }),
54
-
55
57
  value: {
56
58
  get() {
57
59
  return this.$store.getters['productId'];
58
60
  },
59
61
  },
60
-
61
62
  sideMenuStyle() {
63
+ const globalBannerSettings = getGlobalBannerFontSizes(this.$store);
64
+
62
65
  return {
63
- marginBottom: this.globalBannerSettings?.footerFont,
64
- marginTop: this.globalBannerSettings?.headerFont
66
+ marginBottom: globalBannerSettings?.footerFont,
67
+ marginTop: globalBannerSettings?.headerFont
65
68
  };
66
69
  },
67
70
 
68
- globalBannerSettings() {
69
- const settings = this.$store.getters['management/all'](MANAGEMENT.SETTING);
70
- const bannerSettings = settings?.find((s) => s.id === SETTING.BANNERS);
71
-
72
- if (bannerSettings) {
73
- const parsed = JSON.parse(bannerSettings.value);
74
- const {
75
- showFooter, showHeader, bannerFooter, bannerHeader, banner
76
- } = parsed;
77
- // add defaults to accomodate older JSON structures for banner definitions without breaking the UI
78
- // https://github.com/rancher/dashboard/issues/10140
79
- const bannerHeaderFontSize = bannerHeader?.fontSize || banner?.fontSize || '14px';
80
- const bannerFooterFontSize = bannerFooter?.fontSize || banner?.fontSize || '14px';
81
-
82
- return {
83
- headerFont: showHeader === 'true' ? this.pxToEm(bannerHeaderFontSize) : '0px',
84
- footerFont: showFooter === 'true' ? this.pxToEm(bannerFooterFontSize) : '0px'
85
- };
86
- }
87
-
88
- return undefined;
89
- },
90
71
  legacyEnabled() {
91
72
  return this.features(LEGACY);
92
73
  },
@@ -127,8 +108,10 @@ export default {
127
108
  isLocal: x.isLocal,
128
109
  isHarvester: x.isHarvester,
129
110
  pinned: x.pinned,
111
+ description: pCluster?.description || x.description,
130
112
  pin: () => x.pin(),
131
- unpin: () => x.unpin()
113
+ unpin: () => x.unpin(),
114
+ clusterRoute: { name: 'c-cluster-explorer', params: { cluster: x.id } }
132
115
  };
133
116
  }) || [];
134
117
  },
@@ -138,6 +121,16 @@ export default {
138
121
  const out = search ? this.clusters.filter((item) => item.label?.toLowerCase().includes(search)) : this.clusters;
139
122
  const sorted = sortBy(out, ['ready:desc', 'label']);
140
123
 
124
+ // put local cluster on top of list always
125
+ // https://github.com/rancher/dashboard/issues/10975
126
+ if (sorted.findIndex((c) => c.id === 'local') > 0) {
127
+ const localCluster = sorted.find((c) => c.id === 'local');
128
+ const localIndex = sorted.findIndex((c) => c.id === 'local');
129
+
130
+ sorted.splice(localIndex, 1);
131
+ sorted.unshift(localCluster);
132
+ }
133
+
141
134
  if (search) {
142
135
  this.showPinClusters = false;
143
136
  this.searchActive = !sorted.length > 0;
@@ -160,6 +153,16 @@ export default {
160
153
  const out = this.clusters.filter((item) => item.pinned);
161
154
  const sorted = sortBy(out, ['ready:desc', 'label']);
162
155
 
156
+ // put local cluster on top of list always
157
+ // https://github.com/rancher/dashboard/issues/10975
158
+ if (sorted.findIndex((c) => c.id === 'local') > 0) {
159
+ const localCluster = sorted.find((c) => c.id === 'local');
160
+ const localIndex = sorted.findIndex((c) => c.id === 'local');
161
+
162
+ sorted.splice(localIndex, 1);
163
+ sorted.unshift(localCluster);
164
+ }
165
+
163
166
  return sorted;
164
167
  },
165
168
 
@@ -169,7 +172,6 @@ export default {
169
172
 
170
173
  return `min-height: ${ height }px`;
171
174
  },
172
-
173
175
  clusterFilterCount() {
174
176
  return this.clusterFilter ? this.clustersFiltered.length : this.clusters.length;
175
177
  },
@@ -218,7 +220,9 @@ export default {
218
220
  params: { cluster }
219
221
  };
220
222
 
221
- if ( !this.$router.getMatchedComponents(to).length ) {
223
+ const matched = this.$router.getRoutes().filter((route) => route.name === to.name);
224
+
225
+ if ( !matched.length ) {
222
226
  to.name = 'c-cluster-product';
223
227
  to.params.product = p.name;
224
228
  }
@@ -246,6 +250,61 @@ export default {
246
250
 
247
251
  hasSupport() {
248
252
  return isRancherPrime() || this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.SUPPORTED )?.value === 'true';
253
+ },
254
+
255
+ isCurrRouteClusterExplorer() {
256
+ return this.$route?.name?.startsWith('c-cluster');
257
+ },
258
+
259
+ productFromRoute() {
260
+ return getProductFromRoute(this.$route);
261
+ },
262
+
263
+ aboutText() {
264
+ // If a version number (starts with 'v') then use that
265
+ if (this.displayVersion.startsWith('v')) {
266
+ // Don't show the '.0' for a minor release (e.g. 2.8.0, 2.9.0 etc)
267
+ return !this.displayVersion.endsWith('.0') ? this.displayVersion : this.displayVersion.substr(0, this.displayVersion.length - 2);
268
+ }
269
+
270
+ // Default fallback to 'About'
271
+ return this.t('about.title');
272
+ },
273
+
274
+ largeAboutText() {
275
+ return this.aboutText.length > 6;
276
+ },
277
+
278
+ appBar() {
279
+ let activeFound = false;
280
+
281
+ // order is important for the object keys here
282
+ // since we want to check last pinFiltered and clustersFiltered
283
+ const appBar = {
284
+ hciApps: this.hciApps,
285
+ multiClusterApps: this.multiClusterApps,
286
+ legacyApps: this.legacyApps,
287
+ configurationApps: this.configurationApps,
288
+ pinFiltered: this.pinFiltered,
289
+ clustersFiltered: this.clustersFiltered,
290
+ };
291
+
292
+ Object.keys(appBar).forEach((menuSection) => {
293
+ const menuSectionItems = appBar[menuSection];
294
+ const isClusterCheck = menuSection === 'pinFiltered' || menuSection === 'clustersFiltered';
295
+
296
+ // need to reset active state on other menu items
297
+ menuSectionItems.forEach((item) => {
298
+ item.isMenuActive = false;
299
+
300
+ if (!activeFound && this.checkActiveRoute(item, isClusterCheck)) {
301
+ activeFound = true;
302
+ item.isMenuActive = true;
303
+ }
304
+ });
305
+ });
306
+
307
+ return appBar;
249
308
  }
250
309
  },
251
310
 
@@ -264,17 +323,38 @@ export default {
264
323
  },
265
324
 
266
325
  methods: {
267
- /**
268
- * Converts a pixel value to an em value based on the default font size.
269
- * @param {number} elementFontSize - The font size of the element in pixels.
270
- * @param {number} [defaultFontSize=14] - The default font size in pixels.
271
- * @returns {string} The converted value in em units.
272
- */
273
- pxToEm(elementFontSize, defaultFontSize = 14) {
274
- const lineHeightInPx = 2 * parseInt(elementFontSize);
275
- const lineHeightInEm = lineHeightInPx / defaultFontSize;
276
-
277
- return `${ lineHeightInEm }em`;
326
+ checkActiveRoute(obj, isClusterRoute) {
327
+ // for Cluster links in main nav: check if route is a cluster explorer one + check if route cluster matches cluster obj id + check if curr product matches route product
328
+ if (isClusterRoute) {
329
+ return this.isCurrRouteClusterExplorer && this.$route?.params?.cluster === obj?.id && this.productFromRoute === this.currentProduct?.name;
330
+ }
331
+
332
+ // for remaining main nav items, check if curr product matches route product is enough
333
+ return this.productFromRoute === obj?.value;
334
+ },
335
+
336
+ handleKeyComboClick() {
337
+ this.routeCombo = !this.routeCombo;
338
+ },
339
+
340
+ clusterMenuClick(ev, cluster) {
341
+ if (this.routeCombo) {
342
+ ev.preventDefault();
343
+
344
+ if (this.isCurrRouteClusterExplorer && this.productFromRoute === this.currentProduct?.name) {
345
+ const clusterRoute = {
346
+ name: this.$route.name,
347
+ params: { ...this.$route.params },
348
+ query: { ...this.$route.query }
349
+ };
350
+
351
+ clusterRoute.params.cluster = cluster.id;
352
+
353
+ return this.$router.push(clusterRoute);
354
+ }
355
+ }
356
+
357
+ return this.$router.push(cluster.clusterRoute);
278
358
  },
279
359
 
280
360
  handler(e) {
@@ -302,20 +382,61 @@ export default {
302
382
  } catch {
303
383
  }
304
384
  },
305
- getTooltipConfig(item) {
306
- if (!this.shown && !item) {
385
+
386
+ getTooltipConfig(item, showWhenClosed = false) {
387
+ if (!item) {
307
388
  return;
308
389
  }
309
390
 
310
- if (!this.shown) {
311
- return {
312
- content: this.shown ? null : item,
313
- placement: 'right',
314
- popperOptions: { modifiers: { preventOverflow: { enabled: false }, hide: { enabled: false } } }
315
- };
391
+ let contentText = '';
392
+ let content;
393
+ let classes = '';
394
+
395
+ // this is the normal tooltip scenario where we are just passing a string
396
+ if (typeof item === 'string') {
397
+ contentText = item;
398
+ content = this.shown ? null : contentText;
399
+
400
+ // if key combo is pressed, then we update the tooltip as well
401
+ } else if (this.routeCombo &&
402
+ typeof item === 'object' &&
403
+ !Array.isArray(item) &&
404
+ item !== null &&
405
+ item.ready) {
406
+ contentText = this.t('nav.keyComboTooltip');
407
+
408
+ if (showWhenClosed) {
409
+ content = !this.shown ? contentText : null;
410
+ } else {
411
+ content = this.shown ? contentText : null;
412
+ }
413
+
414
+ // this is scenario where we show a tooltip when we are on the expanded menu to show full description
316
415
  } else {
317
- return { content: undefined };
416
+ contentText = item.label;
417
+ // this adds a class to the tooltip container so that we can control the max width
418
+ classes = 'menu-description-tooltip';
419
+
420
+ if (item.description) {
421
+ contentText += `<br><br>${ item.description }`;
422
+ }
423
+
424
+ if (showWhenClosed) {
425
+ content = !this.shown ? contentText : null;
426
+ } else {
427
+ content = this.shown ? contentText : null;
428
+
429
+ // this adds a class to adjust tooltip position so it doesn't overlap the cluster pinning action
430
+ classes += ' description-tooltip-pos-adjustment';
431
+ }
318
432
  }
433
+
434
+ return {
435
+ content,
436
+ placement: 'right',
437
+ popperOptions: { modifiers: { preventOverflow: { enabled: false }, hide: { enabled: false } } },
438
+ classes
439
+ };
319
440
  },
320
441
  }
321
442
  };
@@ -356,7 +477,10 @@ export default {
356
477
  /><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" /></svg>
357
478
  </div>
358
479
  <div class="side-menu-logo">
359
- <BrandImage file-name="rancher-logo.svg" />
480
+ <BrandImage
481
+ data-testid="side-menu__brand-img"
482
+ file-name="rancher-logo.svg"
483
+ />
360
484
  </div>
361
485
  </div>
362
486
 
@@ -364,25 +488,26 @@ export default {
364
488
  <div class="body">
365
489
  <div>
366
490
  <!-- Home button -->
367
- <nuxt-link
368
- class="option cluster selector home"
369
- :to="{ name: 'home' }"
370
- >
371
- <svg
372
- v-tooltip="getTooltipConfig(t('nav.home'))"
373
- xmlns="http://www.w3.org/2000/svg"
374
- height="24"
375
- viewBox="0 0 24 24"
376
- width="24"
377
- ><path
378
- d="M0 0h24v24H0z"
379
- fill="none"
380
- /><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /></svg>
381
- <div class="home-text">
382
- {{ t('nav.home') }}
383
- </div>
384
- </nuxt-link>
385
-
491
+ <div @click="hide()">
492
+ <router-link
493
+ class="option cluster selector home"
494
+ :to="{ name: 'home' }"
495
+ >
496
+ <svg
497
+ v-tooltip="getTooltipConfig(t('nav.home'))"
498
+ xmlns="http://www.w3.org/2000/svg"
499
+ height="24"
500
+ viewBox="0 0 24 24"
501
+ width="24"
502
+ ><path
503
+ d="M0 0h24v24H0z"
504
+ fill="none"
505
+ /><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /></svg>
506
+ <div class="home-text">
507
+ {{ t('nav.home') }}
508
+ </div>
509
+ </router-link>
510
+ </div>
386
511
  <!-- Search bar -->
387
512
  <div
388
513
  v-if="showClusterSearch"
@@ -405,6 +530,10 @@ export default {
405
530
  v-model="clusterFilter"
406
531
  :placeholder="t('nav.search.placeholder')"
407
532
  >
533
+ <i
534
+ class="magnifier icon icon-search"
535
+ :class="{ active: clusterFilter }"
536
+ />
408
537
  <i
409
538
  v-if="clusterFilter"
410
539
  class="icon icon-close"
@@ -432,20 +561,21 @@ export default {
432
561
  </a>
433
562
  </div>
434
563
  <div
435
- v-for="a in hciApps"
564
+ v-for="a in appBar.hciApps"
436
565
  :key="a.label"
437
566
  @click="hide()"
438
567
  >
439
- <nuxt-link
568
+ <router-link
440
569
  class="option"
441
570
  :to="a.to"
571
+ :class="{'active-menu-link': a.isMenuActive }"
442
572
  >
443
573
  <IconOrSvg
444
574
  :icon="a.icon"
445
575
  :src="a.svg"
446
576
  />
447
577
  <div>{{ a.label }}</div>
448
- </nuxt-link>
578
+ </router-link>
449
579
  </div>
450
580
  </template>
451
581
 
@@ -462,38 +592,65 @@ export default {
462
592
  class="clustersPinned"
463
593
  >
464
594
  <div
465
- v-for="c in pinFiltered"
595
+ v-for="(c, index) in appBar.pinFiltered"
466
596
  :key="c.id"
597
+ :data-testid="`pinned-ready-cluster-${index}`"
467
598
  @click="hide()"
468
599
  >
469
- <nuxt-link
600
+ <button
470
601
  v-if="c.ready"
471
- :data-testid="`menu-cluster-${ c.id }`"
602
+ v-shortkey.push="{windows: ['alt'], mac: ['option']}"
603
+ :data-testid="`pinned-menu-cluster-${ c.id }`"
472
604
  class="cluster selector option"
473
- :to="{ name: 'c-cluster-explorer', params: { cluster: c.id } }"
605
+ :class="{'active-menu-link': c.isMenuActive }"
606
+ :to="c.clusterRoute"
607
+ @click.prevent="clusterMenuClick($event, c)"
608
+ @shortkey="handleKeyComboClick"
474
609
  >
475
610
  <ClusterIconMenu
476
- v-tooltip="getTooltipConfig(c.label)"
611
+ v-tooltip="getTooltipConfig(c, true)"
477
612
  :cluster="c"
613
+ :route-combo="routeCombo"
478
614
  class="rancher-provider-icon"
479
615
  />
480
- <div class="cluster-name">
481
- {{ c.label }}
616
+ <div
617
+ v-tooltip="getTooltipConfig(c)"
618
+ class="cluster-name"
619
+ >
620
+ <p>{{ c.label }}</p>
621
+ <p
622
+ v-if="c.description"
623
+ class="description"
624
+ >
625
+ {{ c.description }}
626
+ </p>
482
627
  </div>
483
628
  <Pinned
484
629
  :cluster="c"
485
630
  />
486
- </nuxt-link>
631
+ </button>
487
632
  <span
488
633
  v-else
489
634
  class="option cluster selector disabled"
635
+ :data-testid="`pinned-menu-cluster-disabled-${ c.id }`"
490
636
  >
491
637
  <ClusterIconMenu
492
- v-tooltip="getTooltipConfig(c.label)"
638
+ v-tooltip="getTooltipConfig(c, true)"
493
639
  :cluster="c"
494
640
  class="rancher-provider-icon"
495
641
  />
496
- <div class="cluster-name">{{ c.label }}</div>
642
+ <div
643
+ v-tooltip="getTooltipConfig(c)"
644
+ class="cluster-name"
645
+ >
646
+ <p>{{ c.label }}</p>
647
+ <p
648
+ v-if="c.description"
649
+ class="description"
650
+ >
651
+ {{ c.description }}
652
+ </p>
653
+ </div>
497
654
  <Pinned
498
655
  :cluster="c"
499
656
  />
@@ -510,40 +667,66 @@ export default {
510
667
  <!-- Clusters Search result -->
511
668
  <div class="clustersList">
512
669
  <div
513
- v-for="(c, index) in clustersFiltered"
670
+ v-for="(c, index) in appBar.clustersFiltered"
514
671
  :key="c.id"
515
672
  :data-testid="`top-level-menu-cluster-${index}`"
516
673
  @click="hide()"
517
674
  >
518
- <nuxt-link
675
+ <button
519
676
  v-if="c.ready"
677
+ v-shortkey.push="{windows: ['alt'], mac: ['option']}"
520
678
  :data-testid="`menu-cluster-${ c.id }`"
521
679
  class="cluster selector option"
522
- :to="{ name: 'c-cluster-explorer', params: { cluster: c.id } }"
680
+ :class="{'active-menu-link': c.isMenuActive }"
681
+ :to="c.clusterRoute"
682
+ @click="clusterMenuClick($event, c)"
683
+ @shortkey="handleKeyComboClick"
523
684
  >
524
685
  <ClusterIconMenu
525
- v-tooltip="getTooltipConfig(c.label)"
686
+ v-tooltip="getTooltipConfig(c, true)"
526
687
  :cluster="c"
688
+ :route-combo="routeCombo"
527
689
  class="rancher-provider-icon"
528
690
  />
529
- <div class="cluster-name">
530
- {{ c.label }}
691
+ <div
692
+ v-tooltip="getTooltipConfig(c)"
693
+ class="cluster-name"
694
+ >
695
+ <p>{{ c.label }}</p>
696
+ <p
697
+ v-if="c.description"
698
+ class="description"
699
+ >
700
+ {{ c.description }}
701
+ </p>
531
702
  </div>
532
703
  <Pinned
533
704
  :class="{'showPin': c.pinned}"
534
705
  :cluster="c"
535
706
  />
536
- </nuxt-link>
707
+ </button>
537
708
  <span
538
709
  v-else
539
710
  class="option cluster selector disabled"
711
+ :data-testid="`menu-cluster-disabled-${ c.id }`"
540
712
  >
541
713
  <ClusterIconMenu
542
- v-tooltip="getTooltipConfig(c.label)"
714
+ v-tooltip="getTooltipConfig(c, true)"
543
715
  :cluster="c"
544
716
  class="rancher-provider-icon"
545
717
  />
546
- <div class="cluster-name">{{ c.label }}</div>
718
+ <div
719
+ v-tooltip="getTooltipConfig(c)"
720
+ class="cluster-name"
721
+ >
722
+ <p>{{ c.label }}</p>
723
+ <p
724
+ v-if="c.description"
725
+ class="description"
726
+ >
727
+ {{ c.description }}
728
+ </p>
729
+ </div>
547
730
  <Pinned
548
731
  :class="{'showPin': c.pinned}"
549
732
  :cluster="c"
@@ -563,7 +746,7 @@ export default {
563
746
  </div>
564
747
 
565
748
  <!-- See all clusters -->
566
- <nuxt-link
749
+ <router-link
567
750
  v-if="clusters.length > maxClustersToShow"
568
751
  class="clusters-all"
569
752
  :to="{name: 'c-cluster-product-resource', params: {
@@ -576,7 +759,7 @@ export default {
576
759
  {{ shown ? t('nav.seeAllClusters') : t('nav.seeAllClustersCollapsed') }}
577
760
  <i class="icon icon-chevron-right" />
578
761
  </span>
579
- </nuxt-link>
762
+ </router-link>
580
763
  </template>
581
764
 
582
765
  <div class="category">
@@ -590,12 +773,13 @@ export default {
590
773
  </span>
591
774
  </div>
592
775
  <div
593
- v-for="a in multiClusterApps"
776
+ v-for="a in appBar.multiClusterApps"
594
777
  :key="a.label"
595
778
  @click="hide()"
596
779
  >
597
- <nuxt-link
780
+ <router-link
598
781
  class="option"
782
+ :class="{'active-menu-link': a.isMenuActive }"
599
783
  :to="a.to"
600
784
  >
601
785
  <IconOrSvg
@@ -604,7 +788,7 @@ export default {
604
788
  :src="a.svg"
605
789
  />
606
790
  <span class="option-link">{{ a.label }}</span>
607
- </nuxt-link>
791
+ </router-link>
608
792
  </div>
609
793
  </template>
610
794
  <template v-if="legacyEnabled">
@@ -617,12 +801,13 @@ export default {
617
801
  </span>
618
802
  </div>
619
803
  <div
620
- v-for="a in legacyApps"
804
+ v-for="a in appBar.legacyApps"
621
805
  :key="a.label"
622
806
  @click="hide()"
623
807
  >
624
- <nuxt-link
808
+ <router-link
625
809
  class="option"
810
+ :class="{'active-menu-link': a.isMenuActive }"
626
811
  :to="a.to"
627
812
  >
628
813
  <IconOrSvg
@@ -631,7 +816,7 @@ export default {
631
816
  :src="a.svg"
632
817
  />
633
818
  <div>{{ a.label }}</div>
634
- </nuxt-link>
819
+ </router-link>
635
820
  </div>
636
821
  </template>
637
822
 
@@ -646,12 +831,13 @@ export default {
646
831
  </span>
647
832
  </div>
648
833
  <div
649
- v-for="a in configurationApps"
834
+ v-for="a in appBar.configurationApps"
650
835
  :key="a.label"
651
836
  @click="hide()"
652
837
  >
653
- <nuxt-link
838
+ <router-link
654
839
  class="option"
840
+ :class="{'active-menu-link': a.isMenuActive }"
655
841
  :to="a.to"
656
842
  >
657
843
  <IconOrSvg
@@ -660,7 +846,7 @@ export default {
660
846
  :src="a.svg"
661
847
  />
662
848
  <div>{{ a.label }}</div>
663
- </nuxt-link>
849
+ </router-link>
664
850
  </div>
665
851
  </template>
666
852
  </div>
@@ -675,21 +861,22 @@ export default {
675
861
  class="support"
676
862
  @click="hide()"
677
863
  >
678
- <nuxt-link
864
+ <router-link
679
865
  :to="{name: 'support'}"
680
866
  >
681
867
  {{ t('nav.support', {hasSupport}) }}
682
- </nuxt-link>
868
+ </router-link>
683
869
  </div>
684
870
  <div
685
871
  class="version"
872
+ :class="{'version-small': largeAboutText}"
686
873
  @click="hide()"
687
874
  >
688
- <nuxt-link
875
+ <router-link
689
876
  :to="{ name: 'about' }"
690
877
  >
691
- {{ t('about.title') }}
692
- </nuxt-link>
878
+ {{ aboutText }}
879
+ </router-link>
693
880
  </div>
694
881
  </div>
695
882
  </div>
@@ -698,6 +885,19 @@ export default {
698
885
  </template>
699
886
 
700
887
  <style lang="scss">
888
+ .menu-description-tooltip {
889
+ max-width: 200px;
890
+ white-space: pre-wrap;
891
+ word-wrap: break-word;
892
+ }
893
+
894
+ .description-tooltip-pos-adjustment {
895
+ // needs !important so that we can
896
+ // offset the tooltip a bit so it doesn't
897
+ // overlap the pin icon and cause bad UX
898
+ left: 35px !important;
899
+ }
900
+
701
901
  .localeSelector, .footer-tooltip {
702
902
  z-index: 1000;
703
903
  }
@@ -715,6 +915,17 @@ export default {
715
915
  outline: 0;
716
916
  }
717
917
  }
918
+
919
+ .theme-dark .cluster-name .description {
920
+ color: var(--input-label) !important;
921
+ }
922
+ .theme-dark .body .option {
923
+ &:hover .cluster-name .description,
924
+ &.router-link-active .cluster-name .description,
925
+ &.active-menu-link .cluster-name .description {
926
+ color: var(--side-menu-desc) !important;
927
+ }
928
+ }
718
929
  </style>
719
930
 
720
931
  <style lang="scss" scoped>
@@ -755,7 +966,7 @@ export default {
755
966
  flex-direction: column;
756
967
  padding: 0;
757
968
  overflow: hidden;
758
- transition: width 500ms;
969
+ transition: width 250ms;
759
970
 
760
971
  &:focus {
761
972
  outline: 0;
@@ -763,6 +974,7 @@ export default {
763
974
 
764
975
  &.menu-open {
765
976
  width: 300px;
977
+ box-shadow: 3px 1px 3px var(--shadow);
766
978
  }
767
979
 
768
980
  .title {
@@ -770,7 +982,6 @@ export default {
770
982
  height: 55px;
771
983
  flex: 0 0 55px;
772
984
  width: 100%;
773
- border-bottom: 1px solid var(--nav-border);
774
985
  justify-content: flex-start;
775
986
  align-items: center;
776
987
 
@@ -809,6 +1020,10 @@ export default {
809
1020
  font-size: 14px;
810
1021
  height: $option-height;
811
1022
  white-space: nowrap;
1023
+ background-color: transparent;
1024
+ width: 100%;
1025
+ border-radius: 0;
1026
+ border: none;
812
1027
 
813
1028
  .cluster-badge-logo-text {
814
1029
  color: var(--default-active-text);
@@ -825,6 +1040,24 @@ export default {
825
1040
  }
826
1041
  }
827
1042
 
1043
+ .cluster-name {
1044
+ line-height: normal;
1045
+
1046
+ & > p {
1047
+ width: 195px;
1048
+ white-space: nowrap;
1049
+ overflow: hidden;
1050
+ text-overflow: ellipsis;
1051
+ text-align: left;
1052
+
1053
+ &.description {
1054
+ font-size: 12px;
1055
+ padding-right: 8px;
1056
+ color: var(--darker);
1057
+ }
1058
+ }
1059
+ }
1060
+
828
1061
  &:hover {
829
1062
  text-decoration: none;
830
1063
 
@@ -838,9 +1071,9 @@ export default {
838
1071
  cursor: not-allowed;
839
1072
 
840
1073
  .rancher-provider-icon,
841
- .cluster-name {
1074
+ .cluster-name p {
842
1075
  filter: grayscale(1);
843
- color: var(--muted);
1076
+ color: var(--muted) !important;
844
1077
  }
845
1078
 
846
1079
  .pin {
@@ -850,6 +1083,8 @@ export default {
850
1083
 
851
1084
  &:focus {
852
1085
  outline: 0;
1086
+ box-shadow: none;
1087
+
853
1088
  > div {
854
1089
  text-decoration: underline;
855
1090
  }
@@ -871,7 +1106,7 @@ export default {
871
1106
  margin-right: 16px;
872
1107
  }
873
1108
 
874
- &.nuxt-link-active {
1109
+ &.router-link-active, &.active-menu-link {
875
1110
  background: var(--primary-hover-bg);
876
1111
  color: var(--primary-hover-text);
877
1112
 
@@ -882,6 +1117,10 @@ export default {
882
1117
  i {
883
1118
  color: var(--primary-hover-text);
884
1119
  }
1120
+
1121
+ div .description {
1122
+ color: var(--default);
1123
+ }
885
1124
  }
886
1125
 
887
1126
  &:hover {
@@ -889,6 +1128,10 @@ export default {
889
1128
  background: var(--primary-hover-bg);
890
1129
  > div {
891
1130
  color: var(--primary-hover-text);
1131
+
1132
+ .description {
1133
+ color: var(--default);
1134
+ }
892
1135
  }
893
1136
  svg {
894
1137
  fill: var(--primary-hover-text);
@@ -906,13 +1149,6 @@ export default {
906
1149
  }
907
1150
  }
908
1151
  }
909
-
910
- .cluster-name {
911
- max-width: 220px;
912
- white-space: nowrap;
913
- overflow: hidden;
914
- text-overflow: ellipsis;
915
- }
916
1152
  }
917
1153
 
918
1154
  .option, .option-disabled {
@@ -923,13 +1159,31 @@ export default {
923
1159
  position: relative;
924
1160
  > input {
925
1161
  background-color: transparent;
926
- margin-bottom: 8px;
927
1162
  padding-right: 35px;
1163
+ padding-left: 25px;
1164
+ height: 32px;
1165
+ }
1166
+ > .magnifier {
1167
+ position: absolute;
1168
+ top: 12px;
1169
+ left: 8px;
1170
+ width: 12px;
1171
+ height: 12px;
1172
+ font-size: 12px;
1173
+ opacity: 0.4;
1174
+
1175
+ &.active {
1176
+ opacity: 1;
1177
+
1178
+ &:hover {
1179
+ color: var(--body-text);
1180
+ }
1181
+ }
928
1182
  }
929
1183
  > i {
930
1184
  position: absolute;
931
- font-size: $clear-search-size;
932
- top: 11px;
1185
+ font-size: 12px;
1186
+ top: 12px;
933
1187
  right: 8px;
934
1188
  opacity: 0.7;
935
1189
  cursor: pointer;
@@ -966,10 +1220,10 @@ export default {
966
1220
  height: 42px;
967
1221
 
968
1222
  .search {
969
- transition: all 0.5s ease-in-out;
1223
+ transition: all 0.25s ease-in-out;
970
1224
  transition-delay: 2s;
971
1225
  width: 72%;
972
- height: 42px;
1226
+ height: 36px;
973
1227
 
974
1228
  input {
975
1229
  height: 100%;
@@ -995,7 +1249,7 @@ export default {
995
1249
  font-size: 14px;
996
1250
  }
997
1251
 
998
- .nuxt-link-active {
1252
+ .router-link-active {
999
1253
  &:hover {
1000
1254
  text-decoration: none;
1001
1255
  }
@@ -1025,7 +1279,7 @@ export default {
1025
1279
  hr {
1026
1280
  margin: 0;
1027
1281
  width: 94%;
1028
- transition: all 0.5s ease-in-out;
1282
+ transition: all 0.25s ease-in-out;
1029
1283
  max-width: 100%;
1030
1284
  }
1031
1285
  }
@@ -1052,7 +1306,7 @@ export default {
1052
1306
  text-transform: uppercase;
1053
1307
 
1054
1308
  span {
1055
- transition: all 0.5s ease-in-out;
1309
+ transition: all 0.25s ease-in-out;
1056
1310
  display: flex;
1057
1311
  max-height: 16px;
1058
1312
  }
@@ -1061,7 +1315,7 @@ export default {
1061
1315
  margin: 0;
1062
1316
  max-width: 50px;
1063
1317
  width: 0;
1064
- transition: all 0.5s ease-in-out;
1318
+ transition: all 0.25s ease-in-out;
1065
1319
  }
1066
1320
  }
1067
1321
 
@@ -1108,14 +1362,19 @@ export default {
1108
1362
  }
1109
1363
 
1110
1364
  .footer {
1111
- margin: 20px 15px;
1365
+ margin: 20px 10px;
1366
+ width: 50px;
1112
1367
 
1113
1368
  .support {
1114
1369
  display: none;
1115
1370
  }
1116
1371
 
1117
1372
  .version{
1118
- text-align: left;
1373
+ text-align: center;
1374
+
1375
+ &.version-small {
1376
+ font-size: 12px;
1377
+ }
1119
1378
  }
1120
1379
  }
1121
1380
  }
@@ -1173,12 +1432,12 @@ export default {
1173
1432
  }
1174
1433
 
1175
1434
  .fade-enter-active, .fade-leave-active {
1176
- transition: all 0.2s;
1435
+ transition: all 0.25s;
1177
1436
  transition-timing-function: ease;
1178
1437
  }
1179
1438
 
1180
1439
  .fade-leave-active {
1181
- transition: all 0.4s;
1440
+ transition: all 0.25s;
1182
1441
  }
1183
1442
 
1184
1443
  .fade-leave-to {