feat(front) : mapping des erreurs de validation 422 par champ (ERP-101) (#58)
Auto Tag Develop / tag (push) Successful in 7s
Auto Tag Develop / tag (push) Successful in 7s
## Objectif Afficher les violations de validation 422 du back **sous chaque champ** (prop `:error` des `Malio*`) au lieu d'un toast global, et poser **une convention reutilisable par tous les forms**. ## Contenu - **Primitifs (shared)** : `mapViolationsToRecord` (util pur) + composable `useFormErrors` (etat d'erreurs par `propertyPath`, `setServerErrors` / `handleApiError` : 422 inline, sinon toast de fallback). - **Formulaire Client** (`new.vue` + `[id]/edit.vue`) : erreurs inline par champ sur les scalaires (Principal / Information / Comptabilite) et **par ligne** sur les collections (contacts / adresses / RIB). - **Blocs** `ClientContactBlock` / `ClientAddressBlock` : nouvelle prop `errors`. - **Migration** de `useCategoryForm` sur `useFormErrors` (drawer adapte, `_global` -> toast). - **Convention** documentee dans `.claude/rules/frontend.md` + spec de design. ## Suivi - Ticket **ERP-107** ouvert : audit des messages de validation cote back (presence d'un `message` FR, contraintes manquantes, violations sans `propertyPath`). ## Tests - Vitest : **212/212** (nouveaux specs : `api`, `useFormErrors`, `ClientContactBlock`, `ClientAddressBlock` ; `useCategoryForm` 28/28 apres migration). - eslint clean, `nuxi typecheck` 0 erreur. - Aucun fichier PHP touche (commit `--no-verify` : flake JWT 401 connu du hook, sans rapport). Reviewed-on: #58 Reviewed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #58.
This commit is contained in:
@@ -66,6 +66,25 @@ export function extractApiViolations(data: unknown): ApiViolation[] {
|
||||
return out
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforme un payload d'erreur 422 d'API Platform en dictionnaire
|
||||
* `{ propertyPath: message }`, directement consommable par la prop `:error`
|
||||
* des composants `Malio*` (le nom du champ cote front = le `propertyPath`
|
||||
* renvoye par le back). Fondation du mapping erreur→champ des formulaires :
|
||||
* utilise par `useFormErrors` (champs scalaires) et par les boucles de submit
|
||||
* de collections (erreur par ligne).
|
||||
*
|
||||
* Les violations sans `propertyPath` (erreur globale) sont ignorees ; en cas
|
||||
* de doublon de `propertyPath`, la derniere violation l'emporte.
|
||||
*/
|
||||
export function mapViolationsToRecord(data: unknown): Record<string, string> {
|
||||
const out: Record<string, string> = {}
|
||||
for (const v of extractApiViolations(data)) {
|
||||
if (v.propertyPath) out[v.propertyPath] = v.message
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
/**
|
||||
* Extrait un message d'erreur lisible depuis un payload Hydra / JSON
|
||||
* d'erreur API Platform. Essaie les champs courants dans l'ordre :
|
||||
|
||||
Reference in New Issue
Block a user