X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/f4012790be2404ce2f5b2594338fac43b1b9c59b..76b1c50413fee98f2ff8a3d2308252de6a37048c:/src/views/site-manager-panel/site-manager-panel-root.tsx diff --git a/src/views/site-manager-panel/site-manager-panel-root.tsx b/src/views/site-manager-panel/site-manager-panel-root.tsx index 29969fc5..246bc875 100644 --- a/src/views/site-manager-panel/site-manager-panel-root.tsx +++ b/src/views/site-manager-panel/site-manager-panel-root.tsx @@ -2,11 +2,13 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from 'react'; +import React from 'react'; import { Card, CardContent, + CircularProgress, Grid, + IconButton, StyleRulesCallback, Table, TableBody, @@ -17,22 +19,26 @@ import { WithStyles, withStyles } from '@material-ui/core'; -import { ArvadosTheme } from '~/common/custom-theme'; -import { Session } from "~/models/session"; +import { ArvadosTheme } from 'common/custom-theme'; +import { Session, SessionStatus } from "models/session"; import Button from "@material-ui/core/Button"; -import { User } from "~/models/user"; -import { compose } from "redux"; -import { Field, InjectedFormProps, reduxForm, reset } from "redux-form"; -import { TextField } from "~/components/text-field/text-field"; -import { addSession } from "~/store/auth/auth-action-session"; -import { SITE_MANAGER_REMOTE_HOST_VALIDATION } from "~/validators/validators"; +import { compose, Dispatch } from "redux"; +import { Field, FormErrors, InjectedFormProps, reduxForm, reset, stopSubmit } from "redux-form"; +import { TextField } from "components/text-field/text-field"; +import { addSession } from "store/auth/auth-action-session"; +import { SITE_MANAGER_REMOTE_HOST_VALIDATION } from "validators/validators"; +import { Config } from 'common/config'; +import { ResourceCluster } from 'views-components/data-explorer/renderers'; +import { TrashIcon } from "components/icon/icon"; -type CssRules = 'root' | 'link' | 'buttonContainer' | 'table' | 'tableRow' | 'status' | 'remoteSiteInfo' | 'buttonAdd'; +type CssRules = 'root' | 'link' | 'buttonContainer' | 'table' | 'tableRow' | + 'remoteSiteInfo' | 'buttonAdd' | 'buttonLoggedIn' | 'buttonLoggedOut' | + 'statusCell'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { - width: '100%', - overflow: 'auto' + width: '100%', + overflow: 'auto' }, link: { color: theme.palette.primary.main, @@ -50,12 +56,8 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ whiteSpace: 'nowrap' } }, - status: { - width: 100, - padding: 5, - fontWeight: 'bold', - textAlign: 'center', - borderRadius: 4 + statusCell: { + minWidth: 160 }, remoteSiteInfo: { marginTop: 20 @@ -63,37 +65,70 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ buttonAdd: { marginLeft: 10, marginTop: theme.spacing.unit * 3 + }, + buttonLoggedIn: { + minHeight: theme.spacing.unit, + padding: 5, + color: '#fff', + backgroundColor: '#009966', + '&:hover': { + backgroundColor: '#008450', + } + }, + buttonLoggedOut: { + minHeight: theme.spacing.unit, + padding: 5, + color: '#000', + backgroundColor: '#FFC414', + '&:hover': { + backgroundColor: '#eaaf14', + } } }); export interface SiteManagerPanelRootActionProps { + toggleSession: (session: Session) => void; + removeSession: (session: Session) => void; } export interface SiteManagerPanelRootDataProps { sessions: Session[]; - user: User; + remoteHostsConfig: { [key: string]: Config }; + localClusterConfig: Config; } type SiteManagerPanelRootProps = SiteManagerPanelRootDataProps & SiteManagerPanelRootActionProps & WithStyles & InjectedFormProps; const SITE_MANAGER_FORM_NAME = 'siteManagerForm'; +const submitSession = (remoteHost: string) => + (dispatch: Dispatch) => { + dispatch(addSession(remoteHost, undefined, true)).then(() => { + dispatch(reset(SITE_MANAGER_FORM_NAME)); + }).catch((e: any) => { + const errors = { + remoteHost: e + } as FormErrors; + dispatch(stopSubmit(SITE_MANAGER_FORM_NAME, errors)); + }); + }; + export const SiteManagerPanelRoot = compose( - reduxForm<{remoteHost: string}>({ + reduxForm<{ remoteHost: string }>({ form: SITE_MANAGER_FORM_NAME, + touchOnBlur: false, onSubmit: (data, dispatch) => { - dispatch(addSession(data.remoteHost)); - dispatch(reset(SITE_MANAGER_FORM_NAME)); + dispatch(submitSession(data.remoteHost)); } }), withStyles(styles)) - (({ classes, sessions, handleSubmit }: SiteManagerPanelRootProps) => + (({ classes, sessions, handleSubmit, toggleSession, removeSession, localClusterConfig, remoteHostsConfig }: SiteManagerPanelRootProps) => - + You can log in to multiple Arvados sites here, then use the multi-site search page to search collections and projects on all sites at once. - + @@ -101,44 +136,62 @@ export const SiteManagerPanelRoot = compose( Cluster ID - Username + Host Email + UUID Status + Actions - {sessions.map((session, index) => - - {session.clusterId} - {session.username} - {session.email} + {sessions.map((session, index) => { + const validating = session.status === SessionStatus.BEING_VALIDATED; + return + {remoteHostsConfig[session.clusterId] ? + + : session.clusterId} + {session.remoteHost} + {validating ? : session.email} + {validating ? : session.uuid} + + + -
- {session.loggedIn ? "Logged in" : "Logged out"} -
+ {session.clusterId !== localClusterConfig.uuidPrefix && + !localClusterConfig.clusterConfig.RemoteClusters[session.clusterId] && + removeSession(session)}> + + }
-
)} +
; + })}
}
- + To add a remote Arvados site, paste the remote site's host here (see "ARVADOS_API_HOST" on the "current token" page). - + + label="New cluster" + autoFocus />