2 * Copyright © 2016-2018 European Support Limited
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 Validator from 'nfvo-utils/Validator.js';
22 import Form from 'nfvo-components/input/validation/Form.jsx';
23 import Button from 'sdc-ui/lib/react/Button.js';
24 import ModalButtons from 'sdc-app/onboarding/licenseModel/components/ModalButtons.jsx';
27 SP_ENTITLEMENT_POOL_FORM,
29 } from './EntitlementPoolsConstants.js';
32 thresholdValueValidation
33 } from '../LicenseModelValidations.js';
35 import Tabs from 'sdc-ui/lib/react/Tabs.js';
36 import Tab from 'sdc-ui/lib/react/Tab.js';
37 import EntitlementPoolsLimits from './EntitlementPoolsLimits.js';
41 } from '../limits/LimitEditorConstants.js';
42 import EntitlementPoolsFormContent from './components/FormContent.jsx';
44 const EntitlementPoolPropType = PropTypes.shape({
46 name: PropTypes.string,
47 description: PropTypes.string,
48 thresholdUnits: PropTypes.string,
49 thresholdValue: PropTypes.string,
50 increments: PropTypes.string,
51 startDate: PropTypes.string,
52 expiryDate: PropTypes.string
55 class EntitlementPoolsEditorView extends React.Component {
57 data: EntitlementPoolPropType,
58 previousData: EntitlementPoolPropType,
59 EPNames: PropTypes.object,
60 isReadOnlyMode: PropTypes.bool,
61 onDataChanged: PropTypes.func.isRequired,
62 onSubmit: PropTypes.func.isRequired,
63 onCancel: PropTypes.func.isRequired
66 static defaultProps = {
70 componentDidUpdate(prevProps) {
72 this.props.formReady &&
73 this.props.formReady !== prevProps.formReady
75 // if form validation succeeded -> continue with submit
81 selectedTab: tabIds.GENERAL,
94 const { selectedTab } = this.state;
95 const isTabsDisabled = !data.id || !this.props.isFormValid;
101 activeTab={selectedTab}
102 onTabClick={tabIndex => {
103 if (tabIndex === tabIds.ADD_LIMIT_BUTTON) {
106 this.setState({ selectedTab: tabIndex });
107 this.setState({ selectedLimit: '' });
108 onCloseLimitEditor();
113 tabId={tabIds.GENERAL}
114 data-test-id="general-tab"
115 title={i18n('General')}>
116 {genericFieldInfo && (
120 labledButtons={false}
121 isReadOnlyMode={isReadOnlyMode}
122 isValid={this.props.isFormValid}
123 formReady={this.props.formReady}
124 onValidateForm={() =>
125 this.props.onValidateForm(
126 SP_ENTITLEMENT_POOL_FORM
129 className="license-model-form entitlement-pools-form">
130 <EntitlementPoolsFormContent
132 genericFieldInfo={genericFieldInfo}
133 onDataChanged={onDataChanged}
134 validateName={value =>
135 this.validateName(value)
137 validateStartDate={(value, state) =>
138 validateStartDate(value, state)
140 thresholdValueValidation={(value, state) =>
141 thresholdValueValidation(value, state)
149 disabled={isTabsDisabled}
150 tabId={tabIds.SP_LIMITS}
151 data-test-id="sp-limits-tab"
152 title={i18n('SP Limits')}>
153 {selectedTab === tabIds.SP_LIMITS && (
154 <EntitlementPoolsLimits
155 isReadOnlyMode={isReadOnlyMode}
156 limitType={limitType.SERVICE_PROVIDER}
157 limitsList={limitsList.filter(
159 item.type === limitType.SERVICE_PROVIDER
161 selectedLimit={this.state.selectedLimit}
162 onCloseLimitEditor={() =>
163 this.onCloseLimitEditor()
165 onSelectLimit={limit =>
166 this.onSelectLimit(limit)
172 disabled={isTabsDisabled}
173 tabId={tabIds.VENDOR_LIMITS}
174 data-test-id="vendor-limits-tab"
175 title={i18n('Vendor Limits')}>
176 {selectedTab === tabIds.VENDOR_LIMITS && (
177 <EntitlementPoolsLimits
178 isReadOnlyMode={isReadOnlyMode}
179 limitType={limitType.VENDOR}
180 limitsList={limitsList.filter(
181 item => item.type === limitType.VENDOR
183 selectedLimit={this.state.selectedLimit}
184 onCloseLimitEditor={() =>
185 this.onCloseLimitEditor()
187 onSelectLimit={limit =>
188 this.onSelectLimit(limit)
193 {selectedTab !== tabIds.GENERAL ? (
196 this.state.selectedLimit || isReadOnlyMode
198 className="add-limit-button"
199 tabId={tabIds.ADD_LIMIT_BUTTON}
205 <div key="empty_ep_tab_key" />
206 ) // Render empty div to not break tabs
210 className="entitlement-pools-editor-buttons"
211 selectedLimit={this.state.selectedLimit}
212 isFormValid={this.props.isFormValid}
213 isReadOnlyMode={isReadOnlyMode}
214 onSubmit={this.submit}
215 onCancel={this.props.onCancel}
223 data: entitlementPool,
224 previousData: previousEntitlementPool,
228 this.props.onValidateForm(SP_ENTITLEMENT_POOL_FORM);
230 this.props.onSubmit({ entitlementPool, previousEntitlementPool });
234 validateName(value) {
235 const { data: { id }, EPNames } = this.props;
236 const isExists = Validator.isItemNameAlreadyExistsInList({
243 ? { isValid: true, errorText: '' }
247 "Entitlement pool by the name '" +
249 "' already exists. Entitlement pool name must be unique"
254 onSelectLimit(limit) {
255 if (limit.id === this.state.selectedLimit) {
256 this.setState({ selectedLimit: '' });
259 this.setState({ selectedLimit: limit.id });
260 this.props.onOpenLimitEditor(limit);
263 onCloseLimitEditor() {
264 this.setState({ selectedLimit: '' });
265 this.props.onCloseLimitEditor();
269 this.setState({ selectedLimit: NEW_LIMIT_TEMP_ID });
270 this.props.onOpenLimitEditor();
274 export default EntitlementPoolsEditorView;