package fr.openwide.core.showcase.web.application.widgets.component;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import fr.openwide.core.wicket.more.markup.html.basic.DateLabel;
import fr.openwide.core.wicket.more.markup.html.form.DatePicker;
import fr.openwide.core.wicket.more.markup.html.form.MonthPicker;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.datepickersync.DatePickerSync;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.datepickersync.DatePickerSyncActionOnUpdate;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.datepickersync.DatePickerSyncBehavior;
import fr.openwide.core.wicket.more.util.DatePattern;
public class CalendarPanel extends Panel {
private static final long serialVersionUID = -4459381803397055418L;
private IModel<Date> beginDateModel, endDateModel;
private IModel<Date> monthModel;
public CalendarPanel(String id) {
super(id);
Form<Void> form = new Form<Void>("form");
add(form);
beginDateModel = new Model<Date>(Calendar.getInstance().getTime());
endDateModel = new Model<Date>(null);
final DatePicker beginDatePicker = new DatePicker("beginDatePicker", beginDateModel, DatePattern.SHORT_DATE);
beginDatePicker.setLabel(new ResourceModel("widgets.calendar.date.beginDate"));
form.add(beginDatePicker);
final DateLabel beginDateLabel = new DateLabel("beginDateLabel", beginDateModel, DatePattern.SHORT_DATE);
beginDateLabel.setOutputMarkupId(true);
form.add(beginDateLabel);
beginDatePicker.add(new AjaxFormSubmitBehavior(form, "change") {
private static final long serialVersionUID = -5972628703079302821L;
@Override
protected void onSubmit(AjaxRequestTarget target) {
target.add(beginDateLabel);
}
@Override
protected void onError(AjaxRequestTarget target) {
}
});
final DatePicker endDatePicker = new DatePicker("endDatePicker", endDateModel, DatePattern.SHORT_DATE);
endDatePicker.setLabel(new ResourceModel("widgets.calendar.date.endDate"));
form.add(endDatePicker);
final DateLabel endDateLabel = new DateLabel("endDateLabel", endDateModel, DatePattern.SHORT_DATE);
endDateLabel.setOutputMarkupId(true);
form.add(endDateLabel);
endDatePicker.add(new AjaxFormSubmitBehavior(form, "change") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target) {
target.add(endDateLabel);
}
@Override
protected void onError(AjaxRequestTarget target) {
}
});
// Synchronisation entre les deux calendrier pour éviter au maximum les erreurs
Calendar absoluteMaxDate = GregorianCalendar.getInstance();
absoluteMaxDate.add(Calendar.MONTH, 3);
Calendar absoluteMinDate = GregorianCalendar.getInstance();
absoluteMinDate.add(Calendar.MONTH, -3);
beginDatePicker.add(new DatePickerSyncBehavior(
new DatePickerSync(null, endDatePicker, DatePickerSyncActionOnUpdate.NOTHING)
.addPrecedentsModels(Model.of(absoluteMinDate.getTime()))
));
endDatePicker.add(
new DatePickerSyncBehavior(new DatePickerSync(beginDatePicker, null, DatePickerSyncActionOnUpdate.NOTHING)
.addSuivantsModels(Model.of(absoluteMaxDate.getTime()))
));
// Month picker
final MonthPicker monthPicker = new MonthPicker("monthPicker", monthModel, DatePattern.COMPLETE_MONTH_YEAR);
monthPicker.setLabel(new ResourceModel("widgets.calendar.date.month"));
add(monthPicker);
}
@Override
protected void detachModel() {
super.detachModel();
if(beginDateModel != null) {
beginDateModel.detach();
}
}
}