From abc20bc9e831fb7b037b8d4e710c749de523f9b8 Mon Sep 17 00:00:00 2001 From: z3n Date: Tue, 9 Jun 2026 13:17:18 +0000 Subject: [PATCH] fix(forms): erreurs de validation par champ au blur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Erreurs affichées sous chaque champ obligatoire (fr-error-text DSFR) au lieu d'un message global en haut du formulaire - Déclenchement sur blur (sortie du champ) et effacement sur input - Concerne la modale édition API et la modale catégorie Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- .../pages/api-detail/api-detail.component.ts | 25 +++++++++++++------ .../src/app/pages/browse/browse.component.ts | 14 ++++++++--- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/front-public/src/app/pages/api-detail/api-detail.component.ts b/front-public/src/app/pages/api-detail/api-detail.component.ts index a78d279..d5d9a72 100644 --- a/front-public/src/app/pages/api-detail/api-detail.component.ts +++ b/front-public/src/app/pages/api-detail/api-detail.component.ts @@ -242,13 +242,19 @@ import { ApiEntry, Category } from '@datacat/shared'; @if (editError()) {

{{ editError() }}

} -
+
- + + @if (editTitleError()) {

Le titre est obligatoire.

}
-
+
- + + @if (editVersionError()) {

La version est obligatoire.

}
@@ -315,6 +321,8 @@ export class ApiDetailComponent implements OnInit, OnDestroy { showEditModal = signal(false); editLoading = signal(false); editError = signal(null); + editTitleError = signal(false); + editVersionError = signal(false); categories = signal([]); editTitle = signal(''); editVersion = signal(''); @@ -365,6 +373,8 @@ export class ApiDetailComponent implements OnInit, OnDestroy { this.editContactTechnical.set(entry.contactTechnical ?? ''); this.editAccessRights.set(entry.accessRights ?? ''); this.editError.set(null); + this.editTitleError.set(false); + this.editVersionError.set(false); this.categoryService.list().subscribe((res) => this.categories.set(res.items)); this.showEditModal.set(true); } @@ -374,10 +384,9 @@ export class ApiDetailComponent implements OnInit, OnDestroy { } submitEdit() { - if (!this.editTitle().trim() || !this.editVersion().trim()) { - this.editError.set('Le titre et la version sont obligatoires.'); - return; - } + this.editTitleError.set(!this.editTitle().trim()); + this.editVersionError.set(!this.editVersion().trim()); + if (!this.editTitle().trim() || !this.editVersion().trim()) return; this.editLoading.set(true); this.apiService.update(this.id, { title: this.editTitle().trim(), diff --git a/front-public/src/app/pages/browse/browse.component.ts b/front-public/src/app/pages/browse/browse.component.ts index 7fb4166..298aa05 100644 --- a/front-public/src/app/pages/browse/browse.component.ts +++ b/front-public/src/app/pages/browse/browse.component.ts @@ -246,13 +246,15 @@ import { forkJoin } from 'rxjs';

{{ formError() }}

} -
+
- + (input)="formName.set($any($event.target).value); formNameError.set(false)" + (blur)="formNameError.set(!formName().trim())" /> + @if (formNameError()) {

Le nom est obligatoire.

}