diff --git a/src/app/access/stores/access.state.ts b/src/app/access/stores/access.state.ts index e54ef3d9f9047c95ee1d19adb0585d6c043c500f..5c7c29a7531aada5942691a6c163d4dc0fd64356 100644 --- a/src/app/access/stores/access.state.ts +++ b/src/app/access/stores/access.state.ts @@ -24,7 +24,7 @@ export interface AccessStateModel extends ResourceStateModel<ArchiveMetadataMode defaults: { search: null, total: 0, - isLoading: false, + isLoadingCounter: 0, list: [], current: null, queryParameters: new QueryParametersModel(), @@ -48,7 +48,7 @@ export class AccessState { searchDip(ctx: StateContext<AccessStateModel>, action: AccessSearch): Observable<CollectionTypedModel<ArchiveMetadataModel>> { const searchString = this.getSearchStringToApply(ctx, action); ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, search: searchString, }); @@ -91,7 +91,7 @@ export class AccessState { ctx.patchState({ list: action.list === null || action.list === undefined ? [] : action.list._data, total: action.list === null || action.list === undefined ? 0 : action.list._page.totalItems, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, queryParameters, }); } @@ -99,7 +99,7 @@ export class AccessState { @Action(AccessSearchFail) searchDipFail(ctx: StateContext<AccessStateModel>): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } } diff --git a/src/app/access/views/access/access.view.ts b/src/app/access/views/access/access.view.ts index d5d488cfc58a8e06d08840324c12c1d04188c44d..db069bc298b968d641443b97bf5622f169d35357 100644 --- a/src/app/access/views/access/access.view.ts +++ b/src/app/access/views/access/access.view.ts @@ -2,6 +2,7 @@ import {ChangeDetectionStrategy, Component, OnInit} from "@angular/core"; import {AccessChangeQueryParameters, AccessSearch} from "@app/access/stores/access.action"; import {ArchiveModel} from "@app/access/models/archive.model"; import {isNotNullNorUndefined} from "@app/core/tools/is/is.tool"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {DepositsModel, OrganizationalUnitsModel} from "@app/generated-api"; import {AbstractComponent} from "@app/shared/components/abstract/abstract.component"; import {FieldTypeEnum} from "@app/shared/enums/field-type.enum"; @@ -27,11 +28,11 @@ import {tap} from "rxjs/internal/operators/tap"; }) export class AccessView extends AbstractComponent implements OnInit { @Select((state: StateModel) => state[StateEnum.access].search) search$: Observable<boolean>; - @Select((state: StateModel) => state[StateEnum.access].isLoading) isLoading$: Observable<boolean>; + @Select((state: StateModel) => StoreUtil.isLoadingState(state[StateEnum.access])) isLoading$: Observable<boolean>; @Select((state: StateModel) => state[StateEnum.access].list) list$: Observable<ArchiveMetadataModel[]>; @Select((state: StateModel) => state[StateEnum.access].queryParameters) queryParameters$: Observable<ArchiveMetadataModel[]>; @Select((state: StateModel) => state[StateEnum.organizationalUnit].list) listOrganizationalUnit$: Observable<OrganizationalUnitsModel[]>; - @Select((state: StateModel) => state[StateEnum.organizationalUnit].isLoading) isLoadingOrgUnit$: Observable<boolean>; + @Select((state: StateModel) => StoreUtil.isLoadingState(state[StateEnum.organizationalUnit])) isLoadingOrgUnit$: Observable<boolean>; columns: DataTableColumnsModel[]; diff --git a/src/app/core/models/stores/base-resource.state.ts b/src/app/core/models/stores/base-resource.state.ts index e4869a38ab0b25382802ef430e7a5d4f1b8afb25..9b103b1d37f290183c70995fca52f91678e599fd 100644 --- a/src/app/core/models/stores/base-resource.state.ts +++ b/src/app/core/models/stores/base-resource.state.ts @@ -1,7 +1,6 @@ import {BaseState} from "@app/core/models/stores/base.state"; import {QueryParametersModel} from "@app/shared/models/query-parameters.model"; - export interface BaseResourceState extends BaseState { total: number; queryParameters: QueryParametersModel; diff --git a/src/app/core/models/stores/base.state.ts b/src/app/core/models/stores/base.state.ts index 78f8d73fe36f7d59be8ecf80d7d0f58a0e3f567b..77cd04f24e2f171b64f2565fb82a103684271e23 100644 --- a/src/app/core/models/stores/base.state.ts +++ b/src/app/core/models/stores/base.state.ts @@ -1,5 +1,3 @@ - - export interface BaseState { - isLoading: boolean; + isLoadingCounter: number; } diff --git a/src/app/core/stores/composition/composition.state.ts b/src/app/core/stores/composition/composition.state.ts index ba5b48a41a37f8fd192585996c196d119c669ff9..34bbf6d5359f73a730cdf9f1ee40da32a3a02fe9 100644 --- a/src/app/core/stores/composition/composition.state.ts +++ b/src/app/core/stores/composition/composition.state.ts @@ -25,7 +25,7 @@ export interface CompositionStateModel<T> extends BaseResourceState { export const defaultCompositionStateInitValue: CompositionStateModel<any> = { total: 0, - isLoading: false, + isLoadingCounter: 0, list: [], queryParameters: new QueryParametersModel(), }; @@ -61,7 +61,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.GetAll) getAll<U>(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.GetAll): Observable<CollectionTypedModel<U>> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); const queryParameters = StoreUtil.getQueryParametersToApply(action.queryParameters, ctx); const url = this.evaluateSubResourceUrl(action.parentId); @@ -81,21 +81,21 @@ export abstract class CompositionState<T> { getAllSuccess(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.GetAllSuccess<T>): void { ctx.patchState({ list: action.list._data, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.GetAllFail) getAllFail(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.GetAllFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.Create) create(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.Create<T>): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); const url = this.evaluateSubResourceUrl(action.parentId); return this.apiService.post<T>(url, action.model) @@ -113,7 +113,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.CreateSuccess) createSuccess(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.CreateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); this.notificationService.showSuccess(TRANSLATE("notification.composition.create.success"), true); ctx.dispatch(CompositionActionHelper.getAllSubResource(this.compositionNameSpace, action.parentId)); @@ -122,7 +122,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.CreateFail) createFail(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.CreateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); this.notificationService.showSuccess(TRANSLATE("notification.composition.create.fail"), true); } @@ -130,7 +130,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.Delete) delete(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.Delete<T>): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); const url = this.evaluateSubResourceUrl(action.parentId); return this.apiService.deleteById<T>(url, action.model[ModelAttributeEnum.resId]) @@ -148,7 +148,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.DeleteSuccess) deleteSuccess(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.DeleteSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); this.notificationService.showSuccess(TRANSLATE("notification.composition.delete.success"), true); ctx.dispatch(CompositionActionHelper.getAllSubResource(this.compositionNameSpace, action.parentId)); @@ -157,7 +157,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.DeleteFail) deleteFail(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.DeleteFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); this.notificationService.showSuccess(TRANSLATE("notification.composition.delete.fail"), true); } @@ -165,7 +165,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.Update) update(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.Update<T>): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); const url = this.evaluateSubResourceUrl(action.parentId); return this.apiService.patchById<T>(url, action.model[ModelAttributeEnum.resId], action.model) @@ -183,7 +183,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.UpdateSuccess) updateSuccess(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.UpdateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(CompositionActionHelper.getAllSubResource(this.compositionNameSpace, action.parentId)); } @@ -191,7 +191,7 @@ export abstract class CompositionState<T> { @RegisterDefaultAction((compositionNameSpace: CompositionNameSpace) => compositionNameSpace.UpdateFail) updateFail(ctx: StateContext<CompositionStateModel<T>>, action: CompositionAction.UpdateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } } diff --git a/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts b/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts index 1c6817e7ca6039d052cf29943603d94f7f14d4d4..2643160c87374f7bbe5f671c4d3efcb006f87090 100644 --- a/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts +++ b/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts @@ -26,7 +26,7 @@ export interface Relation2TiersStateModel<T> extends BaseResourceState { export const defaultRelation2TiersStateInitValue: Relation2TiersStateModel<any> = { total: 0, - isLoading: false, + isLoadingCounter: 0, selected: [], queryParameters: new QueryParametersModel(), }; @@ -62,6 +62,9 @@ export abstract class Relation2TiersState<T> { @RegisterDefaultAction((relation2TiersNameSpace: Relation2TiersNameSpace) => relation2TiersNameSpace.GetAll) getAll<U>(ctx: StateContext<Relation2TiersStateModel<T>>, action: Relation2TiersAction.GetAll): Observable<CollectionTypedModel<U>> { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter + 1, + }); const queryParameters = StoreUtil.getQueryParametersToApply(action.queryParameters, ctx); const url = this.evaluateSubResourceUrl(action.parentId); return this.apiService.get<U>(url, queryParameters) @@ -80,14 +83,14 @@ export abstract class Relation2TiersState<T> { getAllSuccess(ctx: StateContext<Relation2TiersStateModel<T>>, action: Relation2TiersAction.GetAllSuccess<T>): void { ctx.patchState({ selected: action.list._data, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((relation2TiersNameSpace: Relation2TiersNameSpace) => relation2TiersNameSpace.GetAllFail) getAllFail(ctx: StateContext<Relation2TiersStateModel<T>>, action: Relation2TiersAction.GetAllFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @@ -143,7 +146,7 @@ export abstract class Relation2TiersState<T> { @RegisterDefaultAction((relation2TiersNameSpace: Relation2TiersNameSpace) => relation2TiersNameSpace.UpdateSuccess) updateSuccess(ctx: StateContext<Relation2TiersStateModel<T>>, action: Relation2TiersAction.UpdateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(Relation2TiersActionHelper.getAllSubResource(this.relation2TiersNameSpace, action.parentId)); } @@ -151,7 +154,7 @@ export abstract class Relation2TiersState<T> { @RegisterDefaultAction((relation2TiersNameSpace: Relation2TiersNameSpace) => relation2TiersNameSpace.UpdateFail) updateFail(ctx: StateContext<Relation2TiersStateModel<T>>, action: Relation2TiersAction.UpdateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(Relation2TiersActionHelper.getAllSubResource(this.relation2TiersNameSpace, action.parentId)); } diff --git a/src/app/core/stores/relation-3-tiers/relation-3-tiers.state.ts b/src/app/core/stores/relation-3-tiers/relation-3-tiers.state.ts index e4474e23878afb52238380acb6f1a9d7b852f647..87b6ac93bc95c050e1d1a0c824e6ee646404ebdf 100644 --- a/src/app/core/stores/relation-3-tiers/relation-3-tiers.state.ts +++ b/src/app/core/stores/relation-3-tiers/relation-3-tiers.state.ts @@ -1,7 +1,7 @@ -import {Relation3TiersActionHelper} from "@app/core/stores/relation-3-tiers/relation-3-tiers-action.helper"; import {ApiService} from "@app/core/http/api.service"; import {BaseResourceState} from "@app/core/models/stores/base-resource.state"; import {NotificationService} from "@app/core/services/notification.service"; +import {Relation3TiersActionHelper} from "@app/core/stores/relation-3-tiers/relation-3-tiers-action.helper"; import {Relation3TiersNameSpace} from "@app/core/stores/relation-3-tiers/relation-3-tiers-namespace.model"; import {Relation3TiersAction} from "@app/core/stores/relation-3-tiers/relation-3-tiers.action"; import {StoreUtil} from "@app/core/utils/stores/store.util"; @@ -25,7 +25,7 @@ export interface Relation3TiersStateModel<T> extends BaseResourceState { export const defaultRelation3TiersStateInitValue: Relation3TiersStateModel<any> = { total: 0, - isLoading: false, + isLoadingCounter: 0, selected: [], queryParameters: new QueryParametersModel(), }; @@ -78,14 +78,14 @@ export abstract class Relation3TiersState<T> { getAllSuccess(ctx: StateContext<Relation3TiersStateModel<T>>, action: Relation3TiersAction.GetAllSuccess<T>): void { ctx.patchState({ selected: action.list._data, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((relation3TiersNameSpace: Relation3TiersNameSpace) => relation3TiersNameSpace.GetAllFail) getAllFail(ctx: StateContext<Relation3TiersStateModel<T>>, action: Relation3TiersAction.GetAllFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @@ -135,7 +135,7 @@ export abstract class Relation3TiersState<T> { @RegisterDefaultAction((relation3TiersNameSpace: Relation3TiersNameSpace) => relation3TiersNameSpace.UpdateSuccess) updateSuccess(ctx: StateContext<Relation3TiersStateModel<T>>, action: Relation3TiersAction.UpdateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(Relation3TiersActionHelper.getAllSubResource(this.relation3TiersNameSpace, action.parentId)); } @@ -143,7 +143,7 @@ export abstract class Relation3TiersState<T> { @RegisterDefaultAction((relation3TiersNameSpace: Relation3TiersNameSpace) => relation3TiersNameSpace.UpdateFail) updateFail(ctx: StateContext<Relation3TiersStateModel<T>>, action: Relation3TiersAction.UpdateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(Relation3TiersActionHelper.getAllSubResource(this.relation3TiersNameSpace, action.parentId)); } diff --git a/src/app/core/stores/resource/resource.state.ts b/src/app/core/stores/resource/resource.state.ts index 080cd628304e9769bf67bdfd66830b4509a5e41c..1a8027a7a243b5d09b8a410cbd11c5c2cefde493 100644 --- a/src/app/core/stores/resource/resource.state.ts +++ b/src/app/core/stores/resource/resource.state.ts @@ -14,7 +14,7 @@ import {CollectionTypedModel} from "@app/shared/models/collection-typed.model"; import {QueryParametersModel} from "@app/shared/models/query-parameters.model"; import {StateModel} from "@app/shared/models/state.model"; import {Navigate} from "@ngxs/router-plugin"; -import {Actions, StateContext, Store} from "@ngxs/store"; +import {StateContext, Store} from "@ngxs/store"; import {Observable} from "rxjs"; import {catchError} from "rxjs/internal/operators/catchError"; import {tap} from "rxjs/operators"; @@ -27,7 +27,7 @@ export interface ResourceStateModel<T> extends BaseResourceState { export const defaultResourceStateInitValue: ResourceStateModel<any> = { total: 0, - isLoading: false, + isLoadingCounter: 0, list: [], current: null, queryParameters: new QueryParametersModel(), @@ -65,7 +65,7 @@ export abstract class ResourceState<T> { getAll(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.GetAll): Observable<CollectionTypedModel<T>> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); const queryParameters = StoreUtil.getQueryParametersToApply(action.queryParameters, ctx); @@ -89,7 +89,7 @@ export abstract class ResourceState<T> { ctx.patchState({ list: action.list._data, total: action.list._page.totalItems, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, queryParameters, }); } @@ -97,14 +97,14 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.GetAllFail) getAllFail(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.GetAllFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.GetById) getById(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.GetById): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, current: null, }); @@ -124,21 +124,21 @@ export abstract class ResourceState<T> { getByIdSuccess(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.GetByIdSuccess<T>): void { ctx.patchState({ current: action.model, - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.GetByIdFail) getByIdFail(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.GetByIdFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.Create) create(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.Create<T>): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); return this.apiService.post<T>(this._urlResource, action.model) @@ -156,7 +156,7 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.CreateSuccess) createSuccess(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.CreateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(new Navigate([StoreRouteUtil.getRootRoute(this.state)])); @@ -167,7 +167,7 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.CreateFail) createFail(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.CreateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @@ -187,7 +187,7 @@ export abstract class ResourceState<T> { protected internalUpdate(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.Update<T>): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); return this.apiService.patchById<T>(this._urlResource, action.model[ModelAttributeEnum.resId], action.model); @@ -196,7 +196,7 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.UpdateSuccess) updateSuccess(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.UpdateSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(new Navigate([StoreRouteUtil.getRootRoute(this.state)])); @@ -207,14 +207,14 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.UpdateFail) updateFail(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.UpdateFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.Delete) delete(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.Delete): Observable<T> { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); return this.apiService.deleteById<T>(this._urlResource, action.resId) @@ -232,7 +232,7 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.DeleteSuccess) deleteSuccess(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.DeleteSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); ctx.dispatch(new Navigate([StoreRouteUtil.getRootRoute(this.state)])); @@ -243,7 +243,7 @@ export abstract class ResourceState<T> { @RegisterDefaultAction((resourceNameSpace: ResourceNameSpace) => resourceNameSpace.DeleteFail) deleteFail(ctx: StateContext<ResourceStateModel<T>>, action: ResourceAction.DeleteFail): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } } diff --git a/src/app/core/utils/stores/store.util.ts b/src/app/core/utils/stores/store.util.ts index 792920342aa554aa74d40b59e5d6942b9688e1e0..eb838b7d7805717d6e3550f3312fb9b40d33435e 100644 --- a/src/app/core/utils/stores/store.util.ts +++ b/src/app/core/utils/stores/store.util.ts @@ -1,5 +1,6 @@ import {BaseResourceState} from "@app/core/models/stores/base-resource.state"; import {ActionSubActionCompletionsWrapper, BaseAction, BaseSubAction} from "@app/core/models/stores/base.action"; +import {BaseState} from "@app/core/models/stores/base.state"; import {StoreActionClass} from "@app/core/models/stores/state-action.model"; import {ResourceStateModel} from "@app/core/stores/resource/resource.state"; import {isNonEmptyArray, isTruthyObject} from "@app/core/tools/is/is.tool"; @@ -108,4 +109,8 @@ export class StoreUtil { return false; } + static isLoadingState(baseState: BaseState): boolean { + return baseState.isLoadingCounter > 0; + } + } diff --git a/src/app/deposit/containers/file/file.container.ts b/src/app/deposit/containers/file/file.container.ts index 21023a73a57e17ee5909cac429346f93391396ef..16ff1a80b0801d8da16ada2ea2374dd81fa65c39 100644 --- a/src/app/deposit/containers/file/file.container.ts +++ b/src/app/deposit/containers/file/file.container.ts @@ -1,4 +1,5 @@ import {ChangeDetectionStrategy, Component, Input} from "@angular/core"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {DepositDataFileModel} from "@app/deposit/models/deposit-data-file.model"; import {UploadFileStatusModel} from "@app/deposit/models/upload-file-status.model"; import {DepositDataFileAction} from "@app/deposit/stores/data-file/deposit-data-file.action"; @@ -17,7 +18,7 @@ import {Observable} from "rxjs"; }) export class FileContainer extends AbstractComponent { @Select((state: StateModel) => state[StateEnum.deposit][StateEnum.depositDataFile].list) listDataFile$: Observable<DepositDataFileModel[]>; - @Select((state: StateModel) => state[StateEnum.deposit][StateEnum.depositDataFile].isLoading) isLoadingDataFile$: Observable<boolean>; + @Select((state: StateModel) => StoreUtil.isLoadingState(state[StateEnum.deposit][StateEnum.depositDataFile])) isLoadingDataFile$: Observable<boolean>; @Select((state: StateModel) => state[StateEnum.deposit].uploadStatus) uploadStatus$: Observable<UploadFileStatusModel>; @Input() diff --git a/src/app/deposit/stores/deposit.state.ts b/src/app/deposit/stores/deposit.state.ts index 3649dedb167eb0df55535a2856b26b35d2c3d04e..5e831038211ec9e5225bdbbb6829458b7cb2c02f 100644 --- a/src/app/deposit/stores/deposit.state.ts +++ b/src/app/deposit/stores/deposit.state.ts @@ -64,7 +64,7 @@ export class DepositState extends ResourceState<DepositsModel> { @Action(DepositAction.LoadResource) loadResource(ctx: StateContext<DepositStateModel>, action: DepositAction.LoadResource): void { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); ctx.dispatch([ @@ -76,6 +76,21 @@ export class DepositState extends ResourceState<DepositsModel> { ]); } + @Action(DepositAction.LoadResourceSuccess) + loadResourceSuccess(ctx: StateContext<DepositStateModel>, action: DepositAction.LoadResourceSuccess): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + } + + @Action(DepositAction.LoadResourceFail) + loadResourceFail(ctx: StateContext<DepositStateModel>, action: DepositAction.LoadResourceFail): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + } + + // @Action(DepositAction.GetAllSubResourceData, {cancelUncompleted: true}) // getAllDataFile(ctx: StateContext<DepositStateModel>, action: DepositAction.GetAllSubResourceData): Observable<CollectionTypedModel<DepositDataFileModel>> { // ctx.patchState({ diff --git a/src/app/organizational-unit/views/detail/detail.view.ts b/src/app/organizational-unit/views/detail/detail.view.ts index f26b2fc9b372a6593fc144fbda6d41c43fcd669a..aacca57a67ae8d941a8c2f35d40f93ae71315748 100644 --- a/src/app/organizational-unit/views/detail/detail.view.ts +++ b/src/app/organizational-unit/views/detail/detail.view.ts @@ -1,6 +1,7 @@ import {ChangeDetectionStrategy, Component} from "@angular/core"; import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {OrganizationalUnitsModel, PreservationPoliciesModel, SubmissionPoliciesModel} from "@app/generated-api"; import {StateEnum} from "@app/shared/enums/state.enum"; import {StateModel} from "@app/shared/models/state.model"; @@ -19,7 +20,7 @@ import {Observable} from "rxjs"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class DetailView extends AbstractDetailView<OrganizationalUnitsModel, OrganizationalUnitStateModel> { - @Select((state: StateModel) => state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy].isLoading) isLoadingSubmissionPolicies$: Observable<boolean>; + @Select((state: StateModel) => StoreUtil.isLoadingState(state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy])) isLoadingSubmissionPolicies$: Observable<boolean>; @Select((state: StateModel) => state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy].selected) selectedSubmissionPolicies$: Observable<SubmissionPoliciesModel[]>; @Select((state: StateModel) => state[StateEnum.shared][StateEnum.submissionPolicy].list) listSubmissionPolicies$: Observable<SubmissionPoliciesModel[]>; @Select((state: StateModel) => state[StateEnum.shared][StateEnum.preservationPolicy].list) listPreservationPolicies$: Observable<PreservationPoliciesModel[]>; diff --git a/src/app/organizational-unit/views/edit/edit.view.ts b/src/app/organizational-unit/views/edit/edit.view.ts index 9e4c167904bb73defb3e73491a407a606d9c2242..46ae038cba9096bdb150e6098b97e79c57d6f085 100644 --- a/src/app/organizational-unit/views/edit/edit.view.ts +++ b/src/app/organizational-unit/views/edit/edit.view.ts @@ -1,11 +1,12 @@ import {ChangeDetectionStrategy, Component, OnInit} from "@angular/core"; import {ActivatedRoute} from "@angular/router"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {OrganizationalUnitsModel, PreservationPoliciesModel, SubmissionPoliciesModel} from "@app/generated-api"; import {StateEnum} from "@app/shared/enums/state.enum"; import {StateModel} from "@app/shared/models/state.model"; -import {OrgUnitSubmissionPolicyAction} from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.action"; import {orgUnitActionNameSpace} from "@app/shared/stores/organizational-unit/organizational-unit.action"; import {OrganizationalUnitStateModel} from "@app/shared/stores/organizational-unit/organizational-unit.state"; +import {OrgUnitSubmissionPolicyAction} from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.action"; import {AbstractEditView} from "@app/shared/views/abstract-edit/abstract-edit.view"; import {Select, Store} from "@ngxs/store"; import {Observable} from "rxjs"; @@ -17,7 +18,7 @@ import {Observable} from "rxjs"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class EditView extends AbstractEditView<OrganizationalUnitsModel, OrganizationalUnitStateModel> implements OnInit { - @Select((state: StateModel) => state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy].isLoading) isLoadingSubmissionPolicies$: Observable<boolean>; + @Select((state: StateModel) => StoreUtil.isLoadingState(state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy])) isLoadingSubmissionPolicies$: Observable<boolean>; @Select((state: StateModel) => state[StateEnum.organizationalUnit][StateEnum.organizationalUnitSubResourceSubmissionPolicy].selected) selectedSubmissionPolicies$: Observable<SubmissionPoliciesModel[]>; @Select((state: StateModel) => state[StateEnum.shared][StateEnum.submissionPolicy].list) listSubmissionPolicies$: Observable<SubmissionPoliciesModel[]>; @Select((state: StateModel) => state[StateEnum.shared][StateEnum.preservationPolicy].list) listPreservationPolicies$: Observable<PreservationPoliciesModel[]>; diff --git a/src/app/shared/stores/organizational-unit/organizational-unit.state.ts b/src/app/shared/stores/organizational-unit/organizational-unit.state.ts index acceb9911796367d2370a9b498f557dbeab2e759..a5e13df173dfe21dddb3dbbef69677b486296a24 100644 --- a/src/app/shared/stores/organizational-unit/organizational-unit.state.ts +++ b/src/app/shared/stores/organizational-unit/organizational-unit.state.ts @@ -66,7 +66,7 @@ export class OrganizationalUnitState extends ResourceState<OrganizationalUnitsMo @Action(OrgUnitAction.LoadResource) loadResource(ctx: StateContext<DepositStateModel>, action: OrgUnitAction.LoadResource): void { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); ctx.dispatch([ @@ -76,6 +76,20 @@ export class OrganizationalUnitState extends ResourceState<OrganizationalUnitsMo ]); } + @Action(OrgUnitAction.LoadResourceSuccess) + loadResourceSuccess(ctx: StateContext<DepositStateModel>, action: OrgUnitAction.LoadResourceSuccess): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + } + + @Action(OrgUnitAction.LoadResourceFail) + loadResourceFail(ctx: StateContext<DepositStateModel>, action: OrgUnitAction.LoadResourceFail): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + } + @OverrideDefaultAction() @Action(OrgUnitAction.Update, {cancelUncompleted: true}) update(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.Update): Observable<OrganizationalUnitsModel> { diff --git a/src/app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.state.ts b/src/app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.state.ts index bd8fc4918ae5e1105917cb0d087c1316d28a1670..f512c0a94f4bbe123eaef7393eff97a76a6306ad 100644 --- a/src/app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.state.ts +++ b/src/app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.state.ts @@ -10,14 +10,9 @@ import {OrganizationalUnitsModel, SubmissionPoliciesModel} from "@app/generated- import {ApiResourceNameEnum} from "@app/shared/enums/api-resource-name.enum"; import {AdminResourceApiEnum, ResourceApiEnum} from "@app/shared/enums/api.enum"; import {StateEnum} from "@app/shared/enums/state.enum"; -import { - OrgUnitSubmissionPolicyAction, - orgUnitSubmissionPolicyActionNameSpace, -} from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.action"; +import {orgUnitSubmissionPolicyActionNameSpace} from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.action"; -import {ActionCompletion, Actions, ofActionCompleted, State, Store} from "@ngxs/store"; -import {zip} from "rxjs/internal/observable/zip"; -import {tap} from "rxjs/internal/operators/tap"; +import {Actions, State, Store} from "@ngxs/store"; export interface OrganizationalUnitSubmissionPolicyStateModel extends Relation2TiersStateModel<SubmissionPoliciesModel> { } diff --git a/src/app/shared/stores/shared/shared.state.ts b/src/app/shared/stores/shared/shared.state.ts index dd794371267c56981befe8933f9dfd3a6c378688..5c3b95ff46459edecc20901a3d8d0357bba037d6 100644 --- a/src/app/shared/stores/shared/shared.state.ts +++ b/src/app/shared/stores/shared/shared.state.ts @@ -21,7 +21,7 @@ export interface SharedStateModel extends BaseState { @State<SharedStateModel>({ name: StateEnum.shared, defaults: { - isLoading: false, + isLoadingCounter: 0, language: null, license: null, preservationPolicy: null, @@ -39,7 +39,7 @@ export class SharedState { @Action(SharedAction.GetAllResources, {cancelUncompleted: true}) getAllResources(ctx: StateContext<SharedStateModel>, action: SharedAction.GetAllResources): void { ctx.patchState({ - isLoading: true, + isLoadingCounter: ctx.getState().isLoadingCounter + 1, }); ctx.dispatch([ @@ -54,14 +54,14 @@ export class SharedState { @Action(SharedAction.GetAllResourcesSuccess) getAllResourcesSuccess(ctx: StateContext<SharedStateModel>, action: SharedAction.GetAllResourcesSuccess): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } @Action(SharedAction.GetAllResourcesFail) getAllResourcesFail(ctx: StateContext<SharedStateModel>): void { ctx.patchState({ - isLoading: false, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, }); } } diff --git a/src/app/shared/views/abstract-detail/abstract-detail.view.ts b/src/app/shared/views/abstract-detail/abstract-detail.view.ts index 3e222678797fd03c4d661770ce1e3fe9b0fd62c6..2e937a70f116db55caa93acddae326bcf2d8da48 100644 --- a/src/app/shared/views/abstract-detail/abstract-detail.view.ts +++ b/src/app/shared/views/abstract-detail/abstract-detail.view.ts @@ -2,6 +2,7 @@ import {ComponentType} from "@angular/cdk/portal"; import {OnInit} from "@angular/core"; import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {ResourceNameSpace} from "../../../core/stores/resource/resource.namespace"; import {AbstractComponent} from "@app/shared/components/abstract/abstract.component"; import {ResourceStateModel} from "@app/core/stores/resource/resource.state"; @@ -34,7 +35,7 @@ export abstract class AbstractDetailView<T, U extends ResourceStateModel<T>> ext private state: StateEnum, private resourceNameSpace: ResourceNameSpace) { super(); - this.isLoading$ = this.store.select(s => (s[state] as U).isLoading); + this.isLoading$ = this.store.select(s => StoreUtil.isLoadingState(s[state] as U)); this.current$ = this.store.select(s => (s[state] as U).current); } diff --git a/src/app/shared/views/abstract-edit/abstract-edit.view.ts b/src/app/shared/views/abstract-edit/abstract-edit.view.ts index 1fd019e78db3a458c5cb8563d38aa473c4b0e861..1a9b40690e0416ba12f5c8b932b872a0ecf53f4e 100644 --- a/src/app/shared/views/abstract-edit/abstract-edit.view.ts +++ b/src/app/shared/views/abstract-edit/abstract-edit.view.ts @@ -1,6 +1,7 @@ import {OnInit} from "@angular/core"; import {ActivatedRoute} from "@angular/router"; import {ResourceActionHelper} from "@app/core/helpers/resource-action.helper"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {ResourceNameSpace} from "../../../core/stores/resource/resource.namespace"; import {ResourceStateModel} from "@app/core/stores/resource/resource.state"; import {AbstractComponent} from "@app/shared/components/abstract/abstract.component"; @@ -19,7 +20,7 @@ export abstract class AbstractEditView<T, U extends ResourceStateModel<T>> exten private state: StateEnum, private resourceNameSpace: ResourceNameSpace) { super(); - this.isLoading$ = this.store.select(s => (s[state] as U).isLoading); + this.isLoading$ = this.store.select(s => StoreUtil.isLoadingState(s[state] as U)); this.current$ = this.store.select(s => (s[state] as U).current); } diff --git a/src/app/shared/views/abstract-list/abstract-list.view.ts b/src/app/shared/views/abstract-list/abstract-list.view.ts index a4b0fc9ee766e43da1849fe2815d5f3c4bf15b22..167a0c39c48ddb8c9733910c3dae8d4cdab95604 100644 --- a/src/app/shared/views/abstract-list/abstract-list.view.ts +++ b/src/app/shared/views/abstract-list/abstract-list.view.ts @@ -2,6 +2,7 @@ import {OnInit} from "@angular/core"; import {ResourceActionHelper} from "@app/core/helpers/resource-action.helper"; import {ResourceStateModel} from "@app/core/stores/resource/resource.state"; import {StoreRouteUtil} from "@app/core/utils/stores/store-route.util"; +import {StoreUtil} from "@app/core/utils/stores/store.util"; import {AbstractComponent} from "@app/shared/components/abstract/abstract.component"; import {ModelAttributeEnum} from "@app/shared/enums/model-attribute.enum"; import {StateEnum} from "@app/shared/enums/state.enum"; @@ -25,7 +26,7 @@ export abstract class AbstractListView<T, U extends ResourceStateModel<T>> exten protected constructor(protected store: Store, private state: StateEnum, private resourceNameSpace: ResourceNameSpace) { super(); - this.isLoading$ = this.store.select(s => (s[state] as U).isLoading); + this.isLoading$ = this.store.select(s => StoreUtil.isLoadingState(s[state] as U)); this.list$ = this.store.select(s => (s[state] as U).list); this.queryParameters$ = this.store.select(s => (s[state] as U).queryParameters); }