update odlux and featureaggregator
[ccsdk/features.git] / sdnr / wt / odlux / apps / connectApp / src / components / editNetworkElementDialog.tsx
1 /**
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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
15  * the License.
16  * ============LICENSE_END==========================================================================
17  */
18 import * as React from 'react';
19
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';
28
29 import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
30
31 import {
32   editNetworkElementAsyncActionCreator,
33   addNewNetworkElementAsyncActionCreator,
34   removeNetworkElementAsyncActionCreator
35 } from '../actions/networkElementsActions';
36
37 import { unmountNetworkElementAsyncActionCreator, mountNetworkElementAsyncActionCreator } from '../actions/mountedNetworkElementsActions';
38 import { NetworkElementConnection, UpdateNetworkElement } from '../models/networkElementConnection';
39 import { removeWebUriAction } from '../actions/commonNetworkElementsActions';
40
41 export enum EditNetworkElementDialogMode {
42   None = "none",
43   EditNetworkElement = "editNetworkElement",
44   RemoveNetworkElement = "removeNetworkElement",
45   AddNewNetworkElement = "addNewNetworkElement",
46   MountNetworkElement = "mountNetworkElement",
47   UnmountNetworkElement = "unmountNetworkElement",
48 }
49
50 const mapDispatch = (dispatcher: IDispatcher) => ({
51   addNewNetworkElement: async (element: NetworkElementConnection) => {
52     await dispatcher.dispatch(addNewNetworkElementAsyncActionCreator(element));
53     await dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element));
54   },
55   mountNetworkElement: (element: NetworkElementConnection) => dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element)),
56   unmountNetworkElement: (element: NetworkElementConnection) => {
57     dispatcher.dispatch(unmountNetworkElementAsyncActionCreator(element && element.nodeId));
58   },
59   editNetworkElement: async (element: UpdateNetworkElement, mountElement: NetworkElementConnection) => {
60     await dispatcher.dispatch(editNetworkElementAsyncActionCreator(element));
61     await dispatcher.dispatch(mountNetworkElementAsyncActionCreator(mountElement));
62   },
63   removeNetworkElement: (element: UpdateNetworkElement) => {
64     dispatcher.dispatch(removeNetworkElementAsyncActionCreator(element));
65     dispatcher.dispatch(removeWebUriAction(element.id));
66   }
67 });
68
69 type DialogSettings = {
70   dialogTitle: string,
71   dialogDescription: string,
72   applyButtonText: string,
73   cancelButtonText: string,
74   enableMountIdEditor: boolean,
75   enableUsernameEditor: boolean,
76   enableExtendedEditor: boolean,
77 }
78
79 const settings: { [key: string]: DialogSettings } = {
80   [EditNetworkElementDialogMode.None]: {
81     dialogTitle: "",
82     dialogDescription: "",
83     applyButtonText: "",
84     cancelButtonText: "",
85     enableMountIdEditor: false,
86     enableUsernameEditor: false,
87     enableExtendedEditor: false,
88   },
89
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,
98   },
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,
107   },
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,
116   },
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,
125   },
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,
134   }
135 }
136
137 type EditNetworkElementDialogComponentProps = Connect<undefined, typeof mapDispatch> & {
138   mode: EditNetworkElementDialogMode;
139   initialNetworkElement: NetworkElementConnection;
140   onClose: () => void;
141 };
142
143 type EditNetworkElementDialogComponentState = NetworkElementConnection;
144
145 class EditNetworkElementDialogComponent extends React.Component<EditNetworkElementDialogComponentProps, EditNetworkElementDialogComponentState> {
146   constructor(props: EditNetworkElementDialogComponentProps) {
147     super(props);
148
149     this.state = {
150       nodeId: this.props.initialNetworkElement.nodeId,
151       isRequired: false,
152       host: this.props.initialNetworkElement.host,
153       port: this.props.initialNetworkElement.port,
154     };
155   }
156
157   render(): JSX.Element {
158     const setting = settings[this.props.mode];
159     return (
160       <Dialog open={this.props.mode !== EditNetworkElementDialogMode.None}>
161         <DialogTitle id="form-dialog-title">{setting.dialogTitle}</DialogTitle>
162         <DialogContent>
163           <DialogContentText>
164             {setting.dialogDescription}
165           </DialogContentText>
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>
178             </Select>
179           </FormControl>
180         </DialogContent>
181         <DialogActions>
182           <Button onClick={(event) => {
183             this.onApply({
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,
191             });
192             event.preventDefault();
193             event.stopPropagation();
194           }} > {setting.applyButtonText} </Button>
195           <Button onClick={(event) => {
196             this.onCancel();
197             event.preventDefault();
198             event.stopPropagation();
199           }} color="secondary"> {setting.cancelButtonText} </Button>
200         </DialogActions>
201       </Dialog>
202     )
203   }
204
205   private onApply = (element: NetworkElementConnection) => {
206     this.props.onClose && this.props.onClose();
207     let updateElement: UpdateNetworkElement = {
208       id: this.state.nodeId
209     }
210     switch (this.props.mode) {
211       case EditNetworkElementDialogMode.AddNewNetworkElement:
212         element && this.props.addNewNetworkElement(element);
213         break;
214       case EditNetworkElementDialogMode.MountNetworkElement:
215         element && this.props.mountNetworkElement(element);
216         break;
217       case EditNetworkElementDialogMode.UnmountNetworkElement:
218         element && this.props.unmountNetworkElement(element);
219         break;
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);
228         break;
229       case EditNetworkElementDialogMode.RemoveNetworkElement:
230         element && this.props.removeNetworkElement(updateElement);
231         break;
232     }
233   };
234
235   private onCancel = () => {
236     this.props.onClose && this.props.onClose();
237   }
238
239   static getDerivedStateFromProps(props: EditNetworkElementDialogComponentProps, state: EditNetworkElementDialogComponentState & { _initialNetworkElement: NetworkElementConnection }): EditNetworkElementDialogComponentState & { _initialNetworkElement: NetworkElementConnection } {
240     if (props.initialNetworkElement !== state._initialNetworkElement) {
241       state = {
242         ...state,
243         ...props.initialNetworkElement,
244         _initialNetworkElement: props.initialNetworkElement,
245       };
246     }
247     return state;
248   }
249 }
250
251 export const EditNetworkElementDialog = connect(undefined, mapDispatch)(EditNetworkElementDialogComponent);
252 export default EditNetworkElementDialog;