Implement error handling for the create qualification form #19

Merged
ptran merged 9 commits from feature/validation into main 2025-01-08 10:31:38 +00:00
2 changed files with 89 additions and 35 deletions

View File

@ -1,5 +1,24 @@
<h2 mat-dialog-title>Create Qualification</h2>
<mat-dialog-content>
<form [formGroup]="qualificationForm" (ngSubmit)="create()">
<label for="skill-input">Skill</label>
<input id="skill-input" type="text" formControlName="skill">
<button type="submit">create</button>
<div class="!space-y-4">
@if (apiErrorMessage) {
<mat-error>{{ apiErrorMessage }}</mat-error>
}
<mat-form-field class="!w-full">
<mat-label>Skill</mat-label>
<input matInput
formControlName="skill"
required>
<mat-error *ngIf="isFieldInvalid('skill')">
{{ getErrorMessage('skill') }}
</mat-error>
</mat-form-field>
<mat-dialog-actions align="end">
<button mat-flat-button color="primary" type="submit">Create</button>
</mat-dialog-actions>
</div>
</form>
</mat-dialog-content>

View File

@ -1,14 +1,26 @@
import {Component, inject} from '@angular/core';
import {FormBuilder, ReactiveFormsModule} from "@angular/forms";
import EmployeeApiService from "../services/employee-api.service";
import {FormBuilder, ReactiveFormsModule, Validators} from "@angular/forms";
import QualificationService from "../services/qualification.service";
import {Router} from "@angular/router";
import {MatDialogRef} from "@angular/material/dialog";
import {MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle} from "@angular/material/dialog";
import {NgIf} from "@angular/common";
import {MatError, MatFormField, MatLabel} from "@angular/material/form-field";
import {MatButton} from "@angular/material/button";
import {MatInput} from "@angular/material/input";
import {filter} from "rxjs";
@Component({
selector: 'app-create-qualification',
imports: [
ReactiveFormsModule
ReactiveFormsModule,
MatError,
NgIf,
MatLabel,
MatDialogTitle,
MatDialogContent,
MatFormField,
MatDialogActions,
MatButton,
MatInput
],
templateUrl: './create-qualification.component.html',
styleUrl: './create-qualification.component.css'
@ -18,24 +30,47 @@ export class CreateQualificationComponent {
private qualificationService: QualificationService = inject(QualificationService);
private dialogRef: MatDialogRef<CreateQualificationComponent> = inject(MatDialogRef);
public apiErrorMessage: string = '';
qualificationForm = this.formBuilder.group({
'skill': [''],
'skill': ['', Validators.required],
});
isFieldInvalid(fieldName: string): boolean {
const field = this.qualificationForm.get(fieldName);
if (!field) {
throw new Error('Form field does not exist: ' + fieldName)
}
return field.invalid && (field.dirty || field.touched);
}
getErrorMessage(fieldName: string): string {
const field = this.qualificationForm.get(fieldName);
if (field?.errors?.['required']) {
return 'This field is required';
}
return '';
}
create() {
if (this.qualificationForm.valid) {
if (!this.qualificationForm.valid) {
console.error('Validation failed');
return;
}
this.qualificationService.create(this.qualificationForm.value).subscribe({
next: (createdQualification) => {
this.dialogRef.close(createdQualification);
},
error: (error) => {
console.error('Error creating qualification:', error);
this.apiErrorMessage = 'API Error';
}
});
}
}
cancel() {
this.dialogRef.close();
}
}