import * as React from 'react';
import { connect } from 'react-redux';
-import { Grid, Typography, Button, Card, CardContent, TableBody, TableCell, TableHead, TableRow, Table, Tooltip, IconButton } from '@material-ui/core';
+import { Grid, Typography, Button, Card, CardContent, TableBody, TableCell, TableHead, TableRow, Table, Tooltip } from '@material-ui/core';
import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles';
import { ArvadosTheme } from '~/common/custom-theme';
import { DefaultCodeSnippet } from '~/components/default-code-snippet/default-code-snippet';
import { Link } from 'react-router-dom';
import { compose, Dispatch } from 'redux';
-import { saveRequestedDate, loadVirtualMachinesData } from '~/store/virtual-machines/virtual-machines-actions';
+import { saveRequestedDate, loadVirtualMachinesUserData } from '~/store/virtual-machines/virtual-machines-actions';
import { RootState } from '~/store/store';
import { ListResults } from '~/services/common-service/common-service';
-import { HelpIcon, MoreOptionsIcon } from '~/components/icon/icon';
-import { VirtualMachineLogins, VirtualMachinesResource } from '~/models/virtual-machines';
+import { HelpIcon } from '~/components/icon/icon';
import { Routes } from '~/routes/routes';
-import { openVirtualMachinesContextMenu } from '~/store/context-menu/context-menu-actions';
-type CssRules = 'button' | 'codeSnippet' | 'link' | 'linkIcon' | 'rightAlign' | 'cardWithoutMachines' | 'icon' | 'moreOptionsButton' | 'moreOptions';
+type CssRules = 'button' | 'codeSnippet' | 'link' | 'linkIcon' | 'rightAlign' | 'cardWithoutMachines' | 'icon';
const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
button: {
icon: {
textAlign: "right",
marginTop: theme.spacing.unit
- },
- moreOptionsButton: {
- padding: 0
- },
- moreOptions: {
- textAlign: 'right',
- '&:last-child': {
- paddingRight: 0
- }
- },
+ }
});
-const mapStateToProps = ({ virtualMachines, auth }: RootState) => {
+const mapStateToProps = ({ virtualMachines }: RootState) => {
return {
requestedDate: virtualMachines.date,
- isAdmin: auth.user!.isAdmin,
- logins: virtualMachines.logins,
...virtualMachines
};
};
-const mapDispatchToProps = (dispatch: Dispatch): Pick<VirtualMachinesPanelActionProps, 'loadVirtualMachinesData' | 'saveRequestedDate' | 'onOptionsMenuOpen'> => ({
+const mapDispatchToProps = (dispatch: Dispatch): Pick<VirtualMachinesPanelActionProps, 'loadVirtualMachinesData' | 'saveRequestedDate'> => ({
saveRequestedDate: () => dispatch<any>(saveRequestedDate()),
- loadVirtualMachinesData: () => dispatch<any>(loadVirtualMachinesData()),
- onOptionsMenuOpen: (event, virtualMachine) => {
- dispatch<any>(openVirtualMachinesContextMenu(event, virtualMachine));
- },
+ loadVirtualMachinesData: () => dispatch<any>(loadVirtualMachinesUserData()),
});
interface VirtualMachinesPanelDataProps {
requestedDate: string;
virtualMachines: ListResults<any>;
- logins: VirtualMachineLogins;
links: ListResults<any>;
- isAdmin: boolean;
}
interface VirtualMachinesPanelActionProps {
saveRequestedDate: () => void;
loadVirtualMachinesData: () => string;
- onOptionsMenuOpen: (event: React.MouseEvent<HTMLElement>, virtualMachine: VirtualMachinesResource) => void;
}
type VirtualMachineProps = VirtualMachinesPanelActionProps & VirtualMachinesPanelDataProps & WithStyles<CssRules>;
-export const VirtualMachinePanel = compose(
+export const VirtualMachineUserPanel = compose(
withStyles(styles),
connect(mapStateToProps, mapDispatchToProps))(
class extends React.Component<VirtualMachineProps> {
}
render() {
- const { virtualMachines, links, isAdmin } = this.props;
+ const { virtualMachines, links } = this.props;
return (
<Grid container spacing={16}>
- {!isAdmin && virtualMachines.itemsAvailable > 0 && <CardContentWithNoVirtualMachines {...this.props} />}
+ {virtualMachines.itemsAvailable === 0 && <CardContentWithoutVirtualMachines {...this.props} />}
{virtualMachines.itemsAvailable > 0 && links.itemsAvailable > 0 && <CardContentWithVirtualMachines {...this.props} />}
- {!isAdmin && <CardSSHSection {...this.props} />}
+ {<CardSSHSection {...this.props} />}
</Grid>
);
}
}
);
-const CardContentWithNoVirtualMachines = (props: VirtualMachineProps) =>
+const CardContentWithoutVirtualMachines = (props: VirtualMachineProps) =>
<Grid item xs={12}>
<Card>
<CardContent className={props.classes.cardWithoutMachines}>
</Typography>
</Grid>
<Grid item xs={6} className={props.classes.rightAlign}>
- <Button variant="contained" color="primary" className={props.classes.button} onClick={props.saveRequestedDate}>
- SEND REQUEST FOR SHELL ACCESS
- </Button>
- {props.requestedDate &&
- <Typography variant="body1">
- A request for shell access was sent on {props.requestedDate}
- </Typography>}
+ {virtualMachineSendRequest(props)}
</Grid>
</CardContent>
</Card>
<Grid item xs={12}>
<Card>
<CardContent>
- {props.isAdmin ? <span>{adminVirtualMachinesTable(props)}</span>
- : <span>
- <div className={props.classes.rightAlign}>
- <Button variant="contained" color="primary" className={props.classes.button} onClick={props.saveRequestedDate}>
- SEND REQUEST FOR SHELL ACCESS
- </Button>
- {props.requestedDate &&
- <Typography variant="body1">
- A request for shell access was sent on {props.requestedDate}
- </Typography>}
- </div>
- <div className={props.classes.icon}>
- <a href="https://doc.arvados.org/user/getting_started/vm-login-with-webshell.html" target="_blank" className={props.classes.linkIcon}>
- <Tooltip title="Access VM using webshell">
- <HelpIcon />
- </Tooltip>
- </a>
- </div>
- {userVirtualMachinesTable(props)}
- </span>
- }
+ <span>
+ <div className={props.classes.rightAlign}>
+ {virtualMachineSendRequest(props)}
+ </div>
+ <div className={props.classes.icon}>
+ <a href="https://doc.arvados.org/user/getting_started/vm-login-with-webshell.html" target="_blank" className={props.classes.linkIcon}>
+ <Tooltip title="Access VM using webshell">
+ <HelpIcon />
+ </Tooltip>
+ </a>
+ </div>
+ {virtualMachinesTable(props)}
+ </span>
+
</CardContent>
</Card>
</Grid>;
-const userVirtualMachinesTable = (props: VirtualMachineProps) =>
+const virtualMachineSendRequest = (props: VirtualMachineProps) =>
+ <span>
+ <Button variant="contained" color="primary" className={props.classes.button} onClick={props.saveRequestedDate}>
+ SEND REQUEST FOR SHELL ACCESS
+ </Button>
+ {props.requestedDate &&
+ <Typography variant="body1">
+ A request for shell access was sent on {props.requestedDate}
+ </Typography>}
+ </span>;
+
+const virtualMachinesTable = (props: VirtualMachineProps) =>
<Table>
<TableHead>
<TableRow>
</TableBody>
</Table>;
-const adminVirtualMachinesTable = (props: VirtualMachineProps) =>
- <Table>
- <TableHead>
- <TableRow>
- <TableCell>Uuid</TableCell>
- <TableCell>Host name</TableCell>
- <TableCell>Logins</TableCell>
- <TableCell />
- </TableRow>
- </TableHead>
- <TableBody>
- {props.logins.items.length > 0 && props.virtualMachines.items.map((it, index) =>
- <TableRow key={index}>
- <TableCell>{it.uuid}</TableCell>
- <TableCell>{it.hostname}</TableCell>
- <TableCell>["{props.logins.items[0].username}"]</TableCell>
- <TableCell className={props.classes.moreOptions}>
- <Tooltip title="More options" disableFocusListener>
- <IconButton onClick={event => props.onOptionsMenuOpen(event, it)} className={props.classes.moreOptionsButton}>
- <MoreOptionsIcon />
- </IconButton>
- </Tooltip>
- </TableCell>
- </TableRow>
- )}
- </TableBody>
- </Table>;
-
const getUsername = (links: ListResults<any>) => {
return links.items[0].properties.username;
};