import * as React from 'react'; import { Theme, createStyles, withStyles, WithStyles } from '@material-ui/core/styles'; import AddIcon from '@material-ui/icons/Add'; import LinkIcon from '@material-ui/icons/Link'; import LinkOffIcon from '@material-ui/icons/LinkOff'; import RemoveIcon from '@material-ui/icons/RemoveCircleOutline'; import Button from '@material-ui/core/Button'; import IconButton from '@material-ui/core/IconButton'; import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; import { connect, Connect, IDispatcher } from '../../../../framework/src/flux/connect'; import { NavigateToApplication } from '../../../../framework/src/actions/navigationActions'; import { RequiredNetworkElementType } from '../models/requiredNetworkElements'; import { createRequiredNetworkElementsActions, createRequiredNetworkElementsProperties } from '../handlers/requiredNetworkElementsHandler'; import EditNetworkElementDialog, { EditNetworkElementDialogMode } from './editNetworkElementDialog'; import { Tooltip } from '@material-ui/core'; import { NetworkElementBaseType } from 'models/networkElementBase'; const styles = (theme: Theme) => createStyles({ connectionStatusConnected: { color: 'darkgreen', }, connectionStatusConnecting: { color: 'blue', }, connectionStatusDisconnected: { color: 'red', }, button: { margin: 0, padding: "6px 6px", minWidth: 'unset' }, spacer: { marginLeft: theme.spacing.unit, marginRight: theme.spacing.unit, display: "inline" } }); const mapProps = (state: IApplicationStoreState) => ({ requiredNetworkElementsProperties: createRequiredNetworkElementsProperties(state), mountedNetworkElements: state.connect.mountedNetworkElements }); const mapDispatch = (dispatcher: IDispatcher) => ({ requiredNetworkElementsActions: createRequiredNetworkElementsActions(dispatcher.dispatch), navigateToApplication: (applicationName: string, path?: string) => dispatcher.dispatch(new NavigateToApplication(applicationName, path)), }); type RequiredNetworkElementsListComponentProps = WithStyles & Connect; type RequiredNetworkElementsListComponentState = { networkElementToEdit: RequiredNetworkElementType, networkElementEditorMode: EditNetworkElementDialogMode } const emptyRequireNetworkElement = { mountId: '', host: '', port: 0 }; const RequiredNetworkElementTable = MaterialTable as MaterialTableCtorType; export class RequiredNetworkElementsListComponent extends React.Component { constructor(props: RequiredNetworkElementsListComponentProps) { super(props); this.state = { networkElementToEdit: emptyRequireNetworkElement, networkElementEditorMode: EditNetworkElementDialogMode.None }; } // private navigationCreator render(): JSX.Element { const { classes } = this.props; const { networkElementToEdit } = this.state; const addRequireNetworkElementAction = { icon: AddIcon, tooltip: 'Add', onClick: () => { this.setState({ networkElementEditorMode: EditNetworkElementDialogMode.MountNetworkElementToRequiredNetworkElements, networkElementToEdit: emptyRequireNetworkElement, }); } }; return ( <> { const unknownNetworkElement = this.props.mountedNetworkElements.elements.find(el => el.mountId === rowData.mountId); const connectionStatus = unknownNetworkElement && unknownNetworkElement.connectionStatus || 'disconnected'; const cssClasses = connectionStatus === "connected" ? classes.connectionStatusConnected : connectionStatus === "disconnected" ? classes.connectionStatusDisconnected : classes.connectionStatusConnecting return
{ connectionStatus }
} }, { property: "host", title: "Host", type: ColumnType.text }, { property: "port", title: "Port", type: ColumnType.text }, // { property: "username", title: "Username", type: ColumnType.text }, // { property: "password", title: "Password", type: ColumnType.text }, { property: "actions", title: "Actions", type: ColumnType.custom, customControl: ({ rowData }) => { const unknownNetworkElement = this.props.mountedNetworkElements.elements.find(el => el.mountId === rowData.mountId); const connectionStatus = unknownNetworkElement && unknownNetworkElement.connectionStatus || 'disconnected'; return ( <>
this.onOpenMountdNetworkElementsDialog(event, rowData) }> this.onOpenUnmountdNetworkElementsDialog(event, rowData) }> this.onOpenRemoveRequiredNetworkElementDialog(event, rowData) } >
) } }, ] } idProperty="mountId" { ...this.props.requiredNetworkElementsActions } { ...this.props.requiredNetworkElementsProperties } asynchronus >
); }; public componentDidMount() { this.props.requiredNetworkElementsActions.onRefresh(); } private onOpenRemoveRequiredNetworkElementDialog = (event: React.MouseEvent, element: RequiredNetworkElementType) => { this.setState({ networkElementToEdit: element, networkElementEditorMode: EditNetworkElementDialogMode.RequiredNetworkElementToUnknownNetworkElements }); event.preventDefault(); event.stopPropagation(); } private onOpenUnmountdNetworkElementsDialog = (event: React.MouseEvent, element: RequiredNetworkElementType) => { this.setState({ networkElementToEdit: element, networkElementEditorMode: EditNetworkElementDialogMode.UnmountNetworkElement }); event.preventDefault(); event.stopPropagation(); } private onOpenMountdNetworkElementsDialog = (event: React.MouseEvent, element: RequiredNetworkElementType) => { this.setState({ networkElementToEdit: element, networkElementEditorMode: EditNetworkElementDialogMode.MountNetworkElement }); event.preventDefault(); event.stopPropagation(); } private onCloseEditNetworkElementDialog = () => { this.setState({ networkElementEditorMode: EditNetworkElementDialogMode.None, networkElementToEdit: emptyRequireNetworkElement, }); } private navigateToApplicationHandlerCreator = (applicationName: string, element: NetworkElementBaseType) => (event: React.MouseEvent) => { this.props.navigateToApplication(applicationName, element.mountId); event.preventDefault(); event.stopPropagation(); } } export const RequiredNetworkElementsList = withStyles(styles)(connect(mapProps, mapDispatch)(RequiredNetworkElementsListComponent)); export default RequiredNetworkElementsList;