From 9cb9e48e21ef7c04b439959e09728a0760e5548b Mon Sep 17 00:00:00 2001
From: Florent POITTEVIN <poittevin.florent@gmail.com>
Date: Wed, 3 Jun 2020 15:41:11 +0200
Subject: [PATCH] fix: 1427 org unit display is not the good one on list when
 change filter

---
 ...ed-organizational-unit-name.container.html |  5 +-
 ...ared-organizational-unit-name.container.ts | 49 ++++++++++++++-----
 2 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.html b/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.html
index 2661dfe8f..e7d76e4f8 100644
--- a/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.html
+++ b/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.html
@@ -1 +1,4 @@
-{{name | async}}
+<div [dlcmSpinner]="isLoading"
+     [dlcmSpinnerStrokeWidth]="2"
+     [dlcmSpinnerDiameter]="24"
+>{{name}}</div>
diff --git a/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.ts b/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.ts
index 88e5c17d4..912dd40ae 100644
--- a/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.ts
+++ b/src/app/shared/components/containers/shared-organizational-unit-name/shared-organizational-unit-name.container.ts
@@ -1,5 +1,6 @@
 import {
   ChangeDetectionStrategy,
+  ChangeDetectorRef,
   Component,
   Input,
 } from "@angular/core";
@@ -9,8 +10,13 @@ import {SharedAbstractContainer} from "@shared/components/containers/shared-abst
 import {SharedOrgUnitAction} from "@shared/stores/organizational-unit/shared-organizational-unit.action";
 import {SharedOrganizationalUnitState} from "@shared/stores/organizational-unit/shared-organizational-unit.state";
 import {Observable} from "rxjs";
-import {map} from "rxjs/operators";
 import {
+  distinctUntilChanged,
+  filter,
+  take,
+} from "rxjs/operators";
+import {
+  isNotNullNorUndefined,
   isNullOrUndefined,
   ResourceState,
   StringUtil,
@@ -23,36 +29,57 @@ import {
   changeDetection: ChangeDetectionStrategy.OnPush,
 })
 export class SharedOrganizationalUnitNameContainer extends SharedAbstractContainer {
-  name: Observable<string> = ResourceState.list(this._store, SharedOrganizationalUnitState).pipe(
-    map(list => this.mapOrgUnitName(list)),
-  );
+  name: string;
+  listOrgUnitObs: Observable<OrganizationalUnit[]> = ResourceState.list(this._store, SharedOrganizationalUnitState);
+
+  isLoading: boolean = false;
 
   _id: string;
 
   @Input()
   set id(id: string) {
-    if (!isNullOrUndefined(id)) {
+    this._id = id;
+    if (isNullOrUndefined(id)) {
+      this.name = StringUtil.stringEmpty;
+      return;
+    }
+    const listSnapshot = ResourceState.listSnapshot(this._store, SharedOrganizationalUnitState);
+    const orgUnit = this.getOrgUnit(listSnapshot);
+    if (isNullOrUndefined(orgUnit)) {
+      this.name = StringUtil.stringEmpty;
+      this.subscribe(this.listOrgUnitObs.pipe(
+        distinctUntilChanged(),
+        filter(list => isNotNullNorUndefined(this.getOrgUnit(list))),
+        take(1),
+      ), list => {
+        this.name = this.getOrgUnit(list)?.name;
+        this.isLoading = false;
+        this._changeDetector.detectChanges();
+      });
       this._store.dispatch(new SharedOrgUnitAction.AddInListById(id, true));
+      this.isLoading = true;
+    } else {
+      this.name = orgUnit.name;
     }
-    this._id = id;
   }
 
   get id(): string {
     return this._id;
   }
 
-  constructor(public readonly _store: Store) {
+  constructor(public readonly _store: Store,
+              private readonly _changeDetector: ChangeDetectorRef) {
     super();
   }
 
-  private mapOrgUnitName(list: OrganizationalUnit[]): string {
+  private getOrgUnit(list: OrganizationalUnit[]): OrganizationalUnit {
     if (isNullOrUndefined(list)) {
-      return StringUtil.stringEmpty;
+      return undefined;
     }
     const organizationalUnit = list.find(o => o.resId === this._id);
     if (isNullOrUndefined(organizationalUnit)) {
-      return StringUtil.stringEmpty;
+      return undefined;
     }
-    return organizationalUnit.name;
+    return organizationalUnit;
   }
 }
-- 
GitLab