Skip to content
Snippets Groups Projects
Commit 652fea0f authored by Hartung, Michael's avatar Hartung, Michael
Browse files

csv export in frontend

parent d070acf1
Branches csv_export
Tags
No related merge requests found
...@@ -22,6 +22,7 @@ speed-measure-plugin*.json ...@@ -22,6 +22,7 @@ speed-measure-plugin*.json
*.launch *.launch
.settings/ .settings/
*.sublime-workspace *.sublime-workspace
.vscode/
# IDE - VSCode # IDE - VSCode
.vscode/* .vscode/*
...@@ -48,6 +49,7 @@ Thumbs.db ...@@ -48,6 +49,7 @@ Thumbs.db
.idea .idea
drugsTone-build drugsTone-build
package-lock.json package-lock.json
netex/
.ipynb_checkpoints/ .ipynb_checkpoints/
*.ipynb *.ipynb
......
This diff is collapsed.
...@@ -397,8 +397,8 @@ ...@@ -397,8 +397,8 @@
</div> </div>
<div class="column"> <div class="column">
<div class="field has-addons is-pulled-right m-1"> <div class="field has-addons is-pulled-right m-1">
<a <button
[href]="downloadLink('drugs')" (click)="downloadNodes('drug')"
class="button is-primary control is-outlined is-rounded is-pulled-right is-small" class="button is-primary control is-outlined is-rounded is-pulled-right is-small"
> >
<app-fa-solid-icon <app-fa-solid-icon
...@@ -406,7 +406,7 @@ ...@@ -406,7 +406,7 @@
title="download resulting drugs" title="download resulting drugs"
></app-fa-solid-icon> ></app-fa-solid-icon>
<span>Download</span> <span>Download</span>
</a> </button>
</div> </div>
<div <div
...@@ -482,8 +482,8 @@ ...@@ -482,8 +482,8 @@
<div class="column"> <div class="column">
<div class="field has-addons is-pulled-right m-1 control"> <div class="field has-addons is-pulled-right m-1 control">
<a <button
[href]="downloadLink('proteins')" (click)="downloadNodes('protein')"
class="button is-primary is-rounded is-outlined is-pulled-right is-small" class="button is-primary is-rounded is-outlined is-pulled-right is-small"
> >
<app-fa-solid-icon <app-fa-solid-icon
...@@ -491,7 +491,7 @@ ...@@ -491,7 +491,7 @@
title="download resulting proteins" title="download resulting proteins"
></app-fa-solid-icon> ></app-fa-solid-icon>
<span>Download</span> <span>Download</span>
</a> </button>
</div> </div>
<div <div
class="field has-addons is-pulled-right m-1" class="field has-addons is-pulled-right m-1"
......
...@@ -32,6 +32,7 @@ import {NetworkHandlerService} from 'src/app/services/network-handler/network-ha ...@@ -32,6 +32,7 @@ import {NetworkHandlerService} from 'src/app/services/network-handler/network-ha
import {LegendService} from 'src/app/services/legend-service/legend-service.service'; import {LegendService} from 'src/app/services/legend-service/legend-service.service';
import {LoadingScreenService} from 'src/app/services/loading-screen/loading-screen.service'; import {LoadingScreenService} from 'src/app/services/loading-screen/loading-screen.service';
import {version} from '../../../version'; import {version} from '../../../version';
import {downloadCSV} from 'src/app/utils'
declare var vis: any; declare var vis: any;
...@@ -457,8 +458,16 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit ...@@ -457,8 +458,16 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit
} }
} }
public downloadLink(view: string): string { public downloadNodes(view: string) {
return `${this.netex.getBackend()}task_result/?token=${this.token}&view=${view}&fmt=csv`; const data = [];
const nodes = this.nodeData.nodes.get();
nodes.forEach((node) => {
if (node.drugstoneType === view) {
data.push(node);
}
})
const columns = ['label', 'symbol', 'uniprot', 'ensg', 'entrez', 'proteinName', 'isSeed', 'score', 'rank', 'status'];
downloadCSV(data, columns, `drugstone_${view}`);
} }
/** /**
......
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service';
import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service'; import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service';
import { downLoadFile } from 'src/app/utils'; import { downLoadFile, downloadCSV } from 'src/app/utils';
import {NetworkHandlerService} from "../../../../services/network-handler/network-handler.service"; import {NetworkHandlerService} from "../../../../services/network-handler/network-handler.service";
@Component({ @Component({
...@@ -21,6 +21,7 @@ export class DownloadButtonComponent implements OnInit { ...@@ -21,6 +21,7 @@ export class DownloadButtonComponent implements OnInit {
public downloadLink(fmt) { public downloadLink(fmt) {
const data = {nodes: this.nodeData.nodes.get(), edges: this.nodeData.edges.get(), fmt: fmt}; const data = {nodes: this.nodeData.nodes.get(), edges: this.nodeData.edges.get(), fmt: fmt};
this.netex.graphExport(data).subscribe(response => { this.netex.graphExport(data).subscribe(response => {
return downLoadFile(response, `application/${fmt}`, fmt); return downLoadFile(response, `application/${fmt}`, fmt);
}); });
......
// From https://stackoverflow.com/a/27709336/3850564 // From https://stackoverflow.com/a/27709336/3850564
import {ɵisListLikeIterable} from '@angular/core'; import {ɵisListLikeIterable} from '@angular/core';
import {Node} from './interfaces'; import {Node} from './interfaces';
export function getGradientColor(startColor: string, endColor: string, percent: number) { export function getGradientColor(startColor: string, endColor: string, percent: number) {
// strip the leading # if it's there // strip the leading # if it's there
startColor = startColor.replace(/^\s*#|\s*$/g, ''); startColor = startColor.replace(/^\s*#|\s*$/g, '');
...@@ -133,11 +133,11 @@ export function removeDuplicateObjectsFromList(nodes: Node[], attribute: string) ...@@ -133,11 +133,11 @@ export function removeDuplicateObjectsFromList(nodes: Node[], attribute: string)
* @param data - Array Buffer data * @param data - Array Buffer data
* @param type - type of the document. * @param type - type of the document.
*/ */
export function downLoadFile(data: any, type: string, fmt: string) { export function downLoadFile(data: any, type: string, fmt: string, label: string = 'drugstone_network') {
let blob = new Blob([data], {type: type}); let blob = new Blob([data], {type: type});
var a = document.createElement('a'); var a = document.createElement('a');
a.href = URL.createObjectURL(blob); a.href = URL.createObjectURL(blob);
a.download = `drugstone_network_${new Date().getTime()}.${fmt}`; a.download = `${label}_${new Date().getTime()}.${fmt}`;
a.click(); a.click();
} }
...@@ -326,3 +326,37 @@ export function pieChartContextRenderer({ctx, x, y, state: {selected, hover}, st ...@@ -326,3 +326,37 @@ export function pieChartContextRenderer({ctx, x, y, state: {selected, hover}, st
}; };
} }
export const downloadCSV = function(array: any[], columns: string[], label: string = 'drugstone_csv') {
// test which columns occur in array elements, function should not fail if columns do not occur
const headerColumns = [];
columns.forEach((col) => {
if (col in array[0]) {
headerColumns.push(col);
}
})
// headerColumns has all attributes from 'columns' that appear in the elements of 'array'
let output = headerColumns.join(",") + "\n";
// fetch data from array, consider only attributes in headerColumns
array.forEach(el => {
const row = [];
headerColumns.forEach(col => {
let value = el[col];
if (value instanceof Array) {
value = value.join('|');
}
if (!(typeof value == 'string' || value instanceof String)) {
value = String(value);
}
if (value.includes(',')) {
value = `"${value}"`;
}
row.push(value);
})
output += row.join(',');
output += "\n";
});
const fmt = 'csv';
downLoadFile(output, `application/${fmt}`, fmt, label);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment