@rancher/shell 1.2.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -1,331 +1,28 @@
1
- import { REDIRECTED } from '@shell/config/cookies';
2
- import { NAME as EXPLORER } from '@shell/config/product/explorer';
3
- import {
4
- SETUP, TIMED_OUT, UPGRADED, _FLAGGED, _UNFLAG
5
- } from '@shell/config/query-params';
6
- import { SETTING } from '@shell/config/settings';
7
- import { MANAGEMENT, NORMAN, DEFAULT_WORKSPACE } from '@shell/config/types';
8
- import { _ALL_IF_AUTHED } from '@shell/plugins/dashboard-store/actions';
1
+ import { DEFAULT_WORKSPACE } from '@shell/config/types';
9
2
  import { applyProducts } from '@shell/store/type-map';
10
- import { findBy } from '@shell/utils/array';
11
- import { ClusterNotFoundError } from '@shell/utils/error';
3
+ import { ClusterNotFoundError, RedirectToError } from '@shell/utils/error';
12
4
  import { get } from '@shell/utils/object';
13
- import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
14
- import dynamicPluginLoader from '@shell/pkg/dynamic-plugin-loader';
15
5
  import { AFTER_LOGIN_ROUTE, WORKSPACE } from '@shell/store/prefs';
16
6
  import { BACK_TO } from '@shell/config/local-storage';
17
7
  import { NAME as FLEET_NAME } from '@shell/config/product/fleet.js';
18
- import { canViewResource } from '@shell/utils/auth';
19
-
20
- const getPackageFromRoute = (route) => {
21
- if (!route?.meta) {
22
- return;
23
- }
24
- // Sometimes meta is an array... sometimes not
25
- const arraySafe = Array.isArray(route.meta) ? route.meta : [route.meta];
26
-
27
- return arraySafe.find((m) => !!m.pkg)?.pkg;
28
- };
29
-
30
- const getResourceFromRoute = (to) => {
31
- let resource = to.params?.resource;
32
-
33
- if (!resource) {
34
- resource = findMeta(to, 'resource');
35
- }
36
-
37
- return resource;
38
- };
8
+ import { validateResource, setProduct } from '@shell/utils/auth';
9
+ import { getClusterFromRoute, getProductFromRoute, getPackageFromRoute } from '@shell/utils/router';
39
10
 
40
11
  let beforeEachSetup = false;
41
12
 
42
- function findMeta(route, key) {
43
- if (route?.meta) {
44
- const meta = Array.isArray(route.meta) ? route.meta : [route.meta];
45
-
46
- for (let i = 0; i < meta.length; i++) {
47
- if (meta[i][key]) {
48
- return meta[i][key];
49
- }
50
- }
51
- }
52
-
53
- return undefined;
54
- }
55
-
56
- export function getClusterFromRoute(to) {
57
- let cluster = to.params?.cluster;
58
-
59
- if (!cluster) {
60
- cluster = findMeta(to, 'cluster');
61
- }
62
-
63
- return cluster;
64
- }
65
-
66
- export function getProductFromRoute(to) {
67
- let product = to.params?.product;
68
-
69
- if ( !product ) {
70
- const match = to.name?.match(/^c-cluster-([^-]+)/);
71
-
72
- if ( match ) {
73
- product = match[1];
74
- }
75
- }
76
-
77
- // If still no product, see if the route indicates the product via route metadata
78
- if (!product) {
79
- product = findMeta(to, 'product');
80
- }
81
-
82
- return product;
83
- }
84
-
85
- function setProduct(store, to, redirect) {
86
- let product = getProductFromRoute(to);
87
-
88
- // since all products are hardcoded as routes (ex: c-local-explorer), if we match the wildcard route it means that the product does not exist
89
- if ((product && (!to.matched.length || (to.matched.length && to.matched[0].path === '/c/:cluster/:product'))) ||
90
- // if the product grabbed from the route is not registered, then we don't have it!
91
- (product && !store.getters['type-map/isProductRegistered'](product))) {
92
- store.dispatch('loadingError', new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true)));
93
-
94
- return () => redirect(302, '/fail-whale');
95
- }
96
-
97
- if ( !product ) {
98
- product = EXPLORER;
99
- }
100
-
101
- const oldProduct = store.getters['productId'];
102
- const oldStore = store.getters['currentProduct']?.inStore;
103
-
104
- if ( product !== oldProduct ) {
105
- store.commit('setProduct', product);
106
- }
107
-
108
- const neuStore = store.getters['currentProduct']?.inStore;
109
-
110
- if ( neuStore !== oldStore ) {
111
- // If the product store changes, clear the catalog.
112
- // There might be management catalog items in it vs cluster.
113
- store.commit('catalog/reset');
114
- }
115
-
116
- return false;
117
- }
118
-
119
- /**
120
- * Check that the resource is valid, if not redirect to fail whale
121
- *
122
- * This requires that
123
- * - product is set
124
- * - product's store is set and setup (so we can check schema's within it)
125
- * - product's store has the schemaFor getter (extension stores might not have it)
126
- * - there's a resource associated with route (meta or param)
127
- */
128
- function invalidResource(store, to, redirect) {
129
- const product = store.getters['currentProduct'];
130
- const resource = getResourceFromRoute(to);
131
-
132
- // In order to check a resource is valid we need these
133
- if (!product || !resource) {
134
- return false;
135
- }
136
-
137
- if (canViewResource(store, resource)) {
138
- return false;
139
- }
140
-
141
- // Unknown resource, redirect to fail whale
142
-
143
- store.dispatch('loadingError', new Error(store.getters['i18n/t']('nav.failWhale.resourceNotFound', { resource }, true)));
144
-
145
- return () => redirect(302, '/fail-whale');
146
- }
147
-
148
13
  export default async function({
149
- route, app, store, redirect, $cookies, req, isDev, from, $plugin, next
14
+ route, store, redirect, from, $plugin, next
150
15
  }) {
151
- if ( route.path && typeof route.path === 'string') {
152
- // Ignore webpack hot module reload requests
153
- if ( route.path.startsWith('/__webpack_hmr/') ) {
154
- return;
155
- }
156
-
157
- // Ignore the error page
158
- if ( route.path.startsWith('/fail-whale') ) {
159
- return;
160
- }
161
- }
162
-
163
- // This tells Ember not to redirect back to us once you've already been to dashboard once.
164
- if ( !$cookies.get(REDIRECTED) ) {
165
- $cookies.set(REDIRECTED, 'true', {
166
- path: '/',
167
- sameSite: true,
168
- secure: true,
169
- });
170
- }
171
-
172
- const upgraded = route.query[UPGRADED] === _FLAGGED;
173
-
174
- if ( upgraded ) {
175
- app.router.applyQuery({ [UPGRADED]: _UNFLAG });
176
-
177
- store.dispatch('growl/success', {
178
- title: store.getters['i18n/t']('serverUpgrade.title'),
179
- message: store.getters['i18n/t']('serverUpgrade.message'),
180
- timeout: 0,
181
- });
182
- }
183
-
184
- // Initial ?setup=admin-password can technically be on any route
185
- let initialPass = route.query[SETUP];
186
- let firstLogin = null;
187
-
188
- try {
189
- // Load settings, which will either be just the public ones if not logged in, or all if you are
190
- await store.dispatch('management/findAll', {
191
- type: MANAGEMENT.SETTING,
192
- opt: {
193
- load: _ALL_IF_AUTHED, url: `/v1/${ MANAGEMENT.SETTING }`, redirectUnauthorized: false
194
- }
195
- });
196
-
197
- // Set the favicon - use custom one from store if set
198
- if (!haveSetFavIcon()) {
199
- setFavIcon(store);
200
- }
201
-
202
- const res = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.FIRST_LOGIN);
203
- const plSetting = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.PL);
204
-
205
- firstLogin = res?.value === 'true';
206
-
207
- if (!initialPass && plSetting?.value === 'Harvester') {
208
- initialPass = 'admin';
209
- }
210
- } catch (e) {
211
- }
212
-
213
- if ( firstLogin === null ) {
214
- try {
215
- const res = await store.dispatch('rancher/find', {
216
- type: 'setting',
217
- id: SETTING.FIRST_LOGIN,
218
- opt: { url: `/v3/settings/${ SETTING.FIRST_LOGIN }` }
219
- });
220
-
221
- firstLogin = res?.value === 'true';
222
-
223
- const plSetting = await store.dispatch('rancher/find', {
224
- type: 'setting',
225
- id: SETTING.PL,
226
- opt: { url: `/v3/settings/${ SETTING.PL }` }
227
- });
228
-
229
- if (!initialPass && plSetting?.value === 'Harvester') {
230
- initialPass = 'admin';
231
- }
232
- } catch (e) {
233
- }
234
- }
235
-
236
- // TODO show error if firstLogin and default pass doesn't work
237
- if ( firstLogin ) {
238
- const ok = await tryInitialSetup(store, initialPass);
239
-
240
- if (ok) {
241
- if (initialPass) {
242
- store.dispatch('auth/setInitialPass', initialPass);
243
- }
244
-
245
- return redirect({ name: 'auth-setup' });
246
- } else {
247
- return redirect({ name: 'auth-login' });
248
- }
249
- }
250
-
251
- // Make sure you're actually logged in
252
- function isLoggedIn(me) {
253
- store.commit('auth/hasAuth', true);
254
- store.commit('auth/loggedInAs', me.id);
255
- }
256
-
257
- function notLoggedIn() {
258
- store.commit('auth/hasAuth', true);
259
-
260
- if ( route.name === 'index' ) {
261
- return redirect(302, '/auth/login');
262
- } else {
263
- return redirect(302, `/auth/login?${ TIMED_OUT }`);
264
- }
265
- }
266
-
267
- function noAuth() {
268
- store.commit('auth/hasAuth', false);
269
- }
270
-
271
16
  if ( store.getters['auth/enabled'] !== false && !store.getters['auth/loggedIn'] ) {
272
- // `await` so we have one successfully request whilst possibly logged in (ensures fromHeader is populated from `x-api-cattle-auth`)
273
- await store.dispatch('auth/getUser');
274
-
275
- const v3User = store.getters['auth/v3User'] || {};
276
-
277
- if (v3User?.mustChangePassword) {
278
- return redirect({ name: 'auth-setup' });
279
- }
280
-
281
- // In newer versions the API calls return the auth state instead of having to make a new call all the time.
282
- const fromHeader = store.getters['auth/fromHeader'];
283
-
284
- if ( fromHeader === 'none' ) {
285
- noAuth();
286
- } else if ( fromHeader === 'true' ) {
287
- const me = await findMe(store);
288
-
289
- isLoggedIn(me);
290
- } else if ( fromHeader === 'false' ) {
291
- notLoggedIn();
292
- } else {
293
- // Older versions look at principals and see what happens
294
- try {
295
- const me = await findMe(store);
296
-
297
- isLoggedIn(me);
298
- } catch (e) {
299
- const status = e?._status;
300
-
301
- if ( status === 404 ) {
302
- noAuth();
303
- } else {
304
- if ( status === 401 ) {
305
- notLoggedIn();
306
- } else {
307
- store.commit('setError', { error: e, locationError: new Error('Auth Middleware') });
308
- if ( process.server ) {
309
- redirect(302, '/fail-whale');
310
- }
311
- }
312
-
313
- return;
314
- }
315
- }
316
- }
317
-
318
- store.dispatch('gcStartIntervals');
17
+ return;
319
18
  }
320
19
 
321
- if (!process.server) {
322
- const backTo = window.localStorage.getItem(BACK_TO);
20
+ const backTo = window.localStorage.getItem(BACK_TO);
323
21
 
324
- if (backTo) {
325
- window.localStorage.removeItem(BACK_TO);
22
+ if (backTo) {
23
+ window.localStorage.removeItem(BACK_TO);
326
24
 
327
- window.location.href = backTo;
328
- }
25
+ window.location.href = backTo;
329
26
  }
330
27
 
331
28
  // GC should be notified of route change before any find/get request is made that might be used for that page
@@ -344,36 +41,20 @@ export default async function({
344
41
 
345
42
  store.app.router.beforeEach((to, from, next) => {
346
43
  // NOTE - This beforeEach runs AFTER this middleware. So anything in this middleware that requires it must set it manually
347
- let redirected = setProduct(store, to, redirect);
348
-
349
- if (redirected) {
350
- return redirected();
351
- }
352
-
353
- redirected = invalidResource(store, to, redirect);
354
-
355
- if (redirected) {
356
- return redirected();
357
- }
44
+ setProduct(store, to);
358
45
 
359
46
  next();
360
47
  });
361
48
 
362
49
  // Call it for the initial pageload
363
- const redirected = setProduct(store, route, redirect);
50
+ setProduct(store, route);
364
51
 
365
- if (redirected) {
366
- return redirected();
367
- }
368
-
369
- if (process.client) {
370
- store.app.router.afterEach((to, from) => {
371
- // Clear state used to record if back button was used for navigation
372
- setTimeout(() => {
373
- window._popStateDetected = false;
374
- }, 1);
375
- });
376
- }
52
+ store.app.router.afterEach((to, from) => {
53
+ // Clear state used to record if back button was used for navigation
54
+ setTimeout(() => {
55
+ window._popStateDetected = false;
56
+ }, 1);
57
+ });
377
58
  }
378
59
 
379
60
  try {
@@ -425,33 +106,11 @@ export default async function({
425
106
  });
426
107
  }
427
108
 
428
- if (!route.matched?.length) {
429
- // If there are no matching routes we could be trying to nav to a page belonging to a dynamic plugin which needs loading
430
- await Promise.all([
431
- ...always,
432
- ]);
433
-
434
- // If a plugin claims the route and is loaded correctly we'll get a route back
435
- const newLocation = await dynamicPluginLoader.check({ route, store });
436
-
437
- // If we have a new location, double check that it's actually valid
438
- const resolvedRoute = newLocation ? store.app.router.resolve(newLocation) : null;
439
-
440
- if (resolvedRoute?.route.matched.length) {
441
- // Note - don't use `redirect` or `store.app.route` (breaks feature by failing to run middleware in default layout)
442
- return next(newLocation);
443
- }
444
- }
445
-
446
109
  // Ensure that the activeNamespaceCache is updated given the change of context either from or to a place where it uses workspaces
447
110
  // When fleet moves to it's own package this should be moved to pkg onEnter/onLeave
448
111
  if ((oldProduct === FLEET_NAME || product === FLEET_NAME) && oldProduct !== product) {
449
112
  // See note above for store.app.router.beforeEach, need to setProduct manually, for the moment do this in a targeted way
450
- const redirected = setProduct(store, route, redirect);
451
-
452
- if (redirected) {
453
- return redirected();
454
- }
113
+ setProduct(store, route);
455
114
 
456
115
  store.commit('updateWorkspace', {
457
116
  value: store.getters['prefs/get'](WORKSPACE) || DEFAULT_WORKSPACE,
@@ -474,11 +133,7 @@ export default async function({
474
133
  ]);
475
134
 
476
135
  if (localCheckResource) {
477
- const redirected = invalidResource(store, route, redirect);
478
-
479
- if (redirected) {
480
- return redirected();
481
- }
136
+ validateResource(store, route, redirect);
482
137
  }
483
138
 
484
139
  if (!clusterId) {
@@ -502,8 +157,10 @@ export default async function({
502
157
  }
503
158
  }
504
159
  } catch (e) {
505
- if ( e instanceof ClusterNotFoundError ) {
160
+ if ( e.name === ClusterNotFoundError.name ) {
506
161
  return redirect(302, '/home');
162
+ } if ( e.name === RedirectToError.name ) {
163
+ return redirect(302, e.url);
507
164
  } else {
508
165
  // Sets error 500 if lost connection to API
509
166
  store.commit('setError', { error: e, locationError: new Error(store.getters['i18n/t']('nav.failWhale.authMiddleware')) });
@@ -512,36 +169,3 @@ export default async function({
512
169
  }
513
170
  }
514
171
  }
515
-
516
- async function findMe(store) {
517
- // First thing we do in loadManagement is fetch principals anyway.... so don't ?me=true here
518
- const principals = await store.dispatch('rancher/findAll', {
519
- type: NORMAN.PRINCIPAL,
520
- opt: {
521
- url: '/v3/principals',
522
- redirectUnauthorized: false,
523
- }
524
- });
525
-
526
- const me = findBy(principals, 'me', true);
527
-
528
- return me;
529
- }
530
-
531
- async function tryInitialSetup(store, password = 'admin') {
532
- try {
533
- const res = await store.dispatch('auth/login', {
534
- provider: 'local',
535
- body: {
536
- username: 'admin',
537
- password
538
- },
539
- });
540
-
541
- return res._status === 200;
542
- } catch (e) {
543
- console.error('Error trying initial setup', e); // eslint-disable-line no-console
544
-
545
- return false;
546
- }
547
- }
@@ -4,15 +4,27 @@ import ChartMixin from '@shell/mixins/chart';
4
4
  import { OPA_GATE_KEEPER_ID } from '@shell/pages/c/_cluster/gatekeeper/index.vue';
5
5
 
6
6
  describe('chartMixin', () => {
7
- const testCases = [[null, 0], [OPA_GATE_KEEPER_ID, 1], ['any_other_id', 0]];
7
+ const testCases = {
8
+ opa: [
9
+ [null, 0],
10
+ [OPA_GATE_KEEPER_ID, 1],
11
+ ['any_other_id', 0]
12
+ ],
13
+ managedApps: [
14
+ [false, false, 0],
15
+ [true, null, 0],
16
+ [true, true, 0],
17
+ [true, false, 1],
18
+ ],
19
+ };
8
20
 
9
- it.each(testCases)(
10
- 'should add OPA deprecation warning properly', (chartId, expected) => {
11
- const localVue = createLocalVue();
21
+ const localVue = createLocalVue();
12
22
 
13
- localVue.use(Vuex);
14
- localVue.mixin(ChartMixin);
23
+ localVue.use(Vuex);
24
+ localVue.mixin(ChartMixin);
15
25
 
26
+ it.each(testCases.opa)(
27
+ 'should add OPA deprecation warning properly', (chartId, expected) => {
16
28
  const store = new Vuex.Store({
17
29
  getters: {
18
30
  currentCluster: () => {},
@@ -37,4 +49,34 @@ describe('chartMixin', () => {
37
49
  expect(warnings).toHaveLength(expected);
38
50
  }
39
51
  );
52
+
53
+ it.each(testCases.managedApps)(
54
+ 'should add managed apps warning properly', (isEdit, upgradeAvailable, expected) => {
55
+ const id = 'cattle-fleet-local-system/fleet-agent-local';
56
+ const data = isEdit ? { existing: { id, upgradeAvailable } } : undefined;
57
+
58
+ const store = new Vuex.Store({
59
+ getters: {
60
+ currentCluster: () => {},
61
+ isRancher: () => true,
62
+ 'catalog/repo': () => {
63
+ return () => 'repo';
64
+ },
65
+ 'catalog/chart': () => {
66
+ return () => ({ id });
67
+ },
68
+ 'i18n/t': () => jest.fn()
69
+ }
70
+ });
71
+
72
+ const vm = localVue.extend({});
73
+ const instance = new vm({ store, data });
74
+
75
+ instance.$route = { query: { chart: 'chart_name' } };
76
+
77
+ const warnings = instance.warnings;
78
+
79
+ expect(warnings).toHaveLength(expected as number);
80
+ }
81
+ );
40
82
  });
@@ -1,6 +1,5 @@
1
1
  import { _EDIT } from '@shell/config/query-params';
2
- import Vue from 'vue';
3
- import { mount, VueClass } from '@vue/test-utils';
2
+ import { mount } from '@vue/test-utils';
4
3
  import CreateEditView from '@shell/mixins/create-edit-view';
5
4
 
6
5
  describe('createEditView should', () => {
@@ -12,7 +11,7 @@ describe('createEditView should', () => {
12
11
  };
13
12
 
14
13
  // TODO: Investigate type to be used for the .vm property to access the component instance instead of using any
15
- const instance = mount(Component as unknown as VueClass<Vue>).vm as any;
14
+ const instance = mount(Component).vm as any;
16
15
 
17
16
  expect(instance.mode).toContain(_EDIT);
18
17
  });
@@ -42,13 +42,8 @@ export default {
42
42
  },
43
43
 
44
44
  serverUrl() {
45
- if (process.client) {
46
- // Client-side rendered: use the current window location
47
- return window.location.origin;
48
- }
49
-
50
- // Server-side rendered
51
- return this.serverSetting || '';
45
+ // Client-side rendered: use the current window location
46
+ return window.location.origin;
52
47
  },
53
48
 
54
49
  baseUrl() {
@@ -60,6 +55,7 @@ export default {
60
55
  },
61
56
 
62
57
  displayName() {
58
+ // i18n-uses model.authConfig.provider.*
63
59
  return this.t(`model.authConfig.provider.${ this.NAME }`);
64
60
  },
65
61
 
@@ -196,7 +192,7 @@ export default {
196
192
  }
197
193
  }
198
194
  if (wasEnabled && configType === 'oauth') {
199
- await this.model.save({ ignoreFields: ['oauthCredential', 'serviceAccountCredential'] });
195
+ await this.model.save({ ignoreFields: ['oauthCredential', 'serviceAccountCredential'] } );
200
196
  } else {
201
197
  await this.model.save();
202
198
  }
@@ -277,7 +273,7 @@ export default {
277
273
 
278
274
  // KeyCloakOIDCConfig --> OIDCConfig
279
275
  set(this.model, 'rancherUrl', `${ serverUrl }/verify-auth`);
280
- set(this.model, 'scope', BASE_SCOPES.keycloakoidc[0]);
276
+ set(this.model, 'scope', this.model.id === 'keycloakoidc' ? BASE_SCOPES.keycloakoidc[0] : BASE_SCOPES.genericoidc[0]);
281
277
  break;
282
278
  }
283
279