/*-
* ============LICENSE_START=======================================================
* SDC
* ================================================================================
* 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.
* ============LICENSE_END=========================================================
*/
///
module Sdc.ViewModels {
'use strict';
export interface IEditPropertyModel {
property: Models.PropertyModel;
types: Array;
simpleTypes: Array;
sources: Array;
}
interface IPropertyFormViewModelScope extends ng.IScope {
forms:any;
editForm:ng.IFormController;
footerButtons: Array;
isNew: boolean;
isLoading: boolean;
isService: boolean;
validationPattern: RegExp;
propertyNameValidationPattern: RegExp;
commentValidationPattern: RegExp;
editPropertyModel: IEditPropertyModel;
modalInstanceProperty:ng.ui.bootstrap.IModalServiceInstance;
currentPropertyIndex:number;
isLastProperty:boolean;
myValue:any;
nonPrimitiveTypes:Array;
dataTypes:Models.DataTypesMap;
isTypeDataType:boolean;
maxLength:number;
save(doNotCloseModal?:boolean): void;
getValidationPattern(type:string): RegExp;
validateIntRange(value:string):boolean;
close(): void;
onValueChange(): void;
onSchemaTypeChange():void;
onTypeChange(resetSchema:boolean): void;
isPropertyValueOwner():boolean;
showSchema(): boolean;
delete(property:Models.PropertyModel): void;
getPrev(): void;
getNext(): void;
isSimpleType(typeName:string):boolean;
getDefaultValue():any;
}
export class PropertyFormViewModel {
static '$inject' = [
'$scope',
'Sdc.Services.DataTypesService',
'$modalInstance',
'property',
'ValidationPattern',
'PropertyNameValidationPattern',
'CommentValidationPattern',
'ValidationUtils',
'component',
'$filter',
'ModalsHandler',
'filteredProperties',
'$timeout'
];
private formState: Sdc.Utils.Constants.FormState;
constructor(private $scope:IPropertyFormViewModelScope,
private DataTypesService:Sdc.Services.DataTypesService,
private $modalInstance:ng.ui.bootstrap.IModalServiceInstance,
private property: Models.PropertyModel,
private ValidationPattern:RegExp,
private PropertyNameValidationPattern: RegExp,
private CommentValidationPattern:RegExp,
private ValidationUtils:Sdc.Utils.ValidationUtils,
private component: Models.Components.Component,
private $filter:ng.IFilterService,
private ModalsHandler:Utils.ModalsHandler,
private filteredProperties: Array,
private $timeout: ng.ITimeoutService) {
this.formState = angular.isDefined(property.name) ? Utils.Constants.FormState.UPDATE : Utils.Constants.FormState.CREATE;
this.initScope();
}
private initResource = ():void => {
this.$scope.editPropertyModel.property = new Sdc.Models.PropertyModel(this.property);
this.$scope.editPropertyModel.property.type = this.property.type? this.property.type: null;
this.setMaxLength();
// if (this.$scope.editPropertyModel.types.indexOf(this.property.type) === -1 && !this.$scope.isNew) {
// this.property.type = "string";
// }
};
private initEditPropertyModel = ():void => {
this.$scope.editPropertyModel = {
property: null,
types: Utils.Constants.PROPERTY_DATA.TYPES,
simpleTypes: Utils.Constants.PROPERTY_DATA.SIMPLE_TYPES,
sources: Utils.Constants.PROPERTY_DATA.SOURCES
};
this.initResource();
};
private initForNotSimpleType = ():void => {
let property = this.$scope.editPropertyModel.property;
this.$scope.isTypeDataType=this.DataTypesService.isDataTypeForPropertyType(this.$scope.editPropertyModel.property,this.$scope.dataTypes);
if(property.type && this.$scope.editPropertyModel.simpleTypes.indexOf(property.type)==-1){
if(!(property.value||property.defaultValue)) {
switch (property.type) {
case Utils.Constants.PROPERTY_TYPES.MAP:
this.$scope.myValue = {'':null};
break;
case Utils.Constants.PROPERTY_TYPES.LIST:
this.$scope.myValue = [];
break;
default:
this.$scope.myValue = {};
}
}else{
this.$scope.myValue = JSON.parse(property.value||property.defaultValue);
}
}
};
private setMaxLength = ():void => {
switch (this.$scope.editPropertyModel.property.type) {
case Utils.Constants.PROPERTY_TYPES.MAP:
case Utils.Constants.PROPERTY_TYPES.LIST:
this.$scope.maxLength = this.$scope.editPropertyModel.property.schema.property.type == Utils.Constants.PROPERTY_TYPES.JSON?
Utils.Constants.PROPERTY_VALUE_CONSTRAINTS.JSON_MAX_LENGTH:
Utils.Constants.PROPERTY_VALUE_CONSTRAINTS.MAX_LENGTH;
break;
case Utils.Constants.PROPERTY_TYPES.JSON:
this.$scope.maxLength = Utils.Constants.PROPERTY_VALUE_CONSTRAINTS.JSON_MAX_LENGTH;
break;
default:
this.$scope.maxLength = Utils.Constants.PROPERTY_VALUE_CONSTRAINTS.MAX_LENGTH;
}
};
private initScope = ():void => {
//scope properties
this.$scope.forms = {};
this.$scope.validationPattern = this.ValidationPattern;
this.$scope.propertyNameValidationPattern = this.PropertyNameValidationPattern;
this.$scope.commentValidationPattern = this.CommentValidationPattern;
this.$scope.isLoading = false;
this.$scope.isNew = (this.formState === Utils.Constants.FormState.CREATE);
this.$scope.isService = this.component.isService();
this.$scope.modalInstanceProperty = this.$modalInstance;
this.$scope.currentPropertyIndex = _.findIndex(this.filteredProperties, i=> i.name == this.property.name );
this.$scope.isLastProperty= this.$scope.currentPropertyIndex==(this.filteredProperties.length-1);
this.initEditPropertyModel();
this.DataTypesService.getAllDataTypes().then((response:any) => {
this.$scope.dataTypes = response;
delete response['tosca.datatypes.Root'];
this.$scope.nonPrimitiveTypes =_.filter(Object.keys(response),(type:string)=>{
return this.$scope.editPropertyModel.types.indexOf(type)==-1;
});
this.initForNotSimpleType();
}, (err)=> {});
//scope methods
this.$scope.save = (doNotCloseModal?:boolean):void => {
let property:Models.PropertyModel = this.$scope.editPropertyModel.property;
this.$scope.editPropertyModel.property.description = this.ValidationUtils.stripAndSanitize(this.$scope.editPropertyModel.property.description);
////if read only - just closes the modal
if (this.$scope.editPropertyModel.property.readonly && !this.$scope.isPropertyValueOwner()) {
this.$modalInstance.close();
return;
}
this.$scope.isLoading = true;
let onPropertyFaild = (response):void => {
console.info('onFaild', response);
this.$scope.isLoading = false;
};
let onPropertySuccess = (propertyFromBE:Models.PropertyModel):void => {
console.info('onPropertyResourceSuccess : ', propertyFromBE);
this.$scope.isLoading = false;
if (!doNotCloseModal) {
this.$modalInstance.close();
} else {
this.$scope.forms.editForm.$setPristine();
this.$scope.editPropertyModel.property = new Models.PropertyModel();
}
};
//in case we have uniqueId we call update method
if (this.$scope.isPropertyValueOwner()) {
if(!this.$scope.editPropertyModel.property.simpleType && !this.$scope.isSimpleType(property.type)){
let myValueString:string = JSON.stringify(this.$scope.myValue);
property.value = myValueString;
}
this.component.updateInstanceProperty(property).then(onPropertySuccess, onPropertyFaild);
} else {
if(!this.$scope.editPropertyModel.property.simpleType && !this.$scope.isSimpleType(property.type)){
let myValueString:string = JSON.stringify(this.$scope.myValue);
property.defaultValue = myValueString;
}else{
this.$scope.editPropertyModel.property.defaultValue = this.$scope.editPropertyModel.property.value;
}
this.component.addOrUpdateProperty(property).then(onPropertySuccess, onPropertyFaild);
}
};
this.$scope.isPropertyValueOwner = ():boolean=> {
return this.component.isService() || !!this.component.selectedInstance;
};
this.$scope.getPrev = ():void=> {
this.property = this.filteredProperties[--this.$scope.currentPropertyIndex];
this.initResource();
this.initForNotSimpleType();
this.$scope.isLastProperty=false;
};
this.$scope.getNext = ():void=> {
this.property = this.filteredProperties[++this.$scope.currentPropertyIndex];
this.initResource();
this.initForNotSimpleType();
this.$scope.isLastProperty= this.$scope.currentPropertyIndex==(this.filteredProperties.length-1);
};
this.$scope.isSimpleType = (typeName:string):boolean=>{
return typeName && this.$scope.editPropertyModel.simpleTypes.indexOf(typeName)!=-1;
};
this.$scope.showSchema = () :boolean => {
return [Utils.Constants.PROPERTY_TYPES.LIST, Utils.Constants.PROPERTY_TYPES.MAP].indexOf(this.$scope.editPropertyModel.property.type) > -1;
};
this.$scope.getValidationPattern = (type:string):RegExp => {
return this.ValidationUtils.getValidationPattern(type);
};
this.$scope.validateIntRange = (value:string):boolean => {
return !value || this.ValidationUtils.validateIntRange(value);
};
this.$scope.close = ():void => {
this.$modalInstance.close();
};
// put default value when instance value is empty
this.$scope.onValueChange = ():void => {
if (!this.$scope.editPropertyModel.property.value) {
if (this.$scope.isPropertyValueOwner()) {
this.$scope.editPropertyModel.property.value = this.$scope.editPropertyModel.property.defaultValue;
}
}
};
// Add the done button at the footer.
this.$scope.footerButtons = [
{'name': 'Save', 'css': 'blue', 'callback': this.$scope.save },
{'name': 'Cancel', 'css': 'grey', 'callback':this.$scope.close }
];
this.$scope.$watch("forms.editForm.$invalid", (newVal, oldVal) => {
this.$scope.footerButtons[0].disabled = this.$scope.forms.editForm.$invalid;
});
this.$scope.getDefaultValue = ():any => {
return this.$scope.isPropertyValueOwner() ? this.$scope.editPropertyModel.property.defaultValue : null;
};
this.$scope.onTypeChange = ():void => {
this.$scope.editPropertyModel.property.value = '';
this.$scope.editPropertyModel.property.defaultValue = '';
this.setMaxLength();
this.initForNotSimpleType();
};
this.$scope.onSchemaTypeChange = ():void => {
if(this.$scope.editPropertyModel.property.type==Utils.Constants.PROPERTY_TYPES.MAP){
this.$scope.myValue={'':null};
}else if(this.$scope.editPropertyModel.property.type==Utils.Constants.PROPERTY_TYPES.LIST){
this.$scope.myValue=[];
}
this.setMaxLength();
};
this.$scope.delete = (property:Models.PropertyModel):void => {
let onOk = ():void => {
this.component.deleteProperty(property.uniqueId).then(
this.$scope.close
);
};
let title:string = this.$filter('translate')("PROPERTY_VIEW_DELETE_MODAL_TITLE");
let message:string = this.$filter('translate')("PROPERTY_VIEW_DELETE_MODAL_TEXT", "{'name': '" + property.name + "'}");
this.ModalsHandler.openConfirmationModal(title, message, false).then(onOk);
};
}
}
}