function configuraSeleccionMultiple(tabla) {
try {
// Permite ocultar la casilla de selección total de la cabecera
$("th[id$='"+ tabla + ":seleccionColumn']").children("div.ui-chkbox").hide();
$("input[id$='disableSelect']").each(function() {
// Permite comprobar si una fila es seleccionable
if ($(this).val() === "true") {
// Si no seleccionable, desactivamos el comportamiento por defecto
var tdPadre = $(this).parent(),
checkBox = $(tdPadre).children("div.ui-chkbox"),
checkBoxChildren = $(checkBox).children("div.ui-chkbox-box"),
trPadre = $(tdPadre).parent("tr.ui-datatable-selectable");
$(trPadre).removeClass("ui-datatable-selectable");
$(checkBox).removeClass("ui-state-active");
$(checkBox).addClass("ui-state-disabled");
// Remove the event from the link
checkBox.onclick = null;
// Add a check in for the class disabled
$(checkBox).click(function(e) {
if ($(checkBox).hasClass('ui-state-disabled')) {
e.stopImmediatePropagation();
e.preventDefault();
}
});
$(checkBox).onmouseover = null;
$(checkBox).mouseover(function(e) {
if ($(checkBox).hasClass('ui-state-disabled')) {
e.stopImmediatePropagation();
e.preventDefault();
}
});
$(checkBoxChildren).addClass("ui-state-hover");
checkBoxChildren.onmouseover = null;
$(checkBoxChildren).mouseover(function(e) {
e.stopImmediatePropagation();
e.preventDefault();
$(checkBoxChildren).addClass("ui-state-hover");
});
}
});
} catch (e) {}
}
===== Código JSF =====
En la página, cargamos el fichero Javascript en la cabecera de la página, de la siguiente manera:
...
El Javascript, permite ocultar el //checkbox// de selección global y desactivar la selección de las filas. Para eso, tenemos que pasarle el //id// del componente JSF //
#{messages['label.header.listaServiciosNoPagados']}
En total hay #{servicioPendientePagoBean.model.rowCount} servicios pendientes de envío a Pagos
En la definición de la tabla tenemos las siguientes propiedades referentes a la selección de filas:
* **//id//** es el //id// del componente JSF, en este caso el valor es //listaTable//.
* **//selection//** donde se almacenan los elementos seleccionados, es un //get/set//.
* **//rowKey//** es el valor que representa la clave, que permite diferenciar los elementos seleccionados.
* **//rowSelectMode//** indica que la selección/deselección solo se puede realizar si se hace //click// en el //checkbox//. Deshabliitando la selección selección/deselección cuando se hace //click// en la cualquier parte de la fila.
Para determinar la posición de la selección en PrimeFaces, se siguen las siguientes condiciones:
* Para la primera posición, no hace falta utilizar el componente //
En la definición de la columna, especificamos las siguientes propiedades:
* El atributo **//id//** que tiene como valor obligatorio //seleccionColumn//, ya que se utiliza para ocultar el //checkbox// de selección de todos los elementos.
* El atributo **//selectionMode//** que indica el tipo de selección, en este caso múltiple.
* El elemento HTML **//input//** nos permite saber si la fila es seleccionable o no. En su campo //value// se especifica la expresión EL que obtiene dicho valor, tiene el mismo funcionamiento que la propiedad //disabled// de un componente JSF. Los atributos //id// y //name// de elemento //input// tienen que tener el valor obligatorio //disableSelect//, ya que se utiliza para obtener dicho valor y realizar la configuración de selección de filas.
En el componente //
donde:
* **//page//**: evento que se ejecuta cuando se utiliza la paginación, y permite enviar las filas seleccionadas al bean de respaldo y almacenarlas en la lista //listaServicioPendientePago// mediante la llamada al método //setListaServicioPendientePago//. También volvemos a realizar una llamada a la función Javascript //configuraSeleccionMultiple// pasandole el //id// del componente //
package es.um.atica.gepeto.backbeans;
...
@Name( ServicioPendientePagoBean.NAME )
@Scope( ScopeType.CONVERSATION )
public class ServicioPendientePagoBean extends FundeWebManagerBean {
...
private List listaServicioPendientePago = new ArrayList();
public List getListaServicioPendientePago() {
return listaServicioPendientePago;
}
public void setListaServicioPendientePago( List listaServicioPendientePago ) {
for (ServicioPendientePago servicioPendientePago : listaServicioPendientePago) {
if (! this.listaServicioPendientePago.contains( servicioPendientePago )) {
this.listaServicioPendientePago.add( servicioPendientePago );
}
}
}
public void deselecionarFila(UnselectEvent event) {
this.listaServicioPendientePago.remove( event.getObject() );
}
public boolean activarCombo(ServicioPendientePago servicioPendientePago) {
// Logica para determinar si la fila es seleccionable o no
...
}
...
}
descripción de los métodos:
* **//setListaServicioPendientePago//**: se utiliza para almacenar las selecciones en la lista //listaServicioPendientePago//. Si la lista ya contiene un elemento seleccionado, se omite.
* **//deselecionarFila//**: se utiliza cuando se deselecciona alguna fila de la tabla. Se obtiene el objeto //ServicioPendientePago// del evento que tiene como parámetro y se elimina de la lista.
* **//activarCombo//**: se utiliza para indicar si una fila esta habilitada para ser seleccionado.
--- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2016/07/15 14:45//