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