From f6706390a6946d7f23f0637a3ecaa5667933f0f6 Mon Sep 17 00:00:00 2001
From: sebo <sebastian.bergandy@external.mgm-cp.com>
Date: Sat, 22 Feb 2025 12:45:44 +0100
Subject: [PATCH] Fix change detection on validation

---
 .../lib/form/formcontrol-editor.abstract.component.ts | 11 ++++++++---
 .../validation-error/validation-error.component.html  |  4 ++--
 .../ui/validation-error/validation-error.component.ts |  9 +++++----
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts b/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts
index 1227c464e9..0e77b51c10 100644
--- a/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts
+++ b/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts
@@ -33,6 +33,7 @@ export abstract class FormControlEditorAbstractComponent implements ControlValue
   readonly fieldControl: UntypedFormControl = new UntypedFormControl();
   public onChange = (text: string | Date) => undefined;
   public onTouched = () => undefined;
+  public invalidParams: InvalidParam[] = [];
 
   private changesSubscr: Subscription;
   private statusSubscr: Subscription;
@@ -81,12 +82,16 @@ export abstract class FormControlEditorAbstractComponent implements ControlValue
   setErrors(): void {
     if (this.control) {
       this.fieldControl.setErrors(this.control.errors);
-      if (this.control.invalid) this.fieldControl.markAsTouched();
+      if (this.control.invalid) {
+        this._updateInvalidParams();
+        this.fieldControl.markAsTouched();
+      }
     }
   }
 
-  get invalidParams(): InvalidParam[] {
-    return this.fieldControl.errors ?
+  _updateInvalidParams(): void {
+    this.invalidParams =
+      this.fieldControl.errors ?
         Object.keys(this.fieldControl.errors).map((key) => <InvalidParam>this.fieldControl.errors[key])
       : [];
   }
diff --git a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
index 673ecf065e..edc6820dfa 100644
--- a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
+++ b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.html
@@ -23,6 +23,6 @@ Die sprachspezifischen Genehmigungen und Beschränkungen
 unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-@for (invalidParam of invalidParams; track invalidParam) {
-  <span>{{ message(invalidParam) }}</span>
+@for (validationMessage of validationMessages; track validationMessage) {
+  <span>{{ validationMessage }}</span>
 }
diff --git a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
index eae4c1e994..3b2b26490f 100644
--- a/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
+++ b/alfa-client/libs/ui/src/lib/ui/validation-error/validation-error.component.ts
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { InvalidParam, getMessageForInvalidParam } from '@alfa-client/tech-shared';
+import { getMessageForInvalidParam, InvalidParam } from '@alfa-client/tech-shared';
 import { Component, Input } from '@angular/core';
 
 @Component({
@@ -32,9 +32,10 @@ import { Component, Input } from '@angular/core';
 })
 export class ValidationErrorComponent {
   @Input() label: string;
-  @Input() invalidParams: InvalidParam[];
 
-  public message(invalidParam: InvalidParam): string {
-    return getMessageForInvalidParam(this.label, invalidParam);
+  @Input() set invalidParams(value: InvalidParam[]) {
+    this.validationMessages = value.map((invalidParam: InvalidParam) => getMessageForInvalidParam(this.label, invalidParam));
   }
+
+  public validationMessages: string[] = [];
 }
-- 
GitLab