2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt odlux
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
18 import * as React from 'react';
20 import Button from '@material-ui/core/Button';
21 import TextField from '@material-ui/core/TextField';
22 import Dialog from '@material-ui/core/Dialog';
23 import DialogActions from '@material-ui/core/DialogActions';
24 import DialogContent from '@material-ui/core/DialogContent';
25 import DialogContentText from '@material-ui/core/DialogContentText';
26 import DialogTitle from '@material-ui/core/DialogTitle';
27 import { FormControl, InputLabel, Select, MenuItem } from '@material-ui/core';
29 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
32 editNetworkElementAsyncActionCreator,
33 addNewNetworkElementAsyncActionCreator,
34 removeNetworkElementAsyncActionCreator
35 } from '../actions/networkElementsActions';
37 import { unmountNetworkElementAsyncActionCreator, mountNetworkElementAsyncActionCreator } from '../actions/mountedNetworkElementsActions';
38 import { NetworkElementConnection, UpdateNetworkElement } from '../models/networkElementConnection';
39 import { removeWebUriAction } from '../actions/commonNetworkElementsActions';
41 export enum EditNetworkElementDialogMode {
43 EditNetworkElement = "editNetworkElement",
44 RemoveNetworkElement = "removeNetworkElement",
45 AddNewNetworkElement = "addNewNetworkElement",
46 MountNetworkElement = "mountNetworkElement",
47 UnmountNetworkElement = "unmountNetworkElement",
50 const mapDispatch = (dispatcher: IDispatcher) => ({
51 addNewNetworkElement: async (element: NetworkElementConnection) => {
52 await dispatcher.dispatch(addNewNetworkElementAsyncActionCreator(element));
53 await dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element));
55 mountNetworkElement: (element: NetworkElementConnection) => dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element)),
56 unmountNetworkElement: (element: NetworkElementConnection) => {
57 dispatcher.dispatch(unmountNetworkElementAsyncActionCreator(element && element.nodeId));
59 editNetworkElement: async (element: UpdateNetworkElement, mountElement: NetworkElementConnection) => {
60 await dispatcher.dispatch(editNetworkElementAsyncActionCreator(element));
61 await dispatcher.dispatch(mountNetworkElementAsyncActionCreator(mountElement));
63 removeNetworkElement: (element: UpdateNetworkElement) => {
64 dispatcher.dispatch(removeNetworkElementAsyncActionCreator(element));
65 dispatcher.dispatch(removeWebUriAction(element.id));
69 type DialogSettings = {
71 dialogDescription: string,
72 applyButtonText: string,
73 cancelButtonText: string,
74 enableMountIdEditor: boolean,
75 enableUsernameEditor: boolean,
76 enableExtendedEditor: boolean,
79 const settings: { [key: string]: DialogSettings } = {
80 [EditNetworkElementDialogMode.None]: {
82 dialogDescription: "",
85 enableMountIdEditor: false,
86 enableUsernameEditor: false,
87 enableExtendedEditor: false,
90 [EditNetworkElementDialogMode.AddNewNetworkElement]: {
91 dialogTitle: "Add new network element",
92 dialogDescription: "Add this new network element:",
93 applyButtonText: "Add network element",
94 cancelButtonText: "Cancel",
95 enableMountIdEditor: true,
96 enableUsernameEditor: true,
97 enableExtendedEditor: true,
99 [EditNetworkElementDialogMode.MountNetworkElement]: {
100 dialogTitle: "Mount network element",
101 dialogDescription: "mount this network element:",
102 applyButtonText: "mount network element",
103 cancelButtonText: "Cancel",
104 enableMountIdEditor: false,
105 enableUsernameEditor: false,
106 enableExtendedEditor: false,
108 [EditNetworkElementDialogMode.UnmountNetworkElement]: {
109 dialogTitle: "Unmount network element",
110 dialogDescription: "unmount this network element:",
111 applyButtonText: "Unmount network element",
112 cancelButtonText: "Cancel",
113 enableMountIdEditor: false,
114 enableUsernameEditor: false,
115 enableExtendedEditor: false,
117 [EditNetworkElementDialogMode.EditNetworkElement]: {
118 dialogTitle: "Modify the network elements",
119 dialogDescription: "Modify this network element",
120 applyButtonText: "Modify",
121 cancelButtonText: "Cancel",
122 enableMountIdEditor: false,
123 enableUsernameEditor: true,
124 enableExtendedEditor: false,
126 [EditNetworkElementDialogMode.RemoveNetworkElement]: {
127 dialogTitle: "Remove network element",
128 dialogDescription: "Do you really want to remove this network element:",
129 applyButtonText: "Remove network element",
130 cancelButtonText: "Cancel",
131 enableMountIdEditor: false,
132 enableUsernameEditor: false,
133 enableExtendedEditor: false,
137 type EditNetworkElementDialogComponentProps = Connect<undefined, typeof mapDispatch> & {
138 mode: EditNetworkElementDialogMode;
139 initialNetworkElement: NetworkElementConnection;
143 type EditNetworkElementDialogComponentState = NetworkElementConnection;
145 class EditNetworkElementDialogComponent extends React.Component<EditNetworkElementDialogComponentProps, EditNetworkElementDialogComponentState> {
146 constructor(props: EditNetworkElementDialogComponentProps) {
150 nodeId: this.props.initialNetworkElement.nodeId,
152 host: this.props.initialNetworkElement.host,
153 port: this.props.initialNetworkElement.port,
157 render(): JSX.Element {
158 const setting = settings[this.props.mode];
160 <Dialog open={this.props.mode !== EditNetworkElementDialogMode.None}>
161 <DialogTitle id="form-dialog-title">{setting.dialogTitle}</DialogTitle>
164 {setting.dialogDescription}
166 <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" aria-label="name" type="text" fullWidth value={this.state.nodeId} onChange={(event) => { this.setState({ nodeId: event.target.value }); }} />
167 <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="ipaddress" label="IP address" aria-label="ip adress" type="text" fullWidth value={this.state.host} onChange={(event) => { this.setState({ host: event.target.value }); }} />
168 <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} margin="dense" id="netconfport" label="NetConf port" aria-label="netconf port" type="number" fullWidth value={this.state.port.toString()} onChange={(event) => { this.setState({ port: +event.target.value }); }} />
169 {setting.enableUsernameEditor && <TextField disabled={!setting.enableUsernameEditor} spellCheck={false} margin="dense" id="username" label="Username" aria-label="username" type="text" fullWidth value={this.state.username} onChange={(event) => { this.setState({ username: event.target.value }); }} /> || null}
170 {setting.enableUsernameEditor && <TextField disabled={!setting.enableUsernameEditor} spellCheck={false} margin="dense" id="password" label="Password" aria-label="password" type="password" fullWidth value={this.state.password} onChange={(event) => { this.setState({ password: event.target.value }); }} /> || null}
171 <FormControl fullWidth disabled={!setting.enableUsernameEditor}>
172 <InputLabel htmlFor="active">Required</InputLabel>
173 <Select value={this.state.isRequired || false} onChange={(event) => {
174 this.setState({ isRequired: event.target.value as any as boolean });
175 }} inputProps={{ name: 'required', id: 'required' }} fullWidth >
176 <MenuItem value={true as any as string} >True</MenuItem>
177 <MenuItem value={false as any as string} >False</MenuItem>
182 <Button onClick={(event) => {
184 isRequired: this.state.isRequired,
185 id: this.state.nodeId,
186 nodeId: this.state.nodeId,
187 host: this.state.host,
188 port: this.state.port,
189 username: this.state.username,
190 password: this.state.password,
192 event.preventDefault();
193 event.stopPropagation();
194 }} > {setting.applyButtonText} </Button>
195 <Button onClick={(event) => {
197 event.preventDefault();
198 event.stopPropagation();
199 }} color="secondary"> {setting.cancelButtonText} </Button>
205 private onApply = (element: NetworkElementConnection) => {
206 this.props.onClose && this.props.onClose();
207 let updateElement: UpdateNetworkElement = {
208 id: this.state.nodeId
210 switch (this.props.mode) {
211 case EditNetworkElementDialogMode.AddNewNetworkElement:
212 element && this.props.addNewNetworkElement(element);
214 case EditNetworkElementDialogMode.MountNetworkElement:
215 element && this.props.mountNetworkElement(element);
217 case EditNetworkElementDialogMode.UnmountNetworkElement:
218 element && this.props.unmountNetworkElement(element);
220 case EditNetworkElementDialogMode.EditNetworkElement:
221 if (this.props.initialNetworkElement.isRequired !== this.state.isRequired)
222 updateElement.isRequired = this.state.isRequired;
223 if (this.props.initialNetworkElement.username !== this.state.username)
224 updateElement.username = this.state.username;
225 if (this.props.initialNetworkElement.password !== this.state.password)
226 updateElement.password = this.state.password;
227 element && this.props.editNetworkElement(updateElement, element);
229 case EditNetworkElementDialogMode.RemoveNetworkElement:
230 element && this.props.removeNetworkElement(updateElement);
235 private onCancel = () => {
236 this.props.onClose && this.props.onClose();
239 static getDerivedStateFromProps(props: EditNetworkElementDialogComponentProps, state: EditNetworkElementDialogComponentState & { _initialNetworkElement: NetworkElementConnection }): EditNetworkElementDialogComponentState & { _initialNetworkElement: NetworkElementConnection } {
240 if (props.initialNetworkElement !== state._initialNetworkElement) {
243 ...props.initialNetworkElement,
244 _initialNetworkElement: props.initialNetworkElement,
251 export const EditNetworkElementDialog = connect(undefined, mapDispatch)(EditNetworkElementDialogComponent);
252 export default EditNetworkElementDialog;