/* * Copyright (c) 2015 * * This file is licensed under the Affero General Public License version 3 * or later. * * See the COPYING-README file. * */ (function () { if (!OC.Share) { OC.Share = {}; } var TEMPLATE = '' + '' + '{{#if noShares}}' + '
{{noSharesMessage}}
' + '{{/if}}' + '
' + ' ' + '
' + '
{{privacyWarningMessage}}
'; /** * @class OCA.Share.ShareDialogLinkListView * @member {OC.Share.ShareItemModel} model * @member {jQuery} $el * @memberof OCA.Sharing * @classdesc * * Represents the GUI of the share dialogue * */ var ShareDialogLinkListView = OC.Backbone.View.extend({ /** @type {string} **/ id: 'shareDialogLinkList', className: 'shareDialogLinkList', /** @type {OCA.Files.FileInfoModel} **/ fileInfoModel: undefined, /** @type {OC.Share.ShareConfigModel} **/ configModel: undefined, /** @type {OC.Share.ShareItemModel} **/ itemModel: undefined, /** @type {Function} **/ _template: undefined, events: { 'click .addLink': 'onAddButtonClick', 'click .editLink': 'onEditButtonClick', 'click .removeLink': 'onRemoveButtonClick', 'click .shareLink': 'onShareButtonClick' }, initialize: function (options) { var view = this; // if any item in the list changes, render the whole thing this.collection.on('change update delete', function() { view.render(); }); if (!_.isUndefined(options.itemModel)) { this.itemModel = options.itemModel; this.fileInfoModel = this.itemModel.getFileInfo(); this.configModel = this.itemModel.configModel; } else { throw 'missing OC.Share.ShareItemModel'; } }, onRemoveButtonClick: function (ev) { var $target = $(ev.target); var linkId = $target.closest('.link-entry').attr('data-id'); var linkModel = this.collection.get(linkId); var linkTitle = (linkModel.attributes.name) ? linkModel.attributes.name : linkModel.attributes.token; if (!linkModel) { return; } OCdialogs.confirm( t('core', 'Delete {link}', { link: linkTitle }), t('core', 'Remove link'), function(cb) { if (cb) { linkModel.destroy(); } }, true ); }, _generateName: function() { var index = 1; var baseName = t('core', '{fileName} link', { fileName: this.fileInfoModel.get('name') }); var name = baseName; while (this.collection.findWhere({name: name})) { index++; name = baseName + ' (' + index + ')'; } return name; }, onAddButtonClick: function () { var newShare = new OC.Share.ShareModel({ name: this._generateName(), password: '', permissions: OC.PERMISSION_READ, expireDate: this.configModel.getDefaultExpirationDateString(), shareType: OC.Share.SHARE_TYPE_LINK, itemType: this.itemModel.get('itemType'), itemSource: this.itemModel.get('itemSource') }); this._showPopupForShare(newShare); }, onEditButtonClick: function (ev) { var $target = $(ev.target); var linkId = $target.closest('.link-entry').attr('data-id'); var linkModel = this.collection.get(linkId); if (!linkModel) { return; } this._showPopupForShare(linkModel); }, onShareButtonClick: function (ev) { var $target = $(ev.target); var $li = $target.closest('.link-entry'); var linkId = $li.attr('data-id'); var $container = $li.find('.socialShareContainer'); var linkModel = this.collection.get(linkId); if (!linkModel) { return; } if ($container.is(':empty')) { if (this.configModel.isSocialShareEnabled()) { var socialView = new OC.Share.ShareDialogLinkSocialView({ model: linkModel, configModel: this.configModel }); socialView.render(); $container.append(socialView.$el); $container.removeClass('hidden'); } } else { $container.toggleClass('hidden', !$container.hasClass('hidden')); } }, _showPopupForShare: function(model) { var self = this; var popupView = new OC.Share.ShareDialogLinkShareView({ model: model, configModel: this.configModel, // pass in legacy stuff... itemModel: this.itemModel }); popupView.once('saved', function() { // add/update in collection on success self.collection.add(model); }); popupView.show(); }, _formatItem: function(model) { return _.extend(model.toJSON(), { linkTitle: model.get('name') || model.get('token'), link: this._makeLink(model) }); }, _makeLink: function(model) { var link = ''; if (!model.get('token')) { var preTokenLink = OC.getProtocol() + '://' + OC.getHost(); var fullPath = this.fileInfoModel.get('path') + '/' + this.fileInfoModel.get('name'); var location = '/' + OC.currentUser + '/files' + fullPath; var type = this.fileInfoModel.isDirectory() ? 'folder' : 'file'; link = preTokenLink + OC.linkTo('', 'public.php') + '?service=files&' + type + '=' + encodeURIComponent(location); } else { link = model.getLink(); } return link; }, render: function () { this.$el.html(this.template({ cid: this.cid, urlLabel: t('core', 'Link'), addLinkText: t('core', 'Create public link'), editLinkText: t('core', 'Edit'), removeLinkText: t('core', 'Remove'), copyToClipboardText: t('core', 'Copy to clipboard'), shareText: t('core', 'Social share'), socialShareEnabled: this.configModel.isSocialShareEnabled(), noShares: !this.collection.length, noSharesMessage: t('core', 'There are currently no link shares, you can create one'), privacyWarningMessage: t('core', 'Anyone with the link has access to the file/folder'), shares: this.collection.map(_.bind(this._formatItem, this)) })); this.$el.find('[title]').tooltip(); var clipboard = new Clipboard('#' + this.id + ' .clipboardButton'); clipboard.on('success', function (e) { var $input = $(e.trigger); $input.tooltip({ placement: 'bottom', trigger: 'manual', title: t('core', 'Copied!') }); $input.tooltip('show'); _.delay(function () { $input.tooltip('hide'); }, 3000); }); clipboard.on('error', function (e) { var $input = $(e.trigger); var actionMsg = ''; if (bowser.ios) { actionMsg = t('core', 'Not supported!'); } else if (bowser.mac) { actionMsg = t('core', 'Press ⌘-C to copy.'); } else { actionMsg = t('core', 'Press Ctrl-C to copy.'); } $input.tooltip({ placement: 'bottom', trigger: 'manual', title: actionMsg }); $input.tooltip('show'); _.delay(function () { $input.tooltip('hide'); }, 3000); }); this.delegateEvents(); return this; }, /** * @returns {Function} from Handlebars * @private */ template: function (data) { if (!this._template) { this._template = Handlebars.compile(TEMPLATE); } return this._template(data); } }); OC.Share.ShareDialogLinkListView = ShareDialogLinkListView; })();