From 452ea4ea754e9b5b16561d2f998df2cfb77d90b7 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Tue, 3 Jan 2023 13:54:31 +0100
Subject: [PATCH] [player] Use form control value for drop list manipulations

- Add pipe to decide which list to use
---
 .../input-elements/drop-list.component.ts     | 32 +++++++++++++------
 projects/common/shared.module.ts              |  3 +-
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/projects/common/components/input-elements/drop-list.component.ts b/projects/common/components/input-elements/drop-list.component.ts
index 6de1a6601..9305f9282 100644
--- a/projects/common/components/input-elements/drop-list.component.ts
+++ b/projects/common/components/input-elements/drop-list.component.ts
@@ -1,10 +1,11 @@
-import { Component, Input } from '@angular/core';
+import { Component, Input, Pipe, PipeTransform } from '@angular/core';
 import {
   CdkDrag, CdkDragDrop, CdkDragEnd, CdkDragStart, CdkDropList, moveItemInArray, transferArrayItem
 } from '@angular/cdk/drag-drop';
 import { DropListElement } from 'common/models/elements/input-elements/drop-list';
 import { DragNDropValueObject } from 'common/models/elements/element';
 import { FormElementComponent } from '../../directives/form-element-component.directive';
+import { FormGroup } from '@angular/forms';
 
 @Component({
   selector: 'aspect-drop-list',
@@ -32,7 +33,8 @@ import { FormElementComponent } from '../../directives/form-element-component.di
          [style.border-color]="elementModel.highlightReceivingDropListColor"
          [class.errors]="elementFormControl.errors && elementFormControl.touched"
          (focusout)="elementFormControl.markAsTouched()">
-      <ng-container *ngFor="let dropListValueElement of elementModel.value let index = index;">
+      <ng-container *ngFor="let dropListValueElement of
+      (parentForm | dropListValueElements: elementModel.value: elementFormControl.value) let index = index;">
         <div *ngIf="!dropListValueElement.imgSrc"
              class="list-item"
              cdkDrag [cdkDragData]="dropListValueElement"
@@ -112,19 +114,19 @@ export class DropListComponent extends FormElementComponent {
 
   drop(event: CdkDragDrop<any>) {
     if (DropListComponent.isReorderDrop(event)) {
-      moveItemInArray(event.container.data.elementModel.value, event.previousIndex, event.currentIndex);
+      moveItemInArray(event.container.data.elementFormControl.value, event.previousIndex, event.currentIndex);
       event.container.data.updateFormvalue();
     } else if (DropListComponent.isCopyDrop(event)) {
-      event.container.data.elementModel.value.push(
-        event.previousContainer.data.elementModel.value[event.previousIndex]);
+      event.container.data.elementFormControl.value.push(
+        event.previousContainer.data.elementFormControl.value[event.previousIndex]);
       event.container.data.updateFormvalue();
     } else if (DropListComponent.isPutBack(event)) {
-      event.previousContainer.data.elementModel.value.splice(event.previousIndex, 1);
+      event.previousContainer.data.elementFormControl.value.splice(event.previousIndex, 1);
       event.previousContainer.data.updateFormvalue();
     } else {
       transferArrayItem(
-        event.previousContainer.data.elementModel.value,
-        event.container.data.elementModel.value,
+        event.previousContainer.data.elementFormControl.value,
+        event.container.data.elementFormControl.value,
         event.previousIndex,
         event.currentIndex
       );
@@ -143,7 +145,7 @@ export class DropListComponent extends FormElementComponent {
 
   static isPutBack(event: CdkDragDrop<any>): boolean {
     return event.container.data.elementModel.copyOnDrop &&
-      DropListComponent.isItemIDAlreadyPresent(event.item.data.id, event.container.data.elementModel.value);
+      DropListComponent.isItemIDAlreadyPresent(event.item.data.id, event.container.data.elementFormControl.value);
   }
 
   updateFormvalue(): void {
@@ -151,7 +153,7 @@ export class DropListComponent extends FormElementComponent {
   }
 
   validDropPredicate = (drag: CdkDrag, drop: CdkDropList): boolean => {
-    return (!drop.data.elementModel.onlyOneItem || drop.data.elementModel.value.length < 1);// &&
+    return (!drop.data.elementModel.onlyOneItem || drop.data.elementFormControl.value.length < 1);// &&
       // (!DropListComponent.isItemIDAlreadyPresent(drag.data.id, drop.data.value));
   };
 
@@ -172,3 +174,13 @@ export class DropListComponent extends FormElementComponent {
     return listValueIDs.includes(itemID);
   }
 }
+
+@Pipe({
+  name: 'dropListValueElements'
+})
+export class DropListValueElementsPipe implements PipeTransform {
+  transform(parentForm: FormGroup, elementModelValue: DragNDropValueObject[], elementFormValue: DragNDropValueObject[])
+    : DragNDropValueObject[] {
+    return parentForm ? elementFormValue : elementModelValue;
+  }
+}
diff --git a/projects/common/shared.module.ts b/projects/common/shared.module.ts
index ffd85fbbf..7b8002ace 100644
--- a/projects/common/shared.module.ts
+++ b/projects/common/shared.module.ts
@@ -52,7 +52,7 @@ import {
 } from './components/compound-elements/likert/likert-radio-button-group.component';
 import { ImageMagnifierComponent } from './components/media-elements/image-magnifier.component';
 import { RadioGroupImagesComponent } from './components/input-elements/radio-group-images.component';
-import { DropListComponent } from './components/input-elements/drop-list.component';
+import { DropListComponent, DropListValueElementsPipe } from './components/input-elements/drop-list.component';
 import { ClozeComponent } from './components/compound-elements/cloze/cloze.component';
 import { SliderComponent } from './components/input-elements/slider.component';
 import { SpellCorrectComponent } from './components/input-elements/spell-correct.component';
@@ -120,6 +120,7 @@ import { GetValuePipe, MathFieldComponent } from './components/input-elements/ma
     ImageMagnifierComponent,
     RadioGroupImagesComponent,
     DropListComponent,
+    DropListValueElementsPipe,
     ClozeComponent,
     HotspotImageComponent,
     SliderComponent,
-- 
GitLab