From 5c505f38fc00cdafd32f28007d4f10e1bd742186 Mon Sep 17 00:00:00 2001
From: Mhaned Oubounyt <m.oubounyt@tum.de>
Date: Sun, 5 Apr 2020 19:27:45 +0200
Subject: [PATCH] Analyses tabs

---
 src/app/analysis.service.ts                   |  5 +-
 src/app/app.module.ts                         |  7 +-
 .../analysis-window.component.html            | 48 +++++++------
 .../analysis-window.component.ts              |  4 +-
 .../protein-analysis.component.html           | 68 +++++++++++++++----
 .../protein-analysis.component.ts             | 32 ++++++---
 src/styles.scss                               |  3 -
 7 files changed, 114 insertions(+), 53 deletions(-)

diff --git a/src/app/analysis.service.ts b/src/app/analysis.service.ts
index 05d7d6fb..9bf57b53 100644
--- a/src/app/analysis.service.ts
+++ b/src/app/analysis.service.ts
@@ -40,7 +40,10 @@ export class AnalysisService {
   }
 
   resetSelection() {
-    this.selectedProteins = new Map<string, Protein>();
+    const oldSelection = this.selectedProteins.values();
+    for (const protein of oldSelection) {
+      this.removeProtein(protein);
+    }
   }
 
   inSelection(protein: Protein): boolean {
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 12e19347..f6875127 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,6 +1,6 @@
 import {BrowserModule} from '@angular/platform-browser';
 import {NgModule} from '@angular/core';
-import { NgSelectModule } from '@ng-select/ng-select';
+import {NgSelectModule} from '@ng-select/ng-select';
 
 import {CommonModule} from '@angular/common';
 import {FormsModule} from '@angular/forms';
@@ -16,7 +16,8 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
 import {ProteinAnalysisComponent} from './components/protein-analysis/protein-analysis.component';
 import {SelectDatasetComponent} from './components/select-dataset/select-dataset.component';
 import {AnalysisWindowComponent} from './components/analysis-window/analysis-window.component';
-import { TaskListComponent } from './components/task-list/task-list.component';
+import {TaskListComponent} from './components/task-list/task-list.component';
+import {AnalysisService} from './analysis.service';
 
 
 @NgModule({
@@ -40,7 +41,7 @@ import { TaskListComponent } from './components/task-list/task-list.component';
     HttpClientModule,
     BrowserAnimationsModule,
   ],
-  providers: [],
+  providers: [AnalysisService],
   bootstrap: [AppComponent]
 
 })
diff --git a/src/app/components/analysis-window/analysis-window.component.html b/src/app/components/analysis-window/analysis-window.component.html
index 25d99deb..52283666 100644
--- a/src/app/components/analysis-window/analysis-window.component.html
+++ b/src/app/components/analysis-window/analysis-window.component.html
@@ -22,36 +22,42 @@
         <footer class="card-footer">
           <div class="field has-addons">
             <p class="control">
-              <button class="button is-rounded" (click)="toggleDrugs(true)">
-      <span class="icon is-small">
-        <i class="fas fa-capsules"></i>
-      </span>
+              <button class="button is-rounded" [class.is-primary]="showDrugs" (click)="toggleDrugs(true)">
+                <span class="icon is-small">
+                  <i class="fas fa-capsules"></i>
+                </span>
                 <span>Drugs On</span>
               </button>
             </p>
             <p class="control">
-              <button class="button is-rounded" (click)="toggleDrugs(false)">
-      <span class="icon is-small">
-        <i class="fas fa-times"></i>
-      </span>
-                <span>Drugs Off</span>
+              <button class="button is-rounded" [class.is-primary]="!showDrugs" (click)="toggleDrugs(false)">
+                <span>Off</span>
               </button>
             </p>
           </div>
-          <button class="card-footer-item button is-primary">
-                <span class="icon">
-        <i class="fas fa-cloud-download-alt" aria-hidden="true"></i>
-      </span> <span>Export Results</span>
+          <button class="card-footer-item button is-primary" [disabled]="true">
+            <span class="icon">
+              <i class="fas fa-cloud-download-alt" aria-hidden="true"></i>
+            </span>
+            <span>
+              Export Results
+            </span>
           </button>
-          <button class="card-footer-item button">
-                <span class="icon">
-        <i class="fas fa-cloud-download-alt" aria-hidden="true"></i>
-      </span> <span>Save as PNG</span>
+          <button class="card-footer-item button" [disabled]="true">
+            <span class="icon">
+              <i class="fas fa-cloud-download-alt" aria-hidden="true"></i>
+            </span>
+            <span>
+              Save as PNG
+            </span>
           </button>
-          <button class="card-footer-item button is-danger">
-                <span class="icon">
-        <i class="fas fa-trash" aria-hidden="true"></i>
-      </span> <span>Delete Analysis</span>
+          <button class="card-footer-item button is-danger" [disabled]="true">
+            <span class="icon">
+              <i class="fas fa-trash" aria-hidden="true"></i>
+            </span>
+            <span>
+              Delete Analysis
+            </span>
           </button>
         </footer>
       </div>
diff --git a/src/app/components/analysis-window/analysis-window.component.ts b/src/app/components/analysis-window/analysis-window.component.ts
index 8f62e08c..e8d4e231 100644
--- a/src/app/components/analysis-window/analysis-window.component.ts
+++ b/src/app/components/analysis-window/analysis-window.component.ts
@@ -33,7 +33,7 @@ export class AnalysisWindowComponent implements OnInit, OnChanges {
   private network: any;
   private nodeData: { nodes: any, edges: any } = {nodes: null, edges: null};
   private drugNodes = [];
-  private showDrugs = false;
+  public showDrugs = false;
   private result: any;
 
   constructor(private http: HttpClient, private analysis: AnalysisService) {
@@ -55,6 +55,7 @@ export class AnalysisWindowComponent implements OnInit, OnChanges {
         this.result = result;
         this.networkEl.nativeElement.innerHTML = '';
         this.network = null;
+        this.showDrugs = false;
         this.nodeData = {nodes: null, edges: null};
         this.createNetwork(result);
       }
@@ -215,6 +216,7 @@ export class AnalysisWindowComponent implements OnInit, OnChanges {
       nodes.push(this.mapProteinToNode(protein));
     }
 
+    this.drugNodes = [];
     for (const drug of result.drugs) {
       this.drugNodes.push(this.mapDrugToNode(drug));
     }
diff --git a/src/app/components/protein-analysis/protein-analysis.component.html b/src/app/components/protein-analysis/protein-analysis.component.html
index 8cb73e17..38b0d7da 100644
--- a/src/app/components/protein-analysis/protein-analysis.component.html
+++ b/src/app/components/protein-analysis/protein-analysis.component.html
@@ -2,28 +2,66 @@
   <div class="modal-background"></div>
   <div class="modal-card">
     <header class="modal-card-head">
-      <p class="modal-card-title">Launch Protein Analysis</p>
-      <button class="delete" aria-label="close" (click)="close()"></button>
+      <p class="modal-card-title">Launch Analysis</p>
+      <button (click)="close()" class="delete" aria-label="close"></button>
     </header>
-    <div class="modal-card-body">
-      <div class="tabs">
+    <section class="modal-card-body">
+      <div class="tabs is-toggle is-medium is-fullwidth">
         <ul>
-          <li [class.is-active]="algorithm === 'dummy'"><a (click)="algorithm = 'dummy'">Dummy</a></li>
-          <li [class.is-active]="algorithm === 'trustrank'"><a (click)="algorithm = 'trustrank'">Trustrank</a></li>
+          <li [class.is-active]="algorithm === 'dummy'"><a (click)="algorithm = 'dummy'" class="is-boxed is-medium">Dummy</a>
+          </li>
+          <li [class.is-active]="algorithm === 'trustrank'"><a (click)="algorithm = 'trustrank'"
+                                                               class="is-boxed is-medium">Trustrank</a></li>
+          <li [class.is-active]="algorithm === 'keypathwayminer'"><a (click)="algorithm = 'keypathwayminer'"
+                                                                     class="is-boxed is-medium">KeyPathwayMiner</a></li>
+          <li [class.is-active]="algorithm === 'multisteiner'"><a (click)="algorithm = 'multisteiner'"
+                                                                  class="is-boxed is-medium">Multi-Steiner</a></li>
         </ul>
       </div>
-      <div *ngIf="algorithm === 'dummy'">
-        NO PARAMS
+
+      <div *ngIf="algorithm==='trustrank'">
+        <div class="field">
+          <p class="control has-icons-left has-icons-right">
+            <label>Strain</label>
+            <input [(ngModel)]="trustrankStrain" class="input" type="text" placeholder="Strain" required>
+          </p>
+          <p class="control has-icons-left has-icons-right">
+            <label>Damping Factor</label>
+            <input [(ngModel)]="trustrankDampingFactor" class="input" type="number" placeholder="Damping factor"
+                   min="0" max="1"
+                   required>
+          </p>
+          <p class="control has-icons-left has-icons-right">
+            <label>Result Size</label>
+            <input [(ngModel)]="trustrankResultSize" class="input" type="number" placeholder="Result size" required>
+          </p>
+        </div>
+
       </div>
-      <div *ngIf="algorithm === 'trustrank'">
-        SHOW PARAMETERS HERE LATER
+
+      <div *ngIf="algorithm==='keypathwayminer'">
+        <h1>Key Pathway Miner</h1>
       </div>
-    </div>
+
+      <div *ngIf="algorithm==='multisteiner'">
+        <h1>Multi-Steiner</h1>
+        <p class="control has-icons-left has-icons-right">
+          <label>Virus Strain</label>
+          <input [(ngModel)]="multisteinerStrain" class="input" type="text" placeholder="Virus Strain" required>
+        </p>
+        <p class="control has-icons-left has-icons-right">
+          <label>Number of Steiner trees to return</label>
+          <input [(ngModel)]="multisteinerNumTrees" class="input" type="number" min="1" max="25"
+                 placeholder="Number of Steiner trees to return" required>
+        </p>
+      </div>
+    </section>
+
     <footer class="modal-card-foot">
-      <button class="button is-success" (click)="startTask(); close()">
-        <span class="icon"><i class="fa fa-play"></i></span>
-        <span>Start</span>
-      </button>
+      <button (click)="startTask(); close()" class="button is-success">Launch</button>
+      <button (click)="close()" class="button">Close</button>
     </footer>
   </div>
 </div>
+
+
diff --git a/src/app/components/protein-analysis/protein-analysis.component.ts b/src/app/components/protein-analysis/protein-analysis.component.ts
index c0a45209..19266918 100644
--- a/src/app/components/protein-analysis/protein-analysis.component.ts
+++ b/src/app/components/protein-analysis/protein-analysis.component.ts
@@ -13,12 +13,20 @@ export class ProteinAnalysisComponent implements OnInit {
   @Output()
   public showChange = new EventEmitter<boolean>();
 
-  public algorithm: 'dummy' | 'trustrank' = 'dummy';
+  public algorithm: 'dummy' | 'trustrank' | 'keypathwayminer' | 'multisteiner';
+
+  // Trustrank Parameters
+  public trustrankStrain = 'SARS_CoV2';
+  public trustrankDampingFactor = 0.85;
+  public trustrankResultSize = 20;
+  public trustrankNumThreads = 1;
+  public trustrankDatasets = [];
+  public trustrankIgnoredEdgeTypes = [];
+
+  // Multisteiner Parameters
+  public multisteinerStrain = 'SARS_CoV2';
+  public multisteinerNumTrees = 5;
 
-  public strain = 'SARS_CoV2';
-  public dampingFactor = 0.85;
-  public resultSize = 20;
-  private /*sic!*/ numThreads = 1;
 
   constructor(public analysis: AnalysisService) {
   }
@@ -39,12 +47,18 @@ export class ProteinAnalysisComponent implements OnInit {
     if (this.algorithm === 'dummy') {
       // No parameters for dummy
     } else if (this.algorithm === 'trustrank') {
-      parameters.strain = this.strain;
+      parameters.strain = this.trustrankStrain;
       parameters.datasets = [];
       parameters.ignored_edge_types = [];
-      parameters.damping_factor = this.dampingFactor;
-      parameters.result_size = this.resultSize;
-      parameters.num_threads = this.numThreads;
+      parameters.damping_factor = this.trustrankDampingFactor;
+      parameters.result_size = this.trustrankResultSize;
+      parameters.num_threads = this.trustrankNumThreads;
+    } else if (this.algorithm === 'keypathwayminer') {
+      // TODO
+    } else if (this.algorithm === 'multisteiner') {
+      parameters.strain = this.multisteinerStrain;
+      parameters.num_trees = this.multisteinerNumTrees;
+
     }
 
     await this.analysis.startAnalysis(this.algorithm, parameters);
diff --git a/src/styles.scss b/src/styles.scss
index bfcd0ad5..443146df 100644
--- a/src/styles.scss
+++ b/src/styles.scss
@@ -137,9 +137,6 @@ div.covex.explorer {
   width: calc(100% - 20px);
   position: relative;
   margin-top: 0;
-  /* Just for looks*/
-  z-index: 30;
-  padding: 0;
 }
 
 i.fas.is-success {
-- 
GitLab