package de.flower.rmt.ui.page.event.manager.edit; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.js.JQuery; import de.flower.common.ui.markup.html.link.HistoryBackLink; import de.flower.common.ui.panel.BasePanel; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.model.db.type.EventType; import de.flower.rmt.service.IEventManager; import de.flower.rmt.ui.markup.html.form.CancelableEntityForm; import de.flower.rmt.ui.markup.html.form.EntityForm; import de.flower.rmt.ui.markup.html.form.OpponentDropDownChoicePanel; import de.flower.rmt.ui.markup.html.form.SurfaceCheckBoxMultipleChoice; import de.flower.rmt.ui.markup.html.form.TeamDropDownChoicePanel; import de.flower.rmt.ui.markup.html.form.TimeDropDownChoice; import de.flower.rmt.ui.markup.html.form.UniformDropDownChoicePanel; import de.flower.rmt.ui.markup.html.form.VenueDropDownChoicePanel; import de.flower.rmt.ui.markup.html.form.field.AbstractFormFieldPanel; import de.flower.rmt.ui.markup.html.form.field.CheckBoxMultipleChoicePanel; import de.flower.rmt.ui.markup.html.form.field.DateFieldPanel; import de.flower.rmt.ui.markup.html.form.field.DropDownChoicePanel; import de.flower.rmt.ui.markup.html.form.field.TextAreaPanel; import de.flower.rmt.ui.markup.html.form.field.TextFieldPanel; import de.flower.rmt.ui.model.ModelFactory; import de.flower.rmt.ui.model.TeamModel; import de.flower.rmt.ui.page.event.manager.EventPage; import de.flower.rmt.ui.page.event.manager.EventTabPanel; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.DateTime; import org.joda.time.LocalTime; /** * A bit different form other editing panels cause it is always * called with a domain object passed into the panel. * * @author flowerrrr */ public class EventEditPanel extends BasePanel<Event> { @SpringBean private IEventManager eventManager; private UniformDropDownChoicePanel uniformDDCPanel; private DropDownChoicePanel<?> timeDDCPanel; private DropDownChoicePanel<?> kickOffDDCPanel; private DropDownChoicePanel<?> timeEndDDCPanel; public EventEditPanel(final IModel<Event> model) { this(null, model); } public EventEditPanel(String id, final IModel<Event> m) { super(id, m); add(new AjaxEventListener(Event.class)); // in case cancelEventButton is clicked. final IModel<Event> model = ModelFactory.eventModelWithAllAssociations(m.getObject()); final EntityForm<Event> form = new CancelableEntityForm<Event>("form", model, createCancelLink(model)) { @Override protected void onSubmit(final AjaxRequestTarget target, final Form<Event> form) { final Event event = form.getModelObject(); // adjust endTime; must be past begin if (event.getTimeEnd() != null) { DateTime dateTimeEnd = event.getDateTime().withFields(event.getTimeEnd()); if (dateTimeEnd.isBefore(event.getDateTime())) { dateTimeEnd = dateTimeEnd.plusDays(1); } event.setDateTimeEnd(dateTimeEnd); } if (event.isNew()) { eventManager.create(event, true); // jump to email tab setResponsePage(EventPage.class, EventPage.getPageParams(form.getModelObject().getId(), EventTabPanel.NOTIFICATION_PANEL_INDEX)); } else { eventManager.save(event); // stay on page target.appendJavaScript(JQuery.scrollToTop("slow")); } } }; add(form); form.add(new TextFieldPanel("type", new TextField(AbstractFormFieldPanel.ID, new ResourceModel(EventType.from(model.getObject()).getResourceKey()))) .setValidationEnabled(false).setEnabled(false)); form.add(new TeamDropDownChoicePanel("team") { @Override public boolean isEnabled() { return model.getObject().isNew(); } @Override protected void onChange(AjaxRequestTarget target) { // reset uniform select box uniformDDCPanel.detach(); uniformDDCPanel.setTeamModel(new TeamModel(form.getModelObject().getTeam())); target.add(uniformDDCPanel); } }); form.add(new DateFieldPanel("date")); form.add(timeDDCPanel = new DropDownChoicePanel("time", new TimeDropDownChoice("input")) { @Override protected void onChange(final AjaxRequestTarget target) { // preset kickoff time (if it is not set yet) LocalTime time = (LocalTime) getDefaultModelObject(); if (kickOffDDCPanel.isVisible() && kickOffDDCPanel.getStateSavingModel().getSavedObject() == null) { kickOffDDCPanel.getFormComponent().setModelObject(time.plusMinutes(EventType.from(model.getObject()).getMeetBeforeKickOffMinutes())); target.add(kickOffDDCPanel); } // preset end time timeEndDDCPanel.getFormComponent().setModelObject(time.plusMinutes(EventType.from(model.getObject()).getMeetBeforeKickOffMinutes() + EventType.from(model.getObject()).getDurationMinutes())); target.add(timeEndDDCPanel); } }); form.add(kickOffDDCPanel = new DropDownChoicePanel("kickoff", new TimeDropDownChoice("input")) { @Override public boolean isVisible() { return EventType.isSoccerEvent(model.getObject()); } @Override protected void onChange(final AjaxRequestTarget target) { // preset meeting time (if it is not set yet) LocalTime time = (LocalTime) getDefaultModelObject(); if (timeDDCPanel.getStateSavingModel().getSavedObject() == null) { timeDDCPanel.getFormComponent().setModelObject(time.minusMinutes(EventType.from(model.getObject()).getMeetBeforeKickOffMinutes())); target.add(timeDDCPanel); } // preset end time timeEndDDCPanel.getFormComponent().setModelObject(time.plusMinutes(EventType.from(model.getObject()).getDurationMinutes())); target.add(timeEndDDCPanel); } }); form.add(timeEndDDCPanel = new DropDownChoicePanel("timeEnd", new TimeDropDownChoice("input"))); form.add(new OpponentDropDownChoicePanel("opponent") { @Override public boolean isVisible() { return EventType.isMatch(model.getObject()); } }); form.add(new VenueDropDownChoicePanel("venue")); form.add(uniformDDCPanel = new UniformDropDownChoicePanel("uniform", new TeamModel.NullableTeamModel(model.getObject().getTeam())) { @Override public boolean isVisible() { return EventType.isSoccerEvent(model.getObject()); } }); form.add(new CheckBoxMultipleChoicePanel("surfaceList", new SurfaceCheckBoxMultipleChoice("input")) { @Override public boolean isVisible() { return EventType.isSoccerEvent(model.getObject()); } @Override protected boolean isInstantValidationEnabled() { return false; // very annoying to have instant validation on multiselect boxes } }); form.add(new TextFieldPanel("summary")); form.add(new TextAreaPanel("comment")); } /** * Visibility of cancel button depends on persisted state of entity * * @param model * @return */ private AbstractLink createCancelLink(final IModel<Event> model) { return new HistoryBackLink("cancelButton") { @Override public boolean isVisible() { return model.getObject().isNew(); } }; } }