@rancher/shell 1.2.3 → 2.0.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 (699) 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 +315 -64
  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/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /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,12 +1083,14 @@ 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
  }
856
1091
  }
857
1092
 
858
- > i {
1093
+ > i, > img {
859
1094
  display: block;
860
1095
  width: 42px;
861
1096
  font-size: $icon-size;
@@ -867,11 +1102,8 @@ export default {
867
1102
  margin-right: 16px;
868
1103
  fill: var(--link);
869
1104
  }
870
- img {
871
- margin-right: 16px;
872
- }
873
1105
 
874
- &.nuxt-link-active {
1106
+ &.router-link-active, &.active-menu-link {
875
1107
  background: var(--primary-hover-bg);
876
1108
  color: var(--primary-hover-text);
877
1109
 
@@ -882,6 +1114,10 @@ export default {
882
1114
  i {
883
1115
  color: var(--primary-hover-text);
884
1116
  }
1117
+
1118
+ div .description {
1119
+ color: var(--default);
1120
+ }
885
1121
  }
886
1122
 
887
1123
  &:hover {
@@ -889,6 +1125,10 @@ export default {
889
1125
  background: var(--primary-hover-bg);
890
1126
  > div {
891
1127
  color: var(--primary-hover-text);
1128
+
1129
+ .description {
1130
+ color: var(--default);
1131
+ }
892
1132
  }
893
1133
  svg {
894
1134
  fill: var(--primary-hover-text);
@@ -906,13 +1146,6 @@ export default {
906
1146
  }
907
1147
  }
908
1148
  }
909
-
910
- .cluster-name {
911
- max-width: 220px;
912
- white-space: nowrap;
913
- overflow: hidden;
914
- text-overflow: ellipsis;
915
- }
916
1149
  }
917
1150
 
918
1151
  .option, .option-disabled {
@@ -923,13 +1156,31 @@ export default {
923
1156
  position: relative;
924
1157
  > input {
925
1158
  background-color: transparent;
926
- margin-bottom: 8px;
927
1159
  padding-right: 35px;
1160
+ padding-left: 25px;
1161
+ height: 32px;
1162
+ }
1163
+ > .magnifier {
1164
+ position: absolute;
1165
+ top: 12px;
1166
+ left: 8px;
1167
+ width: 12px;
1168
+ height: 12px;
1169
+ font-size: 12px;
1170
+ opacity: 0.4;
1171
+
1172
+ &.active {
1173
+ opacity: 1;
1174
+
1175
+ &:hover {
1176
+ color: var(--body-text);
1177
+ }
1178
+ }
928
1179
  }
929
1180
  > i {
930
1181
  position: absolute;
931
- font-size: $clear-search-size;
932
- top: 11px;
1182
+ font-size: 12px;
1183
+ top: 12px;
933
1184
  right: 8px;
934
1185
  opacity: 0.7;
935
1186
  cursor: pointer;
@@ -966,10 +1217,10 @@ export default {
966
1217
  height: 42px;
967
1218
 
968
1219
  .search {
969
- transition: all 0.5s ease-in-out;
1220
+ transition: all 0.25s ease-in-out;
970
1221
  transition-delay: 2s;
971
1222
  width: 72%;
972
- height: 42px;
1223
+ height: 36px;
973
1224
 
974
1225
  input {
975
1226
  height: 100%;
@@ -995,7 +1246,7 @@ export default {
995
1246
  font-size: 14px;
996
1247
  }
997
1248
 
998
- .nuxt-link-active {
1249
+ .router-link-active {
999
1250
  &:hover {
1000
1251
  text-decoration: none;
1001
1252
  }
@@ -1025,7 +1276,7 @@ export default {
1025
1276
  hr {
1026
1277
  margin: 0;
1027
1278
  width: 94%;
1028
- transition: all 0.5s ease-in-out;
1279
+ transition: all 0.25s ease-in-out;
1029
1280
  max-width: 100%;
1030
1281
  }
1031
1282
  }
@@ -1052,7 +1303,7 @@ export default {
1052
1303
  text-transform: uppercase;
1053
1304
 
1054
1305
  span {
1055
- transition: all 0.5s ease-in-out;
1306
+ transition: all 0.25s ease-in-out;
1056
1307
  display: flex;
1057
1308
  max-height: 16px;
1058
1309
  }
@@ -1061,7 +1312,7 @@ export default {
1061
1312
  margin: 0;
1062
1313
  max-width: 50px;
1063
1314
  width: 0;
1064
- transition: all 0.5s ease-in-out;
1315
+ transition: all 0.25s ease-in-out;
1065
1316
  }
1066
1317
  }
1067
1318
 
@@ -1108,14 +1359,19 @@ export default {
1108
1359
  }
1109
1360
 
1110
1361
  .footer {
1111
- margin: 20px 15px;
1362
+ margin: 20px 10px;
1363
+ width: 50px;
1112
1364
 
1113
1365
  .support {
1114
1366
  display: none;
1115
1367
  }
1116
1368
 
1117
1369
  .version{
1118
- text-align: left;
1370
+ text-align: center;
1371
+
1372
+ &.version-small {
1373
+ font-size: 12px;
1374
+ }
1119
1375
  }
1120
1376
  }
1121
1377
  }
@@ -1173,12 +1429,12 @@ export default {
1173
1429
  }
1174
1430
 
1175
1431
  .fade-enter-active, .fade-leave-active {
1176
- transition: all 0.2s;
1432
+ transition: all 0.25s;
1177
1433
  transition-timing-function: ease;
1178
1434
  }
1179
1435
 
1180
1436
  .fade-leave-active {
1181
- transition: all 0.4s;
1437
+ transition: all 0.25s;
1182
1438
  }
1183
1439
 
1184
1440
  .fade-leave-to {