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