@rancher/shell 0.5.3 → 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 (581) 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 +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -13,9 +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/middleware/authenticated';
16
+ import { getProductFromRoute } from '@shell/utils/router';
17
17
  import { isRancherPrime } from '@shell/config/version';
18
18
  import Pinned from '@shell/components/nav/Pinned';
19
+ import { getGlobalBannerFontSizes } from '@shell/utils/banners';
19
20
 
20
21
  export default {
21
22
  components: {
@@ -39,6 +40,7 @@ export default {
39
40
  emptyCluster: BLANK_CLUSTER,
40
41
  showPinClusters: false,
41
42
  searchActive: false,
43
+ routeCombo: false,
42
44
  };
43
45
  },
44
46
 
@@ -58,35 +60,14 @@ export default {
58
60
  },
59
61
  },
60
62
  sideMenuStyle() {
63
+ const globalBannerSettings = getGlobalBannerFontSizes(this.$store);
64
+
61
65
  return {
62
- marginBottom: this.globalBannerSettings?.footerFont,
63
- marginTop: this.globalBannerSettings?.headerFont
66
+ marginBottom: globalBannerSettings?.footerFont,
67
+ marginTop: globalBannerSettings?.headerFont
64
68
  };
65
69
  },
66
70
 
67
- globalBannerSettings() {
68
- const settings = this.$store.getters['management/all'](MANAGEMENT.SETTING);
69
- const bannerSettings = settings?.find((s) => s.id === SETTING.BANNERS);
70
-
71
- if (bannerSettings) {
72
- const parsed = JSON.parse(bannerSettings.value);
73
- const {
74
- showFooter, showHeader, bannerFooter, bannerHeader, banner
75
- } = parsed;
76
-
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
 
@@ -217,7 +220,9 @@ export default {
217
220
  params: { cluster }
218
221
  };
219
222
 
220
- if ( !this.$router.getMatchedComponents(to).length ) {
223
+ const matched = this.$router.getRoutes().filter((route) => route.name === to.name);
224
+
225
+ if ( !matched.length ) {
221
226
  to.name = 'c-cluster-product';
222
227
  to.params.product = p.name;
223
228
  }
@@ -254,6 +259,53 @@ export default {
254
259
  productFromRoute() {
255
260
  return getProductFromRoute(this.$route);
256
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;
308
+ }
257
309
  },
258
310
 
259
311
  watch: {
@@ -271,19 +323,6 @@ export default {
271
323
  },
272
324
 
273
325
  methods: {
274
- /**
275
- * Converts a pixel value to an em value based on the default font size.
276
- * @param {number} elementFontSize - The font size of the element in pixels.
277
- * @param {number} [defaultFontSize=14] - The default font size in pixels.
278
- * @returns {string} The converted value in em units.
279
- */
280
- pxToEm(elementFontSize, defaultFontSize = 14) {
281
- const lineHeightInPx = 2 * parseInt(elementFontSize);
282
- const lineHeightInEm = lineHeightInPx / defaultFontSize;
283
-
284
- return `${ lineHeightInEm }em`;
285
- },
286
-
287
326
  checkActiveRoute(obj, isClusterRoute) {
288
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
289
328
  if (isClusterRoute) {
@@ -294,6 +333,30 @@ export default {
294
333
  return this.productFromRoute === obj?.value;
295
334
  },
296
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);
358
+ },
359
+
297
360
  handler(e) {
298
361
  if (e.keyCode === KEY.ESCAPE ) {
299
362
  this.hide();
@@ -319,20 +382,61 @@ export default {
319
382
  } catch {
320
383
  }
321
384
  },
322
- getTooltipConfig(item) {
323
- if (!this.shown && !item) {
385
+
386
+ getTooltipConfig(item, showWhenClosed = false) {
387
+ if (!item) {
324
388
  return;
325
389
  }
326
390
 
327
- if (!this.shown) {
328
- return {
329
- content: this.shown ? null : item,
330
- placement: 'right',
331
- popperOptions: { modifiers: { preventOverflow: { enabled: false }, hide: { enabled: false } } }
332
- };
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
333
415
  } else {
334
- 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
+ }
335
432
  }
433
+
434
+ return {
435
+ content,
436
+ placement: 'right',
437
+ popperOptions: { modifiers: { preventOverflow: { enabled: false }, hide: { enabled: false } } },
438
+ classes
439
+ };
336
440
  },
337
441
  }
338
442
  };
@@ -384,25 +488,26 @@ export default {
384
488
  <div class="body">
385
489
  <div>
386
490
  <!-- Home button -->
387
- <nuxt-link
388
- class="option cluster selector home"
389
- :to="{ name: 'home' }"
390
- >
391
- <svg
392
- v-tooltip="getTooltipConfig(t('nav.home'))"
393
- xmlns="http://www.w3.org/2000/svg"
394
- height="24"
395
- viewBox="0 0 24 24"
396
- width="24"
397
- ><path
398
- d="M0 0h24v24H0z"
399
- fill="none"
400
- /><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /></svg>
401
- <div class="home-text">
402
- {{ t('nav.home') }}
403
- </div>
404
- </nuxt-link>
405
-
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>
406
511
  <!-- Search bar -->
407
512
  <div
408
513
  v-if="showClusterSearch"
@@ -456,21 +561,21 @@ export default {
456
561
  </a>
457
562
  </div>
458
563
  <div
459
- v-for="a in hciApps"
564
+ v-for="a in appBar.hciApps"
460
565
  :key="a.label"
461
566
  @click="hide()"
462
567
  >
463
- <nuxt-link
568
+ <router-link
464
569
  class="option"
465
570
  :to="a.to"
466
- :class="{'active-menu-link': checkActiveRoute(a) }"
571
+ :class="{'active-menu-link': a.isMenuActive }"
467
572
  >
468
573
  <IconOrSvg
469
574
  :icon="a.icon"
470
575
  :src="a.svg"
471
576
  />
472
577
  <div>{{ a.label }}</div>
473
- </nuxt-link>
578
+ </router-link>
474
579
  </div>
475
580
  </template>
476
581
 
@@ -487,39 +592,65 @@ export default {
487
592
  class="clustersPinned"
488
593
  >
489
594
  <div
490
- v-for="c in pinFiltered"
595
+ v-for="(c, index) in appBar.pinFiltered"
491
596
  :key="c.id"
597
+ :data-testid="`pinned-ready-cluster-${index}`"
492
598
  @click="hide()"
493
599
  >
494
- <nuxt-link
600
+ <button
495
601
  v-if="c.ready"
496
- :data-testid="`menu-cluster-${ c.id }`"
602
+ v-shortkey.push="{windows: ['alt'], mac: ['option']}"
603
+ :data-testid="`pinned-menu-cluster-${ c.id }`"
497
604
  class="cluster selector option"
498
- :class="{'active-menu-link': checkActiveRoute(c, true) }"
499
- :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"
500
609
  >
501
610
  <ClusterIconMenu
502
- v-tooltip="getTooltipConfig(c.label)"
611
+ v-tooltip="getTooltipConfig(c, true)"
503
612
  :cluster="c"
613
+ :route-combo="routeCombo"
504
614
  class="rancher-provider-icon"
505
615
  />
506
- <div class="cluster-name">
507
- {{ 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>
508
627
  </div>
509
628
  <Pinned
510
629
  :cluster="c"
511
630
  />
512
- </nuxt-link>
631
+ </button>
513
632
  <span
514
633
  v-else
515
634
  class="option cluster selector disabled"
635
+ :data-testid="`pinned-menu-cluster-disabled-${ c.id }`"
516
636
  >
517
637
  <ClusterIconMenu
518
- v-tooltip="getTooltipConfig(c.label)"
638
+ v-tooltip="getTooltipConfig(c, true)"
519
639
  :cluster="c"
520
640
  class="rancher-provider-icon"
521
641
  />
522
- <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>
523
654
  <Pinned
524
655
  :cluster="c"
525
656
  />
@@ -536,41 +667,66 @@ export default {
536
667
  <!-- Clusters Search result -->
537
668
  <div class="clustersList">
538
669
  <div
539
- v-for="(c, index) in clustersFiltered"
670
+ v-for="(c, index) in appBar.clustersFiltered"
540
671
  :key="c.id"
541
672
  :data-testid="`top-level-menu-cluster-${index}`"
542
673
  @click="hide()"
543
674
  >
544
- <nuxt-link
675
+ <button
545
676
  v-if="c.ready"
677
+ v-shortkey.push="{windows: ['alt'], mac: ['option']}"
546
678
  :data-testid="`menu-cluster-${ c.id }`"
547
679
  class="cluster selector option"
548
- :class="{'active-menu-link': checkActiveRoute(c, true) }"
549
- :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"
550
684
  >
551
685
  <ClusterIconMenu
552
- v-tooltip="getTooltipConfig(c.label)"
686
+ v-tooltip="getTooltipConfig(c, true)"
553
687
  :cluster="c"
688
+ :route-combo="routeCombo"
554
689
  class="rancher-provider-icon"
555
690
  />
556
- <div class="cluster-name">
557
- {{ 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>
558
702
  </div>
559
703
  <Pinned
560
704
  :class="{'showPin': c.pinned}"
561
705
  :cluster="c"
562
706
  />
563
- </nuxt-link>
707
+ </button>
564
708
  <span
565
709
  v-else
566
710
  class="option cluster selector disabled"
711
+ :data-testid="`menu-cluster-disabled-${ c.id }`"
567
712
  >
568
713
  <ClusterIconMenu
569
- v-tooltip="getTooltipConfig(c.label)"
714
+ v-tooltip="getTooltipConfig(c, true)"
570
715
  :cluster="c"
571
716
  class="rancher-provider-icon"
572
717
  />
573
- <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>
574
730
  <Pinned
575
731
  :class="{'showPin': c.pinned}"
576
732
  :cluster="c"
@@ -590,7 +746,7 @@ export default {
590
746
  </div>
591
747
 
592
748
  <!-- See all clusters -->
593
- <nuxt-link
749
+ <router-link
594
750
  v-if="clusters.length > maxClustersToShow"
595
751
  class="clusters-all"
596
752
  :to="{name: 'c-cluster-product-resource', params: {
@@ -603,7 +759,7 @@ export default {
603
759
  {{ shown ? t('nav.seeAllClusters') : t('nav.seeAllClustersCollapsed') }}
604
760
  <i class="icon icon-chevron-right" />
605
761
  </span>
606
- </nuxt-link>
762
+ </router-link>
607
763
  </template>
608
764
 
609
765
  <div class="category">
@@ -617,13 +773,13 @@ export default {
617
773
  </span>
618
774
  </div>
619
775
  <div
620
- v-for="a in multiClusterApps"
776
+ v-for="a in appBar.multiClusterApps"
621
777
  :key="a.label"
622
778
  @click="hide()"
623
779
  >
624
- <nuxt-link
780
+ <router-link
625
781
  class="option"
626
- :class="{'active-menu-link': checkActiveRoute(a) }"
782
+ :class="{'active-menu-link': a.isMenuActive }"
627
783
  :to="a.to"
628
784
  >
629
785
  <IconOrSvg
@@ -632,7 +788,7 @@ export default {
632
788
  :src="a.svg"
633
789
  />
634
790
  <span class="option-link">{{ a.label }}</span>
635
- </nuxt-link>
791
+ </router-link>
636
792
  </div>
637
793
  </template>
638
794
  <template v-if="legacyEnabled">
@@ -645,13 +801,13 @@ export default {
645
801
  </span>
646
802
  </div>
647
803
  <div
648
- v-for="a in legacyApps"
804
+ v-for="a in appBar.legacyApps"
649
805
  :key="a.label"
650
806
  @click="hide()"
651
807
  >
652
- <nuxt-link
808
+ <router-link
653
809
  class="option"
654
- :class="{'active-menu-link': checkActiveRoute(a) }"
810
+ :class="{'active-menu-link': a.isMenuActive }"
655
811
  :to="a.to"
656
812
  >
657
813
  <IconOrSvg
@@ -660,7 +816,7 @@ export default {
660
816
  :src="a.svg"
661
817
  />
662
818
  <div>{{ a.label }}</div>
663
- </nuxt-link>
819
+ </router-link>
664
820
  </div>
665
821
  </template>
666
822
 
@@ -675,13 +831,13 @@ export default {
675
831
  </span>
676
832
  </div>
677
833
  <div
678
- v-for="a in configurationApps"
834
+ v-for="a in appBar.configurationApps"
679
835
  :key="a.label"
680
836
  @click="hide()"
681
837
  >
682
- <nuxt-link
838
+ <router-link
683
839
  class="option"
684
- :class="{'active-menu-link': checkActiveRoute(a) }"
840
+ :class="{'active-menu-link': a.isMenuActive }"
685
841
  :to="a.to"
686
842
  >
687
843
  <IconOrSvg
@@ -690,7 +846,7 @@ export default {
690
846
  :src="a.svg"
691
847
  />
692
848
  <div>{{ a.label }}</div>
693
- </nuxt-link>
849
+ </router-link>
694
850
  </div>
695
851
  </template>
696
852
  </div>
@@ -705,21 +861,22 @@ export default {
705
861
  class="support"
706
862
  @click="hide()"
707
863
  >
708
- <nuxt-link
864
+ <router-link
709
865
  :to="{name: 'support'}"
710
866
  >
711
867
  {{ t('nav.support', {hasSupport}) }}
712
- </nuxt-link>
868
+ </router-link>
713
869
  </div>
714
870
  <div
715
871
  class="version"
872
+ :class="{'version-small': largeAboutText}"
716
873
  @click="hide()"
717
874
  >
718
- <nuxt-link
875
+ <router-link
719
876
  :to="{ name: 'about' }"
720
877
  >
721
- {{ t('about.title') }}
722
- </nuxt-link>
878
+ {{ aboutText }}
879
+ </router-link>
723
880
  </div>
724
881
  </div>
725
882
  </div>
@@ -728,6 +885,19 @@ export default {
728
885
  </template>
729
886
 
730
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
+
731
901
  .localeSelector, .footer-tooltip {
732
902
  z-index: 1000;
733
903
  }
@@ -745,6 +915,17 @@ export default {
745
915
  outline: 0;
746
916
  }
747
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
+ }
748
929
  </style>
749
930
 
750
931
  <style lang="scss" scoped>
@@ -785,7 +966,7 @@ export default {
785
966
  flex-direction: column;
786
967
  padding: 0;
787
968
  overflow: hidden;
788
- transition: width 500ms;
969
+ transition: width 250ms;
789
970
 
790
971
  &:focus {
791
972
  outline: 0;
@@ -839,6 +1020,10 @@ export default {
839
1020
  font-size: 14px;
840
1021
  height: $option-height;
841
1022
  white-space: nowrap;
1023
+ background-color: transparent;
1024
+ width: 100%;
1025
+ border-radius: 0;
1026
+ border: none;
842
1027
 
843
1028
  .cluster-badge-logo-text {
844
1029
  color: var(--default-active-text);
@@ -855,6 +1040,24 @@ export default {
855
1040
  }
856
1041
  }
857
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
+
858
1061
  &:hover {
859
1062
  text-decoration: none;
860
1063
 
@@ -868,9 +1071,9 @@ export default {
868
1071
  cursor: not-allowed;
869
1072
 
870
1073
  .rancher-provider-icon,
871
- .cluster-name {
1074
+ .cluster-name p {
872
1075
  filter: grayscale(1);
873
- color: var(--muted);
1076
+ color: var(--muted) !important;
874
1077
  }
875
1078
 
876
1079
  .pin {
@@ -880,6 +1083,8 @@ export default {
880
1083
 
881
1084
  &:focus {
882
1085
  outline: 0;
1086
+ box-shadow: none;
1087
+
883
1088
  > div {
884
1089
  text-decoration: underline;
885
1090
  }
@@ -912,6 +1117,10 @@ export default {
912
1117
  i {
913
1118
  color: var(--primary-hover-text);
914
1119
  }
1120
+
1121
+ div .description {
1122
+ color: var(--default);
1123
+ }
915
1124
  }
916
1125
 
917
1126
  &:hover {
@@ -919,6 +1128,10 @@ export default {
919
1128
  background: var(--primary-hover-bg);
920
1129
  > div {
921
1130
  color: var(--primary-hover-text);
1131
+
1132
+ .description {
1133
+ color: var(--default);
1134
+ }
922
1135
  }
923
1136
  svg {
924
1137
  fill: var(--primary-hover-text);
@@ -936,13 +1149,6 @@ export default {
936
1149
  }
937
1150
  }
938
1151
  }
939
-
940
- .cluster-name {
941
- max-width: 220px;
942
- white-space: nowrap;
943
- overflow: hidden;
944
- text-overflow: ellipsis;
945
- }
946
1152
  }
947
1153
 
948
1154
  .option, .option-disabled {
@@ -1156,14 +1362,19 @@ export default {
1156
1362
  }
1157
1363
 
1158
1364
  .footer {
1159
- margin: 20px 15px;
1365
+ margin: 20px 10px;
1366
+ width: 50px;
1160
1367
 
1161
1368
  .support {
1162
1369
  display: none;
1163
1370
  }
1164
1371
 
1165
1372
  .version{
1166
- text-align: left;
1373
+ text-align: center;
1374
+
1375
+ &.version-small {
1376
+ font-size: 12px;
1377
+ }
1167
1378
  }
1168
1379
  }
1169
1380
  }