diff --git a/src/app/app.module.ts b/src/app/app.module.ts index b77afd5fd245da60f89c950227f2be3fe30438a1..acf1ccd670c7d2e90bdd37cfbfd3991e373c641e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -49,6 +49,9 @@ import { ParserWarningComponent } from './components/parser-warning/parser-warni import { GroupWarningComponent } from './components/group-warning/group-warning.component'; import { NetworkWarningComponent } from './components/network-warning/network-warning.component'; import {NgbModule} from '@ng-bootstrap/ng-bootstrap'; +import { SummaryNodeComponent } from './pages/explorer-page/summary-node/summary-node/summary-node.component'; +import { NetworkOverviewComponent } from './pages/explorer-page/network-overview/network-overview/network-overview.component'; +import { InfoTileEdgeComponent } from './components/info-tile-edge/info-tile-edge/info-tile-edge.component'; @NgModule({ @@ -87,6 +90,9 @@ import {NgbModule} from '@ng-bootstrap/ng-bootstrap'; ParserWarningComponent, GroupWarningComponent, NetworkWarningComponent, + SummaryNodeComponent, + NetworkOverviewComponent, + InfoTileEdgeComponent, ], imports: [ BrowserModule, diff --git a/src/app/components/analysis-panel/analysis-panel.component.ts b/src/app/components/analysis-panel/analysis-panel.component.ts index d5cf926a367753bf09887681282e541a21798318..b278a0b21a308536014e40cc2121afb1875933b3 100644 --- a/src/app/components/analysis-panel/analysis-panel.component.ts +++ b/src/app/components/analysis-panel/analysis-panel.component.ts @@ -10,9 +10,9 @@ import { SimpleChanges, ViewChild, } from '@angular/core'; -import {HttpClient} from '@angular/common/http'; -import {environment} from '../../../environments/environment'; -import {algorithmNames, AnalysisService} from '../../services/analysis/analysis.service'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../../environments/environment'; +import { algorithmNames, AnalysisService } from '../../services/analysis/analysis.service'; import { Drug, EdgeType, @@ -28,15 +28,15 @@ import { NodeInteraction, } from '../../interfaces'; import domtoimage from 'dom-to-image'; -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 {downLoadFile, pieChartContextRenderer, removeDuplicateObjectsFromList} from 'src/app/utils'; -import {DrugstoneConfigService} from 'src/app/services/drugstone-config/drugstone-config.service'; -import {NetworkHandlerService} from 'src/app/services/network-handler/network-handler.service'; -import {LegendService} from 'src/app/services/legend-service/legend-service.service'; -import {LoadingScreenService} from 'src/app/services/loading-screen/loading-screen.service'; +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 { downLoadFile, pieChartContextRenderer, removeDuplicateObjectsFromList } from 'src/app/utils'; +import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; +import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service'; +import { LegendService } from 'src/app/services/legend-service/legend-service.service'; +import { LoadingScreenService } from 'src/app/services/loading-screen/loading-screen.service'; declare var vis: any; @@ -57,7 +57,7 @@ interface Seeded { }) export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit { - @ViewChild('networkWithLegend', {static: false}) networkWithLegendEl: ElementRef; + @ViewChild('networkWithLegend', { static: false }) networkWithLegendEl: ElementRef; @Input() token: string | null = null; @@ -71,7 +71,7 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit public fullscreen = false; public network: any; - public nodeData: { nodes: any, edges: any } = {nodes: null, edges: null}; + public nodeData: { nodes: any, edges: any } = { nodes: null, edges: null }; // private drugNodes: any[] = []; // private drugEdges: any[] = []; public tab: 'meta' | 'network' | 'table' = 'table'; @@ -177,7 +177,7 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit this.networkHandler.activeNetwork.seedMap = nodeAttributes.isSeed || {}; // Reset - this.nodeData = {nodes: null, edges: null}; + this.nodeData = { nodes: null, edges: null }; this.networkHandler.activeNetwork.networkEl.nativeElement.innerHTML = ''; this.networkHandler.activeNetwork.networkInternal = null; // Create @@ -188,7 +188,7 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit const nodes = nw.nodes; const edges = nw.edges; - this.networkHandler.activeNetwork.inputNetwork = {nodes: nodes, edges: edges}; + this.networkHandler.activeNetwork.inputNetwork = { nodes: nodes, edges: edges }; this.nodeData.nodes = new vis.DataSet(nodes); this.nodeData.edges = new vis.DataSet(edges); const container = this.networkHandler.activeNetwork.networkEl.nativeElement; @@ -237,7 +237,7 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit if (this.tableHasScores) { this.toggleNormalization(true); } - this.networkHandler.activeNetwork.networkInternal.setData({nodes: undefined, edge: undefined}); + this.networkHandler.activeNetwork.networkInternal.setData({ nodes: undefined, edge: undefined }); setTimeout(() => { this.networkHandler.activeNetwork.networkInternal.setData(this.nodeData); }, 1000); @@ -267,11 +267,18 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit }); this.networkHandler.activeNetwork.networkInternal.on('click', (properties) => { - const selectedNodes = this.nodeData.nodes.get(properties.nodes); - if (selectedNodes.length > 0) { - this.showDetailsChange.emit(getWrapperFromNode(selectedNodes[0])); + if (properties.nodes.length === 0 && properties.edges.length === 1) { + // clicked on one edge + const edgeId = properties.edges[0]; + this.networkHandler.activeNetwork.openEdgeSummary(edgeId); } else { - this.showDetailsChange.emit(null); + this.networkHandler.activeNetwork.activeEdge = null; + const selectedNodes = this.nodeData.nodes.get(properties.nodes); + if (selectedNodes.length > 0) { + this.showDetailsChange.emit(getWrapperFromNode(selectedNodes[0])); + } else { + this.showDetailsChange.emit(null); + } } }); diff --git a/src/app/components/fa-solid-icon/fa-solid-icon.component.scss b/src/app/components/fa-solid-icon/fa-solid-icon.component.scss index 7ebfe8232f9ebeb1f455730490d17e2b7b81346a..b0c002e808cafccc94fd1d4fc88d0fe18b86255e 100644 --- a/src/app/components/fa-solid-icon/fa-solid-icon.component.scss +++ b/src/app/components/fa-solid-icon/fa-solid-icon.component.scss @@ -14,6 +14,7 @@ margin-right: calc(-0.5em - 1px) !important; } &-height-normal { - height: 1em; + vertical-align: middle; + height: 1em !important; } } diff --git a/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.html b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.html new file mode 100644 index 0000000000000000000000000000000000000000..bfc13974f30a67c0fd36e3e16178fca0a8ce92d9 --- /dev/null +++ b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.html @@ -0,0 +1,30 @@ +<p + *ngFor="let attribute of edgeAttributes" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b + ><span class="is-capitalized">{{ attribute[0] }}:</span></b + > + <a> + <span + class="is-capitalized is-link" + *ngIf="nodeKeys.includes(attribute[0])" + (click)="zoomTo(attribute[1].id)" + > + {{ attribute[1].label }} ({{ + drugstoneConfig.currentConfig().nodeGroups[ + attribute[1][ + attribute[1].group === "selectedNode" ? "_group" : "group" + ] + ].groupName + }}) + <app-fa-solid-icon + icon="search" + classString="icon-height-normal" + ></app-fa-solid-icon></span + ></a> + + <span class="is-capitalized" *ngIf="!nodeKeys.includes(attribute[0])"> + {{ attribute[1] }} + </span> +</p> diff --git a/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.scss b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.spec.ts b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..86e6c57317c49c4c5959e07681acc75ce1742adf --- /dev/null +++ b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InfoTileEdgeComponent } from './info-tile-edge.component'; + +describe('InfoTileEdgeComponent', () => { + let component: InfoTileEdgeComponent; + let fixture: ComponentFixture<InfoTileEdgeComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ InfoTileEdgeComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(InfoTileEdgeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.ts b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8db35b0c2204554ad0e1d204782682c5e43192f9 --- /dev/null +++ b/src/app/components/info-tile-edge/info-tile-edge/info-tile-edge.component.ts @@ -0,0 +1,68 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { getWrapperFromNode } from 'src/app/interfaces'; +import { AnalysisService } from 'src/app/services/analysis/analysis.service'; +import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; +import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service'; + +@Component({ + selector: 'app-info-tile-edge', + templateUrl: './info-tile-edge.component.html', + styleUrls: ['./info-tile-edge.component.scss'] +}) +export class InfoTileEdgeComponent implements OnInit { + + constructor( + public drugstoneConfig: DrugstoneConfigService, + private networkHandler: NetworkHandlerService, + public analysis: AnalysisService + ) { } + + ngOnInit(): void { + } + + public edgeAttributes: any; + public from: any; + // public fromWrapper: any = null; + public to: any; + // public toWrapper: any = null; + public nodeKeys = ['to', 'from']; + + @Input() set edge(_edge) { + _edge = JSON.parse(JSON.stringify(_edge)); + // remove attributes that should not be displayed + _edge['group'] = _edge['groupName']; + delete _edge['groupName']; + delete _edge['dashes']; + delete _edge['color']; + delete _edge['id']; + delete _edge['shadow']; + + // order such that 'from' and 'to' are first + let from = _edge['from']; + let to = _edge['to']; + delete _edge['from']; + delete _edge['to']; + + // map ids to names + const toNode = this.networkHandler.activeNetwork.nodeData.nodes.get(to); + // this.toWrapper = getWrapperFromNode(toNode); + const fromNode = this.networkHandler.activeNetwork.nodeData.nodes.get(from); + // this.fromWrapper = getWrapperFromNode(fromNode); + + this.edgeAttributes = [['from', fromNode], ['to', toNode], ...Object.entries(_edge)]; + }; + + public zoomTo(nodeId) { + this.networkHandler.activeNetwork.zoomToNode(nodeId); + } + + // public selectionButtonToggle($event) { + // console.log(this.fromWrapper, this.toWrapper) + // if ($event) { + // this.analysis.addItems([this.toWrapper, this.fromWrapper]) + // } else { + // this.analysis.removeItems([this.toWrapper, this.fromWrapper]) + // } + // } + +} diff --git a/src/app/components/info-tile/info-tile.component.html b/src/app/components/info-tile/info-tile.component.html index 4daa8ad7b045475bea0fde658dfcd830212ca6a1..6f23eb28e099cbbe27fb16923974c4d5a2ee6ff4 100644 --- a/src/app/components/info-tile/info-tile.component.html +++ b/src/app/components/info-tile/info-tile.component.html @@ -1,157 +1,178 @@ -<div *ngIf="wrapper"> - <div> - <p - *ngIf="!wrapper.data.drugstoneId && wrapper.data.label" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Label:</span></b> - <span class="is-capitalized"> {{ wrapper.data.label }}</span> - </p> - <p - *ngIf="wrapper.data.proteinName" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Name:</span></b> - <span class="is-capitalized"> {{ wrapper.data.proteinName }}</span> - </p> - <p - *ngIf="wrapper.data.symbol" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Symbol:</span></b> - <a - class="is-capitalized" - href="https://www.genecards.org/cgi-bin/carddisp.pl?gene={{ - wrapper.data.symbol - }}" - target="_blank" - > - {{ wrapper.data.symbol }}</a - > - </p> - <p - *ngIf="wrapper.data.uniprotAc" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Uniprot:</span></b> - <a - *ngFor="let uniprotAc of wrapper.data.uniprotAc" - href="https://www.uniprot.org/uniprot/{{ uniprotAc }}" - target="_blank" - > - <span class="is-capitalized"> {{ uniprotAc }}</span> - </a> - </p> - <p - *ngIf="wrapper.data.ensg" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Ensembl:</span></b> - <a - *ngFor="let ensg of wrapper.data.ensg" - href="https://www.ensembl.org/Homo_sapiens/Gene/Summary?g={{ ensg }}" - target="_blank" - > - <span class="is-capitalized"> {{ ensg }}</span> - </a> - </p> - <p - *ngIf="wrapper.data.entrez" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Entrez:</span></b> - <a - *ngFor="let entrez of wrapper.data.entrez" - href="https://www.ncbi.nlm.nih.gov/gene/{{ entrez }}" - target="_blank" - > - <span class="is-capitalized"> {{ entrez }}</span> - </a> - </p> - <p - *ngIf="getExpressionScore() != null" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Median expression in {{"'"+networkHandler.activeNetwork.selectedTissue.name+"'"}} (TPM):</span></b> - <span class="is-capitalized"> {{ getExpressionScore() | number }}</span> - <span - class="icon has-text-info" - pTooltip="Median expression data is provided by the GTEx project. Unit is TPM (transcript per million)." - [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'" - tooltipPosition="left" - > - <app-fa-solid-icon icon="info-circle"></app-fa-solid-icon> - </span> - </p> - <p - *ngIf="wrapper.data.drugId || wrapper.data.disorderId" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Name:</span></b> - <span class="is-capitalized"> {{ wrapper.data.label }}</span> - </p> - <p - *ngIf="wrapper.data.icd10" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>ICD10:</span></b> - <span class="is-capitalized"> - {{ - wrapper.data.icd10.length === 0 || - (wrapper.data.icd10.length === 1 && - wrapper.data.icd10[0].length === 0) - ? "-" - : wrapper.data.icd10 - }}</span - > - </p> - <p - *ngIf="wrapper.data.drugId" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>DrugBank:</span></b> - <a - href="https://go.drugbank.com/drugs/{{ wrapper.data.drugId }}" - target="_blank" - > - <span class="is-capitalized"> {{ wrapper.data.drugId }}</span> - </a> - </p> - <p - *ngIf="wrapper.data.disorderId" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Mondo:</span></b> - <a - href="https://www.ebi.ac.uk/ols/ontologies/mondo/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FMONDO_{{ - writeZeros(7 - ('' + wrapper.data.disorderId).length) - }}{{ wrapper.data.disorderId }}" - target="_blank" - > - <span class="is-capitalized"> MONDO:{{ wrapper.data.disorderId }}</span> - </a> - </p> - <p - *ngIf="drugstoneConfig.currentConfig().nodeGroups[networkHandler.activeNetwork.selectedWrapper.data[networkHandler.activeNetwork.selectedWrapper.data.group === 'selectedNode' ? '_group':'group']].groupName" - [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" - > - <b><span>Group:</span></b> - <span class="is-capitalized"> {{drugstoneConfig.currentConfig().nodeGroups[networkHandler.activeNetwork.selectedWrapper.data[networkHandler.activeNetwork.selectedWrapper.data.group === 'selectedNode' ? '_group':'group']].groupName }}</span> - </p> - </div> +<p + *ngIf="!wrapper.data.drugstoneId && wrapper.data.label" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Label:</span></b> + <span class="is-capitalized"> {{ wrapper.data.label }}</span> +</p> +<p + *ngIf="wrapper.data.proteinName" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Name:</span></b> + <span class="is-capitalized"> {{ wrapper.data.proteinName }}</span> +</p> +<p + *ngIf="wrapper.data.symbol" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Symbol:</span></b> + <a + class="is-capitalized" + href="https://www.genecards.org/cgi-bin/carddisp.pl?gene={{ + wrapper.data.symbol + }}" + target="_blank" + > + {{ wrapper.data.symbol }} </a + > +</p> - <app-toggle - *ngIf="wrapper.data.drugstoneId && wrapper.data.drugstoneType === 'protein'" - [value]="analysis.inSelection(wrapper)" - (valueChange)=" - $event ? analysis.addItems([wrapper]) : analysis.removeItems([wrapper]) - " - textOn="Selected" - textOff="Off" - tooltipOn="Add protein to selection." - tooltipOff="Remove protein from selection." - ></app-toggle> -</div> -<div *ngIf="!wrapper" [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }"> - Please select a node for further information. -</div> + + +<p + *ngIf="wrapper.data.uniprotAc" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Uniprot:</span></b> + <a + *ngFor="let uniprotAc of wrapper.data.uniprotAc" + href="https://www.uniprot.org/uniprot/{{ uniprotAc }}" + target="_blank" + > + <span class="is-capitalized"> {{ uniprotAc }}</span> + </a> +</p> +<p + *ngIf="wrapper.data.ensg" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Ensembl:</span></b> + <a + *ngFor="let ensg of wrapper.data.ensg" + href="https://www.ensembl.org/Homo_sapiens/Gene/Summary?g={{ ensg }}" + target="_blank" + > + <span class="is-capitalized"> {{ ensg }}</span> + </a> +</p> +<p + *ngIf="wrapper.data.entrez" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Entrez:</span></b> + <a + *ngFor="let entrez of wrapper.data.entrez" + href="https://www.ncbi.nlm.nih.gov/gene/{{ entrez }}" + target="_blank" + > + <span class="is-capitalized"> {{ entrez }}</span> + </a> +</p> +<p + *ngIf="getExpressionScore() != null" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b + ><span + >Median expression in + {{ "'" + networkHandler.activeNetwork.selectedTissue.name + "'" }} + (TPM):</span + ></b + > + <span class="is-capitalized"> {{ getExpressionScore() | number }}</span> + <span + class="icon has-text-info" + pTooltip="Median expression data is provided by the GTEx project. Unit is TPM (transcript per million)." + [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'" + tooltipPosition="left" + > + <app-fa-solid-icon icon="info-circle"></app-fa-solid-icon> + </span> +</p> +<p + *ngIf="wrapper.data.drugId || wrapper.data.disorderId" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Name:</span></b> + <span class="is-capitalized"> {{ wrapper.data.label }}</span> +</p> +<p + *ngIf="wrapper.data.icd10" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>ICD10:</span></b> + <span class="is-capitalized"> + {{ + wrapper.data.icd10.length === 0 || + (wrapper.data.icd10.length === 1 && wrapper.data.icd10[0].length === 0) + ? "-" + : wrapper.data.icd10 + }}</span + > +</p> +<p + *ngIf="wrapper.data.drugId" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>DrugBank:</span></b> + <a + href="https://go.drugbank.com/drugs/{{ wrapper.data.drugId }}" + target="_blank" + > + <span class="is-capitalized"> {{ wrapper.data.drugId }}</span> + </a> +</p> +<p + *ngIf="wrapper.data.disorderId" + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Mondo:</span></b> + <a + href="https://www.ebi.ac.uk/ols/ontologies/mondo/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FMONDO_{{ + writeZeros(7 - ('' + wrapper.data.disorderId).length) + }}{{ wrapper.data.disorderId }}" + target="_blank" + > + <span class="is-capitalized"> MONDO:{{ wrapper.data.disorderId }}</span> + </a> +</p> +<p + *ngIf=" + drugstoneConfig.currentConfig().nodeGroups[ + networkHandler.activeNetwork.selectedWrapper.data[ + networkHandler.activeNetwork.selectedWrapper.data.group === + 'selectedNode' + ? '_group' + : 'group' + ] + ].groupName + " + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" +> + <b><span>Group:</span></b> + <span class="is-capitalized"> + {{ + drugstoneConfig.currentConfig().nodeGroups[ + networkHandler.activeNetwork.selectedWrapper.data[ + networkHandler.activeNetwork.selectedWrapper.data.group === + "selectedNode" + ? "_group" + : "group" + ] + ].groupName + }}</span + > +</p> + +<app-toggle + *ngIf="wrapper.data.drugstoneId && wrapper.data.drugstoneType === 'protein'" + [value]="analysis.inSelection(wrapper)" + (valueChange)=" + $event ? analysis.addItems([wrapper]) : analysis.removeItems([wrapper]) + " + textOn="Selected" + textOff="Off" + tooltipOn="Add protein to selection." + tooltipOff="Remove protein from selection." +></app-toggle> diff --git a/src/app/components/network/network.component.ts b/src/app/components/network/network.component.ts index f337900f963accca059da6e0152dc74d35117362..ba14317dfc546bc92f581e305f878caf2825794f 100644 --- a/src/app/components/network/network.component.ts +++ b/src/app/components/network/network.component.ts @@ -1,6 +1,6 @@ import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core'; import domtoimage from 'dom-to-image'; -import {IConfig, InteractionDatabase} from 'src/app/config'; +import {InteractionDatabase} from 'src/app/config'; import {DrugstoneConfigService} from 'src/app/services/drugstone-config/drugstone-config.service'; import {NetexControllerService} from 'src/app/services/netex-controller/netex-controller.service'; import {OmnipathControllerService} from 'src/app/services/omnipath-controller/omnipath-controller.service'; @@ -42,6 +42,8 @@ export class NetworkComponent implements OnInit { public selectedWrapper: Wrapper | null = null; + public activeEdge: NodeInteraction; + public adjacentDrugs = false; public adjacentDisordersProtein = false; @@ -422,9 +424,15 @@ export class NetworkComponent implements OnInit { }); } + public openEdgeSummary(edgeId: string) { + this.selectedWrapper = undefined; + const edgeMap = this.nodeData.edges.get({returnType:'Object'}); + this.activeEdge = edgeMap[edgeId]; + } + public zoomToNode(id: string) { // get network object, depending on whether analysis is open or not - this.nodeData.nodes.getIds(); + // this.nodeData.nodes.getIds(); const coords = this.networkInternal.getPositions(id)[id]; if (!coords) { return; @@ -442,7 +450,7 @@ export class NetworkComponent implements OnInit { }); } - toggleNetworkSidebar() { + public toggleNetworkSidebar() { this.networkHandler.networkSidebarOpen = !this.networkHandler.networkSidebarOpen; } diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index b41fba84db41e17257ce84b7a765237fc342c7e4..e96d259712fb5078c7e9191108127e1f22f316e1 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -64,9 +64,12 @@ export interface NodeInteraction { from: string; to: string; group?: string; + groupName?: string; label?: string; title?: string; shadow?: boolean; + // custom attributes by user + // [key: string]: string | number | boolean; } export interface NetworkEdge { diff --git a/src/app/main-network.ts b/src/app/main-network.ts index 1f684edbb83a6dc7cd15f20c287513352b6c2a74..28763ed1bada33980e39cfa3a13b9c0f8638cfd2 100644 --- a/src/app/main-network.ts +++ b/src/app/main-network.ts @@ -143,7 +143,7 @@ export function mapCustomEdge(customEdge: NodeInteraction, config: IConfig, drug * @param config * @returns */ -export function mapDrugstoneEdge(customEdge: NetexInteraction, config: IConfig, node_map: object): any { +export function mapNetexEdge(customEdge: NetexInteraction, config: IConfig, node_map: object): any { const edges = []; node_map[customEdge['proteinA']].forEach(from => { node_map[customEdge['proteinB']].forEach(to => { diff --git a/src/app/pages/explorer-page/explorer-page.component.html b/src/app/pages/explorer-page/explorer-page.component.html index 98852776482a169090f606e6c75b674d87d66726..b12426e299867a89bb0cbd7fd6fb56bbfc82af58 100644 --- a/src/app/pages/explorer-page/explorer-page.component.html +++ b/src/app/pages/explorer-page/explorer-page.component.html @@ -38,121 +38,12 @@ class="drugstone sidebar column" *ngIf="drugstoneConfig.config.showSidebar" > - <div - *ngIf="drugstoneConfig.config.showItemSelector" - class="card bar-large mt-0" - > - <header - class="card-header" - [ngClass]="{ 'b-text-small': drugstoneConfig.smallStyle }" - > - <p class="card-header-title"> - <ng-container - *ngIf="!networkHandler.activeNetwork.selectedWrapper" - > - <app-fa-solid-icon icon="info"></app-fa-solid-icon> - <span> No item selected </span> - </ng-container> - <ng-container - *ngIf="networkHandler.activeNetwork.selectedWrapper" - > - <span> - {{ drugstoneConfig.currentConfig().nodeGroups[networkHandler.activeNetwork.selectedWrapper.data[networkHandler.activeNetwork.selectedWrapper.data.group === 'selectedNode' ? '_group':'group']].groupName}} - </span> - </ng-container> - </p> - <a - (click)="collapseDetails = !collapseDetails" - data-action="collapse" - class="card-header-icon is-hidden-fullscreen" - aria-label="more options" - > - <app-fa-solid-icon - *ngIf="collapseDetails" - icon="angle-down" - ></app-fa-solid-icon> - <app-fa-solid-icon - *ngIf="!collapseDetails" - icon="angle-left" - ></app-fa-solid-icon> - </a> - </header> - <div *ngIf="collapseDetails"> - <div class="card-content"> - <app-info-tile - [expressions]="networkHandler.activeNetwork.expressionMap" - [wrapper]="networkHandler.activeNetwork.selectedWrapper" - ></app-info-tile> - </div> - </div> - </div> - <div - *ngIf="drugstoneConfig.config.showOverview" - class="card bar-large" - [ngClass]="{ 'b-text-small': drugstoneConfig.smallStyle }" - > - <header class="card-header"> - <p class="card-header-title"> - <app-fa-solid-icon icon="info"></app-fa-solid-icon> - Network Overview - </p> - <a - (click)="collapseOverview = !collapseOverview" - data-action="collapse" - class="card-header-icon is-hidden-fullscreen" - aria-label="more options" - > - <app-fa-solid-icon - *ngIf="collapseOverview" - icon="angle-down" - ></app-fa-solid-icon> - <app-fa-solid-icon - *ngIf="!collapseOverview" - icon="angle-left" - ></app-fa-solid-icon> - </a> - </header> - <div *ngIf="collapseOverview"> - <div class="card-content"> - <nav class="level" *ngIf="proteinData"> - <!-- TO DO : CHANGE THIS LATER - <div class="level-item has-text-centered"> - <div> - <p class="heading">Viral<br>Proteins</p> - <p class="title"> {{ proteinData.effects.length }}</p> - </div> - </div> - --> + <app-summary-node *ngIf="drugstoneConfig.config.showItemSelector"></app-summary-node> - <div class="level-item has-text-centered"> - <div> - <p class="heading">Nodes</p> - <p class="title"> - {{ - networkHandler.activeNetwork.currentViewNodes != null - ? networkHandler.activeNetwork.currentViewNodes.length - : 0 - }} - </p> - </div> - </div> - <div class="level-item has-text-centered"> - <div> - <p class="heading">Edges</p> - <p class="title"> - {{ - networkHandler.activeNetwork.currentViewEdges != null - ? networkHandler.activeNetwork.currentViewEdges.length - : 0 - }} - </p> - </div> - </div> - </nav> - </div> - </div> - </div> + <app-network-overview *ngIf="drugstoneConfig.config.showOverview"></app-network-overview> + + <div *ngIf="drugstoneConfig.config.showQuery" diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts index 0f8817df9c1b5365a9b704c210fa4bc7e994017b..5bc5533e21586af105d81bd93bc2da55c5feafc6 100644 --- a/src/app/pages/explorer-page/explorer-page.component.ts +++ b/src/app/pages/explorer-page/explorer-page.component.ts @@ -15,17 +15,15 @@ import { Tissue, Wrapper } from '../../interfaces'; -import {ProteinNetwork, mapDrugstoneEdge} from '../../main-network'; -import {AnalysisService} from '../../services/analysis/analysis.service'; -import {OmnipathControllerService} from '../../services/omnipath-controller/omnipath-controller.service'; -import {NetworkSettings} from '../../network-settings'; -import {defaultConfig, EdgeGroup, NodeGroup} from '../../config'; -import {NetexControllerService} from 'src/app/services/netex-controller/netex-controller.service'; -import {removeDuplicateObjectsFromList} from '../../utils'; +import { ProteinNetwork, mapNetexEdge } from '../../main-network'; +import { AnalysisService } from '../../services/analysis/analysis.service'; +import { NetworkSettings } from '../../network-settings'; +import { defaultConfig, EdgeGroup, NodeGroup } from '../../config'; +import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service'; import * as merge from 'lodash/fp/merge'; import * as JSON5 from 'json5'; -import {DrugstoneConfigService} from 'src/app/services/drugstone-config/drugstone-config.service'; -import {NetworkHandlerService} from 'src/app/services/network-handler/network-handler.service'; +import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; +import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service'; declare var vis: any; @@ -100,21 +98,20 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { public showDetails = false; public collapseAnalysis = true; - public collapseDetails = true; public collapseTask = true; public collapseSelection = true; public collapseBaitFilter = true; public collapseQuery = true; public collapseData = true; - public collapseOverview = true; public proteinData: ProteinNetwork; + public edgeAttributes: Map<string, NodeInteraction>; // public proteins: Node[]; // public edges: NodeInteraction[]; // this will store the vis Dataset - public nodeData: { nodes: any, edges: any } = {nodes: null, edges: null}; + public nodeData: { nodes: any, edges: any } = { nodes: null, edges: null }; public showAnalysisDialog = false; public showThresholdDialog = false; @@ -246,9 +243,9 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { this.networkHandler.networkSidebarOpen = this.drugstoneConfig.config.expandNetworkMenu; // trigger updates on config e.g. in legend if (this.drugstoneConfig.analysisConfig) { - this.drugstoneConfig.analysisConfig = {...this.drugstoneConfig.analysisConfig}; + this.drugstoneConfig.analysisConfig = { ...this.drugstoneConfig.analysisConfig }; } else { - this.drugstoneConfig.config = {...this.drugstoneConfig.config}; + this.drugstoneConfig.config = { ...this.drugstoneConfig.config }; } if (updateNetworkFlag && typeof this.networkJSON !== 'undefined') { // update network if network config has changed and networkJSON exists @@ -301,7 +298,7 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { if (this.networkHandler.activeNetwork.networkPositions) { this.proteinData.updateNodePositions(this.networkHandler.activeNetwork.networkPositions); } - let {nodes, edges} = this.proteinData.mapDataToNetworkInput(this.drugstoneConfig.currentConfig(), this.drugstoneConfig); + let { nodes, edges } = this.proteinData.mapDataToNetworkInput(this.drugstoneConfig.currentConfig(), this.drugstoneConfig); if (this.drugstoneConfig.config.autofillEdges && nodes.length) { let node_map = {}; nodes.filter(n => n.drugstoneType === 'protein').forEach(node => { @@ -321,8 +318,8 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { }); } }); - const drugstoneEdges = await this.netex.fetchEdges(nodes, this.drugstoneConfig.config.interactionProteinProtein, this.drugstoneConfig.config.licensedDatasets); - edges.push(...drugstoneEdges.map(drugstoneEdge => mapDrugstoneEdge(drugstoneEdge, this.drugstoneConfig.currentConfig(), node_map)).flatMap(e => e)); + const netexEdges = await this.netex.fetchEdges(nodes, this.drugstoneConfig.config.interactionProteinProtein, this.drugstoneConfig.config.licensedDatasets); + edges.push(...netexEdges.map(netexEdge => mapNetexEdge(netexEdge, this.drugstoneConfig.currentConfig(), node_map)).flatMap(e => e)); } const edge_map = {}; @@ -387,17 +384,26 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { } } }); + this.networkHandler.activeNetwork.networkInternal.on('click', (properties) => { - const nodeIds: Array<string> = properties.nodes; - if (nodeIds != null && nodeIds.length > 0) { - const nodeId = nodeIds[0]; - const node = this.nodeData.nodes.get(nodeId); - const wrapper = getWrapperFromNode(node); - this.openSummary(wrapper, false); + if (properties.nodes.length === 0 && properties.edges.length === 1) { + // clicked on one edge + const edgeId = properties.edges[0]; + this.networkHandler.activeNetwork.openEdgeSummary(edgeId); } else { - this.closeSummary(); + // clicked not on one edge + const nodeIds: Array<string> = properties.nodes; + if (nodeIds != null && nodeIds.length > 0) { + const nodeId = nodeIds[0]; + const node = this.nodeData.nodes.get(nodeId); + const wrapper = getWrapperFromNode(node); + this.openNodeSummary(wrapper, false); + } else { + this.closeSummary(); + } } }); + this.networkHandler.activeNetwork.networkInternal.on('deselectNode', (properties) => { this.closeSummary(); }); @@ -434,7 +440,7 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { node.id = this.removeEnsemblVersion(node.id); }); if (network.edges != null) - // @ts-ignore + // @ts-ignore { network.edges.forEach(edge => { edge.from = this.removeEnsemblVersion(edge.from); @@ -482,7 +488,9 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { this.drugstoneConfig.smallStyle = this.windowWidth < 1250; } - public async openSummary(item: Wrapper, zoom: boolean) { + public async openNodeSummary(item: Wrapper, zoom: boolean) { + // close edge summary if open + this.networkHandler.activeNetwork.activeEdge = null; this.networkHandler.activeNetwork.selectedWrapper = item; // add expression information if loaded if (this.networkHandler.activeNetwork.expressionMap && this.networkHandler.activeNetwork.selectedWrapper.id in this.networkHandler.activeNetwork.expressionMap) { @@ -496,6 +504,7 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { public async closeSummary() { this.networkHandler.activeNetwork.selectedWrapper = null; + this.networkHandler.activeNetwork.activeEdge = null; this.showDetails = false; } @@ -505,7 +514,7 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { public queryAction(item: any) { if (item) { - this.openSummary(item, true); + this.openNodeSummary(item, true); } } @@ -579,12 +588,12 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { * @param values */ public setConfigEdgeGroup(key: string, edgeGroups: { - [key - : - string - ]: - EdgeGroup; - } + [key + : + string + ]: + EdgeGroup; + } ) { // make sure that default-groups are set const defaultNodeGroups = JSON.parse(JSON.stringify(defaultConfig.edgeGroups)); @@ -652,7 +661,7 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { this.openExternal(url); } -//TODO change to access through network service + //TODO change to access through network service @ViewChild('analysisPanel') analysisPanel; diff --git a/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.html b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.html new file mode 100644 index 0000000000000000000000000000000000000000..0763e03b710e3779361551f5f14247a257f7867e --- /dev/null +++ b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.html @@ -0,0 +1,56 @@ +<div + class="card bar-large" + [ngClass]="{ 'b-text-small': drugstoneConfig.smallStyle }" +> + <header class="card-header"> + <p class="card-header-title"> + <app-fa-solid-icon icon="info"></app-fa-solid-icon> + Network Overview + </p> + <a + (click)="collapseOverview = !collapseOverview" + data-action="collapse" + class="card-header-icon is-hidden-fullscreen" + aria-label="more options" + > + <app-fa-solid-icon + *ngIf="collapseOverview" + icon="angle-down" + ></app-fa-solid-icon> + <app-fa-solid-icon + *ngIf="!collapseOverview" + icon="angle-left" + ></app-fa-solid-icon> + </a> + </header> + <div *ngIf="collapseOverview"> + <div class="card-content"> + <nav class="level" > + <div class="level-item has-text-centered"> + <div> + <p class="heading">Nodes</p> + <p class="title"> + {{ + networkHandler.activeNetwork.currentViewNodes != null + ? networkHandler.activeNetwork.currentViewNodes.length + : 0 + }} + </p> + </div> + </div> + <div class="level-item has-text-centered"> + <div> + <p class="heading">Edges</p> + <p class="title"> + {{ + networkHandler.activeNetwork.currentViewEdges != null + ? networkHandler.activeNetwork.currentViewEdges.length + : 0 + }} + </p> + </div> + </div> + </nav> + </div> + </div> +</div> \ No newline at end of file diff --git a/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.scss b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.spec.ts b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..45ffff18c53725ceaf1299fbba3b36c2d092c2e8 --- /dev/null +++ b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NetworkOverviewComponent } from './network-overview.component'; + +describe('NetworkOverviewComponent', () => { + let component: NetworkOverviewComponent; + let fixture: ComponentFixture<NetworkOverviewComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NetworkOverviewComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(NetworkOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.ts b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cd954ce88d45a707db81db400837ce0607f5fd9 --- /dev/null +++ b/src/app/pages/explorer-page/network-overview/network-overview/network-overview.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; +import { AnalysisService } from 'src/app/services/analysis/analysis.service'; +import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; +import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service'; +import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service'; + +@Component({ + selector: 'app-network-overview', + templateUrl: './network-overview.component.html', + styleUrls: ['./network-overview.component.scss'] +}) +export class NetworkOverviewComponent implements OnInit { + + constructor( + public analysis: AnalysisService, + public drugstoneConfig: DrugstoneConfigService, + public netex: NetexControllerService, + public networkHandler: NetworkHandlerService + ) { } + + ngOnInit(): void { + } + + collapseOverview = this.drugstoneConfig.config.showOverview; + +} diff --git a/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.html b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.html new file mode 100644 index 0000000000000000000000000000000000000000..d4101237a384c948e53b559efe9b4b03c2570ef3 --- /dev/null +++ b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.html @@ -0,0 +1,80 @@ +<div class="card bar-large mt-0"> + <header + class="card-header" + [ngClass]="{ 'b-text-small': drugstoneConfig.smallStyle }" + > + <p class="card-header-title"> + <ng-container + *ngIf=" + !networkHandler.activeNetwork.selectedWrapper && + !networkHandler.activeNetwork.activeEdge + " + > + <app-fa-solid-icon icon="info"></app-fa-solid-icon> + <span> No item selected </span> + </ng-container> + + <span + *ngIf="networkHandler.activeNetwork.selectedWrapper" + class="is-capitalized" + > + {{ + drugstoneConfig.currentConfig().nodeGroups[ + networkHandler.activeNetwork.selectedWrapper.data[ + networkHandler.activeNetwork.selectedWrapper.data.group === + "selectedNode" + ? "_group" + : "group" + ] + ].groupName + }} + </span> + + <span + *ngIf="networkHandler.activeNetwork.activeEdge" + class="is-capitalized" + > + {{ networkHandler.activeNetwork.activeEdge.groupName }} + </span> + </p> + <a + (click)="collapseDetails = !collapseDetails" + data-action="collapse" + class="card-header-icon is-hidden-fullscreen" + aria-label="more options" + > + <app-fa-solid-icon + *ngIf="collapseDetails" + icon="angle-down" + ></app-fa-solid-icon> + <app-fa-solid-icon + *ngIf="!collapseDetails" + icon="angle-left" + ></app-fa-solid-icon> + </a> + </header> + <div *ngIf="collapseDetails"> + <div class="card-content"> + <app-info-tile + *ngIf="networkHandler.activeNetwork.selectedWrapper" + [expressions]="networkHandler.activeNetwork.expressionMap" + [wrapper]="networkHandler.activeNetwork.selectedWrapper" + ></app-info-tile> + + <app-info-tile-edge + *ngIf="networkHandler.activeNetwork.activeEdge" + [edge]="networkHandler.activeNetwork.activeEdge" + ></app-info-tile-edge> + + <p + *ngIf=" + !networkHandler.activeNetwork.selectedWrapper && + !networkHandler.activeNetwork.activeEdge + " + [ngClass]="{ 'text-normal': drugstoneConfig.smallStyle }" + > + Please select a node for further information. + </p> + </div> + </div> +</div> diff --git a/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.scss b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.spec.ts b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c55f480fc10e31229a35307769de41b60c6f176f --- /dev/null +++ b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SummaryNodeComponent } from './summary-node.component'; + +describe('SummaryNodeComponent', () => { + let component: SummaryNodeComponent; + let fixture: ComponentFixture<SummaryNodeComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SummaryNodeComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SummaryNodeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.ts b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8bde839911ad99085496c80427663c40b5d52454 --- /dev/null +++ b/src/app/pages/explorer-page/summary-node/summary-node/summary-node.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AnalysisService } from 'src/app/services/analysis/analysis.service'; +import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service'; +import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service'; +import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service'; + +@Component({ + selector: 'app-summary-node', + templateUrl: './summary-node.component.html', + styleUrls: ['./summary-node.component.scss'] +}) +export class SummaryNodeComponent implements OnInit { + + constructor( + public analysis: AnalysisService, + public drugstoneConfig: DrugstoneConfigService, + public netex: NetexControllerService, + public networkHandler: NetworkHandlerService + ) { } + + ngOnInit(): void { + } + + collapseDetails = true; +} diff --git a/src/index.html b/src/index.html index dc08e199a74dd9cde978e8917dbbad5f01599de7..29c5785aedd1eb65bb698a97230f32d0b22cc1be 100644 --- a/src/index.html +++ b/src/index.html @@ -115,7 +115,7 @@ menu<br> <drugst-one id="netexp1" config="{'activateNetworkMenuButtonAdjacentDisorders':false,'activateNetworkMenuButtonAdjacentDrugs':false, 'activateNetworkMenuButtonAdjacentDisordersDrugs': false, 'licensedDatasets':true}" groups='{"nodeGroups":{"important":{"type":"gene","color":"#ff881f","font":{"color":"#000000"},"groupName":"Important Gene","shape":"star"},"gene":{"type":"gene","color":"#4da300","font":{"color":"#f0f0f0"},"groupName":"Gene","shape":"circle"},"foundDrug":{"type":"drug","color":"#F12590","font":{"color":"#000000"},"groupName":"Drug","shape":"diamond"}},"edgeGroups":{"default":{"color":"#000000","groupName":"default edge"}}}' - network='{"nodes":[{"id":"CFTR","group":"important","label":"CFTR"},{"id":"TGFB1","group":"gene","label":"TGFB1"},{"id":"TNFRSF1A","group":"gene","label":"TNFRSF1A"},{"id":"FCGR2A","group":"gene","label":"FCGR2A"},{"id":"ENG","group":"gene","label":"ENG"},{"id":"DCTN4","group":"gene","label":"DCTN4"},{"id":"CLCA4","group":"gene","label":"CLCA4"},{"id":"STX1A","group":"gene","label":"STX1A"},{"id":"SCNN1G","group":"gene","label":"SCNN1G"},{"id":"SCNN1A","group":"gene","label":"SCNN1A"},{"id":"SCNN1B","group":"gene","label":"SCNN1B"}],"edges":[{"from":"DCTN4","to":"CFTR"},{"from":"STX1A","to":"SCNN1B","group":"default"},{"from":"SCNN1A","to":"SCNN1G","group":"default"},{"from":"SCNN1B","to":"SCNN1G","group":"default"}]}'> + network='{"nodes":[{"id":"CFTr","group":"important","label":"CFTR"},{"id":"TGFB1","group":"gene","label":"TGFB1"},{"id":"TNFRSF1A","group":"gene","label":"TNFRSF1A"},{"id":"FCGR2A","group":"gene","label":"FCGR2A"},{"id":"ENG","group":"gene","label":"ENG"},{"id":"DCTN4","group":"gene","label":"DCTN4"},{"id":"CLCA4","group":"gene","label":"CLCA4"},{"id":"STX1A","group":"gene","label":"STX1A"},{"id":"SCNN1G","group":"gene","label":"SCNN1G"},{"id":"SCNN1A","group":"gene","label":"SCNN1A"},{"id":"SCNN1B","group":"gene","label":"SCNN1B"}],"edges":[{"from":"DCTN4","to":"CFTR", "weight": "5"},{"from":"STX1A","to":"SCNN1B","group":"default"},{"from":"SCNN1A","to":"SCNN1G","group":"default"},{"from":"SCNN1B","to":"SCNN1G","group":"default"}]}'> ></drugst-one> <!-- <drugst-one id="netexp1"-->