Allow multiple entry for map/list when tosca function is selected
[sdc.git] / catalog-ui / src / app / models / properties-inputs / derived-fe-property.ts
index 3985b98..9df2b2b 100644 (file)
@@ -46,22 +46,36 @@ export class DerivedFEProperty extends PropertyBEModel {
     mapKey: string;
     mapKeyError: string;
     mapInlist: boolean
+    inputName: string;
+    parentMapKey: string;
+    toscaPath: string[];
 
     constructor(property: PropertyBEModel, parentName?: string, createChildOfListOrMap?: boolean, key?:string, value?:any) {
         if (!createChildOfListOrMap) { //creating a standard derived prop
             super(property);
+            this.toscaPath = [];
             this.parentName = parentName ? parentName : null;
             this.propertiesName = (parentName) ? parentName + '#' + property.name : property.name;
             this.canBeDeclared = true; //defaults to true
+            if (property instanceof DerivedFEProperty) {
+                this.toscaPath = property.toscaPath != null ? property.toscaPath : [];
+            } else {
+                this.toscaPath = property.parentToscaPath != null ? property.parentToscaPath : property.parentToscaPath;
+            }
+            if (this.toscaPath.length == 0 && parentName != null && parentName.indexOf('#') != -1) {
+                let lastparent = parentName.split('#');
+                this.toscaPath.push(lastparent[lastparent.length - 1]);
+            }
+            this.toscaPath.push(property.name);
         } else { //creating a direct child of list or map (ie. Item that can be deleted, with UUID instead of name)
             super(null);
-            if(property.subPropertyToscaFunctions != null){
-                property.subPropertyToscaFunctions.forEach((item : SubPropertyToscaFunction) => {
-                    if(item.subPropertyPath[0] === key){
-                        this.toscaFunction = item.toscaFunction;
-                    }
-                });
+            let toscaPathCopy = null;
+            if (property instanceof DerivedFEProperty) {
+                toscaPathCopy = property.toscaPath != null ? property.toscaPath .toString() : null;
+            } else {
+                toscaPathCopy = property.parentToscaPath != null ? property.parentToscaPath.toString() : null;
             }
+            this.toscaPath = toscaPathCopy != null ? toscaPathCopy.split(",") : [];
             this.isChildOfListOrMap = true;
             this.canBeDeclared = false;
             this.name = UUID.UUID();
@@ -69,25 +83,49 @@ export class DerivedFEProperty extends PropertyBEModel {
             this.propertiesName = parentName + '#' + this.name;
             
             if (property.type == PROPERTY_TYPES.LIST) {
-                if (property.schemaType != PROPERTY_TYPES.MAP) {
-                    if(property.value != null) {
-                        const valueJson = JSON.parse(property.value);
+                let parentKey : string = null;
+                if (property instanceof DerivedFEProperty) {
+                    if (property.valueObj != '') {
+                        if (key != '') {
+                            let listIndex = Number(key);
+                            if (!isNaN(listIndex)) {
+                                this.toscaPath.push(key);
+                            } else {
+                               let newIndex = Object.keys(property.valueObj).findIndex(valueKey => (valueKey == key));
+                               this.toscaPath.push(newIndex.toString());
+                            }
+                        } else {
+                            let toscaIndex = Object.keys(property.valueObj).sort().reverse()[0];
+                            this.toscaPath.push((Number(toscaIndex) + 1).toString());
+                        }
+                    } else {
+                        this.toscaPath.push((property.valueObj.length).toString());
+                    }
+                } else {
+                    if (property instanceof PropertyFEModel && property.valueObj != '') {
                         if (key != '') {
-                            this.mapKey = key;
+                            parentKey = key;
                         }else{
-                            let indexNumber = Number(Object.keys(valueJson).sort().reverse()[0]) + 1;
-                            this.mapKey = indexNumber.toString();
+                            let toscaIndex = Object.keys(property.valueObj).sort().reverse()[0];
+                            parentKey = (Number(toscaIndex) + 1).toString();
+                        }
+                    } else {
+                        parentKey = "0";
+                        if (property instanceof PropertyFEModel) {
+                            parentKey = (property.flattenedChildren.length).toString();
                         }
-                    }else {
-                        this.mapKey = "0";
                     }
+                    this.toscaPath.push(parentKey);
+                }
+                if (property.schemaType != PROPERTY_TYPES.MAP) {
+                    this.mapKey = parentKey;
                 }
                 this.mapKeyError = null;
                 this.type = property.schema.property.type;
                 if (this.type == PROPERTY_TYPES.MAP){
                     this.mapInlist = true;
+                    this.parentMapKey = parentKey;
                 }
-
                 this.schema = new SchemaPropertyGroupModel(new SchemaProperty(property.schema.property));
             } else { //map
                 if (key) {
@@ -105,10 +143,23 @@ export class DerivedFEProperty extends PropertyBEModel {
                     schProp.simpleType = PROPERTY_TYPES.STRING;
                     this.schema = new SchemaPropertyGroupModel(schProp);
                     this.schemaType = PROPERTY_TYPES.STRING;
+                    if (property instanceof DerivedFEProperty) {
+                        this.parentMapKey = property.parentMapKey;
+                        if (value != null && typeof value == 'object') {
+                            this.toscaFunction = property.toscaFunction;
+                        }
+                    }
                 } else {
                     this.schema = new SchemaPropertyGroupModel(new SchemaProperty(property.schema.property));
                 }
-       
+                if (this.toscaPath != null) {
+                    let lastIndex = this.toscaPath[this.toscaPath.length - 1];
+                    if(this.mapKey != lastIndex){
+                        this.toscaPath.push(this.mapKey);
+                    }
+                } else {
+                    this.toscaPath.push(this.mapKey);
+                }
             }
             this.valueObj = (this.type == PROPERTY_TYPES.JSON && typeof value == 'object') ? JSON.stringify(value) : value;
             if (value != null) {
@@ -116,9 +167,17 @@ export class DerivedFEProperty extends PropertyBEModel {
             }
             this.updateValueObjOrig();
         }
-        // this.constraints = property ? property.constraints : null;
+        this.parentToscaPath = this.toscaPath;
+        if(property.subPropertyToscaFunctions != null){
+            property.subPropertyToscaFunctions.forEach((item : SubPropertyToscaFunction) => {
+                if(item.subPropertyPath.toString() === this.toscaPath.toString() && this.uniqueId == null){
+                    this.toscaFunction = item.toscaFunction;
+                }
+            });
+        }
         this.valueObjIsValid = true;
         this.derivedDataType = this.getDerivedPropertyType();
+        this.inputName = property.inputName;
     }
 
     public getActualMapKey() {