/*! * 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. */ import React from 'react'; import i18n from 'nfvo-utils/i18n/i18n.js'; import Validator from 'nfvo-utils/Validator.js'; import Tabs from 'sdc-ui/lib/react/Tabs.js'; import Tab from 'sdc-ui/lib/react/Tab.js'; import Button from 'sdc-ui/lib/react/Button.js'; import Form from 'nfvo-components/input/validation/Form.jsx'; import Input from 'nfvo-components/input/validation/Input.jsx'; import GridSection from 'nfvo-components/grid/GridSection.jsx'; import GridItem from 'nfvo-components/grid/GridItem.jsx'; import {optionsInputValues as licenseKeyGroupOptionsInputValues, LKG_FORM_NAME, tabIds} from './LicenseKeyGroupsConstants.js'; import {optionsInputValues as LicenseModelOptionsInputValues} from '../LicenseModelConstants.js'; import {validateStartDate, thresholdValueValidation} from '../LicenseModelValidations.js'; import {other as optionInputOther} from 'nfvo-components/input/validation/InputOptions.jsx'; import InputOptions from 'nfvo-components/input/validation/InputOptions.jsx'; import {DATE_FORMAT} from 'sdc-app/onboarding/OnboardingConstants.js'; import LicenseKeyGroupsLimits from './LicenseKeyGroupsLimits.js'; import {limitType, NEW_LIMIT_TEMP_ID} from '../limits/LimitEditorConstants.js'; const LicenseKeyGroupPropType = React.PropTypes.shape({ id: React.PropTypes.string, name: React.PropTypes.string, description: React.PropTypes.string, increments: React.PropTypes.string, operationalScope: React.PropTypes.shape({ choices: React.PropTypes.array, other: React.PropTypes.string }), type: React.PropTypes.string, thresholdUnits: React.PropTypes.string, thresholdValue: React.PropTypes.number, startDate: React.PropTypes.string, expiryDate: React.PropTypes.string }); const LicenseKeyGroupFormContent = ({data, onDataChanged, genericFieldInfo, validateName, validateStartDate, thresholdValueValidation}) => { let {name, description, increments, operationalScope, type, thresholdUnits, thresholdValue, startDate, expiryDate} = data; return ( onDataChanged({name}, LKG_FORM_NAME, {name: validateName})} label={i18n('Name')} data-test-id='create-lkg-name' value={name} isValid={genericFieldInfo.name.isValid} errorText={genericFieldInfo.name.errorText} isRequired={true} type='text'/> {}} isMultiSelect={true} onEnumChange={operationalScope => onDataChanged({operationalScope:{choices: operationalScope, other: ''}}, LKG_FORM_NAME)} onOtherChange={operationalScope => onDataChanged({operationalScope:{choices: [optionInputOther.OTHER], other: operationalScope}}, LKG_FORM_NAME)} label={i18n('Operational Scope')} data-test-id='create-lkg-operational-scope' type='select' multiSelectedEnum={operationalScope && operationalScope.choices} otherValue={operationalScope && operationalScope.other} values={licenseKeyGroupOptionsInputValues.OPERATIONAL_SCOPE} isValid={genericFieldInfo.operationalScope.isValid} errorText={genericFieldInfo.operationalScope.errorText} /> onDataChanged({description}, LKG_FORM_NAME)} label={i18n('Description')} data-test-id='create-lkg-description' value={description} isValid={genericFieldInfo.description.isValid} errorText={genericFieldInfo.description.errorText} type='textarea' overlayPos='bottom' /> { const selectedIndex = e.target.selectedIndex; const val = e.target.options[selectedIndex].value; onDataChanged({type: val}, LKG_FORM_NAME);}} value={type} label={i18n('Type')} data-test-id='create-lkg-type' isValid={genericFieldInfo.type.isValid} errorText={genericFieldInfo.type.errorText} groupClassName='bootstrap-input-options' className='input-options-select' type='select' > { licenseKeyGroupOptionsInputValues.TYPE.map(type => ()) } { // setting the unit to the correct value const selectedIndex = e.target.selectedIndex; const val = e.target.options[selectedIndex].value; onDataChanged({thresholdUnits: val}, LKG_FORM_NAME); // TODO make sure that the value is valid too onDataChanged({thresholdValue: thresholdValue}, LKG_FORM_NAME,{thresholdValue : thresholdValueValidation});} } value={thresholdUnits} label={i18n('Threshold Units')} data-test-id='create-ep-threshold-units' isValid={genericFieldInfo.thresholdUnits.isValid} errorText={genericFieldInfo.thresholdUnits.errorText} groupClassName='bootstrap-input-options' className='input-options-select' type='select' > {LicenseModelOptionsInputValues.THRESHOLD_UNITS.map(mtype => )} onDataChanged({thresholdValue}, LKG_FORM_NAME, {thresholdValue : thresholdValueValidation})} label={i18n('Threshold Value')} isValid={genericFieldInfo.thresholdValue.isValid} errorText={genericFieldInfo.thresholdValue.errorText} data-test-id='create-ep-threshold-value' value={thresholdValue} type='text'/> onDataChanged( {startDate: startDate ? startDate.format(DATE_FORMAT) : ''}, LKG_FORM_NAME, {startDate: validateStartDate} )} isValid={genericFieldInfo.startDate.isValid} errorText={genericFieldInfo.startDate.errorText} selectsStart/> { onDataChanged({expiryDate: expiryDate ? expiryDate.format(DATE_FORMAT) : ''}, LKG_FORM_NAME); onDataChanged({startDate}, LKG_FORM_NAME, {startDate: validateStartDate}); }} isValid={genericFieldInfo.expiryDate.isValid} errorText={genericFieldInfo.expiryDate.errorText} selectsEnd/> onDataChanged({increments}, LKG_FORM_NAME)} label={i18n('Increments')} value={increments} data-test-id='create-ep-increments' type='text'/> ); }; class LicenseKeyGroupsEditorView extends React.Component { static propTypes = { data: LicenseKeyGroupPropType, previousData: LicenseKeyGroupPropType, LKGNames: React.PropTypes.object, isReadOnlyMode: React.PropTypes.bool, onDataChanged: React.PropTypes.func.isRequired, onSubmit: React.PropTypes.func.isRequired, onCancel: React.PropTypes.func.isRequired }; static defaultProps = { data: {} }; componentDidUpdate(prevProps) { if (this.props.formReady && this.props.formReady !== prevProps.formReady) { // if form validation succeeded -> continue with submit this.submit(); } } state = { localFeatureGroupsListFilter: '', selectedTab: tabIds.GENERAL, selectedLimit: '' }; render() { let {data = {}, onDataChanged, isReadOnlyMode, onCloseLimitEditor, genericFieldInfo, limitsList = []} = this.props; let {selectedTab} = this.state; const isTabsDisabled = !data.id || !this.props.isFormValid; return (
{ if (tabIndex === tabIds.ADD_LIMIT_BUTTON) { this.onAddLimit(); } else { this.setState({selectedTab: tabIndex}); onCloseLimitEditor(); this.setState({selectedLimit: ''}); } }} invalidTabs={[]}> { genericFieldInfo &&
this.props.onValidateForm(LKG_FORM_NAME) } labledButtons={true} isReadOnlyMode={isReadOnlyMode} className='license-model-form license-key-groups-form'> this.validateName(value)} validateStartDate={(value, state)=> validateStartDate(value, state)} thresholdValueValidation={(value, state) => thresholdValueValidation(value, state)}/> }
{selectedTab === tabIds.SP_LIMITS && item.type === limitType.SERVICE_PROVIDER)} selectedLimit={this.state.selectedLimit} onCloseLimitEditor={() => this.onCloseLimitEditor()} onSelectLimit={limit => this.onSelectLimit(limit)} isReadOnlyMode={isReadOnlyMode} />} {selectedTab === tabIds.VENDOR_LIMITS && item.type === limitType.VENDOR)} selectedLimit={this.state.selectedLimit} onCloseLimitEditor={() => this.onCloseLimitEditor()} onSelectLimit={limit => this.onSelectLimit(limit)} isReadOnlyMode={isReadOnlyMode} />} {selectedTab !== tabIds.GENERAL ? :
// Render empty div to not break tabs }
{!this.state.selectedLimit && }
); } submit() { const {data: licenseKeyGroup, previousData: previousLicenseKeyGroup, formReady, onValidateForm, onSubmit} = this.props; if (!formReady) { onValidateForm(LKG_FORM_NAME); } else { onSubmit({licenseKeyGroup, previousLicenseKeyGroup}); } } validateName(value) { const {data: {id}, LKGNames} = this.props; const isExists = Validator.isItemNameAlreadyExistsInList({itemId: id, itemName: value, list: LKGNames}); return !isExists ? {isValid: true, errorText: ''} : {isValid: false, errorText: i18n('License key group by the name \'' + value + '\' already exists. License key group name must be unique')}; } onSelectLimit(limit) { if (limit.id === this.state.selectedLimit) { this.setState({selectedLimit: ''}); return; } this.setState({selectedLimit: limit.id}); this.props.onOpenLimitEditor(limit); } onCloseLimitEditor() { this.setState({selectedLimit: ''}); this.props.onCloseLimitEditor(); } onAddLimit() { this.setState({selectedLimit: NEW_LIMIT_TEMP_ID}); this.props.onOpenLimitEditor(); } } export default LicenseKeyGroupsEditorView;