From f6a345ee0d1d68091a33893c3413fee1aed5b474 Mon Sep 17 00:00:00 2001
From: rhenck <richard.henck@iqb.hu-berlin.de>
Date: Wed, 15 Dec 2021 12:38:51 +0100
Subject: [PATCH] Fix reading of exiting cloze elements

The child elements are created directly in the component when reading a
serialized cloze.

The whole parsing process of cloze elements will be reworked soon. So
this probably is a temporary fix.
---
 .../common/ui-elements/cloze/cloze-element.ts | 41 ++++++++++++++++++-
 1 file changed, 39 insertions(+), 2 deletions(-)

diff --git a/projects/common/ui-elements/cloze/cloze-element.ts b/projects/common/ui-elements/cloze/cloze-element.ts
index a60430429..2f4901d8d 100644
--- a/projects/common/ui-elements/cloze/cloze-element.ts
+++ b/projects/common/ui-elements/cloze/cloze-element.ts
@@ -2,11 +2,18 @@ import {
   ClozePart,
   CompoundElement,
   FontElement,
-  FontProperties,
+  FontProperties, InputElement,
   PositionedElement, PositionProperties,
   UIElement
 } from '../../models/uI-element';
 import { initFontElement, initPositionedElement } from '../../util/unit-interface-initializer';
+import { TextFieldSimpleElement } from '../textfield-simple/text-field-simple-element';
+import { TextFieldElement } from '../text-field/text-field-element';
+import { TextAreaElement } from '../text-area/text-area-element';
+import { CheckboxElement } from '../checkbox/checkbox-element';
+import { DropdownElement } from '../dropdown/dropdown-element';
+import { DropListSimpleElement } from '../drop-list-simple/drop-list-simple';
+import { ToggleButtonElement } from '../toggle-button/toggle-button';
 
 // TODO styles like em dont continue after inserted components
 
@@ -27,7 +34,7 @@ export class ClozeElement extends CompoundElement implements PositionedElement,
       serializedElement?.parts.forEach((subParts: ClozePart[]) => {
         subParts.forEach((part: ClozePart) => {
           if (!['p', 'h1', 'h2', 'h3', 'h4'].includes(part.type)) {
-            part.value = this.createElement(part.value as UIElement);
+            part.value = ClozeElement.createElement(part.value as UIElement);
           }
         });
       });
@@ -36,4 +43,34 @@ export class ClozeElement extends CompoundElement implements PositionedElement,
     this.width = serializedElement.width || 450;
     this.height = serializedElement.height || 200;
   }
+
+  static createElement(elementModel: Partial<UIElement>): InputElement {
+    let newElement: InputElement;
+    switch (elementModel.type) {
+      case 'text-field':
+        newElement = new TextFieldSimpleElement(elementModel);
+        (newElement as TextFieldElement).label = '';
+        break;
+      case 'text-area':
+        newElement = new TextAreaElement(elementModel);
+        break;
+      case 'checkbox':
+        newElement = new CheckboxElement(elementModel);
+        break;
+      case 'dropdown':
+        newElement = new DropdownElement(elementModel);
+        break;
+      case 'drop-list':
+        newElement = new DropListSimpleElement(elementModel);
+        newElement.height = 25; // TODO weg?
+        newElement.width = 100;
+        break;
+      case 'toggle-button':
+        newElement = new ToggleButtonElement(elementModel);
+        break;
+      default:
+        throw new Error(`ElementType ${elementModel.type} not found!`);
+    }
+    return newElement;
+  }
 }
-- 
GitLab