import React from 'react'; import ValidationTabs from 'nfvo-components/input/validation/ValidationTabs.jsx'; import ValidationTab from 'nfvo-components/input/validation/ValidationTab.jsx'; import ButtonGroup from 'react-bootstrap/lib/ButtonGroup.js'; import Button from 'react-bootstrap/lib/Button.js'; import ValidationForm from 'nfvo-components/input/validation/ValidationForm.jsx'; import DualListboxView from 'nfvo-components/input/dualListbox/DualListboxView.jsx'; import ValidationInput from 'nfvo-components/input/validation/ValidationInput.jsx'; import ListEditorView from 'nfvo-components/listEditor/ListEditorView.jsx'; import ListEditorViewItem from 'nfvo-components/listEditor/ListEditorItemView.jsx'; import i18n from 'nfvo-utils/i18n/i18n.js'; import {state as FeatureGroupStateConstants} from './FeatureGroupsConstants.js'; const FeatureGroupsPropType = React.PropTypes.shape({ id: React.PropTypes.string, name: React.PropTypes.string, description: React.PropTypes.string, partNumber: React.PropTypes.string, entitlementPoolsIds: React.PropTypes.array(React.PropTypes.string), licenseKeyGroupsIds: React.PropTypes.array(React.PropTypes.string) }); class FeatureGroupEditorView extends React.Component { static propTypes = { data: FeatureGroupsPropType, previousData: FeatureGroupsPropType, isReadOnlyMode: React.PropTypes.bool, onSubmit: React.PropTypes.func, onCancel: React.PropTypes.func, selectedTab: React.PropTypes.number, onTabSelect: React.PropTypes.func, selectedEntitlementPoolsButtonTab: React.PropTypes.number, selectedLicenseKeyGroupsButtonTab: React.PropTypes.number, onEntitlementPoolsButtonTabSelect: React.PropTypes.func, onLicenseKeyGroupsButtonTabSelect: React.PropTypes.func, entitlementPoolsList: DualListboxView.propTypes.availableList, licenseKeyGroupsList: DualListboxView.propTypes.availableList }; static defaultProps = { data: {}, selectedTab: FeatureGroupStateConstants.SELECTED_FEATURE_GROUP_TAB.GENERAL, selectedEntitlementPoolsButtonTab: FeatureGroupStateConstants.SELECTED_ENTITLEMENT_POOLS_BUTTONTAB.ASSOCIATED_ENTITLEMENT_POOLS, selectedLicenseKeyGroupsButtonTab: FeatureGroupStateConstants.SELECTED_LICENSE_KEY_GROUPS_BUTTONTAB.ASSOCIATED_LICENSE_KEY_GROUPS }; state = { localEntitlementPoolsListFilter: '', localLicenseKeyGroupsListFilter: '' }; render() { let {selectedTab, onTabSelect, isReadOnlyMode} = this.props; return ( this.submit() } onReset={ () => this.props.onCancel() } labledButtons={true} isReadOnlyMode={isReadOnlyMode} name='feature-group-validation-form' className='feature-group-form'> {this.renderGeneralTab()} {this.renderEntitlementPoolsTab()} {this.renderLicenseKeyGroupsTab()} ); } submit() { const {data: featureGroup, previousData: previousFeatureGroup} = this.props; this.props.onSubmit(previousFeatureGroup, featureGroup); } renderGeneralTab() { let {data = {}, onDataChanged} = this.props; let {name, description, partNumber} = data; return (
onDataChanged({name})} ref='name' label={i18n('Name')} value={name} name='feature-group-name' validations={{maxLength: 120, required: true}} type='text'/> onDataChanged({description})} ref='description' label={i18n('Description')} value={description} name='feature-group-description' validations={{maxLength: 1000, required: true}} type='textarea'/> onDataChanged({partNumber})} label={i18n('Part Number')} value={partNumber} validations={{required: true}} type='text'/>
); } renderEntitlementPoolsTab() { let {selectedEntitlementPoolsButtonTab, onEntitlementPoolsButtonTabSelect, entitlementPoolsList} = this.props; if (entitlementPoolsList.length > 0) { return ( { this.renderButtonsTab( FeatureGroupStateConstants.SELECTED_ENTITLEMENT_POOLS_BUTTONTAB.ASSOCIATED_ENTITLEMENT_POOLS, selectedEntitlementPoolsButtonTab, i18n('Associated Entitlement Pools'), onEntitlementPoolsButtonTabSelect ) } { this.renderButtonsTab( FeatureGroupStateConstants.SELECTED_ENTITLEMENT_POOLS_BUTTONTAB.AVAILABLE_ENTITLEMENT_POOLS, selectedEntitlementPoolsButtonTab, i18n('Available Entitlement Pools'), onEntitlementPoolsButtonTabSelect ) } {this.renderEntitlementPoolsButtonTabContent(selectedEntitlementPoolsButtonTab)} ); } else { return (

{i18n('There is no available entitlement pools.')}

); } } renderLicenseKeyGroupsTab() { let {selectedLicenseKeyGroupsButtonTab, onLicenseKeyGroupsButtonTabSelect, licenseKeyGroupsList} = this.props; if (licenseKeyGroupsList.length > 0) { return ( { this.renderButtonsTab( FeatureGroupStateConstants.SELECTED_LICENSE_KEY_GROUPS_BUTTONTAB.ASSOCIATED_LICENSE_KEY_GROUPS, selectedLicenseKeyGroupsButtonTab, i18n('Associated License Key Groups'), onLicenseKeyGroupsButtonTabSelect ) } { this.renderButtonsTab( FeatureGroupStateConstants.SELECTED_LICENSE_KEY_GROUPS_BUTTONTAB.AVAILABLE_LICENSE_KEY_GROUPS, selectedLicenseKeyGroupsButtonTab, i18n('Available License Key Groups'), onLicenseKeyGroupsButtonTabSelect ) } {this.renderLicenseKeyGroupsTabContent(selectedLicenseKeyGroupsButtonTab)} ); } else { return (

{i18n('There is no available license key groups')}

); } } renderButtonsTab(buttonTab, selectedButtonTab, title, onClick) { const isSelected = buttonTab === selectedButtonTab; return ( ); } renderEntitlementPoolsButtonTabContent(selectedFeatureGroupsButtonTab) { const {entitlementPoolsList = [], data: {entitlementPoolsIds = []}} = this.props; let dualBoxTitle = { left: i18n('Available Entitlement Pools'), right: i18n('Selected Entitlement Pools') }; if (entitlementPoolsList.length) { const {localEntitlementPoolsListFilter} = this.state; let selectedEntitlementPools = entitlementPoolsIds.map(entitlementPoolId => entitlementPoolsList.find(entitlementPool => entitlementPool.id === entitlementPoolId)); switch (selectedFeatureGroupsButtonTab) { case FeatureGroupStateConstants.SELECTED_ENTITLEMENT_POOLS_BUTTONTAB.ASSOCIATED_ENTITLEMENT_POOLS: if (selectedEntitlementPools.length) { return ( this.setState({localEntitlementPoolsListFilter})}> {this.filterAssociatedItems(selectedEntitlementPools, localEntitlementPoolsListFilter) .map(entitlementPool => this.renderAssociatedListItem(entitlementPool , FeatureGroupStateConstants.SELECTED_FEATURE_GROUP_TAB.ENTITLEMENT_POOLS))} ); } else { return (

{i18n('There are currently no entitlement pools associated with this feature group. Click "Available Entitlement Pools" to associate.')}
); } case FeatureGroupStateConstants.SELECTED_ENTITLEMENT_POOLS_BUTTONTAB.AVAILABLE_ENTITLEMENT_POOLS: return ( this.props.onDataChanged( { entitlementPoolsIds: selectedValuesList } )}/> ); } } } renderLicenseKeyGroupsTabContent(selectedFeatureGroupsButtonTab) { const {licenseKeyGroupsList = [], data: {licenseKeyGroupsIds = []}} = this.props; let dualBoxFilterTitle = { left: i18n('Available License Key Groups'), right: i18n('Selected License Key Groups') }; if (licenseKeyGroupsList.length) { const {localLicenseKeyGroupsListFilter} = this.state; let selectedLicenseKeyGroups = licenseKeyGroupsIds.map(licenseKeyGroupId => licenseKeyGroupsList.find(licenseKeyGroup => licenseKeyGroup.id === licenseKeyGroupId)); switch (selectedFeatureGroupsButtonTab) { case FeatureGroupStateConstants.SELECTED_LICENSE_KEY_GROUPS_BUTTONTAB.ASSOCIATED_LICENSE_KEY_GROUPS: if (selectedLicenseKeyGroups.length) { return ( this.setState({localLicenseKeyGroupsListFilter})}> {this.filterAssociatedItems(selectedLicenseKeyGroups, localLicenseKeyGroupsListFilter) .map(licenseKeyGroup => this.renderAssociatedListItem(licenseKeyGroup , FeatureGroupStateConstants.SELECTED_FEATURE_GROUP_TAB.LICENCE_KEY_GROUPS))} ); } else { return (
{i18n('There are currently no license key groups associated with this feature group. Click "Available License Key Groups" to associate.')}
); } case FeatureGroupStateConstants.SELECTED_LICENSE_KEY_GROUPS_BUTTONTAB.AVAILABLE_LICENSE_KEY_GROUPS: return ( this.props.onDataChanged( { licenseKeyGroupsIds: selectedValuesList } )}/> ); } } } renderAssociatedListItem(listItem, itemType) { let {isReadOnlyMode} = this.props; return ( this.deleteAssociatedItem(listItem.id, itemType)} isReadOnlyMode={isReadOnlyMode}>
{listItem.name}
{listItem.description}
); } filterAssociatedItems(list, localList) { if (localList) { const filter = new RegExp(escape(localList), 'i'); return list.filter(({name = '', description = ''}) => name.match(filter) || description.match(filter)); } else { return list; } } deleteAssociatedItem(id, type) { const {data: {licenseKeyGroupsIds = [], entitlementPoolsIds = []}} = this.props; if (type === FeatureGroupStateConstants.SELECTED_FEATURE_GROUP_TAB.LICENCE_KEY_GROUPS) { this.props.onDataChanged({licenseKeyGroupsIds: licenseKeyGroupsIds.filter(listId => listId !== id)}); } else { this.props.onDataChanged({entitlementPoolsIds: entitlementPoolsIds.filter(listId => listId !== id)}); } } } export default FeatureGroupEditorView;