dashboard-shell-shell 1.0.122 → 1.0.1000000081

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 +89 -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 +9 -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 +540 -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 +2 -1
  343. package/types/cloud-shell/index.d.ts +11014 -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
@@ -0,0 +1,523 @@
1
+ <script>
2
+ import { randomStr } from '@shell/utils/string';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
+ import CopyToClipboard from '@shell/components/CopyToClipboard';
5
+ import AsyncButton from '@shell/components/AsyncButton';
6
+ import { LOGGED_OUT, SETUP } from '@shell/config/query-params';
7
+ import { NORMAN, MANAGEMENT } from '@shell/config/types';
8
+ import { findBy } from '@shell/utils/array';
9
+ import { Checkbox } from '@components/Form/Checkbox';
10
+ import { getVendor, getProduct, setVendor } from '@shell/config/private-label';
11
+ import { RadioGroup } from '@components/Form/Radio';
12
+ import { setSetting } from '@shell/utils/settings';
13
+ import { SETTING } from '@shell/config/settings';
14
+ import { exceptionToErrorsArray } from '@shell/utils/error';
15
+ import Password from '@shell/components/form/Password';
16
+ import { applyProducts } from '@shell/store/type-map';
17
+ import BrandImage from '@shell/components/BrandImage';
18
+ import { waitFor } from '@shell/utils/async';
19
+ import { Banner } from '@components/Banner';
20
+ import FormValidation from '@shell/mixins/form-validation';
21
+ import isUrl from 'is-url';
22
+ import { isLocalhost } from '@shell/utils/validators/setting';
23
+ import Loading from '@shell/components/Loading';
24
+
25
+ const calcIsFirstLogin = (store) => {
26
+ const firstLoginSetting = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.FIRST_LOGIN);
27
+
28
+ return firstLoginSetting?.value === 'true';
29
+ };
30
+
31
+ const calcMustChangePassword = async(store) => {
32
+ await store.dispatch('auth/getUser');
33
+
34
+ const out = store.getters['auth/v3User']?.mustChangePassword;
35
+
36
+ return out;
37
+ };
38
+
39
+ export default {
40
+ mixins: [FormValidation],
41
+
42
+ data() {
43
+ return {
44
+ passwordOptions: [
45
+ { label: this.t('setup.useRandom'), value: true },
46
+ { label: this.t('setup.useManual'), value: false }],
47
+ fvFormRuleSets: [{
48
+ path: 'serverUrl',
49
+ rootObject: this,
50
+ rules: ['required', 'https', 'url', 'trailingForwardSlash']
51
+ }],
52
+ productName: '',
53
+ vendor: getVendor(),
54
+ product: getProduct(),
55
+ step: parseInt(this.$route.query.step, 10) || 1,
56
+
57
+ useRandom: true,
58
+ haveCurrent: false,
59
+ username: null,
60
+ isFirstLogin: false,
61
+ mustChangePassword: false,
62
+ current: null,
63
+ password: randomStr(),
64
+ confirm: null,
65
+ v3User: null,
66
+ serverUrl: null,
67
+ mcmEnabled: null,
68
+ eula: false,
69
+ principals: null,
70
+ errors: []
71
+ };
72
+ },
73
+
74
+ async beforeCreate() {
75
+ const isFirstLogin = calcIsFirstLogin(this.$store);
76
+ const mustChangePassword = await calcMustChangePassword(this.$store);
77
+
78
+ if (isFirstLogin) {
79
+ // Always show setup if this is the first log in
80
+ return;
81
+ } else if (mustChangePassword) {
82
+ // If the password needs changing and this isn't the first log in ensure we have the password
83
+ if (!!this.$store.getters['auth/initialPass']) {
84
+ // Got it... show setup
85
+ return;
86
+ }
87
+ // Haven't got it... redirect to log in so we get it
88
+ await this.$store.dispatch('auth/logout', null, { root: true });
89
+
90
+ return this.$router.replace(`/auth/login?${ LOGGED_OUT }`);
91
+ }
92
+
93
+ // For all other cases we don't need to show setup
94
+ return this.$router.replace('/');
95
+ },
96
+
97
+ components: {
98
+ AsyncButton, LabeledInput, CopyToClipboard, Checkbox, RadioGroup, Password, BrandImage, Banner, Loading
99
+ },
100
+
101
+ async fetch() {
102
+ const serverUrlSetting = this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.SERVER_URL);
103
+
104
+ let plSetting;
105
+
106
+ try {
107
+ plSetting = this.$store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.PL);
108
+ } catch (e) {
109
+ // Older versions used Norman API to get these
110
+ plSetting = await this.$store.dispatch('rancher/find', {
111
+ type: NORMAN.SETTING,
112
+ id: SETTING.PL,
113
+ opt: { url: `/v3/settings/${ SETTING.PL }` }
114
+ });
115
+ }
116
+
117
+ if (plSetting.value?.length && plSetting.value !== getVendor()) {
118
+ setVendor(plSetting.value);
119
+ }
120
+
121
+ const productName = plSetting.default;
122
+
123
+ const principals = await this.$store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL, opt: { url: '/v3/principals' } });
124
+ const me = findBy(principals, 'me', true);
125
+
126
+ const current = this.$route.query[SETUP] || this.$store.getters['auth/initialPass'];
127
+ const v3User = this.$store.getters['auth/v3User'] ?? {};
128
+
129
+ const mcmFeature = await this.$store.dispatch('management/find', {
130
+ type: MANAGEMENT.FEATURE, id: 'multi-cluster-management', opt: { url: `/v1/${ MANAGEMENT.FEATURE }/multi-cluster-management` }
131
+ });
132
+
133
+ const mcmEnabled = (mcmFeature?.spec?.value || mcmFeature?.status?.default) && productName !== 'Harvester';
134
+
135
+ let serverUrl;
136
+
137
+ if (serverUrlSetting?.value) {
138
+ serverUrl = serverUrlSetting.value;
139
+ } else {
140
+ serverUrl = window.location.origin;
141
+ }
142
+
143
+ const isFirstLogin = await calcIsFirstLogin(this.$store);
144
+ const mustChangePassword = await calcMustChangePassword(this.$store);
145
+
146
+ this['productName'] = productName;
147
+ this['haveCurrent'] = !!current;
148
+ this['username'] = me?.loginName || 'admin';
149
+ this['isFirstLogin'] = isFirstLogin;
150
+ this['mustChangePassword'] = mustChangePassword;
151
+ this['current'] = current;
152
+ this['v3User'] = v3User;
153
+ this['serverUrl'] = serverUrl;
154
+ this['mcmEnabled'] = mcmEnabled;
155
+ this['principals'] = principals;
156
+ },
157
+
158
+ computed: {
159
+ saveEnabled() {
160
+ if ( !this.eula && this.isFirstLogin) {
161
+ return false;
162
+ }
163
+
164
+ if ( this.mustChangePassword ) {
165
+ if ( !this.current ) {
166
+ return false;
167
+ }
168
+
169
+ if ( !this.useRandom ) {
170
+ if ( !this.password || this.password !== this.confirm ) {
171
+ return false;
172
+ }
173
+ }
174
+ }
175
+
176
+ if (!isUrl(this.serverUrl) || this.fvGetPathErrors(['serverUrl']).length > 0) {
177
+ return false;
178
+ }
179
+
180
+ return true;
181
+ },
182
+
183
+ me() {
184
+ const out = findBy(this.principals, 'me', true);
185
+
186
+ return out;
187
+ },
188
+
189
+ showLocalhostWarning() {
190
+ return isLocalhost(this.serverUrl);
191
+ }
192
+ },
193
+
194
+ watch: {
195
+ useRandom(neu) {
196
+ if (neu) {
197
+ this.password = randomStr();
198
+ } else {
199
+ this.password = '';
200
+ this.$nextTick(() => {
201
+ this.$refs.password.focus();
202
+ });
203
+ }
204
+ }
205
+ },
206
+
207
+ methods: {
208
+ async save(buttonCb) {
209
+ const promises = [];
210
+
211
+ try {
212
+ await applyProducts(this.$store, this.$plugin);
213
+ await this.$store.dispatch('loadManagement');
214
+
215
+ if ( this.mustChangePassword ) {
216
+ await this.$store.dispatch('rancher/request', {
217
+ url: '/v3/users?action=changepassword',
218
+ method: 'post',
219
+ data: {
220
+ currentPassword: this.current,
221
+ newPassword: this.password
222
+ },
223
+ });
224
+ } else {
225
+ promises.push(setSetting(this.$store, SETTING.FIRST_LOGIN, 'false'));
226
+ }
227
+
228
+ const user = this.v3User;
229
+
230
+ user.mustChangePassword = false;
231
+ this.$store.dispatch('auth/gotUser', user);
232
+
233
+ if (this.isFirstLogin) {
234
+ promises.push( setSetting(this.$store, SETTING.EULA_AGREED, (new Date()).toISOString()) );
235
+
236
+ if ( this.mcmEnabled && this.serverUrl ) {
237
+ promises.push( setSetting(this.$store, SETTING.SERVER_URL, this.serverUrl) );
238
+ }
239
+ }
240
+
241
+ await Promise.all(promises);
242
+
243
+ await waitFor(() => !calcIsFirstLogin(this.$store), 'first login to be completed', 10000, 1000, true);
244
+
245
+ buttonCb(true);
246
+ this.done();
247
+ } catch (err) {
248
+ console.error(err) ; // eslint-disable-line no-console
249
+ buttonCb(false);
250
+ this.errors = exceptionToErrorsArray(err);
251
+ }
252
+ },
253
+
254
+ done() {
255
+ this.$router.replace('/');
256
+ },
257
+
258
+ onServerUrlChange(value) {
259
+ this.serverUrl = value.trim();
260
+ },
261
+ },
262
+ };
263
+ </script>
264
+
265
+ <template>
266
+ <Loading
267
+ v-if="$fetchState.pending"
268
+ mode="relative"
269
+ />
270
+ <form
271
+ v-else
272
+ class="setup"
273
+ @submit.prevent
274
+ >
275
+ <div class="row">
276
+ <div class="col span-6 form-col">
277
+ <div>
278
+ &nbsp;
279
+ </div>
280
+ <div>
281
+ <h1 class="text-center">
282
+ {{ t('setup.welcome', {product}) }}
283
+ </h1>
284
+
285
+ <template v-if="mustChangePassword">
286
+ <p
287
+ v-clean-html="t(isFirstLogin ? 'setup.setPassword' : 'setup.newUserSetPassword', { username }, true)"
288
+ class="text-center mb-20 mt-20 setup-title"
289
+ />
290
+ <Password
291
+ v-if="!haveCurrent"
292
+ v-model:value.trim="current"
293
+ autocomplete="current-password"
294
+ type="password"
295
+ :label="t('setup.currentPassword')"
296
+ class="mb-20"
297
+ :required="true"
298
+ />
299
+
300
+ <!-- For password managers... -->
301
+ <input
302
+ type="hidden"
303
+ name="username"
304
+ autocomplete="username"
305
+ :value="username"
306
+ >
307
+ <div class="mb-20">
308
+ <RadioGroup
309
+ v-model:value="useRandom"
310
+ data-testid="setup-password-mode"
311
+ name="password-mode"
312
+ :options="passwordOptions"
313
+ />
314
+ </div>
315
+ <div class="mb-20">
316
+ <LabeledInput
317
+ v-if="useRandom"
318
+ ref="password"
319
+ v-model:value.trim="password"
320
+ :type="useRandom ? 'text' : 'password'"
321
+ :disabled="useRandom"
322
+ data-testid="setup-password-random"
323
+ label-key="setup.newPassword"
324
+ >
325
+ <template
326
+ v-if="useRandom"
327
+ #suffix
328
+ >
329
+ <div
330
+ class="addon"
331
+ style="padding: 0 0 0 12px;"
332
+ >
333
+ <CopyToClipboard
334
+ :aria-label="t('setup.copyRandom')"
335
+ :text="password"
336
+ class="btn-sm"
337
+ />
338
+ </div>
339
+ </template>
340
+ </LabeledInput>
341
+ <Password
342
+ v-else
343
+ ref="password"
344
+ v-model:value.trim="password"
345
+ :label="t('setup.newPassword')"
346
+ data-testid="setup-password"
347
+ :required="true"
348
+ />
349
+ </div>
350
+ <Password
351
+ v-show="!useRandom"
352
+ v-model:value.trim="confirm"
353
+ autocomplete="new-password"
354
+ data-testid="setup-password-confirm"
355
+ :label="t('setup.confirmPassword')"
356
+ :required="true"
357
+ />
358
+ </template>
359
+
360
+ <template v-if="isFirstLogin">
361
+ <template v-if="mcmEnabled">
362
+ <hr
363
+ v-if="mustChangePassword"
364
+ class="mt-20 mb-20"
365
+ role="none"
366
+ >
367
+ <p>
368
+ <t
369
+ k="setup.serverUrl.tip"
370
+ :raw="true"
371
+ />
372
+ </p>
373
+ <div class="mt-20">
374
+ <Banner
375
+ v-if="showLocalhostWarning"
376
+ color="warning"
377
+ :label="t('validation.setting.serverUrl.localhost')"
378
+ data-testid="setup-serverurl-localhost-warning"
379
+ />
380
+ <Banner
381
+ v-for="(err, i) in fvGetPathErrors(['serverUrl'])"
382
+ :key="i"
383
+ color="error"
384
+ :label="err"
385
+ data-testid="setup-error-banner"
386
+ />
387
+ <LabeledInput
388
+ v-model:value="serverUrl"
389
+ :label="t('setup.serverUrl.label')"
390
+ data-testid="setup-server-url"
391
+ :rules="fvGetAndReportPathRules('serverUrl')"
392
+ :required="true"
393
+ @update:value="onServerUrlChange"
394
+ />
395
+ </div>
396
+ </template>
397
+
398
+ <div class="checkbox pt-10 eula">
399
+ <Checkbox
400
+ id="checkbox-eula"
401
+ v-model:value="eula"
402
+ data-testid="setup-agreement"
403
+ >
404
+ <template #label>
405
+ <t
406
+ k="setup.eula"
407
+ :raw="true"
408
+ :name="productName"
409
+ />
410
+ </template>
411
+ </Checkbox>
412
+ </div>
413
+ </template>
414
+
415
+ <div
416
+ id="submit"
417
+ class="text-center mt-20"
418
+ >
419
+ <AsyncButton
420
+ key="passwordSubmit"
421
+ type="submit"
422
+ mode="continue"
423
+ :disabled="!saveEnabled"
424
+ data-testid="setup-submit"
425
+ @click="save"
426
+ />
427
+ </div>
428
+
429
+ <div class="setup-errors mt-20">
430
+ <h4
431
+ v-for="(err, i) in errors"
432
+ :key="i"
433
+ class="text-error text-center"
434
+ >
435
+ {{ err }}
436
+ </h4>
437
+ </div>
438
+ </div>
439
+ <div>
440
+ &nbsp;
441
+ </div>
442
+ </div>
443
+ <BrandImage
444
+ class="col span-6 landscape"
445
+ file-name="login-landscape.svg"
446
+ />
447
+ </div>
448
+ </form>
449
+ </template>
450
+
451
+ <style lang="scss" scoped>
452
+ .principal {
453
+ display: block;
454
+ background: var(--box-bg);
455
+ border: 1px solid var(--border);
456
+ border-radius: 3px;
457
+ margin: 10px 0;
458
+ padding: 10px;
459
+ line-height: 40px;
460
+
461
+ img {
462
+ vertical-align: middle;
463
+ margin: 0 10px;
464
+ }
465
+ }
466
+
467
+ .setup {
468
+ overflow: hidden;
469
+
470
+ .row {
471
+ & .checkbox {
472
+ margin: auto
473
+ }
474
+
475
+ .span-6 {
476
+ padding: 0 60px;
477
+ margin: 0;
478
+ }
479
+
480
+ .landscape {
481
+ height: 100vh;
482
+ margin: 0;
483
+ object-fit: cover;
484
+ padding: 0;
485
+ width: 49%;
486
+ }
487
+ }
488
+
489
+ .form-col {
490
+ display: flex;
491
+ flex-direction: column;
492
+ overflow-y: auto;
493
+ position: relative;
494
+ height: 100vh;
495
+ width: 51%;
496
+
497
+ & > div:first-of-type {
498
+ flex: 3;
499
+ }
500
+ & > div:nth-of-type(2) {
501
+ flex: 9;
502
+ }
503
+ & > div:nth-of-type(3) {
504
+ flex: 2;
505
+ }
506
+ }
507
+
508
+ .setup-title {
509
+ :deep() code {
510
+ font-size: 12px;
511
+ padding: 0;
512
+ }
513
+ }
514
+
515
+ .setup-errors {
516
+ min-height: 50px;
517
+ }
518
+
519
+ p {
520
+ line-height: 20px;
521
+ }
522
+ }
523
+ </style>