summaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/ng2/pages/interface-operation/operation-creator/param-row/param-row.component.ts
blob: de6e70340402a92819cfad2e2fa1c52842e5ef4b (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
import {Component, Input} from '@angular/core';
import {PROPERTY_DATA} from "app/utils";
import {DataTypeService} from "app/ng2/services/data-type.service";
import {OperationModel, OperationParameter, InputBEModel, DataTypeModel, Capability} from 'app/models';
import {DropdownValue} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component";

class DropdownValueType extends DropdownValue {
    type: String;

    constructor(value: string, label: string, type?: String) {
        super(value, label);
        if (type) {
            this.type = type;
        }
    }
}

@Component({
    selector: 'param-row',
    templateUrl: './param-row.component.html',
    styleUrls: ['./param-row.component.less']
})

export class ParamRowComponent {
    @Input() param: OperationParameter;
    @Input() inputProps: Array<InputBEModel>;
    @Input() operationOutputs: Array<OperationModel>;
    @Input() capabilitiesProps: Array<Capability>;
    @Input() onRemoveParam: Function;
    @Input() isAssociateWorkflow: boolean;
    @Input() readonly: boolean;
    @Input() isInputParam: boolean;
    @Input() validityChanged: Function;

    propTypeEnum: Array<string> = [];
    operationOutputCats: Array<{ operationName: string, outputs: Array<DropdownValueType> }> = [];
    filteredInputProps: Array<DropdownValue> = [];
    filteredCapabilitiesProps: Array<{capabilityName: string, properties: Array<DropdownValueType>}> = [];

    constructor(private dataTypeService:DataTypeService) {}

    ngOnInit() {
        if (this.isInputParam) {
            this.propTypeEnum = _.uniq(
                _.map(
                    _.concat(
                        this.getPrimitiveSubtypes(),
                        _.reduce(
                            this.operationOutputs,
                            (acc, op) => [...acc, ...op.outputs.listToscaDataDefinition],
                            []),
                        _.reduce(
                            this.capabilitiesProps,
                            (acc, capab) => [...acc, ...capab.properties],
                            [])
                    ),
                    prop => prop.type
                )
            );
        } else {
            const dataTypes: Array<DataTypeModel> = _.toArray(this.dataTypeService.getAllDataTypes());
            this.propTypeEnum = _.concat(
                _.map(
                    _.filter(
                        dataTypes,
                        type => this.isTypePrimitive(type.name)
                    ),
                    type => type.name
                ).sort(),
                _.map(
                    _.filter(
                        dataTypes,
                        type => !this.isTypePrimitive(type.name)
                    ),
                    type => type.name
                ).sort()
            );
        }

        this.onChangeType();
        this.validityChanged();
    }

    onChangeName() {
        this.validityChanged();
    }

    onChangeType() {
        if (!this.isInputParam) {
            this.validityChanged();
            return;
        }

        this.filteredInputProps = _.map(
            _.filter(
                this.getPrimitiveSubtypes(),
                prop => !this.param.type || prop.type === this.param.type
            ),
            prop => new DropdownValue(prop.uniqueId, prop.name)
        );

        this.operationOutputCats = _.filter(
            _.map(
                this.operationOutputs,
                op => {
                    return {
                        operationName: `${op.displayType()}.${op.name}`,
                        outputs: _.map(
                            _.filter(op.outputs.listToscaDataDefinition, output => !this.param.type || output.type === this.param.type),
                            output => new DropdownValueType(
                                `${op.interfaceType}.${op.name}.${output.name}`,
                                output.name,
                                output.type
                            )
                        )
                    };
                }
            ),
            category => category.outputs.length > 0
        );

        this.filteredCapabilitiesProps = _.filter(
            _.map(
                this.capabilitiesProps,
                cap => {
                    return {
                        capabilityName: cap.name,
                        properties: _.map(
                            _.filter(cap.properties, prop => !this.param.type || prop.type === this.param.type),
                            prop => new DropdownValueType(
                                prop.uniqueId,
                                prop.name,
                                prop.type
                            )
                        )
                    };
                }
            ),
            capability => capability.properties.length > 0
        );

        if (this.param.inputId) {
            const selProp = this.getSelectedProp();
            if (selProp && selProp.type === this.param.type) {
                this.param.inputId = '-1';
                setTimeout(() => this.param.inputId = selProp.uniqueId || selProp.value);
            } else {
                this.param.inputId = null;
            }
        }

        this.validityChanged();
    }

    onChangeProperty() {
        const newProp = this.getSelectedProp();

        if (!this.param.type) {
            this.param.type = newProp.type;
            this.onChangeType();
        }

        if (!this.param.name) {
            this.param.name = newProp.name || newProp.label;
        }

        this.validityChanged();
    }

    getPrimitiveSubtypes(): Array<InputBEModel> {
        const flattenedProps: Array<any> = [];
        const dataTypes = this.dataTypeService.getAllDataTypes();

        _.forEach(this.inputProps, prop => {
            const type:DataTypeModel = _.find(
                _.toArray(dataTypes),
                (type: DataTypeModel) => type.name === prop.type
            );
            flattenedProps.push(prop);
            if (!type) {
                console.error('Could not find prop in dataTypes: ', prop);
            } else {
                if (type.properties) {
                    _.forEach(type.properties, subType => {
                        if (this.isTypePrimitive(subType.type)) {
                            flattenedProps.push({
                                type: subType.type,
                                name: `${prop.name}.${subType.name}`,
                                uniqueId: `${prop.uniqueId}.${subType.name}`
                            });
                        }
                    });
                }
            }
        });

        return flattenedProps;
    }

    getSelectedProp() {
        return _.find(
            this.getPrimitiveSubtypes(),
            prop => this.param.inputId === prop.uniqueId
        ) || _.find(
            _.reduce(
                this.operationOutputCats,
                (acc, cat) => [...acc, ...cat.outputs],
            []),
            (out: DropdownValueType) => this.param.inputId === out.value
            ) || _.find(
                _.reduce(
                    this.filteredCapabilitiesProps,
                    (acc, cap) => [...acc, ...cap.properties],
                    []),
                (prop: DropdownValueType) => this.param.inputId === prop.value
        );
    }

    isTypePrimitive(type: string): boolean {
        return (
            type === 'string' ||
            type === 'integer' ||
            type === 'float' ||
            type === 'boolean'
        );
    }
}