You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/10/04 11:43:13 UTC
svn commit: r1629368 - in /openmeetings/trunk/singlewebapp:
openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/
openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/
openmeetings-db/src/main/java/org/apache/openmeetings...
Author: solomax
Date: Sat Oct 4 09:43:12 2014
New Revision: 1629368
URL: http://svn.apache.org/r1629368
Log:
[OPENMEETINGS-1097] room chat is added
Added:
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png (with props)
Modified:
openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css
openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css
Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java Sat Oct 4 09:43:12 2014
@@ -38,8 +38,30 @@ public class ChatDao {
.getSingleResult();
}
- //TODO additional methods should be added to get messages by external email
- public List<ChatMessage> get(long userId, int start, int count) {
+ //for export
+ public List<ChatMessage> get(int start, int count) {
+ return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+ .setFirstResult(start)
+ .setMaxResults(count)
+ .getResultList();
+ }
+
+ public List<ChatMessage> getGlobal(int start, int count) {
+ return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+ .setFirstResult(start)
+ .setMaxResults(count)
+ .getResultList();
+ }
+
+ public List<ChatMessage> getRoom(long roomId, int start, int count) {
+ return em.createNamedQuery("getChatMessagesByRoom", ChatMessage.class)
+ .setParameter("roomId", roomId)
+ .setFirstResult(start)
+ .setMaxResults(count)
+ .getResultList();
+ }
+
+ public List<ChatMessage> getUser(long userId, int start, int count) {
return em.createNamedQuery("getChatMessagesByUser", ChatMessage.class)
.setParameter("userId", userId)
.setFirstResult(start)
@@ -47,8 +69,10 @@ public class ChatDao {
.getResultList();
}
- public List<ChatMessage> get(int start, int count) {
- return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+ public List<ChatMessage> getUserRecent(long userId, Date date, int start, int count) {
+ return em.createNamedQuery("getChatMessagesByUserTime", ChatMessage.class)
+ .setParameter("userId", userId)
+ .setParameter("date", date)
.setFirstResult(start)
.setMaxResults(count)
.getResultList();
Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java Sat Oct 4 09:43:12 2014
@@ -42,8 +42,13 @@ import org.simpleframework.xml.Root;
@Entity
@NamedQueries({
@NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c WHERE c.id = :id")
- , @NamedQuery(name = "getChatMessagesByUser", query = "SELECT DISTINCT c FROM ChatMessage c WHERE c.fromUser.id = :userId OR c.toUser.id = :userId ORDER BY c.sent ASC")
- , @NamedQuery(name = "getGlobalChatMessages", query = "SELECT DISTINCT c FROM ChatMessage c WHERE c.toUser IS NULL ORDER BY c.sent ASC")
+ , @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c ORDER BY c.id")
+ , @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent ASC")
+ , @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser.id IS NULL AND c.toRoom.id = :roomId ORDER BY c.sent ASC")
+ , @NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+ + "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent ASC")
+ , @NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+ + "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent ASC")
})
@Table(name = "chat")
@Root(name = "ChatMessage")
Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java Sat Oct 4 09:43:12 2014
@@ -191,8 +191,8 @@ public class Room implements IDataProvid
private Boolean hideTopBar = false;
@Column(name = "hide_chat")
- @Element(data = true, required = false)
- private Boolean hideChat = false;
+ @Element(name = "hideChat", data = true, required = false)
+ private boolean hideChat = false;
@Column(name = "hide_activities_and_actions")
@Element(data = true, required = false)
@@ -461,11 +461,11 @@ public class Room implements IDataProvid
this.hideTopBar = hideTopBar;
}
- public Boolean getHideChat() {
+ public boolean isHideChat() {
return hideChat;
}
- public void setHideChat(Boolean hideChat) {
+ public void setHideChat(boolean hideChat) {
this.hideChat = hideChat;
}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Sat Oct 4 09:43:12 2014
@@ -82,9 +82,9 @@ import org.apache.wicket.request.mapper.
import org.apache.wicket.settings.PageSettings;
import org.apache.wicket.util.collections.ConcurrentHashSet;
import org.apache.wicket.util.tester.WicketTester;
-import org.wicketstuff.select2.ApplicationSettings;
import org.slf4j.Logger;
import org.springframework.web.context.support.XmlWebApplicationContext;
+import org.wicketstuff.select2.ApplicationSettings;
import ro.fortsoft.wicket.dashboard.WidgetRegistry;
import ro.fortsoft.wicket.dashboard.web.DashboardContext;
@@ -268,10 +268,38 @@ public class Application extends Authent
return ROOMS.containsKey(roomId) ? ROOMS.get(roomId) : new HashSet<Client>();
}
+ public static Set<Long> getUserRooms(long userId) {
+ Set<Long> result = new HashSet<Long>();
+ for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
+ for (Client c : me.getValue()) {
+ if (c.getUserId() == userId) {
+ result.add(me.getKey());
+ }
+ }
+ }
+ return result;
+ }
+
+ public static boolean isUserInRoom(long roomId, long userId) {
+ if (ROOMS.containsKey(roomId)) {
+ Set<Client> clients = ROOMS.get(roomId);
+ for (Client c : clients) {
+ if (c.getUserId() == userId) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public static boolean isUserOnline(long userId) {
return ONLINE_USERS.containsKey(userId);
}
+ public static Set<Client> getClients(long userId) {
+ return ONLINE_USERS.containsKey(userId) ? ONLINE_USERS.get(userId) : new HashSet<Client>();
+ }
+
//TODO need more safe way FIXME
public <T> T _getBean(Class<T> clazz) {
return getWebApplicationContext(getServletContext()).getBean(clazz);
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html Sat Oct 4 09:43:12 2014
@@ -26,6 +26,7 @@
<title wicket:id="pageTitle">[title]</title>
<link media="screen" type="text/css" rel="stylesheet" href="css/theme_om/jquery-ui-1.10.4.custom.css"/>
<link media="screen" type="text/css" rel="stylesheet" href="css/theme.css"/>
+ <link media="screen" type="text/css" rel="stylesheet" href="css/chat.css"/>
<link media="screen" type="text/css" rel="stylesheet" href="css/forms.css"/>
<link media="screen" type="text/css" rel="stylesheet" href="css/calendar.css"/>
<link media="screen" type="text/css" rel="stylesheet" href="css/admin.css"/>
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Sat Oct 4 09:43:12 2014
@@ -78,6 +78,7 @@ public class MainPage extends BaseInited
private final MarkupContainer contents;
private final AbstractAjaxTimerBehavior areaBehavior;
private final Component dev;
+ private final ChatPanel chat;
public MainPage(PageParameters pp) {
super();
@@ -128,7 +129,7 @@ public class MainPage extends BaseInited
}
topLinks.add(new ExternalLink("bug", "https://issues.apache.org/jira/browse/OPENMEETINGS"));//FIXME hardcoded
- add(new ChatPanel("chatPanel"));
+ add(chat = new ChatPanel("chatPanel"));
add(new WebSocketBehavior() {
private static final long serialVersionUID = 1L;
@@ -226,4 +227,8 @@ public class MainPage extends BaseInited
public WebMarkupContainer getTopLinks() {
return topLinks;
}
+
+ public ChatPanel getChat() {
+ return chat;
+ }
}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html Sat Oct 4 09:43:12 2014
@@ -42,7 +42,13 @@
</ul>
<div id="utab">
<div wicket:id="userList" class="user list">
- <div wicket:id="user" class="user ui-corner-all ui-widget-content"><span wicket:id="name"></span></div>
+ <div wicket:id="user" class="user ui-corner-all ui-widget-content">
+ <div wicket:id="name" class="user name"></div>
+ <div class="user actions">
+ <span wicket:id="privateChat" class="private-chat om-icon align-right clickable" wicket:ommessage="title:1493" onclick="startPrivateChat($(this));"></span>
+ <div class="clear"></div>
+ </div>
+ </div>
</div>
</div>
<div wicket:id="ftab" id="ftab"><div class="file list" wicket:id="tree"></div></div>
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Sat Oct 4 09:43:12 2014
@@ -71,7 +71,6 @@ import org.apache.openmeetings.web.room.
import org.apache.openmeetings.web.room.poll.CreatePollDialog;
import org.apache.openmeetings.web.room.poll.PollResultsDialog;
import org.apache.openmeetings.web.room.poll.VoteDialog;
-import org.apache.openmeetings.web.user.ChatPanel;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -142,6 +141,7 @@ public class RoomPanel extends BasePanel
.toString()
));
broadcast(new RoomMessage(roomId, c.getUserId(), RoomMessage.Type.roomEnter));
+ getMainPage().getChat().roomEnter(roomId, target);
} catch (MalformedURLException e) {
log.error("Error while constructing room parameters", e);
}
@@ -293,6 +293,8 @@ public class RoomPanel extends BasePanel
RoomClient rc = item.getModelObject();
item.setMarkupId(String.format("user%s", rc.c.getUid()));
item.add(new Label("name", rc.u.getFirstname() + " " + rc.u.getLastname()));
+ item.add(AttributeAppender.append("data-userid", rc.u.getId()));
+ item.add(new WebMarkupContainer("privateChat").setVisible(getUserId() != rc.u.getId()));
if (c != null && rc.c.getUid().equals(c.getUid())) {
item.add(AttributeAppender.append("class", "current"));
}
@@ -343,7 +345,6 @@ public class RoomPanel extends BasePanel
updateUserMenuIcons(wsEvent.getHandler());
break;
case roomEnter:
- wsEvent.getHandler().appendJavaScript(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ChatPanel.ID_ROOM_PREFIX, roomId, WebSession.getString(406)));
updateUserMenuIcons(wsEvent.getHandler());
case roomExit:
//TODO check user/remove tab
@@ -410,7 +411,7 @@ public class RoomPanel extends BasePanel
}
});
} catch (Exception e) {
- log.error("Error while sending message", e);
+ log.error("Error while broadcasting message to room", e);
}
}
}
@@ -421,7 +422,7 @@ public class RoomPanel extends BasePanel
try {
reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
} catch (Exception e) {
- log.error("Error while sending message", e);
+ log.error("Error while sending message to room", e);
}
}
}
@@ -486,7 +487,7 @@ public class RoomPanel extends BasePanel
@Override
public void cleanup(AjaxRequestTarget target) {
target.add(getMainPage().getHeader().setVisible(true), getMainPage().getMenu().setVisible(true)
- , getMainPage().getTopLinks().setVisible(true));
+ , getMainPage().getTopLinks().setVisible(true), getMainPage().getChat().setVisible(true));
target.appendJavaScript("$(window).off('resize.openmeetings'); $('.room.video').dialog('destroy');");
}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Sat Oct 4 09:43:12 2014
@@ -16,64 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-function getUserId(uid) { return 'user' + uid; }
-
-function addUser(u, uld) {
- var s = u.firstname + ' ' + u.lastname;
- var d = $('<div class="user ui-corner-all ui-widget-content"></div>').attr('id', getUserId(u.uid))
- .attr('data-id', u.id).text(s);
- if (u.current) {
- d.addClass('current');
- }
- uld.append(d);
- //TODO add activity
-}
-
-function removeUser(id) {
- $('#' + id).remove();//TODO replace with 'ends-with-id'
- //TODO add activity
-}
-
-function roomMessage(m) {
- if (m && m.type == "room") {
- //TODO add timestamp support
- switch (m.msg) {
- case "users":
- var uld = $('.user.list');
- var ulist = [];
- uld.children('[id^="user"]').each(function() {
- ulist.push(this.id);
- });
- for (var i = 0; i < m.users.length; ++i) {
- var u = m.users[i];
- var id = getUserId(u.uid);
- if ($('#' + id).length == 0) {
- addUser(u, uld);
- } else {
- var idx = ulist.indexOf(id);
- if (idx > -1) {
- ulist.splice(idx, 1);
- }
- }
- }
- for (var i = 0; i < ulist.length; ++i) {
- removeUser(ulist[i]);
- }
- break;
- case "addUser":
- var id = getUserId(m.user.uid);
- if ($('#' + id).length == 0) {
- addUser(m.user, $('.user.list'));
- }
- break;
- case "removeUser":
- removeUser(getUserId(m.uid));
- break;
- }
- }
-}
-
function initVideo(_options) {
var options = $.extend({bgcolor: "#ffffff", width: 570, height: 900
, resolutions: JSON.stringify([{label: "4:3 (~6 KByte/sec)", width: 40, height: 30}
@@ -142,4 +84,9 @@ function roomLoad() {
$(".room.wb.area .wb").width(w);
}
});
-}
\ No newline at end of file
+}
+function startPrivateChat(el) {
+ addChatTab('chatTab-u' + el.parent().parent().data("userid"), el.parent().parent().find('.user.name').text());
+ openChat();
+ $('#chatMessage .wysiwyg-editor').click();
+}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Sat Oct 4 09:43:12 2014
@@ -33,7 +33,10 @@
<table style="width: 100%">
<tr>
<td><div id="chatMessage" wicket:id="chatMessage"></div></td>
- <td style="width: 50px"><div wicket:id="send"><wicket:ommessage key="220"/></div></td>
+ <td style="width: 50px">
+ <div wicket:id="send"><wicket:ommessage key="220"/></div>
+ <input type="hidden" wicket:id="activeTab" id="activeChatTab"/>
+ </td>
</tr>
</table>
</form>
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Sat Oct 4 09:43:12 2014
@@ -21,15 +21,25 @@ package org.apache.openmeetings.web.user
import static org.apache.commons.lang3.StringEscapeUtils.unescapeXml;
import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getUserRooms;
+import static org.apache.openmeetings.web.app.Application.isUserInRoom;
import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import java.util.Calendar;
import java.util.Date;
import org.apache.openmeetings.db.dao.basic.ChatDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.basic.ChatMessage;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.BasePanel;
+import org.apache.openmeetings.web.room.RoomPanel;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.json.JSONException;
@@ -41,10 +51,12 @@ import org.apache.wicket.markup.head.Jav
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.head.PriorityHeaderItem;
import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.ws.WebSocketSettings;
import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
+import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import org.red5.logging.Red5LoggerFactory;
@@ -63,33 +75,42 @@ public class ChatPanel extends BasePanel
public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
private static final String ID_ALL = ID_TAB_PREFIX + "all";
- private String getScope(ChatMessage m) {
+ private JSONObject setScope(JSONObject o, ChatMessage m, long curUserId) {
+ String scope, scopeName;
if (m.getToUser() != null) {
- return ID_USER_PREFIX + m.getToUser().getId();
+ User u = curUserId == m.getToUser().getId() ? m.getFromUser() : m.getToUser();
+ scope = ID_USER_PREFIX + u.getId();
+ scopeName = String.format("%s %s", u.getFirstname(), u.getLastname());
} else if (m.getToRoom() != null) {
- return ID_ROOM_PREFIX + m.getToRoom().getId();
+ scope = ID_ROOM_PREFIX + m.getToRoom().getId();
+ scopeName = String.format("%s %s", WebSession.getString(406), m.getToRoom().getId());
} else {
- return ID_ALL;
+ scope = ID_ALL;
+ scopeName = WebSession.getString(1494);
}
+ return o.put("scope", scope).put("scopeName", scopeName);
}
private JSONObject getMessage(ChatMessage m) throws JSONException {
- String msg = m.getMessage();
- msg = msg == null ? msg : " " + msg.replaceAll(" ", " ") + " ";
+ return getMessage(m, getUserId());
+ }
+
+ private JSONObject getMessage(ChatMessage m, long curUserId) throws JSONException {
+ String smsg = m.getMessage();
+ smsg = smsg == null ? smsg : " " + smsg.replaceAll(" ", " ") + " ";
return new JSONObject()
.put("type", "chat")
- .put("msg", new JSONObject()
- .put("id", m.getId())
- .put("scope", getScope(m))
- .put("message", msg)
- .put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
- .put("sent", getDateFormat().format(m.getSent()))
- );
+ .put("msg", setScope(new JSONObject(), m, curUserId)
+ .put("id", m.getId())
+ .put("message", smsg)
+ .put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+ .put("sent", getDateFormat().format(m.getSent())));
}
public ChatPanel(String id) {
super(id);
setOutputMarkupId(true);
+ setOutputMarkupPlaceholderTag(true);
setMarkupId(id);
add(new Behavior() {
@@ -101,7 +122,17 @@ public class ChatPanel extends BasePanel
try {
StringBuilder sb = new StringBuilder();
//FIXME limited count should be loaded with "earlier" link
- for (ChatMessage m : dao.get(0, 30)) {
+ for (ChatMessage m : dao.getGlobal(0, 30)) {
+ sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+ }
+ for(Long roomId : getUserRooms(getUserId())) {
+ for (ChatMessage m : dao.getRoom(roomId, 0, 30)) {
+ sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+ }
+ }
+ Calendar c = WebSession.getCalendar();
+ c.add(Calendar.HOUR_OF_DAY, -1);
+ for (ChatMessage m : dao.getUserRecent(getUserId(), c.getTime(), 0, 30)) {
sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
}
if (sb.length() > 0) {
@@ -115,10 +146,48 @@ public class ChatPanel extends BasePanel
}
});
add(new EmoticonsBehavior(".messageArea"));
- ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
- final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
- add(new Form<Void>("sendForm").add(
- toolbar
+ add(new ChatForm("sendForm"));
+ }
+
+ public void roomEnter(long roomId, AjaxRequestTarget target) {
+ Room r = getBean(RoomDao.class).get(roomId);
+ if (r.isHideChat()) {
+ target.add(setVisible(false));
+ return;
+ }
+ StringBuilder sb = new StringBuilder(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, roomId, WebSession.getString(406)));
+ boolean added = false;
+ sb.append(r.isChatOpened() ? "openChat();" : "closeChat();");
+ for (ChatMessage m : getBean(ChatDao.class).getRoom(roomId, 0, 30)) {
+ added = true;
+ sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+ }
+ if (added) {
+ sb.append("$('.messageArea').emoticonize();");
+ }
+ target.appendJavaScript(sb);
+ }
+
+ private ResourceReference newResourceReference() {
+ return new JavaScriptResourceReference(ChatPanel.class, "chat.js");
+ }
+
+ @Override
+ public void renderHead(IHeaderResponse response) {
+ super.renderHead(response);
+ response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(newResourceReference())));
+ }
+
+ private class ChatForm extends Form<Void> {
+ private static final long serialVersionUID = 1L;
+ private final ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
+ private final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
+ private final HiddenField<String> activeTab = new HiddenField<String>("activeTab", Model.of(""));
+
+ ChatForm(String id) {
+ super(id);
+ add(toolbar
+ , activeTab
, chatMessage.setOutputMarkupId(true)
, new AjaxButton("send") {
private static final long serialVersionUID = 1L;
@@ -130,28 +199,62 @@ public class ChatPanel extends BasePanel
m.setMessage(unescapeXml(chatMessage.getDefaultModelObjectAsString()));
m.setSent(new Date());
m.setFromUser(getBean(UserDao.class).get(getUserId()));
+ try {
+ String scope = activeTab.getModelObject();
+ if (scope != null) {
+ if (ID_ALL.equals(scope)) {
+ //we done
+ } else if (scope.startsWith(ID_ROOM_PREFIX)) {
+ Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+ if (isUserInRoom(r.getId(), getUserId())) {
+ m.setToRoom(r);
+ } else {
+ log.error("It seems like we being hacked!!!!");
+ return;
+ }
+ } else if (scope.startsWith(ID_USER_PREFIX)) {
+ User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+ m.setToUser(u);
+ }
+ }
+ } catch (Exception e) {
+ //no-op
+ }
dao.update(m);
- IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
- for (IWebSocketConnection c : reg.getConnections(getApplication())) {
- try {
- c.sendMessage(getMessage(m).toString());
- } catch(Exception e) {
- log.error("Error while sending message", e);
+ String msg = getMessage(m).toString();
+ if (m.getToRoom() != null) {
+ RoomPanel.sendRoom(m.getToRoom().getId(), msg);
+ } else if (m.getToUser() != null) {
+ IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
+ for (Client c : Application.getClients(getUserId())) {
+ try {
+ reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+ } catch (Exception e) {
+ log.error("Error while sending message to room", e);
+ }
+ }
+ msg = getMessage(m, m.getToUser().getId()).toString();
+ for (Client c : Application.getClients(m.getToUser().getId())) {
+ try {
+ reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+ } catch (Exception e) {
+ log.error("Error while sending message to room", e);
+ }
+ }
+ } else {
+ IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
+ for (IWebSocketConnection c : reg.getConnections(getApplication())) {
+ try {
+ c.sendMessage(msg);
+ } catch(Exception e) {
+ log.error("Error while sending message", e);
+ }
}
}
chatMessage.setDefaultModelObject("");
target.add(chatMessage);
};
- }));
- }
-
- private ResourceReference newResourceReference() {
- return new JavaScriptResourceReference(ChatPanel.class, "chat.js");
- }
-
- @Override
- public void renderHead(IHeaderResponse response) {
- super.renderHead(response);
- response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(newResourceReference())));
+ });
+ }
}
}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js Sat Oct 4 09:43:12 2014
@@ -16,7 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
-var chatTabs, tabTemplate = "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close' role='presentation'></span></li>";
+var chatTabs, tabTemplate = "<li><a href='#{href}'>#{label}</a></li>", closeBlock = "<span class='ui-icon ui-icon-close' role='presentation'></span>"
+ , closedHeight = "16px", openedHeight = "345px";
$(function() {
Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
var m = jQuery.parseJSON(msg);
@@ -25,15 +26,14 @@ $(function() {
case "chat":
addChatMessage(m);
break;
- case "room":
- if (typeof(roomMessage) == "function") {
- roomMessage(m);
- }
- break;
}
}
});
- chatTabs = $("#chatTabs").tabs();
+ chatTabs = $("#chatTabs").tabs({
+ activate: function(event, ui) {
+ $('#activeChatTab').val(ui.newPanel[0].id);
+ }
+ });
// close icon: removing the tab on click
chatTabs.delegate("span.ui-icon-close", "click", function() {
var panelId = $(this).closest("li").remove().attr("aria-controls");
@@ -41,25 +41,49 @@ $(function() {
chatTabs.tabs("refresh");
});
});
+function openChat() {
+ if ($('#chatPanel').height() < 20) {
+ $('#chat #controlBlock #control').removeClass('ui-icon-carat-1-n').addClass('ui-icon-carat-1-s');
+ $('#chatPanel, #chat').animate({height: openedHeight}, 1000);
+ }
+}
+function closeChat() {
+ var chat = $('#chatPanel');
+ if ($('#chatPanel').height() > 20) {
+ $('#chat #controlBlock #control').removeClass('ui-icon-carat-1-s').addClass('ui-icon-carat-1-n');
+ chat.animate({height: "16px"}, 1000);
+ $('#chatPanel, #chat').animate({height: closedHeight}, 1000);
+ }
+}
function toggleChat() {
- var chat = $('#chat');
- $('#chat #controlBlock #control')
- .removeClass('ui-icon-carat-1-' + (chat.height() < 20 ? 'n' : 's'))
- .addClass('ui-icon-carat-1-' + (chat.height() < 20 ? 's' : 'n'));
- chat.animate({ height: chat.height() < 20 ? "380px" : "16px" }, 1000);
+ if ($('#chatPanel').height() < 20) {
+ openChat();
+ } else {
+ closeChat();
+ }
+}
+function activateTab(id) {
+ chatTabs.tabs("option", "active", chatTabs.find('a[href="#' + id + '"]').parent().index());
}
function addChatTab(id, label) {
+ if ($('#' + id).length) {
+ return;
+ }
var li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, label));
+ if (id.indexOf("chatTab-r") != 0) {
+ li.append(closeBlock);
+ }
chatTabs.find(".ui-tabs-nav").append(li);
chatTabs.append("<div class='messageArea' id='" + id + "'></div>");
chatTabs.tabs("refresh");
+ activateTab(id);
}
function addChatMessageInternal(m) {
if (m && m.type == "chat") {
var msg = $('<div><span class="from">' + m.msg.from + '</span><span class="date">'
+ m.msg.sent + '</span>' + m.msg.message + '</div>');
if (!$('#' + m.msg.scope).length) {
- addChatTab(m.scope, 'Test');
+ addChatTab(m.msg.scope, m.msg.scopeName);
}
$('#' + m.msg.scope).append(msg);
msg[0].scrollIntoView();
Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css?rev=1629368&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css Sat Oct 4 09:43:12 2014
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+#chatPanel {
+ position: fixed;
+ z-index: 2000;
+ bottom: 0px;
+ right: 10px;
+ width: 600px;
+ height: 16px;
+}
+#chatPanel #chat {
+ height: 16px;
+ background-color: #F2FAFF; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat .btn-toolbar {
+ margin-top: 2px;
+ margin-bottom: 0;
+ margin-left: 5px;
+}
+#chatPanel #chat #chatTabs.ui-tabs {
+ padding: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav {
+ padding: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li {
+ margin: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li .ui-icon.ui-icon-close {
+ float: left;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ padding: 2px .5em;
+ float: left;
+}
+#chatPanel #chat #controlBlock {
+ background-color: #5294BB; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat #controlBlock:hover {
+ background-color: #2779aa; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat #controlBlock #control {
+ text-align: center;
+ margin-left: 50%;
+ margin-right: 50%;
+}
+#chatPanel #chat .messageArea .date {
+ margin-right: 5px;
+ font-style: italic;
+ font-size: smaller;
+}
+#chatPanel #chat .messageArea .from {
+ margin-left: 5px;
+ margin-right: 5px;
+ font-weight: bold;
+}
+.ui-tabs .ui-tabs-panel.messageArea {
+ height: 165px;
+ overflow-y: auto;
+ padding: 5px;
+}
+#chatMessage .wysiwyg-editor {
+ height: 70px;
+ max-height: 70px;
+}
Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png?rev=1629368&view=auto
==============================================================================
Binary file - no diff available.
Propchange: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css Sat Oct 4 09:43:12 2014
@@ -75,6 +75,19 @@
padding-left: 5px;
padding-top: 5px;
}
+.room.sidebar.left .user.list .user .user.name {
+ line-height: 18px;
+ height: 18px;
+ padding: 0;
+}
+.room.sidebar.left .user.list .user .user.actions {
+ position: relative;
+ height: 18px;
+ padding: 0;
+}
+.private-chat.om-icon {
+ background-image: url(images/page_edit.png);
+}
.room.sidebar.left .tabs, .room.sidebar.left .tabs #utab, .room.sidebar.left .tabs #ftab {
padding: 0;
}
Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css Sat Oct 4 09:43:12 2014
@@ -75,59 +75,6 @@ html, body {
font-size: 1em;
color: #FF0000;
}
-
-#chatPanel {
- position: fixed;
- z-index: 2000;
- bottom: 0px;
- right: 10px;
- width: 600px;
-}
-#chatPanel #chat {
- height: 10px;
- background-color: #F2FAFF;
-}
-#chatPanel #chat #chatTabs.ui-tabs {
- padding: 0;
-}
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav {
- padding: 0;
-}
-#chatPanel #chat #chatTabs..ui-tabs .ui-tabs-nav li {
- margin: 0;
-}
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- padding: 2px .5em;
-}
-#chatPanel #chat #controlBlock {
- background-color: #5294BB;
-}
-#chatPanel #chat #controlBlock:hover {
- background-color: #2779aa;
-}
-#chatPanel #chat #controlBlock #control {
- text-align: center;
- margin-left: 50%;
- margin-right: 50%;
-}
-#chatPanel #chat .messageArea .date {
- margin-right: 5px;
- font-style: italic;
- font-size: smaller;
-}
-#chatPanel #chat .messageArea .from {
- margin-left: 5px;
- margin-right: 5px;
- font-weight: bold;
-}
-.messageArea {
- height: 165px;
- overflow-y: auto;
-}
-#chatMessage .wysiwyg-editor {
- height: 70px;
- max-height: 70px;
-}
.clickable {
cursor: pointer;
}