diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js index a0a7bbfa2d..56050d2d0c 100644 --- a/core/js/sharedialogshareelistview.js +++ b/core/js/sharedialogshareelistview.js @@ -35,47 +35,7 @@ '{{/unless}}' + '{{/if}}' + '' + - '' + + '{{{popoverMenu}}}' + '' + '' + '{{/each}}' + @@ -94,6 +54,49 @@ '' ; + var TEMPLATE_POPOVER_MENU = + ''; + /** * @class OCA.Share.ShareDialogShareeListView * @member {OC.Share.ShareItemModel} model @@ -114,8 +117,14 @@ /** @type {Function} **/ _template: undefined, + /** @type {Function} **/ + _popoverMenuTemplate: undefined, + _menuOpen: false, + /** @type {boolean|number} **/ + _renderPermissionChange: false, + events: { 'click .unshare': 'onUnshare', 'click .icon-more': 'onToggleMenu', @@ -182,8 +191,8 @@ }); }, - getShareeList: function() { - var universal = { + getShareProperties: function() { + return { avatarEnabled: this.configModel.areAvatarsEnabled(), unshareLabel: t('core', 'Unshare'), canShareLabel: t('core', 'can reshare'), @@ -205,6 +214,15 @@ deletePermission: OC.PERMISSION_DELETE, isFolder: this.model.isFolder() }; + }, + + /** + * get an array of sharees' share properties + * + * @returns {Array} + */ + getShareeList: function() { + var universal = this.getShareProperties(); if(!this.model.hasUserShares()) { return []; @@ -256,29 +274,37 @@ }, render: function() { - this.$el.html(this.template({ - cid: this.cid, - sharees: this.getShareeList(), - linkReshares: this.getLinkReshares() - })); + if(!this._renderPermissionChange) { + this.$el.html(this.template({ + cid: this.cid, + sharees: this.getShareeList(), + linkReshares: this.getLinkReshares() + })); - if(this.configModel.areAvatarsEnabled()) { - this.$('.avatar').each(function() { - var $this = $(this); - if ($this.hasClass('imageplaceholderseed')) { - $this.css({width: 32, height: 32}); - $this.imageplaceholder($this.data('seed')); - } else { - // user, size, ie8fix, hidedefault, callback, displayname - $this.avatar($this.data('username'), 32, undefined, undefined, undefined, $this.data('displayname')); - } + if (this.configModel.areAvatarsEnabled()) { + this.$('.avatar').each(function () { + var $this = $(this); + if ($this.hasClass('imageplaceholderseed')) { + $this.css({width: 32, height: 32}); + $this.imageplaceholder($this.data('seed')); + } else { + $this.avatar($this.data('username'), 32); + } + }); + } + + this.$('.has-tooltip').tooltip({ + placement: 'bottom' }); + } else { + var permissionChangeShareId = parseInt(this._renderPermissionChange, 10); + var shareWithIndex = this.model.findShareWithIndex(permissionChangeShareId); + var sharee = this.getShareeObject(shareWithIndex); + $.extend(sharee, this.getShareProperties()); + var $li = this.$('li[data-share-id=' + permissionChangeShareId + ']'); + $li.find('.popovermenu').replaceWith(this.popoverMenuTemplate(sharee)); } - this.$('.has-tooltip').tooltip({ - placement: 'bottom' - }); - var _this = this; this.$('.popovermenu').on('afterHide', function() { _this._menuOpen = false; @@ -292,6 +318,8 @@ } } + this._renderPermissionChange = false; + this.delegateEvents(); return this; @@ -305,9 +333,28 @@ if (!this._template) { this._template = Handlebars.compile(TEMPLATE); } + var sharees = data['sharees']; + if(_.isArray(sharees)) { + for (var i = 0; i < sharees.length; i++) { + data['sharees'][i]['popoverMenu'] = this.popoverMenuTemplate(sharees[i]); + } + } return this._template(data); }, + /** + * renders the popover template and returns the resulting HTML + * + * @param {Object} data + * @returns {string} + */ + popoverMenuTemplate: function(data) { + if(!this._popoverMenuTemplate) { + this._popoverMenuTemplate = Handlebars.compile(TEMPLATE_POPOVER_MENU); + } + return this._popoverMenuTemplate(data); + }, + onUnshare: function(event) { event.preventDefault(); event.stopPropagation(); @@ -386,6 +433,8 @@ }); this.model.updateShare(shareId, {permissions: permissions}); + + this._renderPermissionChange = shareId; }, }); diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js index a784f59f67..4a2f8f8bc8 100644 --- a/core/js/shareitemmodel.js +++ b/core/js/shareitemmodel.js @@ -391,6 +391,26 @@ return share.share_with_displayname; }, + /** + * returns the array index of a sharee for a provided shareId + * + * @param shareId + * @returns {number} + */ + findShareWithIndex: function(shareId) { + var shares = this.get('shares'); + if(!_.isArray(shares)) { + throw "Unknown Share"; + } + for(var i = 0; i < shares.length; i++) { + var shareWith = shares[i]; + if(shareWith['id'] == shareId) { + return i; + } + } + throw "Unknown Sharee"; + }, + getShareType: function(shareIndex) { /** @type OC.Share.Types.ShareInfo **/ var share = this.get('shares')[shareIndex];