Erreurs de champ fournies par l'hôte
Erreurs de champ fournies par l'hôte
Chaque contrôle de champ de l'interface accepte une propriété error et affiche le message sous sa saisie. Une erreur de champ est purement visuelle : elle n'empêche jamais l'enregistrement d'un document.
Passer une erreur à un contrôle
Un contrôle reçoit error, une chaîne ou un tableau de chaînes, et la transmet à son atome d'interface, de la même façon qu'il transmet field.reqd. Les champs Code, JSON, Éditeur Markdown et Éditeur HTML n'ont pas d'atome acceptant error : ils l'affichent avec le composant ErrorMessage de frappe-ui, masquent leur description pendant l'affichage de l'erreur et relient l'éditeur au message (aria-describedby vers le message, aria-invalid="true").
Un contrôle ne définit jamais d'erreur lui-même : seul l'hôte en fournit. Les champs sans valeur (Button, Heading, HTML, Image) acceptent la propriété mais n'affichent rien.
Fournir les erreurs depuis l'hôte
L'application hôte détient une carte réactive des erreurs et la fournit par la clé d'injection FieldErrorsKey. Les clés sont construites avec fieldErrorKey :
import { FieldErrorsKey, fieldErrorKey } from "@framework/ui/fields";
import type { FieldError } from "@framework/ui/fields";
const errors = ref<Record<string, FieldError>>({});
provide(FieldErrorsKey, errors);
errors.value = {
[fieldErrorKey("customer")]: "Le client est obligatoire",
[fieldErrorKey({ parentfield: "items", key: "name:row-1", fieldname: "qty" })]:
"La quantité doit être positive",
};
- L'adresse d'un champ du formulaire est son
fieldname. - L'adresse d'une cellule de ligne enfant est un objet
{ parentfield, key, fieldname };keyest la clé de ligne déjà transmise par le canal de commit (RowAddress.key). - Un hôte sans formulaire — un filtre, une boîte de dialogue ouverte dans un formulaire — fournit
null: rien n'est affiché. - La carte est réactive : retirer une erreur efface le message sous le champ.
Grille et lignes enfant
- Une cellule de grille en erreur dessine un anneau rouge autour de la cellule et affiche le message dans une infobulle, y compris dans une grille en lecture seule. L'anneau reste visible quand la cellule contient le focus. La cellule ne transmet pas
errorau contrôle, pour ne pas agrandir la ligne. - Une cellule dont le champ est masqué (
hidden) n'affiche pas d'erreur. - La boîte de dialogue d'édition d'une ligne transmet à chaque champ les erreurs de la ligne ouverte, adressées par leur
fieldname.
Une erreur n'empêche pas l'enregistrement
Une erreur affichée peut devenir obsolète : une erreur serveur reste après la modification d'un champ lié, une erreur de script reste sur un champ que depends_on masque désormais. Dans les deux cas, le lecteur ne peut pas enregistrer et n'a rien à cliquer pour corriger.
Seul un contrôle exécuté à l'enregistrement refuse une sauvegarde : la vérification des champs obligatoires, ou un beforeSave qui lève une exception. Un script qui doit refuser un enregistrement lève donc une exception depuis beforeSave ; l'hôte qui signale le champ renseigne aussi son erreur avant de lever l'exception.