fix error while workflow is empty 09/27709/2
authorLvbo163 <lv.bo163@zte.com.cn>
Tue, 9 Jan 2018 11:31:52 +0000 (19:31 +0800)
committerLvbo163 <lv.bo163@zte.com.cn>
Tue, 9 Jan 2018 12:03:06 +0000 (20:03 +0800)
workflow select list error while workflow list is empty

Issue-ID: SDC-891

Change-Id: I3c92891efe4b323fcc6130b3ead6dcc7ff61af48
Signed-off-by: Lvbo163 <lv.bo163@zte.com.cn>
sdc-workflow-designer-ui/src/app/app.module.ts
sdc-workflow-designer-ui/src/app/components/canvas/canvas.component.ts
sdc-workflow-designer-ui/src/app/components/menu/menu.component.ts
sdc-workflow-designer-ui/src/app/components/menu/workflows/workflows.component.html
sdc-workflow-designer-ui/src/app/components/property/properties.component.ts
sdc-workflow-designer-ui/src/app/components/sequence-flow/sequence-flow.component.ts
sdc-workflow-designer-ui/src/app/services/broadcast.service.ts
sdc-workflow-designer-ui/src/app/services/jsplumb.service.ts
sdc-workflow-designer-ui/src/app/services/workflow-process.service.ts [deleted file]

index 4ce9eed..199bfcd 100644 (file)
@@ -43,12 +43,12 @@ import { RestTaskParametersComponent } from "./components/property/rest-task/res
 import { ParameterTreeComponent } from "./components/parameter-tree/parameter-tree.component";
 import { EditablePropertyComponent } from "./components/editable-property/editable-property.component";
 import { SwaggerTreeConverterService } from "./services/swagger-tree-converter.service";
-import { WorkflowProcessService } from "./services/workflow-process.service";
 import { IntermediateCatchEventComponent } from "./components/property/intermediate-catch-event/intermediate-catch-event.component";
 import { SequenceFlowComponent } from "./components/sequence-flow/sequence-flow.component";
 import { ScriptTaskComponent } from "./components/property/script-task/script-task.component";
 import { DragSelectDirective } from "./directive/drag-select/drag-select.directive";
 import { WorkflowsComponent } from "./components/menu/workflows/workflows.component";
+import { ModelService } from './services/model.service';
 
 @NgModule({
     declarations: [
@@ -98,7 +98,7 @@ import { WorkflowsComponent } from "./components/menu/workflows/workflows.compon
         JsPlumbService,
         SwaggerTreeConverterService,
         WorkflowConfigService,
-        WorkflowProcessService,
+        ModelService,
         WorkflowService
     ],
     bootstrap: [AppComponent]
index 453e6d5..1cf197d 100644 (file)
@@ -18,7 +18,7 @@ import { ActivatedRoute } from "@angular/router";
 import { DataAccessService } from "../../services/data-access/data-access.service";
 import { WorkflowService } from "../../services/workflow.service";
 import { PlanModel } from "../../model/workflow/plan-model";
-import { WorkflowProcessService } from "../../services/workflow-process.service";
+import { ModelService } from "../../services/model.service";
 import { SequenceFlow } from "../../model/workflow/sequence-flow";
 import { WorkflowNode } from "../../model/workflow/workflow-node";
 
@@ -42,7 +42,7 @@ export class CanvasComponent implements AfterViewInit {
         private jsPlumbService: JsPlumbService,
         private route: ActivatedRoute,
         private workflowService: WorkflowService,
-        private processService: WorkflowProcessService) {
+        private processService: ModelService) {
     }
 
     ngOnInit(): void {
index b395491..adad16c 100644 (file)
@@ -26,8 +26,19 @@ export class MenuComponent {
     @ViewChild(MicroserviceComponent) public microserviceComponent: MicroserviceComponent;
     @ViewChild(WorkflowsComponent) public workflowsComponent: WorkflowsComponent;
     public currentWorkflow = 'Workflows';
+    public workflows = [];
 
     constructor(private broadcastService: BroadcastService, private workflowService: WorkflowService) {
+        this.broadcastService.workflows.subscribe(wfs => {
+            this.workflows.splice(0, this.workflows.length);
+            if(wfs) {
+                wfs.forEach((value, key, map) => {
+                    this.workflows.push({label: value.planName, command: () => {
+                        this.workflowSelected(value.planName, value.plan);
+                    }});
+                });
+            }
+        });
     }
 
     public save(): void {
@@ -45,7 +56,7 @@ export class MenuComponent {
         this.workflowsComponent.show();
     }
 
-    public getWorkflows(planId: number) {
+    public getWorkflows() {
         const workflows = this.workflowService.getWorkflows();
         if(workflows) {
             const options = [];
index 5568ba6..0f6c7ff 100644 (file)
@@ -24,7 +24,7 @@ tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="tru
         <div class="modal-body">\r
             <ul class="list-group">\r
                     <li class="list-group-item d-flex justify-content-between align-items-center"\r
-                        *ngFor="let key of workflows.keys()">\r
+                        *ngFor="let key of workflows?.keys()">\r
                         <div style="width:380px"><input class="form-control" [(ngModel)]="workflows.get(key).planName"></div>\r
                         <div class="badge badge-danger badge-pill" (click)="deleteWorkflow(key)">\r
                             <i class="fa fa-minus"></i>\r
index 2aa552e..2091d83 100644 (file)
@@ -16,7 +16,7 @@ import { WorkflowNode } from '../../model/workflow/workflow-node';
 import { BroadcastService } from '../../services/broadcast.service';
 import { JsPlumbService } from '../../services/jsplumb.service';
 import { PlanTreeviewItem } from "../../model/plan-treeview-item";
-import { WorkflowProcessService } from "../../services/workflow-process.service";
+import { ModelService } from "../../services/model.service";
 
 /**
  * property component presents information of a workflow node.
@@ -36,7 +36,7 @@ export class PropertiesComponent implements AfterViewInit {
 
     constructor(private broadcastService: BroadcastService,
                 private jsPlumnService: JsPlumbService,
-                private processService: WorkflowProcessService) {
+                private processService: ModelService) {
 
     }
 
index 0109e27..c4a70ec 100644 (file)
@@ -16,7 +16,7 @@ import { TreeNode } from 'primeng/primeng';
 import { SequenceFlow } from '../../model/workflow/sequence-flow';
 import { BroadcastService } from '../../services/broadcast.service';
 import { JsPlumbService } from '../../services/jsplumb.service';
-import { WorkflowProcessService } from '../../services/workflow-process.service';
+import { ModelService } from '../../services/model.service';
 
 /**
  * property component presents information of a workflow node.
@@ -33,7 +33,7 @@ export class SequenceFlowComponent implements AfterViewInit {
     public show = false;
 
     constructor(private broadcastService: BroadcastService,
-                private processService: WorkflowProcessService,
+                private processService: ModelService,
                 private jsPlumbService: JsPlumbService) {
 
     }
index f28c7a6..dd75c45 100644 (file)
@@ -27,7 +27,7 @@ export class BroadcastService {
     public jsPlumbInstance = new Subject<any>();
     public jsPlumbInstance$ = this.jsPlumbInstance.asObservable();
 
-    public workflows = new Subject<PlanModel[]>();
+    public workflows = new Subject<Map<number, any>>();
     public workflows$ = this.workflows.asObservable();
 
     public workflow = new Subject<PlanModel>();
index bf7a690..f0013bc 100644 (file)
@@ -12,7 +12,7 @@
 \r
 import { Injectable } from '@angular/core';\r
 import * as jsp from 'jsplumb';\r
-import { WorkflowProcessService } from "./workflow-process.service";\r
+import { ModelService } from "./model.service";\r
 import { BroadcastService } from "./broadcast.service";\r
 import { Subscription } from 'rxjs/Subscription';\r
 import { WorkflowNode } from "../model/workflow/workflow-node";\r
@@ -26,7 +26,7 @@ export class JsPlumbService {
     public jsplumbInstance;\r
     public subscriptionMap = new Map<string, Subscription>();\r
 \r
-    constructor(private processService: WorkflowProcessService, private broadcastService: BroadcastService) {\r
+    constructor(private processService: ModelService, private broadcastService: BroadcastService) {\r
         this.jsplumbInstance = jsp.jsPlumb.getInstance({\r
             Container: 'canvas'\r
         });\r
diff --git a/sdc-workflow-designer-ui/src/app/services/workflow-process.service.ts b/sdc-workflow-designer-ui/src/app/services/workflow-process.service.ts
deleted file mode 100644 (file)
index 5afb74d..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-/**\r
- * Copyright (c) 2017 ZTE Corporation.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * and the Apache License 2.0 which both accompany this distribution,\r
- * and are available at http://www.eclipse.org/legal/epl-v10.html\r
- * and http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Contributors:\r
- *     ZTE - initial API and implementation and/or initial documentation\r
- */\r
-\r
-import { Injectable } from '@angular/core';\r
-import { WorkflowNode } from "../model/workflow/workflow-node";\r
-import { PlanModel } from "../model/workflow/plan-model";\r
-import { Position } from "../model/workflow/position";\r
-import { NodeType } from "../model/workflow/node-type.enum";\r
-import { StartEvent } from "../model/workflow/start-event";\r
-import { SequenceFlow } from "../model/workflow/sequence-flow";\r
-import { RestTask } from "../model/workflow/rest-task";\r
-import { PlanTreeviewItem } from "../model/plan-treeview-item";\r
-import { WorkflowConfigService } from "./workflow-config.service";\r
-import { Swagger, SwaggerModelSimple, SwaggerReferenceObject } from "../model/swagger";\r
-import { WorkflowService } from "./workflow.service";\r
-import { IntermediateCatchEvent } from "../model/workflow/intermediate-catch-event";\r
-import { ScriptTask } from "../model/workflow/script-task";\r
-\r
-/**\r
- * WorkflowService\r
- * provides all of the operations about workflow operations.\r
- */\r
-@Injectable()\r
-export class WorkflowProcessService {\r
-\r
-    constructor(private workflowService: WorkflowService, private configService: WorkflowConfigService) {\r
-\r
-    }\r
-\r
-    public getProcess(): WorkflowNode[] {\r
-        return this.workflowService.planModel.nodes;\r
-    }\r
-\r
-    public addNode(name: string, type: string, top: number, left: number): WorkflowNode {\r
-        let node: WorkflowNode;\r
-        switch (type) {\r
-            case NodeType[NodeType.startEvent]:\r
-                node = new StartEvent(this.createId(), name, type, new Position(top, left), []);\r
-                break;\r
-            case NodeType[NodeType.restTask]:\r
-                node = new RestTask(this.createId(), name, type, new Position(top, left), []);\r
-                break;\r
-            case NodeType[NodeType.intermediateCatchEvent]:\r
-                node = new IntermediateCatchEvent(this.createId(), name, type, new Position(top, left), []);\r
-                break;\r
-            case NodeType[NodeType.scriptTask]:\r
-                node = new ScriptTask(this.createId(), name, type, new Position(top, left), []);\r
-                break;\r
-            default:\r
-                node = new WorkflowNode(this.createId(), name, type, new Position(top, left), []);\r
-                break;\r
-        }\r
-\r
-        this.getProcess().push(node);\r
-        return node;\r
-    }\r
-\r
-    public deleteNode(nodeId: string): WorkflowNode {\r
-        // delete related connections\r
-        this.getProcess().forEach(node => this.deleteSequenceFlow(node.id, nodeId));\r
-\r
-        // delete current node\r
-        const index = this.getProcess().findIndex(node => node.id === nodeId);\r
-        if (index !== -1) {\r
-            const node = this.getProcess().splice(index, 1)[0];\r
-            node.sequenceFlows = [];\r
-            return node;\r
-        }\r
-\r
-        return undefined;\r
-    }\r
-\r
-    public addSequenceFlow(sourceId: string, targetId: string) {\r
-        const node = this.getNodeById(sourceId);\r
-        if (node) {\r
-            const index = node.sequenceFlows.findIndex(sequenceFlow => sequenceFlow.targetRef === targetId);\r
-            if (index === -1) {\r
-                node.sequenceFlows.push(new SequenceFlow(sourceId, targetId));\r
-            }\r
-        }\r
-    }\r
-\r
-    public deleteSequenceFlow(sourceId: string, targetId: string) {\r
-        const node = this.getNodeById(sourceId);\r
-        if (node) {\r
-            const index = node.sequenceFlows.findIndex(sequenceFlow => sequenceFlow.targetRef === targetId);\r
-            if (index !== -1) {\r
-                node.sequenceFlows.splice(index, 1);\r
-            }\r
-        }\r
-    }\r
-\r
-    public getSequenceFlow(sourceRef: string, targetRef: string): SequenceFlow {\r
-        const node = this.getNodeById(sourceRef);\r
-        if (node) {\r
-            const sequenceFlow = node.sequenceFlows.find(tmp => tmp.targetRef === targetRef);\r
-            return sequenceFlow;\r
-        } else {\r
-            return undefined;\r
-        }\r
-    }\r
-\r
-    public getPlanParameters(nodeId: string): PlanTreeviewItem[] {\r
-        const preNodeList = new Array<WorkflowNode>();\r
-        this.getPreNodes(nodeId, preNodeList);\r
-\r
-        return this.loadNodeOutputs(preNodeList);\r
-    }\r
-\r
-    private loadNodeOutputs(nodes: WorkflowNode[]): PlanTreeviewItem[] {\r
-        const params = new Array<PlanTreeviewItem>();\r
-        nodes.forEach(node => {\r
-            switch (node.type) {\r
-                case NodeType[NodeType.startEvent]:\r
-                    params.push(this.loadOutput4StartEvent(<StartEvent>node));\r
-                    break;\r
-                case NodeType[NodeType.restTask]:\r
-                    params.push(this.loadOutput4RestTask(<RestTask>node));\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-        });\r
-\r
-        return params;\r
-    }\r
-\r
-    private loadOutput4StartEvent(node: StartEvent): PlanTreeviewItem {\r
-        const startItem = new PlanTreeviewItem(node.name, `[${node.id}]`, []);\r
-        node.parameters.map(param =>\r
-            startItem.children.push(new PlanTreeviewItem(param.name, `[${param.name}]`, [])));\r
-        return startItem;\r
-    }\r
-\r
-    private loadOutput4RestTask(node: RestTask): PlanTreeviewItem {\r
-        const item = new PlanTreeviewItem(node.name, `[${node.id}]`, []);\r
-        item.children.push(this.createStatusCodeTreeViewItem(node.id));\r
-\r
-        if (node.responses.length !== 0) { // load rest responses\r
-            const responseItem = this.createResponseTreeViewItem(node.id);\r
-            item.children.push(responseItem);\r
-            if (node.responses[0]) {\r
-                const swagger = this.configService.getSwaggerInfo(node.serviceName, node.serviceVersion);\r
-                const swaggerDefinition = this.configService.getDefinition(swagger, node.responses[0].schema.$ref);\r
-                this.loadParamsBySwaggerDefinition(responseItem, swagger, <SwaggerModelSimple>swaggerDefinition);\r
-            }\r
-        }\r
-\r
-        return item;\r
-    }\r
-\r
-    private createStatusCodeTreeViewItem(nodeId: string): PlanTreeviewItem {\r
-        return new PlanTreeviewItem('statusCode', `[${nodeId}].[statusCode]`, []);\r
-    }\r
-\r
-    private createResponseTreeViewItem(nodeId: string): PlanTreeviewItem {\r
-        return new PlanTreeviewItem('response', `[${nodeId}].[responseBody]`, []);\r
-    }\r
-\r
-    private loadParamsBySwaggerDefinition(parentItem: PlanTreeviewItem, swagger: Swagger, definition: SwaggerModelSimple) {\r
-        Object.getOwnPropertyNames(definition.properties).map(key => {\r
-            const property = definition.properties[key];\r
-            const value = `${parentItem.value}.[${key}]`;\r
-            const propertyItem = new PlanTreeviewItem(key, value, []);\r
-            parentItem.children.push(propertyItem);\r
-\r
-            if (property instanceof SwaggerReferenceObject) {\r
-                const propertyDefinition = this.configService.getDefinition(swagger, property.$ref);\r
-                this.loadParamsBySwaggerDefinition(propertyItem, swagger,\r
-                    <SwaggerModelSimple>propertyDefinition);\r
-            }\r
-\r
-            return propertyItem;\r
-        });\r
-    }\r
-\r
-    public getPreNodes(nodeId: string, preNodes: WorkflowNode[]) {\r
-        const preNode4CurrentNode = [];\r
-        this.getProcess().forEach(node => {\r
-            if (this.isPreNode(node, nodeId)) {\r
-                const existNode = preNodes.find(tmpNode => tmpNode.id === node.id);\r
-                if (existNode) {\r
-                    // current node already exists in preNodes. this could avoid loop circle.\r
-                } else {\r
-                    preNode4CurrentNode.push(node);\r
-                    preNodes.push(node);\r
-                }\r
-            }\r
-        });\r
-\r
-        preNode4CurrentNode.forEach(node => this.getPreNodes(node.id, preNodes));\r
-    }\r
-\r
-    public isPreNode(preNode: WorkflowNode, id: string): boolean {\r
-        const targetNode = preNode.sequenceFlows.find(connection => connection.targetRef === id);\r
-        return targetNode !== undefined;\r
-    }\r
-\r
-    public getNodeById(sourceId: string): WorkflowNode {\r
-        return this.getProcess().find(node => node.id === sourceId);\r
-    }\r
-\r
-    private createId() {\r
-        const idSet = new Set();\r
-        this.getProcess().forEach(node => idSet.add(node.id));\r
-\r
-        for (let i = 0; i < idSet.size; i++) {\r
-            if (!idSet.has('node' + i)) {\r
-                return 'node' + i;\r
-            }\r
-        }\r
-\r
-        return 'node' + idSet.size;\r
-    }\r
-}\r