2 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
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 React from 'react';
17 import PropTypes from 'prop-types';
19 import i18n from 'nfvo-utils/i18n/i18n.js';
20 import Modal from 'nfvo-components/modal/Modal.jsx';
21 import ListEditorView from 'nfvo-components/listEditor/ListEditorView.jsx';
22 import ListEditorItemView from 'nfvo-components/listEditor/ListEditorItemView.jsx';
24 import FeatureGroupEditor from './FeatureGroupEditor.js';
26 class FeatureGroupListEditorView extends React.Component {
28 vendorName: PropTypes.string,
29 licenseModelId: PropTypes.string.isRequired,
30 featureGroupsModal: PropTypes.shape({
32 editMode: PropTypes.bool
34 isReadOnlyMode: PropTypes.bool.isRequired,
35 onAddFeatureGroupClick: PropTypes.func,
36 onEditFeatureGroupClick: PropTypes.func,
37 onDeleteFeatureGroupClick: PropTypes.func,
38 onCancelFeatureGroupsEditor: PropTypes.func,
39 featureGroupsList: PropTypes.array
42 static defaultProps = {
43 featureGroupsList: [],
55 let {licenseModelId, featureGroupsModal, isReadOnlyMode, onAddFeatureGroupClick, version} = this.props;
56 const {localFilter} = this.state;
58 <div className='license-model-list-editor feature-groups-list-editor'>
60 title={i18n('Feature Groups')}
61 plusButtonTitle={i18n('Add Feature Group')}
62 filterValue={localFilter}
63 onFilter={value => this.setState({localFilter: value})}
64 onAdd={() => onAddFeatureGroupClick(version)}
65 isReadOnlyMode={isReadOnlyMode}>
66 {this.filterList().map(listItem => this.renderFeatureGroupListItem(listItem, isReadOnlyMode, version))}
68 {featureGroupsModal.show && <Modal show={featureGroupsModal.show} bsSize='large' animation={true}
69 className='onborading-modal license-model-modal feature-group-modal'>
71 <Modal.Title>{`${featureGroupsModal.editMode ? i18n('Edit Feature Group') : i18n('Create New Feature Group')}`}</Modal.Title>
76 licenseModelId={licenseModelId}
77 isReadOnlyMode={isReadOnlyMode}/>
87 renderFeatureGroupListItem(listItem, isReadOnlyMode, version) {
88 let {name, description, manufacturerReferenceNumber, entitlementPoolsIds = [], licenseKeyGroupsIds = []} = listItem;
92 onDelete={() => this.deleteFeatureGroupItem(listItem, version)}
93 onSelect={() => this.editFeatureGroupItem(listItem, version)}
94 className='list-editor-item-view'
95 isReadOnlyMode={isReadOnlyMode}>
96 <div className='list-editor-item-view-field'>
97 <div className='title'>{i18n('Name')}</div>
98 <div className='text name'>{name}</div>
101 <div className='list-editor-item-view-field smaller-field'>
102 <div className='feature-groups-count-field'>
103 <div className='title'>{i18n('EP')}</div>
104 <div className='feature-groups-count-ep'>{entitlementPoolsIds.length || 0}</div>
107 <div className='list-editor-item-view-field smaller-field'>
108 <div className='feature-groups-count-field'>
109 <div className='title'>{i18n('LKG')}</div>
110 <div className='feature-groups-count-lk'>{licenseKeyGroupsIds.length || 0}</div>
114 <div className='list-editor-item-view-field'>
115 <div className='feature-groups-count-field'>
116 <div className='title title-no-wrap'>{i18n('Manufacturer Reference Number')}</div>
117 <div className='feature-groups-mrn-ep'>{manufacturerReferenceNumber}</div>
121 <div className='list-editor-item-view-field'>
122 <div className='title'>{i18n('Description')}</div>
123 <div className='text description'>{description}</div>
128 </ListEditorItemView>
133 let {featureGroupsList} = this.props;
134 let {localFilter} = this.state;
135 if (localFilter.trim()) {
136 const filter = new RegExp(escape(localFilter), 'i');
137 return featureGroupsList.filter(({name = '', description = ''}) => {
138 return escape(name).match(filter) || escape(description).match(filter);
142 return featureGroupsList;
146 editFeatureGroupItem(featureGroup, version) {
147 this.props.onEditFeatureGroupClick(featureGroup, version);
150 deleteFeatureGroupItem(featureGroup, version) {
151 this.props.onDeleteFeatureGroupClick(featureGroup, version);
155 export default FeatureGroupListEditorView;
157 export function generateConfirmationMsg(featureGroupToDelete) {
158 let name = featureGroupToDelete ? featureGroupToDelete.name : '';
159 let msg = i18n('Are you sure you want to delete "{name}"?', {name: name});
160 let subMsg = featureGroupToDelete.referencingLicenseAgreements
161 && featureGroupToDelete.referencingLicenseAgreements.length > 0 ?
162 i18n('This feature group is associated with one ore more license agreements') :