Repository: openmeetings
Updated Branches:
  refs/heads/4.0.x e215e9be4 -> a65837460


[OPENMEETINGS-1769] chat toolbar buttons are generalized


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/a6583746
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/a6583746
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/a6583746

Branch: refs/heads/4.0.x
Commit: a65837460b0e8731308e0ea145efb704e73dd624
Parents: e215e9b
Author: Maxim Solodovnik <[email protected]>
Authored: Wed Nov 29 13:31:17 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Wed Nov 29 13:31:17 2017 +0700

----------------------------------------------------------------------
 .../org/apache/openmeetings/web/common/main.js  |  28 +++++
 .../web/room/activities/activities.js           |   1 +
 .../apache/openmeetings/web/room/room-base.js   |  28 -----
 .../apache/openmeetings/web/room/wb/wb-area.js  |  22 ++--
 .../apache/openmeetings/web/room/wb/wb-board.js |   4 +-
 .../apache/openmeetings/web/user/chat/Chat.html |   8 +-
 .../apache/openmeetings/web/user/chat/Chat.java | 123 +------------------
 .../openmeetings/web/user/chat/ChatForm.java    | 123 +++++++++++++++++++
 .../openmeetings/web/user/chat/ChatToolbar.html |   6 +-
 .../openmeetings/web/user/chat/ChatToolbar.java |  62 +++++++++-
 .../openmeetings/web/user/chat/chat-base.js     |  13 +-
 openmeetings-web/src/main/webapp/css/chat.css   |  26 ++--
 .../src/main/webapp/css/general-rtl.css         |   4 +
 13 files changed, 262 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
index 3dd0ac8..9fa9b08 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
@@ -22,6 +22,34 @@ var Settings = (function() {
                , save: _save
        };
 })();
+var OmUtil = (function() {
+       const self = {};
+       function _confirmDlg(_id, okHandler) {
+               const confirm = $('#' + _id);
+               confirm.dialog({
+                       modal: true
+                       , buttons: [
+                               {
+                                       text: confirm.data('btn-ok')
+                                       , click: function() {
+                                               okHandler();
+                                               $(this).dialog('close');
+                                       }
+                               }
+                               , {
+                                       text: confirm.data('btn-cancel')
+                                       , click: function() {
+                                               $(this).dialog('close');
+                                       }
+                               }
+                       ]
+               });
+               return confirm;
+       }
+
+       self.confirmDlg = _confirmDlg;
+       return self;
+})();
 Wicket.BrowserInfo.collectExtraInfo = function(info) {
        const l = window.location;
        info.codebase = l.origin + l.pathname;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
index bed035f..d528ff9 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
@@ -108,6 +108,7 @@ var Activities = function() {
                }
                , findUser: _findUser
                , add: function(obj) {
+                       if (!inited) return;
                        const _id = _getId(obj.id);
                        area.append($('#activity-stub').clone().attr('id', 
_id).data(obj));
                        const a = $('#' + _id).addClass(obj.cssClass);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room-base.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room-base.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room-base.js
index edafe4c..36f2d44 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room-base.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room-base.js
@@ -3,34 +3,6 @@ const WB_AREA_SEL = '.room.wb.area';
 const WBA_WB_SEL = '.room.wb.area 
.ui-tabs-panel.ui-corner-bottom.ui-widget-content:visible';
 var WBA_SEL = WB_AREA_SEL;
 const VID_SEL = '.video.user-video';
-var RoomUtil = (function() {
-       const self = {};
-       function _confirmDlg(_id, okHandler) {
-               const confirm = $('#' + _id);
-               confirm.dialog({
-                       modal: true
-                       , buttons: [
-                               {
-                                       text: confirm.data('btn-ok')
-                                       , click: function() {
-                                               okHandler();
-                                               $(this).dialog('close');
-                                       }
-                               }
-                               , {
-                                       text: confirm.data('btn-cancel')
-                                       , click: function() {
-                                               $(this).dialog('close');
-                                       }
-                               }
-                       ]
-               });
-               return confirm;
-       }
-
-       self.confirmDlg = _confirmDlg;
-       return self;
-})();
 var VideoUtil = (function() {
        const self = {};
        function _getVid(uid) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
index 833ac54..a4251cd 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-area.js
@@ -24,13 +24,13 @@ var DrawWbArea = function() {
                if (role !== PRESENTER || !canvas) {
                        return true;
                }
-               const arr = [];
-               canvas.getActiveObjects().forEachObject(function(o) {
+               const arr = [], objs = canvas.getActiveObjects();
+               for (let i =0; i < objs.length; ++i) {
                        arr.push({
-                               uid: o.uid
-                               , slide: o.slide
+                               uid: objs[i].uid
+                               , slide: objs[i].slide
                        });
-               });
+               }
                wbAction('deleteObj', JSON.stringify({
                        wbId: wb.id
                        , obj: arr
@@ -38,10 +38,12 @@ var DrawWbArea = function() {
                return false;
        }
        function _deleteHandler(e) {
-               switch (e.which) {
-                       case 8:  // backspace
-                       case 46: // delete
-                               return _performDelete();
+               if ('BODY' === e.target.tagName) {
+                       switch (e.which) {
+                               case 8:  // backspace
+                               case 46: // delete
+                                       return _performDelete();
+                       }
                }
        }
        function _getWbTab(wbId) {
@@ -80,7 +82,7 @@ var DrawWbArea = function() {
                }
                li.append($('#wb-tab-close').clone().attr('id', ''));
                li.find('button').click(function() {
-                       RoomUtil.confirmDlg('wb-confirm-remove', function() { 
wbAction('removeWb', JSON.stringify({wbId: li.data().wbId})); });
+                       OmUtil.confirmDlg('wb-confirm-remove', function() { 
wbAction('removeWb', JSON.stringify({wbId: li.data().wbId})); });
                });
        }
        function _getImage(cnv, fmt) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
index af077eb..f846e13 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
@@ -95,7 +95,7 @@ var Wb = function() {
                switch (role) {
                        case PRESENTER:
                                clearAll.click(function() {
-                                       
RoomUtil.confirmDlg('clear-all-confirm', function() { wbAction('clearAll', 
JSON.stringify({wbId: wb.id})); });
+                                       OmUtil.confirmDlg('clear-all-confirm', 
function() { wbAction('clearAll', JSON.stringify({wbId: wb.id})); });
                                }).removeClass('disabled');
                                z.find('.curr-slide').change(function() {
                                        _setSlide($(this).val() - 1);
@@ -127,7 +127,7 @@ var Wb = function() {
                                        s.show();
                                });
                                t.find('.om-icon.clear-slide').click(function() 
{
-                                       
RoomUtil.confirmDlg('clear-slide-confirm', function() { wbAction('clearSlide', 
JSON.stringify({wbId: wb.id, slide: slide})); });
+                                       
OmUtil.confirmDlg('clear-slide-confirm', function() { wbAction('clearSlide', 
JSON.stringify({wbId: wb.id, slide: slide})); });
                                });
                                t.find('.om-icon.save').click(function() {
                                        wbAction('save', JSON.stringify({wbId: 
wb.id}));

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
index fec0873..ba5e7a6 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.html
@@ -26,13 +26,7 @@
                <div id="chatTab-all" class="messageArea"></div>
        </div>
        <form wicket:id="sendForm">
-               <div style="display: inline-block;" 
wicket:id="toolbarContainer"></div>
-               <div class="clickable chat-btn ui-state-default ui-corner-all" 
wicket:enclosure="ajax-cancel-button">
-                       <div class="formCancelButton" 
wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
-               </div>
-               <div class="clickable chat-btn ui-state-default ui-corner-all">
-                       <div class="audio om-icon" 
wicket:message="data-sound-enabled:sound.mute,data-sound-muted:sound.enable">&nbsp;</div>
-               </div>
+               <div wicket:id="toolbarContainer"></div>
                <table style="width: 100%">
                        <tr>
                                <td><div id="chatMessage" 
wicket:id="chatMessage"></div></td>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
index 6b9c3fe..5b5f8fd 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
@@ -18,17 +18,12 @@
  */
 package org.apache.openmeetings.web.user.chat;
 
-import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ALL;
 import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ROOM_PREFIX;
-import static org.apache.openmeetings.core.util.WebSocketHelper.ID_USER_PREFIX;
-import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
 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.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
 import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
@@ -42,17 +37,13 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
-import org.apache.openmeetings.core.remote.MobileService;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 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.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -60,17 +51,13 @@ import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 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.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
 import com.github.openjson.JSONObject;
-import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
-import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 
 public class Chat extends Panel {
        private static final long serialVersionUID = 1L;
@@ -123,12 +110,12 @@ public class Chat extends Panel {
                return findParent(MainPanel.class).getClient().getUid();
        }
 
-       public JSONObject getMessage(List<ChatMessage> list) {
+       public static JSONObject getMessage(List<ChatMessage> list) {
                return getMessage(getUserId(), list);
        }
 
-       public JSONObject getMessage(Long userId, List<ChatMessage> list) {
-               return WebSocketHelper.getMessage(userId, list, 
getDateFormat(), (o, u) -> o.put("img", getUrl(getRequestCycle(), u)));
+       public static JSONObject getMessage(Long userId, List<ChatMessage> 
list) {
+               return WebSocketHelper.getMessage(userId, list, 
getDateFormat(), (o, u) -> o.put("img", getUrl(RequestCycle.get(), u)));
        }
 
        public static CharSequence getReinit() {
@@ -170,108 +157,6 @@ public class Chat extends Panel {
                }
        }
 
-       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<>("activeTab", Model.of(""));
-
-               ChatForm(String id) {
-                       super(id);
-                       add(toolbar
-                               , activeTab
-                               , chatMessage.setOutputMarkupId(true)
-                               , new AjaxButton("send") {
-                                       private static final long 
serialVersionUID = 1L;
-
-                                       @Override
-                                       protected void 
onSubmit(AjaxRequestTarget target) {
-                                               ChatDao dao = 
getBean(ChatDao.class);
-                                               ChatMessage m = new 
ChatMessage();
-                                               
m.setMessage(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 are being hacked!!!!");
-                                                                               
return;
-                                                                       }
-                                                                       
m.setNeedModeration(r.isChatModerated() && 
!isModerator(m.getFromUser().getId(), r.getId()));
-                                                               } 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);
-                                               JSONObject msg = 
getMessage(Arrays.asList(m));
-                                               if (m.getToRoom() != null) {
-                                                       
getBean(MobileService.class).sendChatMessage(getUid(), m, getDateFormat()); 
//let's send to mobile users
-                                                       
WebSocketHelper.sendRoom(m, msg);
-                                               } else if (m.getToUser() != 
null) {
-                                                       
WebSocketHelper.sendUser(getUserId(), msg.toString());
-                                                       msg = 
getMessage(m.getToUser().getId(), Arrays.asList(m));
-                                                       
WebSocketHelper.sendUser(m.getToUser().getId(), msg.toString());
-                                               } else {
-                                                       
WebSocketHelper.sendAll(msg.toString());
-                                               }
-                                               
chatMessage.setDefaultModelObject("");
-                                               
target.appendJavaScript("Chat.clean();");
-                                       };
-                               });
-               }
-
-               @Override
-               protected void onInitialize() {
-                       super.onInitialize();
-                       ConfirmableAjaxBorder delBtn = new 
ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), 
this) {
-                               private static final long serialVersionUID = 1L;
-
-                               @Override
-                               protected void onSubmit(AjaxRequestTarget 
target) {
-                                       ChatDao dao = getBean(ChatDao.class);
-                                       String scope = 
activeTab.getModelObject();
-                                       boolean clean = false;
-                                       try {
-                                               if (scope == null || 
ID_ALL.equals(scope)) {
-                                                       scope = ID_ALL;
-                                                       dao.deleteGlobal();
-                                                       clean = true;
-                                               } else if 
(scope.startsWith(ID_ROOM_PREFIX)) {
-                                                       Room r = 
getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
-                                                       if (r != null) {
-                                                               
dao.deleteRoom(r.getId());
-                                                               clean = true;
-                                                       }
-                                               } else if 
(scope.startsWith(ID_USER_PREFIX)) {
-                                                       User u = 
getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
-                                                       if (u != null) {
-                                                               
dao.deleteUser(u.getId());
-                                                               clean = true;
-                                                       }
-                                               }
-                                       } catch (Exception e) {
-                                               //no-op
-                                       }
-                                       if (clean) {
-                                               target.appendJavaScript("$('#" 
+ scope + "').html('')");
-                                       }
-                               }
-                       };
-                       add(delBtn.setVisible(hasAdminLevel(getRights())));
-               }
-       }
-
        public boolean isShowDashboardChat() {
                return showDashboardChat;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
new file mode 100644
index 0000000..10c174c
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -0,0 +1,123 @@
+/*
+ * 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.chat;
+
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ALL;
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ROOM_PREFIX;
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_USER_PREFIX;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
+import static org.apache.openmeetings.web.app.Application.getBean;
+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 static org.apache.openmeetings.web.room.RoomPanel.isModerator;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import org.apache.openmeetings.core.remote.MobileService;
+import org.apache.openmeetings.core.util.WebSocketHelper;
+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.common.MainPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.Model;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import com.github.openjson.JSONObject;
+import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
+import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
+
+public class ChatForm extends Form<Void> {
+       private static final long serialVersionUID = 1L;
+       private static final Logger log = 
Red5LoggerFactory.getLogger(ChatForm.class, getWebAppRootKey());
+       private final HiddenField<String> activeTab = new 
HiddenField<>("activeTab", Model.of(""));
+
+       public ChatForm(String id) {
+               super(id);
+               final ChatToolbar toolbar = new ChatToolbar("toolbarContainer", 
this);
+               final WysiwygEditor chatMessage = new 
WysiwygEditor("chatMessage", Model.of(""), toolbar);
+               add(toolbar
+                       , activeTab
+                       , chatMessage.setOutputMarkupId(true)
+                       , new AjaxButton("send") {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               protected void onSubmit(AjaxRequestTarget 
target) {
+                                       ChatDao dao = getBean(ChatDao.class);
+                                       ChatMessage m = new ChatMessage();
+                                       
m.setMessage(chatMessage.getDefaultModelObjectAsString());
+                                       m.setSent(new Date());
+                                       
m.setFromUser(getBean(UserDao.class).get(getUserId()));
+                                       try {
+                                               String scope = getScope();
+                                               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 are being hacked!!!!");
+                                                                       return;
+                                                               }
+                                                               
m.setNeedModeration(r.isChatModerated() && 
!isModerator(m.getFromUser().getId(), r.getId()));
+                                                       } 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);
+                                       JSONObject msg = 
Chat.getMessage(Arrays.asList(m));
+                                       if (m.getToRoom() != null) {
+                                               
getBean(MobileService.class).sendChatMessage(getUid(), m, getDateFormat()); 
//let's send to mobile users
+                                               WebSocketHelper.sendRoom(m, 
msg);
+                                       } else if (m.getToUser() != null) {
+                                               
WebSocketHelper.sendUser(getUserId(), msg.toString());
+                                               msg = 
Chat.getMessage(m.getToUser().getId(), Arrays.asList(m));
+                                               
WebSocketHelper.sendUser(m.getToUser().getId(), msg.toString());
+                                       } else {
+                                               
WebSocketHelper.sendAll(msg.toString());
+                                       }
+                                       chatMessage.setDefaultModelObject("");
+                                       
target.appendJavaScript("Chat.clean();");
+                               };
+                       });
+       }
+
+       private String getUid() {
+               return findParent(MainPanel.class).getClient().getUid();
+       }
+
+       public String getScope() {
+               return activeTab.getModelObject();
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
index 9310799..94ce6d3 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
@@ -53,7 +53,7 @@
                </div>
                <div class="btn-group dropup">
                        <a id="fontStyle" class="chat btn btn-default 
dropdown-toggle" data-toggle="dropdown" title="Font Style">
-                               <span>&nbsp;</span>
+                               <span class="chat-tool-icon">&nbsp;</span>
                                <b class="caret"></b>
                        </a>
                        <ul class="dropdown-menu">
@@ -64,12 +64,14 @@
                        </ul>
                </div>
                <div class="btn-group">
-                       <a id="hyperlink" class="chat btn btn-default 
dropdown-toggle" data-toggle="dropdown" title="Hyperlink">&nbsp;</a>
+                       <a id="hyperlink" class="chat btn chat-tool-icon 
btn-default dropdown-toggle" data-toggle="dropdown" title="Hyperlink">&nbsp;</a>
                        <div class="dropdown-menu input-append">
                                <input class="span2" placeholder="URL" 
type="text"/>
                                <button class="btn btn-default" 
type="button"><wicket:message key="1261"/></button>
                        </div>
                </div>
+               <a class="chat-btn chat-tool-icon btn btn-default delete" 
wicket:message="title:442" wicket:id="ajax-cancel-button"></a>
+               <a class="chat-btn chat-tool-icon btn btn-default audio" 
wicket:message="data-sound-enabled:sound.mute,data-sound-muted:sound.enable">&nbsp;</a>
        </div>
 </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 766e1fe..2e4f759 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -18,8 +18,22 @@
  */
 package org.apache.openmeetings.web.user.chat;
 
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ALL;
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ROOM_PREFIX;
+import static org.apache.openmeetings.core.util.WebSocketHelper.ID_USER_PREFIX;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+
+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.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
@@ -34,6 +48,7 @@ import 
com.googlecode.wicket.jquery.ui.plugins.wysiwyg.toolbar.IWysiwygToolbar;
 public class ChatToolbar extends Panel implements IWysiwygToolbar {
        private static final long serialVersionUID = 1L;
        private final WebMarkupContainer toolbar;
+       private final ChatForm chatForm;
 
        /**
         * Constructor
@@ -41,8 +56,8 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
         * @param id
         *            the markup-id
         */
-       public ChatToolbar(String id) {
-               this(id, null);
+       public ChatToolbar(String id, ChatForm form) {
+               this(id, form, null);
        }
 
        /**
@@ -53,8 +68,9 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
         * @param model
         *            the {@link org.apache.wicket.model.IModel}
         */
-       public ChatToolbar(String id, IModel<String> model) {
+       public ChatToolbar(String id, ChatForm form, IModel<String> model) {
                super(id, model);
+               this.chatForm = form;
                add(toolbar = new WebMarkupContainer("toolbar"));
        }
 
@@ -62,4 +78,44 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
        public void attachToEditor(Component editor) {
                toolbar.add(AttributeModifier.replace("data-target", 
JQueryWidget.getSelector(editor)));
        }
+
+       @Override
+       protected void onInitialize() {
+               super.onInitialize();
+               ConfirmableAjaxBorder delBtn = new 
ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), 
chatForm) {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void onSubmit(AjaxRequestTarget target) {
+                               ChatDao dao = getBean(ChatDao.class);
+                               String scope = chatForm.getScope();
+                               boolean clean = false;
+                               try {
+                                       if (scope == null || 
ID_ALL.equals(scope)) {
+                                               scope = ID_ALL;
+                                               dao.deleteGlobal();
+                                               clean = true;
+                                       } else if 
(scope.startsWith(ID_ROOM_PREFIX)) {
+                                               Room r = 
getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+                                               if (r != null) {
+                                                       
dao.deleteRoom(r.getId());
+                                                       clean = true;
+                                               }
+                                       } else if 
(scope.startsWith(ID_USER_PREFIX)) {
+                                               User u = 
getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+                                               if (u != null) {
+                                                       
dao.deleteUser(u.getId());
+                                                       clean = true;
+                                               }
+                                       }
+                               } catch (Exception e) {
+                                       //no-op
+                               }
+                               if (clean) {
+                                       target.appendJavaScript("$('#" + scope 
+ "').html('')");
+                               }
+                       }
+               };
+               toolbar.add(delBtn.setVisible(hasAdminLevel(getRights())));
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
index 02aa81b..334af38 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
@@ -262,10 +262,7 @@ var Chat = function() {
                        p.removeClass('closed');
                        pp.animate(opts, 1000, function() {
                                p.removeClass('closed');
-                               $('#chat .ui-tabs 
.ui-tabs-panel.messageArea').height(p.height() - closedSize - $('#chat 
.ui-tabs-nav').height() - $('#chat form').height() - 5);
-                               $('#chat .messageArea').each(function() {
-                                       
$(this).scrollTop($(this)[0].scrollHeight);
-                               });
+                               _setAreaHeight();
                                if (typeof(handler) === 'function') {
                                        handler();
                                }
@@ -324,10 +321,18 @@ var Chat = function() {
                roomMode = _mode;
                _reinit(allPrefix, roomPrefix);
        }
+       function _setAreaHeight() {
+               $('#chat .ui-tabs 
.ui-tabs-panel.messageArea').height(p.height() - closedSize - $('#chat 
.ui-tabs-nav').height() - $('#chat form').height() - 5);
+               $('#chat .messageArea').each(function() {
+                       $(this).scrollTop($(this)[0].scrollHeight);
+               });
+       }
        function _setHeight(h) {
                pp.height(h);
                if (isClosed()) {
                        ctrl.height(h);
+               } else {
+                       _setAreaHeight();
                }
        }
        function _insertLink() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/webapp/css/chat.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/chat.css 
b/openmeetings-web/src/main/webapp/css/chat.css
index 26cf254..a4e51ba 100644
--- a/openmeetings-web/src/main/webapp/css/chat.css
+++ b/openmeetings-web/src/main/webapp/css/chat.css
@@ -80,31 +80,35 @@
        max-height: 70px;
        max-width: 500px;
 }
-.sound.om-icon {
+.chat-tool-icon {
+       background-repeat: no-repeat;
+       background-position: center;
+       background-size: 16px;
+       width: 20px;
+       height: 20px;
+       display: inline-block;
+}
+.sound.chat-tool-icon {
        background-image: url(images/sound.png);
 }
-.sound-mute.om-icon {
+.sound-mute.chat-tool-icon {
        background-image: url(images/sound_mute.png);
 }
+.delete.chat-tool-icon {
+       background-image: url(images/cancel_icon.png);
+}
 #chat #hyperlink {
-       background-repeat: no-repeat;
        background-image: url(images/link.png);
-       background-position: center;
 }
 #chat #fontStyle span {
-       background-repeat: no-repeat;
        background-image: url(images/settings.png);
-       background-position: center;
-       background-size: 16px;
-       display: inline-block;
-       width: 20px;
-       height: 20px;
 }
 #chat .chat-btn {
        display: inline-block;
        float: right;
+}
+#chat .chat-btn:first-of-type {
        margin-right: 10px;
-       padding: 4px;
 }
 /* room mode */
 #chatPanel.room {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a6583746/openmeetings-web/src/main/webapp/css/general-rtl.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/general-rtl.css 
b/openmeetings-web/src/main/webapp/css/general-rtl.css
index 9b1c9f2..61e36e2 100644
--- a/openmeetings-web/src/main/webapp/css/general-rtl.css
+++ b/openmeetings-web/src/main/webapp/css/general-rtl.css
@@ -105,7 +105,11 @@ form .input {
 }
 #chat .chat-btn {
        float: left !important;
+}
+#chat .chat-btn:first-of-type {
        margin-right: initial !important;
+}
+#chat .chat-btn:last-of-type {
        margin-left: 10px !important;
 }
 .room.sidebar .tab.om-icon.big {

Reply via email to