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 2017/10/10 05:01:22 UTC

openmeetings git commit: [OPENMEETINGS-1719] room seems to look as expected in RTL

Repository: openmeetings
Updated Branches:
  refs/heads/master fba7dcdbf -> 687415930


[OPENMEETINGS-1719] room seems to look as expected in RTL


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

Branch: refs/heads/master
Commit: 687415930cc6c81dbda3deef848f19b67168f7c1
Parents: fba7dcd
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Tue Oct 10 12:01:14 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Tue Oct 10 12:01:14 2017 +0700

----------------------------------------------------------------------
 .../apache/openmeetings/web/room/RoomPanel.html |  2 +-
 .../web/room/activities/ActivitiesPanel.html    |  8 +--
 .../web/room/activities/ActivitiesPanel.java    | 36 ++++++----
 .../org/apache/openmeetings/web/room/room.js    |  6 +-
 .../web/room/sidebar/RoomClientPanel.html       |  2 +-
 .../web/room/sidebar/RoomClientPanel.java       |  4 ++
 .../openmeetings/web/room/wb/WbPanel.html       |  8 +--
 .../openmeetings/web/room/wb/tool-apointer.js   |  2 +-
 .../apache/openmeetings/web/room/wb/wb-board.js | 19 ++---
 .../apache/openmeetings/web/user/chat/Chat.html |  2 +-
 .../apache/openmeetings/web/user/chat/chat.js   | 17 +++--
 .../src/main/webapp/css/general-rtl.css         | 33 +++++++++
 .../src/main/webapp/css/general.css             |  2 +-
 openmeetings-web/src/main/webapp/css/room.css   | 76 ++++++++++----------
 14 files changed, 135 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
index 2c1629b..48f13be 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
@@ -22,7 +22,7 @@
 	<div class="room holder">
 		<div class="room box" wicket:id="roomContainer">
 			<div class="room menu" wicket:id="menu"></div>
-			<div class="room sidebar left" wicket:id="sidebar"></div>
+			<div class="room sidebar" wicket:id="sidebar"></div>
 			<div wicket:id="wb-area" class="room wb area">
 				<div class="wb-drop-area"></div>
 				<div class="wb-area" wicket:id="whiteboard"></div>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
index b2b31fe..d9b2c29 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
@@ -25,10 +25,10 @@
 	</div>
 	<div wicket:id="container" class="area ui-widget-content">
 		<div wicket:id="activities" class="activity item ui-helper-clearfix ui-corner-all">
-			<span wicket:id="close" class="ui-icon ui-icon-close ui-corner-all align-right clickable" wicket:message="title:85"></span>
-			<span wicket:id="accept" class="ui-icon ui-icon-check ui-corner-all align-right clickable" wicket:message="title:1360"></span>
-			<span wicket:id="decline" class="ui-icon ui-icon-cancel ui-corner-all align-right clickable" wicket:message="title:1361"></span>
-			<span wicket:id="find" class="ui-icon crosshair ui-corner-all align-right clickable" wicket:message="title:find.user"></span>
+			<span wicket:id="close" class="ui-icon ui-icon-close ui-corner-all clickable" wicket:message="title:85"></span>
+			<span wicket:id="accept" class="ui-icon ui-icon-check ui-corner-all clickable" wicket:message="title:1360"></span>
+			<span wicket:id="decline" class="ui-icon ui-icon-cancel ui-corner-all clickable" wicket:message="title:1361"></span>
+			<span wicket:id="find" class="ui-icon crosshair ui-corner-all clickable" wicket:message="title:find.user"></span>
 			<div wicket:id="text"></div>
 		</div>
 	</div>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
index 1ff9fa3..57c6385 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
@@ -25,6 +25,8 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKe
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_LEFT;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_RIGHT;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.addOnClick;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
@@ -41,6 +43,7 @@ import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
@@ -66,6 +69,7 @@ public class ActivitiesPanel extends Panel {
 	private static final String ACTION = "action";
 	private static final String PARAM_ROOM_ID = "roomid";
 	private static final String ACTIVITY_FMT = "%s %s [%s]";
+	private static final String ACTIVITY_FMT_RTL = "%3$s %2$s [%1$s]";
 	private static final String ACTIVITY_FUNC_FMT = "activityAction(%s, '%s', '%s');";
 	private enum Action {
 		accept, decline, close
@@ -194,47 +198,53 @@ public class ActivitiesPanel extends Panel {
 				User u = getBean(UserDao.class).get(a.getSender());
 				name = self ? getString("1362") : String.format("%s %s", u.getFirstname(), u.getLastname());
 			}
+			final String fmt = ((BasePage)getPage()).isRtl() ? ACTIVITY_FMT_RTL : ACTIVITY_FMT;
 			switch (a.getType()) {
 				case roomEnter:
 					text = ""; // TODO should this be fixed?
 					item.setVisible(false);
 					break;
 				case roomExit:
-					text = String.format(ACTIVITY_FMT, name, getString("1367"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("1367"), df.format(a.getCreated()));
 					break;
 				case reqRightModerator:
-					text = String.format(ACTIVITY_FMT, name, getString("room.action.request.right.moderator"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("room.action.request.right.moderator"), df.format(a.getCreated()));
 					break;
 				case reqRightPresenter:
-					text = String.format(ACTIVITY_FMT, name, getString("right.presenter.request"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("right.presenter.request"), df.format(a.getCreated()));
 					break;
 				case reqRightWb:
-					text = String.format(ACTIVITY_FMT, name, getString("694"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("694"), df.format(a.getCreated()));
 					break;
 				case reqRightShare:
-					text = String.format(ACTIVITY_FMT, name, getString("1070"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("1070"), df.format(a.getCreated()));
 					break;
 				case reqRightRemote:
-					text = String.format(ACTIVITY_FMT, name, getString("1082"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("1082"), df.format(a.getCreated()));
 					break;
 				case reqRightA:
-					text = String.format(ACTIVITY_FMT, name, getString("1603"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("1603"), df.format(a.getCreated()));
 					break;
 				case reqRightAv:
-					text = String.format(ACTIVITY_FMT, name, getString("695"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("695"), df.format(a.getCreated()));
 					break;
 				case reqRightMute:
-					text = String.format(ACTIVITY_FMT, name, getString("1399"), df.format(a.getCreated()));//TODO un-mute 1398
+					text = String.format(fmt, name, getString("1399"), df.format(a.getCreated()));//TODO un-mute 1398
 					break;
 				case reqRightExclusive:
-					text = String.format(ACTIVITY_FMT, name, getString("1427"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("1427"), df.format(a.getCreated()));
 					break;
 				case haveQuestion:
-					text = String.format(ACTIVITY_FMT, name, getString("693"), df.format(a.getCreated()));
+					text = String.format(fmt, name, getString("693"), df.format(a.getCreated()));
 					break;
 			}
-			item.add(new WebMarkupContainer("close").add(addOnClick(String.format(ACTIVITY_FUNC_FMT, roomId, Action.close.name(), a.getId()))));
-			item.add(accept, decline, find, new Label("text", text));
+			final String align = ((BasePage)getPage()).isRtl() ? ALIGN_LEFT : ALIGN_RIGHT;
+			item.add(new WebMarkupContainer("close").add(addOnClick(String.format(ACTIVITY_FUNC_FMT, roomId, Action.close.name(), a.getId())))
+					.add(AttributeModifier.append("class", align)));
+			item.add(accept.add(AttributeModifier.append("class", align))
+					, decline.add(AttributeModifier.append("class", align))
+					, find.add(AttributeModifier.append("class", align))
+					, new Label("text", text));
 			item.add(AttributeModifier.append("class", getClass(a)));
 		}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
index 54e3b43..78cc170 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
@@ -567,7 +567,7 @@ var Room = (function() {
 		}
 	}
 	function _setSize() {
-		const sb = $(".room.sidebar.left")
+		const sb = $(".room.sidebar")
 			, w = $(window).width() - sb.width() - 8
 			, h = $(window).height() - $('#menu').height() - 3
 			, p = sb.find('.tabs')
@@ -612,13 +612,13 @@ var Room = (function() {
 		});
 	}
 	function _load() {
-		$(".room.sidebar.left").ready(function() {
+		$(".room.sidebar").ready(function() {
 			_setSize();
 		});
 		$(window).on('resize.openmeetings', function() {
 			_setSize();
 		});
-		$(".room.sidebar.left").resizable({
+		$(".room.sidebar").resizable({
 			handles: "e"
 			, stop: function() {
 				_setSize();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
index 4304edb..514ef3a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
@@ -20,7 +20,7 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<span wicket:id="status" class="ui-icon align-right"></span>
+	<span wicket:id="status" class="ui-icon"></span>
 	<span wicket:id="refresh"></span>
 	<div wicket:id="name" class="user name"></div>
 	<span class="ui-icon align-right typing-activity big"></span>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
index aa20fc0..8828388 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
@@ -19,11 +19,14 @@
 package org.apache.openmeetings.web.room.sidebar;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_LEFT;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_RIGHT;
 
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.sidebar.icon.KickIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.RefreshIcon;
@@ -100,6 +103,7 @@ public class RoomClientPanel extends Panel {
 			status = "status-user";
 			statusTitle = "677";
 		}
+		status = String.format("%s %s", status, ((BasePage)getPage()).isRtl() ? ALIGN_LEFT : ALIGN_RIGHT);
 		//TODO add ability to change 'first/last name'
 		add(new WebMarkupContainer("status").add(AttributeModifier.append("class", status), AttributeModifier.replace("title", getString(statusTitle))));
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
index b72fcdb..da0bb35 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
@@ -56,7 +56,7 @@
 				<div class="canvases"></div>
 			</div>
 		</div>
-		<div id="wb-zoom" class="wb-zoom" style="position: absolute; top: 0px; left: 80px;">
+		<div id="wb-zoom" class="wb-zoom">
 			<div class="doc-group btn-group btn-group-xs block" role="group" aria-label="...">
 				<button type="button" class="btn btn-default up" wicket:message="title:256">&nbsp;</button>
 				<button type="button" class="btn btn-default down" wicket:message="title:256">&nbsp;</button>
@@ -85,7 +85,7 @@
 				<option value="4.00">400%</option>
 			</select>
 		</div>
-		<div id="wb-tools" class="tools ui-state-active vertical clear" style="position: absolute; top: 20px; right: 20px;">
+		<div id="wb-tools" class="tools ui-state-active vertical clear">
 			<div class="bumper"></div>
 			<div wicket:message="title:62" class="ui-widget-header clickable om-icon big clear-all"></div>
 			<div wicket:message="title:1005" class="ui-widget-header clickable om-icon big clear-slide"></div>
@@ -103,11 +103,11 @@
 			<div wicket:message="title:79" class="ui-widget-header clickable om-icon big arrow"></div>
 			<div wicket:message="title:4" class="ui-widget-header clickable om-icon big settings"></div>
 		</div>
-		<div id="wb-tools-readonly" class="tools readonly ui-state-active vertical clear" style="position: absolute; top: 20px; right: 20px;">
+		<div id="wb-tools-readonly" class="tools readonly ui-state-active vertical clear">
 			<div class="bumper"></div>
 			<div wicket:message="title:557" class="ui-widget-header clickable om-icon big apointer"></div>
 		</div>
-		<div id="wb-settings" class="wb-settings ui-corner-all ui-widget-content" style="display: none; bottom: 100px; right: 100px;">
+		<div id="wb-settings" class="wb-settings ui-corner-all ui-widget-content">
 			<div wicket:message="title:843" class="header ui-dialog-titlebar ui-corner-all ui-widget-header ui-helper-clearfix ui-draggable-handle">
 				<span class="ui-dialog-title"><wicket:message key="843"/></span>
 				<button type="button" class="ui-button ui-corner-all ui-widget ui-button-icon-only ui-dialog-titlebar-close" wicket:message="title:85">

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-apointer.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-apointer.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-apointer.js
index af52f86..50498ca 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-apointer.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-apointer.js
@@ -69,7 +69,7 @@ var APointer = function(wb) {
 		const canvas = this
 			, ptr = canvas.getPointer(o.e);
 		if (pointer.user === '') {
-			pointer.user = $('.room.sidebar.left .user.list .current .name').text();
+			pointer.user = $('.room.sidebar .user.list .current .name').text();
 		}
 		const obj = {
 			type: 'pointer'

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/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 c92b4e6..1f3b0c1 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
@@ -224,10 +224,10 @@ var Wb = function() {
 				});
 				s.draggable({
 					scroll: false
-					, containment: "body"
+					, containment: 'body'
 					, start: function() {
-						if (!!s.css("bottom")) {
-							s.css("bottom", "").css("right", "");
+						if (!!s.css('bottom')) {
+							s.css('bottom', '').css(isRtl ? 'left' : 'right', '');
 						}
 					}
 					, drag: function() {
@@ -575,16 +575,19 @@ var Wb = function() {
 			a.find('.wb-zoom').remove();
 			role = _role;
 			const sc = a.find('.scroll-container');
-			z = $('#wb-zoom').clone().attr('id', '');
+			z = $('#wb-zoom').clone().attr('id', '')
+				.attr('style', 'position: absolute; top: 0px; ' + (isRtl ? 'right' : 'left') + ': 80px;');
 			if (role === NONE) {
 				t = $('#wb-tools-readonly').clone().attr('id', '');
 				sc.off('scroll', scrollHandler);
 			} else {
 				t = $('#wb-tools').clone().attr('id', '');
-				s = $("#wb-settings").clone().attr('id', '');
+				s = $("#wb-settings").clone().attr('id', '')
+					.attr('style', 'display: none; bottom: 100px; ' + (isRtl ? 'left' : 'right') + ': 100px;');
 				a.append(s);
 				sc.on('scroll', scrollHandler);
 			}
+			t.attr('style', 'position: absolute; top: 20px; ' + (isRtl ? 'left' : 'right') + ': 20px;');
 			a.append(t).append(z);
 			showCurrentSlide();
 			t = a.find('.tools'), s = a.find(".wb-settings");
@@ -620,15 +623,15 @@ var Wb = function() {
 	wb.resize = function() {
 		if (t.position().left + t.width() > a.width()) {
 			t.position({
-				my: "right"
-				, at: "right-20"
+				my: (isRtl ? 'left' : 'right')
+				, at: (isRtl ? 'left' : 'right') + '-20'
 				, of: '#' + a[0].id
 				, collision: "fit"
 			});
 		}
 		if (z.position().left + z.width() > a.width()) {
 			z.position({
-				my: "left top"
+				my: (isRtl ? 'right' : 'left') + ' top'
 				, at: "center top"
 				, of: '#' + a[0].id
 				, collision: "fit"

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/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 8f059d0..fec0873 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
@@ -27,7 +27,7 @@
 	</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">
+		<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">

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
index 45e0bcd..f3ff9fb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
@@ -1,12 +1,15 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
 var Chat = function() {
-	const tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
-		, msgTemplate = "<div class='clear' id='chat-msg-id-#{id}'><img class='profile' src='#{imgSrc}'/><span class='from' data-user-id='#{userId}'>#{from}</span><span class='date align-right'>#{sent}</span>#{msg}</div>"
-		, acceptTemplate = "<div class='tick om-icon align-right clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='const e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
-		, infoTemplate = "<div class='user om-icon align-right clickable' data-user-id='#{userId}' onclick='const e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
-		, addTemplate = "<div class='add om-icon align-right clickable' data-user-id='#{userId}' onclick='const e=$(this);addContact(e.data(\"userId\"));'></div>"
-		, messageTemplate = "<div class='new-email om-icon align-right clickable' data-user-id='#{userId}' onclick='const e=$(this);privateMessage(e.data(\"userId\"));'></div>"
-		, inviteTemplate = "<div class='invite om-icon align-right clickable' data-user-id='#{userId}' onclick='const e=$(this);inviteUser(e.data(\"userId\"));'></div>"
+	const isRtl = "rtl" === $('html').attr('dir')
+		, align = isRtl ? 'align-right' : 'align-left'
+		, alignIco = isRtl ? 'align-left' : 'align-right'
+		, tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
+		, msgTemplate = "<div class='clear msg-row' id='chat-msg-id-#{id}'><img class='profile " + align + "' src='#{imgSrc}'/><span class='from " + align + "' data-user-id='#{userId}'>#{from}</span><span class='" + align + "'>#{msg}</span><span class='date " + alignIco + "'>#{sent}</span></div>"
+		, acceptTemplate = "<div class='tick om-icon " + alignIco + " clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='const e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
+		, infoTemplate = "<div class='user om-icon " + alignIco + " clickable' data-user-id='#{userId}' onclick='const e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
+		, addTemplate = "<div class='add om-icon " + alignIco + " clickable' data-user-id='#{userId}' onclick='const e=$(this);addContact(e.data(\"userId\"));'></div>"
+		, messageTemplate = "<div class='new-email om-icon " + alignIco + " clickable' data-user-id='#{userId}' onclick='const e=$(this);privateMessage(e.data(\"userId\"));'></div>"
+		, inviteTemplate = "<div class='invite om-icon " + alignIco + " clickable' data-user-id='#{userId}' onclick='const e=$(this);inviteUser(e.data(\"userId\"));'></div>"
 		, closeBlock = "<span class='ui-icon ui-icon-close' role='presentation'></span>"
 		, closedHeight = "20px"
 		, emoticon = new CSSEmoticon()

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/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 e640dfb..696bcb3 100644
--- a/openmeetings-web/src/main/webapp/css/general-rtl.css
+++ b/openmeetings-web/src/main/webapp/css/general-rtl.css
@@ -98,8 +98,41 @@ form .input {
 	padding-left: initial !important;
 	padding-right: 20px !important;
 }
+.btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group {
+	float: right !important;
+}
+#chat .chat-btn {
+	float: left !important;
+	margin-right: initial !important;
+	margin-left: 10px !important;
+}
+.room.sidebar .tab.om-icon.big {
+	padding: 0em 2.5em 0 1em !important;
+}
+@media screen and (max-width: 1280px) {
+	.room.holder .room.sidebar .tab.om-icon.big {
+		padding-left: 0 !important;
+	}
+}
+.om-icon.big {
+	background-position: right 1px top 1px !important;
+}
+.room.sidebar .user.list .user {
+	background-position: right 2px top 2px !important;
+}
+.room.sidebar .user.list .user.name {
+	margin-left: 0px 0px 0px 20px !important;
+	padding: 0px 44px 0px 0px !important;
+}
+.room.sidebar .user.list .user .ui-icon.audio-activity {
+	right: initial !important;
+	left: 3px !important;
+}
 
 /**** TODO need to be moved to wicket-jquery-ui **************/
+span.css-emoticon.un-transformed-emoticon, span.css-emoticon.animated-emoticon:hover {
+	transform: rotate(0deg) !important;
+}
 span.css-emoticon {
 	transform: rotate(-90deg) !important;
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/webapp/css/general.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/general.css b/openmeetings-web/src/main/webapp/css/general.css
index fe032a6..b0f066a 100644
--- a/openmeetings-web/src/main/webapp/css/general.css
+++ b/openmeetings-web/src/main/webapp/css/general.css
@@ -534,7 +534,7 @@ form .input {
 .no-close .ui-dialog-titlebar-close {
 	display: none;
 }
-.table {
+.table, .msg-row {
 	position: relative;
 }
 .table .column {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/68741593/openmeetings-web/src/main/webapp/css/room.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/room.css b/openmeetings-web/src/main/webapp/css/room.css
index 45663b0..5d183c8 100644
--- a/openmeetings-web/src/main/webapp/css/room.css
+++ b/openmeetings-web/src/main/webapp/css/room.css
@@ -88,37 +88,37 @@
 .room.menu.right .icon .profile img {
 	width: 28px;
 }
-.room.sidebar.left {
+.room.sidebar {
 	min-width: 150px;
 	width: 315px;
 	position: absolute;
 }
-.room.sidebar.left .ui-resizable-handle {
+.room.sidebar .ui-resizable-handle {
 	width: 4px;
 	background-color: #f3f3f4;
 	border: 1px solid #dedee0;
 }
-.room.sidebar.left .ui-resizable-handle:hover {
+.room.sidebar .ui-resizable-handle:hover {
 	background-color: #b6bdca;
 	border-color: #bebec3;
 }
-.room.sidebar.left .ui-tabs .ui-tabs-panel {
+.room.sidebar .ui-tabs .ui-tabs-panel {
 	padding: 0;
 }
-.room.sidebar.left .user.header {
+.room.sidebar .user.header {
 	height: 45px;
 	padding-left: 5px;
 }
-.room.sidebar.left .user.header .ui-icon {
+.room.sidebar .user.header .ui-icon {
 	margin-top: 5px;
 	margin-left: 5px;
 	width: 32px;
 	height: 32px;
 }
-.room.sidebar.left .user.list {
+.room.sidebar .user.list {
 	overflow-y: auto;
 }
-.room.sidebar.left .user.list .user {
+.room.sidebar .user.list .user {
 	min-height: 40px;
 	padding-left: 5px;
 	padding-top: 5px;
@@ -127,7 +127,7 @@
 	background-position: 2px 2px;
 	position: relative;
 }
-.room.sidebar.left .user.list .user.name {
+.room.sidebar .user.list .user.name {
 	line-height: 18px;
 	height: 18px;
 	padding: 0;
@@ -135,10 +135,10 @@
 	margin-right: 20px;
 	overflow: hidden;
 }
-.room.holder.small .room.sidebar.left .user.list .user.name {
+.room.holder.small .room.sidebar .user.list .user.name {
 	display: none;
 }
-.room.sidebar.left .user.list .user .user.actions {
+.room.sidebar .user.list .user .user.actions {
 	position: relative;
 	min-height: 18px;
 	padding: 0;
@@ -146,22 +146,22 @@
 	visibility: hidden;
 	margin-right: 35px;
 }
-.room.sidebar.left .user.list .user:hover .user.actions {
+.room.sidebar .user.list .user:hover .user.actions {
 	visibility: visible;
 }
-.room.sidebar.left .user.list .user .user.actions .ui-icon {
+.room.sidebar .user.list .user .user.actions .ui-icon {
 	margin-right: 2px;
 	margin-top: 0;
 }
-.room.sidebar.left .user.list .user .ui-icon {
+.room.sidebar .user.list .user .ui-icon {
 	background-size: 16px;
 }
-.room.sidebar.left .user.list .user .ui-icon.audio-activity {
+.room.sidebar .user.list .user .ui-icon.audio-activity {
 	position: absolute;
 	bottom: 0px;
 	right: 3px;
 }
-.room.sidebar.left .user.list .user .ui-icon.big {
+.room.sidebar .user.list .user .ui-icon.big {
 	background-size: 32px;
 }
 .audio-activity.ui-icon {
@@ -257,14 +257,14 @@
 .activity.mic.enabled.ui-icon {
 	background-image: url(images/microphone_disable.png);
 }
-.room.sidebar.left .user.list .user .user.actions .ui-icon.bumper
-	, .room.sidebar.left .user.header .ui-icon.bumper {
+.room.sidebar .user.list .user .user.actions .ui-icon.bumper
+	, .room.sidebar .user.header .ui-icon.bumper {
 	padding-right: 5px;
 }
-.room.sidebar.left .tabs, .room.sidebar.left .tabs #utab, .room.sidebar.left .tabs #ftab {
+.room.sidebar .tabs, .room.sidebar .tabs #utab, .room.sidebar .tabs #ftab {
 	padding: 0;
 }
-.room.sidebar.left .user.list .user.current {
+.room.sidebar .user.list .user.current {
 	font-weight: bold;
 	background-color: #00FF00;
 }
@@ -365,7 +365,7 @@
 	padding: .1em .7em;
 	font-weight: bolder;
 }
-.room.sidebar.left .tab.om-icon.big {
+.room.sidebar .tab.om-icon.big {
 	padding: 0em 1em 0 2.5em;
 	line-height: 30px;
 	width: auto;
@@ -374,19 +374,19 @@
 	overflow: hidden;
 	white-space: nowrap;
 }
-.room.holder.small .room.sidebar.left .tab.om-icon.big {
+.room.holder.small .room.sidebar .tab.om-icon.big {
 	max-width: 0px;
 	padding-right: 0;
 }
-.room.holder.small .room.sidebar.left .file.tree .file.item .name
-	, .room.holder.small .room.sidebar.left .file.tree .file.item .name span
+.room.holder.small .room.sidebar .file.tree .file.item .name
+	, .room.holder.small .room.sidebar .file.tree .file.item .name span
 {
 	width: 40px;
 }
-.room.sidebar.left .tab.om-icon.big.user {
+.room.sidebar .tab.om-icon.big.user {
 	background-image: url(images/group.png);
 }
-.room.sidebar.left .tab.om-icon.big.file {
+.room.sidebar .tab.om-icon.big.file {
 	background-image: url(images/folder_explore.png);
 }
 /************ VIDEO **************/
@@ -432,40 +432,40 @@
 	max-width: 250px;
 }
 @media screen and (max-width: 1280px) {
-	.room.sidebar.left {
+	.room.sidebar {
 		width: 150px;
 	}
-	.room.holder .room.sidebar.left .tab.om-icon.big {
+	.room.holder .room.sidebar .tab.om-icon.big {
 		max-width: 0px;
 		padding-right: 0;
 	}
-	.room.holder.big .room.sidebar.left .tab.om-icon.big {
+	.room.holder.big .room.sidebar .tab.om-icon.big {
 		max-width: 80px;
 		padding: 0em 1em 0 2.5em;
 	}
-	.room.holder .room.sidebar.left .user.list .user.name {
+	.room.holder .room.sidebar .user.list .user.name {
 		display: none;
 	}
-	.room.holder.big .room.sidebar.left .user.list .user.name {
+	.room.holder.big .room.sidebar .user.list .user.name {
 		display: block;
 	}
-	.room.holder .room.sidebar.left .file.tree .file.item .name
-		, .room.holder .room.sidebar.left .file.tree .file.item .name span
+	.room.holder .room.sidebar .file.tree .file.item .name
+		, .room.holder .room.sidebar .file.tree .file.item .name span
 	{
 		width: 40px;
 	}
-	.room.holder.big .room.sidebar.left .file.tree .file.item .name
-		, .room.holder.big .room.sidebar.left .file.tree .file.item .name span
+	.room.holder.big .room.sidebar .file.tree .file.item .name
+		, .room.holder.big .room.sidebar .file.tree .file.item .name span
 	{
 		width: 230px;
 	}
-	.room.sidebar.left .file.tree .file.item .name span {
+	.room.sidebar .file.tree .file.item .name span {
 		padding: 0;
 	}
-	.room.holder .room.sidebar.left .file.tree .file.item {
+	.room.holder .room.sidebar .file.tree .file.item {
 		width: 80px;
 	}
-	.room.holder.big .room.sidebar.left .file.tree .file.item {
+	.room.holder.big .room.sidebar .file.tree .file.item {
 		width: auto;
 	}
 }