]> source.dussan.org Git - nextcloud-server.git/commitdiff
Improved remote share owner display
authorVincent Petry <pvince81@owncloud.com>
Thu, 3 Jul 2014 11:19:14 +0000 (13:19 +0200)
committerVincent Petry <pvince81@owncloud.com>
Thu, 3 Jul 2014 12:15:25 +0000 (14:15 +0200)
The parts of the remote share owner name is now split between user name,
domain name and root so they can be formatted / displayed differently.

The user name + domain name are displayed in the tooltip.

core/js/share.js
core/js/tests/specs/shareSpec.js

index 62271a43ceb8857f7ab19c0b9402e49d83d6f590..eed4f32ca0bdb792d34faad30e8ba46a0fe08a14 100644 (file)
@@ -1,8 +1,21 @@
+/* global escapeHTML */
+
+/**
+ * @namespace
+ */
 OC.Share={
        SHARE_TYPE_USER:0,
        SHARE_TYPE_GROUP:1,
        SHARE_TYPE_LINK:3,
        SHARE_TYPE_EMAIL:4,
+
+       /**
+        * Regular expression for splitting parts of remote share owners:
+        * "user@example.com/path/to/owncloud"
+        * "user@anotherexample.com@example.com/path/to/owncloud
+        */
+       _REMOTE_OWNER_REGEXP: new RegExp("^([^@]*)@(([^@]*)@)?([^/]*)(.*)?$"),
+
        /**
         * @deprecated use OC.Share.currentShares instead
         */
@@ -168,6 +181,38 @@ OC.Share={
                        delete OC.Share.statuses[itemSource];
                }
        },
+       /**
+        * Format remote share owner to make it more readable
+        *
+        * @param {String} owner full remote share owner name
+        * @return {String} HTML code for the owner display
+        */
+       _formatSharedByOwner: function(owner) {
+               var parts = this._REMOTE_OWNER_REGEXP.exec(owner);
+               if (!parts) {
+                       // display as is, most likely to be a simple owner name
+                       return t('files_sharing', 'Shared by {owner}', {owner: escapeHTML(owner)});
+               }
+
+               var userName = parts[1];
+               var userDomain = parts[3];
+               var server = parts[4];
+               var tooltip = userName;
+               if (userDomain) {
+                       tooltip += '@' + userDomain;
+               }
+               if (server) {
+                       tooltip += '@' + server;
+               }
+
+               var html = '<span class="remoteOwner" title="' + escapeHTML(tooltip) + '">';
+               html += '<span class="username">' + escapeHTML(userName) + '</span>';
+               if (userDomain) {
+                       html += '<span class="userDomain">@' + escapeHTML(userDomain) + '</span>';
+               }
+               html += '</span>';
+               return t('files_sharing', 'Shared by {owner}', {owner: html});
+       },
        /**
         * Marks/unmarks a given file as shared by changing its action icon
         * and folder icon.
@@ -206,12 +251,15 @@ OC.Share={
                        message = t('core', 'Shared');
                        // even if reshared, only show "Shared by"
                        if (owner) {
-                               message = t('files_sharing', 'Shared by {owner}', {owner: escapeHTML(owner)});
+                               message = this._formatSharedByOwner(owner);
                        }
                        else if (recipients) {
                                message = t('core', 'Shared with {recipients}', {recipients: escapeHTML(recipients)});
                        }
-                       action.html(' <span>'+ message + '</span>').prepend(img);
+                       action.html(' <span>' + message + '</span>').prepend(img);
+                       if (owner) {
+                               action.find('.remoteOwner').tipsy({gravity: 's'});
+                       }
                }
                else {
                        action.removeClass('permanent');
index 588e51036e4da014eaf4fc619fe17bd069623a97..ed04df3fe6f1866012d6289734252d8530deaf42 100644 (file)
@@ -365,5 +365,84 @@ describe('OC.Share tests', function() {
                        });
                });
        });
+       describe('markFileAsShared', function() {
+               var $file;
+               var tipsyStub;
+
+               beforeEach(function() {
+                       tipsyStub = sinon.stub($.fn, 'tipsy');
+                       $file = $('<tr><td class="filename">File name</td></tr>');
+                       $file.find('.filename').append(
+                               '<span class="fileactions">' +
+                               '<a href="#" class="action action-share" data-action="Share">' +
+                               '<img></img><span> Share</span>' +
+                               '</a>' +
+                               '</span>'
+                       );
+               });
+               afterEach(function() {
+                       $file = null;
+                       tipsyStub.restore();
+               });
+               describe('displaying the share owner', function() {
+                       function checkOwner(input, output, title) {
+                               var $action;
+
+                               $file.attr('data-share-owner', input);
+                               OC.Share.markFileAsShared($file);
+
+                               $action = $file.find('.action-share>span');
+                               expect($action.text()).toEqual(output);
+                               if (_.isString(title)) {
+                                       expect($action.find('.remoteOwner').attr('title')).toEqual(title);
+                               } else {
+                                       expect($action.find('.remoteOwner').attr('title')).not.toBeDefined();
+                               }
+                               expect(tipsyStub.calledOnce).toEqual(true);
+                               tipsyStub.reset();
+                       }
+
+                       it('displays the local share owner as is', function() {
+                               checkOwner('User One', 'Shared by User One', null);
+                       });
+                       it('displays the user name part of a remote share owner', function() {
+                               checkOwner(
+                                       'User One@someserver.com',
+                                       'Shared by User One',
+                                       'User One@someserver.com'
+                               );
+                               checkOwner(
+                                       'User One@someserver.com/',
+                                       'Shared by User One',
+                                       'User One@someserver.com'
+                               );
+                               checkOwner(
+                                       'User One@someserver.com/root/of/owncloud',
+                                       'Shared by User One',
+                                       'User One@someserver.com'
+                               );
+                       });
+                       it('displays the user name part with domain of a remote share owner', function() {
+                               checkOwner(
+                                       'User One@example.com@someserver.com',
+                                       'Shared by User One@example.com',
+                                       'User One@example.com@someserver.com'
+                               );
+                               checkOwner(
+                                       'User One@example.com@someserver.com/',
+                                       'Shared by User One@example.com',
+                                       'User One@example.com@someserver.com'
+                               );
+                               checkOwner(
+                                       'User One@example.com@someserver.com/root/of/owncloud',
+                                       'Shared by User One@example.com',
+                                       'User One@example.com@someserver.com'
+                               );
+                       });
+               });
+
+               // TODO: add unit tests for folder icons
+               // TODO: add unit tests for share recipients
+       });
 });