From 64c8c2628cbeadba5dce7e18e41028108142b766 Mon Sep 17 00:00:00 2001 From: Pawel Kowalczyk Date: Fri, 7 Dec 2018 16:05:19 +0100 Subject: [PATCH] created-admin-menu-and-extracted-virtual-machines-to-separated-components Feature #14566 Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk --- src/routes/route-change-handlers.ts | 11 +- src/routes/routes.ts | 10 +- src/store/navigation/navigation-action.ts | 4 +- src/store/users/users-actions.ts | 5 +- .../virtual-machines-actions.ts | 26 +++- .../main-app-bar/account-menu.tsx | 16 +-- .../main-app-bar/admin-menu.tsx | 45 ++++++ .../main-app-bar/main-app-bar.tsx | 4 +- .../main-content-bar/main-content-bar.tsx | 9 +- .../virtual-machine-admin-panel.tsx | 112 +++++++++++++++ ...nel.tsx => virtual-machine-user-panel.tsx} | 129 ++++++------------ src/views/workbench/workbench.tsx | 6 +- 12 files changed, 251 insertions(+), 126 deletions(-) create mode 100644 src/views-components/main-app-bar/admin-menu.tsx create mode 100644 src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx rename src/views/virtual-machine-panel/{virtual-machine-panel.tsx => virtual-machine-user-panel.tsx} (55%) diff --git a/src/routes/route-change-handlers.ts b/src/routes/route-change-handlers.ts index e2454d63..e68c3c6c 100644 --- a/src/routes/route-change-handlers.ts +++ b/src/routes/route-change-handlers.ts @@ -26,7 +26,8 @@ const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => { const searchResultsMatch = Routes.matchSearchResultsRoute(pathname); const sharedWithMeMatch = Routes.matchSharedWithMeRoute(pathname); const runProcessMatch = Routes.matchRunProcessRoute(pathname); - const virtualMachineMatch = Routes.matchVirtualMachineRoute(pathname); + const virtualMachineUserMatch = Routes.matchUserVirtualMachineRoute(pathname); + const virtualMachineAdminMatch = Routes.matchAdminVirtualMachineRoute(pathname); const workflowMatch = Routes.matchWorkflowRoute(pathname); const sshKeysMatch = Routes.matchSshKeysRoute(pathname); const keepServicesMatch = Routes.matchKeepServicesRoute(pathname); @@ -57,9 +58,11 @@ const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => { store.dispatch(WorkbenchActions.loadWorkflow); } else if (searchResultsMatch) { store.dispatch(WorkbenchActions.loadSearchResults); - } else if (virtualMachineMatch) { + } else if (virtualMachineUserMatch) { store.dispatch(WorkbenchActions.loadVirtualMachines); - } else if(repositoryMatch) { + } else if (virtualMachineAdminMatch) { + store.dispatch(WorkbenchActions.loadVirtualMachines); + } else if (repositoryMatch) { store.dispatch(WorkbenchActions.loadRepositories); } else if (sshKeysMatch) { store.dispatch(WorkbenchActions.loadSshKeys); @@ -71,7 +74,7 @@ const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => { store.dispatch(WorkbenchActions.loadApiClientAuthorizations); } else if (myAccountMatch) { store.dispatch(WorkbenchActions.loadMyAccount); - }else if (userMatch) { + } else if (userMatch) { store.dispatch(WorkbenchActions.loadUsers); } }; diff --git a/src/routes/routes.ts b/src/routes/routes.ts index 88dfd469..a5a0af1b 100644 --- a/src/routes/routes.ts +++ b/src/routes/routes.ts @@ -19,7 +19,8 @@ export const Routes = { REPOSITORIES: '/repositories', SHARED_WITH_ME: '/shared-with-me', RUN_PROCESS: '/run-process', - VIRTUAL_MACHINES: '/virtual-machines', + VIRTUAL_MACHINES_USER: '/virtual-machines-user', + VIRTUAL_MACHINES_ADMIN: '/virtual-machines-admin', WORKFLOWS: '/workflows', SEARCH_RESULTS: '/search-results', SSH_KEYS: `/ssh-keys`, @@ -85,8 +86,11 @@ export const matchWorkflowRoute = (route: string) => export const matchSearchResultsRoute = (route: string) => matchPath(route, { path: Routes.SEARCH_RESULTS }); -export const matchVirtualMachineRoute = (route: string) => - matchPath(route, { path: Routes.VIRTUAL_MACHINES }); +export const matchUserVirtualMachineRoute = (route: string) => + matchPath(route, { path: Routes.VIRTUAL_MACHINES_USER }); + +export const matchAdminVirtualMachineRoute = (route: string) => + matchPath(route, { path: Routes.VIRTUAL_MACHINES_ADMIN }); export const matchRepositoriesRoute = (route: string) => matchPath(route, { path: Routes.REPOSITORIES }); diff --git a/src/store/navigation/navigation-action.ts b/src/store/navigation/navigation-action.ts index 8d68a4b6..d070fd0f 100644 --- a/src/store/navigation/navigation-action.ts +++ b/src/store/navigation/navigation-action.ts @@ -62,7 +62,9 @@ export const navigateToRunProcess = push(Routes.RUN_PROCESS); export const navigateToSearchResults = push(Routes.SEARCH_RESULTS); -export const navigateToVirtualMachines = push(Routes.VIRTUAL_MACHINES); +export const navigateToUserVirtualMachines = push(Routes.VIRTUAL_MACHINES_USER); + +export const navigateToAdminVirtualMachines = push(Routes.VIRTUAL_MACHINES_ADMIN); export const navigateToRepositories = push(Routes.REPOSITORIES); diff --git a/src/store/users/users-actions.ts b/src/store/users/users-actions.ts index 64c3646a..51c9ba0b 100644 --- a/src/store/users/users-actions.ts +++ b/src/store/users/users-actions.ts @@ -7,8 +7,7 @@ import { bindDataExplorerActions } from '~/store/data-explorer/data-explorer-act import { RootState } from '~/store/store'; import { ServiceRepository } from "~/services/services"; import { dialogActions } from '~/store/dialog/dialog-actions'; -import { startSubmit, reset, stopSubmit } from "redux-form"; -import { getCommonResourceServiceError, CommonResourceServiceError } from "~/services/common-service/common-resource-service"; +import { startSubmit, reset } from "redux-form"; import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions'; import { UserResource } from "~/models/user"; import { getResource } from '~/store/resources/resources'; @@ -16,7 +15,7 @@ import { navigateToProject } from "~/store/navigation/navigation-action"; export const USERS_PANEL_ID = 'usersPanel'; export const USER_ATTRIBUTES_DIALOG = 'userAttributesDialog'; -export const USER_CREATE_FORM_NAME = 'repositoryCreateFormName'; +export const USER_CREATE_FORM_NAME = 'userCreateFormName'; export interface UserCreateFormDialogData { email: string; diff --git a/src/store/virtual-machines/virtual-machines-actions.ts b/src/store/virtual-machines/virtual-machines-actions.ts index 0aaa9050..ea6d1aff 100644 --- a/src/store/virtual-machines/virtual-machines-actions.ts +++ b/src/store/virtual-machines/virtual-machines-actions.ts @@ -5,7 +5,7 @@ import { Dispatch } from "redux"; import { RootState } from '~/store/store'; import { ServiceRepository } from "~/services/services"; -import { navigateToVirtualMachines } from "../navigation/navigation-action"; +import { navigateToUserVirtualMachines, navigateToAdminVirtualMachines } from "~/store/navigation/navigation-action"; import { bindDataExplorerActions } from '~/store/data-explorer/data-explorer-action'; import { formatDate } from "~/common/formatters"; import { unionize, ofType, UnionOf } from "~/common/unionize"; @@ -28,9 +28,14 @@ export const VIRTUAL_MACHINES_PANEL = 'virtualMachinesPanel'; export const VIRTUAL_MACHINE_ATTRIBUTES_DIALOG = 'virtualMachineAttributesDialog'; export const VIRTUAL_MACHINE_REMOVE_DIALOG = 'virtualMachineRemoveDialog'; -export const openVirtualMachines = () => +export const openUserVirtualMachines = () => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - dispatch(navigateToVirtualMachines); + dispatch(navigateToUserVirtualMachines); + }; + +export const openAdminVirtualMachines = () => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + dispatch(navigateToAdminVirtualMachines); }; export const openVirtualMachineAttributes = (uuid: string) => @@ -45,7 +50,16 @@ const loadRequestedDate = () => dispatch(virtualMachinesActions.SET_REQUESTED_DATE(date)); }; -export const loadVirtualMachinesData = () => +export const loadVirtualMachinesAdminData = () => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + dispatch(loadRequestedDate()); + const virtualMachines = await services.virtualMachineService.list(); + dispatch(virtualMachinesActions.SET_VIRTUAL_MACHINES(virtualMachines)); + const getAllLogins = await services.virtualMachineService.getAllLogins(); + dispatch(virtualMachinesActions.SET_LOGINS(getAllLogins)); + }; + +export const loadVirtualMachinesUserData = () => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(loadRequestedDate()); const virtualMachines = await services.virtualMachineService.list(); @@ -57,8 +71,6 @@ export const loadVirtualMachinesData = () => }); dispatch(virtualMachinesActions.SET_VIRTUAL_MACHINES(virtualMachines)); dispatch(virtualMachinesActions.SET_LINKS(links)); - const getAllLogins = await services.virtualMachineService.getAllLogins(); - dispatch(virtualMachinesActions.SET_LOGINS(getAllLogins)); }; export const saveRequestedDate = () => @@ -86,7 +98,7 @@ export const removeVirtualMachine = (uuid: string) => dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removing ...' })); await services.virtualMachineService.delete(uuid); dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removed.', hideDuration: 2000, kind: SnackbarKind.SUCCESS })); - dispatch(loadVirtualMachinesData()); + dispatch(loadVirtualMachinesAdminData()); }; const virtualMachinesBindedActions = bindDataExplorerActions(VIRTUAL_MACHINES_PANEL); diff --git a/src/views-components/main-app-bar/account-menu.tsx b/src/views-components/main-app-bar/account-menu.tsx index 44b113df..31a28ecf 100644 --- a/src/views-components/main-app-bar/account-menu.tsx +++ b/src/views-components/main-app-bar/account-menu.tsx @@ -12,12 +12,8 @@ import { logout } from '~/store/auth/auth-action'; import { RootState } from "~/store/store"; import { openCurrentTokenDialog } from '~/store/current-token-dialog/current-token-dialog-actions'; import { openRepositoriesPanel } from "~/store/repositories/repositories-actions"; -import { - navigateToSshKeys, navigateToKeepServices, navigateToComputeNodes, - navigateToApiClientAuthorizations, navigateToMyAccount -} from '~/store/navigation/navigation-action'; -import { openVirtualMachines } from "~/store/virtual-machines/virtual-machines-actions"; -import { navigateToUsers } from '~/store/navigation/navigation-action'; +import { navigateToSshKeys, navigateToMyAccount } from '~/store/navigation/navigation-action'; +import { openUserVirtualMachines } from "~/store/virtual-machines/virtual-machines-actions"; interface AccountMenuProps { user?: User; @@ -37,14 +33,10 @@ export const AccountMenu = connect(mapStateToProps)( {getUserFullname(user)} - dispatch(openVirtualMachines())}>Virtual Machines - dispatch(openRepositoriesPanel())}>Repositories + dispatch(openUserVirtualMachines())}>Virtual Machines + {!user.isAdmin && dispatch(openRepositoriesPanel())}>Repositories} dispatch(openCurrentTokenDialog)}>Current token dispatch(navigateToSshKeys)}>Ssh Keys - dispatch(navigateToUsers)}>Users - { user.isAdmin && dispatch(navigateToApiClientAuthorizations)}>Api Tokens } - { user.isAdmin && dispatch(navigateToKeepServices)}>Keep Services } - { user.isAdmin && dispatch(navigateToComputeNodes)}>Compute Nodes } dispatch(navigateToMyAccount)}>My account dispatch(logout())}>Logout diff --git a/src/views-components/main-app-bar/admin-menu.tsx b/src/views-components/main-app-bar/admin-menu.tsx new file mode 100644 index 00000000..f754c857 --- /dev/null +++ b/src/views-components/main-app-bar/admin-menu.tsx @@ -0,0 +1,45 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from "react"; +import { MenuItem } from "@material-ui/core"; +import { User } from "~/models/user"; +import { DropdownMenu } from "~/components/dropdown-menu/dropdown-menu"; +import { ShareMeIcon } from "~/components/icon/icon"; +import { DispatchProp, connect } from 'react-redux'; +import { logout } from '~/store/auth/auth-action'; +import { RootState } from "~/store/store"; +import { openRepositoriesPanel } from "~/store/repositories/repositories-actions"; +import { + navigateToSshKeys, navigateToKeepServices, navigateToComputeNodes, + navigateToApiClientAuthorizations +} from '~/store/navigation/navigation-action'; +import { openAdminVirtualMachines } from "~/store/virtual-machines/virtual-machines-actions"; +import { navigateToUsers } from '~/store/navigation/navigation-action'; + +interface AdminMenuProps { + user?: User; +} + +const mapStateToProps = (state: RootState): AdminMenuProps => ({ + user: state.auth.user +}); + +export const AdminMenu = connect(mapStateToProps)( + ({ user, dispatch }: AdminMenuProps & DispatchProp) => + user + ? } + id="admin-menu" + title="Admin Panel"> + dispatch(openRepositoriesPanel())}>Repositories + dispatch(openAdminVirtualMachines())}>Virtual Machines + dispatch(navigateToSshKeys)}>Ssh Keys + dispatch(navigateToApiClientAuthorizations)}>Api Tokens + dispatch(navigateToUsers)}>Users + dispatch(navigateToComputeNodes)}>Compute Nodes + dispatch(navigateToKeepServices)}>Keep Services + dispatch(logout())}>Logout + + : null); diff --git a/src/views-components/main-app-bar/main-app-bar.tsx b/src/views-components/main-app-bar/main-app-bar.tsx index b936fb14..8a7e9f20 100644 --- a/src/views-components/main-app-bar/main-app-bar.tsx +++ b/src/views-components/main-app-bar/main-app-bar.tsx @@ -11,8 +11,9 @@ import { SearchBar } from "~/views-components/search-bar/search-bar"; import { Routes } from '~/routes/routes'; import { NotificationsMenu } from "~/views-components/main-app-bar/notifications-menu"; import { AccountMenu } from "~/views-components/main-app-bar/account-menu"; -import { HelpMenu } from './help-menu'; +import { HelpMenu } from '~/views-components/main-app-bar/help-menu'; import { ReactNode } from "react"; +import { AdminMenu } from "~/views-components/main-app-bar/admin-menu"; type CssRules = 'toolbar' | 'link'; @@ -65,6 +66,7 @@ export const MainAppBar = withStyles(styles)( ? <> + {props.user.isAdmin && } : } diff --git a/src/views-components/main-content-bar/main-content-bar.tsx b/src/views-components/main-content-bar/main-content-bar.tsx index 8c2e4ced..944f135a 100644 --- a/src/views-components/main-content-bar/main-content-bar.tsx +++ b/src/views-components/main-content-bar/main-content-bar.tsx @@ -18,10 +18,11 @@ interface MainContentBarProps { const isButtonVisible = ({ router }: RootState) => { const pathname = router.location ? router.location.pathname : ''; - return !Routes.matchWorkflowRoute(pathname) && !Routes.matchVirtualMachineRoute(pathname) && - !Routes.matchRepositoriesRoute(pathname) && !Routes.matchSshKeysRoute(pathname) && - !Routes.matchKeepServicesRoute(pathname) && !Routes.matchComputeNodesRoute(pathname) && - !Routes.matchApiClientAuthorizationsRoute(pathname) && !Routes.matchUsersRoute(pathname); + return !Routes.matchWorkflowRoute(pathname) && !Routes.matchUserVirtualMachineRoute(pathname) && + !Routes.matchAdminVirtualMachineRoute(pathname) && !Routes.matchRepositoriesRoute(pathname) && + !Routes.matchSshKeysRoute(pathname) && !Routes.matchKeepServicesRoute(pathname) && + !Routes.matchComputeNodesRoute(pathname) && !Routes.matchApiClientAuthorizationsRoute(pathname) && + !Routes.matchUsersRoute(pathname) && !Routes.matchMyAccountRoute(pathname); }; export const MainContentBar = connect((state: RootState) => ({ diff --git a/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx new file mode 100644 index 00000000..dda2889f --- /dev/null +++ b/src/views/virtual-machine-panel/virtual-machine-admin-panel.tsx @@ -0,0 +1,112 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Grid, Card, 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 { 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'; + +type CssRules = 'moreOptionsButton' | 'moreOptions'; + +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + moreOptionsButton: { + padding: 0 + }, + moreOptions: { + textAlign: 'right', + '&:last-child': { + paddingRight: 0 + } + }, +}); + +const mapStateToProps = ({ virtualMachines }: RootState) => { + return { + logins: virtualMachines.logins, + ...virtualMachines + }; +}; + +const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ + loadVirtualMachinesData: () => dispatch(loadVirtualMachinesAdminData()), + onOptionsMenuOpen: (event, virtualMachine) => { + dispatch(openVirtualMachinesContextMenu(event, virtualMachine)); + }, +}); + +interface VirtualMachinesPanelDataProps { + virtualMachines: ListResults; + logins: VirtualMachineLogins; +} + +interface VirtualMachinesPanelActionProps { + loadVirtualMachinesData: () => string; + onOptionsMenuOpen: (event: React.MouseEvent, virtualMachine: VirtualMachinesResource) => void; +} + +type VirtualMachineProps = VirtualMachinesPanelActionProps & VirtualMachinesPanelDataProps & WithStyles; + +export const VirtualMachineAdminPanel = compose( + withStyles(styles), + connect(mapStateToProps, mapDispatchToProps))( + class extends React.Component { + componentDidMount() { + this.props.loadVirtualMachinesData(); + } + + render() { + const { virtualMachines } = this.props; + return ( + + {virtualMachines.itemsAvailable > 0 && } + + ); + } + } + ); + +const CardContentWithVirtualMachines = (props: VirtualMachineProps) => + + + + {virtualMachinesTable(props)} + + + ; + +const virtualMachinesTable = (props: VirtualMachineProps) => + + + + Uuid + Host name + Logins + + + + + {props.logins.items.length > 0 && props.virtualMachines.items.map((it, index) => + + {it.uuid} + {it.hostname} + ["{props.logins.items[0].username}"] + + + props.onOptionsMenuOpen(event, it)} className={props.classes.moreOptionsButton}> + + + + + + )} + +
; diff --git a/src/views/virtual-machine-panel/virtual-machine-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx similarity index 55% rename from src/views/virtual-machine-panel/virtual-machine-panel.tsx rename to src/views/virtual-machine-panel/virtual-machine-user-panel.tsx index d5d34555..17563053 100644 --- a/src/views/virtual-machine-panel/virtual-machine-panel.tsx +++ b/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx @@ -4,21 +4,19 @@ 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 = (theme: ArvadosTheme) => ({ button: { @@ -56,52 +54,35 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ 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 => ({ +const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ saveRequestedDate: () => dispatch(saveRequestedDate()), - loadVirtualMachinesData: () => dispatch(loadVirtualMachinesData()), - onOptionsMenuOpen: (event, virtualMachine) => { - dispatch(openVirtualMachinesContextMenu(event, virtualMachine)); - }, + loadVirtualMachinesData: () => dispatch(loadVirtualMachinesUserData()), }); interface VirtualMachinesPanelDataProps { requestedDate: string; virtualMachines: ListResults; - logins: VirtualMachineLogins; links: ListResults; - isAdmin: boolean; } interface VirtualMachinesPanelActionProps { saveRequestedDate: () => void; loadVirtualMachinesData: () => string; - onOptionsMenuOpen: (event: React.MouseEvent, virtualMachine: VirtualMachinesResource) => void; } type VirtualMachineProps = VirtualMachinesPanelActionProps & VirtualMachinesPanelDataProps & WithStyles; -export const VirtualMachinePanel = compose( +export const VirtualMachineUserPanel = compose( withStyles(styles), connect(mapStateToProps, mapDispatchToProps))( class extends React.Component { @@ -110,19 +91,19 @@ export const VirtualMachinePanel = compose( } render() { - const { virtualMachines, links, isAdmin } = this.props; + const { virtualMachines, links } = this.props; return ( - {!isAdmin && virtualMachines.itemsAvailable > 0 && } + {virtualMachines.itemsAvailable === 0 && } {virtualMachines.itemsAvailable > 0 && links.itemsAvailable > 0 && } - {!isAdmin && } + {} ); } } ); -const CardContentWithNoVirtualMachines = (props: VirtualMachineProps) => +const CardContentWithoutVirtualMachines = (props: VirtualMachineProps) => @@ -132,13 +113,7 @@ const CardContentWithNoVirtualMachines = (props: VirtualMachineProps) => - - {props.requestedDate && - - A request for shell access was sent on {props.requestedDate} - } + {virtualMachineSendRequest(props)} @@ -148,32 +123,36 @@ const CardContentWithVirtualMachines = (props: VirtualMachineProps) => - {props.isAdmin ? {adminVirtualMachinesTable(props)} - : -
- - {props.requestedDate && - - A request for shell access was sent on {props.requestedDate} - } -
- - {userVirtualMachinesTable(props)} -
- } + +
+ {virtualMachineSendRequest(props)} +
+ + {virtualMachinesTable(props)} +
+
; -const userVirtualMachinesTable = (props: VirtualMachineProps) => +const virtualMachineSendRequest = (props: VirtualMachineProps) => + + + {props.requestedDate && + + A request for shell access was sent on {props.requestedDate} + } + ; + +const virtualMachinesTable = (props: VirtualMachineProps) => @@ -199,34 +178,6 @@ const userVirtualMachinesTable = (props: VirtualMachineProps) =>
; -const adminVirtualMachinesTable = (props: VirtualMachineProps) => - - - - Uuid - Host name - Logins - - - - - {props.logins.items.length > 0 && props.virtualMachines.items.map((it, index) => - - {it.uuid} - {it.hostname} - ["{props.logins.items[0].username}"] - - - props.onOptionsMenuOpen(event, it)} className={props.classes.moreOptionsButton}> - - - - - - )} - -
; - const getUsername = (links: ListResults) => { return links.items[0].properties.username; }; diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx index 70f2a2dd..d4832360 100644 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@ -49,7 +49,8 @@ import { MyAccountPanel } from '~/views/my-account-panel/my-account-panel'; import { SharingDialog } from '~/views-components/sharing-dialog/sharing-dialog'; import { AdvancedTabDialog } from '~/views-components/advanced-tab-dialog/advanced-tab-dialog'; import { ProcessInputDialog } from '~/views-components/process-input-dialog/process-input-dialog'; -import { VirtualMachinePanel } from '~/views/virtual-machine-panel/virtual-machine-panel'; +import { VirtualMachineUserPanel } from '~/views/virtual-machine-panel/virtual-machine-user-panel'; +import { VirtualMachineAdminPanel } from '~/views/virtual-machine-panel/virtual-machine-admin-panel'; import { ProjectPropertiesDialog } from '~/views-components/project-properties-dialog/project-properties-dialog'; import { RepositoriesPanel } from '~/views/repositories-panel/repositories-panel'; import { KeepServicePanel } from '~/views/keep-service-panel/keep-service-panel'; @@ -144,7 +145,8 @@ export const WorkbenchPanel = - + + -- 2.30.2