From 5751f9b0a1510a2b8b5d61823245ff9e5aec318a Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Fri, 15 Oct 2021 17:25:32 +0200
Subject: [PATCH] chore: clean up siibra-api region types

---
 docs/releases/v2.5.4.md                       |  1 +
 .../parcellationRegion/region.base.ts         | 19 ++++--
 .../regionMenu/regionMenu.template.html       | 16 +----
 .../regionSimple/regionSimple.template.html   |  2 +-
 .../genericInfoCmp/genericInfo.component.ts   |  4 +-
 .../showDataset/showDataset.directive.ts      |  2 +-
 src/util/patchPureConstants.ts                |  4 +-
 src/util/pureConstant.service.ts              | 12 ++--
 src/util/siibraApiConstants/types.ts          | 65 +++++++++----------
 .../breadcrumb/breadcrumb.component.ts        |  5 +-
 10 files changed, 62 insertions(+), 68 deletions(-)

diff --git a/docs/releases/v2.5.4.md b/docs/releases/v2.5.4.md
index 2fb803df1..9d241dcd3 100644
--- a/docs/releases/v2.5.4.md
+++ b/docs/releases/v2.5.4.md
@@ -5,3 +5,4 @@
 - Added version check for siibra-api
 - Updated deploy template
 - Remove unused components
+- Clean up siibra-api types
diff --git a/src/atlasComponents/parcellationRegion/region.base.ts b/src/atlasComponents/parcellationRegion/region.base.ts
index 31de7af98..12209ddb7 100644
--- a/src/atlasComponents/parcellationRegion/region.base.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.ts
@@ -8,6 +8,8 @@ import { viewerStateSetConnectivityRegion, viewerStateNavigateToRegion, viewerSt
 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";
+import { TRegionDetail } from "src/util/siibraApiConstants/types";
+import { IHasId } from "src/util/interfaces";
 
 @Directive()
 export class RegionBase {
@@ -15,7 +17,14 @@ export class RegionBase {
   public rgbString: string
   public rgbDarkmode: boolean
 
-  private _region: any
+  private _region: TRegionDetail & {  
+    context: {
+      atlas: IHasId
+      template: IHasId
+      parcellation: IHasId
+    }
+    ngId?: string
+  }
 
   private _position: [number, number, number]
   set position(val){
@@ -34,16 +43,12 @@ export class RegionBase {
   set region(val) {
     this._region = val
     this.region$.next(this._region)
-    this.hasContext$.next(!!this._region.context)
+    this.hasContext$.next(!!this._region?.context)
 
     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
@@ -65,7 +70,7 @@ export class RegionBase {
 
   get originDatainfos(){
     if (!this._region) return []
-    return this._region._dataset_specs || this._region.originDatainfos
+    return (this._region._dataset_specs || []).filter(spec => spec['@type'] === 'minds/core/dataset/v1.0.0')
   }
 
   public hasContext$: BehaviorSubject<boolean> = new BehaviorSubject(false)
diff --git a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
index 1849ae929..db607952a 100644
--- a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
+++ b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
@@ -10,7 +10,6 @@
     <mat-card-title>
       <div class="position-relative region-name iv-custom-comp text">
         {{ region.name }}
-        <small *ngIf="region.status"> ({{region.status}})</small>
       </div>
     </mat-card-title>
 
@@ -22,20 +21,7 @@
       </span>
 
       <!-- origin datas format -->
-      <div *ngFor="let originDataset of (region.originDatasets || []); let index = index"
-        class="ml-2">
-        <i>&#183;</i>
-
-        <span *ngIf="originDataset?.format?.name as regionOrDsFormatName; else fallbackODsnameTmpl">
-          {{ regionOrDsFormatName }}
-        </span>
-        <ng-template #fallbackODsnameTmpl>
-          <span>
-            {{ regionOriginDatasetLabels$ | async | renderViewOriginDatasetlabel : index }}
-          </span>
-        </ng-template>
-      </div>
-
+      
       <mat-divider vertical="true" class="ml-2 h-2rem"></mat-divider>
 
       <!-- position -->
diff --git a/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html b/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
index 7a8ce3161..b724ab6f2 100644
--- a/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
+++ b/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
@@ -1,7 +1,7 @@
 <div class="d-flex flex-row">
 
   <small class="text-truncate flex-shrink-1 flex-grow-1">
-    {{ region.name }}<span *ngIf="region.status" class="text-muted">{{' (' + region.status + ')'}}</span>
+    {{ region.name }}
   </small>
 
   <div class="flex-grow-0 flex-shrink-0 d-flex flex-row">
diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts b/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
index d36cc47d4..d3fcb2216 100644
--- a/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
+++ b/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
@@ -5,14 +5,14 @@ import { ARIA_LABELS, CONST } from 'common/constants'
 import { TBSSummary } from "../../kgDataset";
 import { BsFeatureService } from "../../service";
 import { MAT_DIALOG_DATA } from "@angular/material/dialog";
-import { TDatainfos } from "src/util/siibraApiConstants/types";
+import { TDatainfosDetail } from "src/util/siibraApiConstants/types";
 import { TRegion } from "../../type";
 
 /**
  * this component is specifically used to render side panel ebrains dataset view
  */
 
-export type TInjectableData = TDatainfos & {
+export type TInjectableData = TDatainfosDetail & {
   dataType?: string
   view?: ViewRef | TemplateRef<any>
   region?: TRegion
diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts b/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
index 2cc1dae60..5aeb3c1eb 100644
--- a/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
+++ b/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
@@ -2,7 +2,7 @@ import { Directive, HostListener, Inject, Input, Optional } from "@angular/core"
 import { MatDialog, MatDialogConfig } from "@angular/material/dialog";
 import { MatSnackBar } from "@angular/material/snack-bar";
 import { OVERWRITE_SHOW_DATASET_DIALOG_TOKEN, TOverwriteShowDatasetDialog } from "src/util/interfaces";
-import { TRegion as TSiibraRegion } from "src/util/siibraApiConstants/types";
+import { TRegionDetail as TSiibraRegion } from "src/util/siibraApiConstants/types";
 import { TRegion as TContextRegion } from 'src/atlasComponents/regionalFeatures/bsFeatures/type'
 
 export const IAV_DATASET_SHOW_DATASET_DIALOG_CMP = 'IAV_DATASET_SHOW_DATASET_DIALOG_CMP'
diff --git a/src/util/patchPureConstants.ts b/src/util/patchPureConstants.ts
index 681860add..a8fc56c92 100644
--- a/src/util/patchPureConstants.ts
+++ b/src/util/patchPureConstants.ts
@@ -6,7 +6,7 @@
  */
 
 import { IHasId } from "./interfaces";
-import { TRegion } from "./siibraApiConstants/types";
+import { TRegionSummary } from "./siibraApiConstants/types";
 
 type TAppend = {
   parent: IHasId | { name: string }
@@ -22,7 +22,7 @@ type TPatchRegion = {
   '@id': string
   targetSpace: IHasId[] | '*'
   targetParcellation: IHasId[] | '*'
-  payload: Partial<TRegion>
+  payload: Partial<TRegionSummary>
 } & (TAppend | TPatch)
 
 const encoder = new TextEncoder()
diff --git a/src/util/pureConstant.service.ts b/src/util/pureConstant.service.ts
index d665d97fb..3e9b7abd1 100644
--- a/src/util/pureConstant.service.ts
+++ b/src/util/pureConstant.service.ts
@@ -9,7 +9,7 @@ import { LoggingService } from "src/logging";
 import { viewerStateFetchedAtlasesSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors";
 import { BS_ENDPOINT, BACKENDURL } from "src/util/constants";
 import { flattenReducer } from 'common/util'
-import { IVolumeTypeDetail, TAtlas, TId, TParc, TRegion, TRegionDetail, TSpaceFull, TSpaceSummary, TVolumeSrc } from "./siibraApiConstants/types";
+import { IVolumeTypeDetail, TAtlas, TId, TParc, TRegionDetail, TRegionSummary, TSpaceFull, TSpaceSummary, TVolumeSrc } from "./siibraApiConstants/types";
 import { MultiDimMap, recursiveMutate, mutateDeepMerge } from "./fn";
 import { patchRegions } from './patchPureConstants'
 import { environment } from "src/environments/environment";
@@ -216,7 +216,7 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
   )
 
   private getRegions(atlasId: string, parcId: string, spaceId: string){
-    return this.http.get<TRegion[]>(
+    return this.http.get<TRegionSummary[]>(
       `${this.bsEndpoint}/atlases/${encodeURIComponent(atlasId)}/parcellations/${encodeURIComponent(parcId)}/regions`,
       {
         params: {
@@ -252,7 +252,7 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
                   if (p.parent['name'] === region.name) {
                     if (!region.children) region.children = []
                     region.children.push(
-                      p.payload as TRegion
+                      p.payload as TRegionSummary
                     )
                   }
                 }
@@ -547,7 +547,11 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
                              * in the case of interpolated, it sucks that the ngLayerObj will be set multiple times
                              */
 
-                            const dedicatedMap = region._dataset_specs.filter(spec => spec.space_id === tmpl.id && spec['volume_type'] === 'neuroglancer/precomputed')
+                            const dedicatedMap = region._dataset_specs.filter(
+                              spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1'
+                              && spec.space_id === tmpl.id
+                              && spec['volume_type'] === 'neuroglancer/precomputed'
+                            ) as TVolumeSrc<'neuroglancer/precomputed'>[]
                             if (dedicatedMap.length === 1) {
                               const ngId = getNgId(atlas['@id'], tmpl.id, parc.id, dedicatedMap[0]['@id'])
                               region['ngId'] = ngId
diff --git a/src/util/siibraApiConstants/types.ts b/src/util/siibraApiConstants/types.ts
index 7f3170ad6..40feae057 100644
--- a/src/util/siibraApiConstants/types.ts
+++ b/src/util/siibraApiConstants/types.ts
@@ -96,7 +96,14 @@ export type TParcSummary = {
   name: string
 }
 
-export type TDatainfos = {
+export type TDatainfoSummary = {
+  '@type': 'minds/core/dataset/v1.0.0'
+  kgSchema: string
+  kgId: string
+}
+
+export type TDatainfosDetail = {
+  '@type': 'minds/core/dataset/v1.0.0'
   name: string
   description: string
   urls: {
@@ -148,22 +155,37 @@ export type TParc = {
   _dataset_specs: TDatasetSpec[]
 }
 
+export type TRegionSummary = {
+  name: string
+  labelIndex: number
+  rgb: [number, number, number]
+  id: number
+  availableIn: {
+    id: string
+    name: string
+  }[]
+  _dataset_specs: (TVolumeSrc<keyof IVolumeTypeDetail> | TDatainfoSummary)[]
+  children: TRegionSummary[]
+}
+
 export type TRegionDetail = {
   name: string
-  children: TRegionDetail[]
-  rgb: number[]
-  id: string
   labelIndex: number
-  volumeSrc: {
-    [key: string]: {
-      [key: string]: TVolumeSrc<keyof IVolumeTypeDetail>[]
-    }
+  rgb: [number, number, number]
+  id: {
+    kg: TKgIdentifier
   }
   availableIn: {
     id: string
     name: string
   }[]
+  _dataset_specs: (TVolumeSrc<keyof IVolumeTypeDetail> | TDatainfosDetail)[]
+
+  children: TRegionDetail[]
   hasRegionalMap: boolean
+  links: {
+    [key: string]: string
+  }
   props: {
     components: {
       centroid: [number, number, number]
@@ -171,31 +193,6 @@ export type TRegionDetail = {
     }[]
     space: any
   }
-  links: {
-    [key: string]: string
-  }
-  originDatainfos: TDatainfos[]
+  
 }
 
-export type TRegion = {
-  name: string
-  children: TRegion[]
-
-  labelIndex?: number
-  rgb?: number[]
-  id?: {
-    kg: TKgIdentifier
-  }
-
-  _dataset_specs: TVolumeSrc<keyof IVolumeTypeDetail>[]
-
-  /**
-   * missing 
-   */
-
-  originDatasets?: ({
-    filename: string
-  } & TKgIdentifier) []
-
-  position?: number[]
-}
diff --git a/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts b/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
index a57a22a76..8bf705e68 100644
--- a/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
+++ b/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
@@ -7,7 +7,7 @@ import { distinctUntilChanged, map } from "rxjs/operators";
 import { viewerStateHelperSelectParcellationWithId, viewerStateRemoveAdditionalLayer, viewerStateSetSelectedRegions } from "src/services/state/viewerState.store.helper";
 import { ngViewerActionClearView, ngViewerSelectorClearViewEntries } from "src/services/state/ngViewerState.store.helper";
 import { OVERWRITE_SHOW_DATASET_DIALOG_TOKEN } from "src/util/interfaces";
-import { TDatainfos, TParc, TSimpleInfo } from "src/util/siibraApiConstants/types";
+import { TDatainfosDetail } from "src/util/siibraApiConstants/types";
 
 @Component({
   selector: 'viewer-state-breadcrumb',
@@ -120,10 +120,11 @@ export class ViewerStateBreadCrumb {
 })
 
 export class OriginalDatainfoPipe implements PipeTransform{
-  public transform(arr: TDatainfos[]): TDatainfos[]{
+  public transform(arr: TDatainfosDetail[]): TDatainfosDetail[]{
     if (arr.length > 0) {
       return arr.map(d => {
         return {
+          '@type': 'minds/core/dataset/v1.0.0',
           name: d.name,
           description: d.name,
           urls: [],
-- 
GitLab