1 import * as _ from "lodash";
2 import {Component} from '@angular/core';
4 import {Subscription} from "rxjs/Subscription";
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';
10 import {DropdownValue} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component";
12 export interface OperationCreatorInput {
13 operation: OperationModel,
14 inputProperties: Array<InputBEModel>,
15 enableWorkflowAssociation: boolean,
21 selector: 'operation-creator',
22 templateUrl: './operation-creator.component.html',
23 styleUrls: ['./operation-creator.component.less'],
24 providers: [TranslateService]
27 export class OperationCreatorComponent {
29 input: OperationCreatorInput;
30 operation: OperationModel;
32 workflows: Array<DropdownValue> = [];
33 workflowVersions: Array<DropdownValue> = [];
34 inputProperties: Array<DropdownValue> = [];
35 inputPropertyTypes: { [key: string]: string };
37 inputParameters: Array<OperationParameter> = [];
38 noAssignInputParameters: Array<OperationParameter> = [];
39 assignInputParameters: { [key: string]: { [key: string]: Array<OperationParameter>; }; } = {};
41 enableWorkflowAssociation: boolean;
42 isAssociateWorkflow: boolean;
43 isEditMode: boolean = false;
44 isLoading: boolean = false;
48 propertyTooltipText: String;
50 constructor(private workflowServiceNg2: WorkflowServiceNg2, private translateService: TranslateService) {
51 this.translateService.languageChangedObservable.subscribe(lang => {
52 this.propertyTooltipText = this.translateService.translate("OPERATION_PROPERTY_TOOLTIP_TEXT");
58 this.readonly = this.input.readonly;
59 this.isService = this.input.isService;
60 this.enableWorkflowAssociation = this.input.enableWorkflowAssociation && !this.isService;
62 this.inputProperties = _.map(this.input.inputProperties,
63 (input: InputBEModel) => new DropdownValue(input.uniqueId, input.name)
66 this.inputPropertyTypes = {};
67 _.forEach(this.input.inputProperties, (input: InputBEModel) => {
68 this.inputPropertyTypes[input.uniqueId] = input.type;
71 const inputOperation = this.input.operation;
72 this.operation = new OperationModel(inputOperation || {});
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);
81 this.reconstructOperation();
84 this.reconstructOperation();
89 reconstructOperation = () => {
90 const inputOperation = this.input.operation;
92 if (!this.enableWorkflowAssociation || !inputOperation.workflowVersionId || this.isService) {
93 this.inputParameters = this.noAssignInputParameters;
94 this.isAssociateWorkflow = false;
95 this.buildInputParams();
97 this.isAssociateWorkflow = true;
98 this.onSelectWorkflow(inputOperation.workflowVersionId).add(this.buildInputParams);
101 if (inputOperation.uniqueId) {
102 this.isEditMode = true;
107 buildInputParams = () => {
108 if (this.input.operation.inputParams) {
110 [...this.input.operation.inputParams.listToscaDataDefinition].sort((a, b) => a.name.localeCompare(b.name)),
111 (input: OperationParameter) => {
112 this.addParam(input);
118 onSelectWorkflow(selectedVersionId?: string): Subscription {
120 this.operation.workflowVersionId = selectedVersionId || null;
121 if (!this.assignInputParameters[this.operation.workflowId]) {
122 this.assignInputParameters[this.operation.workflowId] = {};
125 this.isLoading = true;
126 return this.workflowServiceNg2.getWorkflowVersions(this.operation.workflowId).subscribe((versions: Array<any>) => {
127 this.isLoading = false;
129 this.workflowVersions = _.map(
131 versions, version => version.state === this.workflowServiceNg2.VERSION_STATE_CERTIFIED
132 ).sort((a, b) => a.name.localeCompare(b.name)),
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({
138 type: input.type && input.type.toLowerCase(),
140 mandatory: input.mandatory,
143 .sort((a, b) => a.name.localeCompare(b.name));
145 return new DropdownValue(version.id, `V ${version.name}`);
149 if (!selectedVersionId && this.workflowVersions.length) {
150 this.operation.workflowVersionId = _.last(this.workflowVersions).value;
152 this.changeWorkflowVersion();
157 changeWorkflowVersion() {
158 this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
161 toggleAssociateWorkflow() {
163 if (!this.isAssociateWorkflow) {
164 this.inputParameters = this.noAssignInputParameters;
166 if (!this.operation.workflowId || !this.operation.workflowVersionId) {
167 this.inputParameters = [];
169 this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
175 addParam(param?: OperationParameter): void {
176 this.inputParameters.push(new OperationParameter(param));
179 isParamsValid(): boolean {
181 for (let ctr=0; ctr<this.inputParameters.length; ctr++) {
182 if (!this.inputParameters[ctr].name || !this.inputParameters[ctr].property) {
190 onRemoveParam = (param: OperationParameter): void => {
191 let index = _.indexOf(this.inputParameters, param);
192 this.inputParameters.splice(index, 1);
195 createInputParamList(): void {
196 this.operation.createInputParamsList(this.inputParameters);
199 checkFormValidForSubmit(): boolean {
200 return this.operation.operationType &&
201 (!this.isAssociateWorkflow || this.operation.workflowVersionId) &&
202 this.isParamsValid();