show error message returned by live validation

This commit is contained in:
Corentin Sechet 2023-04-17 18:06:35 +02:00
parent 1ead5f0631
commit 32517efece
2 changed files with 24 additions and 19 deletions

View File

@ -812,7 +812,7 @@ const LiveValidation = (function(){
break
}
}
return errorType
return [errorType, json.msg]
}
}
@ -836,29 +836,34 @@ const LiveValidation = (function(){
async toggleStatus(field) {
if (excludedField(field)) return
const attrError = hasAttrError(field);
const serverError = this.widget.dataset.supportsLiveValidation
? await hasServerError(this.name, field, field.form, this.checkUrl)
: false
const error = attrError ? attrError : serverError
// XXX: mais ici on aurait donc attrError qui serait une chaine de la
// forme missingValue (en cas de JS), et serverError qui serait un vrai
// texte.
if (error) {
this.showError(field, error)
} else {
this.removeError(field)
if(attrError) {
this.showError(field, attrError)
}
else {
const serverError = this.widget.dataset.supportsLiveValidation
? await hasServerError(this.name, field, field.form, this.checkUrl)
: false
if (serverError) {
const [error, overrideMsg] = serverError
this.showError(field, error, overrideMsg)
}
else {
this.removeError(field)
}
}
}
showError(field, error) {
if (this.hasError === error) return
showError(field, error, overrideMsg) {
this.widget.classList.add(this.errorClass)
// XXX: et ici on se trouve alors à chercher un élément sur base de
// 'error' qui ne correspond pas (c'est le message d'erreur, pas du
// texte), et dans ce cas le taf à faire est d'afficher ce message,
// pas celui qui serait dans un élément de la page.
const errorElMessage = document.getElementById(`error_${this.name}_${error}`).innerHTML
this.errorEl.innerHTML = errorElMessage
if(overrideMsg) {
const errorMessageContainer = this.errorEl.querySelector(`#error_${this.name}_${error}_message`)
errorMessageContainer.innerHTML = overrideMsg
// ou, si on on est sûr que errorElMessage ne contient qu'un p qui contient le message d'erreur :
// this.errorEl.children[0].innerHTML = overrideMsg
// ce qui permet d'enlever le id="error_${this.name}_${error}_message" dans widget.html : à ta guise
}
this.widget.appendChild(this.errorEl)
field.setAttribute("aria-invalid", "true")
field.setAttribute("aria-describedby", this.errorEl.id)

View File

@ -53,7 +53,7 @@
{% if widget.supports_live_validation and not widget.readonly %}
{% block widget-error-templates %}
{% for error_message in widget.get_error_messages %}
<template id="error_{{ widget.get_name_for_id }}_{{ error_message.camel_code }}"><p>{{ error_message.message }}</p></template>
<template id="error_{{ widget.get_name_for_id }}_{{ error_message.camel_code }}"><p id="error_{{ widget.get_name_for_id }}_{{ error_message.camel_code }}_message">{{ error_message.message }}</p></template>
{% endfor %}
{% endblock %}
{% endif %}