From ed9b8568d9a0a4ee8ad7ee0cfa6b12cecd85e32b Mon Sep 17 00:00:00 2001 From: Maiykol <hartung.michael@outlook.com> Date: Wed, 23 Jun 2021 20:23:21 +0200 Subject: [PATCH] update legend and remove nodeGroups type for now --- .../analysis-panel.component.ts | 39 ++-- .../info-tile/info-tile.component.html | 4 - .../network-legend.component.html | 3 +- .../network-legend.component.scss | 9 +- .../query-tile/query-tile.component.html | 6 +- .../query-tile/query-tile.component.ts | 2 +- src/app/config.ts | 8 +- .../launch-analysis.component.ts | 3 +- src/app/interfaces.ts | 8 - src/app/main-network.ts | 41 ++-- src/app/network-settings.ts | 205 +++++++++--------- .../explorer-page.component.html | 12 +- .../explorer-page/explorer-page.component.ts | 25 ++- src/index.html | 11 +- 14 files changed, 184 insertions(+), 192 deletions(-) diff --git a/src/app/components/analysis-panel/analysis-panel.component.ts b/src/app/components/analysis-panel/analysis-panel.component.ts index c26c718c..014a3a46 100644 --- a/src/app/components/analysis-panel/analysis-panel.component.ts +++ b/src/app/components/analysis-panel/analysis-panel.component.ts @@ -17,7 +17,6 @@ import { Task, Drug, Wrapper, - WrapperType, getWrapperFromNode, getWrapperFromDrug, getWrapperFromCustom, @@ -32,8 +31,6 @@ import {toast} from 'bulma-toast'; import {NetworkSettings} from '../../network-settings'; import { NetexControllerService } from 'src/app/services/netex-controller/netex-controller.service'; import { IConfig } from 'src/app/config'; -import { config } from 'rxjs'; -import { wrapReference } from '@angular/compiler/src/render3/util'; declare var vis: any; @@ -242,10 +239,10 @@ export class AnalysisPanelComponent implements OnInit, OnChanges { const pos = this.network.getPositions([item.id]); node.x = pos[item.id].x; node.y = pos[item.id].y; - Object.assign(node, NetworkSettings.getNodeStyle( - node.wrapper.type, - node.isSeed, - selected)); + // Object.assign(node, NetworkSettings.getNodeStyle( + // node.wrapper.type, + // node.isSeed, + // selected)); updatedNodes.push(node); } this.nodeData.nodes.update(updatedNodes); @@ -271,17 +268,17 @@ export class AnalysisPanelComponent implements OnInit, OnChanges { const nodeSelected = this.analysis.idInSelection(node.id); let drugType; let drugInTrial; - if (node.wrapper.type === 'drug') { + if (node.wrapper.data.netexId && node.wrapper.data.netexId.startswith('d')) { drugType = node.wrapper.data.status; drugInTrial = node.wrapper.data.inTrial; } - Object.assign(node, NetworkSettings.getNodeStyle( - node.wrapper.type, - node.isSeed, - nodeSelected, - drugType, - drugInTrial, - node.gradient)); + // Object.assign(node, NetworkSettings.getNodeStyle( + // node.wrapper.type, + // node.isSeed, + // nodeSelected, + // drugType, + // drugInTrial, + // node.gradient)); updatedNodes.push(node); }); this.nodeData.nodes.update(updatedNodes); @@ -468,20 +465,14 @@ export class AnalysisPanelComponent implements OnInit, OnChanges { * @returns */ private mapNode(config: IConfig, wrapper: Wrapper, isSeed?: boolean, score?: number): any { - // const node = NetworkSettings.getNodeStyle(nodeType, isSeed, this.analysis.inSelection(wrapper)); - let group = this.inferNodeGroup(wrapper); - if (typeof group === 'undefined' || typeof config.nodeGroups[group] === 'undefined') { - group = 'default'; - } + console.log("node group") - console.log(group) console.log(config.nodeGroups) - console.log(config.nodeGroups[group]); + console.log(config.nodeGroups[wrapper.data.group]); - const node = JSON.parse(JSON.stringify(config.nodeGroups[group])); + const node = JSON.parse(JSON.stringify(config.nodeGroups[wrapper.data.group])); node.id = wrapper.id; node.label = this.inferNodeLabel(config, wrapper); - node.nodeType = group; node.isSeed = isSeed; node.wrapper = wrapper; return node; diff --git a/src/app/components/info-tile/info-tile.component.html b/src/app/components/info-tile/info-tile.component.html index 0b5e1698..f14f0cd2 100644 --- a/src/app/components/info-tile/info-tile.component.html +++ b/src/app/components/info-tile/info-tile.component.html @@ -8,10 +8,6 @@ <b><span>Symbol:</span></b> <span class="is-capitalized"> {{ wrapper.data.symbol }}</span> </p> - <p *ngIf="wrapper.type" [ngClass]="{'text-normal':smallStyle}"> - <b><span>Type:</span></b> - <span class="is-capitalized"> {{ wrapper.type }}</span> - </p> <p *ngIf="wrapper.data.drugId" [ngClass]="{'text-normal':smallStyle}"> <b><span>DrugBank:</span></b> <a href="https://go.drugbank.com/drugs/{{ wrapper.data.drugId }}" target="_blank"> diff --git a/src/app/components/network-legend/network-legend.component.html b/src/app/components/network-legend/network-legend.component.html index 8f53ebdc..f1cc6935 100644 --- a/src/app/components/network-legend/network-legend.component.html +++ b/src/app/components/network-legend/network-legend.component.html @@ -39,7 +39,8 @@ <ng-container *ngIf="this.config.showLegendEdges"> <tr *ngFor="let edgeGroup of this.config.edgeGroups | keyvalue" class="list-item"> <td> - <hr class="edge" [style.background-color]=edgeGroup.value.color> + <hr *ngIf="!edgeGroup.value.dashed" class="edge" [style.background-color]=edgeGroup.value.color> + <hr *ngIf="edgeGroup.value.dashed" class="edge dashed" [style.color]=edgeGroup.value.color> </td> <td> {{ edgeGroup.value.groupName }}</td> </tr> diff --git a/src/app/components/network-legend/network-legend.component.scss b/src/app/components/network-legend/network-legend.component.scss index 931851e3..0000285b 100644 --- a/src/app/components/network-legend/network-legend.component.scss +++ b/src/app/components/network-legend/network-legend.component.scss @@ -12,7 +12,6 @@ div.legend { } tr.list-item{ padding: 0; - height: 40px; td{ height: $legend-circle-size; vertical-align: middle !important; @@ -72,9 +71,15 @@ div.legend { width: $legend-circle-size; height: $legend-circle-size; } - .edge{ + hr.edge{ width: $legend-edge-width; height: $legend-edge-height; + /* Center edge icon */ + margin: 0 auto; + &.dashed { + border-top: dotted; + } + } } diff --git a/src/app/components/query-tile/query-tile.component.html b/src/app/components/query-tile/query-tile.component.html index 2afbd573..30f9f43c 100644 --- a/src/app/components/query-tile/query-tile.component.html +++ b/src/app/components/query-tile/query-tile.component.html @@ -2,9 +2,9 @@ <ng-select [items]="queryItems" bindLabel="id" bindValue="data" [virtualScroll]="true" class="custom" placeholder="Search..." [hideSelected]="true" [searchFn]="querySearch" (change)="select($event)" data-tooltip="Find proteins in the network."> <ng-template ng-option-tmp let-item="item"> - <b *ngIf="item.type == 'protein'"> {{item.data.name}}</b> - <span><small *ngIf="item.type === 'protein'">Host Protein</small> | </span> - <span *ngIf="item.type == 'protein'"><small>AC: <b>{{item.data.uniprotAc}}</b></small> </span> + <b *ngIf="item.data.netexId && item.data.netexId.startsWith('p')"> {{item.data.name}}</b> + <span><small *ngIf="item.data.netexId && item.data.netexId.startsWith('p')">Protein</small> | </span> + <span *ngIf="item.data.netexId && item.data.netexId.startsWith('p')"><small>AC: <b>{{item.data.uniprotAc}}</b></small> </span> </ng-template> </ng-select> </div> diff --git a/src/app/components/query-tile/query-tile.component.ts b/src/app/components/query-tile/query-tile.component.ts index 9dfbdaa7..322fc3c9 100644 --- a/src/app/components/query-tile/query-tile.component.ts +++ b/src/app/components/query-tile/query-tile.component.ts @@ -15,7 +15,7 @@ export class QueryTileComponent { querySearch(term: string, item: Wrapper) { term = term.toLowerCase(); const data = item.data as Node; - return data.symbol.toLowerCase().indexOf(term) > -1 || item.type.toLowerCase().indexOf(term) > -1; + return data.symbol.toLowerCase().indexOf(term) > -1 || data.uniprotAc.toLowerCase().indexOf(term) > -1; } select(item) { diff --git a/src/app/config.ts b/src/app/config.ts index ef3e4405..e27f3eec 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -2,7 +2,6 @@ export interface NodeGroup { groupName: string; color: string; shape: 'circle' | 'triangle' | 'star' | 'square' | 'image'; - type?: string; image?: string; detailShowLabel?: boolean; } @@ -11,7 +10,7 @@ export interface EdgeGroup { groupName: string; color: string; // see https://visjs.github.io/vis-network/docs/network/edges.html - dashes?: false | Array<number>; + dashed?: false | Array<number>; } export type Identifier = 'symbol'|'uniprot'|'ensg'; @@ -78,20 +77,17 @@ export const defaultConfig: IConfig = { groupName: 'Default Node Group', color: 'yellow', shape: 'triangle', - type: 'protein', detailShowLabel: false, }, default_protein: { groupName: 'Resulting Proteins', color: 'red', shape: 'circle', - type: 'protein', }, default_drug: { groupName: 'Possible Drugs', color: 'green', shape: 'star', - type: 'drug', } }, edgeGroups: { @@ -99,7 +95,7 @@ export const defaultConfig: IConfig = { // this default group is used for default edge group values groupName: 'Default Edge Group', color: 'black', - dashes: false + dashed: false } }, }; diff --git a/src/app/dialogs/launch-analysis/launch-analysis.component.ts b/src/app/dialogs/launch-analysis/launch-analysis.component.ts index bbf91fa3..dc1d4ab2 100644 --- a/src/app/dialogs/launch-analysis/launch-analysis.component.ts +++ b/src/app/dialogs/launch-analysis/launch-analysis.component.ts @@ -102,8 +102,7 @@ export class LaunchAnalysisComponent implements OnInit, OnChanges { } public async startTask() { - // filter out all seed nodes that do not have a netex_Id, hence do not - // exist in the backend + // all nodes in selection have netexId, hence exist in the backend const seeds = this.analysis.getSelection().map((item) => item.data.netexId) const seedsFiltered = seeds.filter(function (el) { return el != null; diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index 9f75b456..28336201 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -128,7 +128,6 @@ export function getWrapperFromCustom(gene: Node): Wrapper { return { id: getNodeId(gene), nodeId: getNodeId(gene), - type: 'custom', data: gene, }; } @@ -140,7 +139,6 @@ export function getWrapperFromNode(gene: Node): Wrapper { return { id: getNodeId(gene), nodeId: getNodeId(gene), - type: 'protein', data: gene, }; } @@ -150,21 +148,15 @@ export function getWrapperFromDrug(drug: Drug): Wrapper { return { id: getDrugBackendId(drug), nodeId: getDrugNodeId(drug), - type: 'drug', data: drug, }; } -// protein = node that exists as protein in backend -// drug = drug from backend, found in analysis -// custom = custom node from user that could not be mapped to protein -export type WrapperType = 'protein' | 'drug' | 'custom'; export type EdgeType = 'protein-protein' | 'protein-drug'; export interface Wrapper { id: string; nodeId: string; - type: WrapperType; data: { id: string; label: string; diff --git a/src/app/main-network.ts b/src/app/main-network.ts index a0aa887c..c1444667 100644 --- a/src/app/main-network.ts +++ b/src/app/main-network.ts @@ -1,5 +1,5 @@ import {HttpClient} from '@angular/common/http'; -import { IConfig } from './config'; +import { defaultConfig, IConfig } from './config'; import {NodeInteraction, Node, getProteinNodeId} from './interfaces'; export function getDatasetFilename(dataset: Array<[string, string]>): string { @@ -41,49 +41,58 @@ export class ProteinNetwork { } /** Maps user input node to network node object + * If user input node has no group, fall back to default + * If user input node has group that is not defined, throw error * * @param customNode * @param config * @returns */ private mapCustomNode(customNode: any, config: IConfig): Node { - - if (config.nodeGroups[customNode.group] === undefined) { - throw `Node with id ${customNode.id} has undefined node group ${customNode.group}.` + let node; + if (customNode.group === undefined) { + // fallback to default node + node = {...defaultConfig.nodeGroups.default}; + } else { + if (config.nodeGroups[customNode.group] === undefined) { + throw `Node with id ${customNode.id} has undefined node group ${customNode.group}.` + } + // copy + node = {...config.nodeGroups[customNode.group]}; } - - let node = JSON.parse(JSON.stringify(config.nodeGroups[customNode.group])); - // update the node with custom node properties, including values fetched from backend node = { ...node, ...customNode } - // label is only used for network visualization node.label = customNode.label ? customNode.label : customNode.id; - if (node.image) { node.shape = 'image'; } - return node; } /** Maps user input edge to network edge object + * If user input edge has no group, fall back to default + * If user input edge has group that is not defined, throw error * * @param customEdge * @param config * @returns */ private mapCustomEdge(customEdge: NodeInteraction, config: IConfig): any { - - if (config.edgeGroups[customEdge.group] === undefined) { - throw `Edge "from ${customEdge.from}" - "to ${customEdge.to}" has undefined edge group ${customEdge.group}.` + let edge; + if (customEdge.group === undefined) { + // fallback to default node + edge = {...defaultConfig.edgeGroups.default}; + } else { + if (config.edgeGroups[customEdge.group] === undefined) { + throw `Edge "from ${customEdge.from}" - "to ${customEdge.to}" has undefined edge group ${customEdge.group}.` + } + // copy + edge = {...config.edgeGroups[customEdge.group]}; } - - let edge = JSON.parse(JSON.stringify(config.edgeGroups[customEdge.group])); - edge = { ...edge, ...customEdge diff --git a/src/app/network-settings.ts b/src/app/network-settings.ts index 9f4a77fc..3aa64268 100644 --- a/src/app/network-settings.ts +++ b/src/app/network-settings.ts @@ -1,4 +1,3 @@ -import {WrapperType} from './interfaces'; import {getGradientColor} from './utils'; export class NetworkSettings { @@ -77,25 +76,25 @@ export class NetworkSettings { private static drugNotInTrialShape = 'box'; private static drugInTrialShape = 'triangle'; - static getNodeSize(wrapperType: WrapperType) { - if (wrapperType === 'protein') { - return this.hostSize; - } else if (wrapperType === 'drug') { - return this.drugSize; - } - } - - static getNodeShape(wrapperType: WrapperType, drugInTrial?: boolean) { - if (wrapperType === 'protein') { - return this.hostShape; - } else if (wrapperType === 'drug') { - if (drugInTrial) { - return this.drugInTrialShape; - } else { - return this.drugNotInTrialShape; - } - } - } + // static getNodeSize(wrapperType: WrapperType) { + // if (wrapperType === 'protein') { + // return this.hostSize; + // } else if (wrapperType === 'drug') { + // return this.drugSize; + // } + // } + + // static getNodeShape(wrapperType: WrapperType, drugInTrial?: boolean) { + // if (wrapperType === 'protein') { + // return this.hostShape; + // } else if (wrapperType === 'drug') { + // if (drugInTrial) { + // return this.drugInTrialShape; + // } else { + // return this.drugNotInTrialShape; + // } + // } + // } static getOptions(network: 'main' | 'analysis' | 'analysis-big') { if (network === 'main') { @@ -149,88 +148,88 @@ export class NetworkSettings { } } - static getFont(wrapperType: WrapperType, drugInTrial?: boolean) { - if (wrapperType === 'protein') { - return {color: this.hostFontColor, size: this.hostFontSize}; - } else if (wrapperType === 'drug') { - if (!drugInTrial) { - return {color: this.drugFontColor, size: this.drugFontSize}; - } else { - return {color: this.drugInTrialFontColor, size: this.drugFontSize}; - } - } - } - - static getNodeStyle(nodeType: WrapperType, - isSeed: boolean, - isSelected: boolean, - drugType?: string, - drugInTrial?: boolean, - gradient?: number): any { - if (!gradient) { - gradient = 1.0; - } - let nodeColor; - let nodeShape; - let nodeSize; - let nodeFont; - const nodeShadow = true; - nodeShape = NetworkSettings.getNodeShape(nodeType); - nodeSize = NetworkSettings.getNodeSize(nodeType); - nodeFont = NetworkSettings.getFont(nodeType); - if (nodeType === 'protein') { - nodeColor = NetworkSettings.getColor(nodeType); - nodeFont = NetworkSettings.getFont('protein'); - if (!isSeed) { - nodeColor = NetworkSettings.getColor('nonSeedHost'); - } - } else if (nodeType === 'drug') { - if (drugType === 'approved') { - nodeColor = NetworkSettings.getColor('approvedDrug'); - } else { - nodeColor = NetworkSettings.getColor('unapprovedDrug'); - } - if (drugInTrial) { - nodeShape = NetworkSettings.getNodeShape('drug', true); - nodeFont = NetworkSettings.getFont('drug', true); - } else { - nodeShape = NetworkSettings.getNodeShape('drug', false); - } - } - - if (gradient === -1) { - nodeColor = '#A0A0A0'; - } else { - nodeColor = getGradientColor('#FFFFFF', nodeColor, gradient); - } - - const node: any = { - size: nodeSize, - shape: nodeShape, - font: nodeFont, - shadow: nodeShadow, - }; - - if (isSelected) { - node.color = { - background: nodeColor, - border: this.selectedBorderColor, - highlight: { - border: this.selectBorderHighlightColor, - background: nodeColor, - }, - }; - - node.borderWidth = this.selectedBorderWidth; - node.borderWidthSelected = this.selectedBorderWidthSelected; - } else { - node.color = nodeColor; - - node.borderWidth = this.borderWidth; - node.borderWidthSelected = this.borderWidthSelected; - } - - return node; - } + // static getFont(wrapperType: WrapperType, drugInTrial?: boolean) { + // if (wrapperType === 'protein') { + // return {color: this.hostFontColor, size: this.hostFontSize}; + // } else if (wrapperType === 'drug') { + // if (!drugInTrial) { + // return {color: this.drugFontColor, size: this.drugFontSize}; + // } else { + // return {color: this.drugInTrialFontColor, size: this.drugFontSize}; + // } + // } + // } + + // static getNodeStyle(nodeType: WrapperType, + // isSeed: boolean, + // isSelected: boolean, + // drugType?: string, + // drugInTrial?: boolean, + // gradient?: number): any { + // if (!gradient) { + // gradient = 1.0; + // } + // let nodeColor; + // let nodeShape; + // let nodeSize; + // let nodeFont; + // const nodeShadow = true; + // nodeShape = NetworkSettings.getNodeShape(nodeType); + // nodeSize = NetworkSettings.getNodeSize(nodeType); + // nodeFont = NetworkSettings.getFont(nodeType); + // if (nodeType === 'protein') { + // nodeColor = NetworkSettings.getColor(nodeType); + // nodeFont = NetworkSettings.getFont('protein'); + // if (!isSeed) { + // nodeColor = NetworkSettings.getColor('nonSeedHost'); + // } + // } else if (nodeType === 'drug') { + // if (drugType === 'approved') { + // nodeColor = NetworkSettings.getColor('approvedDrug'); + // } else { + // nodeColor = NetworkSettings.getColor('unapprovedDrug'); + // } + // if (drugInTrial) { + // nodeShape = NetworkSettings.getNodeShape('drug', true); + // nodeFont = NetworkSettings.getFont('drug', true); + // } else { + // nodeShape = NetworkSettings.getNodeShape('drug', false); + // } + // } + + // if (gradient === -1) { + // nodeColor = '#A0A0A0'; + // } else { + // nodeColor = getGradientColor('#FFFFFF', nodeColor, gradient); + // } + + // const node: any = { + // size: nodeSize, + // shape: nodeShape, + // font: nodeFont, + // shadow: nodeShadow, + // }; + + // if (isSelected) { + // node.color = { + // background: nodeColor, + // border: this.selectedBorderColor, + // highlight: { + // border: this.selectBorderHighlightColor, + // background: nodeColor, + // }, + // }; + + // node.borderWidth = this.selectedBorderWidth; + // node.borderWidthSelected = this.selectedBorderWidthSelected; + // } else { + // node.color = nodeColor; + + // node.borderWidth = this.borderWidth; + // node.borderWidthSelected = this.borderWidthSelected; + // } + + // return node; + // } } diff --git a/src/app/pages/explorer-page/explorer-page.component.html b/src/app/pages/explorer-page/explorer-page.component.html index bc9f5584..99c1b0e6 100644 --- a/src/app/pages/explorer-page/explorer-page.component.html +++ b/src/app/pages/explorer-page/explorer-page.component.html @@ -184,14 +184,14 @@ <p class="card-header-title"> <span class="icon"> <i *ngIf="!selectedWrapper" class="fas fa-info" aria-hidden="true"></i> - <i *ngIf="selectedWrapper && selectedWrapper.type === 'protein'" class="fas fa-dna" aria-hidden="true"></i> - <i *ngIf="selectedWrapper && selectedWrapper.type === 'drug'" class="fas fa-capsules" - aria-hidden="true"></i> + <!-- <i *ngIf="selectedWrapper && selectedWrapper.data.netexId && selectedWrapper.data.netexId.startsWith('p')" class="fas fa-dna" aria-hidden="true"></i> + <i *ngIf="selectedWrapper && selectedWrapper.data.netexId && selectedWrapper.data.netexId.startsWith('d')" class="fas fa-capsules" + aria-hidden="true"></i> --> </span> <span *ngIf="!selectedWrapper">No item selected</span> - <span *ngIf="selectedWrapper"> - <span *ngIf="selectedWrapper.type === 'protein'">Host Protein</span> - <span *ngIf="selectedWrapper.type === 'drug'">Drug</span> + <span *ngIf="selectedWrapper && selectedWrapper.data.netexId"> + <!-- <span *ngIf="selectedWrapper.data.type">selectedWrapper.data.type</span> --> + <span *ngIf="selectedWrapper.data.netexId.startsWith('d')">Drug</span> </span> </p> <a (click)="collapseDetails = !collapseDetails" data-action="collapse" diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts index 73fe5295..65ab579d 100644 --- a/src/app/pages/explorer-page/explorer-page.component.ts +++ b/src/app/pages/explorer-page/explorer-page.component.ts @@ -392,9 +392,9 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { } // make sure all keys are set Object.entries(edgeGroups).forEach(([key, value]) => { - if (!('dashes' in value)) { - // use dashes default value if not set - value['dashes'] = defaultConfig.edgeGroups.default.dashes; + if (!('dashed' in value)) { + // use dashed default value if not set + value['dashed'] = defaultConfig.edgeGroups.default.dashed; } }) // override default node groups @@ -424,8 +424,9 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { } gProfilerLink(): string { + // nodes in selection have netexId const queryString = this.analysis.getSelection() - .filter(wrapper => wrapper.type === 'protein') + .filter(wrapper => wrapper.data.netexId.startsWith('p')) .map(wrapper => wrapper.data.uniprotAc) .join('%0A'); return 'http://biit.cs.ut.ee/gprofiler/gost?' + @@ -457,14 +458,14 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { const pos = this.networkInternal.getPositions([item.nodeId]); node.x = pos[item.nodeId].x; node.y = pos[item.nodeId].y; - Object.assign(node, - NetworkSettings.getNodeStyle( - node.wrapper.type, - node.isSeed, - this.analysis.inSelection(item), - undefined, - undefined, - 1.0)); + // Object.assign(node, + // NetworkSettings.getNodeStyle( + // node.wrapper.type, + // node.isSeed, + // this.analysis.inSelection(item), + // undefined, + // undefined, + // 1.0)); node.wrapper = item; node.gradient = 1.0; // protein.expressionLevel = undefined; diff --git a/src/index.html b/src/index.html index 7311a881..15fb3c4d 100644 --- a/src/index.html +++ b/src/index.html @@ -38,13 +38,16 @@ <network-expander id="netexp1" config='{ - "nodeGroups": {"0.5": {"type": "gene", "color": "rgb(204, 255, 51)", "groupName": "0.5", "shape": "circle"}, "patient_group": {"type": "patient", "color": "red", "groupName": "patient group", "shape": "circle"}}, - "edgeGroups": {"dashes": {"color": "black", "groupName": "Dashes Group", "dashes": [1, 2]}}, + "nodeGroups": {"0.5": {"color": "rgb(204, 255, 51)", "groupName": "0.5", "shape": "circle"}, "patient_group": {"detailShowLabel": "true", "color": "red", "groupName": "patient group", "shape": "circle"}}, + "edgeGroups": {"dashed": {"color": "black", "groupName": "Dashed Group", "dashed": [1, 2]}, "notdashed": {"color": "black", "groupName": "not Dashed Group"}}, "identifier": "symbol" }' network='{ - "nodes": [{"id": "TP53", "group": "0.5"}, {"id": "C5", "group": "0.5"}, {"id": "Patient", "group": "patient_group"}, {"label": "PTEN", "id": "PTEN", "group": 0.5}], - "edges": [{"from": "TP53","to": "C5","group": "dashes", "label": "this is a label", "title": "this is a title"}] + "nodes": [{"id": "MYC", "label": "node w/o group"}, {"id": "TP53", "group": "0.5"}, {"id": "C5", "group": "0.5"}, {"id": "Patient", "group": "patient_group"}, {"label": "PTEN", "id": "PTEN", "group": 0.5}], + "edges": [ + {"from": "TP53","to": "C5","group": "dashed", "label": "this is a label", "title": "this is a title"}, + {"from": "Patient No. 5","to": "C5","label": "w/o group"} + ] }' style="height: 100%; width: 100vw; display: block;" ></network-expander> -- GitLab