@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
@@ -4,10 +4,10 @@ import { mapGetters } from 'vuex';
4
4
  import { mapPref, PLUGIN_DEVELOPER } from '@shell/store/prefs';
5
5
  import { sortBy } from '@shell/utils/sort';
6
6
  import { allHash } from '@shell/utils/promise';
7
- import { CATALOG, UI_PLUGIN, SERVICE, MANAGEMENT } from '@shell/config/types';
7
+ import { CATALOG, UI_PLUGIN, MANAGEMENT } from '@shell/config/types';
8
8
  import { SETTING } from '@shell/config/settings';
9
9
  import { fetchOrCreateSetting } from '@shell/utils/settings';
10
- import { getVersionData } from '@shell/config/version';
10
+ import { getVersionData, isRancherPrime } from '@shell/config/version';
11
11
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
12
12
  import { NAME as APP_PRODUCT } from '@shell/config/product/apps';
13
13
  import ActionMenu from '@shell/components/ActionMenu';
@@ -22,8 +22,7 @@ import CatalogLoadDialog from './CatalogList/CatalogLoadDialog.vue';
22
22
  import CatalogUninstallDialog from './CatalogList/CatalogUninstallDialog.vue';
23
23
  import DeveloperInstallDialog from './DeveloperInstallDialog.vue';
24
24
  import PluginInfoPanel from './PluginInfoPanel.vue';
25
- import SetupUIPlugins from './SetupUIPlugins';
26
- import RemoveUIPlugins from './RemoveUIPlugins';
25
+ import SetupUIPlugins from './SetupUIPlugins.vue';
27
26
  import AddExtensionRepos from './AddExtensionRepos';
28
27
  import CatalogList from './CatalogList/index.vue';
29
28
  import Banner from '@components/Banner/Banner.vue';
@@ -39,6 +38,7 @@ import {
39
38
  UI_PLUGINS_REPO_URL,
40
39
  UI_PLUGINS_PARTNERS_REPO_URL
41
40
  } from '@shell/config/uiplugins';
41
+ import TabTitle from '@shell/components/TabTitle';
42
42
 
43
43
  const MAX_DESCRIPTION_LENGTH = 200;
44
44
 
@@ -66,8 +66,8 @@ export default {
66
66
  Tabbed,
67
67
  UninstallDialog,
68
68
  SetupUIPlugins,
69
- RemoveUIPlugins,
70
69
  AddExtensionRepos,
70
+ TabTitle
71
71
  },
72
72
 
73
73
  data() {
@@ -75,7 +75,6 @@ export default {
75
75
  TABS_VALUES,
76
76
  kubeVersion: null,
77
77
  view: '',
78
- charts: [],
79
78
  installing: {},
80
79
  errors: {},
81
80
  plugins: [], // The installed plugins
@@ -85,7 +84,7 @@ export default {
85
84
  menuTargetElement: null,
86
85
  menuTargetEvent: null,
87
86
  menuOpen: false,
88
- hasService: false,
87
+ hasFeatureFlag: true,
89
88
  defaultIcon: require('~shell/assets/images/generic-plugin.svg'),
90
89
  reloadRequired: false,
91
90
  rancherVersion: getVersionData()?.Version,
@@ -115,7 +114,7 @@ export default {
115
114
  }
116
115
 
117
116
  if (this.$store.getters['management/schemaFor'](CATALOG.CLUSTER_REPO)) {
118
- hash.repos = await this.$store.dispatch('management/findAll', { type: CATALOG.CLUSTER_REPO });
117
+ hash.repos = await this.$store.dispatch('management/findAll', { type: CATALOG.CLUSTER_REPO }, { force: true });
119
118
  }
120
119
 
121
120
  const res = await allHash(hash);
@@ -127,10 +126,6 @@ export default {
127
126
 
128
127
  this.addExtensionReposBannerSetting = await fetchOrCreateSetting(this.$store, SETTING.ADD_EXTENSION_REPOS_BANNER_DISPLAY, 'true', true) || {};
129
128
 
130
- const c = this.$store.getters['catalog/rawCharts'];
131
-
132
- this.charts = Object.values(c);
133
-
134
129
  // If there are no plugins installed, default to the catalog view
135
130
  if (this.plugins.length === 0) {
136
131
  this.$refs.tabs?.select(TABS_VALUES.AVAILABLE);
@@ -146,8 +141,22 @@ export default {
146
141
  ...mapGetters({ uiErrors: 'uiplugins/errors' }),
147
142
  ...mapGetters({ theme: 'prefs/theme' }),
148
143
 
144
+ charts() {
145
+ const c = this.$store.getters['catalog/rawCharts'];
146
+
147
+ if ( c ) {
148
+ return Object.values(c);
149
+ }
150
+
151
+ return null;
152
+ },
153
+
149
154
  showAddReposBanner() {
150
- return this.addExtensionReposBannerSetting?.value === 'true' && (!this.repos.find((r) => r.urlDisplay === UI_PLUGINS_REPO_URL) || !this.repos.find((r) => r.urlDisplay === UI_PLUGINS_PARTNERS_REPO_URL));
155
+ const hasExtensionReposBannerSetting = this.addExtensionReposBannerSetting?.value === 'true';
156
+ const uiPluginsRepoNotFound = isRancherPrime() && !this.repos?.find((r) => r.urlDisplay === UI_PLUGINS_REPO_URL);
157
+ const uiPluginsPartnersRepoNotFound = !this.repos?.find((r) => r.urlDisplay === UI_PLUGINS_PARTNERS_REPO_URL);
158
+
159
+ return hasExtensionReposBannerSetting && (uiPluginsRepoNotFound || uiPluginsPartnersRepoNotFound);
151
160
  },
152
161
 
153
162
  applyDarkModeBg() {
@@ -194,15 +203,6 @@ export default {
194
203
  });
195
204
  }
196
205
 
197
- if (this.hasService) {
198
- menuActions.push( { divider: true });
199
- menuActions.push({
200
- action: 'removePluginSupport',
201
- label: this.t('plugins.setup.remove.label'),
202
- enabled: true
203
- });
204
- }
205
-
206
206
  return menuActions;
207
207
  },
208
208
 
@@ -227,6 +227,7 @@ export default {
227
227
 
228
228
  // Message to display when the tab view is empty (depends on the tab)
229
229
  emptyMessage() {
230
+ // i18n-uses plugins.empty.*
230
231
  return this.t(`plugins.empty.${ this.view }`);
231
232
  },
232
233
 
@@ -459,7 +460,7 @@ export default {
459
460
  neu.forEach((plugin) => {
460
461
  const existing = installed.find((p) => !p.removed && p.name === plugin.name && p.version === plugin.version);
461
462
 
462
- if (!existing && plugin.isCached) {
463
+ if (!existing && plugin.isInitialized) {
463
464
  if (!this.uiErrors[plugin.name]) {
464
465
  changes++;
465
466
  }
@@ -485,46 +486,33 @@ export default {
485
486
  methods: {
486
487
  async refreshCharts(forceChartsUpdate = false) {
487
488
  // we might need to force the request, so that we know at all times if what's the status of the offical and partners repos (installed or not)
488
- // tied to the SetupUIPlugins, AddExtensionRepos and RemoveUIPlugins checkboxes
489
+ // tied to the SetupUIPlugins, AddExtensionRepos checkboxes
489
490
  await this.$store.dispatch('catalog/load', { reset: true, force: forceChartsUpdate });
490
- const c = this.$store.getters['catalog/rawCharts'];
491
-
492
- this.charts = Object.values(c);
493
491
  },
494
492
 
495
493
  async updateInstallStatus(forceChartsUpdate = false) {
496
- let hasService;
494
+ let hasFeatureFlag;
497
495
 
498
496
  try {
499
- const service = await this.$store.dispatch('management/find', {
500
- type: SERVICE,
501
- id: `${ UI_PLUGIN_NAMESPACE }/ui-plugin-operator`,
502
- opt: { force: true },
503
- });
504
-
505
- hasService = !!service;
497
+ hasFeatureFlag = this.$store.getters['features/get']('uiextension');
506
498
  } catch (e) {
507
- hasService = false;
499
+ console.warn('Failed to check for feature flag', e); // eslint-disable-line no-console
500
+ hasFeatureFlag = false;
508
501
  }
509
502
 
510
- if (hasService || forceChartsUpdate) {
503
+ if ( hasFeatureFlag || forceChartsUpdate ) {
511
504
  this.refreshCharts(forceChartsUpdate);
512
505
  }
513
506
 
514
- Vue.set(this, 'hasService', hasService);
507
+ Vue.set(this, 'hasFeatureFlag', hasFeatureFlag);
515
508
 
516
- return hasService;
509
+ return hasFeatureFlag;
517
510
  },
518
511
 
519
512
  filterChanged(f) {
520
513
  this.view = f.selectedName;
521
514
  },
522
515
 
523
- removePluginSupport() {
524
- this.refreshCharts(true);
525
- this.$refs.removeUIPlugins.showDialog();
526
- },
527
-
528
516
  // Developer Load is in the action menu
529
517
  showDeveloperLoadDialog() {
530
518
  this.$refs.developerInstallDialog.showDialog();
@@ -658,7 +646,9 @@ export default {
658
646
  </template>
659
647
  <template v-else>
660
648
  <h2 data-testid="extensions-page-title">
661
- {{ t('plugins.title') }}
649
+ <TabTitle breadcrumb="vendor-only">
650
+ {{ t('plugins.title') }}
651
+ </TabTitle>
662
652
  </h2>
663
653
  </template>
664
654
  <div class="actions-container">
@@ -679,7 +669,7 @@ export default {
679
669
  {{ t('generic.reload') }}
680
670
  </button>
681
671
  </div>
682
- <div v-if="hasService && hasMenuActions">
672
+ <div v-if="hasFeatureFlag && hasMenuActions">
683
673
  <button
684
674
  ref="actions"
685
675
  aria-haspopup="true"
@@ -698,7 +688,6 @@ export default {
698
688
  :custom-target-event="menuTargetEvent"
699
689
  @close="setMenu(false)"
700
690
  @devLoad="showDeveloperLoadDialog"
701
- @removePluginSupport="removePluginSupport"
702
691
  @manageRepos="manageRepos"
703
692
  @addRancherRepos="showAddExtensionReposDialog"
704
693
  @manageExtensionView="manageExtensionView"
@@ -709,7 +698,7 @@ export default {
709
698
 
710
699
  <PluginInfoPanel ref="infoPanel" />
711
700
 
712
- <div v-if="!hasService">
701
+ <div v-if="!hasFeatureFlag">
713
702
  <div
714
703
  v-if="loading"
715
704
  class="data-loading"
@@ -723,6 +712,7 @@ export default {
723
712
  <SetupUIPlugins
724
713
  v-else
725
714
  class="setup-message"
715
+ :has-feature-flag="hasFeatureFlag"
726
716
  @done="updateInstallStatus(true)"
727
717
  @refreshCharts="refreshCharts(true)"
728
718
  />
@@ -1002,10 +992,6 @@ export default {
1002
992
  ref="developerInstallDialog"
1003
993
  @closed="didInstall"
1004
994
  />
1005
- <RemoveUIPlugins
1006
- ref="removeUIPlugins"
1007
- @done="updateInstallStatus"
1008
- />
1009
995
  <AddExtensionRepos
1010
996
  ref="addExtensionReposDialog"
1011
997
  @done="updateInstallStatus(true)"
@@ -215,6 +215,7 @@ export default {
215
215
  'digitalocean',
216
216
  'linode',
217
217
  'targetRoute', // contains circular references, isn't useful (added later to store)
218
+ '$router', // also contains a circular reference to $store, not useful for diagnostics
218
219
  ];
219
220
 
220
221
  const clearListsKeys = [
@@ -2,10 +2,18 @@
2
2
  import BrandImage from '@shell/components/BrandImage';
3
3
  import { mapGetters, mapState } from 'vuex';
4
4
  import { stringify } from '@shell/utils/error';
5
+ import Header from '@shell/components/nav/Header';
6
+ import Brand from '@shell/mixins/brand';
7
+ import FixedBanner from '@shell/components/FixedBanner';
8
+ import GrowlManager from '@shell/components/GrowlManager';
9
+ import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
5
10
 
6
11
  export default {
7
12
 
8
- components: { BrandImage },
13
+ components: {
14
+ BrandImage, FixedBanner, GrowlManager, Header
15
+ },
16
+ mixins: [Brand, BrowserTabVisibility],
9
17
 
10
18
  data() {
11
19
  const store = this.$store;
@@ -24,6 +32,8 @@ export default {
24
32
  computed: {
25
33
  ...mapState(['error']),
26
34
  ...mapGetters(['isSingleProduct']),
35
+ ...mapState(['managementReady']),
36
+ ...mapGetters(['showTopLevelMenu']),
27
37
 
28
38
  home() {
29
39
  if (this.isSingleProduct?.afterLoginRoute) {
@@ -47,48 +57,68 @@ export default {
47
57
  </script>
48
58
 
49
59
  <template>
50
- <div v-if="error">
51
- <main class="main-layout error">
52
- <div class="text-center">
53
- <BrandImage
54
- file-name="error-desert-landscape.svg"
55
- width="900"
56
- height="300"
57
- />
58
- <h1 v-if="error.status">
59
- HTTP Error {{ error.status }}: {{ error.statusText }}
60
- </h1>
61
- <h1 v-else>
62
- Error
63
- </h1>
64
- <h2
60
+ <div class="dashboard-root">
61
+ <FixedBanner :header="true" />
62
+ <div
63
+ class="dashboard-content"
64
+ :class="{'dashboard-padding-left': showTopLevelMenu}"
65
+ >
66
+ <Header
67
+ v-if="managementReady"
68
+ :simple="true"
69
+ />
70
+
71
+ <main class="main-layout">
72
+ <div
65
73
  v-if="error"
66
- class="text-secondary mt-20"
67
- >
68
- {{ displayError }}
69
- </h2>
70
- <p class="mt-20">
71
- <a
72
- :href="home"
73
- class="btn role-primary"
74
- >
75
- {{ t('nav.home') }}
76
- </a>
77
- </p>
78
- <hr
79
- class="custom-content"
80
- :style="styles"
74
+ class="outlet"
81
75
  >
82
- <p class="mt-20">
83
- <a
84
- class="btn role-secondary"
85
- @click="$router.push(previousRoute.fullPath)"
86
- >
87
- {{ t('nav.failWhale.reload') }}
88
- </a>
89
- </p>
90
- </div>
91
- </main>
76
+ <main class="main-layout error">
77
+ <div class="text-center">
78
+ <BrandImage
79
+ file-name="error-desert-landscape.svg"
80
+ width="900"
81
+ height="300"
82
+ />
83
+ <h1 v-if="error.status">
84
+ HTTP Error {{ error.status }}: {{ error.statusText }}
85
+ </h1>
86
+ <h1 v-else>
87
+ Error
88
+ </h1>
89
+ <h2
90
+ v-if="error"
91
+ class="text-secondary mt-20"
92
+ >
93
+ {{ displayError }}
94
+ </h2>
95
+ <p class="mt-20">
96
+ <a
97
+ :href="home"
98
+ class="btn role-primary"
99
+ >
100
+ {{ t('nav.home') }}
101
+ </a>
102
+ </p>
103
+ <hr
104
+ class="custom-content"
105
+ :style="styles"
106
+ >
107
+ <p class="mt-20">
108
+ <a
109
+ class="btn role-secondary"
110
+ @click="$router.push(previousRoute.fullPath)"
111
+ >
112
+ {{ t('nav.failWhale.reload') }}
113
+ </a>
114
+ </p>
115
+ </div>
116
+ </main>
117
+ </div>
118
+ </main>
119
+ </div>
120
+ <FixedBanner :footer="true" />
121
+ <GrowlManager />
92
122
  </div>
93
123
  </template>
94
124
 
@@ -130,4 +160,36 @@ export default {
130
160
  top: -12px;
131
161
  }
132
162
  }
163
+
164
+ .dashboard-root {
165
+ display: flex;
166
+ flex-direction: column;
167
+ height: 100vh;
168
+ }
169
+
170
+ .dashboard-content {
171
+ display: grid;
172
+ flex-grow:1;
173
+
174
+ grid-template-areas:
175
+ "header"
176
+ "main";
177
+
178
+ grid-template-columns: auto;
179
+ grid-template-rows: var(--header-height) auto;
180
+
181
+ > HEADER {
182
+ grid-area: header;
183
+ }
184
+ }
185
+
186
+ MAIN {
187
+ grid-area: main;
188
+ overflow: auto;
189
+
190
+ .outlet {
191
+ min-height: 100%;
192
+ padding: 0;
193
+ }
194
+ }
133
195
  </style>
package/pages/home.vue CHANGED
@@ -19,6 +19,7 @@ import { getVendor } from '@shell/config/private-label';
19
19
  import { mapFeature, MULTI_CLUSTER } from '@shell/store/features';
20
20
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
21
21
  import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
22
+ import TabTitle from '@shell/components/TabTitle';
22
23
 
23
24
  import { RESET_CARDS_ACTION, SET_LOGIN_ACTION } from '@shell/config/page-actions';
24
25
 
@@ -33,6 +34,7 @@ export default {
33
34
  BadgeState,
34
35
  CommunityLinks,
35
36
  SingleClusterInfo,
37
+ TabTitle
36
38
  },
37
39
 
38
40
  mixins: [PageHeaderActions],
@@ -89,6 +91,10 @@ export default {
89
91
  ...mapGetters(['currentCluster', 'defaultClusterId', 'releaseNotesUrl']),
90
92
  mcm: mapFeature(MULTI_CLUSTER),
91
93
 
94
+ mgmtClusters() {
95
+ return this.$store.getters['management/all'](MANAGEMENT.CLUSTER);
96
+ },
97
+
92
98
  provClusters() {
93
99
  return this.$store.getters['management/all'](CAPI.RANCHER_CLUSTER);
94
100
  },
@@ -164,15 +170,16 @@ export default {
164
170
  },
165
171
  {
166
172
  label: this.t('landing.clusters.provider'),
173
+ subLabel: this.t('landing.clusters.distro'),
167
174
  value: 'mgmt.status.provider',
168
175
  name: 'Provider',
169
176
  sort: ['mgmt.status.provider'],
170
177
  formatter: 'ClusterProvider'
171
178
  },
172
179
  {
173
- label: this.t('landing.clusters.kubernetesVersion'),
174
- value: 'kubernetesVersion',
175
- name: 'Kubernetes Version'
180
+ label: this.t('landing.clusters.kubernetesVersion'),
181
+ subLabel: this.t('landing.clusters.architecture'),
182
+ name: 'kubernetesVersion',
176
183
  },
177
184
  {
178
185
  label: this.t('tableHeaders.cpu'),
@@ -204,7 +211,15 @@ export default {
204
211
  },
205
212
 
206
213
  kubeClusters() {
207
- return filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.provClusters || [], this.$store), this.$store);
214
+ const filteredClusters = filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.provClusters || [], this.$store), this.$store);
215
+
216
+ return filteredClusters.map((provCluster) => {
217
+ const mgmtCluster = this.mgmtClusters?.find((c) => provCluster.mgmt?.id === c.id);
218
+
219
+ provCluster.description = provCluster.description || mgmtCluster?.description;
220
+
221
+ return provCluster;
222
+ });
208
223
  }
209
224
  },
210
225
 
@@ -298,6 +313,12 @@ export default {
298
313
  v-if="managementReady"
299
314
  class="home-page"
300
315
  >
316
+ <TabTitle
317
+ :show-child="false"
318
+ :breadcrumb="false"
319
+ >
320
+ {{ vendor }}
321
+ </TabTitle>
301
322
  <BannerGraphic
302
323
  :small="true"
303
324
  :title="t('landing.welcomeToRancher', {vendor})"
@@ -382,49 +403,71 @@ export default {
382
403
  #header-middle
383
404
  >
384
405
  <div class="table-heading">
385
- <n-link
406
+ <router-link
386
407
  v-if="canManageClusters"
387
408
  :to="manageLocation"
388
409
  class="btn btn-sm role-secondary"
389
410
  data-testid="cluster-management-manage-button"
390
411
  >
391
412
  {{ t('cluster.manageAction') }}
392
- </n-link>
393
- <n-link
413
+ </router-link>
414
+ <router-link
394
415
  v-if="canCreateCluster"
395
416
  :to="importLocation"
396
417
  class="btn btn-sm role-primary"
397
418
  data-testid="cluster-create-import-button"
398
419
  >
399
420
  {{ t('cluster.importAction') }}
400
- </n-link>
401
- <n-link
421
+ </router-link>
422
+ <router-link
402
423
  v-if="canCreateCluster"
403
424
  :to="createLocation"
404
425
  class="btn btn-sm role-primary"
405
426
  data-testid="cluster-create-button"
406
427
  >
407
428
  {{ t('generic.create') }}
408
- </n-link>
429
+ </router-link>
409
430
  </div>
410
431
  </template>
411
432
  <template #col:name="{row}">
412
- <td>
433
+ <td class="col-name">
413
434
  <div class="list-cluster-name">
414
- <span v-if="row.mgmt">
415
- <n-link
435
+ <p
436
+ v-if="row.mgmt"
437
+ class="cluster-name"
438
+ >
439
+ <router-link
416
440
  v-if="row.mgmt.isReady && !row.hasError"
417
441
  :to="{ name: 'c-cluster-explorer', params: { cluster: row.mgmt.id }}"
418
442
  >
419
443
  {{ row.nameDisplay }}
420
- </n-link>
444
+ </router-link>
421
445
  <span v-else>{{ row.nameDisplay }}</span>
422
- </span>
423
- <i
424
- v-if="row.unavailableMachines"
425
- v-clean-tooltip="row.unavailableMachines"
426
- class="conditions-alert-icon icon-alert icon"
427
- />
446
+ <i
447
+ v-if="row.unavailableMachines"
448
+ v-clean-tooltip="row.unavailableMachines"
449
+ class="conditions-alert-icon icon-alert icon"
450
+ />
451
+ </p>
452
+ <p
453
+ v-if="row.description"
454
+ class="cluster-description"
455
+ >
456
+ {{ row.description }}
457
+ </p>
458
+ </div>
459
+ </td>
460
+ </template>
461
+ <template #col:kubernetesVersion="{row}">
462
+ <td class="col-name">
463
+ <span>
464
+ {{ row.kubernetesVersion }}
465
+ </span>
466
+ <div
467
+ v-clean-tooltip="{content: row.architecture.tooltip, placement: 'left'}"
468
+ class="text-muted"
469
+ >
470
+ {{ row.architecture.label }}
428
471
  </div>
429
472
  </td>
430
473
  </template>
@@ -445,9 +488,9 @@ export default {
445
488
  </td>
446
489
  </template>
447
490
  <!-- <template #cell:explorer="{row}">
448
- <n-link v-if="row && row.isReady" class="btn btn-sm role-primary" :to="{name: 'c-cluster', params: {cluster: row.id}}">
491
+ <router-link v-if="row && row.isReady" class="btn btn-sm role-primary" :to="{name: 'c-cluster', params: {cluster: row.id}}">
449
492
  {{ t('landing.clusters.explore') }}
450
- </n-link>
493
+ </router-link>
451
494
  <button v-else :disabled="true" class="btn btn-sm role-primary">
452
495
  {{ t('landing.clusters.explore') }}
453
496
  </button>
@@ -525,9 +568,23 @@ export default {
525
568
  white-space: nowrap;
526
569
  }
527
570
 
571
+ .col-name {
572
+ max-width: 280px;
573
+ }
574
+
528
575
  .list-cluster-name {
529
- align-items: center;
530
- display: flex;
576
+
577
+ .cluster-name {
578
+ display: flex;
579
+ align-items: center;
580
+ }
581
+
582
+ .cluster-description {
583
+ white-space: nowrap;
584
+ overflow: hidden;
585
+ text-overflow: ellipsis;
586
+ color: var(--muted);
587
+ }
531
588
 
532
589
  .conditions-alert-icon {
533
590
  color: var(--error);
package/pages/prefs.vue CHANGED
@@ -16,10 +16,11 @@ import {
16
16
  import LabeledSelect from '@shell/components/form/LabeledSelect';
17
17
  import { addObject } from '@shell/utils/array';
18
18
  import LocaleSelector from '@shell/components/LocaleSelector';
19
+ import TabTitle from '@shell/components/TabTitle';
19
20
 
20
21
  export default {
21
22
  components: {
22
- BackLink, ButtonGroup, LabeledSelect, Checkbox, LandingPagePreference, LocaleSelector
23
+ BackLink, ButtonGroup, LabeledSelect, Checkbox, LandingPagePreference, LocaleSelector, TabTitle
23
24
  },
24
25
  mixins: [BackRoute],
25
26
  data() {
@@ -173,9 +174,13 @@ export default {
173
174
  <div>
174
175
  <BackLink :link="backLink" />
175
176
  <h1
176
- v-t="'prefs.title'"
177
177
  class="mb-20"
178
- />
178
+ >
179
+ <TabTitle breadcrumb="vendor-only">
180
+ {{ t('prefs.title') }}
181
+ </TabTitle>
182
+ </h1>
183
+
179
184
  <!-- Language -->
180
185
  <div class="mt-10 mb-10">
181
186
  <h4 v-t="'prefs.language'" />