From 59884c775c9d06e2195401a09e08650a5cf37b20 Mon Sep 17 00:00:00 2001 From: YuanHu Date: Tue, 27 Mar 2018 17:58:42 +0800 Subject: Display Extend Activities on WF Designer UI. Display Extend Activities on WF Designer UI. Use Extend Activities to Design Workflow and Save Issue-ID: SDC-1130,SDC-1131 Change-Id: Iea62eb0edafb2270deaac89b458015e78d961cd0 Signed-off-by: YuanHu --- .../node-parameters/node-parameters.component.html | 23 +++ .../node-parameters/node-parameters.component.ts | 109 +++++++++++++ .../parameter-tree/parameter-tree.component.css | 0 .../parameter-tree/parameter-tree.component.html | 36 +++++ .../parameter-tree/parameter-tree.component.ts | 176 +++++++++++++++++++++ 5 files changed, 344 insertions(+) create mode 100644 sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.html create mode 100644 sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.ts create mode 100644 sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.css create mode 100644 sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.html create mode 100644 sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.ts (limited to 'sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters') diff --git a/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.html b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.html new file mode 100644 index 00000000..9d17374b --- /dev/null +++ b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.html @@ -0,0 +1,23 @@ + + +
+ +
+ + + + diff --git a/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.ts b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.ts new file mode 100644 index 00000000..692661a7 --- /dev/null +++ b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/node-parameters.component.ts @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2017 ZTE Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and the Apache License 2.0 which both accompany this distribution, + * and are available at http://www.eclipse.org/legal/epl-v10.html + * and http://www.apache.org/licenses/LICENSE-2.0 + * + * Contributors: + * ZTE - initial API and implementation and/or initial documentation + */ + +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; +import { TreeNode } from 'primeng/primeng'; + +import { PlanTreeviewItem } from '../../../../model/plan-treeview-item'; +import { Swagger, SwaggerResponseClass } from '../../../../model/swagger'; +import { ValueSource } from '../../../../model/value-source.enum'; +import { RestParameter } from '../../../../model/workflow/rest-parameter'; +import { BroadcastService } from '../../../../services/broadcast.service'; +import { SwaggerTreeConverterService } from '../../../../services/swagger-tree-converter.service'; +import { RestService } from "../../../../services/rest.service"; +import { SwaggerIn } from '../../../../model/workflow/swagger/swagger-in.enum'; + +/** + * property component presents information of a workflow node. + * the presented information can be edit in this component. + * it may load information dynamically. the content may be different for different node type. + */ +@Component({ + selector: 'wfm-node-parameters', + styleUrls: ['./node-parameters.component.css'], + templateUrl: 'node-parameters.component.html', +}) +export class NodeParametersComponent implements OnChanges { + @Input() public swaggerInput: RestParameter[]; + @Input() public swaggerOutput: SwaggerResponseClass[]; + @Input() public restConfigId: string; + @Input() public planItems: PlanTreeviewItem[]; + + public inputSources: ValueSource[] = [ValueSource.Variable, ValueSource.Topology, ValueSource.Plan]; + public outputSources: ValueSource[] = []; + public valueSource = ValueSource; + public headerParams: RestParameter[] = []; + public pathParams: RestParameter[] = []; + public queryParams: RestParameter[] = []; + public inputParams: TreeNode[] = []; + public outputParams: TreeNode[] = []; + + private index = 1; + + constructor(private broadcastService: BroadcastService, + private restService: RestService, + private swaggerTreeConverterService: SwaggerTreeConverterService) { + } + + public ngOnChanges(changes: SimpleChanges): void { + if (changes.swaggerInput && changes.swaggerInput.currentValue) { + this.resetRequestParams(changes.swaggerInput.currentValue); + } + if (changes.swaggerOutput && changes.swaggerOutput.currentValue) { + this.resetResponseParams(changes.swaggerOutput.currentValue); + } + } + + public resetRequestParams(parameters: RestParameter[]) { + this.pathParams = []; + this.queryParams = []; + this.inputParams = []; + this.headerParams = []; + + parameters.forEach(param => { + if (SwaggerIn[SwaggerIn.path] === param.position) { + this.pathParams.push(param); + } else if (SwaggerIn[SwaggerIn.query] === param.position) { + this.queryParams.push(param); + } else if (SwaggerIn[SwaggerIn.header] === param.position) { + this.headerParams.push(param); + } else if (SwaggerIn[SwaggerIn.body] === param.position) { + let valueObject = undefined; + if (undefined !== param.value || undefined !== param.valueSource) { + valueObject = { value: param.value, valueSource: param.valueSource }; + } + const requestTreeNode = this.swaggerTreeConverterService.schema2TreeNode(this.restService.getSwaggerInfo(this.restConfigId), + 'Request Param', param.schema, valueObject); + // console.log('requestTreeNode is :'); + // console.log(requestTreeNode.value); + param.value = requestTreeNode.value.value; + param.valueSource = requestTreeNode.value.valueSource; + this.inputParams.push(requestTreeNode); + } else { + // TODO others param types not supported + console.log('Unsupport parameter position(in):' + param.position); + } + }); + } + + public resetResponseParams(responses: SwaggerResponseClass[]) { + this.outputParams = []; + if (0 < responses.length && responses[0].schema) { + const treeNode = this.swaggerTreeConverterService.schema2TreeNode( + this.restService.getSwaggerInfo(this.restConfigId), + 'Response Params', + responses[0].schema, + { value: {}, valueSource: ValueSource[ValueSource.Definition] }); + this.outputParams.push(treeNode); + } + } +} diff --git a/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.css b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.css new file mode 100644 index 00000000..e69de29b diff --git a/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.html b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.html new file mode 100644 index 00000000..bc14295d --- /dev/null +++ b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.ts b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.ts new file mode 100644 index 00000000..93c3b72e --- /dev/null +++ b/sdc-workflow-designer-ui/src/app/components/property/rest-task/node-parameters/parameter-tree/parameter-tree.component.ts @@ -0,0 +1,176 @@ +/** + * Copyright (c) 2017 ZTE Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and the Apache License 2.0 which both accompany this distribution, + * and are available at http://www.eclipse.org/legal/epl-v10.html + * and http://www.apache.org/licenses/LICENSE-2.0 + * + * Contributors: + * ZTE - initial API and implementation and/or initial documentation + */ + +import { ChangeDetectionStrategy, Component, Input, OnInit, Output } from '@angular/core'; +import { TreeNode } from 'primeng/primeng'; + +import { PlanTreeviewItem } from '../../../../../model/plan-treeview-item'; +import { ValueSource } from '../../../../../model/value-source.enum'; +import { Parameter } from '../../../../../model/workflow/parameter'; +import { SwaggerTreeConverterService } from '../../../../../services/swagger-tree-converter.service'; +import { WorkflowUtil } from '../../../../../util/workflow-util'; +import { Swagger } from "../../../../../model/swagger"; +import { RestService } from "../../../../../services/rest.service"; + +/** + * parameter tree presents parameter of task node's input or output parameters. + */ +@Component({ + selector: 'wfm-parameter-tree', + styleUrls: ['./parameter-tree.component.css'], + templateUrl: 'parameter-tree.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ParameterTreeComponent implements OnInit { + @Input() public parameters: TreeNode[]; + @Input() public showValue: boolean; + @Input() public canInsert: boolean; + @Input() public restConfigId: string; + @Input() public valueSource: ValueSource[]; + @Input() public planItems: PlanTreeviewItem[]; + + constructor(private restService: RestService, private swaggerTreeConverterService: SwaggerTreeConverterService) { } + + public ngOnInit() { + if (undefined === this.showValue) { + this.showValue = true; + } + } + + public getParameter(node: any): Parameter { + // console.log('Parameter init:' + node.label +'.'+ node.type+'.'+JSON.stringify(node.value.value)+'.'+node.value.valueSource); + + return new Parameter(node.label, node.value.value, node.value.valueSource, node.definition.type, node.definition.reqquired); + } + + + public paramChange(param: Parameter, node: any) { + // console.log('Parameter change:' + param.name + ', Node label is:' + node.label); + + node.value.valueSource = param.valueSource; + node.value.value = param.value; + + this.objectParameterChange(node); + + if (node.label !== param.name) { + delete node.parent.value.value[node.label]; + node.label = param.name; + } + if (node.parent) { + node.parent.value.value[node.label] = node.value; + } else { + // this parameter is 'request param' or 'response param' + } + + } + + private objectParameterChange(node: any) { + if (node.value.valueSource === ValueSource[ValueSource.Definition]) { // value will be set by node defintion + const treeNode = this.swaggerTreeConverterService.schema2TreeNode(this.getSwagger(), node.label, node.definition, node.value); + node.value = treeNode.value; + node.children = treeNode.children; + } else { // parameter value will be set by param + node.children = []; + } + } + + private getSwagger(): Swagger { + return this.restService.getSwaggerInfo(this.restConfigId); + } + + public addChildNode4DynamicObject(node: any) { + const copyItem = WorkflowUtil.deepClone(node.definition.additionalProperties); + const key = Object.keys(node.value.value).length; + + const childrenNode = this.swaggerTreeConverterService + .schema2TreeNode(this.getSwagger(), key, copyItem); + + childrenNode.keyEditable = true; + node.value.value[key] = childrenNode.value; + + node.children.push(childrenNode); + } + + public addChildNode4ObjectArray(node: any) { + const copyItem = WorkflowUtil.deepClone(node.definition.items); + + const childrenNode = this.swaggerTreeConverterService + .schema2TreeNode( + this.getSwagger(), + node.children.length, + copyItem); + + node.value.value.push(childrenNode.value); + node.children.push(childrenNode); + } + + public deleteTreeNode(node: any) { + if ('array' === node.parent.type) { + // delete data + node.parent.value.value.splice(node.label, 1); + node.parent.children.splice(node.label, 1); + + // update node index + node.parent.children.forEach((childNode, index) => childNode.label = index); + } else if ('map' === node.parent.type) { + delete node.parent.value.value[node.label]; + for (let index = 0; index < node.parent.children.length; index++) { + const element = node.parent.children[index]; + if (element.label === node.label) { + node.parent.children.splice(index, 1); + break; + } + } + } + } + + public getCanInsert(node: any) { + if (undefined === this.canInsert) { + if (node.value.valueSource !== ValueSource[ValueSource.Definition]) { + return false; + } else { + return this.isArrayObject(node) || this.isDynamicObject(node); + } + } else { + return this.canInsert + } + } + + public getCanDelete(node: any) { + const parent = node.parent; + if (parent && + (this.isArrayObject(parent) || this.isDynamicObject(parent))) { + return true; + } else { + return false; + } + } + + public getObjectValueSource(): ValueSource[] { + const result = []; + this.valueSource.forEach(source => { + if (ValueSource.string != source) { + result.push(source); + } + }); + result.push(ValueSource.Definition); + return result; + } + + private isArrayObject(node: any): boolean { + return node.type === 'array'; + } + + private isDynamicObject(node: any): boolean { + return node.type === 'map'; + } +} -- cgit 1.2.3-korg