1 import * as _ from "lodash";
2 import {Component, ViewChild} 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, RadioButtonModel, WORKFLOW_ASSOCIATION_OPTIONS} from 'app/models';
10 import {Tabs, Tab} from "app/ng2/components/ui/tabs/tabs.component";
11 import {DropdownValue} from "app/ng2/components/ui/form-components/dropdown/ui-element-dropdown.component";
13 export interface OperationCreatorInput {
14 operation: OperationModel,
15 inputProperties: Array<InputBEModel>,
16 enableWorkflowAssociation: boolean,
22 selector: 'operation-creator',
23 templateUrl: './operation-creator.component.html',
24 styleUrls: ['./operation-creator.component.less'],
25 providers: [TranslateService]
28 export class OperationCreatorComponent {
30 input: OperationCreatorInput;
31 operation: OperationModel;
33 workflows: Array<DropdownValue> = [];
34 workflowVersions: Array<DropdownValue> = [];
35 inputProperties: Array<InputBEModel> = [];
36 archivedWorkflowId: string = '&';
38 inputParameters: Array<OperationParameter> = [];
39 noAssignInputParameters: Array<OperationParameter> = [];
40 assignInputParameters: { [key: string]: { [key: string]: Array<OperationParameter>; }; } = {};
42 outputParameters: Array<OperationParameter> = [];
43 noAssignOutputParameters: Array<OperationParameter> = [];
44 assignOutputParameters: { [key: string]: { [key: string]: Array<OperationParameter>; }; } = {};
46 tableParameters: Array<OperationParameter> = [];
48 associationOptions: Array<DropdownValue>;
50 enableWorkflowAssociation: boolean;
51 isEditMode: boolean = false;
52 isLoading: boolean = false;
55 propertyTooltipText: String;
57 TYPE_INPUT = 'Inputs';
58 TYPE_OUTPUT = 'Outputs';
60 @ViewChild('propertyInputTabs') propertyInputTabs: Tabs;
63 constructor(private workflowServiceNg2: WorkflowServiceNg2, private translateService: TranslateService) {
64 this.translateService.languageChangedObservable.subscribe(lang => {
65 this.propertyTooltipText = this.translateService.translate("OPERATION_PROPERTY_TOOLTIP_TEXT");
67 this.associationOptions = [
68 new DropdownValue(WORKFLOW_ASSOCIATION_OPTIONS.NONE, this.translateService.translate("NO_WORKFLOW_ASSOCIATION")),
69 new DropdownValue(WORKFLOW_ASSOCIATION_OPTIONS.EXISTING, this.translateService.translate("EXISTING_WORKFLOW_ASSOCIATION"))
73 this.currentTab = this.TYPE_INPUT;
77 this.readonly = this.input.readonly;
78 this.enableWorkflowAssociation = this.input.enableWorkflowAssociation;
79 this.inputProperties = this.input.inputProperties;
81 const inputOperation = this.input.operation;
82 this.operation = new OperationModel(inputOperation || {});
83 if (!inputOperation) {
84 this.operation.workflowAssociationType = WORKFLOW_ASSOCIATION_OPTIONS.NONE;
87 if (this.enableWorkflowAssociation) {
88 this.isLoading = true;
89 this.workflowServiceNg2.getWorkflows().subscribe(workflows => {
90 this.isLoading = false;
91 this.workflows = _.map(
95 if (workflow.archiving === this.workflowServiceNg2.WF_STATE_ACTIVE) {
98 if (workflow.archiving === this.workflowServiceNg2.WF_STATE_ARCHIVED &&
99 workflow.id === this.operation.workflowId) {
100 this.archivedWorkflowId = workflow.id;
106 (workflow: any) => new DropdownValue(workflow.id, workflow.name)
108 this.reconstructOperation();
111 this.reconstructOperation();
115 reconstructOperation = () => {
116 const inputOperation = this.input.operation;
117 if (inputOperation) {
118 if (this.enableWorkflowAssociation && inputOperation.workflowVersionId && this.isUsingExistingWF(inputOperation)) {
119 this.onSelectWorkflow(inputOperation.workflowVersionId).add(() => {
124 this.inputParameters = this.noAssignInputParameters;
125 this.outputParameters = this.noAssignOutputParameters;
130 if (inputOperation.uniqueId) {
131 this.isEditMode = true;
137 buildParams = () => {
138 if (this.input.operation.outputParams) {
139 this.currentTab = this.TYPE_OUTPUT;
142 [...this.input.operation.outputParams.listToscaDataDefinition].sort((a, b) => a.name.localeCompare(b.name)),
143 (output: OperationParameter) => {
144 this.addParam(output);
148 this.currentTab = this.TYPE_INPUT;
150 if (this.input.operation.inputParams) {
152 [...this.input.operation.inputParams.listToscaDataDefinition].sort((a, b) => a.name.localeCompare(b.name)),
153 (input: OperationParameter) => {
154 this.addParam(input);
160 onSelectWorkflow(selectedVersionId?: string): Subscription {
162 this.operation.workflowVersionId = selectedVersionId || null;
163 if (!this.assignInputParameters[this.operation.workflowId]) {
164 this.assignInputParameters[this.operation.workflowId] = {};
165 this.assignOutputParameters[this.operation.workflowId] = {};
168 this.isLoading = true;
169 return this.workflowServiceNg2.getWorkflowVersions(this.operation.workflowId).subscribe((versions: Array<any>) => {
170 this.isLoading = false;
172 this.workflowVersions = _.map(
174 versions, version => version.state === this.workflowServiceNg2.VERSION_STATE_CERTIFIED
175 ).sort((a, b) => a.name.localeCompare(b.name)),
177 if (!this.assignInputParameters[this.operation.workflowId][version.id] && version.id !== selectedVersionId) {
178 this.assignInputParameters[this.operation.workflowId][version.id] = _.map(version.inputs, (input: OperationParameter) => {
179 return new OperationParameter({...input, type: input.type.toLowerCase()});
181 .sort((a, b) => a.name.localeCompare(b.name));
183 this.assignOutputParameters[this.operation.workflowId][version.id] = _.map(version.outputs, (output: OperationParameter) => {
184 return new OperationParameter({...output, type: output.type.toLowerCase()});
186 .sort((a, b) => a.name.localeCompare(b.name));
188 return new DropdownValue(version.id, `V ${version.name}`);
192 if (selectedVersionId) {
193 this.assignInputParameters[this.operation.workflowId][selectedVersionId] = [];
194 this.assignOutputParameters[this.operation.workflowId][selectedVersionId] = [];
196 if (!selectedVersionId && this.workflowVersions.length) {
197 this.operation.workflowVersionId = _.last(this.workflowVersions).value;
200 this.changeWorkflowVersion();
205 changeWorkflowVersion() {
206 this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
207 this.outputParameters = this.assignOutputParameters[this.operation.workflowId][this.operation.workflowVersionId];
211 toggleAssociateWorkflow() {
213 if (!this.isUsingExistingWF()) {
214 this.inputParameters = this.noAssignInputParameters;
215 this.outputParameters = this.noAssignOutputParameters;
217 if (!this.operation.workflowId || !this.operation.workflowVersionId) {
218 this.inputParameters = [];
219 this.outputParameters = [];
221 this.inputParameters = this.assignInputParameters[this.operation.workflowId][this.operation.workflowVersionId];
222 this.outputParameters = this.assignOutputParameters[this.operation.workflowId][this.operation.workflowVersionId];
230 tabChanged = (event) => {
231 this.currentTab = event.title;
236 switch (this.currentTab) {
237 case this.TYPE_INPUT:
238 this.tableParameters = this.inputParameters;
240 case this.TYPE_OUTPUT:
241 this.tableParameters = this.outputParameters;
246 addParam(param?: OperationParameter): void {
247 this.tableParameters.push(new OperationParameter(param));
252 if (this.currentTab === this.TYPE_INPUT) {
253 _.forEach(this.inputParameters, param => {
254 if (!param.name || !param.property) valid = false;
257 _.forEach(this.outputParameters, param => {
258 if (!param.name || !param.type) valid = false;
264 isParamsValid(): boolean {
266 _.forEach(this.inputParameters, param => {
267 if (!param.name || !param.property) {
271 _.forEach(this.outputParameters, param => {
272 if (!param.name || !param.type) {
279 onRemoveParam = (param: OperationParameter): void => {
280 let index = _.indexOf(this.tableParameters, param);
281 this.tableParameters.splice(index, 1);
284 createParamLists(): void {
285 this.operation.createInputParamsList(this.inputParameters);
286 this.operation.createOutputParamsList(this.outputParameters);
289 isUsingExistingWF = (operation?: OperationModel): boolean => {
290 operation = operation || this.operation;
291 return operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.EXISTING;
294 shouldCreateWF(operation?: OperationModel): boolean {
295 operation = operation || this.operation;
296 return this.operation.workflowAssociationType === WORKFLOW_ASSOCIATION_OPTIONS.NEW;
299 checkFormValidForSubmit(): boolean {
300 return this.operation.operationType &&
301 (!this.isUsingExistingWF() || this.operation.workflowVersionId) &&
302 this.isParamsValid();