blob: b252f648250a56ef3049bee68be9c1de25b60721 [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.user.calendar;
import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
import static org.apache.openmeetings.web.app.Application.getBean;
import static org.apache.openmeetings.web.app.WebSession.getLanguage;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import static org.apache.openmeetings.web.util.CalendarWebHelper.getDate;
import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
import static org.apache.openmeetings.web.util.RoomTypeDropDown.getRoomTypes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
import org.apache.openmeetings.db.dao.calendar.AppointmentReminderTypDao;
import org.apache.openmeetings.db.dao.room.RoomDao;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.calendar.Appointment;
import org.apache.openmeetings.db.entity.calendar.AppointmentReminderTyps;
import org.apache.openmeetings.db.entity.calendar.MeetingMember;
import org.apache.openmeetings.db.entity.room.Room;
import org.apache.openmeetings.db.entity.room.RoomType;
import org.apache.openmeetings.db.entity.user.Organisation_Users;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.OmDateTimePicker;
import org.apache.openmeetings.web.pages.MainPage;
import org.apache.openmeetings.web.user.rooms.RoomEnterBehavior;
import org.apache.openmeetings.web.util.FormatHelper;
import org.apache.openmeetings.web.util.RoomTypeDropDown;
import org.apache.openmeetings.web.util.UserMultiChoice;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.CollectionModel;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.threeten.bp.LocalDateTime;
import com.googlecode.wicket.jquery.core.Options;
import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.toolbar.DefaultWysiwygToolbar;
import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
import com.googlecode.wicket.kendo.ui.form.datetime.local.DateTimePicker;
import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
public class AppointmentDialog extends AbstractFormDialog<Appointment> {
private static final long serialVersionUID = 1L;
private static final Logger log = Red5LoggerFactory.getLogger(AppointmentDialog.class, webAppRootKey);
private AppointmentForm form;
private DialogButton save = new DialogButton("save", Application.getString(813));
private DialogButton cancel = new DialogButton("cancel", Application.getString(1130));
private DialogButton delete = new DialogButton("delete", Application.getString(814));
private DialogButton enterRoom = new DialogButton("enterRoom", Application.getString(1282));
private final CalendarPanel calendarPanel;
private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
final MessageDialog confirmDelete;
private IModel<Collection<User>> attendeesModel = new CollectionModel<User>(new ArrayList<User>());
@Override
public int getWidth() {
return 650;
}
public void setModelObjectWithAjaxTarget(Appointment a, AjaxRequestTarget target) {
form.setModelObject(a);
form.start.setModelObject(getDateTime(a.getStart()));
form.end.setModelObject(getDateTime(a.getEnd()));
form.setEnabled(isOwner(a));
log.debug(" -- setModelObjectWithAjaxTarget -- Current model " + a);
if (a.getId() != null) {
delete.setVisible(isOwner(a), target);
enterRoom.setVisible(a.getRoom() != null, target);
} else {
delete.setVisible(false, target);
enterRoom.setVisible(false, target);
}
save.setVisible(isOwner(a), target);
super.setModelObject(a);
}
public AppointmentDialog(String id, String title, CalendarPanel calendarPanel, CompoundPropertyModel<Appointment> model) {
super(id, title, model, true);
log.debug(" -- AppointmentDialog -- Current model " + getModel().getObject());
this.calendarPanel = calendarPanel;
setOutputMarkupId(true);
form = new AppointmentForm("appForm", model);
add(form);
confirmDelete = new MessageDialog("confirmDelete", Application.getString(814), Application.getString(833), DialogButtons.OK_CANCEL, DialogIcon.WARN){
private static final long serialVersionUID = 1L;
public void onClose(IPartialPageRequestHandler target, DialogButton button) {
if (button != null && button.match(AbstractDialog.OK)){
deleteAppointment(target);
}
}
};
add(confirmDelete);
}
protected void deleteAppointment(IPartialPageRequestHandler target) {
getBean(AppointmentDao.class).delete(getModelObject(), getUserId());
calendarPanel.refresh(target);
}
@Override
protected List<DialogButton> getButtons() {
return Arrays.asList(enterRoom, save, delete, cancel);
}
@Override
protected DialogButton getSubmitButton() {
return save;
}
@Override
public Form<?> getForm() {
return this.form;
}
@Override
protected void onOpen(IPartialPageRequestHandler target) {
target.add(this.form);
}
@Override
public void onClose(IPartialPageRequestHandler target, DialogButton button) {
if (delete.equals(button)) {
confirmDelete.open(target);
} else if (enterRoom.equals(button)) {
RoomEnterBehavior.roomEnter((MainPage)getPage(), target, getModelObject().getRoom().getRooms_id());
}
}
@Override
protected void onError(AjaxRequestTarget target) {
target.add(feedback);
}
@Override
protected void onSubmit(AjaxRequestTarget target) {
Appointment a = form.getModelObject();
final List<MeetingMember> attendees = a.getMeetingMembers() == null ? new ArrayList<MeetingMember>() : a.getMeetingMembers();
Set<Long> currentIds = new HashSet<Long>();
for (User u : attendeesModel.getObject()) {
if (u.getUser_id() != null) {
currentIds.add(u.getUser_id());
}
}
//remove users
for (Iterator<MeetingMember> i = attendees.iterator(); i.hasNext();) {
MeetingMember m = i.next();
if (!currentIds.contains(m.getUser().getUser_id())) {
i.remove();
}
}
Set<Long> originalIds = new HashSet<Long>();
for (MeetingMember m : attendees) {
originalIds.add(m.getUser().getUser_id());
}
//add users
for (User u : attendeesModel.getObject()) {
if (u.getUser_id() == null || !originalIds.contains(u.getUser_id())) {
MeetingMember mm = new MeetingMember();
mm.setUser(u);
mm.setDeleted(false);
mm.setInserted(a.getInserted());
mm.setUpdated(a.getUpdated());
mm.setAppointment(a);
attendees.add(mm);
}
}
a.setMeetingMembers(attendees);
a.setStart(getDate(form.start.getModelObject()));
a.setEnd(getDate(form.end.getModelObject()));
getBean(AppointmentDao.class).update(a, getUserId());
target.add(feedback);
calendarPanel.refresh(target);
}
public static boolean isOwner(Appointment object) {
return object.getOwner() != null && getUserId() == object.getOwner().getUser_id();
}
@Override
protected void onDetach() {
attendeesModel.detach();
super.onDetach();
}
private class AppointmentForm extends Form<Appointment> {
private static final long serialVersionUID = 1L;
private boolean createRoom = true;
private final DateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
private final PasswordTextField pwd = new PasswordTextField("password");
private final Label owner = new Label("aowner", Model.of(""));
private final DropDownChoice<RoomType> roomType = new RoomTypeDropDown("room.roomtype");
private final DropDownChoice<Room> room = new DropDownChoice<Room>(
"room"
, getRoomList()
, new ChoiceRenderer<Room>("name", "rooms_id"));
@Override
protected void onModelChanged() {
super.onModelChanged();
Appointment a = getModelObject();
List<AppointmentReminderTyps> remindTypes = getRemindTypes();
if (a.getRemind() == null && !remindTypes.isEmpty()) {
a.setRemind(remindTypes.get(0));
}
List<RoomType> roomTypes = getRoomTypes();
if (a.getRoom() == null) {
Room r = new Room();
r.setAppointment(true);
a.setRoom(r);
}
if (a.getRoom().getRoomtype() == null && !roomTypes.isEmpty()) {
a.getRoom().setRoomtype(roomTypes.get(0));
}
createRoom = Boolean.TRUE.equals(a.getRoom().getAppointment());
roomType.setEnabled(createRoom);
room.setEnabled(!createRoom);
if (a.getId() == null) {
java.util.Calendar start = WebSession.getCalendar();
start.setTime(a.getStart());
java.util.Calendar end = WebSession.getCalendar();
end.setTime(a.getEnd());
if (start.equals(end)) {
end.add(java.util.Calendar.HOUR_OF_DAY, 1);
a.setEnd(end.getTime());
}
}
attendeesModel.setObject(new ArrayList<User>());
if (a.getMeetingMembers() != null) {
for (MeetingMember mm : a.getMeetingMembers()) {
attendeesModel.getObject().add(mm.getUser());
}
}
pwd.setEnabled(a.isPasswordProtected());
owner.setOutputMarkupPlaceholderTag(true).setOutputMarkupId(true);
owner.setDefaultModel(Model.of(FormatHelper.formatUser(a.getOwner())));
owner.setVisible(!isOwner(a));
}
public AppointmentForm(String id, CompoundPropertyModel<Appointment> model) {
super(id, model);
setOutputMarkupId(true);
add(feedback.setOutputMarkupId(true));
add(new RequiredTextField<String>("title").setLabel(Model.of(Application.getString(572))));
DefaultWysiwygToolbar toolbar = new DefaultWysiwygToolbar("toolbarContainer");
add(toolbar);
add(new WysiwygEditor("description", toolbar));
add(new TextField<String>("location"));
add(start);
add(end);
pwd.setEnabled(getModelObject().isPasswordProtected());
pwd.setOutputMarkupId(true);
add(pwd);
List<AppointmentReminderTyps> remindTypes = getRemindTypes();
add(new DropDownChoice<AppointmentReminderTyps>(
"remind"
, remindTypes
, new ChoiceRenderer<AppointmentReminderTyps>() {
private static final long serialVersionUID = 1L;
@Override
public Object getDisplayValue(AppointmentReminderTyps object) {
return getString("" + object.getFieldvalues_id());
}
@Override
public String getIdValue(AppointmentReminderTyps object, int index) {
return "" + object.getTypId();
}
}));
add(roomType.setEnabled(createRoom).setOutputMarkupId(true));
add(room.setRequired(true).setLabel(Model.of(Application.getString(406))).setEnabled(!createRoom).setOutputMarkupId(true));
add(new AjaxCheckBox("createRoom", new PropertyModel<Boolean>(this, "createRoom")) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
createRoom = getConvertedInput();
target.add(roomType.setEnabled(createRoom), room.setEnabled(!createRoom));
}
});
add(new AjaxCheckBox("passwordProtected") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
AppointmentForm.this.getModelObject().setPasswordProtected(getConvertedInput());
pwd.setEnabled(AppointmentForm.this.getModelObject().isPasswordProtected());
target.add(pwd);
}
});
add(new UserMultiChoice("attendees", attendeesModel));
add(owner);
}
private List<AppointmentReminderTyps> getRemindTypes() {
return getBean(AppointmentReminderTypDao.class).getAppointmentReminderTypList(getLanguage());
}
private List<Room> getRoomList() {
//FIXME need to be reviewed
List<Room> result = new ArrayList<Room>();
RoomDao dao = getBean(RoomDao.class);
result.addAll(dao.getPublicRooms());
for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
result.addAll(dao.getOrganisationRooms(ou.getOrganisation().getOrganisation_id()));
}
if (getModelObject().getRoom() != null && getModelObject().getRoom().getAppointment()) { //FIXME review
result.add(getModelObject().getRoom());
}
return result;
}
@Override
protected void onValidate() {
if (end.getConvertedInput().isBefore(start.getConvertedInput())) {
error(Application.getString(1592));
}
}
}
}