From b178d750986e227844f8de541f270e4a887fd16c Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Tue, 20 Jul 2021 11:17:44 +0200
Subject: [PATCH] feat: add centroid support

---
 .../navigating/originDataset.prod.e2e-spec.js  |  2 +-
 .../parcellationRegion/region.base.ts          | 18 ++++++++++--------
 .../regionMenu/regionMenu.component.ts         |  3 ++-
 .../regionMenu/regionMenu.template.html        |  3 ++-
 src/state/effects/viewerState.useEffect.ts     |  3 ++-
 src/util/pureConstant.service.ts               |  1 -
 src/util/siibraApiConstants/fn.ts              |  6 ++++++
 src/util/siibraApiConstants/types.ts           |  4 ++--
 8 files changed, 25 insertions(+), 15 deletions(-)
 create mode 100644 src/util/siibraApiConstants/fn.ts

diff --git a/e2e/src/navigating/originDataset.prod.e2e-spec.js b/e2e/src/navigating/originDataset.prod.e2e-spec.js
index ff4aea1de..db6c60dd2 100644
--- a/e2e/src/navigating/originDataset.prod.e2e-spec.js
+++ b/e2e/src/navigating/originDataset.prod.e2e-spec.js
@@ -1,6 +1,6 @@
 const { AtlasPage } = require("../util")
 const { ARIA_LABELS } = require('../../../common/constants')
-const { SHOW_CONNECTIVITY_DATA, SHOW_IN_OTHER_REF_SPACE, SHOW_ORIGIN_DATASET } = ARIA_LABELS
+const { SHOW_ORIGIN_DATASET } = ARIA_LABELS
 
 const cssSelector = `[aria-label="${SHOW_ORIGIN_DATASET}"]`
 
diff --git a/src/atlasComponents/parcellationRegion/region.base.ts b/src/atlasComponents/parcellationRegion/region.base.ts
index 56321ecad..d954d08b1 100644
--- a/src/atlasComponents/parcellationRegion/region.base.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.ts
@@ -3,11 +3,11 @@ import { select, Store, createSelector } from "@ngrx/store";
 import { uiStateOpenSidePanel, uiStateExpandSidePanel, uiActionShowSidePanelConnectivity } from 'src/services/state/uiState.store.helper'
 import { distinctUntilChanged, switchMap, filter, map, withLatestFrom } from "rxjs/operators";
 import { Observable, BehaviorSubject, combineLatest } from "rxjs";
-import { ARIA_LABELS } from 'common/constants'
 import { flattenRegions, getIdFromKgIdObj, rgbToHsl } from 'common/util'
 import { viewerStateSetConnectivityRegion, viewerStateNavigateToRegion, viewerStateToggleRegionSelect, viewerStateNewViewer, isNewerThan } from "src/services/state/viewerState.store.helper";
 import { viewerStateFetchedTemplatesSelector, viewerStateGetSelectedAtlas, viewerStateSelectedTemplateFullInfoSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors";
 import { strToRgb, verifyPositionArg, getRegionHemisphere } from 'common/util'
+import { getPosFromRegion } from "src/util/siibraApiConstants/fn";
 
 export class RegionBase {
 
@@ -34,11 +34,19 @@ export class RegionBase {
     this._region = val
     this.region$.next(this._region)
 
-    this.position = val?.position
+    this.position = null
     // bug the centroid returned is currently nonsense
     // this.position = val?.props?.centroid_mm
     if (!this._region) return
 
+    if (val?.position) {
+      this.position = val?.position 
+    }
+    const pos = getPosFromRegion(val)
+    if (pos) {
+      this.position = pos
+    }
+
     const rgb = this._region.rgb
       || (this._region.labelIndex > 65500 && [255, 255, 255])
       || strToRgb(`${this._region.ngId || this._region.name}${this._region.labelIndex}`)
@@ -191,12 +199,6 @@ export class RegionBase {
       navigation,
     }))
   }
-
-  public GO_TO_REGION_CENTROID = ARIA_LABELS.GO_TO_REGION_CENTROID
-  public SHOW_CONNECTIVITY_DATA = ARIA_LABELS.SHOW_CONNECTIVITY_DATA
-  public SHOW_IN_OTHER_REF_SPACE = ARIA_LABELS.SHOW_IN_OTHER_REF_SPACE
-  public SHOW_ORIGIN_DATASET = ARIA_LABELS.SHOW_ORIGIN_DATASET
-  public AVAILABILITY_IN_OTHER_REF_SPACE = ARIA_LABELS.AVAILABILITY_IN_OTHER_REF_SPACE
 }
 
 export const getRegionParentParcRefSpace = createSelector(
diff --git a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.component.ts b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.component.ts
index 8747535e5..879815ee4 100644
--- a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.component.ts
+++ b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.component.ts
@@ -2,7 +2,7 @@ import { Component, OnDestroy } from "@angular/core";
 import { Store } from "@ngrx/store";
 import { Observable, Subscription } from "rxjs";
 import { RegionBase } from '../region.base'
-import { CONST } from 'common/constants'
+import { CONST, ARIA_LABELS } from 'common/constants'
 import { ComponentStore } from "src/viewerModule/componentStore";
 
 @Component({
@@ -14,6 +14,7 @@ import { ComponentStore } from "src/viewerModule/componentStore";
 export class RegionMenuComponent extends RegionBase implements OnDestroy {
 
   public CONST = CONST
+  public ARIA_LABELS = ARIA_LABELS
   private subscriptions: Subscription[] = []
 
   public activePanelTitles$: Observable<string[]>
diff --git a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
index 2ce44030f..1c4f8bc1b 100644
--- a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
+++ b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
@@ -41,7 +41,7 @@
       <!-- position -->
       <button mat-icon-button *ngIf="position"
         (click)="navigateToRegion()"
-        [matTooltip]="GO_TO_REGION_CENTROID + ': ' + (position | addUnitAndJoin : 'mm')">
+        [matTooltip]="ARIA_LABELS.GO_TO_REGION_CENTROID + ': ' + (position | nmToMm | addUnitAndJoin : 'mm')">
         <mat-icon fontSet="fas" fontIcon="fa-map-marked-alt">
         </mat-icon>
       </button>
@@ -51,6 +51,7 @@
         <ng-container *ngFor="let info of infos">
           <a *ngFor="let url of info.urls"
             [href]="url.doi | doiParserPipe"
+            [matTooltip]="ARIA_LABELS.EXPLORE_DATASET_IN_KG"
             target="_blank"
             mat-icon-button>
             <i class="fas fa-external-link-alt"></i>
diff --git a/src/state/effects/viewerState.useEffect.ts b/src/state/effects/viewerState.useEffect.ts
index 0c96a3b9a..27af76905 100644
--- a/src/state/effects/viewerState.useEffect.ts
+++ b/src/state/effects/viewerState.useEffect.ts
@@ -16,6 +16,7 @@ import { uiActionHideAllDatasets } from "src/services/state/uiState/actions";
 import { viewerStateFetchedAtlasesSelector } from "src/services/state/viewerState/selectors";
 import { viewerStateChangeNavigation } from "src/services/state/viewerState/actions";
 import { cvtNavigationObjToNehubaConfig } from 'src/viewerModule/nehuba/util'
+import { getPosFromRegion } from "src/util/siibraApiConstants/fn";
 
 const defaultPerspectiveZoom = 1e6
 const defaultZoom = 1e6
@@ -400,7 +401,7 @@ export class ViewerStateControllerUseEffect implements OnDestroy {
           })
         }
 
-        const position = region.position || (region?.props?.centroid_mm || []).map((v: number) => v*1e6)
+        const position = region.position || getPosFromRegion(region)
         if (!position) {
           return generalActionError({
             message: `${region.name} - does not have a position defined`
diff --git a/src/util/pureConstant.service.ts b/src/util/pureConstant.service.ts
index 129d0f276..411066e27 100644
--- a/src/util/pureConstant.service.ts
+++ b/src/util/pureConstant.service.ts
@@ -384,7 +384,6 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
         atlases.map(
           atlas => this.getSpacesAndParc(atlas.id).pipe(
             map(({ templateSpaces, parcellations }) => {
-              console.log({parcellations})
               return {
                 '@id': atlas.id,
                 name: atlas.name,
diff --git a/src/util/siibraApiConstants/fn.ts b/src/util/siibraApiConstants/fn.ts
new file mode 100644
index 000000000..cf820dcf6
--- /dev/null
+++ b/src/util/siibraApiConstants/fn.ts
@@ -0,0 +1,6 @@
+import { TRegionDetail } from "./types";
+
+export function getPosFromRegion(region: TRegionDetail){
+  if (!region?.props?.[0]) return null
+  return region.props[0].centroid_mm.map(v => v*1e6) as [number, number, number]
+}
\ No newline at end of file
diff --git a/src/util/siibraApiConstants/types.ts b/src/util/siibraApiConstants/types.ts
index 1fadb0188..0efa98b92 100644
--- a/src/util/siibraApiConstants/types.ts
+++ b/src/util/siibraApiConstants/types.ts
@@ -143,11 +143,11 @@ export type TRegionDetail = {
   }[]
   hasRegionalMap: boolean
   props: {
-    centroid_mm: number[]
+    centroid_mm: [number, number, number]
     volume_mm: number
     surface_mm: number
     is_cortical: number
-  }
+  }[]
   links: {
     [key: string]: string
   }
-- 
GitLab