This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new f3b657f  [OPENMEETINGS-2155] first step to implement 'windowless' audio
f3b657f is described below

commit f3b657fad9db8f2f6e9b9421898b8bdf99264920
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed Mar 18 23:02:14 2020 +0700

    [OPENMEETINGS-2155] first step to implement 'windowless' audio
---
 .../apache/openmeetings/web/app/ClientManager.java |   4 +-
 .../web/common/tree/FileTreePanel.java             |  10 +-
 .../apache/openmeetings/web/room/RoomPanel.java    |  53 +++++-
 .../openmeetings/web/room/activities/activities.js |   2 +-
 .../org/apache/openmeetings/web/room/raw-room.js   | 206 +++++++++++++++++++--
 .../openmeetings/web/room/raw-video-manager.js     |   2 -
 .../org/apache/openmeetings/web/room/raw-video.js  |   2 +-
 .../web/room/sidebar/ClientIconsPanel.html         |  48 -----
 .../web/room/sidebar/ClientIconsPanel.java         |  74 --------
 .../web/room/sidebar/RoomClientPanel.html          |  42 -----
 .../web/room/sidebar/RoomClientPanel.java          |  88 ---------
 .../openmeetings/web/room/sidebar/RoomSidebar.html |  59 +++++-
 .../openmeetings/web/room/sidebar/RoomSidebar.java |  52 +-----
 .../web/room/sidebar/SelfIconsPanel.html           |  52 ------
 .../web/room/sidebar/SelfIconsPanel.java           |  60 ------
 .../web/room/sidebar/icon/ClientIcon.java          | 128 -------------
 .../web/room/sidebar/icon/KickIcon.java            |  54 ------
 .../web/room/sidebar/icon/RefreshIcon.java         |  62 -------
 .../web/room/sidebar/icon/SettingsIcon.java        |  43 -----
 .../web/room/sidebar/icon/UserSpeaksIcon.java      |  57 ------
 .../sidebar/icon/activity/CamActivityIcon.java     |  40 ----
 .../sidebar/icon/activity/MicActivityIcon.java     |  40 ----
 .../sidebar/icon/activity/RoomActivityIcon.java    |  62 -------
 .../room/sidebar/icon/right/AudioRightIcon.java    |  35 ----
 .../sidebar/icon/right/ModeratorRightIcon.java     |  35 ----
 .../sidebar/icon/right/MuteOthersRightIcon.java    |  35 ----
 .../sidebar/icon/right/PresenterRightIcon.java     |  43 -----
 .../sidebar/icon/right/RemoteControlRightIcon.java |  40 ----
 .../web/room/sidebar/icon/right/RoomRightIcon.java |  64 -------
 .../sidebar/icon/right/ScreenShareRightIcon.java   |  40 ----
 .../room/sidebar/icon/right/VideoRightIcon.java    |  40 ----
 .../sidebar/icon/right/WhiteboardRightIcon.java    |  50 -----
 .../openmeetings/web/user/chat/ChatToolbar.html    |   2 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |   4 +-
 .../apache/openmeetings/web/user/chat/raw-chat.js  |   4 +-
 openmeetings-web/src/main/webapp/css/raw-room.css  |   2 +
 36 files changed, 306 insertions(+), 1328 deletions(-)

diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
index 8163d2d..0157faf 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
@@ -34,11 +34,13 @@ import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 
 import org.apache.openmeetings.core.remote.KurentoHandler;
+import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.wicket.util.collections.ConcurrentHashSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -134,7 +136,7 @@ public class ClientManager implements IClientManager {
                Long roomId = c.getRoomId();
                removeFromRoom(c);
                if (roomId != null) {
-                       sendRoom(new RoomMessage(roomId, c, 
RoomMessage.Type.ROOM_EXIT));
+                       sendRoom(new TextRoomMessage(roomId, c, 
RoomMessage.Type.ROOM_EXIT, c.getUid()));
                        confLogDao.add(
                                        ConferenceLog.Type.ROOM_LEAVE
                                        , c.getUserId(), "0", roomId
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index 09a1a47..1082227 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -25,6 +25,8 @@ import static 
org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_LEFT;
+import static org.apache.openmeetings.web.pages.BasePage.ALIGN_RIGHT;
 
 import java.io.File;
 import java.nio.file.Path;
@@ -80,12 +82,10 @@ import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5I
 
 public abstract class FileTreePanel extends Panel {
        private static final long serialVersionUID = 1L;
-       private static final String ALIGN_LEFT_CLASS = " align-left";
-       private static final String ALIGN_RIGHT_CLASS = " align-right";
        private static final String BASE_CLASS = " om-icon big clickable";
-       private static final String UPLOAD_CLASS = "add" + BASE_CLASS + 
ALIGN_LEFT_CLASS;
-       private static final String CREATE_DIR_CLASS = "folder-create" + 
BASE_CLASS + ALIGN_LEFT_CLASS;
-       private static final String TRASH_CLASS = "trash" + BASE_CLASS + 
ALIGN_RIGHT_CLASS;
+       private static final String UPLOAD_CLASS = "add" + BASE_CLASS + 
ALIGN_LEFT;
+       private static final String CREATE_DIR_CLASS = "folder-create" + 
BASE_CLASS + ALIGN_LEFT;
+       private static final String TRASH_CLASS = "trash" + BASE_CLASS + 
ALIGN_RIGHT;
        private static final String DISABLED_CLASS = " disabled";
        final WebMarkupContainer trees = new 
WebMarkupContainer("tree-container");
        private final WebMarkupContainer sizes = new 
WebMarkupContainer("sizes");
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 676587d..cf167ca 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.room;
 
 import static java.time.Duration.ZERO;
+import static java.util.Comparator.naturalOrder;
 import static 
org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_USER_PREFIX;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
@@ -29,6 +30,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Calendar;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -138,6 +140,7 @@ public class RoomPanel extends BasePanel {
                        Client c = getClient();
                        JSONObject options = 
VideoSettings.getInitJson(c.getSid())
                                        .put("uid", c.getUid())
+                                       .put("userId", c.getUserId())
                                        .put("rights", 
c.toJson(true).getJSONArray("rights"))
                                        .put("interview", interview)
                                        .put("audioOnly", r.isAudioOnly())
@@ -149,8 +152,26 @@ public class RoomPanel extends BasePanel {
                        StringBuilder sb = new 
StringBuilder("Room.init(").append(options.toString(new 
NullStringer())).append(");")
                                        .append(wb.getInitScript())
                                        .append(getQuickPollJs());
+                       if (c.hasRight(Room.Right.MODERATOR) || 
!r.isHidden(RoomElement.USER_COUNT)) {
+                               List<Client> list = cm.listByRoom(r.getId());
+                               list.sort(Comparator.<Client, 
Integer>comparing(cl -> {
+                                       if (cl.hasRight(Room.Right.MODERATOR)) {
+                                               return 0;
+                                       }
+                                       if (cl.hasRight(Room.Right.PRESENTER)) {
+                                               return 1;
+                                       }
+                                       return 5;
+                               }, naturalOrder())
+                                               .thenComparing(cl -> 
cl.getUser().getDisplayName(), String::compareToIgnoreCase));
+                               sb.append("Room.addClient([");
+                               list.stream().forEach(cl -> 
sb.append(cl.toJson(false).toString(new NullStringer())).append(","));
+                               sb.deleteCharAt(sb.length() - 1).append("]);");
+
+                       }
                        target.appendJavaScript(sb);
-                       WebSocketHelper.sendRoom(new RoomMessage(r.getId(), c, 
RoomMessage.Type.ROOM_ENTER));
+
+                       WebSocketHelper.sendRoom(new TextRoomMessage(r.getId(), 
c, RoomMessage.Type.ROOM_ENTER, c.getUid()));
                        // play video from other participants
                        initVideos(target);
                        getMainPanel().getChat().roomEnter(r, target);
@@ -452,7 +473,7 @@ public class RoomPanel extends BasePanel {
                                                                return;
                                                        }
                                                        boolean self = 
_c.getUid().equals(c.getUid());
-                                                       
handler.appendJavaScript(String.format("VideoManager.update(%s);"
+                                                       
handler.appendJavaScript(String.format("Room.updateClient(%s);"
                                                                        , 
c.toJson(self).toString(new NullStringer())));
                                                        sidebar.update(handler);
                                                        menu.update(handler);
@@ -461,14 +482,30 @@ public class RoomPanel extends BasePanel {
                                                }
                                                break;
                                        case ROOM_ENTER:
-                                               sidebar.update(handler);
-                                               menu.update(handler);
-                                               sidebar.addActivity(new 
Activity(m, Activity.Type.roomEnter), handler);
+                                               {
+                                                       sidebar.update(handler);
+                                                       menu.update(handler);
+                                                       String uid = 
((TextRoomMessage)m).getText();
+                                                       Client c = cm.get(uid);
+                                                       if (c == null) {
+                                                               log.error("Not 
existing user in rightUpdated {} !!!!", uid);
+                                                               return;
+                                                       }
+                                                       if 
(c.hasRight(Room.Right.MODERATOR) || !r.isHidden(RoomElement.USER_COUNT)) {
+                                                               boolean self = 
_c.getUid().equals(c.getUid());
+                                                               
handler.appendJavaScript(String.format("Room.addClient([%s]);"
+                                                                               
, c.toJson(self).toString(new NullStringer())));
+                                                       }
+                                                       sidebar.addActivity(new 
Activity(m, Activity.Type.roomEnter), handler);
+                                               }
                                                break;
                                        case ROOM_EXIT:
-                                               sidebar.update(handler);
-                                               sidebar.addActivity(new 
Activity(m, Activity.Type.roomExit), handler);
-                                               
handler.appendJavaScript("Chat.removeTab('" + ID_USER_PREFIX + m.getUserId() + 
"');");
+                                               {
+                                                       String uid = 
((TextRoomMessage)m).getText();
+                                                       sidebar.update(handler);
+                                                       sidebar.addActivity(new 
Activity(m, Activity.Type.roomExit), handler);
+                                                       
handler.appendJavaScript("Room.removeClient('" + uid + "'); Chat.removeTab('" + 
ID_USER_PREFIX + m.getUserId() + "');");
+                                               }
                                                break;
                                        case ROOM_CLOSED:
                                                
handler.add(room.setVisible(false));
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 f0a083d..8126993 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
@@ -153,7 +153,7 @@ var Activities = function() {
                        const _id = _getId(obj.id);
                        (obj.action ? modArea : 
area).append(OmUtil.tmpl('#activity-stub', _id).data(obj));
                        const a = $('#' + _id).addClass(obj.cssClass);
-                       
a.find('.activity-close,.activity-accept,.activity-decline,.activity-find').addClass(Settings.isRtl
 ? 'align-left' : 'align-right');
+                       
a.find('.activity-close,.activity-accept,.activity-decline,.activity-find').addClass('align-right');
                        const acpt = a.find('.activity-accept');
                        if (obj.accept) {
                                acpt.click(function() { _action('accept', 
obj.id); });
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
index f267c95..8c8a148 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
@@ -187,10 +187,20 @@ var Room = (function() {
                        ]
                });
        }
-       function _hasRight(_rights) {
-               const rights = Array.isArray(_rights) ? _rights : [];
+       function _hasRight(_inRights, _ref) {
+               const ref = _ref || options.rights;
+               let _rights;
+               if (Array.isArray(_inRights)) {
+                       _rights = _inRights;
+               } else {
+                       if ('SUPER_MODERATOR' === _inRights) {
+                               return ref.includes(_inRights);
+                       }
+                       _rights = [_inRights];
+               }
+               const rights = ['SUPER_MODERATOR', 'MODERATOR', ..._rights];
                for (let i = 0; i < rights.length; ++i) {
-                       if (options.rights.includes(rights[i])) {
+                       if (ref.includes(rights[i])) {
                                return true;
                        }
                }
@@ -199,7 +209,7 @@ var Room = (function() {
        function _setQuickPollRights() {
                const close = $('#quick-vote .close-btn');
                if (close.length === 1) {
-                       if (_hasRight(['SUPER_MODERATOR', 'MODERATOR', 
'PRESENTER'])) {
+                       if (_hasRight(['PRESENTER'])) {
                                close.show();
                                if (typeof(close.data('bs.confirmation')) === 
'object') {
                                        return;
@@ -248,17 +258,183 @@ var Room = (function() {
                }
                OmUtil.tmpl('#quick-vote-template', 'quick-vote');
        }
+       function __activityAVIcon(c, elem, selector, predicate, onfunc, 
disabledfunc) {
+               let icon = elem.find(selector);
+               if (predicate()) {
+                       icon.show();
+                       const on = onfunc()
+                               , disabled = disabledfunc();;
+                       if (disabled) {
+                               icon.addClass('disabled');
+                       } else {
+                               icon.removeClass('disabled');
+                               if (on) {
+                                       icon.addClass('enabled');
+                               } else {
+                                       icon.removeClass('enabled');
+                               }
+                       }
+                       icon.attr('title', icon.data(on ? 'off' :'on'));
+               } else {
+                       icon.hide();
+               }
+       }
+       function __activityIcon(c, elem, selector, predicate, action) {
+               let icon = elem.find(selector);
+               if (predicate()) {
+                       if (icon.length === 0) {
+                               icon = OmUtil.tmpl('#user-actions-stub ' + 
selector);
+                               elem.append(icon);
+                       }
+                       icon.off().click(action);
+               } else {
+                       icon.hide();
+               }
+       }
+       function __rightIcon(c, elem, rights, selector, predicate) {
+               const self = c.uid === options.uid
+                       , hasRight = _hasRight(rights, c.rights);
+               let icon = elem.find(selector);
+               if (predicate() && !_hasRight('SUPER_MODERATOR', c.rights) && (
+                       (self && options.questions && !hasRight)
+                       || (!self && _hasRight('MODERATOR'))
+               )) {
+                       if (icon.length === 0) {
+                               icon = OmUtil.tmpl('#user-actions-stub ' + 
selector);
+                               elem.append(icon);
+                       }
+                       if (hasRight) {
+                               icon.addClass('granted');
+                       } else {
+                               icon.removeClass('granted')
+                       }
+                       icon.attr('title', icon.data(self ? 'request' : 
(hasRight ? 'revoke' : 'grant')));
+                       icon.off().click(function() {
+                               OmUtil.roomAction({action: 'toggleRight', 
right: rights[0], uid: c.uid});
+                       });
+               } else {
+                       icon.remove();
+               }
+       }
+       function __rightAudioIcon(c, elem) {
+               __rightIcon(c, elem, ['AUDIO'], '.right.audio', () => true);
+       }
+       function __rightVideoIcon(c, elem) {
+               __rightIcon(c, elem, ['VIDEO'], '.right.camera', () => 
!options.audioOnly);
+       }
+       function __rightOtherIcons(c, elem) {
+               __rightIcon(c, elem, ['PRESENTER'], '.right.presenter', () => 
!options.interview && $('.wb-area').is(':visible'));
+               __rightIcon(c, elem, ['WHITEBOARD', 'PRESENTER'], '.right.wb', 
() => !options.interview && $('.wb-area').is(':visible'));
+               __rightIcon(c, elem, ['SHARE'], '.right.screen-share', () => 
true); //FIXME TODO getRoomPanel().screenShareAllowed()
+               __rightIcon(c, elem, ['REMOTE_CONTROL'], 
'.right.remote-control', () => true); //FIXME TODO 
getRoomPanel().screenShareAllowed()
+               __rightIcon(c, elem, ['MODERRATOR'], '.right.moderator', () => 
true);
+       }
+       function __setStatus(c, le) {
+               const status = le.find('.user-status');
+               status.removeClass('mod wb user');
+               if (_hasRight('MODERATOR', c.rights)) {
+                       status.attr('title', 
status.data('mod')).addClass('mod');;
+               } else if (_hasRight('WHITEBOARD', c.rights)) {
+                       status.attr('title', status.data('wb')).addClass('wb');;
+               } else {
+                       status.attr('title', 
status.data('user')).addClass('user');;
+               }
+       }
+       function __updateCount() {
+               $('#room-sidebar-users-tab 
.user-count').text($('#room-sidebar-tab-users .user-list .users 
.user.entry').length);
+       }
+       function _addClient(_clients) {
+               const clients = Array.isArray(_clients) ? _clients : [_clients];
+               clients.forEach(c => {
+                       const self = c.uid === options.uid;
+                       let le = $('#user' + c.uid);
+                       if (le.length === 0) {
+                               le = OmUtil.tmpl('#user-entry-stub', 'user' + 
c.uid);
+                               le.attr('id', 'user' + c.uid)
+                                       .attr('data-userid', c.user.id)
+                                       .attr('data-uid', c.uid);
+                               if (self) {
+                                       le.addClass('current');
+                               }
+                               // FIXME TODO sort + .insertAfter(...)
+                               $('#room-sidebar-tab-users .user-list 
.users').append(le);
+                       }
+                       _updateClient(c);
+               });
+               __updateCount();
+       }
+       function _updateClient(c) {
+               const self = c.uid === options.uid
+                       , le = $('#user' + c.uid)
+                       , hasAudio = VideoUtil.hasAudio(c)
+                       , hasVideo = VideoUtil.hasVideo(c)
+                       , speaks = le.find('.audio-activity');
+               if (le.length === 0) {
+                       return;
+               }
+               __setStatus(c, le);
+               //FIXME TODO move-on-change-order: 
$('#nodeToMove').insertAfter('#insertAfterThisElement');
+               if (hasVideo || hasAudio) {
+                       if (le.find('.restart').length === 0) {
+                               
le.prepend(OmUtil.tmpl('#user-av-restart').click(function () {
+                                       VideoManager.refresh(c.uid);
+                               }));
+                       }
+               } else {
+                       le.find('.restart').remove();
+               }
+               speaks.hide().removeClass('clickable').attr('title', 
speaks.data('speaks')).off();
+               if (hasAudio) {
+                       speaks.show();
+                       if(_hasRight('MUTE_OTHERS')) {
+                               speaks.addClass('clickable').click(function () {
+                                       VideoManager.clickMuteOthers(c.uid);
+                               }).attr('title', speaks.attr('title') + 
speaks.data('mute'));
+                       }
+               }
+               le.attr('title', c.user.displayName)
+                       .css('background-image', 'url(' + c.user.pictureUri + 
')')
+                       .find('.user.name').text(c.user.displayName);
+
+               const actions = le.find('.user.actions');
+               __rightVideoIcon(c, actions);
+               __rightAudioIcon(c, actions);
+               __rightOtherIcons(c, actions);
+               __activityIcon(c, actions, '.kick'
+                       , () => !self && _hasRight('MODERATOR') && 
!_hasRight('SUPER_MODERATOR', c.rights)
+                       , function() { OmUtil.roomAction({action: 'kick', uid: 
c.uid}); });
+               __activityIcon(c, actions, '.private-chat'
+                               , () => options.userId !== c.user.id && 
$('#chatPanel').is(':visible')
+                               , function() {
+                                       Chat.addTab('chatTab-u' + c.user.id, 
c.user.displayName);
+                                       Chat.open();
+                                       $('#chatMessage 
.wysiwyg-editor').click();
+                               });
+               if (self) {
+                       options.rights = c.rights;
+                       _setQuickPollRights();
+                       options.activities = c.activities;
+                       const header = $('#room-sidebar-tab-users .header');
+                       __rightVideoIcon(c, header);
+                       __activityAVIcon(c, header, '.activity.cam', () => 
!options.audioOnly && _hasRight('VIDEO')
+                               , () => hasVideo
+                               , () => Settings.load().video.cam < 0);
+                       __rightAudioIcon(c, header);
+                       __activityAVIcon(c, header, '.activity.mic', () => 
_hasRight('AUDIO')
+                               , () => hasAudio
+                               , () => Settings.load().video.mic < 0);
+                       __rightOtherIcons(c, header);
+               }
+               VideoManager.update(c)
+       }
+       function _removeClient(uid) {
+               $('#user' + uid).remove();
+               __updateCount();
+       }
 
        self.init = _init;
        self.getMenuHeight = function() { return menuHeight; };
        self.getOptions = function() { return typeof(options) === 'object' ? 
JSON.parse(JSON.stringify(options)) : {}; };
-       self.setRights = function(_r) {
-               options.rights = _r;
-               _setQuickPollRights();
-       };
-       self.setActivities = function(_a) {
-               options.activities = _a;
-       };
        self.load = _load;
        self.unload = _unload;
        self.showClipboard = _showClipboard;
@@ -267,13 +443,11 @@ var Room = (function() {
        self.setCssVar = function(key, val) {
                ($('.main.room')[0]).style.setProperty(key, val);
        };
+       self.addClient = _addClient;
+       self.updateClient = _updateClient;
+       self.removeClient = _removeClient;
        return self;
 })();
-function startPrivateChat(el) {
-       Chat.addTab('chatTab-u' + el.parent().parent().data("userid"), 
el.parent().parent().find('.user.name').text());
-       Chat.open();
-       $('#chatMessage .wysiwyg-editor').click();
-}
 /***** functions required by SIP   ******/
 function sipBtnClick() {
        const txt = $('.sip-number');
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
index b63c059..7e3ac57 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
@@ -152,8 +152,6 @@ var VideoManager = (function() {
                        }
                });
                if (c.uid === Room.getOptions().uid) {
-                       Room.setRights(c.rights);
-                       Room.setActivities(c.activities);
                        const windows = $(VID_SEL + ' .ui-dialog-content');
                        for (let i = 0; i < windows.length; ++i) {
                                const w = $(windows[i]);
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
index 76a8de1..5fcc11c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
@@ -440,7 +440,7 @@ var Video = (function() {
                }
        }
        function _setRights() {
-               if (Room.hasRight(['SUPER_MODERATOR', 'MODERATOR', 
'MUTE_OTHERS']) && VideoUtil.hasAudio(sd)) {
+               if (Room.hasRight(['MUTE_OTHERS']) && VideoUtil.hasAudio(sd)) {
                        muteOthers.addClass('enabled').click(function() {
                                VideoManager.clickMuteOthers(sd.uid);
                        });
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.html
deleted file mode 100644
index 35e3321..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org";>
-<wicket:panel>
-       <span wicket:id="right-video">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-audio">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-presenter">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-wb">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-screen-share">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-remote-control">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-mute-others">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-moder">
-               <i class="fas"/>
-       </span>
-</wicket:panel>
-</html>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.java
deleted file mode 100644
index 814001a..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ClientIconsPanel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.room.sidebar;
-
-import org.apache.openmeetings.web.room.sidebar.icon.right.AudioRightIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.right.ModeratorRightIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.right.MuteOthersRightIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.right.PresenterRightIcon;
-import 
org.apache.openmeetings.web.room.sidebar.icon.right.RemoteControlRightIcon;
-import 
org.apache.openmeetings.web.room.sidebar.icon.right.ScreenShareRightIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.right.VideoRightIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.right.WhiteboardRightIcon;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.markup.html.panel.Panel;
-
-public class ClientIconsPanel extends Panel {
-       private static final long serialVersionUID = 1L;
-       private final ModeratorRightIcon rightModer;
-       private final WhiteboardRightIcon rightWb;
-       private final PresenterRightIcon rightPresenter;
-       private final ScreenShareRightIcon rightScreen;
-       private final RemoteControlRightIcon rightRemote;
-       private final AudioRightIcon rightAudio;
-       private final VideoRightIcon rightVideo;
-       private final MuteOthersRightIcon rightMuteOthers;
-
-       public ClientIconsPanel(String id, String uid) {
-               super(id);
-               setOutputMarkupId(true);
-               setOutputMarkupPlaceholderTag(true);
-               add(rightModer = new ModeratorRightIcon("right-moder", uid));
-               add(rightPresenter = new PresenterRightIcon("right-presenter", 
uid));
-               add(rightWb = new WhiteboardRightIcon("right-wb", uid));
-               add(rightScreen = new 
ScreenShareRightIcon("right-screen-share", uid));
-               add(rightRemote = new 
RemoteControlRightIcon("right-remote-control", uid));
-               add(rightAudio = new AudioRightIcon("right-audio", uid));
-               add(rightVideo = new VideoRightIcon("right-video", uid));
-               add(rightMuteOthers = new 
MuteOthersRightIcon("right-mute-others", uid));
-       }
-
-       @Override
-       protected void onInitialize() {
-               super.onInitialize();
-               update(null);
-       }
-
-       public ClientIconsPanel update(IPartialPageRequestHandler handler) {
-               rightModer.update(handler);
-               rightPresenter.update(handler);
-               rightWb.update(handler);
-               rightScreen.update(handler);
-               rightRemote.update(handler);
-               rightAudio.update(handler);
-               rightVideo.update(handler);
-               rightMuteOthers.update(handler);
-               return this;
-       }
-}
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
deleted file mode 100644
index 63f42cf..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-
--->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org";>
-<wicket:panel>
-       <span wicket:id="status" class="om-icon user-status"></span>
-       <span wicket:id="refresh"></span>
-       <span class="align-right typing-activity">
-               <i class="fas fa-pen-fancy"></i>
-       </span>
-       <div wicket:id="name" class="user name"></div>
-       <span wicket:id="user-speaks"></span>
-       <div wicket:id="actions" class="user actions">
-               <span wicket:id="icons"></span>
-               <div wicket:id="kick">
-                       <i class="fas fa-ban text-danger"></i>
-               </div>
-               <span wicket:id="privateChat" class="om-icon align-right 
clickable private-chat" wicket:message="title:1493" 
onclick="startPrivateChat($(this));">
-                       <i class="fas fa-edit"></i>
-               </span>
-               <div class="clear"></div>
-       </div>
-</wicket:panel>
-</html>
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
deleted file mode 100644
index d31d203..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.room.sidebar;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
-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.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;
-import org.apache.openmeetings.web.room.sidebar.icon.UserSpeaksIcon;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.panel.Panel;
-
-public class RoomClientPanel extends Panel {
-       private static final long serialVersionUID = 1L;
-
-       public RoomClientPanel(String id, ListItem<Client> item, final 
RoomPanel room) {
-               super(id, item.getModel());
-               setRenderBodyOnly(true);
-               Client c = item.getModelObject();
-               final String uid = c.getUid();
-               item.setMarkupId(String.format("user%s", c.getUid()));
-               item.add(AttributeModifier.append("style", 
String.format("background-image: url(%s);", c.getPictureUri())));
-               item.add(AttributeModifier.append("data-userid", 
c.getUserId()));
-               add(new RefreshIcon("refresh", uid));
-               final String name = c.getUser().getDisplayName();
-               add(new Label("name", name));
-               add(new UserSpeaksIcon("user-speaks", uid));
-               item.add(AttributeModifier.replace(ATTR_TITLE, name));
-               WebMarkupContainer actions = new WebMarkupContainer("actions");
-               actions.add(new KickIcon("kick", uid));
-               actions.add(new 
WebMarkupContainer("privateChat").setVisible(!room.getRoom().isHidden(RoomElement.CHAT)
 && !getUserId().equals(c.getUserId())));
-               actions.setVisible(room.getClient().hasRight(Right.MODERATOR));
-               if (c.getUid().equals(room.getClient().getUid())) {
-                       actions.add(new SelfIconsPanel("icons", uid, false));
-                       item.add(AttributeModifier.append(ATTR_CLASS, 
"current"));
-               } else {
-                       actions.add(new ClientIconsPanel("icons", uid));
-               }
-               add(actions);
-       }
-
-       @Override
-       protected void onInitialize() {
-               super.onInitialize();
-               Client c = (Client)getDefaultModelObject();
-               String status, statusTitle;
-               if (c.hasRight(Right.MODERATOR)) {
-                       status = "mod";
-                       statusTitle = "679";
-               } else if (c.hasRight(Right.WHITEBOARD) || 
c.hasRight(Right.PRESENTER)) {
-                       status = "wb";
-                       statusTitle = "678";
-               } else {
-                       status = "user";
-                       statusTitle = "677";
-               }
-               status = String.format("%s %s", status, 
((BasePage)getPage()).isRtl() ? ALIGN_LEFT : ALIGN_RIGHT);
-               add(new 
WebMarkupContainer("status").add(AttributeModifier.append(ATTR_CLASS, status), 
AttributeModifier.replace(ATTR_TITLE, getString(statusTitle))));
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
index 7d6f8ad..cf4eb35 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
@@ -26,7 +26,7 @@
                        <li class="nav-item">
                                <a href="#room-sidebar-tab-users" 
class="nav-link active om-icon big tab user" id="room-sidebar-users-tab" 
data-toggle="tab" role="tab" aria-controls="room-sidebar-tab-users" 
wicket:message="title:398">
                                        <i class="fas fa-users"></i>
-                                       <span class="label"><wicket:message 
key="398"/>&nbsp;</span><span wicket:id="user-count" class="badge 
badge-info">42</span>
+                                       <span class="label"><wicket:message 
key="398"/>&nbsp;</span><span class="badge badge-info user-count">42</span>
                                </a>
                        </li>
                        <li class="nav-item" wicket:enclosure="file-tab">
@@ -42,12 +42,13 @@
                </ul>
                <div class="tab-content">
                        <div id="room-sidebar-tab-users" class="tab-pane fade 
show active" role="tabpanel" aria-labelledby="room-sidebar-users-tab">
-                               <div wicket:id="icons" class="header"></div>
+                               <div class="header">
+                                       <span class="om-icon align-left 
settings clickable" onclick="VideoSettings.open();" 
wicket:message="title:306"></span>
+                                       <span class="om-icon align-left 
activity cam clickable" onclick="VideoManager.toggleActivity('VIDEO');" 
wicket:message="data-on:camera.on,data-off:camera.off"></span>
+                                       <span class="om-icon align-left 
activity mic bumper clickable" onclick="VideoManager.toggleActivity('AUDIO');" 
wicket:message="data-on:microphone.on,data-off:microphone.off"></span>
+                               </div>
                                <div class="user-list clear"> <!-- 
auto-scrollable -->
-                                       <div wicket:id="user-list"> <!-- 
content -->
-                                               <div wicket:id="user" 
class="user entry">
-                                                       <div 
wicket:id="user"></div>
-                                               </div>
+                                       <div class="users"> <!-- content -->
                                        </div>
                                </div>
                        </div>
@@ -61,5 +62,51 @@
        <div wicket:id="upload"></div>
        <div wicket:id="confirm-kick" />
        <div wicket:id="settings" />
+       <div hidden="hidden">
+               <div id="user-entry-stub" class="user entry clearfix" >
+                       <span class="om-icon user-status align-right " 
wicket:message="data-mod:679,data-wb:678,data-user:677"></span>
+                       <span class="align-right typing-activity">
+                               <i class="fas fa-pen-fancy"></i>
+                       </span>
+                       <div class="user name"></div>
+                       <span class="om-icon audio-activity" 
wicket:message="data-speaks:ulist.user.speaks,data-mute:ulist.user.muteothers"></span>
+                       <div class="user actions clearfix">
+                       </div>
+               </div>
+               <div id="user-av-restart">
+                       <span class="om-icon align-right restart clickable" 
wicket:message="title:lbl.refresh">
+                               <i class="fas fa-sync-alt"></i>
+                       </span>
+               </div>
+               <div id="user-actions-stub">
+                       <span class="om-icon align-left right camera clickable" 
wicket:message="data-request:ulist.right.video.request,data-revoke:ulist.right.video.revoke,data-grant:ulist.right.video.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right audio bumper 
clickable" 
wicket:message="data-request:ulist.right.audio.request,data-revoke:ulist.right.audio.revoke,data-grant:ulist.right.audio.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right presenter bumper 
clickable" 
wicket:message="data-request:ulist.right.presenter.request,data-revoke:ulist.right.presenter.revoke,data-grant:ulist.right.presenter.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right wb bumper 
clickable" 
wicket:message="data-request:ulist.right.wb.request,data-revoke:ulist.right.wb.revoke,data-grant:ulist.right.wb.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right screen-share 
bumper clickable" 
wicket:message="data-request:ulist.right.share.request,data-revoke:ulist.right.share.revoke,data-grant:ulist.right.share.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right remote-control 
bumper clickable" 
wicket:message="data-request:ulist.right.remote.request,data-revoke:ulist.right.remote.revoke,data-grant:ulist.right.remote.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left right moderator bumper 
clickable" 
wicket:message="data-request:ulist.right.moderator.request,data-revoke:ulist.right.moderator.revoke,data-grant:ulist.right.moderator.grant">
+                               <i class="fas"></i>
+                       </span>
+                       <span class="om-icon align-left kick bumper clickable" 
wicket:message="title:603">
+                               <i class="fas fa-ban text-danger"></i>
+                       </span>
+                       <span class="om-icon align-right private-chat 
clickable" wicket:message="title:1493">
+                               <i class="fas fa-edit"></i>
+                       </span>
+               </div>
+       </div>
 </wicket:panel>
 </html>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index 7531f66..567f63d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -18,14 +18,10 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
-import static java.util.Comparator.naturalOrder;
 import static org.apache.openmeetings.web.app.Application.kickUser;
 import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
-import java.util.Comparator;
-import java.util.List;
-
 import org.apache.openmeetings.core.remote.StreamProcessor;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
@@ -50,12 +46,7 @@ import 
org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
@@ -76,48 +67,13 @@ public class RoomSidebar extends Panel {
        private final RoomPanel room;
        private UploadDialog upload;
        private RoomFilePanel roomFiles;
-       private final WebMarkupContainer userList = new 
WebMarkupContainer("user-list");
        private final WebMarkupContainer fileTab = new 
WebMarkupContainer("file-tab");
-       private final SelfIconsPanel selfRights;
        private ConfirmationDialog confirmKick;
        private boolean showFiles;
        private boolean avInited = false;
        private Client kickedClient;
        private VideoSettings settings = new VideoSettings("settings");
        private ActivitiesPanel activities;
-       private final ListView<Client> users = new ListView<>("user", new 
LoadableDetachableModel<List<Client>>() {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               protected List<Client> load() {
-                       Client self = room.getClient();
-                       List<Client> list;
-                       if (!self.hasRight(Room.Right.MODERATOR) && 
room.getRoom().isHidden(RoomElement.USER_COUNT)) {
-                               list = List.of(self);
-                       } else {
-                               list = cm.listByRoom(room.getRoom().getId());
-                               list.sort(Comparator.<Client, 
Integer>comparing(c -> {
-                                                       if 
(c.hasRight(Room.Right.MODERATOR)) {
-                                                               return 0;
-                                                       }
-                                                       if 
(c.hasRight(Room.Right.PRESENTER)) {
-                                                               return 1;
-                                                       }
-                                                       return 5;
-                                               }, naturalOrder())
-                                               .thenComparing(c -> 
c.getUser().getDisplayName(), String::compareToIgnoreCase));
-                       }
-                       userCount.setDefaultModelObject(list.size());
-                       return list;
-               }
-       }) {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               protected void populateItem(ListItem<Client> item) {
-                       item.add(new RoomClientPanel("user", item, room));
-               }
-       };
        private final AbstractDefaultAjaxBehavior avSettings = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
 
@@ -139,7 +95,6 @@ public class RoomSidebar extends Panel {
                        }
                }
        };
-       private final Label userCount = new Label("user-count", Model.of(""));
 
        @SpringBean
        private ClientManager cm;
@@ -149,7 +104,6 @@ public class RoomSidebar extends Panel {
        public RoomSidebar(String id, final RoomPanel room) {
                super(id);
                this.room = room;
-               selfRights = new SelfIconsPanel("icons", room.getUid(), true);
        }
 
        @Override
@@ -165,10 +119,9 @@ public class RoomSidebar extends Panel {
                        }
                };
                roomFiles = new RoomFilePanel("tree", room, addFolder);
-               add(selfRights, userList.add(users).setOutputMarkupId(true)
-                               , fileTab.setVisible(!room.isInterview()), 
roomFiles.setVisible(!room.isInterview()));
+               add(fileTab.setVisible(!room.isInterview()), 
roomFiles.setVisible(!room.isInterview()));
 
-               add(addFolder, settings, userCount.setOutputMarkupId(true));
+               add(addFolder, settings);
                add(avSettings);
                add(confirmKick = new ConfirmationDialog("confirm-kick", new 
ResourceModel("603"), new ResourceModel("605")) {
                        private static final long serialVersionUID = 1L;
@@ -202,7 +155,6 @@ public class RoomSidebar extends Panel {
                        return;
                }
                updateShowFiles(handler);
-               handler.add(selfRights.update(handler), userList, userCount);
        }
 
        public void updateFiles(IPartialPageRequestHandler handler) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.html
deleted file mode 100644
index e92efc8..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org";>
-<wicket:panel>
-       <span wicket:id="settings"></span>
-       <span wicket:id="right-video">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="cam"></span>
-       <span wicket:id="right-audio">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="mic"></span>
-       <span wicket:id="right-presenter">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-wb">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-screen-share">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-remote-control">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-mute-others">
-               <i class="fas"/>
-       </span>
-       <span wicket:id="right-moder">
-               <i class="fas"/>
-       </span>
-       <div class="clear"></div>
-</wicket:panel>
-</html>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.java
deleted file mode 100644
index daea549..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/SelfIconsPanel.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.room.sidebar;
-
-import org.apache.openmeetings.web.room.sidebar.icon.SettingsIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.activity.CamActivityIcon;
-import org.apache.openmeetings.web.room.sidebar.icon.activity.MicActivityIcon;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-
-public class SelfIconsPanel extends ClientIconsPanel {
-       private static final long serialVersionUID = 1L;
-       private final SettingsIcon settings;
-       private final CamActivityIcon cam;
-       private final MicActivityIcon mic;
-       private final boolean header;
-
-       public SelfIconsPanel(String id, String uid, boolean header) {
-               super(id, uid);
-               this.header = header;
-               add(settings = new SettingsIcon("settings", uid)
-                       , cam = new CamActivityIcon("cam", uid)
-                       , mic = new MicActivityIcon("mic", uid));
-       }
-
-       @Override
-       protected void onInitialize() {
-               super.onInitialize();
-               update(null);
-               if (header) {
-                       //This is required to avoid initial displaying of all 
icons
-                       setVisible(false);
-               }
-       }
-
-       @Override
-       public ClientIconsPanel update(IPartialPageRequestHandler handler) {
-               setVisible(true);
-               super.update(handler);
-               settings.update(handler);
-               cam.update(handler);
-               mic.update(handler);
-               return this;
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
deleted file mode 100644
index 8e0368a..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.room.sidebar.icon;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
-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 org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.Right;
-import org.apache.openmeetings.web.app.ClientManager;
-import org.apache.openmeetings.web.pages.BasePage;
-import org.apache.openmeetings.web.room.RoomPanel;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-public abstract class ClientIcon extends WebMarkupContainer {
-       protected static final String FUNC_ACTION = "OmUtil.roomAction";
-       private static final long serialVersionUID = 1L;
-       protected static final String ICON_CLASS = "om-icon ";
-       protected static final String CLS_CLICKABLE = "clickable ";
-       private boolean self;
-       protected final String uid;
-       protected String mainCssClass;
-       protected final StringBuilder cssClass = new StringBuilder(ICON_CLASS);
-       @SpringBean
-       private ClientManager cm;
-
-       public ClientIcon(String id, String uid) {
-               super(id);
-               this.uid = uid;
-               setOutputMarkupId(true);
-               setOutputMarkupPlaceholderTag(true);
-       }
-
-       @Override
-       protected void onInitialize() {
-               super.onInitialize();
-               Client rc = getRoomClient();
-               self = rc != null && rc.getUid().equals(uid);
-               update(null);
-       }
-
-       protected abstract String getTitle();
-
-       protected String getAlign() {
-               return ((BasePage)getPage()).isRtl() ? ALIGN_RIGHT : ALIGN_LEFT;
-       }
-
-       protected abstract boolean isClickable();
-
-       protected abstract String getScript();
-
-       protected void internalUpdate() {
-       }
-
-       public final void update(IPartialPageRequestHandler handler) {
-               cssClass.setLength(0);
-               StringBuilder cls = new StringBuilder(ICON_CLASS);
-               cls.append(getAlign()).append(mainCssClass);
-               if (isClickable()) {
-                       //request/remove
-                       cls.append(CLS_CLICKABLE);
-                       add(addOnClick(getScript()));
-               } else {
-                       add(addOnClick(""));
-               }
-               internalUpdate();
-               add(AttributeModifier.replace(ATTR_TITLE, getTitle()));
-               add(AttributeModifier.replace(ATTR_CLASS, 
cls.append(cssClass)));
-               if (handler != null) {
-                       handler.add(this);
-               }
-       }
-
-       protected Client getClient() {
-               return cm.get(uid);
-       }
-
-       protected boolean hasRight(Right right) {
-               Client c = getClient();
-               return c != null && c.hasRight(right);
-       }
-
-       protected boolean roomHasRight(Right right) {
-               Client rc = getRoomClient();
-               return rc != null && rc.hasRight(right);
-       }
-
-       protected Client getRoomClient() {
-               RoomPanel rp = getRoomPanel();
-               return rp == null ? null : rp.getClient();
-       }
-
-       protected RoomPanel getRoomPanel() {
-               return findParent(RoomPanel.class);
-       }
-
-       protected Room getRoom() {
-               RoomPanel rp = getRoomPanel();
-               return rp == null ? null : rp.getRoom();
-       }
-
-       public boolean isSelf() {
-               return self;
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickIcon.java
deleted file mode 100644
index b9c5e6f..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickIcon.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.room.sidebar.icon;
-
-import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.room.Room.Right;
-import org.apache.openmeetings.web.room.RoomPanel.Action;
-
-public class KickIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-
-       public KickIcon(String id, String uid) {
-               super(id, uid);
-               mainCssClass = "kick ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString("603");
-       }
-
-       @Override
-       protected boolean isClickable() {
-               return !isSelf() && roomHasRight(Right.MODERATOR) && 
!hasRight(Right.SUPER_MODERATOR);
-       }
-
-       @Override
-       protected String getScript() {
-               Client c = getClient();
-               return c == null ? "" : String.format("%s({action: '%s', uid: 
'%s'});", FUNC_ACTION, Action.kick.name(), c.getUid());
-       }
-
-       @Override
-       public void internalUpdate() {
-               super.internalUpdate();
-               setVisible(isClickable());
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
deleted file mode 100644
index b19134e..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.room.sidebar.icon;
-
-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.basic.Client.Activity;
-import org.apache.openmeetings.web.pages.BasePage;
-
-public class RefreshIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-
-       public RefreshIcon(String id, String uid) {
-               super(id, uid);
-               mainCssClass = "restart ui-icon-refresh ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString("lbl.refresh");
-       }
-
-       @Override
-       protected String getAlign() {
-               return ((BasePage)getPage()).isRtl() ? ALIGN_LEFT : ALIGN_RIGHT;
-       }
-
-       @Override
-       protected boolean isClickable() {
-               final Client c = getClient();
-               return c != null && (c.hasActivity(Activity.AUDIO) || 
c.hasActivity(Activity.VIDEO));
-       }
-
-       @Override
-       protected String getScript() {
-               return String.format("VideoManager.refresh('%s');", uid);
-       }
-
-       @Override
-       public void internalUpdate() {
-               super.internalUpdate();
-               setVisible(isClickable());
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
deleted file mode 100644
index 87219e9..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.room.sidebar.icon;
-
-public class SettingsIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-
-       public SettingsIcon(String id, String uid) {
-               super(id, uid);
-               mainCssClass = "settings ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString("306");
-       }
-
-       @Override
-       protected boolean isClickable() {
-               return true;
-       }
-
-       @Override
-       protected String getScript() {
-               return "VideoSettings.open();";
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/UserSpeaksIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/UserSpeaksIcon.java
deleted file mode 100644
index f215610..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/UserSpeaksIcon.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.room.sidebar.icon;
-
-import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.basic.Client.Activity;
-import org.apache.openmeetings.db.entity.room.Room;
-
-public class UserSpeaksIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-
-       public UserSpeaksIcon(String id, String uid) {
-               super(id, uid);
-               mainCssClass = "audio-activity ";
-       }
-
-       private boolean isActive() {
-               Client c = getClient();
-               return c != null && (c.hasActivity(Activity.AUDIO) && 
roomHasRight(Room.Right.MUTE_OTHERS));
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString("ulist.user.speaks") + (isActive() ? 
getString("ulist.user.muteothers") : "");
-       }
-
-       @Override
-       protected String getAlign() {
-               return "";
-       }
-
-       @Override
-       protected boolean isClickable() {
-               return isActive();
-       }
-
-       @Override
-       protected String getScript() {
-               return String.format("VideoManager.clickMuteOthers('%s');", 
uid);
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
deleted file mode 100644
index 61a2089..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.room.sidebar.icon.activity;
-
-import org.apache.openmeetings.db.entity.basic.Client.Activity;
-
-public class CamActivityIcon extends RoomActivityIcon {
-       private static final long serialVersionUID = 1L;
-
-       public CamActivityIcon(String id, String uid) {
-               super(id, uid, Activity.VIDEO);
-               mainCssClass = "activity cam ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(getClient().hasActivity(Activity.VIDEO) ? 
"camera.off" : "camera.on");
-       }
-
-       @Override
-       public boolean isEnabled() {
-               return getClient().isCamEnabled();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
deleted file mode 100644
index c867406..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.room.sidebar.icon.activity;
-
-import org.apache.openmeetings.db.entity.basic.Client.Activity;
-
-public class MicActivityIcon extends RoomActivityIcon {
-       private static final long serialVersionUID = 1L;
-
-       public MicActivityIcon(String id, String uid) {
-               super(id, uid, Activity.AUDIO);
-               mainCssClass = "activity mic bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(getClient().hasActivity(Activity.AUDIO) ? 
"microphone.off" : "microphone.on");
-       }
-
-       @Override
-       public boolean isEnabled() {
-               return getClient().isMicEnabled();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
deleted file mode 100644
index 2cf1cbd..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.room.sidebar.icon.activity;
-
-import static 
org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed;
-
-import org.apache.openmeetings.db.entity.basic.Client.Activity;
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.web.room.sidebar.icon.ClientIcon;
-
-public abstract class RoomActivityIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-       private static final String CLS_ENABLED = "enabled ";
-       private static final String CLS_DISABLED = "disabled";
-       protected final Activity activity;
-
-       public RoomActivityIcon(String id, String uid, Activity activity) {
-               super(id, uid);
-               this.activity = activity;
-       }
-
-       @Override
-       protected String getScript() {
-               return String.format("VideoManager.toggleActivity('%s');", 
activity.name());
-       }
-
-       protected boolean visible() {
-               Room r = getRoom();
-               return activityAllowed(getClient(), activity, r);
-       }
-
-       @Override
-       protected boolean isClickable() {
-               return isEnabled();
-       }
-
-       @Override
-       protected void internalUpdate() {
-               setVisible(visible());
-               if (!isEnabled()) {
-                       cssClass.append(CLS_DISABLED);
-               } else if (getClient().hasActivity(activity)) {
-                       cssClass.append(CLS_ENABLED);
-               }
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/AudioRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/AudioRightIcon.java
deleted file mode 100644
index 8413e3f..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/AudioRightIcon.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class AudioRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public AudioRightIcon(String id, String uid) {
-               super(id, uid, Right.AUDIO);
-               mainCssClass = "right audio bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.audio.%s", isSelf() 
? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ModeratorRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ModeratorRightIcon.java
deleted file mode 100644
index 1dba2cf..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ModeratorRightIcon.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class ModeratorRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public ModeratorRightIcon(String id, String uid) {
-               super(id, uid, Right.MODERATOR);
-               mainCssClass = "right moderator bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.moderator.%s", 
isSelf() ? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/MuteOthersRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/MuteOthersRightIcon.java
deleted file mode 100644
index a21a894..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/MuteOthersRightIcon.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class MuteOthersRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public MuteOthersRightIcon(String id, String uid) {
-               super(id, uid, Right.MUTE_OTHERS);
-               mainCssClass = "right mute-others ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.muteothers.%s", 
isSelf() ? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/PresenterRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/PresenterRightIcon.java
deleted file mode 100644
index 6171af3..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/PresenterRightIcon.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.Right;
-import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-
-public class PresenterRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public PresenterRightIcon(String id, String uid) {
-               super(id, uid, Right.PRESENTER);
-               mainCssClass = "right presenter bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.presenter.%s", 
isSelf() ? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-
-       @Override
-       protected boolean visible() {
-               Room r = getRoom();
-               return Room.Type.INTERVIEW != r.getType() && 
!r.isHidden(RoomElement.WHITEBOARD) && super.visible();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RemoteControlRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RemoteControlRightIcon.java
deleted file mode 100644
index 2f8a126..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RemoteControlRightIcon.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class RemoteControlRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public RemoteControlRightIcon(String id, String uid) {
-               super(id, uid, Right.REMOTE_CONTROL);
-               mainCssClass = "right remote-control bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.remote.%s", 
isSelf() ? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-
-       @Override
-       protected boolean visible() {
-               return getRoomPanel().screenShareAllowed() && super.visible();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RoomRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RoomRightIcon.java
deleted file mode 100644
index e17e66e..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/RoomRightIcon.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-import org.apache.openmeetings.web.room.RoomPanel;
-import org.apache.openmeetings.web.room.sidebar.icon.ClientIcon;
-
-public abstract class RoomRightIcon extends ClientIcon {
-       private static final long serialVersionUID = 1L;
-       private static final String CLS_GRANTED = "granted ";
-       protected final Right right;
-
-       public RoomRightIcon(String id, String uid, Right right) {
-               super(id, uid);
-               this.right = right;
-       }
-
-       @Override
-       protected boolean isClickable() {
-               return (isSelf() && !hasRight()) || !isSelf() && 
roomHasRight(Right.MODERATOR);
-       }
-
-       protected boolean hasRight() {
-               return hasRight(right);
-       }
-
-       @Override
-       protected String getScript() {
-               return String.format("OmUtil.roomAction({action: '%s', right: 
'%s', uid: '%s'});"
-                               , RoomPanel.Action.toggleRight.name(), 
right.name(), uid);
-       }
-
-       protected boolean visible() {
-               return !hasRight(Right.SUPER_MODERATOR) && (
-                               (isSelf() && !hasRight() && 
getRoom().isAllowUserQuestions())
-                               || (!isSelf() && roomHasRight(Right.MODERATOR))
-                       );
-       }
-
-       @Override
-       public void internalUpdate() {
-               setVisible(visible());
-               if (hasRight()) {
-                       cssClass.append(CLS_GRANTED);
-               }
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ScreenShareRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ScreenShareRightIcon.java
deleted file mode 100644
index c2f49ff..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/ScreenShareRightIcon.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class ScreenShareRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public ScreenShareRightIcon(String id, String uid) {
-               super(id, uid, Right.SHARE);
-               mainCssClass = "right screen-share ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.share.%s", isSelf() 
? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-
-       @Override
-       protected boolean visible() {
-               return getRoomPanel().screenShareAllowed() && super.visible();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/VideoRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/VideoRightIcon.java
deleted file mode 100644
index 1b9b10b..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/VideoRightIcon.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.room.Room.Right;
-
-public class VideoRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public VideoRightIcon(String id, String uid) {
-               super(id, uid, Right.VIDEO);
-               mainCssClass = "right camera ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.video.%s", isSelf() 
? "request" : (hasRight() ? "revoke" : "grant")));
-       }
-
-       @Override
-       protected boolean visible() {
-               return !getRoom().isAudioOnly() && super.visible();
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/WhiteboardRightIcon.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/WhiteboardRightIcon.java
deleted file mode 100644
index a66bae1..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/right/WhiteboardRightIcon.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.room.sidebar.icon.right;
-
-import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.room.Room;
-import org.apache.openmeetings.db.entity.room.Room.Right;
-import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-
-public class WhiteboardRightIcon extends RoomRightIcon {
-       private static final long serialVersionUID = 1L;
-
-       public WhiteboardRightIcon(String id, String uid) {
-               super(id, uid, Right.WHITEBOARD);
-               mainCssClass = "right wb bumper ";
-       }
-
-       @Override
-       protected String getTitle() {
-               return getString(String.format("ulist.right.wb.%s", isSelf() ? 
"request" : (hasRight() ? "revoke" : "grant")));
-       }
-
-       @Override
-       protected boolean hasRight() {
-               final Client c = getClient();
-               return c != null && (c.hasRight(Right.PRESENTER) || 
c.hasRight(right));
-       }
-
-       @Override
-       protected boolean visible() {
-               Room r = getRoom();
-               return Room.Type.INTERVIEW != r.getType() && 
!r.isHidden(RoomElement.WHITEBOARD) && super.visible();
-       }
-}
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 1d6f5f7..e532de0 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
@@ -54,7 +54,7 @@
                        <a id="hyperlink" class="chat btn btn-outline-secondary 
dropdown-toggle" data-toggle="dropdown" title="Hyperlink">
                                <i class="fas fa-link"></i>
                        </a>
-                       <div wicket:id="hyperlink" class="dropdown-menu 
input-append">
+                       <div class="dropdown-menu input-append">
                                <input class="span2" placeholder="URL" 
type="text" onkeypress="if (event.keyCode === 13) 
{$(this).parent().find('button').trigger('click');}; return event.keyCode !== 
13;"/>
                                <button class="btn btn-outline-secondary" 
type="button"><wicket:message key="1261"/></button>
                        </div>
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 7858308..e9d6428 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
@@ -38,7 +38,6 @@ import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.ClientManager;
-import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
@@ -180,8 +179,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
        @Override
        protected void onInitialize() {
                super.onInitialize();
-               BasePage page = (BasePage)getPage();
-               add(toolbar.add(new 
WebMarkupContainer("hyperlink").add(AttributeModifier.append("class", 
page.isRtl() ? "dropdown-menu-left" : "dropdown-menu-right"))));
+               add(toolbar);
                add(download);
                delBtn = new AjaxButton("delete", chatForm) {
                        private static final long serialVersionUID = 1L;
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
index 1c01e14..292a1b2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
@@ -1,7 +1,7 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
 var Chat = function() {
-       const align = Settings.isRtl ? 'align-right' : 'align-left'
-               , alignIco = Settings.isRtl ? 'align-left' : 'align-right'
+       const align = 'align-left'
+               , alignIco = 'align-right'
                , msgIdPrefix = 'chat-msg-id-'
                , closedSize = 20
                , closedSizePx = closedSize + "px"
diff --git a/openmeetings-web/src/main/webapp/css/raw-room.css 
b/openmeetings-web/src/main/webapp/css/raw-room.css
index d83aa36..69bb62f 100644
--- a/openmeetings-web/src/main/webapp/css/raw-room.css
+++ b/openmeetings-web/src/main/webapp/css/raw-room.css
@@ -236,6 +236,7 @@ html[dir="rtl"] .room-block .sidebar {
 }
 .activity.cam.enabled.om-icon::before {
        content: '\f4e2';
+       color: var(--warning);
 }
 .activity.mic.om-icon::before {
        content: '\f130';
@@ -247,6 +248,7 @@ html[dir="rtl"] .room-block .sidebar {
 }
 .activity.mic.enabled.om-icon::before {
        content: '\f131';
+       color: var(--warning);
 }
 .room-block .sidebar .user-list .user.current {
        font-weight: bold;

Reply via email to