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;
143 let { isValidationDisabled } = softwareProduct.softwareProductValidation;
150 id: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
151 name: i18n('Overview'),
156 id: enums.SCREEN.SOFTWARE_PRODUCT_DETAILS,
157 name: i18n('General'),
162 id: enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT,
163 name: i18n('Deployment Flavors'),
165 hidden: onboardingMethod !== onboardingMethodTypes.MANUAL,
169 id: enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES,
170 name: i18n('Process Details'),
175 id: enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS,
176 name: i18n('Networks'),
181 id: enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION,
182 name: i18n('Validation'),
184 hidden: isValidationDisabled,
188 id: enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
189 name: i18n('Validation Results'),
191 hidden: isValidationDisabled,
195 id: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS,
196 name: i18n('Attachments'),
198 hidden: !candidateOnboardingOrigin && !onboardingOrigin,
202 id: enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG,
203 name: i18n('Activity Log'),
208 id: enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES,
209 name: i18n('Component Dependencies'),
210 hidden: componentsList.length <= 1,
215 id: enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS,
216 name: i18n('Components'),
217 hidden: componentsList.length <= 0,
221 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS
223 screen !== enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
225 ...componentsList.map(({ id, displayName }) => ({
227 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS +
234 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS +
239 enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
240 items: buildComponentNavigationBarGroups({
250 let activeItemId = getActiveNavigationId(screen, componentId);
254 disabled: !!candidateOnboardingOrigin && !isCertified
258 const buildVersionControllerProps = ({
269 const { softwareProductEditor = { data: {} } } = softwareProduct;
271 isValidityData = true,
272 data: { name, onboardingMethod, candidateOnboardingOrigin }
273 } = softwareProductEditor;
276 version: currentVersion,
277 viewableVersions: versions,
278 isFormDataValid: isValidityData,
286 isManual: onboardingMethod === onboardingMethodType.MANUAL,
288 !!candidateOnboardingOrigin && !itemPermission.isCertified
295 softwareProductDependencies,
299 softwareProductEditor,
300 softwareProductComponents,
301 softwareProductQuestionnaire,
302 softwareProductAttachments
304 const { data: currentSoftwareProduct = {} } = softwareProductEditor;
308 candidateOnboardingOrigin
309 } = currentSoftwareProduct;
310 const { qdata } = softwareProductQuestionnaire;
311 const { heatSetup, heatSetupCache } = softwareProductAttachments;
312 let currentComponentMeta = {};
315 componentEditor: { data: componentData = {}, qdata: componentQdata }
316 } = softwareProductComponents;
317 currentComponentMeta = { componentData, componentQdata };
320 softwareProduct: currentSoftwareProduct,
324 candidateOnboardingOrigin,
328 currentComponentMeta,
329 softwareProductDependencies
334 const mapStateToProps = (
337 users: { usersList, userInfo },
338 versionsPage: { versionsList: { versions }, permissions }
344 props: { version: currentVersion, componentId, isReadOnlyMode }
349 softwareProductEditor,
350 softwareProductComponents,
351 softwareProductDependencies
353 const { mapOfExpandedIds = [] } = softwareProductEditor;
354 const { componentsList = [] } = softwareProductComponents;
356 const meta = buildMeta({
359 softwareProductDependencies,
363 versionControllerProps: buildVersionControllerProps({
369 isArchived: itemPermission.isArchived,
371 itemPermission: { ...itemPermission, isDirty: true },
374 navigationBarProps: buildNavigationBarProps({
381 isCertified: itemPermission.isCertified
387 const autoSaveBeforeNavigate = ({
397 currentComponentMeta: { componentData, componentQdata }
401 if (isReadOnlyMode) {
402 promise = Promise.resolve();
405 case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
406 promise = SoftwareProductActionHelper.updateSoftwareProduct(
408 { softwareProduct, version, qdata }
411 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
412 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponent(
417 vspComponentId: componentId,
419 qdata: componentQdata
423 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
424 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
425 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
426 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_IMAGES:
427 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
428 promise = SoftwareProductComponentsActionHelper.updateSoftwareProductComponentQuestionnaire(
433 vspComponentId: componentId,
434 qdata: componentQdata
439 promise = Promise.resolve();
446 const mapActionsToProps = (
455 componentId: currentComponentId
461 onVersionSwitching: (versionToSwitch, meta) => {
462 ScreensHelper.loadScreen(dispatch, {
463 screen: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE,
464 screenType: screenTypes.SOFTWARE_PRODUCT,
466 softwareProductId: meta.softwareProduct.id,
467 version: versionToSwitch
471 onOpenPermissions: ({ users }) => {
472 return PermissionsActionHelper.fetchItemUsers(dispatch, {
473 itemId: softwareProductId,
477 onOpenRevisionsModal: () => {
478 return RevisionsActionHelper.openRevisionsView(dispatch, {
479 itemId: softwareProductId,
481 itemType: screenTypes.SOFTWARE_PRODUCT
484 onOpenCommentCommitModal: ({ onCommit, title }) =>
486 type: modalActionTypes.GLOBAL_MODAL_SHOW,
488 modalComponentName: modalContentMapper.COMMIT_COMMENT,
489 modalComponentProps: {
491 type: CommitModalType.COMMIT
496 onMoreVersionsClick: ({ itemName, users }) => {
497 ScreensHelper.loadScreen(dispatch, {
498 screen: enums.SCREEN.SOFTWARE_PRODUCT_VERSIONS_PAGE,
499 screenType: screenTypes.SOFTWARE_PRODUCT,
504 vendorId: licenseModelId
510 onToggle: (groups, itemIdToExpand) =>
511 groups.map(({ items }) =>
512 SoftwareProductActionHelper.toggleNavigationItems(dispatch, {
517 onNavigate: ({ id, meta, newVersion }) => {
518 let navigationVersion = newVersion || version;
521 candidateOnboardingOrigin,
525 let heatSetupPopupPromise =
526 screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS
527 ? HeatSetupActionHelper.heatSetupLeaveConfirmation(
529 { softwareProductId, heatSetup, heatSetupCache }
532 let preNavigate = meta
533 ? autoSaveBeforeNavigate({
539 componentId: currentComponentId
542 version = version || (meta ? meta.version : undefined);
543 Promise.all([preNavigate, heatSetupPopupPromise])
545 let [nextScreen, nextComponentId] = id.split('|');
548 enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS &&
550 nextComponentId === currentComponentId
552 ScreensHelper.loadScreen(dispatch, {
554 screenType: screenTypes.SOFTWARE_PRODUCT,
557 version: navigationVersion
563 enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS
567 onboardingOriginTypes.ZIP ||
568 candidateOnboardingOrigin ===
569 onboardingOriginTypes.ZIP
573 .SOFTWARE_PRODUCT_ATTACHMENTS_SETUP;
575 onboardingOrigin === onboardingOriginTypes.CSAR
579 .SOFTWARE_PRODUCT_ATTACHMENTS_VIEW_VALIDATION;
582 ScreensHelper.loadScreen(dispatch, {
584 screenType: screenTypes.SOFTWARE_PRODUCT,
587 version: navigationVersion,
588 componentId: nextComponentId
600 case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
601 case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
602 case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
603 case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
604 case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION:
605 case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS:
606 case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
607 case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
608 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
609 case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
610 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
611 case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
612 props.onSave = () => Promise.resolve();
615 props.onSave = ({ softwareProduct, qdata }) =>
616 SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {
624 props.onVersionControllerAction = (action, version, comment, meta) => {
625 let { heatSetup, heatSetupCache } = meta;
626 let autoSavePromise = meta
627 ? autoSaveBeforeNavigate({
633 componentId: currentComponentId
636 let heatSetupPopupPromise =
637 screen === enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS &&
638 action === versionControllerActions.COMMIT
639 ? HeatSetupActionHelper.heatSetupLeaveConfirmation(dispatch, {
645 Promise.all([autoSavePromise, heatSetupPopupPromise])
647 return SoftwareProductActionHelper.performVCAction(dispatch, {
653 }).then(updatedVersion => {
656 updatedVersion.state &&
657 updatedVersion.state.synchronizationState ===
660 (action === versionControllerActions.SYNC &&
662 ((action === versionControllerActions.COMMIT ||
663 action === versionControllerActions.SYNC) &&
664 updatedVersion.status ===
665 catalogItemStatuses.CERTIFIED)
667 ScreensHelper.loadLandingScreen(dispatch, {
668 previousScreenName: screen,
671 version: updatedVersion
675 ScreensHelper.loadScreen(dispatch, {
677 screenType: screenTypes.SOFTWARE_PRODUCT,
680 version: updatedVersion,
681 componentId: currentComponentId
692 props.onManagePermissions = () =>
693 PermissionsActionHelper.openPermissonsManager(dispatch, {
694 itemId: softwareProductId,
700 export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);