diff options
Diffstat (limited to 'apps/files_sharing/js')
-rw-r--r-- | apps/files_sharing/js/share.js | 38 | ||||
-rw-r--r-- | apps/files_sharing/js/sharebreadcrumbview.js | 103 | ||||
-rw-r--r-- | apps/files_sharing/js/sharetabview.js | 4 |
3 files changed, 132 insertions, 13 deletions
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 64fc7ef7296..073cc77e5aa 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -36,19 +36,7 @@ var oldCreateRow = fileList._createRow; fileList._createRow = function(fileData) { var tr = oldCreateRow.apply(this, arguments); - var sharePermissions = fileData.permissions; - if (fileData.mountType && fileData.mountType === "external-root"){ - // for external storages we can't use the permissions of the mountpoint - // instead we show all permissions and only use the share permissions from the mountpoint to handle resharing - sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE); - } - if (fileData.type === 'file') { - // files can't be shared with delete permissions - sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; - - // create permissions don't mean anything for files - sharePermissions = sharePermissions & ~OC.PERMISSION_CREATE; - } + var sharePermissions = OCA.Sharing.Util.getSharePermissions(fileData); tr.attr('data-share-permissions', sharePermissions); if (fileData.shareOwner) { tr.attr('data-share-owner', fileData.shareOwner); @@ -185,6 +173,9 @@ } }); fileList.registerTabView(shareTab); + + var breadCrumbSharingDetailView = new OCA.Sharing.ShareBreadCrumbView({shareTab: shareTab}); + fileList.registerBreadCrumbDetailView(breadCrumbSharingDetailView); }, /** @@ -248,6 +239,27 @@ text += ', +' + (count - maxRecipients); } return text; + }, + + /** + * @param {Array} fileData + * @returns {String} + */ + getSharePermissions: function(fileData) { + var sharePermissions = fileData.permissions; + if (fileData.mountType && fileData.mountType === "external-root"){ + // for external storages we can't use the permissions of the mountpoint + // instead we show all permissions and only use the share permissions from the mountpoint to handle resharing + sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE); + } + if (fileData.type === 'file') { + // files can't be shared with delete permissions + sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; + + // create permissions don't mean anything for files + sharePermissions = sharePermissions & ~OC.PERMISSION_CREATE; + } + return sharePermissions; } }; })(); diff --git a/apps/files_sharing/js/sharebreadcrumbview.js b/apps/files_sharing/js/sharebreadcrumbview.js new file mode 100644 index 00000000000..36bbddfaec4 --- /dev/null +++ b/apps/files_sharing/js/sharebreadcrumbview.js @@ -0,0 +1,103 @@ +/* global Handlebars, OC */ + +/** + * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +(function() { + 'use strict'; + + var BreadCrumbView = OC.Backbone.View.extend({ + tagName: 'span', + events: { + click: '_onClick' + }, + _dirInfo: undefined, + + /** @type OCA.Sharing.ShareTabView */ + _shareTab: undefined, + + initialize: function(options) { + this._shareTab = options.shareTab; + }, + + render: function(data) { + this._dirInfo = data.dirInfo || null; + + if (this._dirInfo !== null && (this._dirInfo.path !== '/' || this._dirInfo.name !== '')) { + var isShared = data.dirInfo && data.dirInfo.shareTypes && data.dirInfo.shareTypes.length > 0; + this.$el.removeClass('shared icon-public icon-share'); + if (isShared) { + this.$el.addClass('shared'); + if (data.dirInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK) !== -1) { + this.$el.addClass('icon-public'); + } else { + this.$el.addClass('icon-share'); + } + } else { + this.$el.addClass('icon-share'); + } + this.$el.show(); + this.delegateEvents(); + } else { + this.$el.removeClass('shared icon-public icon-share'); + this.$el.hide(); + } + + return this; + }, + _onClick: function(e) { + e.preventDefault(); + + var fileInfoModel = new OCA.Files.FileInfoModel(this._dirInfo); + var self = this; + fileInfoModel.on('change', function() { + self.render({ + dirInfo: self._dirInfo + }); + }); + this._shareTab.on('sharesChanged', function(shareModel) { + var shareTypes = []; + var shares = shareModel.getSharesWithCurrentItem(); + + for(var i = 0; i < shares.length; i++) { + if (shareTypes.indexOf(shares[i].share_type) === -1) { + shareTypes.push(shares[i].share_type); + } + } + + if (shareModel.hasLinkShare()) { + shareTypes.push(OC.Share.SHARE_TYPE_LINK); + } + + // Since the dirInfo isn't updated we need to do this dark hackery + self._dirInfo.shareTypes = shareTypes; + + self.render({ + dirInfo: self._dirInfo + }); + }); + OCA.Files.App.fileList.showDetailsView(fileInfoModel, 'shareTabView'); + } + }); + + OCA.Sharing.ShareBreadCrumbView = BreadCrumbView; +})(); diff --git a/apps/files_sharing/js/sharetabview.js b/apps/files_sharing/js/sharetabview.js index 2c7070aa3d5..7bb1f1229d0 100644 --- a/apps/files_sharing/js/sharetabview.js +++ b/apps/files_sharing/js/sharetabview.js @@ -50,6 +50,10 @@ if (this.model) { this.$el.html(this.template()); + if (_.isUndefined(this.model.get('sharePermissions'))) { + this.model.set('sharePermissions', OCA.Sharing.Util.getSharePermissions(this.model.attributes)); + } + // TODO: the model should read these directly off the passed fileInfoModel var attributes = { itemType: this.model.isDirectory() ? 'folder' : 'file', |