blob: af67fe20d51a2af7d65314423d1a64ba2d5f984f [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.profile;
import static org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
import static org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;
import static org.apache.openmeetings.web.app.Application.getBean;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import static org.apache.openmeetings.web.util.CalendarWebHelper.getZoneId;
import static org.apache.openmeetings.web.util.RoomTypeDropDown.getRoomTypes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.openmeetings.data.conference.InvitationManager;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
import org.apache.openmeetings.db.dao.room.RoomDao;
import org.apache.openmeetings.db.dao.user.PrivateMessagesDao;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.calendar.Appointment;
import org.apache.openmeetings.db.entity.calendar.MeetingMember;
import org.apache.openmeetings.db.entity.room.Invitation;
import org.apache.openmeetings.db.entity.room.Invitation.Valid;
import org.apache.openmeetings.db.entity.room.Room;
import org.apache.openmeetings.db.entity.user.PrivateMessage;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.db.entity.user.User.Type;
import org.apache.openmeetings.mail.MailHandler;
import org.apache.openmeetings.util.CalendarHelper;
import org.apache.openmeetings.util.LinkHelper;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.common.OmDateTimePicker;
import org.apache.openmeetings.web.util.CalendarWebHelper;
import org.apache.openmeetings.web.util.ContactsHelper;
import org.apache.openmeetings.web.util.RoomTypeDropDown;
import org.apache.openmeetings.web.util.UserMultiChoice;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
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.util.CollectionModel;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.ZonedDateTime;
import org.threeten.bp.temporal.ChronoUnit;
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.AbstractFormDialog;
import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
import com.googlecode.wicket.kendo.ui.form.datetime.local.DateTimePicker;
import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
public class MessageDialog extends AbstractFormDialog<PrivateMessage> {
private static final long serialVersionUID = 1L;
private final Form<PrivateMessage> form;
private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
DialogButton send = new DialogButton("send", Application.getString(218));
private DialogButton cancel = new DialogButton("cancel", Application.getString(219));
private final WebMarkupContainer roomParamsBlock = new WebMarkupContainer("roomParamsBlock");
private final WebMarkupContainer roomParams = new WebMarkupContainer("roomParams");
private final DateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
private boolean isPrivate = false;
private final IModel<Collection<User>> modelTo = new CollectionModel<User>(new ArrayList<User>());
@Override
public int getWidth() {
return 650;
}
public void open(IPartialPageRequestHandler target, long userId) {
getModelObject().setTo(getBean(UserDao.class).get(userId));
open(target);
}
public MessageDialog reset(boolean isPrivate) {
//TODO should be 'in sync' with appointment
LocalDateTime now = ZonedDateTime.now(getZoneId()).toLocalDateTime();
start.setModelObject(now);
end.setModelObject(now.plus(1, ChronoUnit.HOURS));
modelTo.setObject(new ArrayList<User>());
PrivateMessage p = new PrivateMessage();
p.setFrom(getBean(UserDao.class).get(getUserId()));
p.setOwner(p.getFrom());
p.setIsRead(false);
p.setFolderId(INBOX_FOLDER_ID);
Room r = new Room();
r.setAppointment(true);
r.setRoomtype(getRoomTypes().get(0));
p.setRoom(r);
setModelObject(p);
roomParams.setVisible(getModelObject().isBookedRoom());
form.setModelObject(p);
this.isPrivate = isPrivate;
return this;
}
@Override
protected void onOpen(IPartialPageRequestHandler target) {
if (getModel().getObject().getTo() != null) {
modelTo.getObject().add(getModel().getObject().getTo());
}
target.add(form);
super.onOpen(target);
}
public MessageDialog(String id, CompoundPropertyModel<PrivateMessage> model) {
super(id, Application.getString(1209), model);
form = new Form<PrivateMessage>("form", getModel());
form.add(feedback.setOutputMarkupId(true));
form.add(new UserMultiChoice("to", modelTo).setRequired(true));
form.add(new TextField<String>("subject"));
DefaultWysiwygToolbar toolbar = new DefaultWysiwygToolbar("toolbarContainer");
form.add(toolbar);
form.add(new WysiwygEditor("message", toolbar));
form.add(roomParamsBlock.setOutputMarkupId(true));
final CheckBox bookedRoom = new CheckBox("bookedRoom");
form.add(bookedRoom.setOutputMarkupId(true).add(new AjaxEventBehavior("click") {
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
PrivateMessage p = MessageDialog.this.getModelObject();
p.setBookedRoom(!p.isBookedRoom());
roomParams.setVisible(p.isBookedRoom());
target.add(bookedRoom, roomParamsBlock);
}
}));
roomParamsBlock.add(roomParams);
roomParams.add(new RoomTypeDropDown("room.roomtype"));
roomParams.add(start);
roomParams.add(end);
add(form.setOutputMarkupId(true));
}
@Override
protected List<DialogButton> getButtons() {
return Arrays.asList(send, cancel);
}
@Override
protected DialogButton getSubmitButton() {
return send;
}
@Override
public Form<PrivateMessage> getForm() {
return form;
}
@Override
protected void onError(AjaxRequestTarget target) {
target.add(feedback);
}
@Override
protected void onSubmit(AjaxRequestTarget target) {
PrivateMessage p = getModelObject();
p.setInserted(new Date());
UserDao userDao = getBean(UserDao.class);
User owner = userDao.get(getUserId());
if (p.isBookedRoom()) {
Room r = p.getRoom();
r.setName(p.getSubject());
r.setComment("");
r.setNumberOfPartizipants(100L);
r.setAppointment(true);
r.setAllowUserQuestions(true);
r.setAllowFontStyles(true);
r = getBean(RoomDao.class).update(r, getUserId());
Appointment a = new Appointment();
a.setTitle(p.getSubject());
a.setDescription(p.getMessage());
a.setRoom(r);
a.setStart(CalendarWebHelper.getDate(start.getModelObject()));
a.setEnd(CalendarWebHelper.getDate(end.getModelObject()));
List<MeetingMember> attendees = new ArrayList<>();
for (User to : modelTo.getObject()) {
MeetingMember mm = new MeetingMember();
mm.setUser(to);
mm.setDeleted(false);
mm.setInserted(a.getInserted());
mm.setUpdated(a.getUpdated());
mm.setAppointment(a);
attendees.add(mm);
}
a.setOwner(owner);
a.setMeetingMembers(attendees);
getBean(AppointmentDao.class).update(a, getUserId(), false);
p.setRoom(r);
} else {
p.setRoom(null);
}
PrivateMessagesDao msgDao = getBean(PrivateMessagesDao.class);
for (User to : modelTo.getObject()) {
if (to.getUser_id() == null) {
userDao.update(to, getUserId());
}
//to send
p = new PrivateMessage(p);
p.setTo(to);
p.setFolderId(SENT_FOLDER_ID);
msgDao.update(p, getUserId());
//to inbox
p = new PrivateMessage(p);
p.setOwner(to);
p.setFolderId(INBOX_FOLDER_ID);
msgDao.update(p, getUserId());
if (to.getAdresses() != null) {
String aLinkHTML = (isPrivate && to.getType() == Type.user) ? "<br/><br/>" + "<a href='" + ContactsHelper.getLink() + "'>"
+ Application.getString(1302, to.getLanguage_id()) + "</a><br/>" : "";
String invitation_link = "";
if (p.isBookedRoom()) {
Invitation i = getBean(InvitationManager.class).getInvitation(to, p.getRoom(),
false, null, Valid.Period, owner, to.getLanguage_id()
, CalendarHelper.getDate(start.getModelObject(), to.getTimeZoneId())
, CalendarHelper.getDate(end.getModelObject(), to.getTimeZoneId()), null);
invitation_link = LinkHelper.getInvitationLink(getBean(ConfigurationDao.class).getBaseUrl(), i);
if (invitation_link == null) {
invitation_link = "";
} else {
invitation_link = "<br/>" //
+ Application.getString(503, to.getLanguage_id())
+ "<br/><a href='" + invitation_link
+ "'>"
+ Application.getString(504, to.getLanguage_id()) + "</a><br/>";
}
}
getBean(MailHandler.class).send(to.getAdresses().getEmail(),
Application.getString(1301, to.getLanguage_id()) + p.getSubject(),
(p.getMessage() == null ? "" : p.getMessage().replaceAll("\\<.*?>", "")) + aLinkHTML + invitation_link);
}
}
}
@Override
protected void onDetach() {
modelTo.detach();
super.onDetach();
}
}