diff --git a/package.json b/package.json index 13c581b9212f316d80c4a01c3a31c90993862d06..81cd549b87d5e2ec833087f961ea921c153b79d6 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@ngrx/store": "^9.1.1", "@types/node": "12.12.39", "export-nehuba": "0.0.2", - "hbp-connectivity-component": "^0.3.14", + "hbp-connectivity-component": "^0.3.18", "zone.js": "^0.10.2" } } diff --git a/src/services/state/viewerState/selectors.ts b/src/services/state/viewerState/selectors.ts index bb2bd592e782891df9f03398a7bf3171314270bc..4356a8b8ad934ac3d54d9cfe08ce810c25271bf7 100644 --- a/src/services/state/viewerState/selectors.ts +++ b/src/services/state/viewerState/selectors.ts @@ -71,6 +71,11 @@ export const viewerStateAllRegionsFlattenedRegionSelector = createSelector( } ) +export const viewerStateOverwrittenColorMap = createSelector( + state => state['viewerState'], + viewerState => viewerState['overwrittenColorMap'] +) + export const viewerStateStandAloneVolumes = createSelector( state => state['viewerState'], viewerState => viewerState['standaloneVolumes'] diff --git a/src/ui/connectivityBrowser/connectivityBrowser.component.ts b/src/ui/connectivityBrowser/connectivityBrowser.component.ts index 6941007f1550fc8dff9ab57f6b7f8b54efdd202d..d043ef5cf1ab94691e0115abbf119642cc6d9788 100644 --- a/src/ui/connectivityBrowser/connectivityBrowser.component.ts +++ b/src/ui/connectivityBrowser/connectivityBrowser.component.ts @@ -2,7 +2,7 @@ import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, - EventEmitter, + EventEmitter, OnDestroy, Output, ViewChild, @@ -11,14 +11,21 @@ import { } from "@angular/core"; import {select, Store} from "@ngrx/store"; import {fromEvent, Observable, Subscription, Subject, combineLatest} from "rxjs"; -import {distinctUntilChanged, map } from "rxjs/operators"; -import {CLEAR_CONNECTIVITY_REGION, SELECT_REGIONS, SET_CONNECTIVITY_VISIBLE} from "src/services/state/viewerState.store"; -import { safeFilter} from "src/services/stateStore.service"; -import { viewerStateNavigateToRegion } from "src/services/state/viewerState.store.helper"; -import { ngViewerActionClearView } from "src/services/state/ngViewerState/actions"; -import { ngViewerSelectorClearViewEntries } from "src/services/state/ngViewerState/selectors"; -import { viewerStateAllRegionsFlattenedRegionSelector } from "src/services/state/viewerState/selectors"; -import { HttpClient } from "@angular/common/http"; +import {distinctUntilChanged, map} from "rxjs/operators"; +import { + CLEAR_CONNECTIVITY_REGION, + SELECT_REGIONS, + SET_CONNECTIVITY_VISIBLE +} from "src/services/state/viewerState.store"; +import {safeFilter} from "src/services/stateStore.service"; +import {viewerStateNavigateToRegion} from "src/services/state/viewerState.store.helper"; +import {ngViewerActionClearView} from "src/services/state/ngViewerState/actions"; +import {ngViewerSelectorClearViewEntries} from "src/services/state/ngViewerState/selectors"; +import { + viewerStateAllRegionsFlattenedRegionSelector, + viewerStateOverwrittenColorMap +} from "src/services/state/viewerState/selectors"; +import {HttpClient} from "@angular/common/http"; const CONNECTIVITY_NAME_PLATE = 'Connectivity' @@ -26,7 +33,7 @@ const CONNECTIVITY_NAME_PLATE = 'Connectivity' selector: 'connectivity-browser', templateUrl: './connectivityBrowser.template.html', }) -export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDestroy{ +export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDestroy { private setColorMap$: Subject<boolean> = new Subject() @@ -40,19 +47,25 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe public connectivityUrl = 'https://connectivity-query-v1-1-connectivity.apps-dev.hbp.eu/v1.1/studies' @Input() - set accordionExpanded(flag: boolean){ + set accordionExpanded(flag: boolean) { /** - * ignore first update - */ + * ignore first update + */ if (this._isFirstUpdate) { this._isFirstUpdate = false return } - this.store$.dispatch( - ngViewerActionClearView({ payload: { - [CONNECTIVITY_NAME_PLATE]: flag - }}) - ) + // this.store$.dispatch( + // ngViewerActionClearView({ + // payload: { + // [CONNECTIVITY_NAME_PLATE]: flag + // } + // }) + // ) + this.store$.dispatch({ + type: SET_CONNECTIVITY_VISIBLE, + payload: 'connectivity', + }) } @Output() @@ -60,11 +73,11 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe @Output() connectivityLoadUrl: EventEmitter<string> = new EventEmitter() - + @Output() connectivityNumberReceived: EventEmitter<string> = new EventEmitter() @Input() - set region(val){ + set region(val) { const newRegionName = val && val.name if (!val) { @@ -77,19 +90,19 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe if (newRegionName !== this.regionName && this.defaultColorMap) { this.restoreDefaultColormap() - } + } this.regionName = newRegionName // TODO may not be necessary this.changeDetectionRef.detectChanges() } - + public regionName: string public datasetList: any[] = [] public selectedDataset: any public selectedDatasetDescription: string = '' public connectedAreas = [] - + private selectedParcellationFlatRegions$ = this.store$.pipe( select(viewerStateAllRegionsFlattenedRegionSelector) ) @@ -98,7 +111,9 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe private subscriptions: Subscription[] = [] public expandMenuIndex = -1 public allRegions = [] - public defaultColorMap: Map<string, Map<number, {red: number, green: number, blue: number}>> + public defaultColorMap: Map<string, Map<number, { red: number, green: number, blue: number }>> + + public noDataReceived = false @ViewChild('connectivityComponent', {read: ElementRef}) public connectivityComponentElement: ElementRef<HTMLHbpConnectivityMatrixRowElement> @ViewChild('fullConnectivityGrid') public fullConnectivityGridElement: ElementRef<HTMLFullConnectivityGridElement> @@ -131,20 +146,11 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe } public ngAfterViewInit(): void { - - this.subscriptions.push( - this.store$.pipe( - select(ngViewerSelectorClearViewEntries), - ).subscribe(keys => { - this.setColorMap$.next(keys.includes(CONNECTIVITY_NAME_PLATE)) - }) - ) - this.subscriptions.push( this.store$.pipe( - select(ngViewerSelectorClearViewEntries), - ).subscribe(keys => { - this.setOpenState.emit(keys.includes(CONNECTIVITY_NAME_PLATE)) + select(viewerStateOverwrittenColorMap), + ).subscribe(value => { + this.setColorMap$.next(!!value) }) ) @@ -156,8 +162,8 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe ) /** - * setting/restoring colormap - */ + * setting/restoring colormap + */ this.subscriptions.push( combineLatest( this.setColorMap$.pipe( @@ -167,34 +173,59 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe map((e: CustomEvent) => e.detail) ) ).subscribe(([flag, connectedAreas]) => { - this.connectivityNumberReceived.emit(connectedAreas.length) - this.connectedAreas = connectedAreas - - if (flag) { - this.addNewColorMap() - this.store$.dispatch({ - type: SET_CONNECTIVITY_VISIBLE, - payload: 'connectivity', - }) + if (connectedAreas === 'No data') { + this.store$.dispatch( + ngViewerActionClearView({ + payload: { + [CONNECTIVITY_NAME_PLATE]: false + } + }) + ) + this.connectedAreas = [] + this.noDataReceived = true + this.connectivityNumberReceived.emit('0') + + return this.restoreDefaultColormap() } else { - this.restoreDefaultColormap() - - /** - * TODO - * may no longer be necessary - */ - this.store$.dispatch({type: CLEAR_CONNECTIVITY_REGION}) - this.store$.dispatch({type: SET_CONNECTIVITY_VISIBLE, payload: null}) + this.store$.dispatch( + ngViewerActionClearView({ + payload: { + [CONNECTIVITY_NAME_PLATE]: true + } + }) + ) + this.noDataReceived = false + + this.connectivityNumberReceived.emit(connectedAreas.length) + this.connectedAreas = connectedAreas + + if (flag) { + this.addNewColorMap() + this.store$.dispatch({ + type: SET_CONNECTIVITY_VISIBLE, + payload: 'connectivity', + }) + } else { + this.restoreDefaultColormap() + + this.store$.dispatch({type: SET_CONNECTIVITY_VISIBLE, payload: null}) + + /** + * TODO + * may no longer be necessary + */ + this.store$.dispatch({type: CLEAR_CONNECTIVITY_REGION}) + } } }) ) this.subscriptions.push( - fromEvent(this.connectivityComponentElement?.nativeElement, 'collapsedMenuChanged', { capture: true }) + fromEvent(this.connectivityComponentElement?.nativeElement, 'collapsedMenuChanged', {capture: true}) .subscribe((e: CustomEvent) => { this.expandMenuIndex = e.detail }), - fromEvent(this.connectivityComponentElement?.nativeElement, 'customToolEvent', { capture: true }) + fromEvent(this.connectivityComponentElement?.nativeElement, 'customToolEvent', {capture: true}) .subscribe((e: CustomEvent) => { if (e.detail.name === 'export csv') { // ToDo Fix in future to use component @@ -209,7 +240,7 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe this.restoreDefaultColormap() this.subscriptions.forEach(s => s.unsubscribe()) } - + // ToDo Affect on component changeDataset(event = null) { if (event) { @@ -218,22 +249,22 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe } if (this.datasetList.length && this.selectedDataset) { const selectedDatasetId = this.datasetList.find(d => d.name === this.selectedDataset).id - const url = selectedDatasetId? `${this.connectivityUrl}/${selectedDatasetId}` : null + const url = selectedDatasetId ? `${this.connectivityUrl}/${selectedDatasetId}` : null this.connectivityLoadUrl.emit(url) this.loadUrl = url - this.fullConnectivityLoadUrl = selectedDatasetId? `${this.connectivityUrl}/${selectedDatasetId}/full_matrix` : null + this.fullConnectivityLoadUrl = selectedDatasetId ? `${this.connectivityUrl}/${selectedDatasetId}/full_matrix` : null } } navigateToRegion(region) { this.store$.dispatch( viewerStateNavigateToRegion({ - payload: { region: this.getRegionWithName(region) } + payload: {region: this.getRegionWithName(region)} }) ) } - + selectRegion(region) { this.store$.dispatch({ type: SELECT_REGIONS, @@ -255,7 +286,7 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe this.defaultColorMap = new Map(getWindow().interactiveViewer.viewerHandle.getLayersSegmentColourMap()) } - const existingMap: Map<string, Map<number, {red: number, green: number, blue: number}>> = (getWindow().interactiveViewer.viewerHandle.getLayersSegmentColourMap()) + const existingMap: Map<string, Map<number, { red: number, green: number, blue: number }>> = (getWindow().interactiveViewer.viewerHandle.getLayersSegmentColourMap()) const colorMap = new Map(existingMap) this.allRegions.forEach(r => { @@ -270,7 +301,11 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe .map(r => r) if (areaAsRegion && areaAsRegion.length && areaAsRegion[0].ngId) { - colorMap.get(areaAsRegion[0].ngId).set(areaAsRegion[0].labelIndex, {red: area.color.r, green: area.color.g, blue: area.color.b}) + colorMap.get(areaAsRegion[0].ngId).set(areaAsRegion[0].labelIndex, { + red: area.color.r, + green: area.color.g, + blue: area.color.b + }) } }) getWindow().interactiveViewer.viewerHandle.applyLayersColourMap(colorMap) @@ -280,6 +315,7 @@ export class ConnectivityBrowserComponent implements OnInit, AfterViewInit, OnDe const a = document.querySelector('hbp-connectivity-matrix-row') a.downloadCSV() } + public exportFullConnectivity() { this.fullConnectivityGridElement.nativeElement['downloadCSV']() } diff --git a/src/ui/connectivityBrowser/connectivityBrowser.template.html b/src/ui/connectivityBrowser/connectivityBrowser.template.html index 0c829e754cc9908a739d81cd7531d6b5131653c7..05dd7a044ee75a57965e2795998cb463a2385578 100644 --- a/src/ui/connectivityBrowser/connectivityBrowser.template.html +++ b/src/ui/connectivityBrowser/connectivityBrowser.template.html @@ -76,6 +76,7 @@ </div> <div slot="exportslot"> <button mat-icon-button + [disabled]="noDataReceived" (click)="exportConnectivityProfile()" matTooltip="Export connectivity profile"> <i class="fas fa-download mb-2"></i> @@ -88,4 +89,4 @@ [description]="selectedDatasetDescription" onlyExport="true"> </full-connectivity-grid> -</div> \ No newline at end of file +</div> diff --git a/src/ui/nehubaContainer/nehubaContainer.component.ts b/src/ui/nehubaContainer/nehubaContainer.component.ts index a0ca5fae81db51d42565d081eb8f8a218efa4d4b..43f30390e593e7452225b7516434e7039885a39a 100644 --- a/src/ui/nehubaContainer/nehubaContainer.component.ts +++ b/src/ui/nehubaContainer/nehubaContainer.component.ts @@ -301,7 +301,6 @@ export class NehubaContainer implements OnInit, OnChanges, OnDestroy { public hoveredPanelIndices$: Observable<number> - @ViewChild('connectivityComponent') public connectivityComponent: ConnectivityBrowserComponent public connectivityNumber: string constructor( diff --git a/src/ui/nehubaContainer/nehubaContainer.template.html b/src/ui/nehubaContainer/nehubaContainer.template.html index 8ced2dd4687ad88468f3a7e3103b4d907ae8bb1d..499f5c3bb03e8588de34016681b512a7f2f74255 100644 --- a/src/ui/nehubaContainer/nehubaContainer.template.html +++ b/src/ui/nehubaContainer/nehubaContainer.template.html @@ -547,8 +547,7 @@ [region]="region" (setOpenState)="expansionPanel.expanded = $event" (connectivityNumberReceived)="connectivityNumber = $event" - [accordionExpanded]="expansionPanel.expanded" - #connectivityComponent> + [accordionExpanded]="expansionPanel.expanded"> </connectivity-browser> </ng-container> </mat-card-content> @@ -569,7 +568,7 @@ iav-counter #connectedCounterDir="iavCounter"> - <hbp-connectivity-matrix-row [region]="region.name" + <hbp-connectivity-matrix-row *ngIf="region && region.name" [region]="region.name" (connectivityDataReceived)="connectedCounterDir.value = $event.detail.length" class="invisible d-block h-0 w-0" loadurl="https://connectivity-query-v1-1-connectivity.apps-dev.hbp.eu/v1.1/studies/1345998a08539dc24bda8817c7d5804558d83b1c">