From d346f9c0197c3e61db9726c3bfe6fb63c8728946 Mon Sep 17 00:00:00 2001
From: rhenck <richard.henck@iqb.hu-berlin.de>
Date: Wed, 10 Nov 2021 17:47:58 +0100
Subject: [PATCH] Refactor dropList to only have values and not options

Options and value were the same thing anyway and the value was updated
once anything was changed within that dropList.
The player though needs a start value and this way we have one.
---
 .../compound-elements/drop-list.component.ts  | 18 +++++------
 .../models/compound-elements/drop-list.ts     |  2 +-
 .../element-properties.component.html         | 32 +++++++++++++++++++
 3 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/projects/common/element-components/compound-elements/drop-list.component.ts b/projects/common/element-components/compound-elements/drop-list.component.ts
index 358600df0..5fc6709f5 100644
--- a/projects/common/element-components/compound-elements/drop-list.component.ts
+++ b/projects/common/element-components/compound-elements/drop-list.component.ts
@@ -27,12 +27,12 @@ import { FormElementComponent } from '../../form-element-component.directive';
            [cdkDropListOrientation]="elementModel.orientation"
            [cdkDropListEnterPredicate]="onlyOneItemPredicate"
            (cdkDropListDropped)="drop($event)">
-        <div class="item" *ngFor="let option of elementModel.options; let i = index" cdkDrag
+        <div class="item" *ngFor="let value of $any(elementModel.value)" cdkDrag
              [ngClass]="{'vertical-item': elementModel.orientation === 'vertical',
                          'horizontal-item': elementModel.orientation === 'horizontal'}">
-          <div *cdkDragPreview>{{option}}</div>
+          <div *cdkDragPreview>{{value}}</div>
           <div class="drag-placeholder" *cdkDragPlaceholder [style.min-height.px]="elementModel.fontSize"></div>
-          {{option}}
+          {{value}}
         </div>
       </div>
       <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched"
@@ -61,21 +61,21 @@ export class DropListComponent extends FormElementComponent {
   drop(event: CdkDragDrop<DropListComponent>): void {
     if (!this.elementModel.readOnly) {
       if (event.previousContainer === event.container) {
-        moveItemInArray(event.container.data.elementModel.options, event.previousIndex, event.currentIndex);
+        moveItemInArray(event.container.data.elementModel.value as string[], event.previousIndex, event.currentIndex);
       } else {
         transferArrayItem(
-          event.previousContainer.data.elementModel.options,
-          event.container.data.elementModel.options,
+          event.previousContainer.data.elementModel.value as string[],
+          event.container.data.elementModel.value as string[],
           event.previousIndex,
           event.currentIndex
         );
-        event.previousContainer.data.elementFormControl.setValue(event.previousContainer.data.elementModel.options);
+        event.previousContainer.data.elementFormControl.setValue(event.previousContainer.data.elementModel.value);
       }
-      this.elementFormControl.setValue(event.container.data.elementModel.options);
+      this.elementFormControl.setValue(event.container.data.elementModel.value);
     }
   }
 
   onlyOneItemPredicate = (drag: CdkDrag, drop: CdkDropList): boolean => (
-    !drop.data.elementModel.onlyOneItem || drop.data.elementModel.options.length < 1
+    !drop.data.elementModel.onlyOneItem || drop.data.elementModel.value.length < 1
   );
 }
diff --git a/projects/common/models/compound-elements/drop-list.ts b/projects/common/models/compound-elements/drop-list.ts
index 6fff65975..d2be9550a 100644
--- a/projects/common/models/compound-elements/drop-list.ts
+++ b/projects/common/models/compound-elements/drop-list.ts
@@ -3,7 +3,6 @@ import { FontElement, SurfaceUIElement } from '../../interfaces/UIElementInterfa
 import { initFontElement, initSurfaceElement } from '../../util/unit-interface-initializer';
 
 export class DropListElement extends InputElement implements FontElement, SurfaceUIElement {
-  options: string[] = [];
   onlyOneItem: boolean = false;
   connectedTo: string[] = [];
   orientation: 'vertical' | 'horizontal' = 'vertical';
@@ -24,6 +23,7 @@ export class DropListElement extends InputElement implements FontElement, Surfac
     Object.assign(this, initFontElement(serializedElement));
     Object.assign(this, initSurfaceElement(serializedElement));
 
+    this.value = [];
     this.height = serializedElement.height || 100;
     this.backgroundColor = serializedElement.backgroundColor as string || 'transparent';
   }
diff --git a/projects/editor/src/app/unit-view/page-view/properties-panel/element-properties.component.html b/projects/editor/src/app/unit-view/page-view/properties-panel/element-properties.component.html
index c3c0e1059..0e173600f 100644
--- a/projects/editor/src/app/unit-view/page-view/properties-panel/element-properties.component.html
+++ b/projects/editor/src/app/unit-view/page-view/properties-panel/element-properties.component.html
@@ -109,6 +109,37 @@
           </div>
         </mat-form-field>
 
+        <mat-form-field disabled="true" *ngIf="combinedProperties.connectedTo !== undefined">
+          <ng-container>
+            <mat-label>{{'propertiesPanel.value' | translate }}</mat-label>
+            <div class="drop-list" cdkDropList [cdkDropListData]="combinedProperties.value"
+                 (cdkDropListDropped)="reorderOptions('value', $any($event))">
+              <div *ngFor="let value of $any(combinedProperties.value); let i = index" cdkDrag
+                   class="list-items" fxLayout="row" fxLayoutAlign="end center">
+                <div fxFlex="70">
+                  {{value}}
+                </div>
+                <button mat-icon-button color="primary"
+                        (click)="editTextOption('value', i)">
+                  <mat-icon>build</mat-icon>
+                </button>
+                <button mat-icon-button color="primary"
+                        (click)="removeOption('value', value)">
+                  <mat-icon>clear</mat-icon>
+                </button>
+              </div>
+            </div>
+          </ng-container>
+          <div fxLayout="row" fxLayoutAlign="center center">
+            <button mat-icon-button matPrefix
+                    (click)="addOption('value', newValue.value); newValue.select()">
+              <mat-icon>add</mat-icon>
+            </button>
+            <input #newValue matInput type="text"
+                   (keyup.enter)="addOption('value', newValue.value); newValue.select()">
+          </div>
+        </mat-form-field>
+
         <mat-form-field *ngIf="combinedProperties.alignment" appearance="fill">
           <mat-label>{{'propertiesPanel.alignment' | translate }}</mat-label>
           <mat-select [value]="combinedProperties.alignment"
@@ -188,6 +219,7 @@
 
         <mat-form-field *ngIf="combinedProperties.value !== undefined &&
                                !combinedProperties.options && !combinedProperties.columns &&
+                               combinedProperties.connectedTo === undefined &&
                                combinedProperties.value !== true && combinedProperties.value !== false"
                         appearance="fill">
           <mat-label>{{'propertiesPanel.preset' | translate }}</mat-label>
-- 
GitLab