2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
22 * Created by obarda on 1/27/2016.
25 import * as _ from "lodash";
26 import {DataTypesService} from "app/services";
27 import { ValidationUtils } from "app/utils";
28 import { DataTypePropertyModel } from "app/models/data-type-properties";
29 import { DataTypesMap} from "app/models";
31 export interface IDataTypeFieldsStructureScope extends ng.IScope {
32 parentFormObj:ng.IFormController;
33 dataTypeProperties:Array<DataTypePropertyModel>;
36 propertyNameValidationPattern:RegExp;
37 fieldsPrefixName:string;
39 currentTypeDefaultValue:any;
41 expandByDefault:boolean;
44 dataTypesService:DataTypesService;
47 expandAndCollapse():void;
48 getValidationPattern(type:string):RegExp;
49 validateIntRange(value:string):boolean;
50 onValueChange(propertyName:string, type:string):void
51 inputOnValueChange(property:any):void;
55 export class DataTypeFieldsStructureDirective implements ng.IDirective {
59 constructor(private DataTypesService:DataTypesService,
60 private PropertyNameValidationPattern:RegExp,
61 private ValidationUtils:ValidationUtils) {
64 constraints: string[];
70 fieldsPrefixName: '=',
79 template = ():string => {
80 return require('./data-type-fields-structure.html');
82 //public types=Utils.Constants.PROPERTY_DATA.TYPES;
84 //get data type properties array and return object with the properties and their default value
85 //(for example: get: [{name:"prop1",defaultValue:1 ...},{name:"prop2", defaultValue:"bla bla" ...}]
86 // return: {prop1: 1, prop2: "bla bla"}
87 private getDefaultValue = (dataTypeProperties:Array<DataTypePropertyModel>):any => {
88 let defaultValue = {};
89 for (let i = 0; i < dataTypeProperties.length; i++) {
90 if (dataTypeProperties[i].type != 'string') {
91 if (!angular.isUndefined(dataTypeProperties[i].defaultValue)) {
92 defaultValue[dataTypeProperties[i].name] = JSON.parse(dataTypeProperties[i].defaultValue);
95 defaultValue[dataTypeProperties[i].name] = dataTypeProperties[i].defaultValue;
102 private initDataOnScope = (scope:any, $attr:any):void => {
103 scope.dataTypesService = this.DataTypesService;
104 scope.dataTypeProperties = this.getDataTypeProperties(scope.typeName, scope.types);
105 if ($attr.defaultValue) {
106 scope.currentTypeDefaultValue = JSON.parse($attr.defaultValue);
108 scope.currentTypeDefaultValue = this.getDefaultValue(scope.dataTypeProperties);
111 if (!scope.valueObjRef) {
112 scope.valueObjRef = {};
115 _.forEach(scope.currentTypeDefaultValue, (value, key)=> {
116 if (angular.isUndefined(scope.valueObjRef[key])) {
117 if (typeof scope.currentTypeDefaultValue[key] == 'object') {
118 angular.copy(scope.currentTypeDefaultValue[key], scope.valueObjRef[key]);
120 scope.valueObjRef[key] = scope.currentTypeDefaultValue[key];
126 private getDataTypeProperties = (dataTypeName:string, typesInModel:DataTypesMap):Array<DataTypePropertyModel> => {
127 let properties = typesInModel[dataTypeName].properties || [];
128 if (typesInModel[dataTypeName].derivedFromName != "tosca.datatypes.Root") {
129 properties = this.getDataTypeProperties(typesInModel[dataTypeName].derivedFromName, typesInModel).concat(properties);
134 private rerender = (scope:any):void => {
135 scope.expanded = false;
136 scope.expand = false;
137 if (scope.expandByDefault) {
138 scope.expandAndCollapse();
142 link = (scope:IDataTypeFieldsStructureScope, element:any, $attr:any) => {
143 scope.propertyNameValidationPattern = this.PropertyNameValidationPattern;
145 scope.$watchCollection('[typeName,fieldsPrefixName]', (newData:any):void => {
146 this.rerender(scope);
150 scope.expandAndCollapse = ():void => {
151 if (!scope.expanded) {
152 this.initDataOnScope(scope, $attr);
153 scope.expanded = true;
155 scope.expand = !scope.expand;
158 scope.getValidationPattern = (type:string):RegExp => {
159 return this.ValidationUtils.getValidationPattern(type);
162 scope.validateIntRange = (value:string):boolean => {
163 return !value || this.ValidationUtils.validateIntRange(value);
166 scope.onValueChange = (propertyName:string, type:string,):void => {
167 scope.valueObjRef[propertyName] = !angular.isUndefined(scope.valueObjRef[propertyName]) ? scope.valueObjRef[propertyName] : scope.currentTypeDefaultValue[propertyName];
168 if (scope.valueObjRef[propertyName] && type != 'string') {
169 scope.valueObjRef[propertyName] = JSON.parse(scope.valueObjRef[propertyName]);
173 scope.inputOnValueChange = (property:any) => {
174 if (property.constraints){
175 // this.constraints = property.constraints[0].validValues;
178 let value = !scope.parentFormObj[scope.fieldsPrefixName + property.name].$error.pattern
179 && ('integer' == property.type && scope.parentFormObj[scope.fieldsPrefixName + property.name].$setValidity('pattern', scope.validateIntRange(scope.valueObjRef[property.name]))
180 || scope.onValueChange(property.name, (property.simpleType || property.type)));
185 public static factory = (DataTypesService:DataTypesService,
186 PropertyNameValidationPattern:RegExp,
187 ValidationUtils:ValidationUtils)=> {
188 return new DataTypeFieldsStructureDirective(DataTypesService, PropertyNameValidationPattern, ValidationUtils);
192 DataTypeFieldsStructureDirective.factory.$inject = ['Sdc.Services.DataTypesService', 'PropertyNameValidationPattern', 'ValidationUtils'];