2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 import {connect} from 'react-redux';
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';
28 import {enums} from 'sdc-app/onboarding/OnboardingConstants.js';
29 import OnboardingActionHelper from 'sdc-app/onboarding/OnboardingActionHelper.js';
31 import {navigationItems} from './SoftwareProductConstants.js';
32 import SoftwareProductActionHelper from './SoftwareProductActionHelper.js';
33 import SoftwareProductComponentsActionHelper from './components/SoftwareProductComponentsActionHelper.js';
35 const buildComponentNavigationBarGroups = ({componentId, meta}) => {
38 id: navigationItems.GENERAL + '|' + componentId,
39 name: i18n('General'),
43 id: navigationItems.COMPUTE + '|' + componentId,
44 name: i18n('Compute'),
48 id: navigationItems.LOAD_BALANCING + '|' + componentId,
49 name: i18n('High Availability & Load Balancing'),
53 id: navigationItems.NETWORKS + '|' + componentId,
54 name: i18n('Networks'),
58 id: navigationItems.STORAGE + '|' + componentId,
59 name: i18n('Storage'),
63 id: navigationItems.PROCESS_DETAILS + '|' + componentId,
64 name: i18n('Process Details'),
68 id: navigationItems.MONITORING + '|' + componentId,
69 name: i18n('Monitoring'),
78 const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds}) => {
79 const {softwareProductEditor: {data: currentSoftwareProduct = {}}} = softwareProduct;
80 const {id, name} = currentSoftwareProduct;
86 id: navigationItems.VENDOR_SOFTWARE_PRODUCT,
87 name: i18n('Overview'),
91 id: navigationItems.GENERAL,
92 name: i18n('General'),
96 id: navigationItems.PROCESS_DETAILS,
97 name: i18n('Process Details'),
101 id: navigationItems.NETWORKS,
102 name: i18n('Networks'),
106 id: navigationItems.ATTACHMENTS,
107 name: i18n('Attachments'),
111 id: navigationItems.COMPONENTS,
112 name: i18n('Components'),
113 hidden: componentsList.length <= 0,
115 expanded: mapOfExpandedIds[navigationItems.COMPONENTS] === true && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
117 ...componentsList.map(({id, displayName}) => ({
118 id: navigationItems.COMPONENTS + '|' + id,
121 expanded: mapOfExpandedIds[navigationItems.COMPONENTS + '|' + id] === true && screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
122 items: buildComponentNavigationBarGroups({componentId: id, meta})
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
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;
156 const buildVersionControllerProps = (softwareProduct) => {
157 const {softwareProductEditor} = softwareProduct;
158 const {data: currentSoftwareProduct = {}, isValidityData = true} = softwareProductEditor;
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};
166 status, isCheckedOut, version, viewableVersions,
167 isFormDataValid: isValidityData
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 = {};
180 const {componentEditor: {data: componentData = {} , qdata: componentQdata}} = softwareProductComponents;
181 currentComponentMeta = {componentData, componentQdata};
183 const meta = {softwareProduct: currentSoftwareProduct, qdata, version, isReadOnlyMode, currentComponentMeta};
185 versionControllerProps: buildVersionControllerProps(softwareProduct),
186 navigationBarProps: buildNavigationBarProps({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds})
190 const autoSaveBeforeNavigate = ({dispatch, screen, softwareProductId, componentId, meta: {isReadOnlyMode, softwareProduct, qdata, currentComponentMeta: {componentData, componentQdata}}}) => {
192 if (isReadOnlyMode) {
193 promise = Promise.resolve();
196 case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
197 promise = SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
199 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
200 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponent(dispatch, {softwareProductId, vspComponentId: componentId, componentData, qdata: componentQdata});
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});
209 promise = Promise.resolve();
217 const onComponentNavigate = (dispatch, {id, softwareProductId, version, currentComponentId}) => {
218 const [nextScreen, nextComponentId] = id.split('|');
220 case navigationItems.COMPONENTS:
221 if(nextComponentId === currentComponentId) {
222 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId});
224 OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
227 case navigationItems.GENERAL:
228 OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {softwareProductId, componentId: nextComponentId, version});
230 case navigationItems.COMPUTE:
231 OnboardingActionHelper.navigateToComponentCompute(dispatch, {softwareProductId, componentId: nextComponentId});
233 case navigationItems.LOAD_BALANCING:
234 OnboardingActionHelper.navigateToComponentLoadBalancing(dispatch, {softwareProductId, componentId: nextComponentId});
236 case navigationItems.NETWORKS:
237 OnboardingActionHelper.navigateToComponentNetwork(dispatch, {softwareProductId, componentId: nextComponentId, version});
239 case navigationItems.STORAGE:
240 OnboardingActionHelper.navigateToComponentStorage(dispatch, {softwareProductId, componentId: nextComponentId});
242 case navigationItems.PROCESS_DETAILS:
243 OnboardingActionHelper.navigateToSoftwareProductComponentProcesses(dispatch, {softwareProductId, componentId: nextComponentId});
245 case navigationItems.MONITORING:
246 OnboardingActionHelper.navigateToSoftwareProductComponentMonitoring(dispatch, {softwareProductId, componentId: nextComponentId});
251 const mapActionsToProps = (dispatch, {currentScreen: {screen, props: {softwareProductId, componentId: currentComponentId}}}) => {
254 onClose: ({version}) => {
255 if (screen === enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE) {
256 OnboardingActionHelper.navigateToOnboardingCatalog(dispatch);
258 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version});
261 onVersionSwitching: (version) => {
262 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version});
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(() => {
269 case navigationItems.VENDOR_SOFTWARE_PRODUCT:
270 OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {softwareProductId, version: meta.version});
272 case navigationItems.GENERAL:
273 OnboardingActionHelper.navigateToSoftwareProductDetails(dispatch, {softwareProductId});
275 case navigationItems.PROCESS_DETAILS:
276 OnboardingActionHelper.navigateToSoftwareProductProcesses(dispatch, {softwareProductId, version: meta.version});
278 case navigationItems.NETWORKS:
279 OnboardingActionHelper.navigateToSoftwareProductNetworks(dispatch, {softwareProductId, version: meta.version});
281 case navigationItems.ATTACHMENTS:
282 OnboardingActionHelper.navigateToSoftwareProductAttachments(dispatch, {softwareProductId});
284 case navigationItems.COMPONENTS:
285 OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {softwareProductId});
288 onComponentNavigate(dispatch, {id, softwareProductId, version: meta.version, screen, currentComponentId});
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();
308 props.onSave = ({softwareProduct, qdata}) => SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});
313 props.onVersionControllerAction = (action) =>
314 SoftwareProductActionHelper.performVCAction(dispatch, {softwareProductId, action}).then(() => {
315 SoftwareProductActionHelper.fetchSoftwareProduct(dispatch, {softwareProductId});
321 export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);