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"> </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> </span> + <span class="chat-tool-icon"> </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"> </a> + <a id="hyperlink" class="chat btn chat-tool-icon btn-default dropdown-toggle" data-toggle="dropdown" title="Hyperlink"> </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"> </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 {
