SmartGwt – Filtrar un SelectItem con datos de un ValueMap

marzo 30, 2012

Hay ocasiones que no es necesario obtener los datos de un SelectItem desde el servidor porque ya conocemos los valores que pudiera tener. Por ejemplo, si queremos desplegar un SelectItem con los meses del año para que el usuario seleccione alguno, tendríamos el siguiente código:

private enum Mes{
ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO,
SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE
}

LinkedHashMap getMonthsValueMap(){
    LinkedHashMap monthsValueMap=new LinkedHashMap();
    for(int i=0;i<Mes.values().length;i++){
        monthsValueMap.put(String.valueOf(i+1), Mes.values()[i].toString());
    }
    return monthsValueMap;
}

SelectItem itmMes = new SelectItem("mes", "Mes");
itmMes.setValueMap(getMonthsValueMap());

Pero, ¿qué pasa si quisieramos filtrar los meses para mostrar solamente hasta el mes actual? Definitivamente tendríamos que descartar los métodos setPickListCriteria, setOptionCriteria o sobreescribir el método getPickListFilterCriteria. Esto debido a que todos estos métodos funcionan solamente para controles enlazados a un DataSource. Incluso el método setFilterLocally requiere lo mismo y dice en su documentación que si se establece en true los datos serán solicitados una sola vez al servidor y después aplicará el filtro localmente. Nada de esto nos sirve ya que el control contiene los datos de un ValueMap.

Lo que tendríamos que hacer es construir el ValueMap de forma dinámica en el cliente de la siguiente manera

private enum Mes{
ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO,
SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE
}

LinkedHashMap getMonthsValueMap(Integer maxMonth){
    LinkedHashMap monthsValueMap=new LinkedHashMap();
    for(int i=0;i<maxMonth;i++){
        monthsValueMap.put(String.valueOf(i+1), Mes.values()[i].toString());
    }
    return monthsValueMap;
}

Date fecha=new Date();
Integer currentMonth=fecha.getMonth()+1;
SelectItem itmMes = new SelectItem("mes", "Mes");
itmMes.setValueMap(getMonthsValueMap(currentMonth));

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: