Support complex types in interface operation inputs
[sdc.git] / catalog-ui / src / app / models / properties-inputs / property-be-model.ts
index c46c8ad..267a2ad 100644 (file)
  * ============LICENSE_END=========================================================
  */
 
-import { PropertyInputDetail, SchemaPropertyGroupModel, SchemaProperty } from "app/models";
-import { PROPERTY_DATA, PROPERTY_TYPES } from 'app/utils';
+import {PROPERTY_DATA, PROPERTY_TYPES} from 'app/utils/constants';
+import {SchemaProperty, SchemaPropertyGroupModel} from '../schema-property';
+import {ToscaPresentationData} from '../tosca-presentation';
+import {PropertyInputDetail} from './property-input-detail';
+import {Metadata} from '../metadata';
+import {ToscaGetFunctionType} from "../tosca-get-function-type.enum";
+
 export enum DerivedPropertyType {
     SIMPLE,
     LIST,
     MAP,
     COMPLEX
 }
+export class PropertyPolicyDetail {
+    policyId: string;
+    propertyName: string;
+    constructor(propertyPolicy?: PropertyPolicyDetail) {
+        if(propertyPolicy) {
+            this.policyId = propertyPolicy.policyId;
+            this.propertyName = propertyPolicy.propertyName;
+        }
+    }
+}
 
 export class PropertyBEModel {
 
+    constraints: any[];
     defaultValue: string;
     definition: boolean;
     description: string;
     fromDerived: boolean;
-    getInputValues: Array<PropertyInputDetail>
+    getInputValues: PropertyInputDetail[];
+    getPolicyValues: PropertyPolicyDetail[];
     name: string;
+    origName: string;
     parentUniqueId: string;
     password: boolean;
     required: boolean;
     schema: SchemaPropertyGroupModel;
+    schemaType: string;
     type: string;
     uniqueId: string;
     value: string;
+    parentPropertyType: string;
+    subPropertyInputPath: string;
+    inputPath: string;
+    toscaPresentation: ToscaPresentationData;
+    metadata: Metadata;
+    toscaGetFunctionType: ToscaGetFunctionType;
 
     constructor(property?: PropertyBEModel) {
         if (property) {
+            this.constraints = property.constraints;
             this.defaultValue = property.defaultValue;
             this.description = property.description;
             this.fromDerived = property.fromDerived;
             this.name = property.name;
+            this.origName = property.origName;
             this.parentUniqueId = property.parentUniqueId;
             this.password = property.password;
             this.required = property.required;
             this.schema = property.schema;
+            this.schemaType = property.schemaType;
             this.type = property.type;
             this.uniqueId = property.uniqueId;
-            this.value = property.value ? property.value : property.defaultValue;
+            this.value = property.value;
             this.definition = property.definition;
             this.getInputValues = property.getInputValues;
+            this.parentPropertyType = property.parentPropertyType;
+            this.subPropertyInputPath = property.subPropertyInputPath;
+            this.toscaPresentation = property.toscaPresentation;
+            this.getPolicyValues = property.getPolicyValues;
+            this.inputPath = property.inputPath;
+            this.metadata = property.metadata;
+            this.toscaGetFunctionType = property.toscaGetFunctionType;
         }
 
         if (!this.schema || !this.schema.property) {
             this.schema = new SchemaPropertyGroupModel(new SchemaProperty());
-        } else { //forcing creating new object, so editing different one than the object in the table
+        } else { // forcing creating new object, so editing different one than the object in the table
             this.schema = new SchemaPropertyGroupModel(new SchemaProperty(this.schema.property));
         }
     }
 
-
-
     public toJSON = (): any => {
-        let temp = angular.copy(this);
-        temp.value = temp.value === "{}" || temp.value === "[]" ? undefined : temp.value;
-        temp.defaultValue = temp.defaultValue === "{}" || temp.defaultValue === "[]" ? undefined : temp.defaultValue;
+        const temp = angular.copy(this);
+        temp.value = temp.value === '{}' || temp.value === '[]' ? undefined : temp.value;
+        temp.defaultValue = temp.defaultValue === '{}' || temp.defaultValue === '[]' ? undefined : temp.defaultValue;
         return temp;
-    };
+    }
 
-    public getDerivedPropertyType = () => {
+    public getDerivedPropertyType = (): DerivedPropertyType => {
         if (PROPERTY_DATA.SIMPLE_TYPES.indexOf(this.type) > -1) {
             return DerivedPropertyType.SIMPLE;
-        } else if (this.type == PROPERTY_TYPES.LIST) {
+        }
+        if (this.type === PROPERTY_TYPES.LIST) {
             return DerivedPropertyType.LIST;
-        } else if (this.type == PROPERTY_TYPES.MAP) {
+        }
+        if (this.type === PROPERTY_TYPES.MAP) {
             return DerivedPropertyType.MAP;
-        } else {
-            return DerivedPropertyType.COMPLEX;
         }
+        return DerivedPropertyType.COMPLEX;
     }
 
-}
+    /**
+     * Parses default value to JSON.
+     */
+    public parseDefaultValueToJson(): any {
+        if (this.defaultValue == undefined) {
+            return undefined;
+        }
 
+        const propertyType: DerivedPropertyType = this.getDerivedPropertyType();
+        if (propertyType == DerivedPropertyType.SIMPLE) {
+            return this.parseDefaultSimpleValue();
+        }
+
+        try {
+            return JSON.parse(this.defaultValue);
+        } catch (e) {
+            console.error(`Could not parse the property of type '${this.type}' default value to JSON '${this.defaultValue}'`, e);
+        }
+
+        return undefined;
+    }
+
+    private parseDefaultSimpleValue() {
+        switch (this.type) {
+            case PROPERTY_TYPES.INTEGER:
+                try {
+                    return parseInt(this.defaultValue);
+                } catch (e) {
+                    console.error(`Could not parse the property of type '${this.type}' default value to int '${this.defaultValue}'`, e);
+                }
+                return undefined;
+            case PROPERTY_TYPES.FLOAT:
+                try {
+                    return parseFloat(this.defaultValue);
+                } catch (e) {
+                    console.error(`Could not parse the property of type '${this.type}' default value to float '${this.defaultValue}'`, e);
+                }
+                return undefined;
+            case PROPERTY_TYPES.BOOLEAN:
+                return this.defaultValue === 'true';
+            default:
+                return this.defaultValue;
+        }
+    }
+
+    /**
+     * Checks whether the property value is a tosca get function (e.g. get_input, get_property, get_attribute)
+     */
+    public isToscaGetFunction(): boolean {
+        return this.toscaGetFunctionType != null;
+    }
+}
 
-// EXTRAS FROM CONSTRUCTOR:
-//         this.source = property.source;
-//         this.valueUniqueUid = property.valueUniqueUid;
-//         this.path = property.path;
-//         this.rules = property.rules;
-//         this.resourceInstanceUniqueId = property.resourceInstanceUniqueId;
-//         this.readonly = property.readonly;
-//         this.simpleType = property.simpleType;
-//         this.componentInstanceId = property.componentInstanceId;
-//         this.parentValue = property.parentValue;
-//NEW PROPERTIES MAY NEED:
-// export class PropertyFEModel extends PropertyBEModel {
-//     componentInstanceId: string;
-//     isAlreadySelected: boolean;
-//     filterTerm: string;
-// }
-//FOR INPUTS, BE ALSO INCLUDES:
-//export class InputFEModel extends PropertyBEModel {
-//     hidden: boolean;
-//     label: string;
-//     immutable: boolean;
-// }