Fix 'Unable to add metadata on inputs'-bug
[sdc.git] / catalog-ui / src / app / ng2 / components / logic / inputs-table / inputs-table.component.ts
index f45d5a8..d5a49f8 100644 (file)
 /**
  * Created by rc2122 on 5/4/2017.
  */
-import { Component, Input, Output, EventEmitter } from "@angular/core";
-import { InputFEModel } from "app/models";
+import { Component, Input, Output, EventEmitter, ViewChildren, QueryList } from "@angular/core";
+import { InputFEModel, PropertyModel, PropertiesGroup, Component as ComponentData } from "app/models";
+import { ModalsHandler } from 'app/utils';
 import { ModalService } from "../../../services/modal.service";
 import { InstanceFeDetails } from "app/models/instance-fe-details";
 import { InstanceFePropertiesMap } from "../../../../models/properties-inputs/property-fe-map";
 import { DataTypeService } from "../../../services/data-type.service";
+import { MetadataEntry } from "app/models/metadataEntry";
+import { DynamicElementComponent } from "../../ui/dynamic-element/dynamic-element.component";
 
 @Component({
     selector: 'inputs-table',
@@ -37,17 +40,23 @@ import { DataTypeService } from "../../../services/data-type.service";
 export class InputsTableComponent {
 
     @Input() inputs: Array<InputFEModel>;
-    @Input() instanceNamesMap: Map<string, InstanceFeDetails>;
+    @Input() instanceNamesMap: { [key: string]: InstanceFeDetails };
     @Input() readonly: boolean;
     @Input() isLoading: boolean;
+    @Input() componentType: string;
+    @Input() showDelete:boolean;
     @Output() inputChanged: EventEmitter<any> = new EventEmitter<any>();
     @Output() deleteInput: EventEmitter<any> = new EventEmitter<any>();
 
     @Input() fePropertiesMap: InstanceFePropertiesMap;
-    
+    @Input() componentInstancePropertyMap: PropertiesGroup;
+    @Input() parentComponent: ComponentData;
+
+    @ViewChildren('metadataViewChildren') public metadataViewChildren: QueryList<DynamicElementComponent>;
+
     sortBy: String;
     reverse: boolean;
-    selectedInputToDelete: InputFEModel;    
+    selectedInputToDelete: InputFEModel;
 
     sort = (sortBy) => {
         this.reverse = (this.sortBy === sortBy) ? !this.reverse : true;
@@ -78,7 +87,7 @@ export class InputsTableComponent {
     };
 
 
-    constructor(private modalService: ModalService, private dataTypeService: DataTypeService){
+    constructor(private modalService: ModalService, private dataTypeService: DataTypeService, private modalsHandler: ModalsHandler){
         var x = 5
     }
 
@@ -88,6 +97,39 @@ export class InputsTableComponent {
         this.inputChanged.emit(input);
     };
 
+    onRequiredChanged = (input: InputFEModel, event) => {
+        this.inputChanged.emit(input);
+    }
+
+    onMetadataKeyChanged = (input: InputFEModel, event, metadataEntry: MetadataEntry) => {
+        let dynamicElementComponent = this.metadataViewChildren.filter(element => element.name == input.name + "_" + metadataEntry.key).pop();
+
+        input.updateMetadataKey(metadataEntry, event.value);
+        this.inputChanged.emit(input);
+
+        var mapKeyError = input.metadataMapKeyError;
+        if(input.metadataMapKeyError){
+            dynamicElementComponent.cmpRef.instance.control.setErrors({mapKeyError});
+        }
+    };
+
+    onMetadataValueChanged = (input: InputFEModel, event, metadataEntry: MetadataEntry) => {
+        input.updateMetadataValue(metadataEntry, event.value);
+        this.inputChanged.emit(input);
+    };
+
+
+    createNewMetadataEntry = (input: InputFEModel): void => {
+        let metadataEntry = new MetadataEntry("", "");
+        input.addMetadataEntry(metadataEntry);
+        this.inputChanged.emit(input);
+    }
+
+    deleteMetadataEntry = (input: InputFEModel, metadataEntry: MetadataEntry) => {
+        input.deleteMetadataEntry(metadataEntry);
+        this.inputChanged.emit(input);
+    }
+
     onDeleteInput = () => {
         this.deleteInput.emit(this.selectedInputToDelete);
         this.modalService.closeCurrentModal();
@@ -95,8 +137,6 @@ export class InputsTableComponent {
 
     openDeleteModal = (input: InputFEModel) => {
         console.log('exist inputs: ' + this.inputs)
-        
-        
         this.selectedInputToDelete = input;
         this.modalService.createActionModal("Delete Input", "Are you sure you want to delete this input?", "Delete", this.onDeleteInput, "Close").instance.open();
     }
@@ -128,6 +168,69 @@ export class InputsTableComponent {
     checkInstanceFePropertiesMapIsFilled(){
         return _.keys(this.fePropertiesMap).length > 0
     }
+
+    hasInputMetadata(){
+        for(let input of this.inputs){
+            if (input.metadataEntries.length > 0){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public updateProperty = (inputProperty: InputFEModel): void => {
+        let modelProperty : PropertyModel = this.createPropertyModel(inputProperty);
+        if (inputProperty.instanceUniqueId != null && this.componentInstancePropertyMap != null && modelProperty.constraints == null && this.componentInstancePropertyMap[inputProperty.instanceUniqueId]) {
+            this.componentInstancePropertyMap[inputProperty.instanceUniqueId].forEach(tempProperty => {
+                modelProperty.constraints = tempProperty.constraints;
+            });
+        }
+        this.modalsHandler.newOpenEditPropertyModal(modelProperty, [],true, 'component', modelProperty.resourceInstanceUniqueId, this.parentComponent, inputProperty).then(result => {
+            let newInputs : Array<InputFEModel> = [];
+            this.inputs.forEach(input => {
+                if (input.uniqueId != inputProperty.uniqueId) {
+                    newInputs.push(input);
+                } else {
+                    let newMetadataEntries : Array<MetadataEntry> = [];
+                    for (let key of Object.keys(inputProperty.metadata)){
+                        newMetadataEntries.push(new MetadataEntry(key, inputProperty.metadata[key]));
+                    }
+                    inputProperty.metadataEntries = [];
+                    inputProperty.metadataEntries = newMetadataEntries;
+                    newInputs.push(inputProperty);
+                }
+            });
+            this.inputs = newInputs;
+        });     
+    }
+
+    private createPropertyModel(inputproperty: InputFEModel){
+        let propertyModel = new PropertyModel();
+        propertyModel.constraints = inputproperty.constraints;
+        propertyModel.defaultValue = inputproperty.defaultValue;
+        propertyModel.definition = inputproperty.definition;
+        propertyModel.description = inputproperty.description;
+        propertyModel.name = inputproperty.name;
+        propertyModel.parentUniqueId = inputproperty.parentUniqueId;
+        propertyModel.password = inputproperty.password;
+        propertyModel.required = inputproperty.required;
+        propertyModel.schema = inputproperty.schema;
+        propertyModel.schemaType = inputproperty.schemaType;
+        propertyModel.type = inputproperty.type;
+        propertyModel.uniqueId = inputproperty.uniqueId;
+        propertyModel.value = inputproperty.value;
+        propertyModel.getInputValues = inputproperty.getInputValues;
+        propertyModel.parentPropertyType = inputproperty.parentPropertyType;
+        propertyModel.subPropertyInputPath = inputproperty.subPropertyInputPath;
+        propertyModel.getPolicyValues = inputproperty.getPolicyValues;
+        propertyModel.inputPath = inputproperty.inputPath;
+        propertyModel.metadata = inputproperty.metadata;
+        propertyModel.subPropertyToscaFunctions = inputproperty.subPropertyToscaFunctions;
+        propertyModel.ownerId = inputproperty.ownerId;
+        propertyModel.propertyView = true;
+        return propertyModel;
+    }
+
 }