Add new code new version
[sdc.git] / openecomp-ui / src / sdc-app / onboarding / softwareProduct / SoftwareProduct.js
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 import {connect} from 'react-redux';
22
23 import i18n from 'nfvo-utils/i18n/i18n.js';
24 import {statusEnum as versionStatusEnum} from 'nfvo-components/panel/versionController/VersionControllerConstants.js';
25 import VersionControllerUtils from 'nfvo-components/panel/versionController/VersionControllerUtils.js';
26 import TabulatedEditor from 'src/nfvo-components/editor/TabulatedEditor.jsx';
27
28 import {enums} from 'sdc-app/onboarding/OnboardingConstants.js';
29 import OnboardingActionHelper from 'sdc-app/onboarding/OnboardingActionHelper.js';
30
31 import {navigationItems} from './SoftwareProductConstants.js';
32 import SoftwareProductActionHelper from './SoftwareProductActionHelper.js';
33 import SoftwareProductComponentsActionHelper from './components/SoftwareProductComponentsActionHelper.js';
34
35 const buildComponentNavigationBarGroups = ({componentId, meta}) => {
36         const groups = ([
37                 {
38                         id: navigationItems.GENERAL + '|' + componentId,
39                         name: i18n('General'),
40                         disabled: false,
41                         meta
42                 }, {
43                         id: navigationItems.COMPUTE + '|' + componentId,
44                         name: i18n('Compute'),
45                         disabled: false,
46                         meta
47                 }, {
48                         id: navigationItems.LOAD_BALANCING + '|' + componentId,
49                         name: i18n('High Availability & Load Balancing'),
50                         disabled: false,
51                         meta
52                 }, {
53                         id: navigationItems.NETWORKS + '|' + componentId,
54                         name: i18n('Networks'),
55                         disabled: false,
56                         meta
57                 }, {
58                         id: navigationItems.STORAGE + '|' + componentId,
59                         name: i18n('Storage'),
60                         disabled: false,
61                         meta
62                 }, {
63                         id: navigationItems.PROCESS_DETAILS + '|' + componentId,
64                         name: i18n('Process Details'),
65                         disabled: false,
66                         meta
67                 }, {
68                         id: navigationItems.MONITORING + '|' + componentId,
69                         name: i18n('Monitoring'),
70                         disabled: false,
71                         meta
72                 }
73         ]);
74
75         return groups;
76 };
77
78 const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds}) => {
79         const {softwareProductEditor: {data: currentSoftwareProduct = {}}} = softwareProduct;
80         const {id, name} = currentSoftwareProduct;
81         const groups = [{
82                 id: id,
83                 name: name,
84                 items: [
85                         {
86                                 id: navigationItems.VENDOR_SOFTWARE_PRODUCT,
87                                 name: i18n('Overview'),
88                                 disabled: false,
89                                 meta
90                         }, {
91                                 id: navigationItems.GENERAL,
92                                 name: i18n('General'),
93                                 disabled: false,
94                                 meta
95                         }, {
96                                 id: navigationItems.PROCESS_DETAILS,
97                                 name: i18n('Process Details'),
98                                 disabled: false,
99                                 meta
100                         }, {
101                                 id: navigationItems.NETWORKS,
102                                 name: i18n('Networks'),
103                                 disabled: false,
104                                 meta
105                         }, {
106                                 id: navigationItems.ATTACHMENTS,
107                                 name: i18n('Attachments'),
108                                 disabled: false,
109                                 meta
110                         }, {
111                                 id: navigationItems.COMPONENTS,
112                                 name: i18n('Components'),
113                                 hidden: componentsList.length <= 0,
114                                 meta,
115                                 expanded: mapOfExpandedIds[navigationItems.COMPONENTS] === true && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
116                                 items: [
117                                         ...componentsList.map(({id, displayName}) => ({
118                                                 id: navigationItems.COMPONENTS + '|' + id,
119                                                 name: displayName,
120                                                 meta,
121                                                 expanded: mapOfExpandedIds[navigationItems.COMPONENTS + '|' + id] === true  && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
122                                                 items: buildComponentNavigationBarGroups({componentId: id, meta})
123                                         }))
124                                 ]
125                         }
126                 ]
127         }];
128         let activeItemId = ({
129                 [enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE]: navigationItems.VENDOR_SOFTWARE_PRODUCT,
130                 [enums.SCREEN.SOFTWARE_PRODUCT_DETAILS]: navigationItems.GENERAL,
131                 [enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS]: navigationItems.ATTACHMENTS,
132                 [enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES]: navigationItems.PROCESS_DETAILS,
133                 [enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS]: navigationItems.NETWORKS,
134                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS]: navigationItems.COMPONENTS
135         })[screen];
136
137         if(componentId) {
138                 activeItemId =
139                         Object.keys(mapOfExpandedIds).length === 1 && mapOfExpandedIds[navigationItems.COMPONENTS] === true ?
140                         navigationItems.COMPONENTS : ({
141                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL]: navigationItems.GENERAL,
142                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE]: navigationItems.COMPUTE,
143                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING]: navigationItems.LOAD_BALANCING,
144                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK]: navigationItems.NETWORKS,
145                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE]: navigationItems.STORAGE,
146                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES]: navigationItems.PROCESS_DETAILS,
147                                 [enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING]: navigationItems.MONITORING
148                         })[screen] + '|' + componentId;
149         }
150
151         return {
152                 activeItemId, groups
153         };
154 };
155
156 const buildVersionControllerProps = (softwareProduct) => {
157         const {softwareProductEditor} = softwareProduct;
158         const {data: currentSoftwareProduct = {}, isValidityData = true} = softwareProductEditor;
159
160         const {version, viewableVersions, status: currentStatus, lockingUser} = currentSoftwareProduct;
161         const {status, isCheckedOut} = (currentStatus === versionStatusEnum.CHECK_OUT_STATUS) ?
162                 VersionControllerUtils.getCheckOutStatusKindByUserID(currentStatus, lockingUser) :
163                 {status: currentStatus, isCheckedOut: false};
164
165         return {
166                 status, isCheckedOut, version, viewableVersions,
167                 isFormDataValid: isValidityData
168         };
169 };
170
171 const mapStateToProps = ({softwareProduct}, {currentScreen: {screen, props: {componentId}}}) => {
172         const {softwareProductEditor, softwareProductComponents, softwareProductQuestionnaire} = softwareProduct;
173         const {data: currentSoftwareProduct = {}, mapOfExpandedIds = []} = softwareProductEditor;
174         const {version} = currentSoftwareProduct;
175         const {componentsList = []} = softwareProductComponents;
176         const isReadOnlyMode = VersionControllerUtils.isReadOnly(currentSoftwareProduct);
177         const {qdata} = softwareProductQuestionnaire;
178         let currentComponentMeta = {};
179         if(componentId) {
180                 const {componentEditor: {data: componentData = {} , qdata: componentQdata}} = softwareProductComponents;
181                 currentComponentMeta = {componentData, componentQdata};
182         }
183         const meta = {softwareProduct: currentSoftwareProduct, qdata, version, isReadOnlyMode, currentComponentMeta};
184         return {
185                 versionControllerProps: buildVersionControllerProps(softwareProduct),
186                 navigationBarProps: buildNavigationBarProps({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds})
187         };
188 };
189
190 const autoSaveBeforeNavigate = ({dispatch, screen, softwareProductId, componentId, meta: {isReadOnlyMode, softwareProduct, qdata, currentComponentMeta: {componentData, componentQdata}}}) => {
191         let promise;
192         if (isReadOnlyMode) {
193                 promise = Promise.resolve();
194         } else {
195                 switch(screen) {
196                         case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
197                                 promise = SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
198                                 break;
199                         case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
200                                 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponent(dispatch, {softwareProductId, vspComponentId: componentId, componentData, qdata: componentQdata});
201                                 break;
202                         case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
203                         case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
204                         case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
205                         case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
206                                 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponentQuestionnaire(dispatch, {softwareProductId, vspComponentId: componentId, qdata: componentQdata});
207                                 break;
208                         default:
209                                 promise = Promise.resolve();
210                                 break;
211                 }
212         }
213         return promise;
214 };
215
216
217 const onComponentNavigate = (dispatch, {id, softwareProductId, version, currentComponentId}) => {
218         const [nextScreen, nextComponentId] = id.split('|');
219         switch(nextScreen) {
220                 case navigationItems.COMPONENTS:
221                         if(nextComponentId === currentComponentId) {
222                                 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId});
223                         } else {
224                                 OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
225                         }
226                         break;
227                 case navigationItems.GENERAL:
228                         OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
229                         break;
230                 case navigationItems.COMPUTE:
231                         OnboardingActionHelper.navigateToComponentCompute(dispatch, {softwareProductId, componentId: nextComponentId});
232                         break;
233                 case navigationItems.LOAD_BALANCING:
234                         OnboardingActionHelper.navigateToComponentLoadBalancing(dispatch, {softwareProductId, componentId: nextComponentId});
235                         break;
236                 case navigationItems.NETWORKS:
237                         OnboardingActionHelper.navigateToComponentNetwork(dispatch, {softwareProductId, componentId: nextComponentId, version});
238                         break;
239                 case navigationItems.STORAGE:
240                         OnboardingActionHelper.navigateToComponentStorage(dispatch, {softwareProductId, componentId: nextComponentId});
241                         break;
242                 case navigationItems.PROCESS_DETAILS:
243                         OnboardingActionHelper.navigateToSoftwareProductComponentProcesses(dispatch, {softwareProductId, componentId: nextComponentId});
244                         break;
245                 case navigationItems.MONITORING:
246                         OnboardingActionHelper.navigateToSoftwareProductComponentMonitoring(dispatch, {softwareProductId, componentId: nextComponentId});
247                         break;
248         }
249 };
250
251 const mapActionsToProps = (dispatch, {currentScreen: {screen, props: {softwareProductId, componentId: currentComponentId}}}) => {
252
253         const props = {
254                 onClose: ({version}) => {
255                         if (screen === enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE) {
256                                 OnboardingActionHelper.navigateToOnboardingCatalog(dispatch);
257                         } else {
258                                 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version});
259                         }
260                 },
261                 onVersionSwitching: (version) => {
262                         OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version});
263                 },
264                 onToggle: (groups, itemIdToExpand) => groups.map(({items}) => SoftwareProductActionHelper.toggleNavigationItems(dispatch, {items, itemIdToExpand})),
265                 onNavigate: ({id, meta}) => {
266                         let preNavigate = autoSaveBeforeNavigate({dispatch, screen, meta, softwareProductId, componentId: currentComponentId});
267                         preNavigate.then(() => {
268                                 switch(id) {
269                                         case navigationItems.VENDOR_SOFTWARE_PRODUCT:
270                                                 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version: meta.version});
271                                                 break;
272                                         case navigationItems.GENERAL:
273                                                 OnboardingActionHelper.navigateToSoftwareProductDetails(dispatch, {softwareProductId});
274                                                 break;
275                                         case navigationItems.PROCESS_DETAILS:
276                                                 OnboardingActionHelper.navigateToSoftwareProductProcesses(dispatch, {softwareProductId, version: meta.version});
277                                                 break;
278                                         case navigationItems.NETWORKS:
279                                                 OnboardingActionHelper.navigateToSoftwareProductNetworks(dispatch, {softwareProductId, version: meta.version});
280                                                 break;
281                                         case navigationItems.ATTACHMENTS:
282                                                 OnboardingActionHelper.navigateToSoftwareProductAttachments(dispatch, {softwareProductId});
283                                                 break;
284                                         case navigationItems.COMPONENTS:
285                                                 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId});
286                                                 break;
287                                         default:
288                                                 onComponentNavigate(dispatch, {id, softwareProductId, version: meta.version, screen, currentComponentId});
289                                                 break;
290                                 }
291                         });
292                 }
293         };
294
295         switch (screen) {
296                 case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
297                 case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
298                 case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
299                 case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
300                 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
301                 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
302                 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
303                         props.onSave = () => {
304                                 return Promise.resolve();
305                         };
306                         break;
307                 default:
308                         props.onSave = ({softwareProduct, qdata}) => SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
309                         break;
310         }
311
312
313         props.onVersionControllerAction = (action) =>
314                 SoftwareProductActionHelper.performVCAction(dispatch, {softwareProductId, action}).then(() => {
315                         SoftwareProductActionHelper.fetchSoftwareProduct(dispatch, {softwareProductId});
316                 });
317
318         return props;
319 };
320
321 export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);