La edición de celda de Primefaces se deja en modo de edición cuando falla la validación
Estoy usando p:dataTable
con edición de celda y validador en un p:selectOneMenu
con editable = true. Quiero que el estado de edición de la celda permanezca en modo de edición (segunda captura de pantalla) si el valor p: selectOneMenu seleccionado o el valor escrito no es válido y mostrar el cuadro rojo alrededor de la entrada como puedo hacerlo si uso un formulario normal (tercera captura de pantalla). Cuando falla la validación, se muestran el gruñido y los mensajes, pero el cuadro rojo alrededor del menú desplegable no persiste y me temo que el usuario puede pasar desapercibido (primera captura de pantalla). No puedo averiguar cómo hacer actualizaciones de ajax para mostrar el cuadro rojo, pero mantengo la celda en modo de edición para que el menú desplegable y el cuadro rojo sigan siendo 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>
En esta captura de pantalla intenté cambiar la cuenta a un favorito almacenado que se guardó con un espacio y ya no queremos espacios. (Sí, ahora tengo validación para no permitir un espacio cuando el usuario guarda sus números de cuenta favoritos, pero hay otras validaciones que implementaremos) Cuando la validación falla, solo se muestran el encabezado y el mensaje gruñido. La línea de salida roja no es visible hasta que vuelven a hacer clic en el menú desplegable como se muestra en la segunda captura de pantalla.



Respuestas
La ajax
llamada tenía la identificación de la tabla de datos table
en su update
atributo. Eliminé ese ClientID y eliminédisabled="#{facesContext.validationFailed}"
Creo que la cellEdit
función actualiza automáticamente el componente ClientId que está implementando cellEdit. Por lo tanto, no es necesario especificar explícitamente en mi etiqueta ajax.
Y también supongo que la etiqueta ajax siempre ejecuta la actualización, pero el oyente solo con éxito.
Puede que no entienda completamente por qué, pero esto es lo que funciona para mí:
<p:ajax update="growl messages" listener="#{bean.updateAccountInline(lineItem)}" />