X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/f9dde5c781766b8be71d43d0f031c201a0edcfbb..b178ea37c7a247a6399ecf1112d5f8c8aae12136:/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx diff --git a/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx index dda2889f..468ef35a 100644 --- a/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx +++ b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx @@ -2,20 +2,21 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from 'react'; +import React from 'react'; import { connect } from 'react-redux'; -import { Grid, Card, CardContent, TableBody, TableCell, TableHead, TableRow, Table, Tooltip, IconButton } from '@material-ui/core'; +import { Grid, Card, Chip, CardContent, TableBody, TableCell, TableHead, TableRow, Table, Tooltip, IconButton } from '@material-ui/core'; import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; -import { ArvadosTheme } from '~/common/custom-theme'; +import { ArvadosTheme } from 'common/custom-theme'; import { compose, Dispatch } from 'redux'; -import { loadVirtualMachinesAdminData } from '~/store/virtual-machines/virtual-machines-actions'; -import { RootState } from '~/store/store'; -import { ListResults } from '~/services/common-service/common-service'; -import { MoreOptionsIcon } from '~/components/icon/icon'; -import { VirtualMachineLogins, VirtualMachinesResource } from '~/models/virtual-machines'; -import { openVirtualMachinesContextMenu } from '~/store/context-menu/context-menu-actions'; +import { loadVirtualMachinesAdminData, openAddVirtualMachineLoginDialog, openRemoveVirtualMachineLoginDialog, openEditVirtualMachineLoginDialog } from 'store/virtual-machines/virtual-machines-actions'; +import { RootState } from 'store/store'; +import { ListResults } from 'services/common-service/common-service'; +import { MoreOptionsIcon, AddUserIcon } from 'components/icon/icon'; +import { VirtualMachineLogins, VirtualMachinesResource } from 'models/virtual-machines'; +import { openVirtualMachinesContextMenu } from 'store/context-menu/context-menu-actions'; +import { ResourceUuid, VirtualMachineHostname, VirtualMachineLogin } from 'views-components/data-explorer/renderers'; -type CssRules = 'moreOptionsButton' | 'moreOptions'; +type CssRules = 'moreOptionsButton' | 'moreOptions' | 'chipsRoot'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ moreOptionsButton: { @@ -27,30 +28,47 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ paddingRight: 0 } }, + chipsRoot: { + margin: `0px -${theme.spacing.unit / 2}px`, + }, }); -const mapStateToProps = ({ virtualMachines }: RootState) => { +const mapStateToProps = (state: RootState) => { return { - logins: virtualMachines.logins, - ...virtualMachines + userUuid: state.auth.user!.uuid, + ...state.virtualMachines }; }; -const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ +const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ loadVirtualMachinesData: () => dispatch(loadVirtualMachinesAdminData()), onOptionsMenuOpen: (event, virtualMachine) => { dispatch(openVirtualMachinesContextMenu(event, virtualMachine)); }, + onAddLogin: (uuid: string) => { + dispatch(openAddVirtualMachineLoginDialog(uuid)); + }, + onDeleteLogin: (uuid: string) => { + dispatch(openRemoveVirtualMachineLoginDialog(uuid)); + }, + onLoginEdit: (uuid: string) => { + dispatch(openEditVirtualMachineLoginDialog(uuid)); + }, }); interface VirtualMachinesPanelDataProps { virtualMachines: ListResults; logins: VirtualMachineLogins; + links: ListResults; + userUuid: string; } interface VirtualMachinesPanelActionProps { loadVirtualMachinesData: () => string; onOptionsMenuOpen: (event: React.MouseEvent, virtualMachine: VirtualMachinesResource) => void; + onAddLogin: (uuid: string) => void; + onDeleteLogin: (uuid: string) => void; + onLoginEdit: (uuid: string) => void; } type VirtualMachineProps = VirtualMachinesPanelActionProps & VirtualMachinesPanelDataProps & WithStyles; @@ -84,24 +102,40 @@ const CardContentWithVirtualMachines = (props: VirtualMachineProps) => ; const virtualMachinesTable = (props: VirtualMachineProps) => - +
Uuid Host name Logins + - {props.logins.items.length > 0 && props.virtualMachines.items.map((it, index) => + {props.virtualMachines.items.map((machine, index) => - {it.uuid} - {it.hostname} - ["{props.logins.items[0].username}"] + + + + + {props.links.items.filter((link) => (link.headUuid === machine.uuid)).map((permission, i) => ( + + } onDelete={event => props.onDeleteLogin(permission.uuid)} onClick={event => props.onLoginEdit(permission.uuid)} /> + + ))} + + + + + props.onAddLogin(machine.uuid)} className={props.classes.moreOptionsButton}> + + + + - props.onOptionsMenuOpen(event, it)} className={props.classes.moreOptionsButton}> + props.onOptionsMenuOpen(event, machine)} className={props.classes.moreOptionsButton}>