/** * ============LICENSE_START======================================================================== * ONAP : ccsdk feature sdnr wt odlux * ================================================================================================= * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. * ================================================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. * ============LICENSE_END========================================================================== */ import * as React from 'react'; import { Theme, Typography, FormControlLabel, Checkbox } from '@mui/material'; import { WithStyles } from '@mui/styles'; import createStyles from '@mui/styles/createStyles'; import withStyles from '@mui/styles/withStyles'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Select from '@mui/material/Select'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import Fab from '@mui/material/Fab'; import AddIcon from '@mui/icons-material/Add'; import DeleteIcon from '@mui/icons-material/Delete'; import IconButton from '@mui/material/IconButton'; import { addMediatorConfigAsyncActionCreator, updateMediatorConfigAsyncActionCreator, removeMediatorConfigAsyncActionCreator } from '../actions/mediatorConfigActions'; import { MediatorConfig, ODLConfig } from '../models/mediatorServer'; import FormControl from '@mui/material/FormControl'; import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import { Panel } from '../../../../framework/src/components/material-ui/panel'; import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect'; import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; const styles = (theme: Theme) => createStyles({ root: { display: 'flex', flexDirection: 'column', flex: '1', }, fab: { position: 'absolute', bottom: theme.spacing(1), right: theme.spacing(1), }, title: { fontSize: 14, }, center: { flex: "1", display: "flex", alignItems: "center", justifyContent: "center", }, alignInOneLine: { display: 'flex', flexDirection: 'row' }, left: { marginRight: theme.spacing(1), }, right: { marginLeft: 0, } }); const TabContainer: React.SFC = ({ children }) => { return (
{children}
); } export enum EditMediatorConfigDialogMode { None = "none", AddMediatorConfig = "addMediatorConfig", EditMediatorConfig = "editMediatorConfig", RemoveMediatorConfig = "removeMediatorConfig", } const mapProps = (state: IApplicationStoreState) => ({ supportedDevices: state.mediator.mediatorServerState.supportedDevices }); const mapDispatch = (dispatcher: IDispatcher) => ({ addMediatorConfig: (config: MediatorConfig) => { dispatcher.dispatch(addMediatorConfigAsyncActionCreator(config)); }, updateMediatorConfig: (config: MediatorConfig) => { dispatcher.dispatch(updateMediatorConfigAsyncActionCreator(config)); }, removeMediatorConfig: (config: MediatorConfig) => { dispatcher.dispatch(removeMediatorConfigAsyncActionCreator(config)); }, }); type DialogSettings = { dialogTitle: string; dialogDescription: string; applyButtonText: string; cancelButtonText: string; readonly: boolean; readonlyName: boolean; }; const settings: { [key: string]: DialogSettings } = { [EditMediatorConfigDialogMode.None]: { dialogTitle: "", dialogDescription: "", applyButtonText: "", cancelButtonText: "", readonly: true, readonlyName: true, }, [EditMediatorConfigDialogMode.AddMediatorConfig]: { dialogTitle: "Add Mediator Configuration", dialogDescription: "", applyButtonText: "Add", cancelButtonText: "Cancel", readonly: false, readonlyName: false, }, [EditMediatorConfigDialogMode.EditMediatorConfig]: { dialogTitle: "Edit Mediator Configuration", dialogDescription: "", applyButtonText: "Update", cancelButtonText: "Cancel", readonly: false, readonlyName: true, }, [EditMediatorConfigDialogMode.RemoveMediatorConfig]: { dialogTitle: "Remove Mediator Configuration", dialogDescription: "", applyButtonText: "Remove", cancelButtonText: "Cancel", readonly: true, readonlyName: true, }, }; type EditMediatorConfigDialogComponentProps = WithStyles & Connect & { mode: EditMediatorConfigDialogMode; mediatorConfig: MediatorConfig; onClose: () => void; }; type EditMediatorConfigDialogComponentState = MediatorConfig & { activeTab: number; activeOdlConfig: string, forceAddOdlConfig: boolean, isOdlConfigHostnameEmpty: boolean }; class EditMediatorConfigDialogComponent extends React.Component { constructor(props: EditMediatorConfigDialogComponentProps) { super(props); this.state = { ...this.props.mediatorConfig, activeTab: 0, activeOdlConfig: "", forceAddOdlConfig: false, isOdlConfigHostnameEmpty: false }; } private odlConfigValueChangeHandlerCreator = (index: number, property: TKey, mapValue: (event: React.ChangeEvent) => any) => (event: React.ChangeEvent) => { event.stopPropagation(); event.preventDefault(); this.setState({ ODLConfig: [ ...this.state.ODLConfig.slice(0, index), { ...this.state.ODLConfig[index], [property]: mapValue(event) }, ...this.state.ODLConfig.slice(index + 1) ] }); } render(): JSX.Element { const setting = settings[this.props.mode]; const { classes } = this.props; return ( {setting.dialogTitle} {setting.dialogDescription} this.setState({ activeTab: value })} > {this.state.activeTab === 0 ? { this.setState({ Name: event.target.value }); }} /> Device { this.setState({ DeviceIp: event.target.value }); }} /> { this.setState({ DevicePort: +event.target.value }); }} /> { this.setState({ TrapPort: +event.target.value }); }} /> { this.setState({ NcUsername: event.target.value }); }} /> { this.setState({ NcPassword: event.target.value }); }} /> { this.setState({ NcPort: +event.target.value }); }} /> : null} {this.state.activeTab === 1 ? {this.state.ODLConfig && this.state.ODLConfig.length > 0 ? this.state.ODLConfig.map((cfg, ind) => { const panelId = `panel-${ind}`; const deleteButton = ( { this.setState({ ODLConfig: [ ...this.state.ODLConfig.slice(0, ind), ...this.state.ODLConfig.slice(ind + 1) ] }); }} size="large">) return ( { this.setState({ activeOdlConfig: (this.state.activeOdlConfig === id) ? "" : (id || "") }); console.log("activeOdlConfig " + id); this.hideHostnameErrormessage(id) }} >
Protocoll e.target.value)} /> +e.target.value)} />
{ this.state.isOdlConfigHostnameEmpty && Please add a hostname. }
e.target.value)} /> e.target.value)} />
e.target.checked)} />} label="Trustall" />
); }) : (this.state.forceAddOdlConfig ?
Please add at least one ODL auto connect configuration.
:
Please add an ODL auto connect configuration.
) } this.setState({ ODLConfig: [...this.state.ODLConfig, { Server: '', Port: 8181, Protocol: 'https', User: 'admin', Password: 'admin', Trustall: false }] })} >
: null}
); } private addConfig = (event: any) => { event.preventDefault(); event.stopPropagation(); if (this.state.ODLConfig.length === 0) { this.setState({ activeTab: 1, forceAddOdlConfig: true }); } else if (this.state.ODLConfig.length > 0) { for (let i = 0; i <= this.state.ODLConfig.length; i++) { if (this.isHostnameEmpty(i)) { this.setState({ activeOdlConfig: 'panel-' + i }) this.setState({ isOdlConfigHostnameEmpty: true }) return; } } this.onApply(Object.keys(this.state).reduce((acc, key) => { // do not copy additional state properties if (key !== "activeTab" && key !== "activeOdlConfig" && key !== "isOdlConfigHostnameEmpty" && key !== "forceAddOdlConfig" && key !== "_initialMediatorConfig") acc[key] = (this.state as any)[key]; return acc; }, {} as MediatorConfig)); this.resetPanel(); } } private resetPanel = () => { this.setState({ forceAddOdlConfig: false, isOdlConfigHostnameEmpty: false, activeTab: 0 }); } private hideHostnameErrormessage = (panelId: string | null) => { if (panelId) { let id = Number(panelId.split('-')[1]); if (!this.isHostnameEmpty(id)) { this.setState({ isOdlConfigHostnameEmpty: false }) } } } private isHostnameEmpty = (id: number) => { const element = this.state.ODLConfig[id]; if (element) { if (!element.Server) { return true; } else { return false } } else { return null; } } private onApply = (config: MediatorConfig) => { this.props.onClose && this.props.onClose(); switch (this.props.mode) { case EditMediatorConfigDialogMode.AddMediatorConfig: config && this.props.addMediatorConfig(config); break; case EditMediatorConfigDialogMode.EditMediatorConfig: config && this.props.updateMediatorConfig(config); break; case EditMediatorConfigDialogMode.RemoveMediatorConfig: config && this.props.removeMediatorConfig(config); break; } }; private onCancel = () => { this.props.onClose && this.props.onClose(); } static getDerivedStateFromProps(props: EditMediatorConfigDialogComponentProps, state: EditMediatorConfigDialogComponentState & { _initialMediatorConfig: MediatorConfig }): EditMediatorConfigDialogComponentState & { _initialMediatorConfig: MediatorConfig } { if (props.mediatorConfig !== state._initialMediatorConfig) { state = { ...state, ...props.mediatorConfig, _initialMediatorConfig: props.mediatorConfig, }; } return state; } } export const EditMediatorConfigDialog = withStyles(styles)(connect(mapProps, mapDispatch)(EditMediatorConfigDialogComponent)); export default EditMediatorConfigDialog;