From 2f61f169fcf5a51ee2748026d3fa0848be503d6e Mon Sep 17 00:00:00 2001
From: Michael Hartung <michi@Michaels-MacBook-Pro.local>
Date: Wed, 11 Aug 2021 16:22:58 +0200
Subject: [PATCH] export as graphml button

---
 .../analysis-panel.component.html             | 36 +++++++++++--------
 .../analysis-panel.component.ts               |  9 +++--
 src/app/config.ts                             |  2 ++
 .../explorer-page.component.html              | 24 ++++++++++++-
 .../explorer-page/explorer-page.component.ts  |  9 ++++-
 .../netex-controller.service.ts               | 10 +++++-
 src/app/utils.ts                              | 14 ++++++++
 src/stylesheets/styles.scss                   |  2 +-
 8 files changed, 85 insertions(+), 21 deletions(-)

diff --git a/src/app/components/analysis-panel/analysis-panel.component.html b/src/app/components/analysis-panel/analysis-panel.component.html
index f2b31d21..27d87521 100644
--- a/src/app/components/analysis-panel/analysis-panel.component.html
+++ b/src/app/components/analysis-panel/analysis-panel.component.html
@@ -142,7 +142,7 @@
           <div class="network-footer-toolbar-inner-container">
 
             <ng-container *ngIf="myConfig.showFooterButtonScreenshot">
-              <button class="button is-primary is-rounded has-tooltip network-footer-toolbar-element"
+              <button class="button is-primary is-rounded has-tooltip network-footer-toolbar-element footer-buttons"
                       pTooltip="Take a screenshot of the current network." tooltipStyleClass="drgstn" tooltipPosition="top" (click)="toImage()">
                   <span class="icon">
                     <i class="fas fa-camera" aria-hidden="true"></i>
@@ -153,19 +153,27 @@
               </button>
             </ng-container>
 
-            <div class="field network-footer-toolbar-element">
-              <p class="control footer-buttons">
-                <a [href]="graphmlLink()" class="button is-success is-rounded has-tooltip"
-                   pTooltip="Export this network as .graphml file." tooltipStyleClass="drgstn" tooltipPosition="top">
-                  <span class="icon">
-                    <i class="fas fa-download" aria-hidden="true"></i>
-                  </span>
-                  <span [ngClass]="{'text-normal':smallStyle}">
-                    Export as .graphml
-                  </span>
-                </a>
-              </p>
-            </div>
+            <ng-container *ngIf="myConfig.showFooterButtonScreenshot">
+              <button
+                (click)="graphmlLink()"
+                class="
+                  button
+                  is-success is-rounded
+                  has-tooltip
+                  network-footer-toolbar-element
+                "
+                pTooltip="Export this network as .graphml file."
+                tooltipStyleClass="drgstn"
+                tooltipPosition="top"
+              >
+                <span class="icon">
+                  <i class="fas fa-download" aria-hidden="true"></i>
+                </span>
+                <span [ngClass]="{ 'text-normal': smallStyle }"
+                >Export as .graphml</span
+                >
+              </button>
+            </ng-container>
 
             <!--          <div class="field">-->
             <!--            <p class="control footer-buttons">-->
diff --git a/src/app/components/analysis-panel/analysis-panel.component.ts b/src/app/components/analysis-panel/analysis-panel.component.ts
index 23ed1cd4..c912f98a 100644
--- a/src/app/components/analysis-panel/analysis-panel.component.ts
+++ b/src/app/components/analysis-panel/analysis-panel.component.ts
@@ -32,7 +32,7 @@ import {NetworkSettings} from '../../network-settings';
 import {NetexControllerService} from 'src/app/services/netex-controller/netex-controller.service';
 import {defaultConfig, IConfig} from 'src/app/config';
 import { mapCustomEdge, mapCustomNode } from 'src/app/main-network';
-import { removeDuplicateObjectsFromList } from 'src/app/utils';
+import { downLoadFile, removeDuplicateObjectsFromList } from 'src/app/utils';
 
 
 declare var vis: any;
@@ -394,8 +394,11 @@ export class AnalysisPanelComponent implements OnInit, OnChanges {
     return `${environment.backend}task_result/?token=${this.token}&view=${view}&fmt=csv`;
   }
 
-  public graphmlLink(): string {
-    return `${environment.backend}graph_export/?token=${this.token}`;
+  public graphmlLink() {
+    const data = {nodes: this.nodeData.nodes.get(), edges: this.nodeData.edges.get()}
+    this.netex.graphmlLink(data).subscribe(response => {
+      return downLoadFile(response, "application/xml");
+    })
   }
 
   public inferEdgeGroup(edge: object): EdgeType {
diff --git a/src/app/config.ts b/src/app/config.ts
index 62a8ab8c..ead040c5 100644
--- a/src/app/config.ts
+++ b/src/app/config.ts
@@ -48,6 +48,7 @@ export interface IConfig {
   showFooter: boolean;
   showFooterButtonExpression: boolean;
   showFooterButtonScreenshot: boolean;
+  showFooterButtonExportGraphml: boolean;
   showLegend: boolean;
   showLegendNodes: boolean;
   showLegendEdges: boolean;
@@ -86,6 +87,7 @@ export const defaultConfig: IConfig = {
   showLegend: true,
   showFooterButtonExpression: true,
   showFooterButtonScreenshot: true,
+  showFooterButtonExportGraphml: true,
   identifier: 'symbol',
   interactionDrugProtein: 'DrugBank',
   interactionProteinProtein: 'STRING',
diff --git a/src/app/pages/explorer-page/explorer-page.component.html b/src/app/pages/explorer-page/explorer-page.component.html
index cb503e69..49c19fc8 100644
--- a/src/app/pages/explorer-page/explorer-page.component.html
+++ b/src/app/pages/explorer-page/explorer-page.component.html
@@ -175,7 +175,7 @@
                   <button
                     (click)="toImage()"
                     class="
-                      button
+                      button footer-buttons
                       is-primary is-rounded
                       has-tooltip
                       network-footer-toolbar-element
@@ -193,6 +193,28 @@
                   </button>
                 </ng-container>
 
+                <ng-container *ngIf="myConfig.showFooterButtonExportGraphml">
+                  <button
+                    (click)="graphmlLink()"
+                    class="
+                      button footer-buttons
+                      is-success is-rounded
+                      has-tooltip
+                      network-footer-toolbar-element
+                    "
+                    pTooltip="Export this network as .graphml file."
+                    tooltipStyleClass="drgstn"
+                    tooltipPosition="top"
+                  >
+                    <span class="icon">
+                      <i class="fas fa-download" aria-hidden="true"></i>
+                    </span>
+                    <span [ngClass]="{ 'text-normal': smallStyle }"
+                    >Export as .graphml</span
+                    >
+                  </button>
+                </ng-container>
+
                 <ng-container *ngIf="myConfig.showFooterButtonExpression">
                   <div
                     class="
diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts
index 5a1deefb..4a861930 100644
--- a/src/app/pages/explorer-page/explorer-page.component.ts
+++ b/src/app/pages/explorer-page/explorer-page.component.ts
@@ -25,7 +25,7 @@ import domtoimage from 'dom-to-image';
 import {NetworkSettings} from '../../network-settings';
 import {defaultConfig, EdgeGroup, IConfig, InteractionDatabase, NodeGroup} from '../../config';
 import {NetexControllerService} from 'src/app/services/netex-controller/netex-controller.service';
-import {removeDuplicateObjectsFromList} from '../../utils'
+import {downLoadFile, removeDuplicateObjectsFromList} from '../../utils'
 import * as merge from 'lodash/fp/merge';
 import { AnalysisPanelComponent } from 'src/app/components/analysis-panel/analysis-panel.component';
 
@@ -339,6 +339,13 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit {
     });
   }
 
+  public graphmlLink() {
+    const data = {nodes: this.nodeData.nodes.get(), edges: this.nodeData.edges.get()}
+    this.netex.graphmlLink(data).subscribe(response => {
+      return downLoadFile(response, "application/xml");
+    })
+  }
+
   public async openSummary(item: Wrapper, zoom: boolean) {
     this.selectedWrapper = item;
     if (zoom) {
diff --git a/src/app/services/netex-controller/netex-controller.service.ts b/src/app/services/netex-controller/netex-controller.service.ts
index 49772e96..4992123d 100644
--- a/src/app/services/netex-controller/netex-controller.service.ts
+++ b/src/app/services/netex-controller/netex-controller.service.ts
@@ -3,7 +3,7 @@ import {environment} from '../../../environments/environment';
 import {HttpClient, HttpParams} from '@angular/common/http';
 import {AlgorithmType, QuickAlgorithmType} from '../analysis/analysis.service';
 import { Observable } from 'rxjs';
-import { Tissue, Node} from 'src/app/interfaces';
+import { Tissue, Node, EdgeType} from 'src/app/interfaces';
 import { InteractionDrugProteinDB } from 'src/app/config';
 
 @Injectable({
@@ -107,4 +107,12 @@ export class NetexControllerService {
     }
     return this.http.post<any>(`${environment.backend}adjacent_drugs/`, params);
   }
+
+  public graphmlLink(graph_data: {edges: EdgeType[], nodes: Node[]}) {
+    /**
+     * Sends complete graph data to backend where it is written to graphml File.
+     * The file is returned as download for the user.
+     */
+    return this.http.post(`${environment.backend}graph_export/`, graph_data, {responseType: 'text'});
+  }
 }
diff --git a/src/app/utils.ts b/src/app/utils.ts
index 72b2bff4..e29a04f5 100644
--- a/src/app/utils.ts
+++ b/src/app/utils.ts
@@ -119,3 +119,17 @@ export function removeDuplicateObjectsFromList(nodes: Node[], attribute: string)
   return filteredArray;
 }
 
+/**
+ * Method is use to download file.
+ * @param data - Array Buffer data
+ * @param type - type of the document.
+ */
+export function downLoadFile(data: any, type: string) {
+  let blob = new Blob([data], { type: type});
+  var a = document.createElement("a");
+  a.href = URL.createObjectURL(blob);
+  a.download = 'test.graphml';
+  // start download
+  a.click();
+}
+
diff --git a/src/stylesheets/styles.scss b/src/stylesheets/styles.scss
index 88f76a0e..6a40599b 100644
--- a/src/stylesheets/styles.scss
+++ b/src/stylesheets/styles.scss
@@ -226,7 +226,7 @@
   }
 
   .footer-buttons {
-    margin-left: 20px;
+    margin-left: 10px;
     margin-right: 10px;
   }
 
-- 
GitLab