From 5b5a67cafd3bad79425d56e1456bde3a0ca92a68 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Tue, 14 Jun 2022 14:15:39 +0200
Subject: [PATCH] [editor] Implement 'hasSchemerData' for elements with schemer
 data

- Implement hasSchemerData in UIElement
- Fix nullable field for some elements
---
 .../cloze-child-elements/drop-list-simple.ts  |  4 ++++
 .../cloze-child-elements/text-field-simple.ts | 19 +++++++------------
 .../cloze-child-elements/toggle-button.ts     |  4 ++++
 .../compound-elements/likert/likert-row.ts    | 12 ++++++++++--
 projects/common/models/elements/element.ts    |  4 ++++
 .../elements/input-elements/checkbox.ts       |  4 ++++
 .../elements/input-elements/drop-list.ts      |  4 ++++
 .../elements/input-elements/dropdown.ts       |  4 ++++
 .../radio-button-group-complex.ts             |  6 +++++-
 .../input-elements/radio-button-group.ts      |  6 +++++-
 .../models/elements/input-elements/slider.ts  |  6 +++++-
 .../elements/input-elements/spell-correct.ts  | 12 ++++++------
 .../elements/input-elements/text-area.ts      | 14 +++++++-------
 .../elements/input-elements/text-field.ts     | 14 +++++++-------
 14 files changed, 76 insertions(+), 37 deletions(-)

diff --git a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/drop-list-simple.ts b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/drop-list-simple.ts
index 3cfe30c97..4ca98e0af 100644
--- a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/drop-list-simple.ts
+++ b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/drop-list-simple.ts
@@ -37,6 +37,10 @@ export class DropListSimpleElement extends InputElement {
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(dropLists: Array<DropListElement | DropListSimpleElement>): SchemerData {
     return {
       id: this.id,
diff --git a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/text-field-simple.ts b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/text-field-simple.ts
index eeb0c61f0..57447f946 100644
--- a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/text-field-simple.ts
+++ b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/text-field-simple.ts
@@ -1,10 +1,6 @@
 import { ElementFactory } from 'common/util/element.factory';
 import {
-  BasicStyles,
-  InputAssistancePreset,
-  InputElement,
-  SchemerData,
-  SchemerValue
+  BasicStyles, InputAssistancePreset, InputElement, SchemerData
 } from 'common/models/elements/element';
 import { Type } from '@angular/core';
 import { ElementComponent } from 'common/directives/element-component.directive';
@@ -50,23 +46,22 @@ export class TextFieldSimpleElement extends InputElement {
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'string',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === '',
-      values: this.getSchemerValues(),
+      nullable: !this.value && this.value !== '',
+      values: [],
       valuesComplete: false
     };
   }
 
-  private getSchemerValues(): SchemerValue[] {
-    return [];
-  }
-
-
   getComponentFactory(): Type<ElementComponent> {
     return TextFieldSimpleComponent;
   }
diff --git a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
index 55a28e0f5..ad7cd8798 100644
--- a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
+++ b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
@@ -32,6 +32,10 @@ export class ToggleButtonElement extends InputElement {
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
diff --git a/projects/common/models/elements/compound-elements/likert/likert-row.ts b/projects/common/models/elements/compound-elements/likert/likert-row.ts
index 6c51af805..c6b80ddad 100644
--- a/projects/common/models/elements/compound-elements/likert/likert-row.ts
+++ b/projects/common/models/elements/compound-elements/likert/likert-row.ts
@@ -19,20 +19,28 @@ export class LikertRowElement extends InputElement {
     if (element.verticalButtonAlignment) this.verticalButtonAlignment = element.verticalButtonAlignment;
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'integer',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === 0,
+      nullable: !this.value && this.value !== 0,
       values: this.getSchemerValues(),
       valuesComplete: true
     };
   }
 
   private getSchemerValues(): SchemerValue[] {
-    return [];
+    console.log(this.value);
+    return [
+      { value: !this.value && this.value !== 0 ? 'null' : (this.value as number + 1).toString(),
+        label: this.rowLabel.text } // TODO Image
+    ];
   }
 
   getComponentFactory(): Type<ElementComponent> {
diff --git a/projects/common/models/elements/element.ts b/projects/common/models/elements/element.ts
index 989b354fb..1b0c6da72 100644
--- a/projects/common/models/elements/element.ts
+++ b/projects/common/models/elements/element.ts
@@ -70,6 +70,10 @@ export abstract class UIElement {
     return [];
   }
 
+  hasSchemerData(): boolean {
+    return false;
+  }
+
   abstract getComponentFactory(): Type<ElementComponent>;
 }
 
diff --git a/projects/common/models/elements/input-elements/checkbox.ts b/projects/common/models/elements/input-elements/checkbox.ts
index 3eb64b673..03b327e60 100644
--- a/projects/common/models/elements/input-elements/checkbox.ts
+++ b/projects/common/models/elements/input-elements/checkbox.ts
@@ -20,6 +20,10 @@ export class CheckboxElement extends InputElement implements PositionedUIElement
     this.styling = ElementFactory.initStylingProps(element.styling);
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
diff --git a/projects/common/models/elements/input-elements/drop-list.ts b/projects/common/models/elements/input-elements/drop-list.ts
index 2f7555a2c..ed80f461f 100644
--- a/projects/common/models/elements/input-elements/drop-list.ts
+++ b/projects/common/models/elements/input-elements/drop-list.ts
@@ -47,6 +47,10 @@ export class DropListElement extends InputElement implements PositionedUIElement
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(options: Array<DropListElement | DropListSimpleElement>): SchemerData {
     return {
       id: this.id,
diff --git a/projects/common/models/elements/input-elements/dropdown.ts b/projects/common/models/elements/input-elements/dropdown.ts
index 867d979b4..2cdd6623d 100644
--- a/projects/common/models/elements/input-elements/dropdown.ts
+++ b/projects/common/models/elements/input-elements/dropdown.ts
@@ -26,6 +26,10 @@ export class DropdownElement extends InputElement implements PositionedUIElement
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
diff --git a/projects/common/models/elements/input-elements/radio-button-group-complex.ts b/projects/common/models/elements/input-elements/radio-button-group-complex.ts
index 8001df65d..b5b8caaec 100644
--- a/projects/common/models/elements/input-elements/radio-button-group-complex.ts
+++ b/projects/common/models/elements/input-elements/radio-button-group-complex.ts
@@ -24,13 +24,17 @@ export class RadioButtonGroupComplexElement extends InputElement implements Posi
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'integer',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === 0,
+      nullable: !this.value && this.value !== 0,
       values: this.getSchemerValues(),
       valuesComplete: true
     };
diff --git a/projects/common/models/elements/input-elements/radio-button-group.ts b/projects/common/models/elements/input-elements/radio-button-group.ts
index 1bb9615b6..c1aabbed7 100644
--- a/projects/common/models/elements/input-elements/radio-button-group.ts
+++ b/projects/common/models/elements/input-elements/radio-button-group.ts
@@ -34,13 +34,17 @@ export class RadioButtonGroupElement extends InputElement implements PositionedU
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'integer',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === 0,
+      nullable: !this.value && this.value !== 0,
       values: this.getSchemerValues(),
       valuesComplete: true
     };
diff --git a/projects/common/models/elements/input-elements/slider.ts b/projects/common/models/elements/input-elements/slider.ts
index 820ecf0ec..3043b801b 100644
--- a/projects/common/models/elements/input-elements/slider.ts
+++ b/projects/common/models/elements/input-elements/slider.ts
@@ -38,13 +38,17 @@ export class SliderElement extends InputElement implements PositionedUIElement {
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'integer',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === 0,
+      nullable: !this.value && this.value !== 0,
       values: this.getSchemerValues(),
       valuesComplete: true
     };
diff --git a/projects/common/models/elements/input-elements/spell-correct.ts b/projects/common/models/elements/input-elements/spell-correct.ts
index 2b95efbbe..9042671a8 100644
--- a/projects/common/models/elements/input-elements/spell-correct.ts
+++ b/projects/common/models/elements/input-elements/spell-correct.ts
@@ -5,7 +5,7 @@ import {
   InputAssistancePreset,
   InputElement,
   PositionedUIElement,
-  PositionProperties, SchemerData, SchemerValue
+  PositionProperties, SchemerData
 } from 'common/models/elements/element';
 import { ElementComponent } from 'common/directives/element-component.directive';
 import { SpellCorrectComponent } from 'common/components/input-elements/spell-correct.component';
@@ -34,6 +34,10 @@ export class SpellCorrectElement extends InputElement implements PositionedUIEle
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
@@ -41,15 +45,11 @@ export class SpellCorrectElement extends InputElement implements PositionedUIEle
       format: '',
       multiple: false,
       nullable: true,
-      values: this.getSchemerValues(),
+      values: [],
       valuesComplete: false
     };
   }
 
-  private getSchemerValues(): SchemerValue[] {
-    return [];
-  }
-
   getComponentFactory(): Type<ElementComponent> {
     return SpellCorrectComponent;
   }
diff --git a/projects/common/models/elements/input-elements/text-area.ts b/projects/common/models/elements/input-elements/text-area.ts
index 70906e9ee..45215b956 100644
--- a/projects/common/models/elements/input-elements/text-area.ts
+++ b/projects/common/models/elements/input-elements/text-area.ts
@@ -5,7 +5,7 @@ import {
   InputAssistancePreset,
   InputElement,
   PositionedUIElement,
-  PositionProperties, SchemerData, SchemerValue
+  PositionProperties, SchemerData
 } from 'common/models/elements/element';
 import { ElementComponent } from 'common/directives/element-component.directive';
 import { TextAreaComponent } from 'common/components/input-elements/text-area.component';
@@ -46,22 +46,22 @@ export class TextAreaElement extends InputElement implements PositionedUIElement
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'string',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === '',
-      values: this.getSchemerValues(),
+      nullable: !this.value && this.value !== '',
+      values: [],
       valuesComplete: false
     };
   }
 
-  private getSchemerValues(): SchemerValue[] {
-    return [];
-  }
-
   getComponentFactory(): Type<ElementComponent> {
     return TextAreaComponent;
   }
diff --git a/projects/common/models/elements/input-elements/text-field.ts b/projects/common/models/elements/input-elements/text-field.ts
index bccfa40c2..d7e2f450d 100644
--- a/projects/common/models/elements/input-elements/text-field.ts
+++ b/projects/common/models/elements/input-elements/text-field.ts
@@ -2,7 +2,7 @@ import { Type } from '@angular/core';
 import { ElementFactory } from 'common/util/element.factory';
 import {
   BasicStyles, InputAssistancePreset, InputElement,
-  PositionedUIElement, PositionProperties, SchemerData, SchemerValue
+  PositionedUIElement, PositionProperties, SchemerData
 } from 'common/models/elements/element';
 import { ElementComponent } from 'common/directives/element-component.directive';
 import { TextFieldComponent } from 'common/components/input-elements/text-field.component';
@@ -53,22 +53,22 @@ export class TextFieldElement extends InputElement implements PositionedUIElemen
     };
   }
 
+  hasSchemerData(): boolean {
+    return true;
+  }
+
   getSchemerData(): SchemerData {
     return {
       id: this.id,
       type: 'string',
       format: '',
       multiple: false,
-      nullable: !this.value && this.value === '',
-      values: this.getSchemerValues(),
+      nullable: !this.value && this.value !== '',
+      values: [],
       valuesComplete: false
     };
   }
 
-  private getSchemerValues(): SchemerValue[] {
-    return [];
-  }
-
   getComponentFactory(): Type<ElementComponent> {
     return TextFieldComponent;
   }
-- 
GitLab