2011-04-13 13 views
7

Necesito limitar lo que Dates un usuario puede elegir de com.google.gwt.user.datepicker.client.DateBox.Cómo limitar los intervalos de fechas disponibles con com.google.gwt.user.datepicker.client.DateBox

Parece que no puedo entender cómo limitar el mínimo Date para que no puedan seleccionar fechas pasadas.

Si no puedo hacer esto con com.google.gwt.user.datepicker.client.DateBox ¿Existe un widget alternativo DateBox que me permita este tipo de flexibilidad?

Respuesta

17

Según las sugerencias que recibí, esto es lo que se me ocurrió que funciona al limitar las fechas seleccionables solo al día actual y después. Esto funciona en GWT 2.1.1

final DateBox dateBox = new DateBox(); 
dateBox.addValueChangeHandler(new ValueChangeHandler<Date>() 
{ 
    @Override 
    public void onValueChange(final ValueChangeEvent<Date> dateValueChangeEvent) 
    { 
     if (dateValueChangeEvent.getValue().before(today())) 
     { 
      dateBox.setValue(today(), false); 
     } 
    } 
}); 
dateBox.getDatePicker().addShowRangeHandler(new ShowRangeHandler<Date>() 
{ 
    @Override 
    public void onShowRange(final ShowRangeEvent<Date> dateShowRangeEvent) 
    { 
     final Date today = today(); 
     Date d = zeroTime(dateShowRangeEvent.getStart()); 
     while (d.before(today)) 
     { 
      dateBox.getDatePicker().setTransientEnabledOnDates(false, d); 
      d = nextDay(d); 
     } 
    } 
}); 

está completo y aquí están los static métodos auxiliares para la manipulación de las fechas:

private static Date today() 
{ 
    return zeroTime(new Date()); 
} 

/** this is important to get rid of the time portion, including ms */ 
private static Date zeroTime(final Date date) 
{ 
    return DateTimeFormat.getFormat("yyyyMMdd").parse(DateTimeFormat.getFormat("yyyyMMdd").format(date)); 
} 

private static Date nextDay(final Date date) 
{ 
    return zeroTime(new Date(date.getTime() + 24 * 60 * 60 * 1000)); 
} 
+3

Excelente respuesta, pero me gustaría abordar un pequeño error en el método onShowRangeHandler. El bucle también debe estar limitado al rango final (de lo contrario arroja excepciones silenciosas de afirmación dev-environment) '\t final long endTime = event.getEnd(). GetTime(); while (d.antes (hoy) && d.getTime() <= endTime) { dateBox.getDatePicker(). SetTransientEnabledOnDates (false, d); d = nextDay (d); } ' – Chris

+0

Además, durante una transición del horario de verano al horario estándar, este código entrará en un ciclo infinito –

1

Supongo que aquí, pero es posible que deba utilizar el addValueChangeHandler. Un ejemplo:

datebox.addValueChangeHandler(new ValueChangeHandler<Date>() { 
    public void onValueChange(ValueChangeEvent<Date> event) { 
     Date date = event.getValue(); 
     if (date.before(new Date())) { 
     fromDatePicker.setValue(new Date()); 
     } 
    } 
}); 

Aquí cuando un usuario selecciona alguna manera una fecha que está en el pasado, que se auto configurarlo hasta la fecha actual (o lo que se adecue a sus necesidades).

+0

yo preferiría simplemente _disable_ cualquier fecha en el pasado y evitar la posibilidad de ellos escogiendo uno en absoluto. ¿Hay alguna manera de deshabilitar las fechas reales en las que se puede hacer clic en el widget de calendario? –

+0

esto está en el camino correcto, pero es inherentemente defectuoso. Dado que 'new Date()' tiene tiempo asociado, la 'date.before (new Date())' siempre ___salirá__. Tuve que quitarme el tiempo para hacer que este enfoque funcionara. Ahora puedo restablecer la fecha hasta el día de hoy, pero sigo buscando la manera de desactivar por completo las fechas anteriores. –

Cuestiones relacionadas