1c74b707353ff3504b32ec088e8aa0c34a2330d5
[sdc/sdc-workflow-designer.git] /
1 /**\r
2  * Copyright (c) 2017 ZTE Corporation.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * and the Apache License 2.0 which both accompany this distribution,\r
6  * and are available at http://www.eclipse.org/legal/epl-v10.html\r
7  * and http://www.apache.org/licenses/LICENSE-2.0\r
8  *\r
9  * Contributors:\r
10  *     ZTE - initial API and implementation and/or initial documentation\r
11  */\r
12 \r
13 import { ChangeDetectionStrategy, Component, Input, OnChanges, Output, SimpleChange, SimpleChanges } from '@angular/core';\r
14 import { TreeNode } from 'primeng/primeng';\r
15 \r
16 import { PlanTreeviewItem } from '../../../model/plan-treeview-item';\r
17 import { ValueSource } from '../../../model/value-source.enum';\r
18 import { ValueType } from '../../../model/value-type.enum';\r
19 import { Parameter } from '../../../model/workflow/parameter';\r
20 import { SwaggerTreeConverterService } from '../../../services/swagger-tree-converter.service';\r
21 import { WorkflowUtil } from '../../../util/workflow-util';\r
22 import { Swagger } from "../../../model/swagger";\r
23 import { RestService } from "../../../services/rest.service";\r
24 \r
25 /**\r
26  * parameter tree presents parameter of task node's input or output parameters.\r
27  */\r
28 @Component({\r
29     selector: 'b4t-parameter-tree',\r
30     styleUrls: ['./parameter-tree.component.css'],\r
31     templateUrl: 'parameter-tree.component.html',\r
32     changeDetection: ChangeDetectionStrategy.OnPush\r
33 })\r
34 export class ParameterTreeComponent implements OnChanges {\r
35     @Input() public parameters: TreeNode[];\r
36     @Input() public restConfigId: string;\r
37     @Input() public valueSource: ValueSource[];\r
38     @Input() public planItems: PlanTreeviewItem[];\r
39 \r
40     constructor(private restService: RestService, private swaggerTreeConverterService: SwaggerTreeConverterService) { }\r
41 \r
42     public ngOnChanges(changes: SimpleChanges) {\r
43     }\r
44 \r
45     public getParameter(node: any): Parameter {\r
46         // console.log('Parameter init:' + node.label +'.'+ node.type+'.'+JSON.stringify(node.value.value)+'.'+node.value.valueSource);\r
47 \r
48         return new Parameter(node.label, node.value.value, node.value.valueSource, node.definition.type, node.definition.reqquired);\r
49     }\r
50 \r
51 \r
52     public paramChange(param: Parameter, node: any) {\r
53         // console.log('Parameter change:' + param.name + ', Node label is:' + node.label);\r
54 \r
55         node.value.valueSource = param.valueSource;\r
56         node.value.value = param.value;\r
57 \r
58         this.objectParameterChange(node);\r
59 \r
60         if (node.label !== param.name) {\r
61             delete node.parent.value.value[node.label];\r
62             node.label = param.name;\r
63         }\r
64         if (node.parent) {\r
65             node.parent.value.value[node.label] = node.value;\r
66         }else{\r
67             // this parameter is 'request param' or 'response param'\r
68         }\r
69 \r
70     }\r
71 \r
72     private objectParameterChange(node: any) {\r
73         if (node.value.valueSource === ValueSource[ValueSource.Definition]) { // value will be set by node defintion\r
74             const treeNode = this.swaggerTreeConverterService.schema2TreeNode(this.getSwagger(), node.label, node.definition, node.value);\r
75             node.value = treeNode.value;\r
76             node.children = treeNode.children;\r
77         } else {  // parameter value will be set by param\r
78             node.children = [];\r
79         }\r
80     }\r
81 \r
82     private getSwagger(): Swagger {\r
83         return this.restService.getSwaggerInfo(this.restConfigId);\r
84     }\r
85 \r
86     public addChildNode4DynamicObject(node: any) {\r
87         const copyItem = WorkflowUtil.deepClone(node.definition.additionalProperties);\r
88         const key = Object.keys(node.value.value).length;\r
89 \r
90         const childrenNode = this.swaggerTreeConverterService\r
91             .schema2TreeNode(this.getSwagger(), key, copyItem);\r
92 \r
93         childrenNode.keyEditable = true;\r
94         node.value.value[key] = childrenNode.value;\r
95 \r
96         node.children.push(childrenNode);\r
97     }\r
98 \r
99     public addChildNode4ObjectArray(node: any) {\r
100         const copyItem = WorkflowUtil.deepClone(node.definition.items);\r
101 \r
102         const childrenNode = this.swaggerTreeConverterService\r
103             .schema2TreeNode(\r
104             this.getSwagger(),\r
105             node.children.length,\r
106             copyItem);\r
107 \r
108         node.value.value.push(childrenNode.value);\r
109         node.children.push(childrenNode);\r
110     }\r
111 \r
112     public deleteTreeNode(node: any) {\r
113         if ('array' === node.parent.type) {\r
114             // delete data\r
115             node.parent.value.value.splice(node.label, 1);\r
116             node.parent.children.splice(node.label, 1);\r
117 \r
118             // update node index\r
119             node.parent.children.forEach((childNode, index) => childNode.label = index);\r
120         } else if ('map' === node.parent.type) {\r
121             delete node.parent.value.value[node.label];\r
122             for (let index = 0; index < node.parent.children.length; index++) {\r
123                 const element = node.parent.children[index];\r
124                 if (element.label === node.label) {\r
125                     node.parent.children.splice(index, 1);\r
126                     break;\r
127                 }\r
128             }\r
129         }\r
130     }\r
131 \r
132     public canInsert(node: any) {\r
133         if (node.value.valueSource !== ValueSource[ValueSource.Definition]) {\r
134             return false;\r
135         } else {\r
136             return this.isArrayObject(node) || this.isDynamicObject(node);\r
137         }\r
138     }\r
139 \r
140     public canDelete(node: any) {\r
141         const parent = node.parent;\r
142         if (parent &&\r
143             (this.isArrayObject(parent) || this.isDynamicObject(parent))) {\r
144             return true;\r
145         } else {\r
146             return false;\r
147         }\r
148     }\r
149 \r
150     public getObjectValueSource(): ValueSource[] {\r
151         const result = [];\r
152         this.valueSource.forEach(source => {\r
153             if (ValueSource.String != source) {\r
154                 result.push(source);\r
155             }\r
156         });\r
157         result.push(ValueSource.Definition);\r
158         return result;\r
159     }\r
160 \r
161     private isArrayObject(node: any): boolean {\r
162         return node.type === 'array';\r
163     }\r
164 \r
165     private isDynamicObject(node: any): boolean {\r
166         return node.type === 'map';\r
167     }\r
168 }\r