From 4258db67fc85da9667e6ff2e1aa653b43e3da5e2 Mon Sep 17 00:00:00 2001
From: rhenck <richard.henck@iqb.hu-berlin.de>
Date: Fri, 23 Jul 2021 12:58:24 +0200
Subject: [PATCH] Add InputUIElement interface with required setting and
 warning message

Those have a required setting and warn message.
- Also refactor SurfaceElement to no longer inherit from UIElement as
this is not needed since we can have multiple inheritance for
interfaces.
---
 projects/common/unit.ts                       |  9 +++--
 .../properties/properties.component.html      | 12 +++++++
 projects/editor/src/app/model/UnitFactory.ts  | 33 ++++++++++++-------
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/projects/common/unit.ts b/projects/common/unit.ts
index 7c958e92f..e1c7db8d3 100644
--- a/projects/common/unit.ts
+++ b/projects/common/unit.ts
@@ -37,7 +37,12 @@ export interface TextUIElement extends UnitUIElement {
   underline: boolean;
 }
 
-export interface SurfaceUIElement extends UnitUIElement {
+export interface InputUIElement {
+  required: boolean;
+  validationWarnMessage: string;
+}
+
+export interface SurfaceUIElement {
   backgroundColor: string;
 }
 
@@ -54,7 +59,7 @@ export interface ButtonElement extends TextUIElement, SurfaceUIElement {
   label: string;
 }
 
-export interface TextFieldElement extends TextUIElement, SurfaceUIElement {
+export interface TextFieldElement extends TextUIElement, SurfaceUIElement, InputUIElement {
   label: string;
   value: string;
 }
diff --git a/projects/editor/src/app/components/unit-view/page-view/properties/properties.component.html b/projects/editor/src/app/components/unit-view/page-view/properties/properties.component.html
index 6bd4e6f1f..bb021abf5 100644
--- a/projects/editor/src/app/components/unit-view/page-view/properties/properties.component.html
+++ b/projects/editor/src/app/components/unit-view/page-view/properties/properties.component.html
@@ -52,6 +52,18 @@
           </mat-select>
         </mat-form-field>
 
+        <mat-checkbox *ngIf="combinedProperties.hasOwnProperty('required')"
+                      [checked]="$any(combinedProperties.required)"
+                      (change)="updateModel('required', $event.checked)">
+          Pflichtfeld
+        </mat-checkbox>
+
+        <mat-form-field *ngIf="combinedProperties.hasOwnProperty('validationWarnMessage')">
+          <mat-label>Warnmeldung</mat-label>
+          <input matInput type="text" [value]="combinedProperties.validationWarnMessage"
+                 (input)="updateModel('validationWarnMessage', $any($event.target).value)">
+        </mat-form-field>
+
         <mat-form-field disabled="true" *ngIf="combinedProperties.hasOwnProperty('options')">
           <div *ngIf="combinedProperties.options !== undefined">
             <mat-label>Optionen</mat-label>
diff --git a/projects/editor/src/app/model/UnitFactory.ts b/projects/editor/src/app/model/UnitFactory.ts
index 3fb1399e5..0f292f73c 100644
--- a/projects/editor/src/app/model/UnitFactory.ts
+++ b/projects/editor/src/app/model/UnitFactory.ts
@@ -3,7 +3,7 @@ import {
   CheckboxElement, CompoundElementCorrection, DropdownElement,
   ImageElement, TextElement, RadioButtonGroupElement, SurfaceUIElement,
   TextFieldElement, TextUIElement, Unit, UnitPage, UnitPageSection, UnitUIElement,
-  VideoElement
+  VideoElement, InputUIElement
 } from '../../../../common/unit';
 
 export function createUnit(): Unit {
@@ -55,10 +55,16 @@ export function createTextUIElement(type: string): TextUIElement {
   };
 }
 
-export function createSurfaceUIElement(type: string): SurfaceUIElement {
+export function createInputUIElement(): InputUIElement {
   return {
-    backgroundColor: 'lightgrey',
-    ...createUnitUIElement(type)
+    required: false,
+    validationWarnMessage: ''
+  };
+}
+
+export function createSurfaceUIElement(): SurfaceUIElement {
+  return {
+    backgroundColor: 'lightgrey'
   };
 }
 
@@ -66,7 +72,7 @@ export function createTextElement(): TextElement {
   return {
     text: 'Example Text',
     ...createTextUIElement('text'),
-    ...createSurfaceUIElement('text')
+    ...createSurfaceUIElement()
   };
 }
 
@@ -74,7 +80,7 @@ export function createButtonElement(): ButtonElement {
   return {
     label: 'Button Text',
     ...createTextUIElement('button'),
-    ...createSurfaceUIElement('button')
+    ...createSurfaceUIElement()
   };
 }
 
@@ -83,7 +89,8 @@ export function createTextfieldElement(): TextFieldElement {
     label: 'Example Label',
     value: '',
     ...createTextUIElement('text-field'),
-    ...createSurfaceUIElement('text-field')
+    ...createSurfaceUIElement(),
+    ...createInputUIElement()
   };
 }
 
@@ -93,7 +100,8 @@ export function createTextareaElement(): TextFieldElement {
     value: '',
     resizeEnabled: false,
     ...createTextUIElement('text-area'),
-    ...createSurfaceUIElement('text-area'),
+    ...createSurfaceUIElement(),
+    ...createInputUIElement(),
     height: 100
   };
 }
@@ -103,7 +111,8 @@ export function createCheckboxElement(): CheckboxElement {
     label: 'Label Checkbox',
     value: undefined,
     ...createTextUIElement('checkbox'),
-    ...createSurfaceUIElement('checkbox')
+    ...createSurfaceUIElement(),
+    ...createInputUIElement()
   };
 }
 
@@ -113,7 +122,8 @@ export function createDropdownElement(): DropdownElement {
     options: [],
     value: undefined,
     ...createTextUIElement('dropdown'),
-    ...createSurfaceUIElement('dropdown')
+    ...createSurfaceUIElement(),
+    ...createInputUIElement()
   };
 }
 
@@ -124,7 +134,8 @@ export function createRadioButtonGroupElement(): RadioButtonGroupElement {
     alignment: 'row',
     value: undefined,
     ...createTextUIElement('radio'),
-    ...createSurfaceUIElement('radio'),
+    ...createSurfaceUIElement(),
+    ...createInputUIElement(),
     height: 75
   };
 }
-- 
GitLab