package de.flower.rmt.ui.page.events.player;
import de.flower.common.ui.ajax.event.AjaxEventListener;
import de.flower.common.ui.panel.BasePanel;
import de.flower.common.ui.tooltips.TooltipBehavior;
import de.flower.rmt.model.db.entity.Invitation;
import de.flower.rmt.model.db.entity.User;
import de.flower.rmt.model.db.entity.event.Event;
import de.flower.rmt.model.db.type.EventType;
import de.flower.rmt.model.db.type.RSVPStatus;
import de.flower.rmt.service.IEventManager;
import de.flower.rmt.service.IInvitationManager;
import de.flower.rmt.service.IResponseManager;
import de.flower.rmt.ui.model.EventModel;
import de.flower.rmt.ui.model.UserModel;
import de.flower.rmt.ui.page.event.player.EventPage;
import de.flower.rmt.ui.page.events.EventDataProvider;
import de.flower.rmt.ui.panel.QuickResponseLabel;
import de.flower.rmt.util.Dates;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateTime;
import java.util.List;
/**
* @author flowerrrr
*/
public class EventListPanel extends BasePanel {
@SpringBean
private IResponseManager responseManager;
@SpringBean
private IInvitationManager invitationManager;
@SpringBean
private IEventManager eventManager;
private static final int ITEMS_PER_PAGE = de.flower.rmt.ui.page.events.manager.EventListPanel.ITEMS_PER_PAGE;
public EventListPanel(final UserModel userModel) {
final EventDataProvider dataProvider = new EventDataProvider(ITEMS_PER_PAGE, userModel);
final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
add(listContainer);
final DataView<Event> dataView = new DataView<Event>("list", dataProvider) {
@Override
public boolean isVisible() {
return getItemCount() > 0;
}
@Override
protected void populateItem(final Item<Event> item) {
final Event event = item.getModelObject();
final EventModel eventModel = new EventModel(item.getModel());
if (dataProvider.isNextEvent(event)) {
item.add(AttributeModifier.append("class", "next-event"));
}
if (event.isCanceled()) {
item.add(AttributeModifier.append("class", "canceled-event"));
}
Link link = new BookmarkablePageLink("invitationsLink", EventPage.class, EventPage.getPageParams(event.getId()));
item.add(link);
link.add(new Label("date", Dates.formatDateShortWithWeekday(event.getDateTimeAsDate())));
link.add(new Label("time", Dates.formatTimeShort(event.getDateTimeAsDate())));
item.add(new Label("type", new ResourceModel(EventType.from(event).getResourceKey())));
item.add(new Label("team", event.getTeam().getName()));
item.add(new Label("summary", event.getSummary()));
final Invitation invitation = getInvitation(event, userModel.getObject());
RSVPStatus status = invitation.getStatus();
item.add(new QuickResponseLabel("rsvpStatus", status == RSVPStatus.NORESPONSE ? null : status) {
@Override
protected void submitStatus(final RSVPStatus status) {
responseManager.respond(eventModel.getId(), userModel.getId(), status);
}
@Override
public boolean isEnabled() {
return !eventManager.isEventClosed(item.getModelObject());
}
@Override
public boolean isVisible() {
return !item.getModelObject().isCanceled();
}
});
Link confirmCancelationLink = new BookmarkablePageLink("confirmCancelationLink", EventPage.class, EventPage.getPageParams(event.getId()));
confirmCancelationLink.setVisible(event.isCanceled() && status != RSVPStatus.DECLINED);
item.add(confirmCancelationLink);
confirmCancelationLink.add(new TooltipBehavior(new ResourceModel("player.events.tooltip.confirm.cancelation")));
}
private Invitation getInvitation(final Event event, final User user) {
return invitationManager.loadByEventAndUser(event, user);
}
};
dataView.setItemsPerPage(ITEMS_PER_PAGE);
listContainer.add(dataView);
listContainer.add(new WebMarkupContainer("noEntry") {
@Override
public boolean isVisible() {
return dataView.getItemCount() == 0;
}
});
listContainer.add(new AjaxPagingNavigator("pager", dataView) {
@Override
protected void onAjaxEvent(AjaxRequestTarget target) {
target.add(listContainer);
}
});
listContainer.add(new AjaxEventListener(Event.class));
}
/**
* Returns true, if given event is a future event and no other event in events is closer to
* today then given event.
*/
public static boolean isNextEvent(Event event, List<? extends Event> events) {
DateTime date = event.getDateTime();
if (date.isBeforeNow()) {
return false;
} else {
for (Event e : events) {
if (e.getDateTime().isBeforeNow()) {
continue;
} else {
if (e.getDateTime().isBefore(event.getDateTime())) {
return false;
}
}
}
}
return true;
}
}