From dd94f29bd40207a2c1a016f7103a8e482836211e Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Thu, 9 Jan 2020 13:53:31 +0100
Subject: [PATCH] bugfix: try catch getNgId map

---
 .../atlasViewer.apiService.service.ts         |  7 +++--
 .../regionSearch/regionSearch.component.ts    | 31 ++++++++++++-------
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/atlasViewer/atlasViewer.apiService.service.ts b/src/atlasViewer/atlasViewer.apiService.service.ts
index b8da64e12..c68c60bf9 100644
--- a/src/atlasViewer/atlasViewer.apiService.service.ts
+++ b/src/atlasViewer/atlasViewer.apiService.service.ts
@@ -1,7 +1,7 @@
 import { Injectable } from "@angular/core";
 import { select, Store } from "@ngrx/store";
 import { Observable } from "rxjs";
-import { distinctUntilChanged, map } from "rxjs/operators";
+import { distinctUntilChanged, map, filter } from "rxjs/operators";
 import { DialogService } from "src/services/dialogService.service";
 import { LoggingService } from "src/services/logging.service";
 import { getLabelIndexMap, getMultiNgIdsRegionsLabelIndexMap, IavRootStoreInterface, safeFilter } from "src/services/stateStore.service";
@@ -140,7 +140,10 @@ export class AtlasViewerAPIServices {
 
   private init() {
     this.loadedTemplates$.subscribe(templates => this.interactiveViewer.metadata.loadedTemplates = templates)
-    this.selectParcellation$.subscribe(parcellation => {
+    this.selectParcellation$.pipe(
+      filter(p => !!p && p.regions),
+      distinctUntilChanged()
+    ).subscribe(parcellation => {
       this.interactiveViewer.metadata.regionsLabelIndexMap = getLabelIndexMap(parcellation.regions)
       this.interactiveViewer.metadata.layersRegionLabelIndexMap = getMultiNgIdsRegionsLabelIndexMap(parcellation)
     })
diff --git a/src/ui/viewerStateController/regionSearch/regionSearch.component.ts b/src/ui/viewerStateController/regionSearch/regionSearch.component.ts
index 6d666d93a..01fb37ceb 100644
--- a/src/ui/viewerStateController/regionSearch/regionSearch.component.ts
+++ b/src/ui/viewerStateController/regionSearch/regionSearch.component.ts
@@ -9,6 +9,7 @@ import { VIEWER_STATE_ACTION_TYPES } from "src/services/effect/effect";
 import { ADD_TO_REGIONS_SELECTION_WITH_IDS, CHANGE_NAVIGATION, SELECT_REGIONS } from "src/services/state/viewerState.store";
 import { generateLabelIndexId, getMultiNgIdsRegionsLabelIndexMap, IavRootStoreInterface } from "src/services/stateStore.service";
 import { VIEWERSTATE_CONTROLLER_ACTION_TYPES } from "../viewerState.base";
+import { LoggingService } from "src/services/logging.service";
 
 const filterRegionBasedOnText = searchTerm => region => region.name.toLowerCase().includes(searchTerm.toLowerCase())
   || (region.relatedAreas && region.relatedAreas.some(relatedArea => relatedArea.toLowerCase().includes(searchTerm.toLowerCase())))
@@ -42,6 +43,7 @@ export class RegionTextSearchAutocomplete {
     private store$: Store<IavRootStoreInterface>,
     private dialog: MatDialog,
     private constantService: AtlasViewerConstantsServices,
+    private log: LoggingService
   ) {
 
     this.useMobileUI$ = this.constantService.useMobileUI$
@@ -54,21 +56,26 @@ export class RegionTextSearchAutocomplete {
     this.regionsWithLabelIndex$ = viewerState$.pipe(
       select('parcellationSelected'),
       distinctUntilChanged(),
-      filter(p => !!p),
+      filter(p => !!p && p.regions),
       map(parcellationSelected => {
-        const returnArray = []
-        const ngIdMap = getMultiNgIdsRegionsLabelIndexMap(parcellationSelected, { ngId: 'root', relatedAreas: [] })
-        for (const [ngId, labelIndexMap] of ngIdMap) {
-          for (const [labelIndex, region] of labelIndexMap) {
-            returnArray.push({
-              ...region,
-              ngId,
-              labelIndex,
-              labelIndexId: generateLabelIndexId({ ngId, labelIndex }),
-            })
+        try {
+          const returnArray = []
+          const ngIdMap = getMultiNgIdsRegionsLabelIndexMap(parcellationSelected, { ngId: 'root', relatedAreas: [] })
+          for (const [ngId, labelIndexMap] of ngIdMap) {
+            for (const [labelIndex, region] of labelIndexMap) {
+              returnArray.push({
+                ...region,
+                ngId,
+                labelIndex,
+                labelIndexId: generateLabelIndexId({ ngId, labelIndex }),
+              })
+            }
           }
+          return returnArray
+        } catch (e) {
+          this.log.warn(`getMultiNgIdsRegionsLabelIndexMap error`, e)
+          return []
         }
-        return returnArray
       }),
       shareReplay(1),
     )
-- 
GitLab