package de.flower.rmt.ui.page.calendar; import com.google.common.collect.ImmutableMap; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.rmt.model.db.entity.CalItem; import de.flower.rmt.model.db.entity.CalItem_; import de.flower.rmt.model.db.entity.User; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.model.dto.CalItemDto; import de.flower.rmt.security.ISecurityService; import de.flower.rmt.service.ICalendarManager; import de.flower.rmt.service.IEventManager; import de.flower.rmt.service.type.CalendarFilter; import de.flower.rmt.ui.app.IPageResolver; import de.flower.rmt.ui.app.RMTApplication; import de.flower.rmt.ui.markup.html.calendar.CalEvent; import de.flower.rmt.ui.markup.html.calendar.FullCalendarPanel; import de.flower.rmt.ui.panel.RMTBasePanel; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.DateTime; import java.util.List; import java.util.Map; /** * @author flowerrrr */ public abstract class CalendarPanel extends RMTBasePanel<List<CalendarFilter>> { @SpringBean private ICalendarManager calendarManager; @SpringBean private IEventManager eventManager; @SpringBean private ISecurityService securityService; @SpringBean private IPageResolver pageResolver; public CalendarPanel(String id, final IModel<List<CalendarFilter>> model) { super(id, model); add(new AjaxEventListener(CalItem.class)); add(new AjaxEventListener(model)); add(new FullCalendarPanel() { @Override protected void onEventClick(final AjaxRequestTarget target, final CalEvent calEvent) { if (CalItem.class.getName().equals(calEvent.clazzName)) { CalItem calItem = calendarManager.loadById(calEvent.entityId, CalItem_.user); boolean readonly = !(securityService.isCurrentUser(calItem.getUser()) || isManagerView()); if (readonly) { CalendarPanel.this.onEventClick(target, calItem); } else { CalItemDto dto = CalItemDto.fromEntity(calItem); CalendarPanel.this.onEventClick(target, dto, calItem.getUser()); } } else if (Event.class.getName().equals(calEvent.clazzName)) { Event clubEvent = eventManager.loadById(calEvent.entityId); CalendarPanel.this.onEventClick(target, clubEvent); } else if (calEvent.isNew()) { CalItemDto dto = new CalItemDto(); // init time fields. when saved as allDay the time is adjusted to 0:00 - 23:59. // helps displaying reasonable default values when displaying time fields the first time. dto.setStartDateTime(new DateTime(calEvent.start).withTime(8, 0, 0, 0)); dto.setEndDateTime(new DateTime(calEvent.end).withTime(20, 0, 0, 0)); dto.setAllDay(calEvent.allDay); dto.setAutoDecline(true); CalendarPanel.this.onEventClick(target, dto, securityService.getUser()); } else { throw new IllegalArgumentException(calEvent.toString()); } } @Override public List<CalEvent> loadCalEvents(final DateTime start, final DateTime end) { List<CalEvent> calEvents = calendarManager.findAllByCalendarAndRange(model.getObject(), start, end); return calEvents; } @Override protected Map<Integer, String> getErrorRedirectMap() { return ImmutableMap.of(RMTApplication.PAGE_EXPIRED_STATUS_CODE, this.urlFor(pageResolver.getPageExpiredPage(), null).toString()); } }); } protected abstract void onEventClick(AjaxRequestTarget target, CalItemDto calItemDto, User user); protected abstract void onEventClick(AjaxRequestTarget target, CalItem calItem); protected abstract void onEventClick(AjaxRequestTarget target, Event event); }