From b0e981e416a4a417b3b59f29c9618e2288593aa6 Mon Sep 17 00:00:00 2001
From: Richard Henck <richard.henck@iqb.hu-berlin.de>
Date: Mon, 9 Jan 2023 17:42:00 +0100
Subject: [PATCH] Fix DropList replacement logic

Hold the replaced item while doing the actual transfer and add it to
it's origin afterward. This way it can not be transfered after being
moved back.
---
 .../input-elements/drop-list.component.ts     | 43 +++++--------------
 1 file changed, 11 insertions(+), 32 deletions(-)

diff --git a/projects/common/components/input-elements/drop-list.component.ts b/projects/common/components/input-elements/drop-list.component.ts
index 3077e6b2e..a5b3d4563 100644
--- a/projects/common/components/input-elements/drop-list.component.ts
+++ b/projects/common/components/input-elements/drop-list.component.ts
@@ -167,13 +167,18 @@ export class DropListComponent extends FormElementComponent implements OnInit {
     }
 
     if (DropListComponent.isReplace(event)) {
-      const isAlreadyInOrigin: boolean =
+      const isToReplaceItemAlreadyInOrigin: boolean =
         event.container.data.elementFormControl.value[0].originListID === event.container.data.elementModel.id;
-      if (!isAlreadyInOrigin) {
-        DropListComponent.moveBackToOrigin(event);
-      } else {
+      if (isToReplaceItemAlreadyInOrigin) {
         return;
       }
+      const replacedItem: DragNDropValueObject = event.container.data.elementFormControl.value.splice(0, 1)[0];
+      DropListComponent.transferItem(event.previousContainer, event.container, event.previousIndex, event.currentIndex);
+      event.previousContainer.data.updateFormvalue();
+      event.container.data.updateFormvalue();
+      const originComponent = DropListComponent.dragAndDropComponents[replacedItem.originListID];
+      DropListComponent.addElementToList(originComponent, replacedItem);
+      return;
     }
 
     if (DropListComponent.isCopyDrop(event)) {
@@ -199,35 +204,9 @@ export class DropListComponent extends FormElementComponent implements OnInit {
     );
   }
 
-  static moveBackToOrigin(event: CdkDragDrop<any>): void {
-    const originComponent =
-      DropListComponent.dragAndDropComponents[event.container.data.elementFormControl.value[0].originListID];
-    const isIDAlreadyPresentInOrigin =
-      DropListComponent.isItemIDAlreadyPresent(
-        event.container.data.elementFormControl.value[0].id,
-        originComponent.elementFormControl.value);
-    if (!originComponent.elementModel.copyOnDrop || !isIDAlreadyPresentInOrigin) {
-      DropListComponent.addElementToList(originComponent, event.container.data.elementFormControl.value[0]);
-    }
-    DropListComponent.removeElementFromList(event.container.data, 0);
-  }
-
   static addElementToList(listComponent: DropListComponent, element: DragNDropValueObject): void {
-    const targetIndex = element.originListIndex;
-    if (targetIndex) {
-      listComponent.elementFormControl.value.splice(
-        Math.min(listComponent.elementFormControl.value.length, element.originListIndex || 0),
-        0,
-        element
-      );
-    } else {
-      listComponent.elementFormControl.value.push(element);
-    }
-    listComponent.elementFormControl.setValue(listComponent.elementFormControl.value);
-  }
-
-  static removeElementFromList(listComponent: DropListComponent, index: number): void {
-    listComponent.elementFormControl.value.splice(index, 1);
+    const targetIndex = Math.min(listComponent.elementFormControl.value.length, element.originListIndex || 0);
+    listComponent.elementFormControl.value.splice(targetIndex, 0, element);
     listComponent.elementFormControl.setValue(listComponent.elementFormControl.value);
   }
 
-- 
GitLab