Buenas estoy realizando una aplicación web en JSF 2.2 utilizando Primefaces 5, en concreto estoy tratando de realizar un datatable donde el atributo required de un input debe ser true si la linea del datatable que lo contiene esta seleccionada, de momento lo he implementado de la siguiente forma:
<p:dataTable value="#{ventaController.venta.lineas}" id="data"
var="linea" selection="#{ventaController.albaran.lineas}"
rowKey="#{linea.id}">
<p:ajax event="rowSelectCheckbox" update="data" >
<p:ajax event="rowUnselectCheckbox" update="data" >
<p:ajax event="rowSelect" update="data" >
<p:ajax event="rowUnselect" update="data" >
<p:ajax event="toggleSelect" update="data" >
<p:column selectionMode="multiple" width="16" >
<p:column id="cantidadPen" headerText="C. pendiente">
<h:outputText style=" text-align:right;"
value="#{linea.cantidadPendiente}" >
</p:column>
<p:column id="cantidadEntr" headerText="Entregar">
<pe:inputNumber id="cantidadEntr"
required="#{ventaController.albaran.lineas.contains(linea)}"
value="#{linea.cantidadAEntregar}"
decimalSeparator="." thousandSeparator=","
maxValue="#{linea.cantidadPendiente}" >
</p:column>
</datatable>
Casi funciona pero tiene un bug que voy a tratar de explicar lo mejor posible.
Partimos de que una linea esta seleccionada y su input vacío, al estar seleccionada ese input tiene el atributo required=true, al deseleccionarla se dispara el siguiente evento:
<p:ajax event="rowUnselect" update="data" >
el cual actualiza el datatable, en este punto el atributo required del input debería cambiar a false al encontrarse la linea deseleccionada, de esto se encarga la siguiente expresion:
required="#{ventaController.albaran.lineas.contains(linea)}"
el problema es que al actualizar el datatable esta ocurriendo la validación del input tomando como true el valor del atributo required, es decir al actualizar esa seccion del DOM se esta realizando la validacion con el valor anterior, que era true, por lo que la validación falla y no permite enviar el formulario mientras que el input no sea rellenado.
No se si me he explicado muy bien, espero que se me haya entendido, si no se entiende comentarlo e intentaré aclararlo.
También añadir que la siguiente linea no me convence mucho ya que es una llamada al servidor con un coste computacional bastante elevado para algo tan sencillo como lo que busco, pero no se me ocurre otra forma mas simple de hacerlo, si a alguien se le ocurre una manera mas sencilla de hacerlo se lo agradecería mucho.
required="#{ventaController.albaran.lineas.contains(linea)}"
Un saludo