diff options
author | Vincent Petry <pvince81@owncloud.com> | 2016-02-03 13:00:55 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2016-02-03 13:00:55 +0100 |
commit | 8bb1437e240ce47e04f7bcb7dc3a56ef6b5d892b (patch) | |
tree | 9b484c1f7102cebd96995c29efd11fbbad870e64 /apps/comments | |
parent | 621f54da514af548bf900f7a1c64af046f53b86d (diff) | |
download | nextcloud-server-8bb1437e240ce47e04f7bcb7dc3a56ef6b5d892b.tar.gz nextcloud-server-8bb1437e240ce47e04f7bcb7dc3a56ef6b5d892b.zip |
Add file row indicator for unread comments
Diffstat (limited to 'apps/comments')
-rw-r--r-- | apps/comments/css/comments.css | 4 | ||||
-rw-r--r-- | apps/comments/js/filesplugin.js | 84 | ||||
-rw-r--r-- | apps/comments/tests/js/filespluginSpec.js | 102 |
3 files changed, 190 insertions, 0 deletions
diff --git a/apps/comments/css/comments.css b/apps/comments/css/comments.css index c1624dcc57b..5e247aaeb71 100644 --- a/apps/comments/css/comments.css +++ b/apps/comments/css/comments.css @@ -49,3 +49,7 @@ position: absolute; right: 0; } + +.app-files .action-comment>img { + margin-right: 5px; +} diff --git a/apps/comments/js/filesplugin.js b/apps/comments/js/filesplugin.js index c8d91e0ede3..bf6bb05146b 100644 --- a/apps/comments/js/filesplugin.js +++ b/apps/comments/js/filesplugin.js @@ -8,7 +8,15 @@ * */ +/* global Handlebars */ + (function() { + var TEMPLATE_COMMENTS_UNREAD = + '<a class="action action-comment permanent" title="{{countMessage}}" href="#">' + + '<img class="svg" src="{{iconUrl}}"/>' + + '{{count}}' + + '</a>'; + OCA.Comments = _.extend({}, OCA.Comments); if (!OCA.Comments) { /** @@ -26,12 +34,88 @@ 'favorites' ], + _formatCommentCount: function(count) { + if (!this._commentsUnreadTemplate) { + this._commentsUnreadTemplate = Handlebars.compile(TEMPLATE_COMMENTS_UNREAD); + } + return this._commentsUnreadTemplate({ + count: count, + countMessage: t('comments', '{count} unread comments', {count: count}), + iconUrl: OC.imagePath('core', 'actions/comment') + }); + }, + attach: function(fileList) { + var self = this; if (this.allowedLists.indexOf(fileList.id) < 0) { return; } fileList.registerTabView(new OCA.Comments.CommentsTabView('commentsTabView')); + + var NS_OC = 'http://owncloud.org/ns'; + + var oldGetWebdavProperties = fileList._getWebdavProperties; + fileList._getWebdavProperties = function() { + var props = oldGetWebdavProperties.apply(this, arguments); + props.push('{' + NS_OC + '}comments-unread'); + return props; + }; + + fileList.filesClient.addFileInfoParser(function(response) { + var data = {}; + var props = response.propStat[0].properties; + var commentsUnread = props['{' + NS_OC + '}comments-unread']; + if (!_.isUndefined(commentsUnread) && commentsUnread !== '') { + data.commentsUnread = parseInt(commentsUnread, 10); + } + return data; + }); + + fileList.$el.addClass('has-comments'); + var oldCreateRow = fileList._createRow; + fileList._createRow = function(fileData) { + var $tr = oldCreateRow.apply(this, arguments); + if (fileData.commentsUnread) { + $tr.attr('data-comments-unread', fileData.commentsUnread); + } + return $tr; + }; + + // register "comment" action for reading comments + fileList.fileActions.registerAction({ + name: 'Comment', + displayName: t('comments', 'Comment'), + mime: 'all', + permissions: OC.PERMISSION_READ, + type: OCA.Files.FileActions.TYPE_INLINE, + render: function(actionSpec, isDefault, context) { + var $file = context.$file; + var unreadComments = $file.data('comments-unread'); + if (unreadComments) { + var $actionLink = $(self._formatCommentCount(unreadComments)); + context.$file.find('a.name>span.fileactions').append($actionLink); + return $actionLink; + } + return ''; + }, + actionHandler: function(fileName, context) { + context.$file.find('.action-comment').tooltip('hide'); + // open sidebar in comments section + context.fileList.showDetailsView(fileName, 'commentsTabView'); + } + }); + + // add attribute to "elementToFile" + var oldElementToFile = fileList.elementToFile; + fileList.elementToFile = function($el) { + var fileInfo = oldElementToFile.apply(this, arguments); + var commentsUnread = $el.data('comments-unread'); + if (commentsUnread) { + fileInfo.commentsUnread = commentsUnread; + } + return fileInfo; + }; } }; diff --git a/apps/comments/tests/js/filespluginSpec.js b/apps/comments/tests/js/filespluginSpec.js new file mode 100644 index 00000000000..78becc5af09 --- /dev/null +++ b/apps/comments/tests/js/filespluginSpec.js @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.Comments.FilesPlugin tests', function() { + var fileList; + var testFiles; + + beforeEach(function() { + var $content = $('<div id="content"></div>'); + $('#testArea').append($content); + // dummy file list + var $div = $( + '<div>' + + '<table id="filestable">' + + '<thead></thead>' + + '<tbody id="fileList"></tbody>' + + '</table>' + + '</div>'); + $('#content').append($div); + + fileList = new OCA.Files.FileList($div); + OCA.Comments.FilesPlugin.attach(fileList); + + testFiles = [{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: OC.PERMISSION_ALL, + etag: 'abc', + shareOwner: 'User One', + isShareMountPoint: false, + commentsUnread: 3 + }]; + }); + afterEach(function() { + fileList.destroy(); + fileList = null; + }); + + describe('Comment icon', function() { + it('does not render icon when no unread comments available', function() { + testFiles[0].commentsUnread = 0; + fileList.setFiles(testFiles); + var $tr = fileList.findFileEl('One.txt'); + expect($tr.find('.action-comment').length).toEqual(0); + }); + it('renders comment icon and extra data', function() { + var $action, $tr; + fileList.setFiles(testFiles); + $tr = fileList.findFileEl('One.txt'); + $action = $tr.find('.action-comment'); + expect($action.length).toEqual(1); + expect($action.hasClass('permanent')).toEqual(true); + + expect($tr.attr('data-comments-unread')).toEqual('3'); + }); + it('clicking icon opens sidebar', function() { + var sidebarStub = sinon.stub(fileList, 'showDetailsView'); + var $action, $tr; + fileList.setFiles(testFiles); + $tr = fileList.findFileEl('One.txt'); + $action = $tr.find('.action-comment'); + $action.click(); + + expect(sidebarStub.calledOnce).toEqual(true); + expect(sidebarStub.lastCall.args[0]).toEqual('One.txt'); + expect(sidebarStub.lastCall.args[1]).toEqual('commentsTabView'); + }); + }); + describe('elementToFile', function() { + it('returns comment count', function() { + fileList.setFiles(testFiles); + var $tr = fileList.findFileEl('One.txt'); + var data = fileList.elementToFile($tr); + expect(data.commentsUnread).toEqual(3); + }); + it('does not set comment count when not set', function() { + delete testFiles[0].commentsUnread; + fileList.setFiles(testFiles); + var $tr = fileList.findFileEl('One.txt'); + var data = fileList.elementToFile($tr); + expect(data.commentsUnread).not.toBeDefined(); + }); + it('does not set comment count when zero', function() { + testFiles[0].commentsUnread = 0; + fileList.setFiles(testFiles); + var $tr = fileList.findFileEl('One.txt'); + var data = fileList.elementToFile($tr); + expect(data.commentsUnread).not.toBeDefined(); + }); + }); +}); |