package de.flower.rmt.ui.page.calendar; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.common.ui.ajax.markup.html.AjaxLink; import de.flower.common.ui.ajax.markup.html.AjaxLinkWithConfirmation; import de.flower.common.util.Check; import de.flower.rmt.model.db.entity.CalItem; import de.flower.rmt.model.db.entity.User; import de.flower.rmt.model.dto.CalItemDto; import de.flower.rmt.security.ISecurityService; import de.flower.rmt.service.ICalendarManager; import de.flower.rmt.service.IUserManager; import de.flower.rmt.ui.markup.html.form.DatePicker; import de.flower.rmt.ui.markup.html.form.EntityForm; import de.flower.rmt.ui.markup.html.form.TimeDropDownChoice; import de.flower.rmt.ui.markup.html.form.UserDropDownChoice; import de.flower.rmt.ui.markup.html.form.renderer.CalItemTypeRenderer; import de.flower.rmt.ui.panel.RMTBasePanel; import de.flower.rmt.util.Dates; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import java.util.Arrays; import java.util.List; /** * @author flowerrrr */ public class CalItemEditPanel extends RMTBasePanel<CalItemDto> { @SpringBean private ICalendarManager calendarManager; @SpringBean private IUserManager userManager; @SpringBean private ISecurityService securityService; private FormComponent startDateTime; private FormComponent endDateTime; /** * Not correct to use readonly direct instead of a model. but who cares. panel is always created on request. */ public CalItemEditPanel(final String id, final IModel<CalItemDto> model, final IModel<User> userModel) { super(id, model); Check.notNull(model); add(new AjaxEventListener(CalItem.class)); add(new Label("heading", new StringResourceModel("calendar.editpanel.new.${new}.heading", model))); final EntityForm<CalItemDto> form = new EntityForm<CalItemDto>("form", model) { @Override protected void onSubmit(final AjaxRequestTarget target, final Form<CalItemDto> form) { calendarManager.save(form.getModelObject(), userModel.getObject()); AjaxEventSender.entityEvent(this, CalItem.class); onClose(target); } }; add(form); form.add(new UserDropDownChoice("user", userModel, getUserListModel()) { @Override public boolean isVisible() { return isManagerView(); } }); form.add(new CalItemTypeDropDownChoice("type")); form.add(new TextField("summary")); form.add(new AjaxCheckBox("allDay") { @Override protected void onUpdate(final AjaxRequestTarget target) { target.add(startDateTime); target.add(endDateTime); } }); form.add(new DatePicker("startDate", Dates.DATE_LONG)); form.add(startDateTime = new TimeDropDownChoice("startTime") { @Override public boolean isVisible() { return !form.getModelObject().isAllDay(); } }); startDateTime.setOutputMarkupPlaceholderTag(true); form.add(new DatePicker("endDate", Dates.DATE_LONG)); form.add(endDateTime = new TimeDropDownChoice("endTime") { @Override public boolean isVisible() { return !form.getModelObject().isAllDay(); } }); endDateTime.setOutputMarkupPlaceholderTag(true); form.add(new CheckBox("autoDecline")); form.add(new AjaxLink.NoIndicatingAjaxLink("cancelButton") { @Override public void onClick(final AjaxRequestTarget target) { onClose(target); } }); form.add(new AjaxLinkWithConfirmation("deleteButton", new ResourceModel("calendar.editpanel.delete.confirm")) { @Override public void onClick(AjaxRequestTarget target) { calendarManager.delete(model.getObject().getId()); AjaxEventSender.entityEvent(this, CalItem.class); onClose(target); } @Override public boolean isVisible() { return !model.getObject().isNew(); } }); } private IModel<List<User>> getUserListModel() { return new LoadableDetachableModel<List<User>>() { @Override protected List<User> load() { return userManager.findAll(); } }; } public static class CalItemTypeDropDownChoice extends DropDownChoice<CalItem.Type> { public CalItemTypeDropDownChoice(String id) { super(id); setChoices(Arrays.asList(CalItem.Type.values())); setChoiceRenderer(new CalItemTypeRenderer()); } } }