2 * Copyright (c) 2017 ZTE Corporation.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * and the Apache License 2.0 which both accompany this distribution,
6 * and are available at http://www.eclipse.org/legal/epl-v10.html
7 * and http://www.apache.org/licenses/LICENSE-2.0
10 * ZTE - initial API and implementation and/or initial documentation
13 import { Component, Input, OnChanges, Output, SimpleChange, SimpleChanges, ViewEncapsulation } from '@angular/core';
14 import { TreeNode } from 'primeng/primeng';
16 import { ValueSource } from '../../model/value-source.enum';
17 import { ValueType } from '../../model/value-type.enum';
18 import { Parameter } from '../../model/workflow/parameter';
19 import { RestParameter } from '../../model/workflow/rest-parameter';
20 import { RestTask } from '../../model/workflow/rest-task';
21 import { SwaggerTreeConverterService } from '../../services/swagger-tree-converter.service';
22 import { WorkflowUtil } from '../../util/workflow-util';
25 * parameter tree presents parameter of task node's input and output parameters.
28 selector: 'b4t-parameter-tree',
29 styleUrls: ['./parameter-tree.component.css'],
30 templateUrl: 'parameter-tree.component.html',
31 encapsulation: ViewEncapsulation.None
33 export class ParameterTreeComponent implements OnChanges {
34 @Input() public parameters: TreeNode[];
35 @Input() public task: RestTask;
36 @Input() public defaultValueSource: string;
37 @Input() public valueSource: ValueSource[];
39 constructor(private swaggerTreeConverterService: SwaggerTreeConverterService) { }
41 public ngOnChanges(changes: SimpleChanges) {
42 const changeParameters = changes["parameters"];
43 if (changeParameters && 0 < changeParameters.currentValue.length) {
44 this.formatParam(changeParameters.currentValue);
48 public getParam(node: any) {
49 if (undefined === node.parameter.name) {
50 node.parameter.name = node.label;
51 node.parameter.valueSource = this.defaultValueSource;
53 if (node.parent.parameter.value[node.label]) {
54 node.parameter.value = node.parent.parameter.value[node.label].value;
55 node.parameter.valueSource = node.parent.parameter.value[node.label].valueSource;
57 const tempParamValue: any = {};
58 tempParamValue.value = '';
59 tempParamValue.valueSource = this.defaultValueSource;
60 node.parent.parameter.value[node.label] = tempParamValue;
61 node.parameter.value = tempParamValue.value;
62 node.parameter.valueSource = tempParamValue.valueSource;
65 return node.parameter;
68 public paramChange(param: Parameter, node: any) {
69 if (node.label !== param.name) {
70 node.label = param.name;
71 this.propertyKeyChanged(node, param.value);
74 if (node.parent.parameter.value[param.name]) {
75 node.parent.parameter.value[param.name].value = param.value;
76 node.parent.parameter.value[param.name].valueSource = param.valueSource;
78 node.parent.parameter.value[param.name] = {
80 valueSource: param.valueSource
86 public getKeyParameter(node: any) {
87 return new Parameter('key', node.label, ValueSource[ValueSource.String], ValueType[ValueType.String]);
90 public keyParameterChange(node: any, parameter: Parameter) {
91 node.label = parameter.value;
92 this.propertyKeyChanged(node, parameter.value);
95 public getValueParameter(node: any, key: string) {
96 const nodeValue = node[key] ? node[key] : {
98 valueSource: ValueSource[ValueSource.String],
100 node[key] = nodeValue;
104 public valueParameterChange(node: any, key: string, parameter: Parameter) {
105 node[key].value = parameter.value;
106 node[key].valueSource = parameter.valueSource;
109 public addChildNode4DynamicObject(node: any) {
110 const copyItem = WorkflowUtil.deepClone(node.parameter.additionalProperties);
111 const key = Object.keys(node.parameter.value).length;
112 const childrenNode = this.swaggerTreeConverterService
113 .schema2TreeNode(key, this.task.serviceName, this.task.serviceVersion, copyItem);
115 childrenNode.keyEditable = true;
116 node.parameter.value[key] = childrenNode.parameter.value;
118 node.children.push(childrenNode);
121 public propertyKeyChanged(node: any, newKey: string) {
122 const value = node.parent.parameter.value[node.label];
123 node.parent.parameter.value[newKey] = value;
124 delete node.parent.parameter.value[node.label];
129 public addChildNode4ObjectArray(node: any) {
130 const copyItem = WorkflowUtil.deepClone(node.parameter.items);
132 const childrenNode = this.swaggerTreeConverterService
134 node.children.length,
135 this.task.serviceName,
136 this.task.serviceVersion,
139 node.parameter.value.push(childrenNode.parameter.value);
140 node.children.push(childrenNode);
141 this.initParam(node);
144 public deleteTreeNode(node: any) {
146 node.parent.parameter.value.splice(node.label, 1);
147 node.parent.children.splice(node.label, 1);
150 node.parent.children.forEach((childNode, index) => childNode.label = index);
153 public canEditValue(node: any): boolean {
154 return node.children.length === 0;
157 public canDelete(node: any) {
158 const parent = node.parent;
160 (this.isArrayObject(parent) || this.isDynamicObject(parent))) {
167 public updateObjectValue(node: any, value: string) {
168 const newValueObj = JSON.parse(value);
169 for (const key in node.parameter.value) {
170 delete node.parameter.value[key];
173 for (const key in newValueObj) {
174 node.parameter.value[key] = newValueObj[key];
178 public getObjectValue(node) {
179 return JSON.stringify(node.parameter.value);
182 public canAdd(node: any) {
183 return this.isArrayObject(node) || this.isDynamicObject(node);
186 private formatParam(params: any[]): void {
188 params.forEach(param => this.initParam(param));
191 private initParam(parameter: any, value?: any): void {
192 if (!parameter || 0 === parameter.length) {
195 switch (parameter.type) {
197 parameter.parameter.name = parameter.label;
198 if (value && value[parameter.label]) {
199 parameter.parameter.value = value[parameter.label].value;
200 parameter.parameter.valueSource = value[parameter.label].valueSource;
202 parameter.parameter.valueSource = this.defaultValueSource;
206 for (let index = 0; index < parameter.children.length; index++) {
207 let param = parameter.children[index];
208 this.initParam(param, parameter.parameter.value);
212 for (let index = 0; index < parameter.children.length; index++) {
213 let param = parameter.children[index];
214 this.initParam(param, parameter.parameter.value);
218 console.log('init a unsupport parameter, type is:' + parameter.type);
223 private isArrayObject(node: any): boolean {
224 return node.type === 'array';
227 private isDynamicObject(node: any): boolean {
228 return node.type === 'map';