loleaflet/Makefile.am                         |    1 
 loleaflet/css/device-mobile.css               |   39 ++++
 loleaflet/src/control/Control.MobileTopBar.js |   38 ---
 loleaflet/src/control/Control.StatusBar.js    |  187 -------------------
 loleaflet/src/control/Control.Toolbar.js      |   39 ----
 loleaflet/src/control/Control.UserList.js     |  252 ++++++++++++++++++++++++++
 loleaflet/src/main.js                         |    1 
 7 files changed, 305 insertions(+), 252 deletions(-)

New commits:
commit 610e2dbd583da4537e8cdef7f10318dc43e8c269
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Apr 14 18:07:25 2020 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Wed Apr 15 16:51:48 2020 +0200

    Move user list to a separate file
    
    Change-Id: I1cd8881d8ea342b96bd5ea5bd4972f971c89881d
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/92210
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/loleaflet/Makefile.am b/loleaflet/Makefile.am
index a57e9ebd4..0cb94a244 100644
--- a/loleaflet/Makefile.am
+++ b/loleaflet/Makefile.am
@@ -266,6 +266,7 @@ LOLEAFLET_JS =\
        src/control/Control.SearchBar.js \
        src/control/Control.MobileTopBar.js \
        src/control/Control.MobileBottomBar.js \
+       src/control/Control.UserList.js \
        src/control/Control.Layers.js \
        src/control/Search.js \
        src/control/Permission.js \
diff --git a/loleaflet/css/device-mobile.css b/loleaflet/css/device-mobile.css
index 161686840..3f795fa53 100644
--- a/loleaflet/css/device-mobile.css
+++ b/loleaflet/css/device-mobile.css
@@ -23,6 +23,45 @@ input#follow-checkbox {
        border: 2px solid #aaa;
        outline: none;
        box-shadow: #00000015 0px 0px 2px 1px;
+       margin: 0px !important;
+}
+#follow-container {
+       display: block;
+       position: relative;
+       font-size: 22px;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+  }
+.checkmark {
+       position: absolute;
+       top: 0;
+       left: 0;
+       height: 25px;
+       width: 25px;
+}
+.checkmark:after {
+       content: "";
+       position: absolute;
+       display: none;
+}
+.checkmark:after {
+       left: 9px;
+       top: 5px;
+       width: 5px;
+       height: 10px;
+       border: solid white;
+       border-width: 0 3px 3px 0;
+       -webkit-transform: rotate(45deg);
+       -ms-transform: rotate(45deg);
+       transform: rotate(45deg);
+  }
+input#follow-checkbox:checked ~ .checkmark:after {
+       display: block;
+}
+input#follow-checkbox:checked ~ .checkmark {
+       background-color: #0b87e7;
 }
 #userlist_table + hr { display: none;}
 div#w2ui-overlay-actionbar.w2ui-overlay{
diff --git a/loleaflet/src/control/Control.MobileTopBar.js 
b/loleaflet/src/control/Control.MobileTopBar.js
index 2d4a917f3..76874fb9c 100644
--- a/loleaflet/src/control/Control.MobileTopBar.js
+++ b/loleaflet/src/control/Control.MobileTopBar.js
@@ -3,7 +3,7 @@
  * L.Control.SearchBar
  */
 
-/* global $ w2ui _ _UNO */
+/* global $ w2ui _UNO */
 L.Control.MobileTopBar = L.Control.extend({
 
        options: {
@@ -32,16 +32,7 @@ L.Control.MobileTopBar = L.Control.extend({
                                {type: 'button',  id: 
'insertion_mobile_wizard', img: 'insertion_mobile_wizard', disabled: true},
                                {type: 'button',  id: 'insertcomment', img: 
'insertcomment', disabled: true},
                                {type: 'button',  id: 'fullscreen', img: 
'fullscreen', hint: _UNO('.uno:FullScreen', 'text')},
-                               {type: 'drop', id: 'userlist', img: 'users', 
html: '<div id="userlist_container"><table 
id="userlist_table"><tbody></tbody></table>' +
-                                       '<hr><table class="loleaflet-font" 
id="editor-btn">' +
-                                       '<tr>' +
-                                       '<td><input type="checkbox" 
name="alwaysFollow" id="follow-checkbox" onclick="editorUpdate(event)"></td>' +
-                                       '<td>' + _('Always follow the editor') 
+ '</td>' +
-                                       '</tr>' +
-                                       '</table>' +
-                                       '<p id="currently-msg">' + _('Current') 
+ ' - <b><span id="current-editor"></span></b></p>' +
-                                       '</div>'
-                               },
+                               {type: 'drop', id: 'userlist', img: 'users', 
html: L.control.createUserListWidget()},
                        ];
                } else if (docType == 'spreadsheet') {
                        return [
@@ -53,16 +44,7 @@ L.Control.MobileTopBar = L.Control.extend({
                                {type: 'button',  id: 
'insertion_mobile_wizard', img: 'insertion_mobile_wizard', disabled: true},
 //                             {type: 'button',  id: 'insertcomment', img: 
'insertcomment', disabled: true},
                                {type: 'button',  id: 'fullscreen', img: 
'fullscreen', hint: _UNO('.uno:FullScreen', 'text')},
-                               {type: 'drop', id: 'userlist', img: 'users', 
html: '<div id="userlist_container"><table 
id="userlist_table"><tbody></tbody></table>' +
-                                       '<hr><table class="loleaflet-font" 
id="editor-btn">' +
-                                       '<tr>' +
-                                       '<td><input type="checkbox" 
name="alwaysFollow" id="follow-checkbox" onclick="editorUpdate(event)"></td>' +
-                                       '<td>' + _('Always follow the editor') 
+ '</td>' +
-                                       '</tr>' +
-                                       '</table>' +
-                                       '<p id="currently-msg">' + _('Current') 
+ ' - <b><span id="current-editor"></span></b></p>' +
-                                       '</div>'
-                               },
+                               {type: 'drop', id: 'userlist', img: 'users', 
html: L.control.createUserListWidget()},
                        ];
                } else if (docType == 'presentation') {
                        return [
@@ -74,16 +56,7 @@ L.Control.MobileTopBar = L.Control.extend({
                                {type: 'button',  id: 'mobile_wizard', img: 
'mobile_wizard', disabled: true},
                                {type: 'button',  id: 
'insertion_mobile_wizard', img: 'insertion_mobile_wizard', disabled: true},
                                {type: 'button',  id: 'insertcomment', img: 
'insertcomment', disabled: true},
-                               {type: 'drop', id: 'userlist', img: 'users', 
hidden: true, html: '<div id="userlist_container"><table 
id="userlist_table"><tbody></tbody></table>' +
-                                       '<hr><table class="loleaflet-font" 
id="editor-btn">' +
-                                       '<tr>' +
-                                       '<td><input type="checkbox" 
name="alwaysFollow" id="follow-checkbox" onclick="editorUpdate(event)"></td>' +
-                                       '<td>' + _('Always follow the editor') 
+ '</td>' +
-                                       '</tr>' +
-                                       '</table>' +
-                                       '<p id="currently-msg">' + _('Current') 
+ ' - <b><span id="current-editor"></span></b></p>' +
-                                       '</div>'
-                               },
+                               {type: 'drop', id: 'userlist', img: 'users', 
hidden: true, html: L.control.createUserListWidget()},
                        ];
                }
        },
@@ -188,6 +161,9 @@ L.Control.MobileTopBar = L.Control.extend({
                                toolbar.check(id);
                        }
                }
+               else if (id === 'userlist') {
+                       this.map.fire('openuserlist');
+               }
        },
 
        onUpdatePermission: function(e) {
diff --git a/loleaflet/src/control/Control.StatusBar.js 
b/loleaflet/src/control/Control.StatusBar.js
index bfe2866ae..26db62d11 100644
--- a/loleaflet/src/control/Control.StatusBar.js
+++ b/loleaflet/src/control/Control.StatusBar.js
@@ -5,14 +5,6 @@
 
 /* global $ w2ui w2utils _ _UNO */
 L.Control.StatusBar = L.Control.extend({
-       options: {
-               userPopupTimeout: null,
-               userJoinedPopupMessage: '<div>' + _('%user has joined') + 
'</div>',
-               userLeftPopupMessage: '<div>' + _('%user has left') + '</div>',
-               nUsers: undefined,
-               oneUser: undefined,
-               noUser: undefined
-       },
 
        initialize: function () {
        },
@@ -21,12 +13,8 @@ L.Control.StatusBar = L.Control.extend({
                this.map = map;
 
                map.on('doclayerinit', this.onDocLayerInit, this);
-               map.on('addview', this.onAddView, this);
-               map.on('removeview', this.onRemoveView, this);
                map.on('commandvalues', this.onCommandValues, this);
                map.on('commandstatechanged', this.onCommandStateChanged, this);
-               map.on('deselectuser', this.deselectUser, this);
-
        },
 
        hideTooltip: function(toolbar, id) {
@@ -67,27 +55,6 @@ L.Control.StatusBar = L.Control.extend({
                return text;
        },
 
-       escapeHtml: function(input) {
-               return $('<div>').text(input).html();
-       },
-
-       getUserItem: function(viewId, userName, extraInfo, color) {
-               var html = '<tr class="useritem" id="user-' + viewId + '" 
onclick="onUseritemClicked(event)">' +
-                                '<td class=usercolor>';
-               if (extraInfo !== undefined && extraInfo.avatar !== undefined) {
-                       html += '<img class="avatar-img" src="' + 
extraInfo.avatar + '" style="border-color: ' + color  + ';" />';
-               } else {
-                       html += '<div class="user-info" 
style="background-color: ' + color  + ';" />';
-               }
-       
-               // TODO: Add mail and other links as sub-menu.
-               html += '</td>' +
-                                '<td class="username loleaflet-font" >' + 
userName + '</td>' +
-                       '</tr>';
-       
-               return html;
-       },
-
        _updateVisibilityForToolbar: function(toolbar) {
                if (!toolbar)
                        return;
@@ -118,41 +85,6 @@ L.Control.StatusBar = L.Control.extend({
                this._updateVisibilityForToolbar(w2ui['actionbar']);
        },
 
-       updateUserListCount: function() {
-               var actionbar = w2ui.actionbar;
-               var userlistItem = actionbar && actionbar.get('userlist');
-               if (userlistItem == null) {
-                       return;
-               }
-       
-               var count = $(userlistItem.html).find('#userlist_table tbody 
tr').length;
-               if (count > 1) {
-                       userlistItem.text = this.options.nUsers.replace('%n', 
count);
-               } else if (count === 1) {
-                       userlistItem.text = this.options.oneUser;
-               } else {
-                       userlistItem.text = this.options.noUser;
-               }
-       
-               w2ui['actionbar'].refresh();
-       
-               var hideUserList =
-                       window.ThisIsAMobileApp ||
-                       (this.map['wopi'].HideUserList !== null && 
this.map['wopi'].HideUserList !== undefined &&
-                               ($.inArray('true', 
this.map['wopi'].HideUserList) >= 0) ||
-                               (window.mode.isMobile() && $.inArray('mobile', 
this.map['wopi'].HideUserList) >= 0) ||
-                               (window.mode.isTablet() && $.inArray('tablet', 
this.map['wopi'].HideUserList) >= 0) ||
-                               (window.mode.isDesktop() && 
$.inArray('desktop', this.map['wopi'].HideUserList) >= 0));
-       
-               if (!hideUserList && count > 1) {
-                       actionbar.show('userlist');
-                       actionbar.show('userlistbreak');
-               } else {
-                       actionbar.hide('userlist');
-                       actionbar.hide('userlistbreak');
-               }
-       },
-
        onClick: function(e, id, item, subItem) {
                if ('actionbar' in w2ui && w2ui['actionbar'].get(id) !== null) {
                        var toolbar = w2ui['actionbar'];
@@ -224,6 +156,9 @@ L.Control.StatusBar = L.Control.extend({
                                this.map.sendUnoCommand('.uno:StatusBarFunc', 
command);
                        });
                }
+               else if (id === 'userlist') {
+                       this.map.fire('openuserlist');
+               }
        },
 
        create: function() {
@@ -246,16 +181,7 @@ L.Control.StatusBar = L.Control.extend({
                                        {type: 'button',  id: 'cancelsearch', 
img: 'cancel', hint: _('Cancel the search'), hidden: true},
                                        {type: 'html',  id: 'left'},
                                        {type: 'html',  id: 'right'},
-                                       {type: 'drop', id: 'userlist', img: 
'users', hidden: true, html: '<div id="userlist_container"><table 
id="userlist_table"><tbody></tbody></table>' +
-                                               '<hr><table 
class="loleaflet-font" id="editor-btn">' +
-                                               '<tr>' +
-                                               '<td><input type="checkbox" 
name="alwaysFollow" id="follow-checkbox" onclick="editorUpdate(event)"></td>' +
-                                               '<td>' + _('Always follow the 
editor') + '</td>' +
-                                               '</tr>' +
-                                               '</table>' +
-                                               '<p id="currently-msg">' + 
_('Current') + ' - <b><span id="current-editor"></span></b></p>' +
-                                               '</div>'
-                                       },
+                                       {type: 'drop', id: 'userlist', img: 
'users', hidden: true, html: L.control.createUserListWidget()},
                                        {type: 'break', id: 'userlistbreak', 
hidden: true, mobile: false },
                                        {type: 'button',  id: 'prev', img: 
'prev', hint: _UNO('.uno:PageUp', 'text')},
                                        {type: 'button',  id: 'next', img: 
'next', hint: _UNO('.uno:PageDown', 'text')},
@@ -287,22 +213,6 @@ L.Control.StatusBar = L.Control.extend({
                                ],
                                onClick: function (e) {
                                        that.hideTooltip(this, e.target);
-                                       if (e.item.id === 'userlist') {
-                                               setTimeout(function() {
-                                                       var cBox = 
$('#follow-checkbox')[0];
-                                                       var docLayer = 
that.map._docLayer;
-                                                       var editorId = 
docLayer._editorId;
-
-                                                       if (cBox)
-                                                               cBox.checked = 
docLayer._followEditor;
-
-                                                       if (docLayer.editorId 
!== -1 && that.map._viewInfo[editorId])
-                                                               
$('#current-editor').text(that.map._viewInfo[editorId].username);
-                                                       else
-                                                               
$('#currently-msg').hide();
-                                               }, 100);
-                                               return;
-                                       }
                                        that.onClick(e, e.target, e.item, 
e.subItem);
                                },
                                onRefresh: function() {
@@ -487,17 +397,7 @@ L.Control.StatusBar = L.Control.extend({
                        break;
                }
 
-               if (window.mode.isMobile() || window.mode.isTablet()) {
-                       this.options.nUsers = '%n';
-                       this.options.oneUser = '1';
-                       this.options.noUser = '0';
-               } else {
-                       this.options.nUsers = _('%n users');
-                       this.options.oneUser = _('1 user');
-                       this.options.noUser = _('0 users');
-               }
-
-               this.updateUserListCount();
+               this.map.fire('updateuserlistcount');
 
                this._updateToolbarsVisibility();
 
@@ -505,74 +405,6 @@ L.Control.StatusBar = L.Control.extend({
                        statusbar.refresh();
        },
 
-       onAddView: function(e) {
-               var userlistItem = w2ui['actionbar'].get('userlist');
-               var username = this.escapeHtml(e.username);
-               var showPopup = false;
-       
-               if (userlistItem !== null)
-                       showPopup = $(userlistItem.html).find('#userlist_table 
tbody tr').length > 0;
-       
-               if (showPopup) {
-                       $('#tb_actionbar_item_userlist')
-                               .w2overlay({
-                                       class: 'loleaflet-font',
-                                       html: 
this.options.userJoinedPopupMessage.replace('%user', username),
-                                       style: 'padding: 5px'
-                               });
-                       clearTimeout(this.options.userPopupTimeout);
-                       var that = this;
-                       this.options.userPopupTimeout = setTimeout(function() {
-                               $('#tb_actionbar_item_userlist').w2overlay('');
-                               clearTimeout(that.options.userPopupTimeout);
-                               that.options.userPopupTimeout = null;
-                       }, 3000);
-               }
-       
-               var color = L.LOUtil.rgbToHex(this.map.getViewColor(e.viewId));
-               if (e.viewId === this.map._docLayer._viewId) {
-                       username = _('You');
-                       color = '#000';
-               }
-       
-               // Mention readonly sessions in userlist
-               if (e.readonly) {
-                       username += ' (' +  _('Readonly') + ')';
-               }
-       
-               if (userlistItem !== null) {
-                       var newhtml = 
$(userlistItem.html).find('#userlist_table 
tbody').append(this.getUserItem(e.viewId, username, e.extraInfo, 
color)).parent().parent()[0].outerHTML;
-                       userlistItem.html = newhtml;
-                       this.updateUserListCount();
-               }
-       },
-
-       onRemoveView: function(e) {
-               $('#tb_actionbar_item_userlist')
-                       .w2overlay({
-                               class: 'loleaflet-font',
-                               html: 
this.options.userLeftPopupMessage.replace('%user', e.username),
-                               style: 'padding: 5px'
-                       });
-               clearTimeout(this.options.userPopupTimeout);
-               this.options.userPopupTimeout = setTimeout(function() {
-                       $('#tb_actionbar_item_userlist').w2overlay('');
-                       clearTimeout(this.options.userPopupTimeout);
-                       this.options.userPopupTimeout = null;
-               }, 3000);
-       
-               if (e.viewId === this.map._docLayer._followThis) {
-                       this.map._docLayer._followThis = -1;
-                       this.map._docLayer._followUser = false;
-               }
-       
-               var userlistItem = w2ui['actionbar'].get('userlist');
-               if (userlistItem !== null) {
-                       userlistItem.html = $(userlistItem.html).find('#user-' 
+ e.viewId).remove().end()[0].outerHTML;
-                       this.updateUserListCount();
-               }
-       },
-
        _cancelSearch: function() {
                var toolbar = window.mode.isMobile() ? w2ui['searchbar'] : 
w2ui['actionbar'];
                var searchInput = L.DomUtil.get('search-input');
@@ -697,15 +529,6 @@ L.Control.StatusBar = L.Control.extend({
                        w2ui['actionbar'].set('LanguageStatus', {items: 
toolbaritems});
                }
        },
-
-       deselectUser: function(e) {
-               var userlistItem = w2ui['actionbar'].get('userlist');
-               if (userlistItem === null) {
-                       return;
-               }
-       
-               userlistItem.html = $(userlistItem.html).find('#user-' + 
e.viewId).removeClass('selected-user').parent().parent().parent()[0].outerHTML;
-       },
 });
 
 L.control.statusBar = function () {
diff --git a/loleaflet/src/control/Control.Toolbar.js 
b/loleaflet/src/control/Control.Toolbar.js
index 06ffa7cdd..be3101358 100644
--- a/loleaflet/src/control/Control.Toolbar.js
+++ b/loleaflet/src/control/Control.Toolbar.js
@@ -1937,28 +1937,6 @@ function onUpdatePermission(e) {
        map.invalidateSize();
 }
 
-function onUseritemClicked(e) { // eslint-disable-line no-unused-vars
-       var docLayer = map._docLayer;
-       var viewId = parseInt(e.currentTarget.id.replace('user-', ''));
-
-       map._goToViewId(viewId);
-
-       if (viewId === map._docLayer._viewId) {
-               $('#tb_actionbar_item_userlist').w2overlay('');
-               return;
-       } else if (docLayer._followThis !== -1) {
-               map._setFollowing(false, null);
-       }
-
-       docLayer._followThis = viewId;
-       docLayer._followUser = true;
-       docLayer._followEditor = false;
-
-       selectUser(viewId);
-}
-
-global.onUseritemClicked = onUseritemClicked;
-
 function editorUpdate(e) { // eslint-disable-line no-unused-vars
        var docLayer = map._docLayer;
 
@@ -1975,8 +1953,6 @@ function editorUpdate(e) { // eslint-disable-line 
no-unused-vars
                var userlistItem = w2ui['actionbar'].get('userlist');
                if (userlistItem !== null) {
                        $('.selected-user').removeClass('selected-user');
-                       if ($(userlistItem.html).find('.selected-user').length 
!== 0)
-                               userlistItem.html = 
$(userlistItem.html).find('.selected-user').removeClass('selected-user').parent().parent().parent()[0].outerHTML;
                }
        }
        else {
@@ -1988,16 +1964,6 @@ function editorUpdate(e) { // eslint-disable-line 
no-unused-vars
 
 global.editorUpdate = editorUpdate;
 
-function selectUser(viewId) {
-       var userlistItem = w2ui['actionbar'].get('userlist');
-       if (userlistItem === null) {
-               return;
-       }
-
-       userlistItem.html = $(userlistItem.html).find('#user-' + 
viewId).addClass('selected-user').parent().parent().parent()[0].outerHTML;
-       $('#tb_actionbar_item_userlist').w2overlay('');
-}
-
 $(window).resize(function() {
        resizeToolbar();
 });
@@ -2013,11 +1979,6 @@ function setupToolbar(e) {
 
        createToolbar();
 
-       map.on('updateEditorName', function(e) {
-               $('#currently-msg').show();
-               $('#current-editor').text(e.username);
-       });
-
        map.on('focussearch', function () {
                var entry = L.DomUtil.get('search-input');
                entry.focus();
diff --git a/loleaflet/src/control/Control.UserList.js 
b/loleaflet/src/control/Control.UserList.js
new file mode 100644
index 000000000..9a7c27386
--- /dev/null
+++ b/loleaflet/src/control/Control.UserList.js
@@ -0,0 +1,252 @@
+/* -*- js-indent-level: 8 -*- */
+/*
+ * L.Control.UserList
+ */
+
+/* global $ w2ui _ */
+L.Control.UserList = L.Control.extend({
+       options: {
+               userPopupTimeout: null,
+               userJoinedPopupMessage: '<div>' + _('%user has joined') + 
'</div>',
+               userLeftPopupMessage: '<div>' + _('%user has left') + '</div>',
+               nUsers: undefined,
+               oneUser: undefined,
+               noUser: undefined
+       },
+
+       initialize: function () {
+       },
+
+       onAdd: function (map) {
+               this.map = map;
+
+               map.on('addview', this.onAddView, this);
+               map.on('removeview', this.onRemoveView, this);
+               map.on('deselectuser', this.deselectUser, this);
+               map.on('openuserlist', this.onOpenUserList, this);
+
+               if (window.mode.isMobile() || window.mode.isTablet()) {
+                       this.options.nUsers = '%n';
+                       this.options.oneUser = '1';
+                       this.options.noUser = '0';
+               } else {
+                       this.options.nUsers = _('%n users');
+                       this.options.oneUser = _('1 user');
+                       this.options.noUser = _('0 users');
+               }
+
+               map.on('updateEditorName', function(e) {
+                       $('#currently-msg').show();
+                       $('#current-editor').text(e.username);
+               });
+       },
+
+       escapeHtml: function(input) {
+               return $('<div>').text(input).html();
+       },
+
+       selectUser: function(viewId) {
+               var userlistItem = w2ui['actionbar'].get('userlist');
+               if (userlistItem === null) {
+                       return;
+               }
+
+               $('#user-' + viewId).addClass('selected-user');
+       },
+
+       onUseritemClicked: function(e) { // eslint-disable-line no-unused-vars
+               var docLayer = this.map._docLayer;
+               var viewId = parseInt(e.currentTarget.id.replace('user-', ''));
+
+               this.map._goToViewId(viewId);
+
+               if (viewId === this.map._docLayer._viewId) {
+                       this.map._setFollowing(false, null);
+                       w2ui['actionbar'].uncheck('userlist');
+                       return;
+               } else if (docLayer._followThis !== -1) {
+                       this.map._setFollowing(false, null);
+               }
+
+               docLayer._followThis = viewId;
+               docLayer._followUser = true;
+               docLayer._followEditor = false;
+
+               this.selectUser(viewId);
+
+               w2ui['actionbar'].uncheck('userlist');
+       },
+
+       getUserItem: function(viewId, userName, extraInfo, color) {
+               var content = L.DomUtil.create('tr', 'useritem');
+               content.id = 'user-' + viewId;
+               $(document).on('click', '#' + content.id, 
this.onUseritemClicked.bind(this));
+
+               var iconTd = L.DomUtil.create('td', 'usercolor', content);
+               var nameTd = L.DomUtil.create('td', 'username loleaflet-font', 
content);
+
+               if (extraInfo !== undefined && extraInfo.avatar !== undefined) {
+                       var img = L.DomUtil.create('img', 'avatar-img', iconTd);
+                       img.src = extraInfo.avatar;
+                       $(img).css({'border-color': color});
+               } else {
+                       img = L.DomUtil.create('div', 'user-info', iconTd);
+                       $(img).css({'background-color': color});
+               }
+       
+               nameTd.innerHTML = userName;
+       
+               return content;
+       },
+
+       updateUserListCount: function() {
+               var actionbar = w2ui.actionbar;
+               var userlistItem = actionbar && actionbar.get('userlist');
+               if (userlistItem == null) {
+                       return;
+               }
+       
+               var count = $(userlistItem.html).find('#userlist_table tbody 
tr').length;
+               if (count > 1) {
+                       userlistItem.text = this.options.nUsers.replace('%n', 
count);
+               } else if (count === 1) {
+                       userlistItem.text = this.options.oneUser;
+               } else {
+                       userlistItem.text = this.options.noUser;
+               }
+       
+               w2ui['actionbar'].refresh();
+       
+               var hideUserList =
+                       window.ThisIsAMobileApp ||
+                       (this.map['wopi'].HideUserList !== null && 
this.map['wopi'].HideUserList !== undefined &&
+                               ($.inArray('true', 
this.map['wopi'].HideUserList) >= 0) ||
+                               (window.mode.isMobile() && $.inArray('mobile', 
this.map['wopi'].HideUserList) >= 0) ||
+                               (window.mode.isTablet() && $.inArray('tablet', 
this.map['wopi'].HideUserList) >= 0) ||
+                               (window.mode.isDesktop() && 
$.inArray('desktop', this.map['wopi'].HideUserList) >= 0));
+       
+               if (!hideUserList && count > 1) {
+                       actionbar.show('userlist');
+                       actionbar.show('userlistbreak');
+               } else {
+                       actionbar.hide('userlist');
+                       actionbar.hide('userlistbreak');
+               }
+       },
+
+       deselectUser: function(e) {
+               var userlistItem = w2ui['actionbar'].get('userlist');
+               if (userlistItem === null) {
+                       return;
+               }
+       
+               $('#user-' + e.viewId).removeClass('selected-user');
+       },
+
+       onOpenUserList: function() {
+               var that = this;
+               setTimeout(function () {
+                       var cBox = $('#follow-checkbox')[0];
+                       var docLayer = that.map._docLayer;
+                       var editorId = docLayer._editorId;
+                       var viewId = docLayer._followThis;
+                       var followUser = docLayer._followUser;
+
+                       if (cBox)
+                               cBox.checked = docLayer._followEditor;
+
+                       if (docLayer.editorId !== -1 && 
that.map._viewInfo[editorId])
+                               
$('#current-editor').text(that.map._viewInfo[editorId].username);
+                       else
+                               $('#currently-msg').hide();
+
+                       if (followUser)
+                               that.selectUser(viewId);
+               }, 100);
+       },
+
+       onAddView: function(e) {
+               var userlistItem = w2ui['actionbar'].get('userlist');
+               var username = this.escapeHtml(e.username);
+               var showPopup = false;
+       
+               if (userlistItem !== null)
+                       showPopup = $(userlistItem.html).find('#userlist_table 
tbody tr').length > 0;
+       
+               if (showPopup) {
+                       $('#tb_actionbar_item_userlist')
+                               .w2overlay({
+                                       class: 'loleaflet-font',
+                                       html: 
this.options.userJoinedPopupMessage.replace('%user', username),
+                                       style: 'padding: 5px'
+                               });
+                       clearTimeout(this.options.userPopupTimeout);
+                       var that = this;
+                       this.options.userPopupTimeout = setTimeout(function() {
+                               $('#tb_actionbar_item_userlist').w2overlay('');
+                               clearTimeout(that.options.userPopupTimeout);
+                               that.options.userPopupTimeout = null;
+                       }, 3000);
+               }
+       
+               var color = L.LOUtil.rgbToHex(this.map.getViewColor(e.viewId));
+               if (e.viewId === this.map._docLayer._viewId) {
+                       username = _('You');
+                       color = '#000';
+               }
+       
+               // Mention readonly sessions in userlist
+               if (e.readonly) {
+                       username += ' (' +  _('Readonly') + ')';
+               }
+       
+               if (userlistItem !== null) {
+                       var newhtml = 
$(userlistItem.html).find('#userlist_table 
tbody').append(this.getUserItem(e.viewId, username, e.extraInfo, 
color)).parent().parent()[0].outerHTML;
+                       userlistItem.html = newhtml;
+                       this.updateUserListCount();
+               }
+       },
+
+       onRemoveView: function(e) {
+               var that = this;
+               $('#tb_actionbar_item_userlist')
+                       .w2overlay({
+                               class: 'loleaflet-font',
+                               html: 
this.options.userLeftPopupMessage.replace('%user', e.username),
+                               style: 'padding: 5px'
+                       });
+               clearTimeout(this.options.userPopupTimeout);
+               this.options.userPopupTimeout = setTimeout(function() {
+                       $('#tb_actionbar_item_userlist').w2overlay('');
+                       clearTimeout(that.options.userPopupTimeout);
+                       that.options.userPopupTimeout = null;
+               }, 3000);
+       
+               if (e.viewId === this.map._docLayer._followThis) {
+                       this.map._docLayer._followThis = -1;
+                       this.map._docLayer._followUser = false;
+               }
+       
+               var userlistItem = w2ui['actionbar'].get('userlist');
+               if (userlistItem !== null) {
+                       userlistItem.html = $(userlistItem.html).find('#user-' 
+ e.viewId).remove().end()[0].outerHTML;
+                       this.updateUserListCount();
+               }
+       },
+});
+
+L.control.userList = function () {
+       return new L.Control.UserList();
+};
+
+L.control.createUserListWidget = function () {
+       return '<div id="userlist_container"><table 
id="userlist_table"><tbody></tbody></table>' +
+               '<hr><table class="loleaflet-font" id="editor-btn">' +
+               '<tr>' +
+               '<td><label id="follow-container"><input type="checkbox" 
name="alwaysFollow" id="follow-checkbox" onclick="editorUpdate(event)"><span 
class="checkmark"></span></label></td>' +
+               '<td>' + _('Always follow the editor') + '</td>' +
+               '</tr>' +
+               '</table>' +
+               '<p id="currently-msg">' + _('Current') + ' - <b><span 
id="current-editor"></span></b></p>' +
+               '</div>';
+};
\ No newline at end of file
diff --git a/loleaflet/src/main.js b/loleaflet/src/main.js
index 2b17ff2bc..a291de1c8 100644
--- a/loleaflet/src/main.js
+++ b/loleaflet/src/main.js
@@ -84,6 +84,7 @@ map.addControl(map.dialog);
 map.addControl(L.control.contextMenu());
 map.addControl(L.control.infobar());
 map.loadDocument(global.socket);
+map.addControl(L.control.userList());
 
 global.socket = map._socket;
 window.addEventListener('beforeunload', function () {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to