Setting Tosca Function on top of unsaved value causes problems
[sdc.git] / catalog-ui / src / app / ng2 / components / logic / properties-table / dynamic-property / dynamic-property.component.ts
index edcbd43..e53cf01 100644 (file)
@@ -23,7 +23,7 @@ import {Component, Input, Output, EventEmitter, ViewChild, ComponentRef} from "@
 import { PropertyFEModel, DerivedFEProperty, DerivedPropertyType } from "app/models";
 import { PROPERTY_TYPES } from 'app/utils';
 import { DataTypeService } from "../../../../services/data-type.service";
-import { trigger, state, style, transition, animate } from '@angular/animations';
+import { trigger, style, transition, animate } from '@angular/animations';
 import {PropertiesUtils} from "../../../../pages/properties-assignment/services/properties.utils";
 import {IUiElementChangeEvent} from "../../../ui/form-components/ui-element-base.component";
 import {DynamicElementComponent} from "../../../ui/dynamic-element/dynamic-element.component";
@@ -44,6 +44,7 @@ export class DynamicPropertyComponent {
     nestedLevel: number;
     propertyTestsId: string;
     constraints:string[];
+    checkboxDisabled: boolean = false;
 
     @Input() canBeDeclared: boolean;
     @Input() property: PropertyFEModel | DerivedFEProperty;
@@ -148,12 +149,37 @@ export class DynamicPropertyComponent {
 
     onElementChanged = (event: IUiElementChangeEvent) => {
         this.property.updateValueObj(event.value, event.isValid);
+        if (this.property.hasValueObjChanged()) {
+            this.checkboxDisabled = true;
+        }
+        if (event.value === '' || event.value === null || event.value === undefined) {
+            this.checkboxDisabled = false;
+        }
         this.emitter.emit();
     };
 
     createNewChildProperty = (): void => {
-       
-        let newProps: Array<DerivedFEProperty> = this.propertiesUtils.createListOrMapChildren(this.property, "", null);
+
+        let mapKeyValue = this.property instanceof DerivedFEProperty ? this.property.mapKey : "";
+        let parentToscaFunction = null;
+        if (this.property.type == PROPERTY_TYPES.LIST && mapKeyValue === "") {
+            if (this.property.value != null) {
+                const valueJson = JSON.parse(this.property.value);
+                if (this.property instanceof PropertyFEModel && this.property.expandedChildPropertyId != null) {
+                    let indexNumber = Number(Object.keys(valueJson).sort().reverse()[0]) + 1;
+                    mapKeyValue = indexNumber.toString();
+                }else{
+                    mapKeyValue = Object.keys(valueJson).sort().reverse()[0];
+                }
+            }else {
+                mapKeyValue = "0";
+            }
+        }
+        if (this.property.type == PROPERTY_TYPES.MAP && this.property instanceof DerivedFEProperty && this.property.mapInlist) {
+            parentToscaFunction = this.property.toscaFunction;
+            this.property.toscaFunction = null;
+        }
+        let newProps: Array<DerivedFEProperty> = this.propertiesUtils.createListOrMapChildren(this.property, mapKeyValue, null);
 
         this.propertiesUtils.assignFlattenedChildrenValues(this.property.valueObj, [newProps[0]], this.property.propertiesName);
         if (this.property instanceof PropertyFEModel) {
@@ -161,6 +187,7 @@ export class DynamicPropertyComponent {
         } else {
             this.addChildPropsToParent.emit(newProps);
         }
+        this.property.toscaFunction = parentToscaFunction;
     }
 
     addChildProps = (newProps: Array<DerivedFEProperty>, childPropName: string) => {
@@ -205,9 +232,20 @@ export class DynamicPropertyComponent {
 
     deleteListOrMapItem = (item: DerivedFEProperty) => {
         if (this.property instanceof PropertyFEModel) {
+            const childMapKey = item.mapKey;
             this.removeValueFromParent(item);
             this.property.flattenedChildren.splice(this.property.getIndexOfChild(item.propertiesName), this.property.getCountOfChildren(item.propertiesName));
             this.expandChildById(item.propertiesName);
+            if (this.property.type == PROPERTY_TYPES.LIST && this.property.schemaType == PROPERTY_TYPES.MAP && childMapKey != null) {
+                let valueObject = JSON.parse(this.property.value);
+                let innerObject = valueObject[item.parentMapKey];
+                delete innerObject[childMapKey];
+                this.property.valueObj = valueObject;
+                this.property.value = JSON.stringify(valueObject);
+                this.property.flattenedChildren[0].valueObj = valueObject;
+                this.property.flattenedChildren[0].value = JSON.stringify(valueObject);
+                this.property.flattenedChildren[0].valueObjIsChanged = true;
+            }
         }
     }
 
@@ -218,12 +256,19 @@ export class DynamicPropertyComponent {
             if (!itemParent) {
                 return;
             }
-            const oldKey = item.getActualMapKey();
+            let oldKey = item.getActualMapKey();
+            let keyIndex : number = 0;
+                if(item.parentMapKey != null && oldKey != null) {
+                    keyIndex = 1;
+                }
+                if(item.parentMapKey != null && oldKey == null) {
+                    oldKey = item.parentMapKey;
+                }
             if (this.property.subPropertyToscaFunctions !== null) {
                 let tempSubToscaFunction: SubPropertyToscaFunction[] = [];
-                this.property.subPropertyToscaFunctions.forEach((item : SubPropertyToscaFunction, index) => {
-                    if(item.subPropertyPath[0] != oldKey){
-                        tempSubToscaFunction.push(item);
+                this.property.subPropertyToscaFunctions.forEach((subToscaItem : SubPropertyToscaFunction) => {
+                    if(subToscaItem.subPropertyPath[keyIndex] != oldKey){
+                        tempSubToscaFunction.push(subToscaItem);
                     }
                 });
                 this.property.subPropertyToscaFunctions = tempSubToscaFunction;
@@ -255,6 +300,11 @@ export class DynamicPropertyComponent {
         if (this.property instanceof PropertyFEModel) {
             let oldKey = childProp.getActualMapKey();
             this.property.childPropMapKeyUpdated(childProp, newMapKey);
+            this.property.flattenedChildren.forEach(tempDervObj => {
+                if (childProp.propertiesName === tempDervObj.parentName) {
+                    tempDervObj.mapKey = newMapKey;
+                }
+            });
             if (this.property.subPropertyToscaFunctions != null) {
                 this.property.subPropertyToscaFunctions.forEach((item : SubPropertyToscaFunction) => {
                     if(item.subPropertyPath[0] === oldKey){
@@ -267,7 +317,7 @@ export class DynamicPropertyComponent {
     }
 
     preventInsertItem = (property:DerivedFEProperty):boolean => {
-        if(property.type == PROPERTY_TYPES.MAP && Object.keys(property.valueObj).indexOf('') > -1 ){
+        if(property.type == PROPERTY_TYPES.MAP && property.valueObj != null && Object.keys(property.valueObj).indexOf('') > -1 ){
             return true;
         }
         return false;