aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/ng2/pages/properties-assignment/properties.utils.ts
blob: 79769e21b56069a3def2e7d1c86d4d87a85ea070 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { Injectable } from '@angular/core';
import { DataTypeModel, PropertyFEModel, PropertyBEModel, InstanceBePropertiesMap, InstanceFePropertiesMap, SchemaProperty, DerivedFEProperty, DerivedFEPropertyMap, DerivedPropertyType, InputFEModel} from "app/models";
import { DataTypeService } from "app/ng2/services/data-type.service";
import { PROPERTY_TYPES } from "app/utils";
import { UUID } from "angular2-uuid";

@Injectable()
export class PropertiesUtils {

    constructor(private dataTypeService:DataTypeService) {}

    /**
     * Entry point when getting properties from server
     * Returning InstanceFePropertiesMap
     */
    public convertPropertiesMapToFEAndCreateChildren = (instancePropertiesMap:InstanceBePropertiesMap): InstanceFePropertiesMap => {
        let instanceFePropertiesMap:InstanceFePropertiesMap = new InstanceFePropertiesMap();
        angular.forEach(instancePropertiesMap, (properties:Array<PropertyBEModel>, instanceName:string) => {
            instanceFePropertiesMap[instanceName] = this.convertPropertiesToFEAndCreateChildren(properties);
        });
        return instanceFePropertiesMap;
    }

    /**
     * Convert the properties Array<PropertyBEModel> to Array<PropertyFEModel>
     */
    private convertPropertiesToFEAndCreateChildren = (properties: Array<PropertyBEModel>): Array<PropertyFEModel> => {
        let propertyFeArray: Array<PropertyFEModel> = [];
        _.forEach(properties, (property: PropertyBEModel, index: number) => {
            //console.log("=======" + property.name + "========");
                if(!this.dataTypeService.getDataTypeByTypeName(property.type)){ // if type not exist in data types remove property from list
                    console.log("ERROR: missing type " + property.type + " in dataTypes , of property ",property);
                    return;
                }
                let propertyFe:PropertyFEModel = new PropertyFEModel(property);
                if (propertyFe.isDataType) { //prop is not simple, list, or map. Need to create children.
                    let tempProps: Array<DerivedFEProperty> = [];
                    let dataTypeObj: DataTypeModel = this.dataTypeService.getDataTypeByTypeName(propertyFe.type);
                    this.dataTypeService.getDerivedDataTypeProperties(dataTypeObj, tempProps, propertyFe.name);
                    propertyFe.flattenedChildren = tempProps;
                    propertyFe.expandedChildPropertyId = propertyFe.name;
                    this.initValueObjectRef(propertyFe);
                }
                propertyFeArray.push(propertyFe);


        });
        return propertyFeArray;

        //TODO: need to look at schema to create the nested properties for the following cases:
        // 1 - when value is populated for a complex type (list or map)
        // 2 - when adding new entries to a complex type (eg. adding a new entry to a list of AddressRequirements)
    }

    public initValueObjectRef = (property: PropertyFEModel): void => {
        //console.log("Property " + property.name + " has value: " + property.value);
        if (!property.isDataType || property.isDeclared) { //if property is declared, it gets a simple input instead. List and map values and pseudo-children will be handled in property component
            property.value = property.value || property.defaultValue;
        } else if (property.value){ //we have a complex property with a value. Lets parse property.value and populate our flattened children with those values
            this.assignValuesRecursively(JSON.parse(property.value), property.flattenedChildren, property.name);
        }
    }

    public assignValuesRecursively = (valueJSON: any, derivedPropArray: Array<DerivedFEProperty>, propName: string) => {
        if (valueJSON && Object.keys(valueJSON)) {
            Object.keys(valueJSON).forEach(valueKey => {
                let childProp: DerivedFEProperty = derivedPropArray.find(prop => prop.propertiesName == propName + "#" + valueKey);
                if (!childProp) return;
                if (childProp.isDeclared || (childProp.derivedDataType != DerivedPropertyType.COMPLEX && !_.isEmpty(valueJSON[valueKey]))) {
                    childProp.value = (typeof valueJSON[valueKey] === 'object')? JSON.stringify(valueJSON[valueKey]) : valueJSON[valueKey];
                } else {
                    this.assignValuesRecursively(valueJSON[valueKey], derivedPropArray, childProp.propertiesName)
                }
            });
        }
    }

}