From 074ab925d65665b22506c9462dfe4e71984783d2 Mon Sep 17 00:00:00 2001
From: Florian Lambers <fl462057@fh-muenster.de>
Date: Mon, 29 Nov 2021 15:03:50 +0100
Subject: [PATCH] added flag to frontend

---
 .../Testgenerator/rest/dto/BPMNFlowDTO.java   | 11 +++++
 .../rest/dto/FlowElementDTO.java              |  9 ++++
 .../rest/service/flow/FlowController.java     | 17 +++++++-
 .../bpmn-diagram/bpmn-diagram.component.ts    |  2 +-
 .../app/components/flows/flows.component.html |  4 ++
 .../app/components/flows/flows.component.ts   |  2 +
 .../app/components/test/test.component.html   |  7 +++-
 .../src/app/components/test/test.component.ts | 42 ++++++++++++++++++-
 .../src/app/models/bpmn-flow-element.ts       |  3 +-
 .../src/app/models/bpmn-flow.ts               |  1 +
 .../testgenerator-web/src/index.html          | 14 +++++++
 11 files changed, 107 insertions(+), 5 deletions(-)

diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/BPMNFlowDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/BPMNFlowDTO.java
index 6395060..6650737 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/BPMNFlowDTO.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/BPMNFlowDTO.java
@@ -2,11 +2,14 @@ package de.fhmuenster.masterthesis.Testgenerator.rest.dto;
 
 import java.util.List;
 
+import de.fhmuenster.masterthesis.testgeneratorDSL.Flag;
+
 public class BPMNFlowDTO {
 
 	private String name;
 	private List<FlowElementDTO> flowElements;
 	private long testCount;
+	private String flag;
 	
 	public BPMNFlowDTO() {
 	}
@@ -34,4 +37,12 @@ public class BPMNFlowDTO {
 	public void setTestCount(long testCount) {
 		this.testCount = testCount;
 	}
+
+	public String getFlag() {
+		return flag;
+	}
+
+	public void setFlag(String flag) {
+		this.flag = flag;
+	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementDTO.java
index 6bb6740..247ea41 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementDTO.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementDTO.java
@@ -3,6 +3,7 @@ package de.fhmuenster.masterthesis.Testgenerator.rest.dto;
 public class FlowElementDTO {
 
 	private String id;
+	private String flag;
 	
 	public FlowElementDTO() {
 	}
@@ -14,4 +15,12 @@ public class FlowElementDTO {
 	public void setId(String id) {
 		this.id = id;
 	}
+
+	public String getFlag() {
+		return flag;
+	}
+
+	public void setFlag(String flag) {
+		this.flag = flag;
+	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/flow/FlowController.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/flow/FlowController.java
index 4573c9a..004f3ba 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/flow/FlowController.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/flow/FlowController.java
@@ -50,9 +50,14 @@ public class FlowController {
 		Project projectForId = projectService.getProjectForId(projectId);
 		
 		List<Flow> flows = flowService.getFlows(projectForId.getProjectDirectories());
+		
 		Map<String, Long> flowTestcount = testService.getFlowTestcount(projectForId.getProjectDirectories());
 		List<BPMNFlowDTO> flowDtos = MAPPER_FLOW.mapToList(flows, BPMNFlowDTO.class);
 		
+		for(int i=0; i < flows.size(); i++) {
+			flowDtos.get(i).setFlag(flows.get(i).getFlag().getName());
+		}
+		
 		for (Entry<String, Long> testcount : flowTestcount.entrySet()) {
 			for (BPMNFlowDTO bpmnFlowDTO : flowDtos) {
 				if(bpmnFlowDTO.getName().equals(testcount.getKey())) {
@@ -61,6 +66,8 @@ public class FlowController {
 			}
 		}
 		
+		
+		
 		BPMNFlowSetDTO dto = new BPMNFlowSetDTO();
 		dto.setFlows(flowDtos);
 		
@@ -72,7 +79,15 @@ public class FlowController {
 		Project projectForId = projectService.getProjectForId(projectId);
 		
 		Flow flow = flowService.getFlow(projectForId.getProjectDirectories(), flowId);
-		return MAPPER_FLOW.map(flow, BPMNFlowDTO.class);
+		
+		BPMNFlowDTO mappedFlow = MAPPER_FLOW.map(flow, BPMNFlowDTO.class);
+		
+		for(int i=0; i < mappedFlow.getFlowElements().size(); i++) {
+			FlowElementDTO element = mappedFlow.getFlowElements().get(i);
+			element.setFlag(flow.getInclElements().get(i).getFlag().getName());
+		}
+		
+		return mappedFlow;
 	}
 	
 	@RequestMapping(path = "/project/{projectId}/servicetask/delegate", method = RequestMethod.GET)
diff --git a/testgenerator-web/testgenerator-web/src/app/components/bpmn-diagram/bpmn-diagram.component.ts b/testgenerator-web/testgenerator-web/src/app/components/bpmn-diagram/bpmn-diagram.component.ts
index 410bb67..9a5fab9 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/bpmn-diagram/bpmn-diagram.component.ts
+++ b/testgenerator-web/testgenerator-web/src/app/components/bpmn-diagram/bpmn-diagram.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, AfterContentInit, OnDestroy, ViewChild, ElementRef, Input, ViewChildren } from '@angular/core';
+import { Component, OnInit, AfterContentInit, OnDestroy, ViewChild, ElementRef, Input, ViewChildren, AfterViewInit } from '@angular/core';
 import * as BpmnJS from 'bpmn-js/dist/bpmn-viewer.production.min.js';
 import { BPMNFlow } from 'src/app/models/bpmn-flow';
 
diff --git a/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.html b/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.html
index 319779c..eddde30 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.html
+++ b/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.html
@@ -24,6 +24,10 @@
         <div *ngFor="let flow of flowSet.flows; let i=index">
             <hr *ngIf="i > 0">
             <div class="testgen-flow">
+                <span class="badge bg-danger" *ngIf="flow.flag && flow.flag === 'RED'">&nbsp;</span>
+                <span class="badge bg-warning" *ngIf="flow.flag && flow.flag === 'YELLOW'">&nbsp;</span>
+                <span class="badge bg-success" *ngIf="flow.flag && flow.flag === 'GREEN'">&nbsp;</span>
+
                 <h4 [ngClass]="{'testgen-flow-highlight': activeFlow.name === flow.name}" class="testgen-flow-name" i18n="flow name">{{flow.name}} - (Number of generated tests: {{flow.testCount}})</h4>
                 <p *ngIf="detailFlowVisible" class="testgen-flow-flowlist">{{flow | flow}}</p>
 
diff --git a/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.ts b/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.ts
index f71b104..5e255ad 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.ts
+++ b/testgenerator-web/testgenerator-web/src/app/components/flows/flows.component.ts
@@ -52,6 +52,7 @@ export class FlowsComponent implements OnInit {
     try {
       let result = await this.flowService.getFlows(this.actualProject);
       this.flowSet = result;
+      console.log(this.flowSet);
       this.activeFlow = this.flowSet.flows[0];
     } finally {
       this.isFlowLoading = false;
@@ -71,6 +72,7 @@ export class FlowsComponent implements OnInit {
   async highlight(flow: BPMNFlow) {
     this.activeFlow = flow;
     window.scrollTo(0, 0);
+    
   }
 
   async onFlowVisibility() {
diff --git a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html
index d02ec66..836b680 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html
+++ b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html
@@ -4,6 +4,11 @@
     </h6>
     <div class="row">
         <div class="col-md-12" *ngIf="!isLoading && !isTestLoading && testcase">
+            <!--
+            <div class="row">
+                <app-bpmn-diagram [diagram]="diagram" [flow]="flow"></app-bpmn-diagram>
+            </div>
+            -->
             <p class="title" *ngIf="isEdit" i18n="edit test">Edit test</p>
             <p class="title" *ngIf="!isEdit" i18n="create test">Create test</p>
 
@@ -47,7 +52,7 @@
                 <div formArrayName="taskVariableList">
                     <div class="testgen-taskvariable-container" *ngFor="let taskVariable of testcase.taskVariableList; let i=index">
                         <hr *ngIf="i > 0">
-                        <div class="testgen-testtask" [formGroupName]="i">
+                        <div [ngClass]="setClasses(taskVariable.task)" [formGroupName]="i">
                             <h3>{{taskVariable.task}}</h3>
 
                             <div *ngFor="let variableValue of taskVariable.variableValues; let v=index">
diff --git a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts
index 8777bc2..788d2a3 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts
+++ b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts
@@ -12,6 +12,9 @@ import { VariableProposals } from 'src/app/models/variable-proposals';
 import { VariableValueEndCheck } from 'src/app/models/variable-value-endcheck';
 import { ServiceWithMock } from 'src/app/models/service-with-mock';
 import { ExternalTopicWithMocks } from 'src/app/models/external-topic-with-mocks';
+import { BPMNFlow } from 'src/app/models/bpmn-flow';
+import { FlowService } from 'src/app/services/flow.service';
+import { FileService } from 'src/app/services/file.service';
 
 @Component({
   selector: 'app-test',
@@ -42,7 +45,12 @@ export class TestComponent implements OnInit {
 
   public formGroup: FormGroup;
 
-  constructor(private _fb: FormBuilder, private testService: TestService, private router: Router, private route: ActivatedRoute) {
+  flow: BPMNFlow;
+  diagram: string;
+  isDiagramLoading: boolean;
+
+  constructor(private _fb: FormBuilder, private testService: TestService, private router: Router, private route: ActivatedRoute,
+    private flowService: FlowService, private fileService: FileService) {
     this.route.params.subscribe(params => {
       this.actualProject = params['projectId'];
       this.actualFlow = params['flowId'];
@@ -65,6 +73,7 @@ export class TestComponent implements OnInit {
     }
 
     this.initTestcase();
+    this.loadBPMNDiagram();
 
     this.isLoading = false;
   }
@@ -177,6 +186,10 @@ export class TestComponent implements OnInit {
       this.flowInfo = result;
       this.cleanUpServiceWithMocks();
       this.initVariableDataTypes();
+
+      let result2 = await this.flowService.getFlow(this.actualProject, this.actualFlow);
+      this.flow = result2;
+
     } finally {
       this.isInfoLoading = false;
     }
@@ -475,4 +488,31 @@ export class TestComponent implements OnInit {
 
     return null;
   }
+
+  async loadBPMNDiagram() {
+    this.isDiagramLoading = true;
+    try {
+      let result = await this.fileService.getBPMNDiagram(this.actualProject);
+      this.diagram = result;
+    } finally {
+      this.isDiagramLoading = false;
+    }
+  }
+
+  private setClasses(task: string) {
+    return {
+      'testgen-testtask': true,
+      'alert alert-danger': this.checkIfElementIsRed(task)
+    };
+  }
+
+  private checkIfElementIsRed(task: string): boolean {
+    for(let i=0; i < this.flow.flowElements.length; i++) {
+      if(this.flow.flowElements[i].flag === 'RED') {
+        return true;
+      }
+    }
+
+    return false;
+  }
 }
diff --git a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-element.ts b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-element.ts
index 1da3401..b346782 100644
--- a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-element.ts
+++ b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-element.ts
@@ -1,4 +1,5 @@
 export interface BPMNFlowElement {
     id: string;
-    name: string;  
+    name: string;
+    flag: string;
 }
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow.ts b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow.ts
index 4353ee0..57c9876 100644
--- a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow.ts
+++ b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow.ts
@@ -4,4 +4,5 @@ export interface BPMNFlow {
     name: string;
     flowElements: Array<BPMNFlowElement>;
     testCount: number;
+    flag: string;
 }
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/index.html b/testgenerator-web/testgenerator-web/src/index.html
index f93200c..dec746e 100644
--- a/testgenerator-web/testgenerator-web/src/index.html
+++ b/testgenerator-web/testgenerator-web/src/index.html
@@ -10,6 +10,20 @@
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
 </head>
 
+<style>
+  .testgen-highlight:not(.djs-connection) .djs-visual> :nth-child(1) {
+    fill: #ffbb33 !important;
+  }
+  .testgen-highlight.djs-connection .djs-visual> :nth-child(1) {
+    stroke: #ffbb33 !important;
+    /**#4285F4*/
+    /**#ffbb33*/
+    /**#00C851*/
+    /**#ff4444*/
+  }
+</style>
+
+
 <body class="d-flex flex-column min-vh-100">
 
     <app-root></app-root>
-- 
GitLab