8d26055feb5409bb17d21a162e054e84ca67e694
[sdc.git] / catalog-ui / src / app / ng2 / pages / interface-operation / operation-creator / operation-creator.component.ts
1 import * as _ from "lodash";
2 import {Component} from '@angular/core';
3
4 import {Subscription} from "rxjs/Subscription";
5
6 import {TranslateService} from "app/ng2/shared/translator/translate.service";
7 import {WorkflowServiceNg2} from 'app/ng2/services/workflow.service';
8 import {InputModel, OperationModel, OperationParameter} from 'app/models';
9
10 import {DropdownValue} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component";
11
12 @Component({
13     selector: 'operation-creator',
14     templateUrl: './operation-creator.component.html',
15     styleUrls:['./operation-creator.component.less'],
16     providers: [TranslateService]
17 })
18
19 export class OperationCreatorComponent {
20
21     input: any;
22     operation: OperationModel;
23
24     workflows: Array<DropdownValue> = [];
25     workflowVersions: Array<DropdownValue> = [];
26     inputProperties: Array<DropdownValue> = [];
27     inputPropertyTypes: {};
28
29     inputParameters: Array<OperationParameter> = [];
30     noAssignInputParameters: Array<OperationParameter> = [];
31     assignInputParameters: { [key: string]: { [key: string]: Array<OperationParameter>; }; } = {};
32
33     isAssociateWorkflow: boolean = false;
34     isEditMode: boolean = false;
35     isLoading: boolean = false;
36
37     propertyTooltipText: String;
38
39     constructor(private workflowServiceNg2: WorkflowServiceNg2, private translateService: TranslateService) {
40         this.translateService.languageChangedObservable.subscribe(lang => {
41             this.propertyTooltipText = this.translateService.translate("OPERATION_PROPERTY_TOOLTIP_TEXT");
42         });
43     }
44
45     ngOnInit() {
46
47         this.inputProperties = _.map(this.input.inputProperties,
48             (input: InputModel) => new DropdownValue(input.uniqueId, input.name)
49         );
50
51         this.inputPropertyTypes = {};
52         _.forEach(this.input.inputProperties, (input: InputModel) => {
53             this.inputPropertyTypes[input.uniqueId] = input.type;
54         });
55
56         const inputOperation = <OperationModel>this.input.operation;
57         this.operation = new OperationModel(inputOperation || {});
58
59         const buildInputParams = () => {
60             if (inputOperation.inputParams) {
61                 this.inputParameters = [];
62                 _.forEach(inputOperation.inputParams.listToscaDataDefinition, (input: OperationParameter) => {
63                     this.addParam(input);
64                 });
65             }
66         }
67
68         this.isLoading = true;
69         this.workflowServiceNg2.getWorkflows().subscribe(workflows => {
70             this.isLoading = false;
71
72             this.workflows = _.map(workflows, (workflow: any) => {
73                 return new DropdownValue(workflow.id, workflow.name);
74             });
75
76             if (inputOperation) {
77                 if (inputOperation.workflowVersionId) {
78                     this.isAssociateWorkflow = true;
79                     this.onSelectWorkflow(inputOperation.workflowVersionId).add(buildInputParams);
80                 } else {
81                     this.inputParameters = this.noAssignInputParameters;
82                     this.isAssociateWorkflow = false;
83                     buildInputParams();
84                 }
85
86                 if (inputOperation.uniqueId) {
87                     this.isEditMode = true;
88                 }
89             }
90         });
91
92
93     }
94
95     onSelectWorkflow(selectedVersionId?: string): Subscription {
96
97         this.operation.workflowVersionId = selectedVersionId || null;
98         if (!this.assignInputParameters[this.operation.workflowId]) {
99             this.assignInputParameters[this.operation.workflowId] = {};
100         }
101
102         this.isLoading = true;
103         return this.workflowServiceNg2.getWorkflowVersions(this.operation.workflowId).subscribe((versions: Array<any>) => {
104             this.isLoading = false;
105
106             this.workflowVersions = _.map(
107                 _.filter(versions, version => version.state === this.workflowServiceNg2.VERSION_STATE_CERTIFIED),
108                 (version: any) => {
109                     if (!this.assignInputParameters[this.operation.workflowId][version.id]) {
110                         this.assignInputParameters[this.operation.workflowId][version.id] = _.map(version.inputs, (input: any) => {
111                             return new OperationParameter({
112                                 name: input.name,
113                                 type: input.type && input.type.toLowerCase(),
114                                 property: null,
115                                 mandatory: input.mandatory,
116                             });
117                         });
118                     }
119                     return new DropdownValue(version.id, `v. ${version.name}`);
120                 }
121             );
122
123             if (!selectedVersionId && versions.length) {
124                 this.operation.workflowVersionId = _.last(versions.sort()).id;
125             }
126             this.changeWorkflowVersion();
127         });
128
129     }
130
131     changeWorkflowVersion() {
132         this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
133     }
134
135     toggleAssociateWorkflow() {
136
137         if (!this.isAssociateWorkflow) {
138             this.inputParameters = this.noAssignInputParameters;
139         } else {
140             if (!this.operation.workflowId || !this.operation.workflowVersionId) {
141                 this.inputParameters = [];
142             } else {
143                 this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
144             }
145         }
146
147     }
148
149     addParam(param?: OperationParameter): void {
150         this.inputParameters.push(new OperationParameter(param));
151     }
152
153     isParamsValid(): boolean {
154
155         for (let ctr=0; ctr<this.inputParameters.length; ctr++) {
156             if (!this.inputParameters[ctr].name || !this.inputParameters[ctr].property) {
157                 return false;
158             }
159         }
160         return true;
161
162     }
163
164     onRemoveParam = (param: OperationParameter): void => {
165         let index = _.indexOf(this.inputParameters, param);
166         this.inputParameters.splice(index, 1);
167     }
168
169     createInputParamList(): void {
170         this.operation.createInputParamsList(this.inputParameters);
171     }
172
173     checkFormValidForSubmit(): boolean {
174         return this.operation.operationType &&
175             (!this.isAssociateWorkflow || this.operation.workflowVersionId) &&
176             this.isParamsValid();
177     }
178
179 }