///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.plugins.poll.event; import java.util.Collection; import net.ftlines.wicket.fullcalendar.CalendarResponse; import net.ftlines.wicket.fullcalendar.EventSource; import net.ftlines.wicket.fullcalendar.callback.ClickedEvent; import net.ftlines.wicket.fullcalendar.callback.DroppedEvent; import net.ftlines.wicket.fullcalendar.callback.ResizedEvent; import net.ftlines.wicket.fullcalendar.callback.SelectedRange; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.joda.time.DateTime; import org.projectforge.plugins.poll.NewPollFrontendModel; import org.projectforge.plugins.poll.NewPollPage; import org.projectforge.plugins.poll.PollDO; import org.projectforge.plugins.poll.attendee.PollAttendeePage; import org.projectforge.web.calendar.MyFullCalendar; import org.projectforge.web.calendar.MyFullCalendarConfig; import org.projectforge.web.wicket.AbstractSecuredPage; import org.projectforge.web.wicket.components.SingleButtonPanel; /** * @author Johannes Unterstein (j.unterstein@micromata.de) * */ public class PollEventEditPage extends AbstractSecuredPage { private static final long serialVersionUID = 2988767055605267801L; // private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(PollEventEditPage.class); private MyFullCalendarConfig config; private MyFullCalendar calendar; private RepeatingView eventEntries; private PollEventEventsProvider eventProvider; private WebMarkupContainer entryContainer; private final NewPollFrontendModel model; public PollEventEditPage(final PageParameters parameters) { super(parameters); NewPollPage.redirectToNewPollPage(parameters); this.model = null; } public PollEventEditPage(final PageParameters parameters, final NewPollFrontendModel model) { super(parameters); this.model = model; } /** * @see org.apache.wicket.Component#onInitialize() */ @Override protected void onInitialize() { super.onInitialize(); final Form<Void> form = new Form<Void>("form"); body.add(form); form.add(new Label("title", model.getPollDo().getTitle())); form.add(new Label("location", model.getPollDo().getLocation())); eventEntries = new RepeatingView("eventEntries"); eventEntries.setVisible(true); entryContainer = new WebMarkupContainer("entryContainer") { private static final long serialVersionUID = -2897780301098962428L; /** * @see org.apache.wicket.Component#onBeforeRender() */ @Override protected void onBeforeRender() { super.onBeforeRender(); eventEntries.removeAll(); for (final PollEventDO pollEvent : eventProvider.getAllEvents()) { eventEntries.add(new PollEventEntryPanel(eventEntries.newChildId(), pollEvent) { private static final long serialVersionUID = -3844278068979559030L; /** * @see org.projectforge.plugins.poll.event.PollEventEntryPanel#onDeleteClick(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onDeleteClick(final AjaxRequestTarget target) { target.appendJavaScript("$('#" + calendar.getMarkupId() + "').fullCalendar('removeEvents', " + eventProvider.getEventForPollEvent(pollEvent).getId() + ");"); target.add(entryContainer); eventProvider.removeElement(pollEvent); } }); } } }; final Button nextButton = new Button(SingleButtonPanel.WICKET_ID) { private static final long serialVersionUID = -7779593314951993472L; @Override public final void onSubmit() { if (eventProvider.getAllEvents().isEmpty() == false) { onNextButtonClick(model.getPollDo(), eventProvider.getAllEvents()); } else { this.error(getString("plugins.poll.event.error")); } } }; nextButton.setDefaultFormProcessing(false); final SingleButtonPanel nextButtonPanel = new SingleButtonPanel("continueButton", nextButton, getString("next"), SingleButtonPanel.DEFAULT_SUBMIT); nextButtonPanel.setOutputMarkupId(true); form.add(nextButtonPanel); entryContainer.add(eventEntries); entryContainer.setOutputMarkupId(true); form.add(entryContainer); eventProvider = new PollEventEventsProvider(model.getPollDo()); if (model.getAllEvents().isEmpty() == false) { for (final PollEventDO event : model.getAllEvents()) { eventProvider.addEvent(new SelectedRange(new DateTime(event.getStartDate()), new DateTime(event.getEndDate()), false), null); } } config = new MyFullCalendarConfig(this); config.setSelectable(true); config.setEditable(true); config.setSelectHelper(true); config.setDefaultView("agendaWeek"); config.getHeader().setRight(""); config.setEnableContextMenu(false); config.setLoading("function(bool) { if (bool) $(\"#loading\").show(); else $(\"#loading\").hide(); }"); calendar = new MyFullCalendar("cal", config) { private static final long serialVersionUID = -6819899072933690316L; /** * @see net.ftlines.wicket.fullcalendar.FullCalendar#onDateRangeSelected(net.ftlines.wicket.fullcalendar.callback.SelectedRange, * net.ftlines.wicket.fullcalendar.CalendarResponse) */ @Override protected void onDateRangeSelected(final SelectedRange range, final CalendarResponse response) { eventProvider.addEvent(range, response); response.getTarget().add(entryContainer); } /** * @see net.ftlines.wicket.fullcalendar.FullCalendar#onEventResized(net.ftlines.wicket.fullcalendar.callback.ResizedEvent, * net.ftlines.wicket.fullcalendar.CalendarResponse) */ @Override protected boolean onEventResized(final ResizedEvent event, final CalendarResponse response) { response.getTarget().add(entryContainer); return eventProvider.resizeEvent(event, response); } /** * @see net.ftlines.wicket.fullcalendar.FullCalendar#onEventDropped(net.ftlines.wicket.fullcalendar.callback.DroppedEvent, * net.ftlines.wicket.fullcalendar.CalendarResponse) */ @Override protected boolean onEventDropped(final DroppedEvent event, final CalendarResponse response) { response.getTarget().add(entryContainer); return eventProvider.dropEvent(event, response); } /** * @see net.ftlines.wicket.fullcalendar.FullCalendar#onEventClicked(net.ftlines.wicket.fullcalendar.callback.ClickedEvent, * net.ftlines.wicket.fullcalendar.CalendarResponse) */ @Override protected void onEventClicked(final ClickedEvent event, final CalendarResponse response) { response.getTarget().add(entryContainer); eventProvider.eventClicked(event, response); } }; calendar.setMarkupId("calendar"); final EventSource eventSource = new EventSource(); eventSource.setEventsProvider(eventProvider); config.add(eventSource); form.add(calendar); } /** * @param allEvents */ protected void onNextButtonClick(final PollDO pollDo, final Collection<PollEventDO> allEvents) { model.getAllEvents().clear(); model.getAllEvents().addAll(allEvents); setResponsePage(new PollAttendeePage(getPageParameters(), model)); } /** * @see org.projectforge.web.wicket.AbstractUnsecureBasePage#getTitle() */ @Override protected String getTitle() { return getString("plugins.poll.event"); } }