From b28d98d833b9d98902acb4609fbfad5644525bba Mon Sep 17 00:00:00 2001
From: Florent Poittevin <florent.poittevin@unige.ch>
Date: Wed, 6 Nov 2019 17:19:12 +0100
Subject: [PATCH] feat: 858 In home page retrieve only necessary org unit for
 label with cache feature

---
 package-lock.json                             |  6 +-
 package.json                                  |  2 +-
 .../home-search/home-search.routable.ts       | 66 ++++++++++++-------
 .../home-organizational-unit.action.ts        | 19 ------
 .../home-organizational-unit.state.ts         | 51 ++------------
 5 files changed, 54 insertions(+), 90 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6b3f4c03b..1a0338255 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11258,9 +11258,9 @@
       }
     },
     "solidify-frontend": {
-      "version": "0.2.8",
-      "resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.8.tgz",
-      "integrity": "sha512-DhIhvZYu0YHCq1M9y5il7hcLMTuTvxoacNcggsdfJaRsJpXUCSF7sCjNAdFVMEAM236YGXmtL1mHKA7nFm2TAA==",
+      "version": "0.2.9",
+      "resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.9.tgz",
+      "integrity": "sha512-8O3HZE4RZKBmsuTRHRwEWGUPkdiPZSme94Xwnn3ppwu6JGBVMOO5yAM4bgH+psM6YyOosdAfY5+dSsGmrQKbWA==",
       "requires": {
         "tslib": "^1.9.0"
       }
diff --git a/package.json b/package.json
index ff7f92204..41cbfdf8f 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "primeicons": "2.0.0",
     "primeng": "8.0.4",
     "rxjs": "6.5.3",
-    "solidify-frontend": "0.2.8",
+    "solidify-frontend": "0.2.9",
     "sync-pom-version-to-package": "1.3.1",
     "ts-key-enum": "2.0.0",
     "tslib": "1.10.0",
diff --git a/src/app/features/home/components/routables/home-search/home-search.routable.ts b/src/app/features/home/components/routables/home-search/home-search.routable.ts
index 90bee944a..5fb4ac950 100644
--- a/src/app/features/home/components/routables/home-search/home-search.routable.ts
+++ b/src/app/features/home/components/routables/home-search/home-search.routable.ts
@@ -7,7 +7,6 @@ import {SearchScopeEnum} from "@app/features/home/enums/search-scope.enum";
 import {Archive} from "@app/features/home/models/archive.model";
 import {HomeAction} from "@app/features/home/stores/home.action";
 import {HomeState} from "@app/features/home/stores/home.state";
-import {HomeOrgUnitAction} from "@app/features/home/stores/organizational-unit/home-organizational-unit.action";
 import {AccessOrganizationalUnit} from "@app/generated-api";
 import {Deposit} from "@app/generated-api/model/deposit.model";
 import {SharedAbstractPresentational} from "@app/shared/components/presentationals/shared-abstract/shared-abstract.presentational";
@@ -17,9 +16,13 @@ import {ArchiveMetadata} from "@app/shared/models/business/archive-metadata.mode
 import {DataTableColumns} from "@app/shared/models/data-table-columns.model";
 import {LocalStateModel} from "@app/shared/models/local-state.model";
 import {MetadataUtil} from "@app/shared/utils/metadata.util";
+import {HomeOrgUnitAction} from "@home/stores/organizational-unit/home-organizational-unit.action";
+import {HomeOrganizationalUnitState} from "@home/stores/organizational-unit/home-organizational-unit.state";
 import {TranslateService} from "@ngx-translate/core";
 import {Navigate} from "@ngxs/router-plugin";
 import {
+  Actions,
+  ofActionCompleted,
   Select,
   Store,
 } from "@ngxs/store";
@@ -30,8 +33,12 @@ import {
 } from "rxjs";
 import {filter} from "rxjs/internal/operators/filter";
 import {tap} from "rxjs/internal/operators/tap";
+import {distinctUntilChanged} from "rxjs/operators";
 import {
-  isNotNullNorUndefined,
+  ArrayUtil,
+  isEmptyArray,
+  isNullOrUndefined,
+  isTrue,
   OrderEnum,
   QueryParameters,
   StoreUtil,
@@ -49,7 +56,7 @@ export class HomeSearchRoutable extends SharedAbstractPresentational implements
   @Select((state: LocalStateModel) => state.home.search) searchObs: Observable<string>;
   @Select((state: LocalStateModel) => state.home.rss) rssObs: Observable<boolean>;
   @Select(HomeState.isLoading) isLoadingObs: Observable<boolean>;
-  @Select(HomeState.list) listObs: Observable<ArchiveMetadata[]>;
+  @Select(HomeState.list) listArchiveMetadataObs: Observable<ArchiveMetadata[]>;
   @Select(HomeState.searchScope) searchScopeObs: Observable<SearchScopeEnum>;
   @Select((state: LocalStateModel) => state.home.queryParameters) queryParametersObs: Observable<ArchiveMetadata[]>;
   @Select((state: LocalStateModel) => state.home.home_organizationalUnit.list) listOrganizationalUnitObs: Observable<AccessOrganizationalUnit[]>;
@@ -61,13 +68,13 @@ export class HomeSearchRoutable extends SharedAbstractPresentational implements
   listAdaptedObs: Observable<Archive[]> = this.listAdaptedBS.asObservable();
 
   constructor(private store: Store,
-              private translate: TranslateService) {
+              private translate: TranslateService,
+              private readonly _actions$: Actions) {
     super();
   }
 
   ngOnInit(): void {
     super.ngOnInit();
-    this.store.dispatch(new HomeOrgUnitAction.GetDefaultMaximumOrgUnit());
     this.store.dispatch(new HomeAction.GetRss());
 
     this.columns = [
@@ -106,24 +113,39 @@ export class HomeSearchRoutable extends SharedAbstractPresentational implements
     ];
 
     this.subscribe(
-      combineLatest(this.listObs, this.listOrganizationalUnitObs, this.searchScopeObs)
+      combineLatest(this.listArchiveMetadataObs, this.searchScopeObs)
         .pipe(
-          filter(([list, listOrgUnits]) => isNotNullNorUndefined(list) && isNotNullNorUndefined(listOrgUnits)),
-          tap(([listArchives, listOrgUnits, searchScope]) => {
-            const newList: Archive[] = [];
-            listArchives.forEach((archive: ArchiveMetadata) => {
-              newList.push({
-                resId: archive.resId,
-                organizationalUnit: this.getOrganizationalUnitNameFromId(
-                  MetadataUtil.getOrganizationalUnitResId(archive.metadata),
-                  listOrgUnits,
-                ),
-                title: MetadataUtil.getTitle(searchScope, archive.metadata),
-                yearPublicationDate: MetadataUtil.getPublicationYear(searchScope, archive.metadata),
-                accessLevel: MetadataUtil.getAccessLevel(searchScope, archive.metadata) as Deposit.AccessEnum,
-              });
-            });
-            this.listAdaptedBS.next(newList);
+          distinctUntilChanged(),
+          tap(([listArchives, searchScope]) => {
+            if (isNullOrUndefined(listArchives) || isEmptyArray(listArchives)) {
+              this.listAdaptedBS.next([]);
+              return;
+            }
+            let listOrgUnitResId = listArchives.map(a => MetadataUtil.getOrganizationalUnitResId(a.metadata));
+            listOrgUnitResId = ArrayUtil.distinct(listOrgUnitResId);
+            this.store.dispatch(new HomeOrgUnitAction.GetByListId(listOrgUnitResId, true)).subscribe();
+
+            this.subscribe(this._actions$.pipe(
+              ofActionCompleted(HomeOrgUnitAction.GetByListIdSuccess),
+              distinctUntilChanged(),
+              filter(r => isTrue(r.result.successful)),
+              tap((result) => {
+
+                const listOrgUnit = this.store.selectSnapshot(HomeOrganizationalUnitState.list);
+                const newList: Archive[] = [];
+                listArchives.forEach((archive: ArchiveMetadata) => {
+                  newList.push({
+                    resId: archive.resId,
+                    organizationalUnit: this.getOrganizationalUnitNameFromId(MetadataUtil.getOrganizationalUnitResId(archive.metadata), listOrgUnit),
+                    title: MetadataUtil.getTitle(searchScope, archive.metadata),
+                    yearPublicationDate: MetadataUtil.getPublicationYear(searchScope, archive.metadata),
+                    accessLevel: MetadataUtil.getAccessLevel(searchScope, archive.metadata) as Deposit.AccessEnum,
+                  });
+                });
+                this.listAdaptedBS.next(newList);
+              }),
+            ));
+
           }),
         ),
     );
diff --git a/src/app/features/home/stores/organizational-unit/home-organizational-unit.action.ts b/src/app/features/home/stores/organizational-unit/home-organizational-unit.action.ts
index cf5703047..19120f1a8 100644
--- a/src/app/features/home/stores/organizational-unit/home-organizational-unit.action.ts
+++ b/src/app/features/home/stores/organizational-unit/home-organizational-unit.action.ts
@@ -1,7 +1,6 @@
 import {AccessOrganizationalUnit} from "@app/generated-api";
 import {LocalStateEnum} from "@app/shared/enums/local-state.enum";
 import {
-  CollectionTyped,
   QueryParameters,
   ResourceAction,
   ResourceNameSpace,
@@ -109,24 +108,6 @@ export namespace HomeOrgUnitAction {
     constructor(public resetPagination: boolean, public search?: string, public queryParameters?: QueryParameters) {
     }
   }
-
-  export class GetDefaultMaximumOrgUnit {
-    static readonly type: string = "[${state}] Get Default Maximum Org Unit";
-
-    constructor() {
-    }
-  }
-
-  export class GetDefaultMaximumSuccess {
-    static readonly type: string = "[${state}] Get Default Maximum Org Unit Success";
-
-    constructor(public list?: CollectionTyped<AccessOrganizationalUnit> | null | undefined) {
-    }
-  }
-
-  export class GetDefaultMaximumFail {
-    static readonly type: string = "[${state}] Get Default Maximum Org Unit Fail";
-  }
 }
 
 export const homeOrgUnitActionNameSpace: ResourceNameSpace = HomeOrgUnitAction;
diff --git a/src/app/features/home/stores/organizational-unit/home-organizational-unit.state.ts b/src/app/features/home/stores/organizational-unit/home-organizational-unit.state.ts
index dd852a9b3..d4d67c3c6 100644
--- a/src/app/features/home/stores/organizational-unit/home-organizational-unit.state.ts
+++ b/src/app/features/home/stores/organizational-unit/home-organizational-unit.state.ts
@@ -9,22 +9,16 @@ import {
 import {AccessOrganizationalUnit} from "@app/generated-api";
 import {AccessResourceApiEnum} from "@app/shared/enums/api.enum";
 import {LocalStateEnum} from "@app/shared/enums/local-state.enum";
-import {Navigate} from "@ngxs/router-plugin";
 import {
   Action,
   Actions,
+  Selector,
   State,
   StateContext,
   Store,
 } from "@ngxs/store";
-import {Observable} from "rxjs";
-import {
-  catchError,
-  tap,
-} from "rxjs/operators";
 import {
   ApiService,
-  CollectionTyped,
   defaultResourceStateInitValue,
   isNullOrUndefined,
   MapUtil,
@@ -70,6 +64,11 @@ export class HomeOrganizationalUnitState extends ResourceState<AccessOrganizatio
     return AccessResourceApiEnum.organizationalUnits;
   }
 
+  @Selector()
+  static list(state: HomeOrganizationalUnitStateModel): AccessOrganizationalUnit[] {
+    return state.list;
+  }
+
   @Action(HomeOrgUnitAction.Search)
   search(ctx: StateContext<HomeOrganizationalUnitStateModel>, action: HomeOrgUnitAction.Search): void {
     const searchString = this.getSearchStringToApply(ctx, action);
@@ -99,42 +98,4 @@ export class HomeOrganizationalUnitState extends ResourceState<AccessOrganizatio
     }
     return ctx.getState().search;
   }
-
-  @Action(HomeOrgUnitAction.GetDefaultMaximumOrgUnit)
-  getDefaultMaximumOrgUnit(ctx: StateContext<ResourceStateModel<HomeOrganizationalUnitStateModel>>, action: HomeOrgUnitAction.GetDefaultMaximumOrgUnit): Observable<CollectionTyped<AccessOrganizationalUnit>> {
-    ctx.patchState({
-      isLoadingCounter: ctx.getState().isLoadingCounter + 1,
-    });
-
-    return this.apiService.get<AccessOrganizationalUnit>(this._urlResource, new QueryParameters(environment.defaultHomeOrgUnitSize))
-      .pipe(
-        StoreUtil.cancelUncompleted(ctx, this.actions$, [this._nameSpace.GetAll, Navigate]),
-        tap((collection: CollectionTyped<AccessOrganizationalUnit>) => {
-          ctx.dispatch(new HomeOrgUnitAction.GetDefaultMaximumSuccess(collection));
-        }),
-        catchError(error => {
-          ctx.dispatch(new HomeOrgUnitAction.GetDefaultMaximumFail());
-          throw error;
-        }),
-      );
-  }
-
-  @Action(HomeOrgUnitAction.GetDefaultMaximumSuccess)
-  getDefaultMaximumSuccess(ctx: StateContext<ResourceStateModel<AccessOrganizationalUnit>>, action: HomeOrgUnitAction.GetDefaultMaximumSuccess): void {
-    const queryParameters = StoreUtil.updateQueryParameters(ctx, action.list);
-    ctx.patchState({
-      list: action.list._data,
-      total: action.list._page.totalItems,
-      isLoadingCounter: ctx.getState().isLoadingCounter - 1,
-      queryParameters,
-    });
-  }
-
-  @Action(HomeOrgUnitAction.GetDefaultMaximumFail)
-  getDefaultMaximumFail(ctx: StateContext<ResourceStateModel<AccessOrganizationalUnit>>, action: HomeOrgUnitAction.GetDefaultMaximumFail): void {
-    ctx.patchState({
-      isLoadingCounter: ctx.getState().isLoadingCounter - 1,
-    });
-  }
-
 }
-- 
GitLab