dashboard-shell-shell 1.0.122 → 1.0.1000000082

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +88 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +26 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +542 -553
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +9 -1
  343. package/types/cloud-shell/index.d.ts +11020 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
@@ -129,6 +129,13 @@ export default {
129
129
  },
130
130
 
131
131
  data() {
132
+ return {
133
+ testing: null,
134
+ isSlo: null,
135
+ };
136
+ },
137
+
138
+ created() {
132
139
  const stateJSON = this.$route.query[GITHUB_NONCE] || '';
133
140
 
134
141
  let parsed = {};
@@ -140,13 +147,8 @@ export default {
140
147
 
141
148
  const { test } = parsed;
142
149
 
143
- // Is Single Log Out
144
- const isSlo = this.$route.query[IS_SLO] === _FLAGGED;
145
-
146
- return {
147
- testing: test,
148
- isSlo
149
- };
150
+ this.testing = test;
151
+ this.isSlo = this.$route.query[IS_SLO] === _FLAGGED;
150
152
  },
151
153
 
152
154
  mounted() {
@@ -182,7 +184,10 @@ export default {
182
184
  </script>
183
185
 
184
186
  <template>
185
- <main class="main-layout">
187
+ <main
188
+ class="main-layout"
189
+ :aria-label="t('layouts.verify')"
190
+ >
186
191
  <h1 class="text-center mt-50">
187
192
  <span v-if="testing">
188
193
  Testing Configuration&hellip;
@@ -0,0 +1,595 @@
1
+ <script>
2
+ import { removeObject } from '@shell/utils/array';
3
+ import { USERNAME } from '@shell/config/cookies';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
+ import AsyncButton from '@shell/components/AsyncButton';
6
+ import LocaleSelector from '@shell/components/LocaleSelector';
7
+ import BrandImage from '@shell/components/BrandImage';
8
+ import InfoBox from '@shell/components/InfoBox';
9
+ import CopyCode from '@shell/components/CopyCode';
10
+ import { Banner } from '@components/Banner';
11
+ import {
12
+ LOCAL, LOGGED_OUT, TIMED_OUT, IS_SSO, _FLAGGED,
13
+ IS_SLO
14
+ } from '@shell/config/query-params';
15
+ import { Checkbox } from '@components/Form/Checkbox';
16
+ import Password from '@shell/components/form/Password';
17
+ import { sortBy } from '@shell/utils/sort';
18
+ import { configType } from '@shell/models/management.cattle.io.authconfig';
19
+ import { mapGetters } from 'vuex';
20
+ import { markRaw } from 'vue';
21
+ import { _MULTI } from '@shell/plugins/dashboard-store/actions';
22
+ import { MANAGEMENT, NORMAN } from '@shell/config/types';
23
+ import { SETTING } from '@shell/config/settings';
24
+ import { LOGIN_ERRORS } from '@shell/store/auth';
25
+ import {
26
+ getBrand,
27
+ getVendor,
28
+ setBrand,
29
+ setVendor
30
+ } from '@shell/config/private-label';
31
+ import loadPlugins from '@shell/plugins/plugin';
32
+ import Loading from '@shell/components/Loading';
33
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
34
+ import TabTitle from '@shell/components/TabTitle.vue';
35
+ import { harvester2cloud } from '@shell/utils/router'
36
+
37
+ export default {
38
+ name: 'Login',
39
+ components: {
40
+ LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password, LocaleSelector, Loading, TabTitle
41
+ },
42
+
43
+ data() {
44
+ return {
45
+ username: '',
46
+ remember: false,
47
+ password: '',
48
+
49
+ timedOut: this.$route.query[TIMED_OUT] === _FLAGGED,
50
+ loggedOut: this.$route.query[LOGGED_OUT] === _FLAGGED,
51
+ isSsoLogout: this.$route.query[IS_SSO] === _FLAGGED,
52
+ isSlo: this.$route.query[IS_SLO] === _FLAGGED,
53
+ err: this.$route.query.err,
54
+ showLocaleSelector: !process.env.loginLocaleSelector || process.env.loginLocaleSelector === 'true',
55
+
56
+ hasLocal: false,
57
+ showLocal: false,
58
+ providers: [],
59
+ providerComponents: [],
60
+ customLoginError: {},
61
+ firstLogin: false,
62
+ vendor: getVendor()
63
+ };
64
+ },
65
+
66
+ computed: {
67
+ ...mapGetters(['isSingleProduct']),
68
+ ...mapGetters({ t: 'i18n/t', hasMultipleLocales: 'i18n/hasMultipleLocales' }),
69
+
70
+ loggedOutSuccessMsg() {
71
+ if (this.isSlo) {
72
+ return this.t('login.loggedOutFromSlo');
73
+ } else if (this.isSsoLogout) {
74
+ return this.t('login.loggedOutFromSso');
75
+ }
76
+
77
+ return this.t('login.loggedOut');
78
+ },
79
+
80
+ isHarvester() {
81
+ return this.isSingleProduct?.productName === harvester2cloud(HARVESTER);
82
+ },
83
+
84
+ singleProvider() {
85
+ return this.providers.length === 1 ? this.providers[0] : undefined;
86
+ },
87
+
88
+ nonLocalPrompt() {
89
+ if (this.singleProvider) {
90
+ const provider = this.displayName(this.singleProvider);
91
+
92
+ return this.t('login.useProvider', { provider });
93
+ }
94
+
95
+ return this.t('login.useNonLocal');
96
+ },
97
+
98
+ errorMessage() {
99
+ if (this.isSlo) {
100
+ return this.err?.length ? this.t('logout.error', { msg: this.err }) : '';
101
+ }
102
+
103
+ if (this.err === LOGIN_ERRORS.CLIENT_UNAUTHORIZED) {
104
+ return this.t('login.clientError');
105
+ } else if (this.err === LOGIN_ERRORS.CLIENT || this.err === LOGIN_ERRORS.SERVER) {
106
+ return this.t('login.error');
107
+ } else if (this.err === LOGIN_ERRORS.NONCE) {
108
+ return this.t('login.invalidResponseError');
109
+ } else if (this.err === LOGIN_ERRORS.USER_UNAUTHORIZED) {
110
+ return this.t('login.userUnauthorized');
111
+ }
112
+
113
+ return this.err?.length ? this.t('login.specificError', { msg: this.err }) : '';
114
+ },
115
+
116
+ errorToDisplay() {
117
+ if (this.customLoginError?.showMessage === 'true' && this.customLoginError?.message && this.errorMessage) {
118
+ return `${ this.customLoginError.message } \n ${ this.errorMessage }`;
119
+ }
120
+
121
+ if (this.errorMessage) {
122
+ return this.errorMessage;
123
+ }
124
+
125
+ return '';
126
+ },
127
+
128
+ kubectlCmd() {
129
+ return "kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{\"\\n\"}}'";
130
+ },
131
+
132
+ hasLoginMessage() {
133
+ return this.errorToDisplay || this.loggedOut || this.timedOut;
134
+ },
135
+ },
136
+
137
+ async fetch() {
138
+ const username = this.$cookies.get(USERNAME, { parseJSON: false }) || '';
139
+
140
+ this.username = username;
141
+ this.remember = !!username;
142
+
143
+ const { firstLoginSetting } = await this.loadInitialSettings();
144
+ const { value } = await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.BANNERS });
145
+ const drivers = await this.$store.dispatch('auth/getAuthProviders');
146
+ const providers = sortBy(drivers.map((x) => x.id), ['id']);
147
+ const hasLocal = providers.includes('local');
148
+ const hasOthers = hasLocal && !!providers.find((x) => x !== 'local');
149
+
150
+ if ( hasLocal ) {
151
+ // Local is special and handled here so that it can be toggled
152
+ removeObject(providers, 'local');
153
+ }
154
+
155
+ this.vendor = getVendor();
156
+ this.providers = providers;
157
+ this.hasLocal = hasLocal;
158
+ this.showLocal = !hasOthers || (this.$route.query[LOCAL] === _FLAGGED);
159
+ this.customLoginError = JSON.parse(value).loginError;
160
+ this.firstLogin = firstLoginSetting?.value === 'true';
161
+ this.username = this.firstLogin ? 'admin' : this.username;
162
+
163
+ this.providerComponents = this.providers.map((name) => {
164
+ return markRaw(this.$store.getters['type-map/importLogin'](configType[name] || name));
165
+ });
166
+
167
+ this.$nextTick(() => {
168
+ this.focusSomething();
169
+ });
170
+ },
171
+
172
+ methods: {
173
+ async loadInitialSettings() {
174
+ let firstLoginSetting, plSetting, brand;
175
+
176
+ // Load settings.
177
+ // For newer versions this will return all settings if you are somehow logged in,
178
+ // and just the public ones if you aren't.
179
+ try {
180
+ firstLoginSetting = this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.FIRST_LOGIN);
181
+ plSetting = this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.PL);
182
+ brand = this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.BRAND);
183
+ } catch (e) {
184
+ // Older versions used Norman API to get these
185
+ firstLoginSetting = await this.$store.dispatch('rancher/find', {
186
+ type: NORMAN.SETTING,
187
+ id: SETTING.FIRST_LOGIN,
188
+ opt: { url: `/v3/settings/${ SETTING.FIRST_LOGIN }` }
189
+ });
190
+
191
+ plSetting = await this.$store.dispatch('rancher/find', {
192
+ type: NORMAN.SETTING,
193
+ id: SETTING.PL,
194
+ opt: { url: `/v3/settings/${ SETTING.PL }` }
195
+ });
196
+
197
+ brand = await this.$store.dispatch('rancher/find', {
198
+ type: NORMAN.SETTING,
199
+ id: SETTING.BRAND,
200
+ opt: { url: `/v3/settings/${ SETTING.BRAND }` }
201
+ });
202
+ }
203
+
204
+ if (plSetting.value?.length && plSetting.value !== getVendor()) {
205
+ setVendor(plSetting.value);
206
+ }
207
+
208
+ if (brand?.value?.length && brand.value !== getBrand()) {
209
+ setBrand(brand.value);
210
+ }
211
+
212
+ return {
213
+ firstLoginSetting, plSetting, brand
214
+ };
215
+ },
216
+
217
+ displayName(provider) {
218
+ return this.t(`model.authConfig.provider.${ provider }`);
219
+ },
220
+
221
+ toggleLocal() {
222
+ this.showLocal = !this.showLocal;
223
+ this.$router.applyQuery({ [LOCAL]: _FLAGGED });
224
+ this.$nextTick(() => {
225
+ this.focusSomething();
226
+ });
227
+ },
228
+
229
+ focusSomething() {
230
+ if ( !this.showLocal ) {
231
+ // One of the provider components will handle it
232
+ return;
233
+ }
234
+
235
+ let elem;
236
+
237
+ if ( this.username ) {
238
+ elem = this.$refs.password;
239
+ } else {
240
+ elem = this.$refs.username;
241
+ }
242
+
243
+ if ( elem?.focus ) {
244
+ elem.focus();
245
+
246
+ if ( elem.select ) {
247
+ elem.select();
248
+ }
249
+ }
250
+ },
251
+
252
+ handleProviderError(err) {
253
+ this.err = err;
254
+ },
255
+
256
+ async loginLocal(buttonCb) {
257
+ try {
258
+ await this.$store.dispatch('auth/login', {
259
+ provider: 'local',
260
+ body: {
261
+ username: this.username,
262
+ password: this.password
263
+ }
264
+ });
265
+
266
+ const user = await this.$store.dispatch('rancher/findAll', {
267
+ type: NORMAN.USER,
268
+ opt: { url: '/v3/users?me=true', load: _MULTI }
269
+ });
270
+
271
+ if (!!user?.[0]) {
272
+ this.$store.dispatch('auth/gotUser', user[0]);
273
+ }
274
+
275
+ if ( this.remember ) {
276
+ this.$cookies.set(USERNAME, this.username, {
277
+ encode: (x) => x,
278
+ maxAge: 86400 * 365,
279
+ path: '/',
280
+ sameSite: true,
281
+ secure: true,
282
+ });
283
+ } else {
284
+ this.$cookies.remove(USERNAME);
285
+ }
286
+
287
+ // User logged with local login - we don't do any redirect/reload, so the boot-time plugin will not run again to laod the plugins
288
+ // so we manually load them here - other SSO auth providers bounce out and back to the Dashboard, so on the bounce-back
289
+ // the plugins will load via the boot-time plugin
290
+ await loadPlugins({
291
+ app: this.$store.app,
292
+ store: this.$store,
293
+ $plugin: this.$store.$plugin
294
+ });
295
+
296
+ if (this.firstLogin || user[0]?.mustChangePassword) {
297
+ this.$store.dispatch('auth/setInitialPass', this.password);
298
+ this.$router.push({ name: 'auth-setup' });
299
+ } else {
300
+ this.$router.push({ name: 'index' });
301
+ }
302
+ } catch (err) {
303
+ this.err = err;
304
+ this.timedOut = null;
305
+ this.loggedOut = null;
306
+
307
+ buttonCb(false);
308
+ }
309
+ },
310
+ }
311
+ };
312
+ </script>
313
+
314
+ <template>
315
+ <Loading
316
+ v-if="$fetchState.pending"
317
+ mode="relative"
318
+ />
319
+ <div
320
+ v-else
321
+ class="main-layout login"
322
+ >
323
+ <TabTitle
324
+ :show-child="false"
325
+ :breadcrumb="false"
326
+ >
327
+ {{ `${vendor} - ${t('login.login')}` }}
328
+ </TabTitle>
329
+ <div class="row gutless mb-20">
330
+ <div class="col span-6 p-20">
331
+ <p class="text-center">
332
+ {{ t('login.howdy') }}
333
+ </p>
334
+ <h1 class="text-center login-welcome">
335
+ {{ t('login.welcome', {vendor}) }}
336
+ </h1>
337
+ <div
338
+ class="login-messages"
339
+ data-testid="login__messages"
340
+ :class="{'login-messages--hasContent': hasLoginMessage}"
341
+ >
342
+ <Banner
343
+ v-if="errorToDisplay"
344
+ :label="errorToDisplay"
345
+ color="error"
346
+ />
347
+ <h4
348
+ v-else-if="loggedOut"
349
+ class="text-success text-center"
350
+ >
351
+ {{ loggedOutSuccessMsg }}
352
+ </h4>
353
+ <h4
354
+ v-else-if="timedOut"
355
+ class="text-error text-center"
356
+ >
357
+ {{ t('login.loginAgain') }}
358
+ </h4>
359
+ </div>
360
+ <div
361
+ v-if="firstLogin"
362
+ class="first-login-message pl-10 pr-10"
363
+ :class="{'mt-30': !hasLoginMessage}"
364
+ data-testid="first-login-message"
365
+ >
366
+ <t
367
+ k="setup.defaultPassword.intro"
368
+ :raw="true"
369
+ />
370
+
371
+ <div>
372
+ <t
373
+ k="setup.defaultPassword.dockerPrefix"
374
+ :raw="true"
375
+ />
376
+ </div>
377
+ <ul>
378
+ <li>
379
+ <t
380
+ k="setup.defaultPassword.dockerPs"
381
+ :raw="true"
382
+ />
383
+ </li>
384
+ <li>
385
+ <CopyCode>
386
+ docker logs <u>container-id</u> 2&gt;&amp;1 | grep "Bootstrap Password:"
387
+ </CopyCode>
388
+ </li>
389
+ </ul>
390
+ <div>
391
+ <t
392
+ k="setup.defaultPassword.dockerSuffix"
393
+ :raw="true"
394
+ />
395
+ </div>
396
+
397
+ <br>
398
+ <div>
399
+ <t
400
+ k="setup.defaultPassword.helmPrefix"
401
+ :raw="true"
402
+ />
403
+ </div>
404
+ <br>
405
+ <CopyCode>
406
+ {{ kubectlCmd }}
407
+ </CopyCode>
408
+ <br>
409
+ <div>
410
+ <t
411
+ k="setup.defaultPassword.helmSuffix"
412
+ :raw="true"
413
+ />
414
+ </div>
415
+ </div>
416
+
417
+ <div
418
+ v-if="(!hasLocal || (hasLocal && !showLocal)) && providers.length"
419
+ :class="{'mt-30': !hasLoginMessage}"
420
+ >
421
+ <component
422
+ :is="providerComponents[idx]"
423
+ v-for="(name, idx) in providers"
424
+ :key="idx"
425
+ class="mb-10"
426
+ :focus-on-mount="(idx === 0 && !showLocal)"
427
+ :name="name"
428
+ :open="!showLocal"
429
+ @showInputs="showLocal = false"
430
+ @error="handleProviderError"
431
+ />
432
+ </div>
433
+ <template v-if="hasLocal">
434
+ <form
435
+ v-if="showLocal"
436
+ :class="{'mt-30': !hasLoginMessage}"
437
+ @submit.prevent
438
+ >
439
+ <div class="span-6 offset-3">
440
+ <div class="mb-20">
441
+ <LabeledInput
442
+ v-if="!firstLogin"
443
+ ref="username"
444
+ v-model:value.trim="username"
445
+ data-testid="local-login-username"
446
+ :label="t('login.username')"
447
+ autocomplete="username"
448
+ />
449
+ </div>
450
+ <div class="">
451
+ <Password
452
+ ref="password"
453
+ v-model:value="password"
454
+ data-testid="local-login-password"
455
+ :label="t('login.password')"
456
+ autocomplete="password"
457
+ />
458
+ </div>
459
+ </div>
460
+ <div class="mt-20">
461
+ <div class="col span-12 text-center">
462
+ <AsyncButton
463
+ id="submit"
464
+ data-testid="login-submit"
465
+ type="submit"
466
+ :action-label="t('login.loginWithLocal')"
467
+ :waiting-label="t('login.loggingIn')"
468
+ :success-label="t('login.loggedIn')"
469
+ :error-label="t('asyncButton.default.error')"
470
+ @click="loginLocal"
471
+ />
472
+ <div
473
+ v-if="!firstLogin"
474
+ class="mt-20"
475
+ >
476
+ <Checkbox
477
+ v-model:value="remember"
478
+ :label="t('login.remember.label')"
479
+ type="checkbox"
480
+ />
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </form>
485
+ <div
486
+ v-if="hasLocal && !showLocal"
487
+ class="mt-20 text-center"
488
+ >
489
+ <a
490
+ id="login-useLocal"
491
+ data-testid="login-useLocal"
492
+ role="button"
493
+ @click="toggleLocal"
494
+ >
495
+ {{ t('login.useLocal') }}
496
+ </a>
497
+ </div>
498
+ <div
499
+ v-if="hasLocal && showLocal && providers.length"
500
+ class="mt-20 text-center"
501
+ >
502
+ <a
503
+ role="button"
504
+ @click="toggleLocal"
505
+ >
506
+ {{ nonLocalPrompt }}
507
+ </a>
508
+ </div>
509
+ </template>
510
+ <div
511
+ v-if="showLocaleSelector && hasMultipleLocales && !isHarvester"
512
+ class="locale-selector"
513
+ >
514
+ <LocaleSelector
515
+ mode="login"
516
+ />
517
+ </div>
518
+ </div>
519
+ <BrandImage
520
+ class="col span-6 landscape"
521
+ data-testid="login-landscape__img"
522
+ file-name="login-landscape.svg"
523
+ :alt="t('login.landscapeAlt')"
524
+ />
525
+ </div>
526
+ </div>
527
+ </template>
528
+
529
+ <style lang="scss" scoped>
530
+ .login {
531
+ overflow: hidden;
532
+ position: relative; // Used to keep the locale selector positioned correctly
533
+
534
+ .row {
535
+ align-items: center;
536
+ }
537
+
538
+ .landscape {
539
+ height: 100vh;
540
+ margin: 0;
541
+ object-fit: cover;
542
+ }
543
+
544
+ .login-welcome {
545
+ margin: 0
546
+ }
547
+
548
+ .login-messages {
549
+ display: flex;
550
+ justify-content: center;
551
+ align-items: center;
552
+
553
+ .banner {
554
+ margin: 5px;
555
+ }
556
+ h4 {
557
+ margin: 0;
558
+ }
559
+ &--hasContent {
560
+ min-height: 70px;
561
+ }
562
+
563
+ .text-error, .banner {
564
+ max-width: 80%;
565
+ }
566
+ }
567
+
568
+ .first-login-message {
569
+ .banner {
570
+ margin-bottom: 0;
571
+ border-left: 0;
572
+
573
+ :deep() code {
574
+ font-size: 12px;
575
+ padding: 0;
576
+ }
577
+ }
578
+ }
579
+ }
580
+
581
+ .gutless {
582
+ height: 100vh;
583
+ & > .span-6 {
584
+ overflow-y: auto;
585
+ display: flex;
586
+ flex-direction: column;
587
+ height: 100%;
588
+ place-content: center;
589
+ }
590
+ }
591
+ .locale-selector {
592
+ position: absolute;
593
+ bottom: 30px;
594
+ }
595
+ </style>
@@ -0,0 +1,47 @@
1
+ <script>
2
+ import { configType } from '@shell/models/management.cattle.io.authconfig';
3
+
4
+ export default {
5
+ async fetch() {
6
+ const publicAuthProviders = await this.$store.dispatch('auth/getAuthProviders');
7
+
8
+ const samlAuthProvider = publicAuthProviders.find((authProvider) => configType[authProvider.id] === 'saml');
9
+
10
+ if (!!samlAuthProvider) {
11
+ const { logoutAllSupported, logoutAllEnabled, logoutAllForced } = samlAuthProvider;
12
+
13
+ if (logoutAllSupported && logoutAllEnabled && logoutAllForced) {
14
+ // SAML - force SLO (logout from all apps)
15
+ await this.$store.dispatch('auth/logout', {
16
+ force: true, slo: true, provider: samlAuthProvider
17
+ }, { root: true });
18
+ } else {
19
+ // simple logout
20
+ await this.$store.dispatch('auth/logout', { force: true }, { root: true });
21
+ }
22
+ } else {
23
+ // simple logout
24
+ await this.$store.dispatch('auth/logout', { force: true }, { root: true });
25
+ }
26
+ }
27
+ };
28
+ </script>
29
+
30
+ <template>
31
+ <main
32
+ class="main-layout"
33
+ :aria-label="t('layouts.logout')"
34
+ >
35
+ <div>
36
+ <h1 v-t="'logout.message'" />
37
+ </div>
38
+ </main>
39
+ </template>
40
+ <style lang="scss" scoped>
41
+ main > div {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ height: 100vh;
46
+ }
47
+ </style>