From 9ee5558f9c1b7a382b2cc168bed8f077d0fb0701 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Tue, 30 Aug 2022 12:16:05 +0200
Subject: [PATCH] [player] Show validation errors of simple text fields

ViewEncapsulation.None is required for overriding tooltip
---
 .../text-field-simple.component.ts            | 22 ++++++++++++++-----
 projects/common/shared.module.ts              | 21 +++++++++++++-----
 2 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/projects/common/components/compound-elements/cloze/cloze-child-elements/text-field-simple.component.ts b/projects/common/components/compound-elements/cloze/cloze-child-elements/text-field-simple.component.ts
index 935c337b3..2fea5ea53 100644
--- a/projects/common/components/compound-elements/cloze/cloze-child-elements/text-field-simple.component.ts
+++ b/projects/common/components/compound-elements/cloze/cloze-child-elements/text-field-simple.component.ts
@@ -1,5 +1,5 @@
 import {
-  Component, EventEmitter, Input, Output
+  Component, EventEmitter, Input, Output, ViewEncapsulation
 } from '@angular/core';
 import { FormElementComponent } from 'common/directives/form-element-component.directive';
 import {
@@ -15,6 +15,10 @@ import {
            autocapitalize="none"
            autocorrect="off"
            spellcheck="false"
+           [class.text-field-simple-error]="elementFormControl.errors && elementFormControl.touched"
+           [matTooltip]="elementFormControl.errors && elementFormControl.touched ?
+                         (elementFormControl.errors | errorTransform: elementModel) : ''"
+           [matTooltipClass]="{'text-field-simple-error-tooltip': true}"
            [attr.inputmode]="elementModel.showSoftwareKeyboard ? 'none' : 'text'"
            [style.line-height.%]="elementModel.styling.lineHeight"
            [style.color]="elementModel.styling.fontColor"
@@ -31,11 +35,17 @@ import {
            (blur)="focusChanged.emit({ inputElement: input, focused: false })">
   `,
   styles: [
-    '.clozeChild {border: 1px solid rgba(0,0,0,.12); border-radius: 5px}',
-    'input {width: calc(100% - 2px); height: calc(100% - 2px); vertical-align: top; padding: 0;}',
-    'input:hover {border: 1px solid currentColor;}',
-    'input:focus {outline: 1px solid #3f51b5;}'
-  ]
+    'aspect-text-field-simple .clozeChild {border: 1px solid rgba(0,0,0,.12); border-radius: 5px}',
+    'aspect-text-field-simple input{width: calc(100% - 2px); height: calc(100% - 2px);}',
+    'aspect-text-field-simple input{vertical-align: top; padding: 0;}',
+    'aspect-text-field-simple input:hover {border: 1px solid currentColor;}',
+    'aspect-text-field-simple input:focus {outline: 1px solid #3f51b5;}',
+    '.text-field-simple-error {outline: 2px solid #f44336 !important;}',
+    '.text-field-simple-error:hover {border: 1px solid  #f44336;}',
+    '.text-field-simple-error-tooltip {border: 1px solid #f44336; margin-top: 8px !important;}',
+    '.text-field-simple-error-tooltip {background-color: white; color: #f44336 !important;}'
+  ],
+  encapsulation: ViewEncapsulation.None // Required for overriding tooltip
 })
 export class TextFieldSimpleComponent extends FormElementComponent {
   @Input() elementModel!: TextFieldSimpleElement;
diff --git a/projects/common/shared.module.ts b/projects/common/shared.module.ts
index 664adf4ea..54576116b 100644
--- a/projects/common/shared.module.ts
+++ b/projects/common/shared.module.ts
@@ -24,7 +24,9 @@ import { HttpClientModule } from '@angular/common/http';
 import { TextComponent } from './components/text/text.component';
 import { ButtonComponent } from './components/button/button.component';
 import { TextFieldComponent } from './components/input-elements/text-field.component';
-import { TextFieldSimpleComponent } from './components/compound-elements/cloze/cloze-child-elements/text-field-simple.component';
+import {
+  TextFieldSimpleComponent
+} from './components/compound-elements/cloze/cloze-child-elements/text-field-simple.component';
 import { TextAreaComponent } from './components/input-elements/text-area.component';
 import { CheckboxComponent } from './components/input-elements/checkbox.component';
 import { DropdownComponent } from './components/input-elements/dropdown.component';
@@ -38,18 +40,26 @@ import { ErrorTransformPipe } from './pipes/error-transform.pipe';
 import { SafeResourceHTMLPipe } from './pipes/safe-resource-html.pipe';
 import { MediaPlayerControlBarComponent }
   from './components/media-elements/media-player-control-bar/media-player-control-bar.component';
-import { MediaPlayerTimeFormatPipe } from './components/media-elements/media-player-control-bar/media-player-time-format.pipe';
+import {
+  MediaPlayerTimeFormatPipe
+} from './components/media-elements/media-player-control-bar/media-player-time-format.pipe';
 import { LikertComponent } from './components/compound-elements/likert/likert.component';
-import { LikertRadioButtonGroupComponent } from './components/compound-elements/likert/likert-radio-button-group.component';
+import {
+  LikertRadioButtonGroupComponent
+} 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 { 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';
-import { DropListSimpleComponent } from './components/compound-elements/cloze/cloze-child-elements/drop-list-simple.component';
+import {
+  DropListSimpleComponent
+} from './components/compound-elements/cloze/cloze-child-elements/drop-list-simple.component';
 import { FrameComponent } from './components/frame/frame.component';
-import { ToggleButtonComponent } from './components/compound-elements/cloze/cloze-child-elements/toggle-button.component';
+import {
+  ToggleButtonComponent
+} from './components/compound-elements/cloze/cloze-child-elements/toggle-button.component';
 import { TextMarkingBarComponent } from './components/text/text-marking-bar/text-marking-bar.component';
 import { StyleMarksPipe } from './pipes/styleMarks.pipe';
 import { TextMarkingButtonComponent } from './components/text/text-marking-bar/text-marking-button.component';
@@ -67,6 +77,7 @@ import { MarkListPipe } from './pipes/mark-list.pipe';
     MatCheckboxModule,
     ReactiveFormsModule,
     FormsModule,
+    MatTooltipModule,
     MatIconModule,
     MatFormFieldModule,
     MatInputModule,
-- 
GitLab