From 509fd0d802d8ff7070e6ab3a4569c747c32c8bb0 Mon Sep 17 00:00:00 2001
From: Giuseppe Digilio <giuseppe.digilio@4science.it>
Date: Fri, 26 Jul 2019 19:43:15 +0200
Subject: [PATCH] Fixed an issue while editing repeatable fields

---
 .../sections/form/section-form.component.ts   | 38 ++++++++++++++++++-
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/app/submission/sections/form/section-form.component.ts b/src/app/submission/sections/form/section-form.component.ts
index ef817a7568..2269ccd5f1 100644
--- a/src/app/submission/sections/form/section-form.component.ts
+++ b/src/app/submission/sections/form/section-form.component.ts
@@ -64,6 +64,12 @@ export class SubmissionSectionformComponent extends SectionModelComponent {
    */
   public isLoading = true;
 
+  /**
+   * A map representing all field on their way to be removed
+   * @type {Map}
+   */
+  protected fieldsOnTheirWayToBeRemoved: Map<string, number[]> = new Map();
+
   /**
    * The form config
    * @type {SubmissionFormsModel}
@@ -295,6 +301,7 @@ export class SubmissionSectionformComponent extends SectionModelComponent {
         }),
         distinctUntilChanged())
         .subscribe((sectionState: SubmissionSectionObject) => {
+          this.fieldsOnTheirWayToBeRemoved = new Map();
           this.updateForm(sectionState.data as WorkspaceitemSectionFormObject, sectionState.errors);
         })
     )
@@ -348,11 +355,24 @@ export class SubmissionSectionformComponent extends SectionModelComponent {
    *    the [[DynamicFormControlEvent]] emitted
    */
   onRemove(event: DynamicFormControlEvent): void {
+    const fieldId = this.formBuilderService.getId(event.model);
+    const fieldIndex = this.formOperationsService.getArrayIndexFromEvent(event);
+
+    // Keep track that this field will be removed
+    if (this.fieldsOnTheirWayToBeRemoved.has(fieldId)) {
+      const indexes = this.fieldsOnTheirWayToBeRemoved.get(fieldId);
+      indexes.push(fieldIndex);
+      this.fieldsOnTheirWayToBeRemoved.set(fieldId, indexes);
+    } else {
+      this.fieldsOnTheirWayToBeRemoved.set(fieldId, [fieldIndex]);
+    }
+
     this.formOperationsService.dispatchOperationsFromEvent(
       this.pathCombiner,
       event,
       this.previousValue,
-      this.hasStoredValue(this.formBuilderService.getId(event.model), this.formOperationsService.getArrayIndexFromEvent(event)));
+      this.hasStoredValue(fieldId, fieldIndex));
+
   }
 
   /**
@@ -365,9 +385,23 @@ export class SubmissionSectionformComponent extends SectionModelComponent {
    */
   hasStoredValue(fieldId, index): boolean {
     if (isNotEmpty(this.sectionData.data)) {
-      return this.sectionData.data.hasOwnProperty(fieldId) && isNotEmpty(this.sectionData.data[fieldId][index]);
+      return this.sectionData.data.hasOwnProperty(fieldId) &&
+        isNotEmpty(this.sectionData.data[fieldId][index]) &&
+        !this.isFieldToRemove(fieldId, index);
     } else {
       return false;
     }
   }
+
+  /**
+   * Check if the specified field is on the way to be removed
+   *
+   * @param fieldId
+   *    the section data retrieved from the serverù
+   * @param index
+   *    the section data retrieved from the server
+   */
+  isFieldToRemove(fieldId, index) {
+    return this.fieldsOnTheirWayToBeRemoved.has(fieldId) && this.fieldsOnTheirWayToBeRemoved.get(fieldId).includes(index);
+  }
 }
-- 
GitLab