[{"data":1,"prerenderedAt":453},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Ferreurs-de-champs":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Ferreurs-de-champs":452},{"id":4,"title":5,"body":6,"description":439,"extension":440,"meta":441,"navigation":151,"path":448,"seo":449,"stem":450,"__hash__":451},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Ferreurs-de-champs.md","Erreurs de champ fournies par l'hôte",{"type":7,"value":8,"toc":433},"minimark",[9,13,22,27,52,55,59,70,350,384,388,408,412,419,429],[10,11,5],"h1",{"id":12},"erreurs-de-champ-fournies-par-lhôte",[14,15,16,17,21],"p",{},"Chaque contrôle de champ de l'interface accepte une propriété ",[18,19,20],"code",{},"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.",[23,24,26],"h2",{"id":25},"passer-une-erreur-à-un-contrôle","Passer une erreur à un contrôle",[14,28,29,30,32,33,36,37,39,40,43,44,47,48,51],{},"Un contrôle reçoit ",[18,31,20],{},", 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 ",[18,34,35],{},"field.reqd",". Les champs Code, JSON, Éditeur Markdown et Éditeur HTML n'ont pas d'atome acceptant ",[18,38,20],{}," : ils l'affichent avec le composant ",[18,41,42],{},"ErrorMessage"," de frappe-ui, masquent leur description pendant l'affichage de l'erreur et relient l'éditeur au message (",[18,45,46],{},"aria-describedby"," vers le message, ",[18,49,50],{},"aria-invalid=\"true\"",").",[14,53,54],{},"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.",[23,56,58],{"id":57},"fournir-les-erreurs-depuis-lhôte","Fournir les erreurs depuis l'hôte",[14,60,61,62,65,66,69],{},"L'application hôte détient une carte réactive des erreurs et la fournit par la clé d'injection ",[18,63,64],{},"FieldErrorsKey",". Les clés sont construites avec ",[18,67,68],{},"fieldErrorKey"," :",[71,72,77],"pre",{"className":73,"code":74,"language":75,"meta":76,"style":76},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { FieldErrorsKey, fieldErrorKey } from \"@framework\u002Fui\u002Ffields\";\nimport type { FieldError } from \"@framework\u002Fui\u002Ffields\";\n\nconst errors = ref\u003CRecord\u003Cstring, FieldError>>({});\nprovide(FieldErrorsKey, errors);\n\nerrors.value = {\n    [fieldErrorKey(\"customer\")]: \"Le client est obligatoire\",\n    [fieldErrorKey({ parentfield: \"items\", key: \"name:row-1\", fieldname: \"qty\" })]:\n        \"La quantité doit être positive\",\n};\n","ts","",[18,78,79,121,146,153,200,216,221,238,272,331,344],{"__ignoreMap":76},[80,81,84,88,92,96,99,102,105,108,111,115,118],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"s7zQu","import",[80,89,91],{"class":90},"sMK4o"," {",[80,93,95],{"class":94},"sTEyZ"," FieldErrorsKey",[80,97,98],{"class":90},",",[80,100,101],{"class":94}," fieldErrorKey",[80,103,104],{"class":90}," }",[80,106,107],{"class":86}," from",[80,109,110],{"class":90}," \"",[80,112,114],{"class":113},"sfazB","@framework\u002Fui\u002Ffields",[80,116,117],{"class":90},"\"",[80,119,120],{"class":90},";\n",[80,122,124,126,129,131,134,136,138,140,142,144],{"class":82,"line":123},2,[80,125,87],{"class":86},[80,127,128],{"class":86}," type",[80,130,91],{"class":90},[80,132,133],{"class":94}," FieldError",[80,135,104],{"class":90},[80,137,107],{"class":86},[80,139,110],{"class":90},[80,141,114],{"class":113},[80,143,117],{"class":90},[80,145,120],{"class":90},[80,147,149],{"class":82,"line":148},3,[80,150,152],{"emptyLinePlaceholder":151},true,"\n",[80,154,156,160,163,166,170,173,177,179,182,184,186,189,192,195,198],{"class":82,"line":155},4,[80,157,159],{"class":158},"spNyl","const",[80,161,162],{"class":94}," errors ",[80,164,165],{"class":90},"=",[80,167,169],{"class":168},"s2Zo4"," ref",[80,171,172],{"class":90},"\u003C",[80,174,176],{"class":175},"sBMFI","Record",[80,178,172],{"class":90},[80,180,181],{"class":175},"string",[80,183,98],{"class":90},[80,185,133],{"class":175},[80,187,188],{"class":90},">>",[80,190,191],{"class":94},"(",[80,193,194],{"class":90},"{}",[80,196,197],{"class":94},")",[80,199,120],{"class":90},[80,201,203,206,209,211,214],{"class":82,"line":202},5,[80,204,205],{"class":168},"provide",[80,207,208],{"class":94},"(FieldErrorsKey",[80,210,98],{"class":90},[80,212,213],{"class":94}," errors)",[80,215,120],{"class":90},[80,217,219],{"class":82,"line":218},6,[80,220,152],{"emptyLinePlaceholder":151},[80,222,224,227,230,233,235],{"class":82,"line":223},7,[80,225,226],{"class":94},"errors",[80,228,229],{"class":90},".",[80,231,232],{"class":94},"value ",[80,234,165],{"class":90},[80,236,237],{"class":90}," {\n",[80,239,241,245,247,249,251,254,256,259,262,264,267,269],{"class":82,"line":240},8,[80,242,244],{"class":243},"swJcz","    [",[80,246,68],{"class":168},[80,248,191],{"class":243},[80,250,117],{"class":90},[80,252,253],{"class":243},"customer",[80,255,117],{"class":90},[80,257,258],{"class":243},")]",[80,260,261],{"class":90},":",[80,263,110],{"class":90},[80,265,266],{"class":113},"Le client est obligatoire",[80,268,117],{"class":90},[80,270,271],{"class":90},",\n",[80,273,275,277,279,281,284,287,289,291,294,296,298,301,303,305,308,310,312,315,317,319,322,324,326,328],{"class":82,"line":274},9,[80,276,244],{"class":243},[80,278,68],{"class":168},[80,280,191],{"class":243},[80,282,283],{"class":90},"{",[80,285,286],{"class":243}," parentfield",[80,288,261],{"class":90},[80,290,110],{"class":90},[80,292,293],{"class":243},"items",[80,295,117],{"class":90},[80,297,98],{"class":90},[80,299,300],{"class":243}," key",[80,302,261],{"class":90},[80,304,110],{"class":90},[80,306,307],{"class":243},"name:row-1",[80,309,117],{"class":90},[80,311,98],{"class":90},[80,313,314],{"class":243}," fieldname",[80,316,261],{"class":90},[80,318,110],{"class":90},[80,320,321],{"class":243},"qty",[80,323,117],{"class":90},[80,325,104],{"class":90},[80,327,258],{"class":243},[80,329,330],{"class":90},":\n",[80,332,334,337,340,342],{"class":82,"line":333},10,[80,335,336],{"class":90},"        \"",[80,338,339],{"class":113},"La quantité doit être positive",[80,341,117],{"class":90},[80,343,271],{"class":90},[80,345,347],{"class":82,"line":346},11,[80,348,349],{"class":90},"};\n",[351,352,353,360,374,381],"ul",{},[354,355,356,357,229],"li",{},"L'adresse d'un champ du formulaire est son ",[18,358,359],{},"fieldname",[354,361,362,363,366,367,370,371,51],{},"L'adresse d'une cellule de ligne enfant est un objet ",[18,364,365],{},"{ parentfield, key, fieldname }"," ; ",[18,368,369],{},"key"," est la clé de ligne déjà transmise par le canal de commit (",[18,372,373],{},"RowAddress.key",[354,375,376,377,380],{},"Un hôte sans formulaire — un filtre, une boîte de dialogue ouverte dans un formulaire — fournit ",[18,378,379],{},"null"," : rien n'est affiché.",[354,382,383],{},"La carte est réactive : retirer une erreur efface le message sous le champ.",[23,385,387],{"id":386},"grille-et-lignes-enfant","Grille et lignes enfant",[351,389,390,396,403],{},[354,391,392,393,395],{},"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 ",[18,394,20],{}," au contrôle, pour ne pas agrandir la ligne.",[354,397,398,399,402],{},"Une cellule dont le champ est masqué (",[18,400,401],{},"hidden",") n'affiche pas d'erreur.",[354,404,405,406,229],{},"La boîte de dialogue d'édition d'une ligne transmet à chaque champ les erreurs de la ligne ouverte, adressées par leur ",[18,407,359],{},[23,409,411],{"id":410},"une-erreur-nempêche-pas-lenregistrement","Une erreur n'empêche pas l'enregistrement",[14,413,414,415,418],{},"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 ",[18,416,417],{},"depends_on"," masque désormais. Dans les deux cas, le lecteur ne peut pas enregistrer et n'a rien à cliquer pour corriger.",[14,420,421,422,425,426,428],{},"Seul un contrôle exécuté à l'enregistrement refuse une sauvegarde : la vérification des champs obligatoires, ou un ",[18,423,424],{},"beforeSave"," qui lève une exception. Un script qui doit refuser un enregistrement lève donc une exception depuis ",[18,427,424],{}," ; l'hôte qui signale le champ renseigne aussi son erreur avant de lever l'exception.",[430,431,432],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":76,"searchDepth":83,"depth":123,"links":434},[435,436,437,438],{"id":25,"depth":123,"text":26},{"id":57,"depth":123,"text":58},{"id":386,"depth":123,"text":387},{"id":410,"depth":123,"text":411},"Comment afficher sous un champ les erreurs transmises par l'application hôte, y compris dans les cellules d'une grille et la boîte de dialogue d'édition de ligne.","md",{"reviewed":151,"last_verified":442,"sources":443},"2026-11-03",[444,445,446,447],"dodock@develop:ui\u002Fsrc\u002Fcomponents\u002FFields\u002Ftypes.ts","dodock@develop:ui\u002Fsrc\u002Fcomponents\u002FFields\u002Findex.ts","dodock@develop:ui\u002Fsrc\u002Fcomponents\u002FFields\u002FTableField.vue","dodock@develop:ui\u002Fsrc\u002Fcomponents\u002FFields\u002FCodeEditorField.vue","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Ferreurs-de-champs",{"title":5,"description":439},"2.next\u002F3.dodock\u002F10.developpeurs\u002Ferreurs-de-champs","NYBqAMPZsQoXS2lrgNVVyu8NiidPwHdrfarrTDVy_bs",{},1793871743918]