752f0502da23b56409e9b354786e30091e54752f
[ccsdk/cds.git] /
1 import {Component, OnInit} from '@angular/core';
2 import {InputActionAttribute, OutputActionAttribute} from './models/InputActionAttribute';
3 import {DesignerStore} from '../designer.store';
4 import {DesignerDashboardState} from '../model/designer.dashboard.state';
5 import {Action} from './models/Action';
6
7 @Component({
8     selector: 'app-action-attributes',
9     templateUrl: './action-attributes.component.html',
10     styleUrls: ['./action-attributes.component.css']
11 })
12 export class ActionAttributesComponent implements OnInit {
13
14     inputs = [];
15     outputs = [];
16     actionAttributesSideBar: boolean;
17     inputActionAttribute = new InputActionAttribute();
18     outputActionAttribute = new OutputActionAttribute();
19     isInputOtherType: boolean;
20     isOutputOtherType: boolean;
21     outputOtherType = '';
22     inputOtherType = '';
23     actionName = '';
24     designerState: DesignerDashboardState;
25
26     constructor(private designerStore: DesignerStore) {
27
28     }
29
30     ngOnInit() {
31         this.designerStore.state$.subscribe(designerState => {
32             this.designerState = designerState;
33             if (this.designerState && this.designerState.actionName) {
34                 this.actionName = this.designerState.actionName;
35                 const action = this.designerState.template.workflows[this.actionName] as Action;
36                 this.inputs = [];
37                 if (action.inputs) {
38                     const namesOfInput = Object.keys(action.inputs);
39                     this.inputs = this.extractFields(namesOfInput, action.inputs);
40                 }
41                 this.outputs = [];
42                 if (action.outputs) {
43                     const namesOfOutput = Object.keys(action.outputs);
44                     this.outputs = this.extractFields(namesOfOutput, action.outputs);
45                 }
46             }
47         });
48     }
49
50
51     private extractFields(namesOfOutput: string[], container: {}) {
52         const fields = [];
53         for (const nameOutput of namesOfOutput) {
54             const fieldAttribute = new OutputActionAttribute();
55             fieldAttribute.name = nameOutput;
56             fieldAttribute.description = container[nameOutput].description;
57             fieldAttribute.required = container[nameOutput].required;
58             fieldAttribute.type = container[nameOutput].type;
59             const insertedOutputActionAttribute = Object.assign({}, fieldAttribute);
60             fields.push(insertedOutputActionAttribute);
61         }
62         return fields;
63     }
64
65     addInput(input: InputActionAttribute) {
66         if (input && input.type && input.name) {
67             const insertedInputActionAttribute = Object.assign({}, input);
68             this.inputs.push(insertedInputActionAttribute);
69         }
70     }
71
72     addOutput(output: OutputActionAttribute) {
73         if (output && output.type && output.name) {
74             const insertedOutputActionAttribute = Object.assign({}, output);
75             this.outputs.push(insertedOutputActionAttribute);
76         }
77     }
78
79     setInputType(type: string) {
80         this.inputActionAttribute.type = type;
81         this.isInputOtherType = this.checkIfTypeIsOther(type);
82     }
83
84     setInputRequired(isRequired) {
85         this.inputActionAttribute.required = isRequired;
86     }
87
88     setOutputRequired(isRequired) {
89         this.outputActionAttribute.required = isRequired;
90     }
91
92     setOutputType(type: string) {
93         this.outputActionAttribute.type = type;
94         this.isOutputOtherType = this.checkIfTypeIsOther(type);
95     }
96
97     checkIfTypeIsOther(type) {
98         return type.includes('Other');
99     }
100
101     submitAttributes() {
102         this.addInput(this.inputActionAttribute);
103         this.addOutput(this.outputActionAttribute);
104         this.clearFormInputs();
105         this.designerStore.setInputsAndOutputsToSpecificWorkflow(this.storeInputs(this.inputs)
106             , this.storeOutputs(this.outputs), this.actionName);
107     }
108
109     private clearFormInputs() {
110         this.inputActionAttribute = new InputActionAttribute();
111         this.outputActionAttribute = new OutputActionAttribute();
112         this.outputOtherType = '';
113         this.inputOtherType = '';
114     }
115
116     private storeInputs(InputActionAttributes: InputActionAttribute[]) {
117
118         let inputs = '';
119         InputActionAttributes.forEach(input => {
120             inputs += this.appendAttributes(input);
121
122         });
123         if (inputs.endsWith(',')) {
124             inputs = inputs.substr(0, inputs.length - 1);
125         }
126         return JSON.parse('{' + inputs + '}');
127     }
128
129     private storeOutputs(OutputActionAttributes: OutputActionAttribute[]) {
130         let outputs = '';
131         OutputActionAttributes.forEach(output => {
132             outputs += this.appendAttributes(output);
133         });
134         if (outputs.endsWith(',')) {
135             outputs = outputs.substr(0, outputs.length - 1);
136         }
137         return JSON.parse('{' + outputs + '}');
138     }
139
140     private appendAttributes(output: OutputActionAttribute) {
141         return '"' + output.name + '" : {\n' +
142             '            "required" : ' + output.required + ',\n' +
143             '            "type" : "' + output.type + '",\n' +
144             '            "description" : "' + output.description + '"\n' +
145             '          },';
146     }
147 }