/*! * Copyright © 2016-2018 European Support Limited * Modifications Copyright (C) 2021 Nordix Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import i18n from 'nfvo-utils/i18n/i18n.js'; import sortByStringProperty from 'nfvo-utils/sortByStringProperty.js'; import Form from 'nfvo-components/input/validation/Form.jsx'; import Input from 'nfvo-components/input/validation/Input.jsx'; import InputOptions from 'nfvo-components/input/validation/InputOptions.jsx'; import GridSection from 'nfvo-components/grid/GridSection.jsx'; import GridItem from 'nfvo-components/grid/GridItem.jsx'; import SoftwareProductCategoriesHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductCategoriesHelper.js'; import { forms } from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js'; import { versionStatus } from 'sdc-app/common/helpers/ItemsHelperConstants.js'; const DeprecatedVlmInfo = ({ vendorName, onVendorRemove }) => { return (
onVendorRemove()} label={i18n('Vendor')} type="select" value={`${vendorName} (Archived)`}>
); }; class GeneralSection extends React.Component { static propTypes = { vendorId: PropTypes.string, name: PropTypes.string, description: PropTypes.string, subCategory: PropTypes.string, selectedModelList: PropTypes.arrayOf(PropTypes.string), softwareProductCategories: PropTypes.array, finalizedLicenseModelList: PropTypes.array, onDataChanged: PropTypes.func.isRequired, onVendorParamChanged: PropTypes.func.isRequired, onSelectSubCategory: PropTypes.func.isRequired, isVendorArchived: PropTypes.bool, onArchivedVendorRemove: PropTypes.func }; onVendorParamChanged(e) { const selectedIndex = e.target.selectedIndex; const vendorId = e.target.options[selectedIndex].value; this.props.onVendorParamChanged( { vendorId }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ); } onSelectSubCategory(e) { const selectedIndex = e.target.selectedIndex; const subCategory = e.target.options[selectedIndex].value; this.props.onSelectSubCategory(subCategory); } onVendorRemove() { const { finalizedLicenseModelList, vendorName, onVendorParamChanged } = this.props; this.props.onArchivedVendorRemove({ finalizedLicenseModelList, onVendorParamChanged, vendorName }); } render() { let { genericFieldInfo } = this.props; return (
{genericFieldInfo && ( name.length <= 25 && this.props.onDataChanged( { name }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ) } /> {this.props.isVendorArchived ? ( this.onVendorRemove()} vendorName={this.props.vendorName} /> ) : ( this.onVendorParamChanged(e) }> {sortByStringProperty( this.props.finalizedLicenseModelList, 'name' ).map(lm => ( ))} )} this.onSelectSubCategory(e)}> {this.props.softwareProductCategories.map( category => category.subcategories && ( {category.subcategories.map( sub => ( ) )} ) )}
{this.props.selectedModelList.length > 0 ? (
    {this.props.selectedModelList.map( value =>
  • {value}
  • )}
) : ( i18n('model.sdc.label') )}
this.props.onDataChanged( { description }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ) } />
)}
); } } class LicensesSection extends React.Component { static propTypes = { onVendorParamChanged: PropTypes.func.isRequired, vendorId: PropTypes.string, licensingVersion: PropTypes.string, licensingVersionsList: PropTypes.array, licensingData: PropTypes.shape({ licenceAgreement: PropTypes.string, featureGroups: PropTypes.array }), onFeatureGroupsChanged: PropTypes.func.isRequired, onLicensingDataChanged: PropTypes.func.isRequired, featureGroupsList: PropTypes.array, licenseAgreementList: PropTypes.array, isVendorArchived: PropTypes.bool, licenseType: PropTypes.string }; onVendorParamChanged(e) { const selectedIndex = e.target.selectedIndex; const licensingVersion = e.target.options[selectedIndex].value; this.props.onVendorParamChanged( { vendorId: this.props.vendorId, licensingVersion }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ); } onLicensingDataChanged(e) { const selectedIndex = e.target.selectedIndex; const licenseAgreement = e.target.options[selectedIndex].value; this.props.onLicensingDataChanged({ licenseAgreement, featureGroups: [] }); } render() { return ( this.onVendorParamChanged(e)} value={this.props.licensingVersion || ''} label={i18n('Licensing Version')} disabled={ this.props.isVendorArchived || (typeof this.props.licenseType !== 'undefined' && this.props.licenseType !== 'INTERNAL') } type="select"> {this.props.licensingVersionsList.map(version => ( ))} this.onLicensingDataChanged(e)}> {this.props.licenseAgreementList.map(la => ( ))} {this.props.licensingData.licenseAgreement && ( {}} disabled={ this.props.isVendorArchived || (typeof this.props.licenseType !== 'undefined' && this.props.licenseType !== 'INTERNAL') } onEnumChange={featureGroups => this.props.onFeatureGroupsChanged({ featureGroups }) } multiSelectedEnum={ this.props.licensingData.featureGroups } name="feature-groups" label={i18n('Feature Groups')} clearable={false} values={this.props.featureGroupsList} /> )} ); } } const AvailabilitySection = props => ( props.onQDataChanged({ 'general/availability/useAvailabilityZonesForHighAvailability': aZone }) } /> ); const RegionsSection = props => ( {}} onEnumChange={regions => props.onQDataChanged({ 'general/regionsData/regions': regions }) } multiSelectedEnum={props.dataMap['general/regionsData/regions']} name="vsp-regions" clearable={false} values={ props.genericFieldInfo['general/regionsData/regions'].enum } /> ); const StorageDataReplicationSection = props => ( props.onQDataChanged({ 'general/storageDataReplication/storageReplicationSize': sRep }) } /> props.onQDataChanged({ 'general/storageDataReplication/storageReplicationSource': sRepSource }) } /> props.onQDataChanged({ 'general/storageDataReplication/storageReplicationFrequency': sRepFreq }) } /> props.onQDataChanged({ 'general/storageDataReplication/storageReplicationDestination': sRepDest }) } /> ); class SoftwareProductDetails extends Component { static propTypes = { vendorName: PropTypes.string, currentSoftwareProduct: PropTypes.shape({ id: PropTypes.string, name: PropTypes.string, description: PropTypes.string, category: PropTypes.string, subCategory: PropTypes.string, vendorId: PropTypes.string, vendorName: PropTypes.string, licensingVersion: PropTypes.string, licenseType: PropTypes.string, licensingData: PropTypes.shape({ licenceAgreement: PropTypes.string, featureGroups: PropTypes.array }) }), softwareProductCategories: PropTypes.array, finalizedLicenseModelList: PropTypes.array, licenseAgreementList: PropTypes.array, featureGroupsList: PropTypes.array, onSubmit: PropTypes.func.isRequired, onDataChanged: PropTypes.func.isRequired, onValidityChanged: PropTypes.func.isRequired, qdata: PropTypes.object.isRequired, onQDataChanged: PropTypes.func.isRequired, onVendorParamChanged: PropTypes.func.isRequired }; prepareDataForGeneralSection() { let { softwareProductCategories, finalizedLicenseModelList, onDataChanged, currentSoftwareProduct, genericFieldInfo, isVendorArchived, onArchivedVendorRemove } = this.props; let { name, description, vendorId, subCategory, vendorName, selectedModelList = [] } = currentSoftwareProduct; return { name, description, vendorId, subCategory, softwareProductCategories, finalizedLicenseModelList, onDataChanged, onVendorParamChanged: args => this.onVendorParamChanged(args), onSelectSubCategory: args => this.onSelectSubCategory(args), genericFieldInfo, vendorName, selectedModelList, isVendorArchived, onArchivedVendorRemove }; } prepareDataForLicensesSection() { let { featureGroupsList, licenseAgreementList, currentSoftwareProduct, isVendorArchived } = this.props; let { vendorId, licensingVersion, licensingData = {}, licenseType } = currentSoftwareProduct; return { onVendorParamChanged: args => this.onVendorParamChanged(args), vendorId, licensingVersion, licensingVersionsList: this.buildLicensingVersionsListItems(), licensingData, onFeatureGroupsChanged: args => this.onFeatureGroupsChanged(args), onLicensingDataChanged: args => this.onLicensingDataChanged(args), featureGroupsList, licenseAgreementList, isVendorArchived, licenseType }; } render() { let { currentSoftwareProduct } = this.props; let { qdata, onQDataChanged, dataMap, qGenericFieldInfo } = this.props; let { isReadOnlyMode } = this.props; return (
(this.validationForm = validationForm) } className="vsp-general-tab" hasButtons={false} formReady={null} isValid={this.props.isFormValid} onSubmit={() => this.props.onSubmit(currentSoftwareProduct, qdata) } onValidityChanged={isValidityData => this.props.onValidityChanged(isValidityData) } isReadOnlyMode={isReadOnlyMode}>
); } onVendorParamChanged({ vendorId, licensingVersion }) { let { finalizedLicenseModelList, onVendorParamChanged } = this.props; if (!licensingVersion) { const licensingVersionsList = this.buildLicensingVersionsListItems(); licensingVersion = licensingVersionsList[0].enum; } if (!vendorId) { vendorId = finalizedLicenseModelList[0].id; } let vendorName = finalizedLicenseModelList.find( licenseModelItem => licenseModelItem.id === vendorId ).name || ''; let deltaData = { vendorId, vendorName, licensingVersion, licensingData: {} }; onVendorParamChanged(deltaData, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS); } buildLicensingVersionsListItems() { let { licensingVersionsList } = this.props; let licensingVersionsListItems = [ { enum: '', title: i18n('Select...') } ]; return licensingVersionsListItems.concat( licensingVersionsList .filter(item => item.status === versionStatus.CERTIFIED) .map(version => ({ enum: version.id, title: version.name })) ); } onFeatureGroupsChanged({ featureGroups }) { this.onLicensingDataChanged({ featureGroups }); } onLicensingDataChanged(deltaData) { this.props.onDataChanged( { licensingData: { ...this.props.currentSoftwareProduct.licensingData, ...deltaData } }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ); } onSelectSubCategory(subCategory) { let { softwareProductCategories, onDataChanged } = this.props; let category = SoftwareProductCategoriesHelper.getCurrentCategoryOfSubCategory( subCategory, softwareProductCategories ); onDataChanged( { category, subCategory }, forms.VENDOR_SOFTWARE_PRODUCT_DETAILS ); } save() { return this.validationForm.handleFormSubmit(new Event('dummy')); } } export default SoftwareProductDetails;