From 5ae07dd093ee1152187c5b6b73089a4b34bea31e Mon Sep 17 00:00:00 2001 From: Florent Poittevin <florent.poittevin@unige.ch> Date: Fri, 15 Nov 2019 14:34:14 +0100 Subject: [PATCH] fix: deposit error after refacto of breadcrumb --- .../deposit-detail-edit.routable.ts | 15 ++-------- .../deposit-metadata.routable.ts | 3 ++ .../data-file/deposit-data-file.state.ts | 10 +++++++ .../features/deposit/stores/deposit.state.ts | 21 +++++++++++--- .../shared-breadcrumb.presentational.ts | 2 +- ...ed-abstract-detail-edit-common.routable.ts | 28 ++++++++++++++----- .../shared-abstract-detail-edit.routable.ts | 24 ++++++++-------- 7 files changed, 66 insertions(+), 37 deletions(-) diff --git a/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.ts b/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.ts index 21b0d2028..6d5cb9bbc 100644 --- a/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.ts +++ b/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.ts @@ -1,6 +1,5 @@ import {PersonRole} from "@admin/models/person-role.model"; import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, @@ -70,7 +69,6 @@ import { selector: "dlcm-deposit-detail-edit-routable", templateUrl: "./deposit-detail-edit.routable.html", styleUrls: ["./deposit-detail-edit.routable.scss"], - changeDetection: ChangeDetectionStrategy.OnPush, }) export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<DepositExtended, DepositStateModel> implements OnInit, OnDestroy { @Select((state: LocalStateModel) => state.deposit.deposit_statusHistory.history) historyObs: Observable<StatusHistory[]>; @@ -138,11 +136,6 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable< this.cleanState(); } - protected getById(id: string): void { - super.getById(id); - this.getSubResourceWithParentId(id); - } - private _computeCurrentTab(): void { const tabRouteSelected = DepositHelper.getTabRouteSelected(this.route); this.tabSelected = DepositHelper.getTabSelectedIndexWithRoute(tabRouteSelected); @@ -161,7 +154,6 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable< filter(deposit => !isNullOrUndefined(deposit) && deposit.resId === this._resId), take(1), tap(deposit => { - let canSubmitAction = deposit.status === Deposit.StatusEnum.INPROGRESS; const canDoValidatorActions = this._securityService.depositInValidationStep(deposit); const canDoAlterationActions = this._securityService.depositInEditionStep(deposit); @@ -169,6 +161,7 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable< distinctUntilChanged(), filter(([numberFiles, numberFilesInError]) => !isNullOrUndefined(numberFiles) && !isNullOrUndefined(numberFilesInError)), tap(([numberFiles, numberFilesInError]) => { + let canSubmitAction = deposit.status === Deposit.StatusEnum.INPROGRESS; if (numberFiles === 0) { this.message = TRANSLATE("deposit.error.noFile"); canSubmitAction = false; @@ -178,11 +171,7 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable< this.message = TRANSLATE("deposit.error.fileInError"); canSubmitAction = false; } - - if (isTrue(canSubmitAction)) { - this.canSubmitAction = true; - } - this._changeDetector.detectChanges(); + this.canSubmitAction = canSubmitAction; }), )); diff --git a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts index 2b98381c7..5af01566f 100644 --- a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts +++ b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts @@ -100,4 +100,7 @@ export class DepositMetadataRoutable extends SharedAbstractDetailEditRoutable<De this._store.dispatch(new SharedOrgUnitPreservationPolicyAction.Clear()); this._store.dispatch(new SharedOrgUnitSubmissionPolicyAction.Clear()); } + + protected getSubResourceWithParentId(id: string): void { + } } diff --git a/src/app/features/deposit/stores/data-file/deposit-data-file.state.ts b/src/app/features/deposit/stores/data-file/deposit-data-file.state.ts index ef7e83ee6..630e14dc8 100644 --- a/src/app/features/deposit/stores/data-file/deposit-data-file.state.ts +++ b/src/app/features/deposit/stores/data-file/deposit-data-file.state.ts @@ -41,6 +41,7 @@ import { defaultCompositionStateInitValue, MappingObjectUtil, NotificationService, + OverrideDefaultAction, QueryParameters, SolidifyStateError, StoreUtil, @@ -252,4 +253,13 @@ export class DepositDataFileState extends CompositionState<DepositDataFile> { }); ctx.dispatch(new DepositDataFileAction.GetAll(action.parentId, undefined, action.keepCurrentContext)); } + + @OverrideDefaultAction() + @Action(DepositDataFileAction.DeleteSuccess) + deleteSuccess(ctx: StateContext<DepositDataFileStateModel>, action: DepositDataFileAction.DeleteSuccess): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + ctx.dispatch(new DepositDataFileAction.Refresh(action.parentId)); + } } diff --git a/src/app/features/deposit/stores/deposit.state.ts b/src/app/features/deposit/stores/deposit.state.ts index 8fea19f3a..170d7d869 100644 --- a/src/app/features/deposit/stores/deposit.state.ts +++ b/src/app/features/deposit/stores/deposit.state.ts @@ -29,7 +29,10 @@ import {PreIngestResourceApiEnum} from "@app/shared/enums/api.enum"; import {ErrorBackendKeyEnum} from "@app/shared/enums/error-backend-key.enum"; import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; import {LocalModelAttributeEnum} from "@app/shared/enums/model-attribute.enum"; -import {RoutesEnum} from "@app/shared/enums/routes.enum"; +import { + DepositRoutesEnum, + RoutesEnum, +} from "@app/shared/enums/routes.enum"; import {SharedLanguageAction} from "@app/shared/stores/language/shared-language.action"; import {SharedPreservationPolicyAction} from "@app/shared/stores/preservation-policy/shared-preservation-policy.action"; import {SharedSubmissionPolicyAction} from "@app/shared/stores/submission-policy/shared-submission-policy.action"; @@ -70,6 +73,7 @@ import { ResourceStateModel, SolidifyStateError, StoreUtil, + StringUtil, TRANSLATE, urlSeparator, } from "solidify-frontend"; @@ -111,8 +115,8 @@ export class DepositState extends ResourceState<DepositExtended> { protected actions$: Actions) { super(apiService, store, notificationService, actions$, { nameSpace: depositActionNameSpace, - routeRedirectUrlAfterSuccessCreateAction: (resId: string) => RoutesEnum.depositEdit + urlSeparator + resId, - routeRedirectUrlAfterSuccessUpdateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId, + routeRedirectUrlAfterSuccessCreateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files + urlSeparator + DepositRoutesEnum.edit, + routeRedirectUrlAfterSuccessUpdateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files, routeRedirectUrlAfterSuccessDeleteAction: RoutesEnum.deposit, notificationResourceCreateSuccessTextToTranslate: TRANSLATE("deposit.notification.resource.create"), notificationResourceDeleteSuccessTextToTranslate: TRANSLATE("deposit.notification.resource.delete"), @@ -234,6 +238,15 @@ export class DepositState extends ResourceState<DepositExtended> { ); } + @OverrideDefaultAction() + @Action(DepositAction.UpdateSuccess) + updateSuccess(ctx: StateContext<DepositStateModel>, action: DepositAction.UpdateSuccess): void { + super.updateSuccess(ctx, action); + + const depositId = action.model.resId; + ctx.dispatch(new DepositPersonAction.GetAll(depositId)); + } + private updateSubResource(model: DepositExtended, action: DepositAction.Create | DepositAction.Update, ctx: StateContext<DepositStateModel>): Observable<boolean> { const depositId = model.resId; const newAuthors: string[] = action.modelFormControlEvent.model[LocalModelAttributeEnum.authors]; @@ -358,7 +371,7 @@ export class DepositState extends ResourceState<DepositExtended> { if (action.isArchive) { apiAction = ApiActionEnum.UL_ARCHIVE; } else { - formData.append(this._FOLDER_KEY, action.fileUploadWrapper.subDirectory); + formData.append(this._FOLDER_KEY, isNullOrUndefined(action.fileUploadWrapper.subDirectory) ? StringUtil.stringEmpty : action.fileUploadWrapper.subDirectory); } formData.append(this._FILE_KEY, action.fileUploadWrapper.file, action.fileUploadWrapper.file.name); formData.append(this._CATEGORY_KEY, action.fileUploadWrapper.dataCategory); diff --git a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts index 8ea6de798..013e2cc69 100644 --- a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts +++ b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts @@ -103,7 +103,7 @@ export class SharedBreadcrumbPresentational extends SharedAbstractPresentational } private getBreadcrumbMemoizedSelector(route: ActivatedRoute): Observable<string> | undefined { - if (isNullOrUndefined(route.routeConfig)) { + if (isNullOrUndefined(route.routeConfig) || isNullOrUndefined(route.routeConfig.data)) { return undefined; } const breadcrumbMemoizedSelector = (route.routeConfig.data as DlcmData).breadcrumbMemoizedSelector; diff --git a/src/app/shared/components/routables/shared-abstract-detail-edit-common/shared-abstract-detail-edit-common.routable.ts b/src/app/shared/components/routables/shared-abstract-detail-edit-common/shared-abstract-detail-edit-common.routable.ts index 3d74fca2c..f2cd1bd34 100644 --- a/src/app/shared/components/routables/shared-abstract-detail-edit-common/shared-abstract-detail-edit-common.routable.ts +++ b/src/app/shared/components/routables/shared-abstract-detail-edit-common/shared-abstract-detail-edit-common.routable.ts @@ -7,10 +7,17 @@ import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; import { Actions, + ofActionCompleted, Store, } from "@ngxs/store"; import {SharedAbstractDetailEditRoutable} from "@shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable"; +import {Observable} from "rxjs"; import { + take, + tap, +} from "rxjs/operators"; +import { + ModelFormControlEvent, ResourceNameSpace, ResourceStateModel, } from "solidify-frontend"; @@ -35,15 +42,22 @@ export abstract class SharedAbstractDetailEditCommonRoutable<TResourceModel, URe this.retrieveCurrentModelAndResource(); } + update(model: ModelFormControlEvent<TResourceModel>): Observable<any> { + this.subscribe(this._actions$.pipe( + ofActionCompleted(this.resourceNameSpace.UpdateSuccess), + take(1), + tap(result => { + if (!result.result.successful) { + return; + } + this.retrieveCurrentModelWithUrl(); + }), + )); + return super.update(model); + } + ngOnDestroy(): void { super.ngOnDestroy(); this.cleanState(); } - - protected getById(id: string): void { - super.getById(id); - this.getSubResourceWithParentId(id); - } - - abstract getSubResourceWithParentId(id: string): void; } diff --git a/src/app/shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable.ts b/src/app/shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable.ts index 5b40d95d4..f0420cd5c 100644 --- a/src/app/shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable.ts +++ b/src/app/shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable.ts @@ -19,7 +19,6 @@ import {StoreRouteLocalUtil} from "@app/shared/utils/store-route-local.util"; import {Navigate} from "@ngxs/router-plugin"; import { Actions, - ofActionCompleted, Select, Store, } from "@ngxs/store"; @@ -33,6 +32,7 @@ import { tap, } from "rxjs/operators"; import { + isNullOrUndefined, ModelFormControlEvent, ResourceActionHelper, ResourceNameSpace, @@ -88,15 +88,25 @@ export abstract class SharedAbstractDetailEditRoutable<TResourceModel, UResource this._store.dispatch(ResourceActionHelper.clean(this.resourceNameSpace)); } - protected retrieveCurrentModelWithUrl(): void { + protected retrieveResIdFromUrl(): void { this._resId = this.route.snapshot.paramMap.get("id"); + if (isNullOrUndefined(this._resId)) { + this._resId = this.route.parent.snapshot.paramMap.get("id"); + } + } + + protected retrieveCurrentModelWithUrl(): void { + this.retrieveResIdFromUrl(); this.getById(this._resId); } protected getById(id: string): void { this._store.dispatch(ResourceActionHelper.getById(this.resourceNameSpace, id)); + this.getSubResourceWithParentId(id); } + protected abstract getSubResourceWithParentId(id: string): void; + protected getRetrieveEditModeObs(): Observable<any> { return this.urlStateObs.pipe( distinctUntilChanged(), @@ -113,16 +123,6 @@ export abstract class SharedAbstractDetailEditRoutable<TResourceModel, UResource update(model: ModelFormControlEvent<TResourceModel>): Observable<any> { super.saveInProgress(); - this.subscribe(this._actions$.pipe( - ofActionCompleted(this.resourceNameSpace.UpdateSuccess), - take(1), - tap(result => { - if (!result.result.successful) { - return; - } - this.retrieveCurrentModelWithUrl(); - }), - )); return this._store.dispatch(ResourceActionHelper.update<TResourceModel>(this.resourceNameSpace, model)); } -- GitLab