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
10 * ZTE - initial API and implementation and/or initial documentation
\r
13 import { ChangeDetectionStrategy, Component, Input, OnChanges, Output, SimpleChange, SimpleChanges } from '@angular/core';
\r
14 import { TreeNode } from 'primeng/primeng';
\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
26 * parameter tree presents parameter of task node's input or output parameters.
\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
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
40 constructor(private restService: RestService, private swaggerTreeConverterService: SwaggerTreeConverterService) { }
\r
42 public ngOnChanges(changes: SimpleChanges) {
\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
48 return new Parameter(node.label, node.value.value, node.value.valueSource, node.definition.type, node.definition.reqquired);
\r
52 public paramChange(param: Parameter, node: any) {
\r
53 // console.log('Parameter change:' + param.name + ', Node label is:' + node.label);
\r
55 node.value.valueSource = param.valueSource;
\r
56 node.value.value = param.value;
\r
58 this.objectParameterChange(node);
\r
60 if (node.label !== param.name) {
\r
61 delete node.parent.value.value[node.label];
\r
62 node.label = param.name;
\r
65 node.parent.value.value[node.label] = node.value;
\r
67 // this parameter is 'request param' or 'response param'
\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
82 private getSwagger(): Swagger {
\r
83 return this.restService.getSwaggerInfo(this.restConfigId);
\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
90 const childrenNode = this.swaggerTreeConverterService
\r
91 .schema2TreeNode(this.getSwagger(), key, copyItem);
\r
93 childrenNode.keyEditable = true;
\r
94 node.value.value[key] = childrenNode.value;
\r
96 node.children.push(childrenNode);
\r
99 public addChildNode4ObjectArray(node: any) {
\r
100 const copyItem = WorkflowUtil.deepClone(node.definition.items);
\r
102 const childrenNode = this.swaggerTreeConverterService
\r
105 node.children.length,
\r
108 node.value.value.push(childrenNode.value);
\r
109 node.children.push(childrenNode);
\r
112 public deleteTreeNode(node: any) {
\r
113 if ('array' === node.parent.type) {
\r
115 node.parent.value.value.splice(node.label, 1);
\r
116 node.parent.children.splice(node.label, 1);
\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
132 public canInsert(node: any) {
\r
133 if (node.value.valueSource !== ValueSource[ValueSource.Definition]) {
\r
136 return this.isArrayObject(node) || this.isDynamicObject(node);
\r
140 public canDelete(node: any) {
\r
141 const parent = node.parent;
\r
143 (this.isArrayObject(parent) || this.isDynamicObject(parent))) {
\r
150 public getObjectValueSource(): ValueSource[] {
\r
152 this.valueSource.forEach(source => {
\r
153 if (ValueSource.String != source) {
\r
154 result.push(source);
\r
157 result.push(ValueSource.Definition);
\r
161 private isArrayObject(node: any): boolean {
\r
162 return node.type === 'array';
\r
165 private isDynamicObject(node: any): boolean {
\r
166 return node.type === 'map';
\r