blob: 724834bdf7935cd287319fc2b935ecef965dfe62 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.web.components.user.calendar;
import static org.apache.wicket.ajax.attributes.CallbackParameter.context;
import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
import static org.apache.wicket.ajax.attributes.CallbackParameter.resolved;
import java.util.Calendar;
import org.apache.openmeetings.data.calendar.daos.AppointmentDao;
import org.apache.openmeetings.persistence.beans.calendar.Appointment;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.components.UserPanel;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.json.JSONArray;
import org.apache.wicket.ajax.json.JSONException;
import org.apache.wicket.ajax.json.JSONObject;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.request.handler.TextRequestHandler;
public class CalendarPanel extends UserPanel {
private static final long serialVersionUID = -6536379497642291437L;
@Override
public void onMenuPanelLoad(AjaxRequestTarget target) {
target.appendJavaScript("calendarInit();");
}
public CalendarPanel(String id) {
super(id);
WebMarkupContainer calendar = new WebMarkupContainer("calendar");
calendar.setOutputMarkupId(true);
calendar.setMarkupId("calendar");
add(calendar);
final CalendarForm form = new CalendarForm("appointment", new CompoundPropertyModel<Appointment>(new Appointment()));
add(form);
//fetchEvents
add(new AbstractDefaultAjaxBehavior() {
private static final long serialVersionUID = 6880514947331946407L;
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.setDataType("json");
attributes.setWicketAjaxResponse(false);
attributes.getAjaxCallListeners().add(new AjaxCallListener().onSuccess("callback(data);"));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(
"var fetchEventsFunc = "
+ this.getCallbackFunction(
context("start")
, context("end")
, context("callback")
, resolved("_start", "start.getTime()")
, resolved("_end", "end.getTime()")) + ";"
, "fetchEventsFunc"));
}
@Override
protected void respond(AjaxRequestTarget target) {
Calendar start = WebSession.getCalendar();
start.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_start").toLong());
Calendar end = WebSession.getCalendar();
end.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());
JSONArray events = new JSONArray();
for (Appointment a : Application.getBean(AppointmentDao.class).getAppointmentsByRange(WebSession.getUserId(),
start.getTime(), end.getTime())) {
try {
events.put(new JSONObject()
.put("id", a.getAppointmentId())
.put("title", a.getAppointmentName())
.put("description", a.getAppointmentDescription())
.put("start", WebSession.getDateFormat().format(a.getAppointmentStarttime()))
.put("end", WebSession.getDateFormat().format(a.getAppointmentEndtime()))
.put("allDay", false));
} catch (JSONException e) {
e.printStackTrace();
}
}
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new TextRequestHandler("application/json", "UTF-8", events.toString()));
}
});
//dropEvent
add(new DropResizeBehavior(true, "dropEventFunc"));
//resizeEvent
add(new DropResizeBehavior(false, "resizeEventFunc"));
//create on click-and-drag
add(new AbstractDefaultAjaxBehavior() {
private static final long serialVersionUID = 6880514947331946407L;
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new AjaxCallListener().onSuccess("$('#appointment').dialog('open');"));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(
"var selectFunc = "
+ this.getCallbackFunction(
context("start")
, context("end")
, context("allDay")
, context("jsEvent")
, context("view")
, resolved("_start", "start.getTime()")
, resolved("_end", "end.getTime()")) + ";"
, "selectFunc"));
}
@Override
protected void respond(AjaxRequestTarget target) {
Calendar start = WebSession.getCalendar();
start.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_start").toLong());
Calendar end = WebSession.getCalendar();
end.setTimeInMillis(getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());
if (start.equals(end)) {
end.add(Calendar.HOUR_OF_DAY, 1);
}
Appointment a = new Appointment();
a.setAppointmentStarttime(start.getTime());
a.setAppointmentEndtime(end.getTime());
form.setModelObject(a);
target.add(form);
}
});
//eventClick
add(new AbstractDefaultAjaxBehavior() {
private static final long serialVersionUID = 6880514947331946407L;
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new AjaxCallListener().onSuccess("$('#appointment').dialog('open');"));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(
"var eventClickFunc = "
+ this.getCallbackFunction(
context("event")
, context("jsEvent")
, context("view")
, resolved("_id", "event.id")) + ";"
, "eventClickFunc"));
}
@Override
protected void respond(AjaxRequestTarget target) {
Appointment a = Application.getBean(AppointmentDao.class).getAppointmentById(
getRequestCycle().getRequest().getRequestParameters().getParameterValue("_id").toLong());
form.setModelObject(a);
target.add(form);
}
});
}
private class DropResizeBehavior extends AbstractDefaultAjaxBehavior {
private static final long serialVersionUID = -3060872155563135236L;
private boolean drop = false;
private String funcName;
DropResizeBehavior(boolean drop, String funcName) {
this.drop = drop;
this.funcName = funcName;
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new AjaxCallListener().onFailure("revertFunc();"));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(
"var " + funcName + " = "
+ (drop
? this.getCallbackFunction(
context("event")
, explicit("dayDelta")
, explicit("minuteDelta")
, context("allDay")
, context("revertFunc")
, context("jsEvent")
, context("ui")
, context("view")
, resolved("_id", "event.id"))
: this.getCallbackFunction(
context("event")
, explicit("dayDelta")
, explicit("minuteDelta")
, context("revertFunc")
, context("jsEvent")
, context("ui")
, context("view")
, resolved("_id", "event.id"))) + ";"
, funcName));
}
@Override
protected void respond(AjaxRequestTarget target) {
AppointmentDao dao = Application.getBean(AppointmentDao.class);
Appointment a = dao.getAppointmentById(
getRequestCycle().getRequest().getRequestParameters().getParameterValue("_id").toLong());
int dayDelta = getRequestCycle().getRequest().getRequestParameters().getParameterValue("dayDelta").toInt();
int minuteDelta = getRequestCycle().getRequest().getRequestParameters().getParameterValue("minuteDelta").toInt();
Calendar cal = WebSession.getCalendar();
if (drop) {
cal.setTime(a.getAppointmentStarttime());
cal.add(Calendar.DATE, dayDelta);
cal.add(Calendar.MINUTE, minuteDelta);
a.setAppointmentStarttime(cal.getTime());
}
cal.setTime(a.getAppointmentEndtime());
cal.add(Calendar.DATE, dayDelta);
cal.add(Calendar.MINUTE, minuteDelta);
a.setAppointmentEndtime(cal.getTime());
dao.updateAppointment(a);
}
}
}