From 2503c3300580ea1b25f194ad73da9c315dab90dd Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Tue, 17 Dec 2024 08:53:49 +0100 Subject: [PATCH] error messages kinda --- .../hotel/component/edit-hotel.component.ts | 35 ++++++++++++++++--- .../hotel/component/error-msg.component.ts | 32 +++++++++++++++++ src/index.html | 1 - 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 src/app/hotel/component/error-msg.component.ts diff --git a/src/app/hotel/component/edit-hotel.component.ts b/src/app/hotel/component/edit-hotel.component.ts index 1c71ff6..2ef326d 100644 --- a/src/app/hotel/component/edit-hotel.component.ts +++ b/src/app/hotel/component/edit-hotel.component.ts @@ -11,6 +11,8 @@ import { import {Hotel} from "../model/hotel"; import {RouterLink} from "@angular/router"; import {NgForOf} from "@angular/common"; +import {debounceTime} from "rxjs"; +import {ErrorMsgComponent} from "./error-msg.component"; @Component({ selector: 'app-edit-hotel', @@ -20,24 +22,29 @@ import {NgForOf} from "@angular/common"; ReactiveFormsModule, RouterLink, NgForOf, + ErrorMsgComponent, ], template: `
+

+

+

+

@@ -46,6 +53,7 @@ import {NgForOf} from "@angular/common"; +

@@ -56,6 +64,8 @@ import {NgForOf} from "@angular/common"; `, }) export class EditHotelComponent implements OnInit { + errorMsgs: Record = {}; + @Input() hotel: Hotel | null = null; @@ -64,6 +74,12 @@ export class EditHotelComponent implements OnInit { form!: FormGroup + validationErrors: Record = { + required: 'This field is required', + min: 'Value must be greater than or equal to 0', + max: 'Value must be less than or equal to 5' + }; + ngOnInit(): void { const tags = []; @@ -78,15 +94,20 @@ export class EditHotelComponent implements OnInit { rating: new FormControl(this.hotel?.rating, [Validators.required, Validators.min(0), Validators.max(5)]), tags: new FormArray(tags), }) + + Object.keys(this.form.controls).forEach(controlName => { + const control = this.form.get(controlName); + if (!control) { + return; + } + + control?.valueChanges?.pipe(debounceTime(1000)).subscribe(() => {this.setErrorMessage(controlName, control)}); + }); } submit() { if (!this.form.valid) { - console.error('Form invalid: '); - for (const key in this.form.controls) { - console.error(key, this.form.controls[key].errors); - } - return; + } const hotel: Hotel = { @@ -115,4 +136,8 @@ export class EditHotelComponent implements OnInit { deleteTag(tagElement: AbstractControl) { this.getTags().removeAt(this.getTags().controls.indexOf(tagElement)); } + + setErrorMessage(controlName: string, control: AbstractControl) { + this.errorMsgs[controlName] = Object.keys(control.errors ?? {}).map ((key) => this.validationErrors[key]).join(' '); + } } diff --git a/src/app/hotel/component/error-msg.component.ts b/src/app/hotel/component/error-msg.component.ts new file mode 100644 index 0000000..37df8e2 --- /dev/null +++ b/src/app/hotel/component/error-msg.component.ts @@ -0,0 +1,32 @@ +import {Component, Input} from "@angular/core"; +import {NgIf} from "@angular/common"; + + +@Component({ + standalone: true, + selector: 'app-error-msg', + imports: [ + NgIf + ], + template: ` +
+ {{ msg }} +
+ `, + styles: ` + .alert { + color: white; + background-color: red; + border-radius: 4px; + padding: 4px; + } + + .alert-danger { + background-color: red; + } + ` +}) +export class ErrorMsgComponent { + @Input() + msg: string | null = null; +} diff --git a/src/index.html b/src/index.html index 808857f..b51fcb5 100644 --- a/src/index.html +++ b/src/index.html @@ -8,7 +8,6 @@ -