Bug fix on tosca function impact changes
[sdc.git] / catalog-ui / src / app / directives / property-types / data-type-fields-structure / data-type-fields-structure.ts
index 2506dbe..30c7b06 100644 (file)
+/*-
+ * ============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=========================================================
+ */
+
 /**
  * Created by obarda on 1/27/2016.
  */
 'use strict';
-import {DataTypesService} from "app/services";
-import { ValidationUtils } from "app/utils";
-import { DataTypePropertyModel } from "app/models/data-type-properties";
-import { DataTypesMap} from "app/models";
+import { DataTypesMap, PropertyModel } from 'app/models';
+import { DataTypePropertyModel } from 'app/models/data-type-properties';
+import { DataTypesService } from 'app/services';
+import { ValidationUtils } from 'app/utils';
+import {InstanceFeDetails} from "app/models/instance-fe-details";
+import * as _ from 'lodash';
 
 export interface IDataTypeFieldsStructureScope extends ng.IScope {
-    parentFormObj:ng.IFormController;
-    dataTypeProperties:Array<DataTypePropertyModel>;
-    typeName:string;
-    valueObjRef:any;
-    propertyNameValidationPattern:RegExp;
-    fieldsPrefixName:string;
-    readOnly:boolean;
-    currentTypeDefaultValue:any;
-    types:DataTypesMap;
-    expandByDefault:boolean;
-    expand:boolean;
-    expanded:boolean;
-    dataTypesService:DataTypesService;
-
-    expandAndCollapse():void;
-    getValidationPattern(type:string):RegExp;
-    validateIntRange(value:string):boolean;
-    onValueChange(propertyName:string, type:string):void
-    inputOnValueChange(property:any):void;
+    parentFormObj: ng.IFormController;
+    dataTypeProperties: DataTypePropertyModel[];
+    parentProperty:PropertyModel;
+    componentInstanceMap: Map<string, InstanceFeDetails>;
+    typeName: string;
+    valueObjRef: any;
+    propertyNameValidationPattern: RegExp;
+    fieldsPrefixName: string;
+    readOnly: boolean;
+    currentTypeDefaultValue: any;
+    types: DataTypesMap;
+    expandByDefault: boolean;
+    expand: boolean;
+    expanded: boolean;
+    dataTypesService: DataTypesService;
+    constraints: string[];
+    isService:boolean;
+
+    expandAndCollapse(): void;
+    getValidationPattern(type: string): RegExp;
+    validateIntRange(value: string): boolean;
+    onValueChange(propertyName: string, type: string): void;
+    inputOnValueChange(property: any): void;
 }
 
-
 export class DataTypeFieldsStructureDirective implements ng.IDirective {
 
-    constructor(private DataTypesService:DataTypesService,
-                private PropertyNameValidationPattern:RegExp,
-                private ValidationUtils:ValidationUtils) {
-    }
+    constraints: string[];
 
     scope = {
         valueObjRef: '=',
         typeName: '=',
+        componentInstanceMap: '=',
+        parentProperty: '=',
         parentFormObj: '=',
         fieldsPrefixName: '=',
         readOnly: '=',
         defaultValue: '@',
-        //     types: '=',
-        expandByDefault: '='
+        types: '=',
+        expandByDefault: '=',
+        isService: '='
     };
 
     restrict = 'E';
     replace = true;
-    template = ():string => {
+
+    constructor(private DataTypesService: DataTypesService,
+                private PropertyNameValidationPattern: RegExp,
+                private ValidationUtils: ValidationUtils) {
+    }
+
+    public static factory = (DataTypesService: DataTypesService,
+                             PropertyNameValidationPattern: RegExp,
+                             ValidationUtils: ValidationUtils) => {
+        return new DataTypeFieldsStructureDirective(DataTypesService, PropertyNameValidationPattern, ValidationUtils);
+    }
+    template = (): string => {
         return require('./data-type-fields-structure.html');
-    };
-    //public types=Utils.Constants.PROPERTY_DATA.TYPES;
+    }
+
+    link = (scope: IDataTypeFieldsStructureScope, element: any, $attr: any) => {
+        scope.propertyNameValidationPattern = this.PropertyNameValidationPattern;
+
+        scope.$watchCollection('[typeName,fieldsPrefixName]', (newData: any): void => {
+            this.rerender(scope);
+        });
+
+        scope.expandAndCollapse = (): void => {
+            if (!scope.expanded) {
+                this.initDataOnScope(scope, $attr);
+                scope.expanded = true;
+            }
+            scope.expand = !scope.expand;
+        };
+
+        scope.getValidationPattern = (type: string): RegExp => {
+            return this.ValidationUtils.getValidationPattern(type);
+        };
+
+        scope.validateIntRange = (value: string): boolean => {
+            return !value || this.ValidationUtils.validateIntRange(value);
+        };
+
+        scope.onValueChange = (propertyName: string, type: string, ): void => {
+            scope.valueObjRef[propertyName] = !angular.isUndefined(scope.valueObjRef[propertyName]) ? scope.valueObjRef[propertyName] : scope.currentTypeDefaultValue[propertyName];
+            if (scope.valueObjRef[propertyName] && type != 'string') {
+                scope.valueObjRef[propertyName] = JSON.parse(scope.valueObjRef[propertyName]);
+            }
+        };
+
+        scope.inputOnValueChange = (property: any) => {
+            if (property.constraints) {
+                // this.constraints = property.constraints[0].validValues;
+            }
 
-    //get data type properties array and return object with the properties and their default value
-    //(for example: get: [{name:"prop1",defaultValue:1 ...},{name:"prop2", defaultValue:"bla bla" ...}]
+            const value = !scope.parentFormObj[scope.fieldsPrefixName + property.name].$error.pattern
+                && ('integer' == property.type && scope.parentFormObj[scope.fieldsPrefixName + property.name].$setValidity('pattern', scope.validateIntRange(scope.valueObjRef[property.name]))
+                || scope.onValueChange(property.name, (property.simpleType || property.type)));
+            return value;
+        };
+    }
+    // public types=Utils.Constants.PROPERTY_DATA.TYPES;
+
+    // get data type properties array and return object with the properties and their default value
+    // (for example: get: [{name:"prop1",defaultValue:1 ...},{name:"prop2", defaultValue:"bla bla" ...}]
     //              return: {prop1: 1, prop2: "bla bla"}
-    private getDefaultValue = (dataTypeProperties:Array<DataTypePropertyModel>):any => {
-        let defaultValue = {};
-        for (let i = 0; i < dataTypeProperties.length; i++) {
-            if (dataTypeProperties[i].type != 'string') {
-                if (!angular.isUndefined(dataTypeProperties[i].defaultValue)) {
-                    defaultValue[dataTypeProperties[i].name] = JSON.parse(dataTypeProperties[i].defaultValue);
+    private getDefaultValue = (dataTypeProperties: DataTypePropertyModel[]): any => {
+        const defaultValue = {};
+        for (const element of dataTypeProperties) {
+            if (element.type != 'string') {
+                if (!angular.isUndefined(element.defaultValue)) {
+                    defaultValue[element.name] = JSON.parse(element.defaultValue);
                 }
             } else {
-                defaultValue[dataTypeProperties[i].name] = dataTypeProperties[i].defaultValue;
+                defaultValue[element.name] = element.defaultValue;
             }
         }
         return defaultValue;
-    };
+    }
 
-    private initDataOnScope = (scope:any, $attr:any):void => {
+    private initDataOnScope = (scope: any, $attr: any): void => {
         scope.dataTypesService = this.DataTypesService;
-        scope.dataTypeProperties = this.DataTypesService.getFirsLevelOfDataTypeProperties(scope.typeName);
+        scope.dataTypeProperties = this.getDataTypeProperties(scope.typeName, scope.types);
         if ($attr.defaultValue) {
             scope.currentTypeDefaultValue = JSON.parse($attr.defaultValue);
         } else {
@@ -85,7 +163,7 @@ export class DataTypeFieldsStructureDirective implements ng.IDirective {
             scope.valueObjRef = {};
         }
 
-        _.forEach(scope.currentTypeDefaultValue, (value, key)=> {
+        _.forEach(scope.currentTypeDefaultValue, (value, key) => {
             if (angular.isUndefined(scope.valueObjRef[key])) {
                 if (typeof scope.currentTypeDefaultValue[key] == 'object') {
                     angular.copy(scope.currentTypeDefaultValue[key], scope.valueObjRef[key]);
@@ -94,61 +172,23 @@ export class DataTypeFieldsStructureDirective implements ng.IDirective {
                 }
             }
         });
-    };
+    }
+
+    private getDataTypeProperties = (dataTypeName: string, typesInModel: DataTypesMap): DataTypePropertyModel[] => {
+        let properties = typesInModel[dataTypeName].properties || [];
+        if (typesInModel[dataTypeName].derivedFromName != 'tosca.datatypes.Root') {
+            properties = this.getDataTypeProperties(typesInModel[dataTypeName].derivedFromName, typesInModel).concat(properties);
+        }
+        return properties;
+    }
 
-    private rerender = (scope:any):void => {
+    private rerender = (scope: any): void => {
         scope.expanded = false;
         scope.expand = false;
         if (scope.expandByDefault) {
             scope.expandAndCollapse();
         }
-    };
-
-    link = (scope:IDataTypeFieldsStructureScope, element:any, $attr:any) => {
-        scope.propertyNameValidationPattern = this.PropertyNameValidationPattern;
-
-        scope.$watchCollection('[typeName,fieldsPrefixName]', (newData:any):void => {
-            this.rerender(scope);
-        });
-
-
-        scope.expandAndCollapse = ():void => {
-            if (!scope.expanded) {
-                this.initDataOnScope(scope, $attr);
-                scope.expanded = true;
-            }
-            scope.expand = !scope.expand;
-        };
-
-        scope.getValidationPattern = (type:string):RegExp => {
-            return this.ValidationUtils.getValidationPattern(type);
-        };
-
-        scope.validateIntRange = (value:string):boolean => {
-            return !value || this.ValidationUtils.validateIntRange(value);
-        };
-
-        scope.onValueChange = (propertyName:string, type:string):void => {
-            scope.valueObjRef[propertyName] = !angular.isUndefined(scope.valueObjRef[propertyName]) ? scope.valueObjRef[propertyName] : scope.currentTypeDefaultValue[propertyName];
-            if (scope.valueObjRef[propertyName] && type != 'string') {
-                scope.valueObjRef[propertyName] = JSON.parse(scope.valueObjRef[propertyName]);
-            }
-        };
-
-        scope.inputOnValueChange = (property:any) => {
-
-            let value = !scope.parentFormObj[scope.fieldsPrefixName + property.name].$error.pattern
-                && ('integer' == property.type && scope.parentFormObj[scope.fieldsPrefixName + property.name].$setValidity('pattern', scope.validateIntRange(scope.valueObjRef[property.name]))
-                || scope.onValueChange(property.name, (property.simpleType || property.type)));
-            return value;
-        }
-    };
-
-    public static factory = (DataTypesService:DataTypesService,
-                             PropertyNameValidationPattern:RegExp,
-                             ValidationUtils:ValidationUtils)=> {
-        return new DataTypeFieldsStructureDirective(DataTypesService, PropertyNameValidationPattern, ValidationUtils);
-    };
+    }
 }
 
 DataTypeFieldsStructureDirective.factory.$inject = ['Sdc.Services.DataTypesService', 'PropertyNameValidationPattern', 'ValidationUtils'];