[Libreoffice-commits] online.git: loleaflet/admin.strings.js loleaflet/dist loleaflet/src

Aditya Dewan iit2015097 at iiita.ac.in
Sat May 27 05:08:43 UTC 2017


 loleaflet/admin.strings.js                   |    2 
 loleaflet/dist/admin/admin.html              |   66 +++++++---
 loleaflet/dist/admin/bootstrap/dashboard.css |   28 +++-
 loleaflet/src/admin/AdminSocketOverview.js   |  163 +++++++++++++++++++++++++--
 4 files changed, 224 insertions(+), 35 deletions(-)

New commits:
commit 66a3e1c273c9f967d650e65d40e9d16e3b8454d1
Author: Aditya Dewan <iit2015097 at iiita.ac.in>
Date:   Thu May 25 14:24:09 2017 +0530

    tdf#106449 Admin console: adding user list
    
    Change-Id: I41b15c6a73fa61c21ef5ab79de149b445014c99a
    Reviewed-on: https://gerrit.libreoffice.org/38017
    Reviewed-by: pranavk <pranavk at collabora.co.uk>
    Tested-by: pranavk <pranavk at collabora.co.uk>

diff --git a/loleaflet/admin.strings.js b/loleaflet/admin.strings.js
index a56b5d47..5d21e7aa 100644
--- a/loleaflet/admin.strings.js
+++ b/loleaflet/admin.strings.js
@@ -11,7 +11,9 @@ l10nstrings.strAnalytics = _('Analytics');
 l10nstrings.strHistory = _('History');
 l10nstrings.strDashboard = _('Dashboard');
 l10nstrings.strUsersOnline = _('Users online');
+l10nstrings.strUserName = _('Users Name');
 l10nstrings.strDocumentsOpened = _('Documents opened');
+l10nstrings.strDocumentNumber = _('Number of Documents');
 l10nstrings.strMemoryConsumed = _('Memory consumed');
 l10nstrings.strPid = _('PID');
 l10nstrings.strDocument = _('Document');
diff --git a/loleaflet/dist/admin/admin.html b/loleaflet/dist/admin/admin.html
index f8268565..72308e88 100644
--- a/loleaflet/dist/admin/admin.html
+++ b/loleaflet/dist/admin/admin.html
@@ -78,28 +78,56 @@
 	      <h4><script>document.write(l10nstrings.strMemoryConsumed)</script></h4>
 	    </div>
 	  </div>
+    <div class="container">
+      <ul class="nav nav-tabs">
+      <li class="active">
+        <a href="#view1" data-toggle="tab">
+          <h4><script>document.write(l10nstrings.strDocumentsOpened)</script></h4>
+        </a>
+      </li>
+      <li>
+        <a href="#view2" data-toggle="tab">
+          <h4><script>document.write(l10nstrings.strUsersOnline)</script></h4>
+        </a>
+      </li>
+      </ul>
 
-	  <h2 class="sub-header"><script>document.write(l10nstrings.strDocumentsOpened)</script></h2>
-	  <div class="table-responsive">
-	    <table class="table table-striped">
-	      <thead>
-		<tr>
-		  <th><script>document.write(l10nstrings.strPid)</script></th>
-		  <th><script>document.write(l10nstrings.strDocument)</script></th>
-		  <th><script>document.write(l10nstrings.strNumberOfViews)</script></th>
-		  <th><script>document.write(l10nstrings.strMemoryConsumed)</script></th>
-		  <th><script>document.write(l10nstrings.strElapsedTime)</script></th>
-		  <th><script>document.write(l10nstrings.strIdleTime)</script></th>
-		  <th><script>document.write(l10nstrings.strModified)</script></th>
-		</tr>
-	      </thead>
-	      <tbody id="doclist">
-	      </tbody>
-	    </table>
-	  </div>
-	</div>
+      <div class="tab-content">
+        <div id="view1" class="active tab-pane table-responsive">
+    	    <table id="docview" class="table table-striped">
+    	      <thead>
+          		<tr>
+          		  <th><script>document.write(l10nstrings.strPid)</script></th>
+          		  <th><script>document.write(l10nstrings.strDocument)</script></th>
+          		  <th><script>document.write(l10nstrings.strNumberOfViews)</script></th>
+          		  <th><script>document.write(l10nstrings.strMemoryConsumed)</script></th>
+          		  <th><script>document.write(l10nstrings.strElapsedTime)</script></th>
+          		  <th><script>document.write(l10nstrings.strIdleTime)</script></th>
+          		  <th><script>document.write(l10nstrings.strModified)</script></th>
+          		</tr>
+    	      </thead>
+    	      <tbody id="doclist">
+    	      </tbody>
+    	    </table>
+        </div>
+
+        <div id="view2" class="tab-pane table-responsive">
+          <table id="userview" class="tab-pane table table-striped">
+            <thead>
+              <tr>
+                <th><script>document.write(l10nstrings.strUserName)</script></th>
+                <th><script>document.write(l10nstrings.strDocumentNumber)</script></th>
+                <th><script>document.write(l10nstrings.strDocumentsOpened)</script></th>
+              </tr>
+            </thead>
+            <tbody id="userlist">
+            </tbody>
+          </table>
+        </div>
       </div>
     </div>
+  </div>
+</div>
 
     <div id="rowContextMenu" class="dropdown clearfix">
       <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" style="display:block;position:static;margin-bottom:5px;">
diff --git a/loleaflet/dist/admin/bootstrap/dashboard.css b/loleaflet/dist/admin/bootstrap/dashboard.css
index 60ed98d2..cdf37a82 100644
--- a/loleaflet/dist/admin/bootstrap/dashboard.css
+++ b/loleaflet/dist/admin/bootstrap/dashboard.css
@@ -113,15 +113,29 @@ body {
   position: absolute;
   display: none;
 }
-
 .userContainer{
-  display: none;
   position: absolute;
-  border: 1px solid black;
-  padding: 5px;
-  border-radius: 4px;
-  background-color: #dddddd;
 }
-tr:hover .userContainer{
+tr:hover .dropdown-menu{
   display: block;
+}
+
+/*
+ * User list view
+ */
+.view-opt-button{
+  border: 1px solid lightgrey;
+  border-radius: 5px;
+  padding: 4px 5px;
+  cursor: pointer;
+  transition: background-color .3s;
+}
+.view-opt-button:hover{
+  background-color: #f5f5f5;
+}
+.selected-view-opt{
+  background-color: #f5f5f5;
+}
+.doc_list_label{
+  cursor: pointer;
 }
\ No newline at end of file
diff --git a/loleaflet/src/admin/AdminSocketOverview.js b/loleaflet/src/admin/AdminSocketOverview.js
index b1070fcd..dfb92b64 100644
--- a/loleaflet/src/admin/AdminSocketOverview.js
+++ b/loleaflet/src/admin/AdminSocketOverview.js
@@ -47,7 +47,7 @@ var AdminSocketOverview = AdminSocketBase.extend({
 		}, 1000);
 
 		// Allow table rows to have a context menu for terminating sessions
-		$('body').on('contextmenu', 'table tr', function(ev) {
+		$('body').on('contextmenu', '#docview tr', function(ev) {
 			$('#rowContextMenu').css({
 				display: 'block',
 				left: ev.pageX,
@@ -73,6 +73,25 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				}
 			});
 		});
+
+		$('.view-opt-button').on('click', function() {
+			$('#docview-btn').toggleClass('selected-view-opt');
+			$('#userview-btn').toggleClass('selected-view-opt');
+			$('#docview').toggle();
+			$('#userview').toggle();
+		});
+
+		$('body').on('click', '#userlist .doc_list_label', function() {
+			if ($(this).text() === '🢃 list') {
+				docName = $($('.docentry', $(this).parent())[0]).text();
+				$user = $(this).parent().parent();
+				docCount = parseInt($('.doc_number', $user).text()) - 1 ;
+				$(this).text('🡺 ' + docName + ' and ' + String(docCount) + ' other docs');
+			}
+			else
+				$(this).text('🢃 list');
+			$('.docentry', $(this).parent()).toggle();
+		});
 	},
 
 	onSocketMessage: function(e) {
@@ -108,12 +127,66 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				$rowContainer = $(document.createElement('tr')).attr('id', 'doc' + sPid);
 				$pid = $(document.createElement('td')).text(sPid);
 				$userContainer = $(document.createElement('div')).attr('id', 'ucontainer' + sPid)
-										  .addClass('userContainer');
+										  .addClass('userContainer dropdown');
+				$listContainer = $(document.createElement('ul')).addClass('dropdown-menu');
+				$listLabel = $(document.createElement('li')).addClass('dropdown-header')
+															.text('Users');
+				$listContainer.append($listLabel);
+
 				for (var j = 0; j < userListJson.length; j++) {
-					$user = $(document.createElement('div')).text(userListJson[j]['userName'])
-													.attr('id', 'user' + userListJson[j]['sessionid']);
-					$userContainer.append($user);
+					$user = $(document.createElement('li')).attr('id', 'user' + userListJson[j]['sessionid']);
+					$userA = $(document.createElement('a')).text(userListJson[j]['userName']);
+					$user.append($userA);
+					$listContainer.append($user);
+
+					sessionid = userListJson[j]['sessionid'];
+					encodedUName = userListJson[j]['userName'].replace(/ /g, '');
+					// this isn't the right way to do this, but we can't also use encode here. what should we do then.
+
+					$userListRow = $('#usr' + encodedUName);
+
+					if ($userListRow.length == 0) {
+
+						$userListRow = $(document.createElement('tr')).attr('id', 'usr' + encodedUName);
+
+						$uName = $(document.createElement('td')).text(userListJson[j]['userName']);
+						$userListRow.append($uName);
+
+						$noOfDocuments = $(document.createElement('td')).addClass('doc_number')
+																	.text('1');
+						$userListRow.append($noOfDocuments);
+
+						$docList = $(document.createElement('td')).addClass('doc_list');
+						$docLabel = $(document.createElement('div')).addClass('doc_list_label');
+						$docentry = $(document.createElement('div')).addClass('docentry')
+																.attr('id', sessionid + '_' + sPid)
+																.text(sName);
+						$docList.append($docLabel);
+						$docList.append($docentry);
+						$userListRow.append($docList);
+
+						$('#userlist').append($userListRow);
+					}
+					else {
+						userListChildren = $userListRow[0].childNodes;
+
+						docCount = parseInt($(userListChildren[1]).text())
+						$(userListChildren[1]).text(docCount + 1);
+
+						$docLabel = $(userListChildren[2].getElementsByClassName('doc_list_label')[0]);
+						$docLabel.text('🡺 ' + sName + ' and ' + String(docCount) + ' other docs');
+
+						$('.docentry', $('userListChildren[2]').hide());
+
+						$docentry = $(document.createElement('div')).addClass('docentry')
+																.attr('id', sessionid + '_' + sPid)
+																.text(sName);
+
+						$(userListChildren[2]).append($docentry);
+						$('.docentry', $userListRow).css('display', 'none');
+					}
 				}
+				$userContainer.append($listContainer);
 				$pid.append($userContainer);
 				$rowContainer.append($pid);
 
@@ -168,7 +241,12 @@ var AdminSocketOverview = AdminSocketBase.extend({
 
 				$pid = $(document.createElement('td')).text(sPid);
 				$userContainer = $(document.createElement('div')).attr('id', 'ucontainer' + sPid)
-										  .addClass('userContainer');
+										  .addClass('userContainer dropdown');
+				$listContainer = $(document.createElement('ul')).addClass('dropdown-menu');
+				$listLabel = $(document.createElement('li')).addClass('dropdown-header')
+															.text('Users');
+				$listContainer.append($listLabel);
+				$userContainer.append($listContainer);
 				$pid.append($userContainer);
 				$rowContainer.append($pid);
 
@@ -208,13 +286,58 @@ var AdminSocketOverview = AdminSocketBase.extend({
 			$views.text(nViews + 1);
 
 			$userContainer = $(document.getElementById('ucontainer' + sPid));
-			$user = $(document.createElement('div')).text(uName)
-													.attr('id', 'user' + sessionid);
-			$userContainer.append($user);
+			$list = $('ul', $userContainer)
+			$user = $(document.createElement('li')).attr('id', 'user' + sessionid);
+			$userA = $(document.createElement('a')).text(uName);
+			$user.append($userA);
+			$list.append($user);
+			$userContainer.append($list);
 
 			$a = $(document.getElementById('active_users_count'));
 			nTotalViews = parseInt($a.text());
 			$a.text(nTotalViews + 1);
+
+
+			encodedUName = uName.replace(/ /g, '');
+			$user = $('#usr' + encodedUName);
+			if ($user.length === 0) {
+
+				$userListRow = $(document.createElement('tr')).attr('id', 'usr' + encodedUName);
+
+				$uName = $(document.createElement('td')).text(uName);
+				$userListRow.append($uName);
+
+				$noOfDocuments = $(document.createElement('td')).addClass('doc_number')
+															.text('1');
+				$userListRow.append($noOfDocuments);
+
+				$docList = $(document.createElement('td')).addClass('doc_list');
+				$docLabel = $(document.createElement('div')).addClass('doc_list_label');
+				$docentry = $(document.createElement('div')).addClass('docentry')
+														.attr('id', sessionid + '_' + sPid)
+														.text(sName);
+				$docList.append($docLabel);
+				$docList.append($docentry);
+				$userListRow.append($docList);
+
+				$('#userlist').append($userListRow);
+			}
+			else {
+				userListChildren = $user[0].childNodes;
+
+				docCount = parseInt($(userListChildren[1]).text())
+				$(userListChildren[1]).text(docCount + 1);
+
+				$docLabel = $(userListChildren[2].getElementsByClassName('doc_list_label')[0]);
+				$docLabel.text('🡺 ' + sName + ' and ' + String(docCount) + ' other docs');
+
+				$docentry = $(document.createElement('div')).addClass('docentry')
+														.attr('id', sessionid + '_' + sPid)
+														.text(sName);
+
+				$(userListChildren[2]).append($docentry);
+				$('.docentry', $(userListChildren[2])).hide();
+			}
 		}
 		else if (textMsg.startsWith('total_mem') ||
 			textMsg.startsWith('active_docs_count') ||
@@ -249,6 +372,28 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				nTotalViews = parseInt($a.text());
 				$a.text(nTotalViews - 1);
 			}
+
+			$docEntry = $('#' + sessionid + '_' + sPid);
+			$user = $docEntry.parent().parent();
+			$nDocs = $('.doc_number', $user);
+			docCount = parseInt($nDocs.text());
+			if (docCount == 1) {
+				$user.remove();
+			}
+			else if (docCount == 2) {
+				$('.doc_list_label', $user).text('');
+				$('.docentry', $user).show();
+				$nDocs.text(docCount - 1);
+				$docEntry.remove();
+			}
+			else {
+				$parent = $docEntry.parent()
+				$docEntry.remove();
+				$child = $('.docentry', $parent);
+				$('.doc_list_label', $user).text('🡺 ' + $($child[0]).text() + ' and ' + String(docCount - 2) + ' other docs')
+				$('.docentry', $user).hide();
+				$nDocs.text(docCount - 1);
+			}
 		}
 		else if (textMsg.startsWith('propchange')) {
 			textMsg = textMsg.substring('propchange'.length);


More information about the Libreoffice-commits mailing list