// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; import { StyleRulesCallback, WithStyles, withStyles, Card, CardContent, Button, Grid, Select, CircularProgress } from '@material-ui/core'; import { ArvadosTheme } from 'common/custom-theme'; import { UserResource } from "models/user"; import { LinkAccountType } from "models/link-account"; import { formatDate } from "common/formatters"; import { LinkAccountPanelStatus, LinkAccountPanelError } from "store/link-account-panel/link-account-panel-reducer"; import { Config } from 'common/config'; type CssRules = 'root'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { width: '100%', overflow: 'auto', display: 'flex' } }); export interface LinkAccountPanelRootDataProps { targetUser?: UserResource; userToLink?: UserResource; remoteHostsConfig: { [key: string]: Config }; hasRemoteHosts: boolean; localCluster: string; loginCluster: string; status: LinkAccountPanelStatus; error: LinkAccountPanelError; selectedCluster?: string; isProcessing: boolean; } export interface LinkAccountPanelRootActionProps { startLinking: (type: LinkAccountType) => void; cancelLinking: () => void; linkAccount: () => void; setSelectedCluster: (cluster: string) => void; } function displayUser(user: UserResource, showCreatedAt: boolean = false, showCluster: boolean = false) { const disp: JSX.Element[] = []; disp.push({user.email} ({user.username}, {user.uuid})); if (showCluster) { const homeCluster = user.uuid.substring(0, 5); disp.push( hosted on cluster {homeCluster} and ); } if (showCreatedAt) { disp.push( created on {formatDate(user.createdAt)}); } return disp; } function isLocalUser(uuid: string, localCluster: string) { return uuid.substring(0, 5) === localCluster; } type LinkAccountPanelRootProps = LinkAccountPanelRootDataProps & LinkAccountPanelRootActionProps & WithStyles; export const LinkAccountPanelRoot = withStyles(styles)( ({ classes, targetUser, userToLink, status, isProcessing, error, startLinking, cancelLinking, linkAccount, remoteHostsConfig, hasRemoteHosts, selectedCluster, setSelectedCluster, localCluster, loginCluster }: LinkAccountPanelRootProps) => { return {isProcessing && Loading user info. Please wait. } {!isProcessing && status === LinkAccountPanelStatus.INITIAL && targetUser &&
{isLocalUser(targetUser.uuid, localCluster) ? You are currently logged in as {displayUser(targetUser, true)} You can link Arvados accounts. After linking, either login will take you to the same account. {hasRemoteHosts && selectedCluster && You can also link {displayUser(targetUser, false)} with an account from a remote cluster. Please select the cluster that hosts the account you want to link with: } : You are currently logged in as {displayUser(targetUser, true, true)} {targetUser.isActive ? (loginCluster === "" ? <> This a remote account. You can link a local Arvados account to this one. After linking, you can access the local account's data by logging into the {localCluster} cluster as user {targetUser.email} from {targetUser.uuid.substring(0, 5)}. : Please visit cluster {loginCluster} to perform account linking. ) : This an inactive remote account. An administrator must activate your account before you can proceed. After your accounts is activated, you can link a local Arvados account hosted by the {localCluster} cluster to this one. } }
} {!isProcessing && (status === LinkAccountPanelStatus.LINKING || status === LinkAccountPanelStatus.ERROR) && userToLink && targetUser && {status === LinkAccountPanelStatus.LINKING && Clicking 'Link accounts' will link {displayUser(userToLink, true, !isLocalUser(targetUser.uuid, localCluster))} to {displayUser(targetUser, true, !isLocalUser(targetUser.uuid, localCluster))}. {(isLocalUser(targetUser.uuid, localCluster)) && After linking, logging in as {displayUser(userToLink)} will log you into the same account as {displayUser(targetUser)}. } Any object owned by {displayUser(userToLink)} will be transfered to {displayUser(targetUser)}. {!isLocalUser(targetUser.uuid, localCluster) && You can access {userToLink.email} data by logging into {localCluster} with the {targetUser.email} account. } } {error === LinkAccountPanelError.NON_ADMIN && Cannot link admin account {displayUser(userToLink)} to non-admin account {displayUser(targetUser)}. } {error === LinkAccountPanelError.SAME_USER && Cannot link {displayUser(targetUser)} to the same account. } {error === LinkAccountPanelError.INACTIVE && Cannot link account {displayUser(userToLink)} to inactive account {displayUser(targetUser)}. } }
; });