2 * Copyright © 2016-2018 European Support Limited
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 ScreensHelper from 'sdc-app/common/helpers/ScreensHelper.js';
20 import TabulatedEditor from 'src/nfvo-components/editor/TabulatedEditor.jsx';
22 import { enums, screenTypes } from 'sdc-app/onboarding/OnboardingConstants.js';
24 onboardingMethod as onboardingMethodTypes,
26 } from './SoftwareProductConstants.js';
27 import SoftwareProductActionHelper from './SoftwareProductActionHelper.js';
28 import SoftwareProductComponentsActionHelper from './components/SoftwareProductComponentsActionHelper.js';
29 import PermissionsActionHelper from './../permissions/PermissionsActionHelper.js';
30 import RevisionsActionHelper from './../revisions/RevisionsActionHelper.js';
31 import HeatSetupActionHelper from './attachments/setup/HeatSetupActionHelper.js';
32 import { actionsEnum as versionControllerActions } from 'nfvo-components/panel/versionController/VersionControllerConstants.js';
33 import { actionTypes as modalActionTypes } from 'nfvo-components/modal/GlobalModalConstants.js';
34 import { modalContentMapper } from 'sdc-app/common/modal/ModalContentMapper.js';
35 import { CommitModalType } from 'nfvo-components/panel/versionController/components/CommitCommentModal.jsx';
36 import { onboardingMethod as onboardingMethodType } from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
37 import { SyncStates } from 'sdc-app/common/merge/MergeEditorConstants.js';
38 import { catalogItemStatuses } from 'sdc-app/onboarding/onboard/onboardingCatalog/OnboardingCatalogConstants.js';
40 function getActiveNavigationId(screen, componentId) {
41 let activeItemId = componentId ? screen + '|' + componentId : screen;
45 const buildComponentNavigationBarGroups = ({ componentId, meta }) => {
49 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL +
52 name: i18n('General'),
58 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE +
61 name: i18n('Compute'),
67 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING +
70 name: i18n('High Availability & Load Balancing'),
76 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK +
79 name: i18n('Networks'),
85 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE +
88 name: i18n('Storage'),
94 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_IMAGES +
103 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES +
106 name: i18n('Process Details'),
112 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING +
115 name: i18n('Monitoring'),
124 const buildNavigationBarProps = ({
134 softwareProductEditor: { data: currentSoftwareProduct = {} }
140 candidateOnboardingOrigin,
142 } = currentSoftwareProduct;
149 id: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
150 name: i18n('Overview'),
155 id: enums.SCREEN.SOFTWARE_PRODUCT_DETAILS,
156 name: i18n('General'),
161 id: enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT,
162 name: i18n('Deployment Flavors'),
164 hidden: onboardingMethod !== onboardingMethodTypes.MANUAL,
168 id: enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES,
169 name: i18n('Process Details'),
174 id: enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS,
175 name: i18n('Networks'),
180 id: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS,
181 name: i18n('Attachments'),
183 hidden: !candidateOnboardingOrigin && !onboardingOrigin,
187 id: enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG,
188 name: i18n('Activity Log'),
193 id: enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES,
194 name: i18n('Component Dependencies'),
195 hidden: componentsList.length <= 1,
200 id: enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS,
201 name: i18n('Components'),
202 hidden: componentsList.length <= 0,
206 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS
208 screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
210 ...componentsList.map(({ id, displayName }) => ({
212 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS +
219 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS +
224 enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
225 items: buildComponentNavigationBarGroups({
235 let activeItemId = getActiveNavigationId(screen, componentId);
239 disabled: !!candidateOnboardingOrigin && !isCertified
243 const buildVersionControllerProps = ({
254 const { softwareProductEditor = { data: {} } } = softwareProduct;
256 isValidityData = true,
257 data: { name, onboardingMethod, candidateOnboardingOrigin }
258 } = softwareProductEditor;
261 version: currentVersion,
262 viewableVersions: versions,
263 isFormDataValid: isValidityData,
271 isManual: onboardingMethod === onboardingMethodType.MANUAL,
273 !!candidateOnboardingOrigin && !itemPermission.isCertified
280 softwareProductDependencies,
284 softwareProductEditor,
285 softwareProductComponents,
286 softwareProductQuestionnaire,
287 softwareProductAttachments
289 const { data: currentSoftwareProduct = {} } = softwareProductEditor;
293 candidateOnboardingOrigin
294 } = currentSoftwareProduct;
295 const { qdata } = softwareProductQuestionnaire;
296 const { heatSetup, heatSetupCache } = softwareProductAttachments;
297 let currentComponentMeta = {};
300 componentEditor: { data: componentData = {}, qdata: componentQdata }
301 } = softwareProductComponents;
302 currentComponentMeta = { componentData, componentQdata };
305 softwareProduct: currentSoftwareProduct,
309 candidateOnboardingOrigin,
313 currentComponentMeta,
314 softwareProductDependencies
319 const mapStateToProps = (
322 users: { usersList, userInfo },
323 versionsPage: { versionsList: { versions }, permissions }
329 props: { version: currentVersion, componentId, isReadOnlyMode }
334 softwareProductEditor,
335 softwareProductComponents,
336 softwareProductDependencies
338 const { mapOfExpandedIds = [] } = softwareProductEditor;
339 const { componentsList = [] } = softwareProductComponents;
341 const meta = buildMeta({
344 softwareProductDependencies,
348 versionControllerProps: buildVersionControllerProps({
354 isArchived: itemPermission.isArchived,
356 itemPermission: { ...itemPermission, isDirty: true },
359 navigationBarProps: buildNavigationBarProps({
366 isCertified: itemPermission.isCertified
372 const autoSaveBeforeNavigate = ({
382 currentComponentMeta: { componentData, componentQdata }
386 if (isReadOnlyMode) {
387 promise = Promise.resolve();
390 case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
391 promise = SoftwareProductActionHelper.updateSoftwareProduct(
393 { softwareProduct, version, qdata }
396 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
397 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponent(
402 vspComponentId: componentId,
404 qdata: componentQdata
408 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
409 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
410 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
411 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_IMAGES:
412 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
413 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponentQuestionnaire(
418 vspComponentId: componentId,
419 qdata: componentQdata
424 promise = Promise.resolve();
431 const mapActionsToProps = (
440 componentId: currentComponentId
446 onVersionSwitching: (versionToSwitch, meta) => {
447 ScreensHelper.loadScreen(dispatch, {
448 screen: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
449 screenType: screenTypes.SOFTWARE_PRODUCT,
451 softwareProductId: meta.softwareProduct.id,
452 version: versionToSwitch
456 onOpenPermissions: ({ users }) => {
457 return PermissionsActionHelper.fetchItemUsers(dispatch, {
458 itemId: softwareProductId,
462 onOpenRevisionsModal: () => {
463 return RevisionsActionHelper.openRevisionsView(dispatch, {
464 itemId: softwareProductId,
466 itemType: screenTypes.SOFTWARE_PRODUCT
469 onOpenCommentCommitModal: ({ onCommit, title }) =>
471 type: modalActionTypes.GLOBAL_MODAL_SHOW,
473 modalComponentName: modalContentMapper.COMMIT_COMMENT,
474 modalComponentProps: {
476 type: CommitModalType.COMMIT
481 onMoreVersionsClick: ({ itemName, users }) => {
482 ScreensHelper.loadScreen(dispatch, {
483 screen: enums.SCREEN.SOFTWARE_PRODUCT_VERSIONS_PAGE,
484 screenType: screenTypes.SOFTWARE_PRODUCT,
489 vendorId: licenseModelId
495 onToggle: (groups, itemIdToExpand) =>
496 groups.map(({ items }) =>
497 SoftwareProductActionHelper.toggleNavigationItems(dispatch, {
502 onNavigate: ({ id, meta, newVersion }) => {
503 let navigationVersion = newVersion || version;
506 candidateOnboardingOrigin,
510 let heatSetupPopupPromise =
511 screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS
512 ? HeatSetupActionHelper.heatSetupLeaveConfirmation(
514 { softwareProductId, heatSetup, heatSetupCache }
517 let preNavigate = meta
518 ? autoSaveBeforeNavigate({
524 componentId: currentComponentId
527 version = version || (meta ? meta.version : undefined);
528 Promise.all([preNavigate, heatSetupPopupPromise])
530 let [nextScreen, nextComponentId] = id.split('|');
533 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS &&
535 nextComponentId === currentComponentId
537 ScreensHelper.loadScreen(dispatch, {
539 screenType: screenTypes.SOFTWARE_PRODUCT,
542 version: navigationVersion
548 enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS
552 onboardingOriginTypes.ZIP ||
553 candidateOnboardingOrigin ===
554 onboardingOriginTypes.ZIP
558 .SOFTWARE_PRODUCT_ATTACHMENTS_SETUP;
560 onboardingOrigin === onboardingOriginTypes.CSAR
564 .SOFTWARE_PRODUCT_ATTACHMENTS_VALIDATION;
567 ScreensHelper.loadScreen(dispatch, {
569 screenType: screenTypes.SOFTWARE_PRODUCT,
572 version: navigationVersion,
573 componentId: nextComponentId
585 case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
586 case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
587 case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
588 case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
589 case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
590 case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
591 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
592 case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
593 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
594 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
595 props.onSave = () => Promise.resolve();
598 props.onSave = ({ softwareProduct, qdata }) =>
599 SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {
607 props.onVersionControllerAction = (action, version, comment, meta) => {
608 let { heatSetup, heatSetupCache } = meta;
609 let autoSavePromise = meta
610 ? autoSaveBeforeNavigate({
616 componentId: currentComponentId
619 let heatSetupPopupPromise =
620 screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS &&
621 action === versionControllerActions.COMMIT
622 ? HeatSetupActionHelper.heatSetupLeaveConfirmation(dispatch, {
628 Promise.all([autoSavePromise, heatSetupPopupPromise])
630 return SoftwareProductActionHelper.performVCAction(dispatch, {
636 }).then(updatedVersion => {
639 updatedVersion.state &&
640 updatedVersion.state.synchronizationState ===
643 (action === versionControllerActions.SYNC &&
645 ((action === versionControllerActions.COMMIT ||
646 action === versionControllerActions.SYNC) &&
647 updatedVersion.status ===
648 catalogItemStatuses.CERTIFIED)
650 ScreensHelper.loadLandingScreen(dispatch, {
651 previousScreenName: screen,
654 version: updatedVersion
658 ScreensHelper.loadScreen(dispatch, {
660 screenType: screenTypes.SOFTWARE_PRODUCT,
663 version: updatedVersion,
664 componentId: currentComponentId
675 props.onManagePermissions = () =>
676 PermissionsActionHelper.openPermissonsManager(dispatch, {
677 itemId: softwareProductId,
683 export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);