La edición de celda de Primefaces se deja en modo de edición cuando falla la validación

Aug 17 2020

Estoy usando p:dataTablecon edición de celda y validador en un p:selectOneMenucon 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

jeff Sep 12 2020 at 01:31

La ajaxllamada tenía la identificación de la tabla de datos tableen su updateatributo. Eliminé ese ClientID y eliminédisabled="#{facesContext.validationFailed}"

Creo que la cellEditfunció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)}" />