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