2 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
16 import {connect} from 'react-redux';
18 import i18n from 'nfvo-utils/i18n/i18n.js';
19 import VersionControllerUtils from 'nfvo-components/panel/versionController/VersionControllerUtils.js';
20 import TabulatedEditor from 'src/nfvo-components/editor/TabulatedEditor.jsx';
22 import {enums} from 'sdc-app/onboarding/OnboardingConstants.js';
23 import OnboardingActionHelper from 'sdc-app/onboarding/OnboardingActionHelper.js';
25 import {navigationItems, mapScreenToNavigationItem} from './SoftwareProductConstants.js';
26 import SoftwareProductActionHelper from './SoftwareProductActionHelper.js';
27 import SoftwareProductComponentsActionHelper from './components/SoftwareProductComponentsActionHelper.js';
28 import SoftwareProductDependenciesActionHelper from './dependencies/SoftwareProductDependenciesActionHelper.js';
29 import {doesHeatDataExist} from './attachments/SoftwareProductAttachmentsUtils.js';
31 import HeatSetupActionHelper from './attachments/setup/HeatSetupActionHelper.js';
32 import { actionsEnum as versionControllerActions } from 'nfvo-components/panel/versionController/VersionControllerConstants.js';
34 function getActiveNavigationId(screen, componentId) {
35 let activeItemId = componentId ? mapScreenToNavigationItem[screen] + '|' + componentId : mapScreenToNavigationItem[screen];
39 const buildComponentNavigationBarGroups = ({componentId, meta}) => {
42 id: navigationItems.GENERAL + '|' + componentId,
43 name: i18n('General'),
47 id: navigationItems.COMPUTE + '|' + componentId,
48 name: i18n('Compute'),
52 id: navigationItems.LOAD_BALANCING + '|' + componentId,
53 name: i18n('High Availability & Load Balancing'),
57 id: navigationItems.NETWORKS + '|' + componentId,
58 name: i18n('Networks'),
62 id: navigationItems.STORAGE + '|' + componentId,
63 name: i18n('Storage'),
67 id: navigationItems.PROCESS_DETAILS + '|' + componentId,
68 name: i18n('Process Details'),
72 id: navigationItems.MONITORING + '|' + componentId,
73 name: i18n('Monitoring'),
82 const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds}) => {
83 const {softwareProductEditor: {data: currentSoftwareProduct = {}}} = softwareProduct;
84 const {id, name} = currentSoftwareProduct;
90 id: navigationItems.VENDOR_SOFTWARE_PRODUCT,
91 name: i18n('Overview'),
95 id: navigationItems.GENERAL,
96 name: i18n('General'),
100 id: navigationItems.PROCESS_DETAILS,
101 name: i18n('Process Details'),
105 id: navigationItems.NETWORKS,
106 name: i18n('Networks'),
110 id: navigationItems.ATTACHMENTS,
111 name: i18n('Attachments'),
113 hidden: !doesHeatDataExist(meta.heatSetup),
116 id: navigationItems.ACTIVITY_LOG,
117 name: i18n('Activity Log'),
121 id: navigationItems.DEPENDENCIES,
122 name: i18n('Component Dependencies'),
123 hidden: componentsList.length <= 1,
127 id: navigationItems.COMPONENTS,
128 name: i18n('Components'),
129 hidden: componentsList.length <= 0,
131 expanded: mapOfExpandedIds[navigationItems.COMPONENTS] === true && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
133 ...componentsList.map(({id, displayName}) => ({
134 id: navigationItems.COMPONENTS + '|' + id,
137 expanded: mapOfExpandedIds[navigationItems.COMPONENTS + '|' + id] === true && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
138 items: buildComponentNavigationBarGroups({componentId: id, meta})
144 let activeItemId = getActiveNavigationId(screen, componentId);
150 const buildVersionControllerProps = (softwareProduct) => {
151 const {softwareProductEditor} = softwareProduct;
152 const {data: currentSoftwareProduct = {}, isValidityData = true} = softwareProductEditor;
154 const {version, viewableVersions, status: currentStatus, lockingUser} = currentSoftwareProduct;
155 const {status, isCheckedOut} = VersionControllerUtils.getCheckOutStatusKindByUserID(currentStatus, lockingUser);
158 status, isCheckedOut, version, viewableVersions,
159 isFormDataValid: isValidityData
163 function buildMeta({softwareProduct, componentId, softwareProductDependencies}) {
164 const {softwareProductEditor, softwareProductComponents, softwareProductQuestionnaire, softwareProductAttachments} = softwareProduct;
165 const {data: currentSoftwareProduct = {}} = softwareProductEditor;
166 const {version} = currentSoftwareProduct;
167 const isReadOnlyMode = VersionControllerUtils.isReadOnly(currentSoftwareProduct);
168 const {qdata} = softwareProductQuestionnaire;
169 const {heatSetup, heatSetupCache} = softwareProductAttachments;
170 let currentComponentMeta = {};
172 const {componentEditor: {data: componentData = {} , qdata: componentQdata}} = softwareProductComponents;
173 currentComponentMeta = {componentData, componentQdata};
175 const meta = {softwareProduct: currentSoftwareProduct, qdata, version, heatSetup, heatSetupCache, isReadOnlyMode, currentComponentMeta, softwareProductDependencies};
179 const mapStateToProps = ({softwareProduct}, {currentScreen: {screen, props: {componentId}}}) => {
180 const {softwareProductEditor, softwareProductComponents, softwareProductDependencies} = softwareProduct;
181 const {mapOfExpandedIds = []} = softwareProductEditor;
182 const {componentsList = []} = softwareProductComponents;
183 const meta = buildMeta({softwareProduct, componentId, softwareProductDependencies});
185 versionControllerProps: buildVersionControllerProps(softwareProduct),
186 navigationBarProps: buildNavigationBarProps({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds}),
191 const autoSaveBeforeNavigate = ({dispatch, screen, softwareProductId, componentId,
192 meta: {isReadOnlyMode, softwareProduct, version, qdata, softwareProductDependencies,
193 currentComponentMeta: {componentData, componentQdata}}}) => {
195 if (isReadOnlyMode) {
196 promise = Promise.resolve();
199 case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
200 promise = SoftwareProductDependenciesActionHelper.saveDependencies(dispatch,{softwareProductId, version, dependenciesList: softwareProductDependencies});
201 case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
202 promise = SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
204 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
205 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponent(dispatch,
206 {softwareProductId, version, vspComponentId: componentId, componentData, qdata: componentQdata});
208 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
209 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
210 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
211 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
212 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponentQuestionnaire(dispatch, {softwareProductId, version, vspComponentId: componentId, qdata: componentQdata});
215 promise = Promise.resolve();
223 const onComponentNavigate = (dispatch, {id, softwareProductId, version, currentComponentId}) => {
224 const [nextScreen, nextComponentId] = id.split('|');
226 case navigationItems.COMPONENTS:
227 if(nextComponentId === currentComponentId) {
228 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId});
230 OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
233 case navigationItems.GENERAL:
234 OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
236 case navigationItems.COMPUTE:
237 OnboardingActionHelper.navigateToComponentCompute(dispatch, {softwareProductId, componentId: nextComponentId, version});
239 case navigationItems.LOAD_BALANCING:
240 OnboardingActionHelper.navigateToComponentLoadBalancing(dispatch, {softwareProductId, componentId: nextComponentId, version});
242 case navigationItems.NETWORKS:
243 OnboardingActionHelper.navigateToComponentNetwork(dispatch, {softwareProductId, componentId: nextComponentId, version});
245 case navigationItems.STORAGE:
246 OnboardingActionHelper.navigateToComponentStorage(dispatch, {softwareProductId, componentId: nextComponentId, version});
248 case navigationItems.PROCESS_DETAILS:
249 OnboardingActionHelper.navigateToSoftwareProductComponentProcesses(dispatch, {softwareProductId, componentId: nextComponentId, version});
251 case navigationItems.MONITORING:
252 OnboardingActionHelper.navigateToSoftwareProductComponentMonitoring(dispatch, {softwareProductId, componentId: nextComponentId, version});
257 const mapActionsToProps = (dispatch, {currentScreen: {screen, props: {softwareProductId, componentId: currentComponentId}}}) => {
260 onVersionSwitching: (version, meta) => {
261 SoftwareProductActionHelper.fetchSoftwareProduct(dispatch, {softwareProductId, version});
262 props.onNavigate({id: getActiveNavigationId(screen, currentComponentId), meta, version});
264 onToggle: (groups, itemIdToExpand) => groups.map(({items}) => SoftwareProductActionHelper.toggleNavigationItems(dispatch, {items, itemIdToExpand})),
265 onNavigate: ({id, meta, version}) => {
266 let {heatSetup, heatSetupCache} = meta;
267 let heatSetupPopupPromise = screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS ?
268 HeatSetupActionHelper.heatSetupLeaveConfirmation(dispatch, {softwareProductId, heatSetup, heatSetupCache}) :
270 let preNavigate = meta ? autoSaveBeforeNavigate({dispatch, screen, meta, softwareProductId, componentId: currentComponentId}) : Promise.resolve();
271 version = version || (meta ? meta.version : undefined);
272 Promise.all([preNavigate, heatSetupPopupPromise]).then(() => {
274 case navigationItems.VENDOR_SOFTWARE_PRODUCT:
275 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version});
277 case navigationItems.GENERAL:
278 OnboardingActionHelper.navigateToSoftwareProductDetails(dispatch, {softwareProductId, version});
280 case navigationItems.PROCESS_DETAILS:
281 OnboardingActionHelper.navigateToSoftwareProductProcesses(dispatch, {softwareProductId, version});
283 case navigationItems.NETWORKS:
284 OnboardingActionHelper.navigateToSoftwareProductNetworks(dispatch, {softwareProductId, version});
286 case navigationItems.DEPENDENCIES:
287 OnboardingActionHelper.navigateToSoftwareProductDependencies(dispatch, {softwareProductId, version});
289 case navigationItems.ATTACHMENTS:
290 OnboardingActionHelper.navigateToSoftwareProductAttachments(dispatch, {softwareProductId, version});
292 case navigationItems.COMPONENTS:
293 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId, version});
295 case navigationItems.ACTIVITY_LOG:
296 OnboardingActionHelper.navigateToSoftwareProductActivityLog(dispatch, {softwareProductId, version});
299 onComponentNavigate(dispatch, {id, softwareProductId, version, screen, currentComponentId});
307 case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
308 case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
309 case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
310 case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
311 case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
312 case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
313 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
314 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
315 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
316 props.onSave = () => {
317 return Promise.resolve();
321 props.onSave = ({softwareProduct, qdata}) => SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
326 props.onVersionControllerAction = (action, version, meta) => {
327 let {heatSetup, heatSetupCache} = meta;
328 let heatSetupPopupPromise = screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS && action === versionControllerActions.CHECK_IN ?
329 HeatSetupActionHelper.heatSetupLeaveConfirmation(dispatch, {softwareProductId, heatSetup, heatSetupCache}) :
331 heatSetupPopupPromise.then(() => {
332 return SoftwareProductActionHelper.performVCAction(dispatch, {softwareProductId, action, version}).then(({newVersion}) => {
333 //props.onNavigate({id: getActiveNavigationId(screen, currentComponentId), version});
334 if(screen === enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG) {
335 OnboardingActionHelper.navigateToSoftwareProductActivityLog(dispatch, {softwareProductId, version: newVersion});
343 export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);