From 7cbcf55086407afd46e5523a67b4556bbc7e9fd2 Mon Sep 17 00:00:00 2001 From: "Hartung, Michael" <michael.hartung@uni-hamburg.de> Date: Fri, 21 Oct 2022 10:35:29 +0200 Subject: [PATCH] seed selection based on groups and all nodes --- src/app/app.module.ts | 2 + src/app/config.ts | 2 +- .../explorer-page.component.html | 36 ++++++++++++- .../explorer-page/explorer-page.component.ts | 8 --- .../group-selection.component.html | 18 +++++++ .../group-selection.component.scss | 0 .../group-selection.component.spec.ts | 25 +++++++++ .../group-selection.component.ts | 41 ++++++++++++++ src/app/services/analysis/analysis.service.ts | 53 ++++++++++++++----- 9 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 src/app/pages/explorer-page/group-selection/group-selection.component.html create mode 100644 src/app/pages/explorer-page/group-selection/group-selection.component.scss create mode 100644 src/app/pages/explorer-page/group-selection/group-selection.component.spec.ts create mode 100644 src/app/pages/explorer-page/group-selection/group-selection.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1673c4d2..257a588c 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -49,6 +49,7 @@ import { LicenseAgreementComponent } from './components/license-agreement/licens import { QuickDrugTargetComponent } from './components/quick-drug-target/quick-drug-target.component'; import { QuickDrugComponent } from './components/quick-drug/quick-drug.component'; import { ToastComponent } from './components/toast/toast.component'; +import { GroupSelectionComponent } from './pages/explorer-page/group-selection/group-selection.component'; @NgModule({ @@ -79,6 +80,7 @@ import { ToastComponent } from './components/toast/toast.component'; QuickDrugTargetComponent, QuickDrugComponent, ToastComponent, + GroupSelectionComponent, ], imports: [ BrowserModule, diff --git a/src/app/config.ts b/src/app/config.ts index faf3ce17..93aca8fb 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -121,7 +121,7 @@ const defaultNodeGroup: NodeGroup = { borderWidthSelected: 2 }; const connectorNodeGroup: NodeGroup = JSON.parse(JSON.stringify(defaultNodeGroup)); -connectorNodeGroup.groupName = 'Connector Node'; +connectorNodeGroup.groupName = 'Connector Nodes'; // @ts-ignore /** diff --git a/src/app/pages/explorer-page/explorer-page.component.html b/src/app/pages/explorer-page/explorer-page.component.html index 82cf9555..f6d1342f 100644 --- a/src/app/pages/explorer-page/explorer-page.component.html +++ b/src/app/pages/explorer-page/explorer-page.component.html @@ -471,7 +471,41 @@ <footer class="card-footer"> <a - (click)="analysis.invertSelection(networkHandler.activeNetwork.currentViewNodes)" + (click)="analysis.addAllToSelection()" + class="card-footer-item text-primary" + tooltipPosition="top" + pTooltip="Add all proteins to the selection." + > + <span class="icon"> + <i class="fa fa-plus"></i> + </span> + <span> Add all </span> + </a> + </footer> + <footer class="card-footer"> + <a + class="card-footer-item text-primary" + tooltipPosition="top" + pTooltip="Add all proteins to the selection." + > + <span class="icon"> + <i class="fa fa-plus"></i> + </span> + <span class="is-fullwidth"> + <app-group-selection + (selectGroupEmitter)="analysis.addGroupToSelection($event)" + [nodeGroups]="drugstoneConfig.config.nodeGroups" + ></app-group-selection> + </span> + </a> + </footer> + <footer class="card-footer"> + <a + (click)=" + analysis.invertSelection( + networkHandler.activeNetwork.currentViewNodes + ) + " class="card-footer-item text-primary" tooltipPosition="top" pTooltip="Invert the current selection." diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts index 6a521aff..bd300ee8 100644 --- a/src/app/pages/explorer-page/explorer-page.component.ts +++ b/src/app/pages/explorer-page/explorer-page.component.ts @@ -591,12 +591,4 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { this.taskEvent.emit(eventObject); } - // //TODO check if used - // setInputNetwork(network: any) { - // if (network == null) - // this.analysis.inputNetwork = { nodes: this.proteins, edges: this.edges } - // else - // this.analysis.inputNetwork = network; - // } -// } diff --git a/src/app/pages/explorer-page/group-selection/group-selection.component.html b/src/app/pages/explorer-page/group-selection/group-selection.component.html new file mode 100644 index 00000000..570e6d91 --- /dev/null +++ b/src/app/pages/explorer-page/group-selection/group-selection.component.html @@ -0,0 +1,18 @@ +<span class="add-group-selector"> + <ng-select + [items]="_nodeGroupsList" + bindLabel="groupName" + bindValue="groupName" + [virtualScroll]="true" + [placeholder]="getAddGroupLabel()" + (change)="selectGroup($event)" + pTooltip="Select all nodes of a group." + [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-right'" + tooltipPosition="right" + [clearable]="false" + > + <ng-template ng-option-tmp let-item="item"> + <span>{{ item.groupName }}</span> + </ng-template> + </ng-select> +</span> diff --git a/src/app/pages/explorer-page/group-selection/group-selection.component.scss b/src/app/pages/explorer-page/group-selection/group-selection.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/pages/explorer-page/group-selection/group-selection.component.spec.ts b/src/app/pages/explorer-page/group-selection/group-selection.component.spec.ts new file mode 100644 index 00000000..5a3acf28 --- /dev/null +++ b/src/app/pages/explorer-page/group-selection/group-selection.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { GroupSelectionComponent } from './group-selection.component'; + +describe('GroupSelectionComponent', () => { + let component: GroupSelectionComponent; + let fixture: ComponentFixture<GroupSelectionComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ GroupSelectionComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(GroupSelectionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/explorer-page/group-selection/group-selection.component.ts b/src/app/pages/explorer-page/group-selection/group-selection.component.ts new file mode 100644 index 00000000..52baf2c8 --- /dev/null +++ b/src/app/pages/explorer-page/group-selection/group-selection.component.ts @@ -0,0 +1,41 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { NodeGroup } from 'src/app/config'; + +@Component({ + selector: 'app-group-selection', + templateUrl: './group-selection.component.html', + styleUrls: ['./group-selection.component.scss'] +}) +export class GroupSelectionComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + + // undefined groupName is selected node group + private unselecableGroups = ['Drug', 'Disorders', undefined, 'Seed Nodes', 'Default Node Group', 'Connector Nodes', 'Found Nodes']; + public _nodeGroupsList: NodeGroup[]; + + @Output() selectGroupEmitter: EventEmitter<NodeGroup> = new EventEmitter(); + @Input() set nodeGroups(value: { string: NodeGroup }) { + this._nodeGroupsList = Object.values(value).filter(nodeGroup => !this.unselecableGroups.includes(nodeGroup.groupName)); + console.log(this._nodeGroupsList) + } + public selectedGroup = null; + + selectGroup(item) { + if (item === undefined) { + return + } + this.selectedGroup = item; + this.selectGroupEmitter.emit(item); + } + + getAddGroupLabel() { + if (this.selectedGroup != null) + return "" + return "Group"; + } + +} diff --git a/src/app/services/analysis/analysis.service.ts b/src/app/services/analysis/analysis.service.ts index 40ac700e..6ccb84a0 100644 --- a/src/app/services/analysis/analysis.service.ts +++ b/src/app/services/analysis/analysis.service.ts @@ -7,6 +7,7 @@ import {NetexControllerService} from '../netex-controller/netex-controller.servi import {DrugstoneConfigService} from "../drugstone-config/drugstone-config.service"; import {NetworkHandlerService} from "../network-handler/network-handler.service"; import { ToastService } from '../toast/toast.service'; +import { NodeGroup } from 'src/app/config'; export type AlgorithmType = 'trustrank' @@ -152,28 +153,52 @@ export class AnalysisService { this.selectListSubject.next({items: removedWrappers, selected: false}); } - public addSeeds(nodes) { - const addedWrappers: Wrapper[] = []; - nodes.forEach((node) => { - if (node.isSeed === true && !this.inSelection(node)) { - addedWrappers.push(node); - this.selectedItems.set(node.id, node); + public addGroupToSelection(group: NodeGroup) { + const wrappers: Wrapper[] = []; + this.networkHandler.activeNetwork.currentViewNodes.forEach((node) => { + if (node.groupName !== group.groupName || node.drugstoneType !== 'protein') { + // only consider nodes of group and proteins + return } + wrappers.push(getWrapperFromNode(node)); }); - this.selectListSubject.next({items: addedWrappers, selected: true}); + this.addItems(wrappers) } - public removeSeeds(nodes) { - const removedWrappers: Wrapper[] = []; - nodes.forEach((node) => { - if (node.isSeed === true && this.inSelection(node)) { - removedWrappers.push(node); - this.selectedItems.delete(node.id); + public addAllToSelection() { + const wrappers: Wrapper[] = []; + this.networkHandler.activeNetwork.currentViewNodes.forEach((node) => { + if (node.drugstoneType !== 'protein') { + // only consider proteins + return } + wrappers.push(getWrapperFromNode(node)); }); - this.selectListSubject.next({items: removedWrappers, selected: false}); + this.addItems(wrappers) } + // public addSeeds(nodes) { + // const addedWrappers: Wrapper[] = []; + // nodes.forEach((node) => { + // if (node.isSeed === true && !this.inSelection(node)) { + // addedWrappers.push(node); + // this.selectedItems.set(node.id, node); + // } + // }); + // this.selectListSubject.next({items: addedWrappers, selected: true}); + // } + + // public removeSeeds(nodes) { + // const removedWrappers: Wrapper[] = []; + // nodes.forEach((node) => { + // if (node.isSeed === true && this.inSelection(node)) { + // removedWrappers.push(node); + // this.selectedItems.delete(node.id); + // } + // }); + // this.selectListSubject.next({items: removedWrappers, selected: false}); + // } + public invertSelection(nodes) { const newSelection = []; nodes.forEach((node: Node) => { -- GitLab