Add collaboration feature

Issue-ID: SDC-767
Change-Id: I14fb4c1f54086ed03a56a7ff7fab9ecd40381795
Signed-off-by: talig <talig@amdocs.com>
diff --git a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementActionHelper.js b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementActionHelper.js
index e9d922c..b4f03a6 100644
--- a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementActionHelper.js
+++ b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementActionHelper.js
@@ -17,7 +17,7 @@
 import Configuration from 'sdc-app/config/Configuration.js';
 import {actionTypes as licenseAgreementActionTypes} from './LicenseAgreementConstants.js';
 import FeatureGroupsActionHelper from 'sdc-app/onboarding/licenseModel/featureGroups/FeatureGroupsActionHelper.js';
-import LicenseModelActionHelper from 'sdc-app/onboarding/licenseModel/LicenseModelActionHelper.js';
+import ItemsHelper from 'sdc-app/common/helpers/ItemsHelper.js';
 
 function baseUrl(licenseModelId, version) {
 	const restPrefix = Configuration.get('restPrefix');
@@ -29,6 +29,10 @@
 	return RestAPIUtil.fetch(`${baseUrl(licenseModelId, version)}`);
 }
 
+function fetchLicenseAgreement(licenseModelId, licenseAgreementId, version) {
+	return RestAPIUtil.fetch(`${baseUrl(licenseModelId, version)}/${licenseAgreementId}`);
+}
+
 function postLicenseAgreement(licenseModelId, licenseAgreement, version) {
 	return RestAPIUtil.post(baseUrl(licenseModelId, version), {
 		name: licenseAgreement.name,
@@ -65,6 +69,10 @@
 		}));
 	},
 
+	fetchLicenseAgreement(dispatch, {licenseModelId, licenseAgreementId, version}) {
+		return fetchLicenseAgreement(licenseModelId, licenseAgreementId, version);
+	},
+
 	openLicenseAgreementEditor(dispatch, {licenseModelId, licenseAgreement, version}) {
 		FeatureGroupsActionHelper.fetchFeatureGroupsList(dispatch, {licenseModelId, version});
 		dispatch({
@@ -84,12 +92,14 @@
 		if (previousLicenseAgreement) {
 			return putLicenseAgreement(licenseModelId, previousLicenseAgreement, licenseAgreement, version).then(() => {
 				this.fetchLicenseAgreementList(dispatch, {licenseModelId, version});
+				ItemsHelper.checkItemStatus(dispatch, {itemId: licenseModelId, versionId: version.id});
 			});
 		}
 		else {
 			return postLicenseAgreement(licenseModelId, licenseAgreement, version).then(() => {
 				this.fetchLicenseAgreementList(dispatch, {licenseModelId, version});
 				FeatureGroupsActionHelper.fetchFeatureGroupsList(dispatch, {licenseModelId, version});
+				ItemsHelper.checkItemStatus(dispatch, {itemId: licenseModelId, versionId: version.id});
 			});
 		}
 	},
@@ -100,6 +110,7 @@
 				type: licenseAgreementActionTypes.DELETE_LICENSE_AGREEMENT,
 				licenseAgreementId
 			});
+			ItemsHelper.checkItemStatus(dispatch, {itemId: licenseModelId, versionId: version.id});
 		});
 	},
 
@@ -108,11 +119,5 @@
 			type: licenseAgreementActionTypes.licenseAgreementEditor.SELECT_TAB,
 			tab
 		});
-	},
-
-	switchVersion(dispatch, {licenseModelId, version}) {
-		LicenseModelActionHelper.fetchLicenseModelById(dispatch, {licenseModelId, version}).then(() => {
-			this.fetchLicenseAgreementList(dispatch, {licenseModelId, version});
-		});
 	}
 };
diff --git a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementEditorView.jsx b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementEditorView.jsx
index 0b41868..a3e73f4 100644
--- a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementEditorView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementEditorView.jsx
@@ -14,7 +14,7 @@
  * permissions and limitations under the License.
  */
 import React from 'react';
-
+import PropTypes from 'prop-types';
 import GridSection from 'nfvo-components/grid/GridSection.jsx';
 import GridItem from 'nfvo-components/grid/GridItem.jsx';
 import {TabsForm as Form} from 'nfvo-components/input/validation/Form.jsx';
@@ -34,21 +34,21 @@
 	right: i18n('Selected Feature Groups')
 };
 
-const LicenseAgreementPropType = React.PropTypes.shape({
-	id: React.PropTypes.string,
-	name: React.PropTypes.string,
-	description: React.PropTypes.string,
-	requirementsAndConstrains: React.PropTypes.string,
-	licenseTerm: React.PropTypes.object,
-	featureGroupsIds: React.PropTypes.arrayOf(React.PropTypes.string),
-	version: React.PropTypes.object
+const LicenseAgreementPropType = PropTypes.shape({
+	id: PropTypes.string,
+	name: PropTypes.string,
+	description: PropTypes.string,
+	requirementsAndConstrains: PropTypes.string,
+	licenseTerm: PropTypes.object,
+	featureGroupsIds: PropTypes.arrayOf(PropTypes.string),
+	version: PropTypes.object
 });
 
 
 const GeneralTabContent = ({data, genericFieldInfo, onDataChanged, validateName}) => {
 	let {name, description, requirementsAndConstrains, licenseTerm} = data;
 	return (
-		<GridSection>
+		<GridSection hasLastColSet>
 			<GridItem colSpan={2}>
 				<Input
 					isValid={genericFieldInfo.name.isValid}
@@ -86,7 +86,7 @@
 					isValid={genericFieldInfo.licenseTerm.isValid}
 					errorText={genericFieldInfo.licenseTerm.errorText} />
 			</GridItem>
-			<GridItem colSpan={2} stretch>
+			<GridItem colSpan={2} stretch lastColInRow>
 				<Input
 					isValid={genericFieldInfo.description.isValid}
 					errorText={genericFieldInfo.description.errorText}
@@ -107,17 +107,17 @@
 	static propTypes = {
 		data: LicenseAgreementPropType,
 		previousData: LicenseAgreementPropType,
-		LANames: React.PropTypes.object,
-		isReadOnlyMode: React.PropTypes.bool,
-		onDataChanged: React.PropTypes.func.isRequired,
-		onSubmit: React.PropTypes.func.isRequired,
-		onCancel: React.PropTypes.func.isRequired,
+		LANames: PropTypes.object,
+		isReadOnlyMode: PropTypes.bool,
+		onDataChanged: PropTypes.func.isRequired,
+		onSubmit: PropTypes.func.isRequired,
+		onCancel: PropTypes.func.isRequired,
 
-		selectedTab: React.PropTypes.number,
-		onTabSelect: React.PropTypes.func,
+		selectedTab: PropTypes.number,
+		onTabSelect: PropTypes.func,
 
-		selectedFeatureGroupsButtonTab: React.PropTypes.number,
-		onFeatureGroupsButtonTabSelect: React.PropTypes.func,
+		selectedFeatureGroupsButtonTab: PropTypes.number,
+		onFeatureGroupsButtonTabSelect: PropTypes.func,
 		featureGroupsList: DualListboxView.propTypes.availableList
 	};
 
@@ -151,7 +151,7 @@
 							data-test-id='general-tab'
 							title={i18n('General')}>
 								<fieldset disabled={isReadOnlyMode}>
-									<GeneralTabContent data={data} genericFieldInfo={genericFieldInfo} onDataChanged={onDataChanged}
+									<GeneralTabContent data={data} genericFieldInfo={genericFieldInfo} onDataChanged={onDataChanged} validateLTChoice={(value)=>this.validateLTChoice(value)}
 										   validateName={(value)=>this.validateName(value)}/>
 								</fieldset>
 						</Tab>
@@ -181,6 +181,12 @@
 		this.props.onSubmit({licenseAgreement, previousLicenseAgreement});
 	}
 
+	validateLTChoice(value) {
+		if (!value.choice) {
+			return {isValid: false, errorText: i18n('Field is required')};
+		}
+		return {isValid: true, errorText: ''};
+	}
 
 	validateName(value) {
 		const {data: {id}, LANames} = this.props;
diff --git a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditor.js b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditor.js
index 92c2550..72474ec 100644
--- a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditor.js
+++ b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditor.js
@@ -17,24 +17,22 @@
 import i18n from 'nfvo-utils/i18n/i18n.js';
 import LicenseAgreementActionHelper from './LicenseAgreementActionHelper.js';
 import LicenseAgreementListEditorView from './LicenseAgreementListEditorView.jsx';
-import VersionControllerUtils from 'nfvo-components/panel/versionController/VersionControllerUtils.js';
 import {actionTypes as globalMoadlActions}  from 'nfvo-components/modal/GlobalModalConstants.js';
 
 const mapStateToProps = ({licenseModel: {licenseAgreement, licenseModelEditor}}) => {
+
 	let {licenseAgreementList} = licenseAgreement;
 	let {data} = licenseAgreement.licenseAgreementEditor;
 	let {vendorName, version} = licenseModelEditor.data;
 
-	let isReadOnlyMode = VersionControllerUtils.isReadOnly(licenseModelEditor.data);
-
 	return {
 		vendorName,
 		version,
 		licenseAgreementList,
-		isReadOnlyMode,
 		isDisplayModal: Boolean(data),
 		isModalInEditMode: Boolean(data && data.id)
 	};
+
 };
 
 const mapActionsToProps = (dispatch, {licenseModelId}) => {
@@ -44,7 +42,7 @@
 		onDeleteLicenseAgreement: (licenseAgreement, version) => dispatch({
 			type: globalMoadlActions.GLOBAL_MODAL_WARNING,
 			data:{
-				msg: i18n(`Are you sure you want to delete "${licenseAgreement.name}"?`),
+				msg: i18n('Are you sure you want to delete "{name}"?', {name: licenseAgreement.name}),
 				confirmationButtonText: i18n('Delete'),
 				title: i18n('Delete'),
 				onConfirmed: ()=>LicenseAgreementActionHelper.deleteLicenseAgreement(dispatch, {licenseModelId, licenseAgreementId: licenseAgreement.id, version})
diff --git a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditorView.jsx b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditorView.jsx
index 6247723..ad3cdb0 100644
--- a/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditorView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditorView.jsx
@@ -14,6 +14,7 @@
  * permissions and limitations under the License.
  */
 import React from 'react';
+import PropTypes from 'prop-types';
 import i18n from 'nfvo-utils/i18n/i18n.js';
 import Modal from 'nfvo-components/modal/Modal.jsx';
 
@@ -24,15 +25,15 @@
 
 class LicenseAgreementListEditorView extends React.Component {
 	static propTypes = {
-		vendorName: React.PropTypes.string,
-		licenseModelId: React.PropTypes.string.isRequired,
-		licenseAgreementList: React.PropTypes.array,
-		isReadOnlyMode: React.PropTypes.bool.isRequired,
-		isDisplayModal: React.PropTypes.bool,
-		isModalInEditMode: React.PropTypes.bool,
-		onAddLicenseAgreementClick: React.PropTypes.func,
-		onEditLicenseAgreementClick: React.PropTypes.func,
-		onDeleteLicenseAgreement: React.PropTypes.func,
+		vendorName: PropTypes.string,
+		licenseModelId: PropTypes.string.isRequired,
+		licenseAgreementList: PropTypes.array,
+		isReadOnlyMode: PropTypes.bool.isRequired,
+		isDisplayModal: PropTypes.bool,
+		isModalInEditMode: PropTypes.bool,
+		onAddLicenseAgreementClick: PropTypes.func,
+		onEditLicenseAgreementClick: PropTypes.func,
+		onDeleteLicenseAgreement: PropTypes.func,
 	};
 
 	static defaultProps = {
@@ -49,7 +50,7 @@
 		const {localFilter} = this.state;
 
 		return (
-			<div className='license-agreement-list-editor'>
+			<div className='license-model-list-editor license-agreement-list-editor'>
 				<ListEditorView
 					title={i18n('License Agreements')}
 					plusButtonTitle={i18n('Add License Agreement')}