aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-ui/src/sdc-app/onboarding/softwareProduct/details')
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetails.js66
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsReducer.js63
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsView.jsx264
3 files changed, 393 insertions, 0 deletions
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetails.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetails.js
new file mode 100644
index 0000000000..16a100c664
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetails.js
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+import {connect} from 'react-redux';
+
+import VersionControllerUtils from 'nfvo-components/panel/versionController/VersionControllerUtils.js';
+import SoftwareProductActionHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductActionHelper.js';
+import SoftwareProductDetailsView from './SoftwareProductDetailsView.jsx';
+
+export const mapStateToProps = ({finalizedLicenseModelList, softwareProduct, licenseModel: {licenseAgreement, featureGroup}}) => {
+ let {softwareProductEditor: {data: currentSoftwareProduct}, softwareProductCategories, softwareProductQuestionnaire} = softwareProduct;
+ let {licensingData = {}, licensingVersion} = currentSoftwareProduct;
+ let licenseAgreementList = [], filteredFeatureGroupsList = [];
+ if(licensingVersion && licensingVersion !== '') {
+ licenseAgreementList = licenseAgreement.licenseAgreementList;
+ let selectedLicenseAgreement = licenseAgreementList.find(la => la.id === licensingData.licenseAgreement);
+ if (selectedLicenseAgreement) {
+ let featureGroupsList = featureGroup.featureGroupsList.filter(({referencingLicenseAgreements}) => referencingLicenseAgreements.includes(selectedLicenseAgreement.id));
+ if (featureGroupsList.length) {
+ filteredFeatureGroupsList = featureGroupsList.map(featureGroup => ({enum: featureGroup.id, title: featureGroup.name}));
+ }
+ }
+ }
+ let {qdata, qschema} = softwareProductQuestionnaire;
+ let isReadOnlyMode = VersionControllerUtils.isReadOnly(currentSoftwareProduct);
+
+ return {
+ currentSoftwareProduct,
+ softwareProductCategories,
+ licenseAgreementList,
+ featureGroupsList: filteredFeatureGroupsList,
+ finalizedLicenseModelList,
+ qdata,
+ qschema,
+ isReadOnlyMode
+ };
+};
+
+export const mapActionsToProps = (dispatch) => {
+ return {
+ onDataChanged: deltaData => SoftwareProductActionHelper.softwareProductEditorDataChanged(dispatch, {deltaData}),
+ onVendorParamChanged: deltaData => SoftwareProductActionHelper.softwareProductEditorVendorChanged(dispatch, {deltaData}),
+ onQDataChanged: ({data}) => SoftwareProductActionHelper.softwareProductQuestionnaireUpdate(dispatch, {data}),
+ onValidityChanged: isValidityData => SoftwareProductActionHelper.setIsValidityData(dispatch, {isValidityData}),
+ onSubmit: (softwareProduct, qdata) =>{ return SoftwareProductActionHelper.updateSoftwareProduct(dispatch, {softwareProduct, qdata});}
+ };
+};
+
+export default connect(mapStateToProps, mapActionsToProps, null, {withRef: true})(SoftwareProductDetailsView);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsReducer.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsReducer.js
new file mode 100644
index 0000000000..e060706b37
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsReducer.js
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+import {actionTypes} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
+
+export default (state = {}, action) => {
+ switch (action.type) {
+ case actionTypes.softwareProductEditor.OPEN:
+ return {
+ ...state,
+ data: {}
+ };
+ case actionTypes.softwareProductEditor.DATA_CHANGED:
+ return {
+ ...state,
+ data: {
+ ...state.data,
+ ...action.deltaData
+ }
+ };
+ case actionTypes.softwareProductEditor.UPLOAD_CONFIRMATION:
+ return {
+ ...state,
+ uploadData:action.uploadData
+ };
+ case actionTypes.softwareProductEditor.IS_VALIDITY_DATA_CHANGED:
+ return {
+ ...state,
+ isValidityData: action.isValidityData
+ };
+ case actionTypes.softwareProductEditor.CLOSE:
+ return {};
+ case actionTypes.SOFTWARE_PRODUCT_LOADED:
+ return {
+ ...state,
+ data: action.response
+ };
+ case actionTypes.TOGGLE_NAVIGATION_ITEM:
+ return {
+ ...state,
+ mapOfExpandedIds: action.mapOfExpandedIds
+ };
+ default:
+ return state;
+ }
+};
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsView.jsx b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsView.jsx
new file mode 100644
index 0000000000..75a5797dec
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsView.jsx
@@ -0,0 +1,264 @@
+import React, {Component, PropTypes} from 'react';
+
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import Form from 'nfvo-components/input/validation/ValidationForm.jsx';
+import ValidationInput from 'nfvo-components/input/validation/ValidationInput.jsx';
+import SoftwareProductCategoriesHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductCategoriesHelper.js';
+
+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,
+ 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,
+ qschema: PropTypes.object.isRequired,
+ onQDataChanged: PropTypes.func.isRequired,
+ onVendorParamChanged: PropTypes.func.isRequired
+ };
+
+ state = {
+ licensingVersionsList: []
+ };
+
+ render() {
+ let {softwareProductCategories, finalizedLicenseModelList, onDataChanged, featureGroupsList, licenseAgreementList, currentSoftwareProduct} = this.props;
+ let {name, description, vendorId, licensingVersion, subCategory, licensingData = {}} = currentSoftwareProduct;
+ let licensingVersionsList = this.state.licensingVersionsList.length > 0 ? this.state.licensingVersionsList : this.refreshVendorVersionsList(vendorId);
+ let {qdata, qschema, onQDataChanged} = this.props;
+ let {isReadOnlyMode} = this.props;
+
+ return (
+ <div className='vsp-details-page'>
+ <Form
+ ref='validationForm'
+ className='vsp-general-tab'
+ hasButtons={false}
+ onSubmit={() => this.props.onSubmit(currentSoftwareProduct, qdata)}
+ onValidityChanged={(isValidityData) => this.props.onValidityChanged(isValidityData)}
+ isReadOnlyMode={isReadOnlyMode}>
+ <div className='section-title general'>{i18n('General')}</div>
+ <div className='vsp-general-tab-inline-section'>
+ <div className='vsp-general-tab-sub-section'>
+ <ValidationInput
+ label={i18n('Name')}
+ type='text'
+ value={name}
+ onChange={name => onDataChanged({name})}
+ validations={{validateName: true, maxLength: 120, required: true}}
+ className='field-section'/>
+ <ValidationInput
+ label={i18n('Vendor')}
+ type='select'
+ selectedEnum={vendorId}
+ onEnumChange={vendorId => this.onVendorParamChanged({vendorId})}
+ className='field-section'>
+ {finalizedLicenseModelList.map(lm => <option key={lm.id} value={lm.id}>{lm.vendorName}</option>)}
+ </ValidationInput>
+ <div className='input-row'>
+ <ValidationInput
+ label={i18n('Category')}
+ type='select'
+ selectedEnum={subCategory}
+ onEnumChange={subCategory => this.onSelectSubCategory(subCategory)}
+ className='field-section'>
+ {
+ softwareProductCategories.map(category =>
+ category.subcategories &&
+ <optgroup
+ key={category.name}
+ label={category.name}>{category.subcategories.map(sub =>
+ <option
+ key={sub.uniqueId}
+ value={sub.uniqueId}>{`${sub.name} (${category.name})`}</option>)}
+ </optgroup>
+ )
+ }
+ </ValidationInput>
+ </div>
+ </div>
+ <div className='vsp-general-tab-sub-section input-row'>
+ <ValidationInput
+ label={i18n('Description')}
+ type='textarea'
+ value={description}
+ onChange={description => onDataChanged({description})}
+ className='field-section'
+ validations={{required: true}}/>
+ </div>
+ </div>
+ <div className='vsp-general-tab-section licenses'>
+ <div className='section-title'>{i18n('Licenses')}</div>
+ <div className='vsp-general-tab-inline-section input-row'>
+ <ValidationInput
+ onEnumChange={licensingVersion => this.onVendorParamChanged({vendorId, licensingVersion})}
+ selectedEnum={licensingVersion}
+ label={i18n('Licensing Version')}
+ values={licensingVersionsList}
+ type='select'
+ className='field-section'/>
+ <ValidationInput
+ label={i18n('License Agreement')}
+ type='select'
+ selectedEnum={licensingData.licenseAgreement}
+ className='field-section'
+ onEnumChange={(licenseAgreement) => this.onLicensingDataChanged({licenseAgreement, featureGroups: []})}>
+ <option key='placeholder' value=''>{i18n('Select...')}</option>
+ {licenseAgreementList.map(la => <option value={la.id} key={la.id}>{la.name}</option>)}
+ </ValidationInput>
+ </div>
+ <div className='vsp-general-tab-inline-section input-row'>
+ {licensingData.licenseAgreement && (
+ <ValidationInput
+ type='select'
+ isMultiSelect={true}
+ onEnumChange={featureGroups => this.onFeatureGroupsChanged({featureGroups})}
+ multiSelectedEnum={licensingData.featureGroups}
+ name='feature-groups'
+ label={i18n('Feature Groups')}
+ clearable={false}
+ values={featureGroupsList}/>)
+ }
+ </div>
+ </div>
+ </Form>
+ <Form
+ data={qdata}
+ schema={qschema}
+ onDataChanged={onQDataChanged}
+ className='vsp-general-tab'
+ hasButtons={false}
+ isReadOnlyMode={isReadOnlyMode}>
+ <div className='vsp-general-tab-section'>
+ <div className='section-title'> {i18n('Availability')} </div>
+ <div className='vsp-general-tab-inline-section'>
+ <div className='vsp-general-tab-sub-section input-row'>
+ <ValidationInput
+ label={i18n('Use Availability Zones for High Availability')}
+ type='checkbox'
+ pointer='/general/availability/useAvailabilityZonesForHighAvailability'/>
+ </div>
+ </div>
+ <div className='section-title'> {i18n('Regions')} </div>
+ <div className='vsp-general-tab-inline-section'>
+ <div className='vsp-general-tab-sub-section input-row'>
+ <ValidationInput
+ type='select'
+ laebl='Ziv'
+ pointer='/general/regionsData/regions'/>
+ </div>
+ </div>
+ <div className='section-title'> {i18n('Storage Data Replication')} </div>
+ <div className='vsp-general-tab-inline-section'>
+ <div className='vsp-general-tab-sub-section'>
+ <ValidationInput
+ label={i18n('Storage Replication Size (GB)')}
+ type='text'
+ pointer='/general/storageDataReplication/storageReplicationSize'
+ className='field-section'/>
+ <ValidationInput
+ label={i18n('Storage Replication Source')}
+ type='text'
+ pointer='/general/storageDataReplication/storageReplicationSource'
+ className='field-section'/>
+ </div>
+ <div className='vsp-general-tab-sub-section'>
+ <ValidationInput
+ label={i18n('Storage Replication Frequency (minutes)')}
+ type='text'
+ pointer='/general/storageDataReplication/storageReplicationFrequency'
+ className='field-section'/>
+ <ValidationInput
+ label={i18n('Storage Replication Destination')}
+ type='text'
+ pointer='/general/storageDataReplication/storageReplicationDestination'
+ className='field-section'/>
+ </div>
+ </div>
+ </div>
+ </Form>
+ </div>
+ );
+ }
+
+ onVendorParamChanged({vendorId, licensingVersion}) {
+ let {finalizedLicenseModelList, onVendorParamChanged} = this.props;
+ if(!licensingVersion) {
+ const licensingVersionsList = this.refreshVendorVersionsList(vendorId);
+ licensingVersion = licensingVersionsList.length > 0 ? licensingVersionsList[0].enum : '';
+ }
+ let vendorName = finalizedLicenseModelList.find(licenseModelItem => licenseModelItem.id === vendorId).vendorName || '';
+ let deltaData = {
+ vendorId,
+ vendorName,
+ licensingVersion,
+ licensingData: {}
+ };
+ onVendorParamChanged(deltaData);
+ }
+
+ refreshVendorVersionsList(vendorId) {
+ if(!vendorId) {
+ return [];
+ }
+
+ let {finalVersions} = this.props.finalizedLicenseModelList.find(vendor => vendor.id === vendorId);
+
+ let licensingVersionsList = [{
+ enum: '',
+ title: i18n('Select...')
+ }];
+ if(finalVersions) {
+ finalVersions.forEach(version => licensingVersionsList.push({
+ enum: version,
+ title: version
+ }));
+ }
+
+ return licensingVersionsList;
+ }
+
+ onSelectSubCategory(subCategory) {
+ let {softwareProductCategories, onDataChanged} = this.props;
+ let category = SoftwareProductCategoriesHelper.getCurrentCategoryOfSubCategory(subCategory, softwareProductCategories);
+ onDataChanged({category, subCategory});
+ }
+
+ onFeatureGroupsChanged({featureGroups}) {
+ this.onLicensingDataChanged({featureGroups});
+ }
+
+ onLicensingDataChanged(deltaData) {
+ this.props.onDataChanged({
+ licensingData: {
+ ...this.props.currentSoftwareProduct.licensingData,
+ ...deltaData
+ }
+ });
+ }
+
+ save(){
+ return this.refs.validationForm.handleFormSubmit(new Event('dummy'));
+ }
+}
+
+export default SoftwareProductDetails;