La modification de la cellule Primefaces laisse en mode édition lorsque la validation échoue
J'utilise p:dataTable
avec l'édition de cellules et le validateur sur un p:selectOneMenu
avec editable = true. Je veux que l'état d'édition de la cellule reste en mode édition (deuxième capture d'écran) si la valeur p: selectOneMenu sélectionnée ou la valeur saisie n'est pas valide et affiche la boîte rouge autour de l'entrée comme je peux si j'utilise une forme régulière (troisième capture d'écran). Lorsque la validation échoue, le grognement et les messages sont affichés mais la boîte rouge autour de la liste déroulante ne persiste pas et j'ai peur que l'utilisateur ne passe inaperçu (première capture d'écran). Je ne peux pas comprendre comment faire des mises à jour ajax pour afficher la boîte rouge, mais gardez la cellule en mode édition afin que la liste déroulante et la boîte rouge soient toujours visibles.
<p:dataTable id="table" value="#{bean.data}" var="lineItem" editable="true" editMode="cell">
<p:column headerText="* Account">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{lineItem.account}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="so" value="#{lineItem.account}" editable="true" dynamic="true" converter="omnifaces.SelectItemsConverter" title="Type an account or select a stored favorite" validator="com.gdeb.rozycki.app.acountValidator" >
<f:selectItem noSelectionOption="true" itemLabel="---Favorites" itemValue="null" />
<f:selectItems value="#{bean.favorites}" var="fav" itemLabel="#{fav.acctNum}" itemValue="#{fav}" />
<p:ajax disabled="#{facesContext.validationFailed}" update="table growl messages" listener="#{bean.updateAccountInline(lineItem)}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
Cette capture d'écran, j'ai essayé de changer le compte en un favori stocké qui a été enregistré avec un espace et nous ne voulons plus d'espaces. (Oui, j'ai maintenant la validation pour ne pas autoriser un espace lorsque l'utilisateur enregistre ses numéros de compte préférés, mais il y a d'autres validations que nous allons implémenter) Lorsque la validation échoue, seuls l'en-tête et le message de grognement s'affichent. La ligne rouge n'est pas visible jusqu'à ce qu'ils cliquent à nouveau sur la liste déroulante comme le montre la deuxième capture d'écran.
Réponses
L' ajax
appel avait l'ID datatable table
dans son update
attribut. J'ai supprimé ce ClientID et supprimédisabled="#{facesContext.validationFailed}"
Je pense que la cellEdit
fonction met automatiquement à jour le composant ClientId qui implémente le cellEdit. Donc pas besoin de spécifier aussi explicitement dans ma balise ajax.
Et je suppose également que la balise ajax exécute toujours la mise à jour, mais l'auditeur uniquement avec un succès.
Je ne comprends peut-être pas complètement pourquoi mais c'est ce qui fonctionne pour moi:
<p:ajax update="growl messages" listener="#{bean.updateAccountInline(lineItem)}" />