diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css index 4738f8b780237..6fd2b9b316509 100644 --- a/apps/files_sharing/css/sharetabview.css +++ b/apps/files_sharing/css/sharetabview.css @@ -21,6 +21,25 @@ padding: 14px; } +.shareTabView .linkMore { + position: absolute; + right: -7px; + top: -4px; + padding: 14px; +} + +/* fix the popup menu because the button is shifted and then the menu is not aligned */ +.shareTabView .popovermenu.socialSharingMenu { + right: -7px; +} + +.shareTabView .popovermenu .clipboardButton { + position: relative; + top: initial; + right: initial; + padding: 18px 0 18px 36px; +} + .shareTabView label { white-space: nowrap; } diff --git a/core/js/core.json b/core/js/core.json index d589208c82846..52d81b352d42f 100644 --- a/core/js/core.json +++ b/core/js/core.json @@ -28,6 +28,7 @@ "l10n.js", "apps.js", "share.js", + "sharesocialmanager.js", "shareconfigmodel.js", "shareitemmodel.js", "sharedialogview.js", diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js index 84a3d18942f84..e7bea516be03d 100644 --- a/core/js/sharedialoglinkshareview.js +++ b/core/js/sharedialoglinkshareview.js @@ -27,7 +27,12 @@ '
' + '' + '' + - '' + + '{{#if singleAction}}' + + '' + + '{{else}}' + + '' + + '{{{popoverMenu}}}' + + '{{/if}}' + '
' + ' {{#if publicUpload}}' + '
' + @@ -64,6 +69,26 @@ '{{#if noSharingPlaceholder}}{{/if}}' + '{{/if}}' ; + var TEMPLATE_POPOVER_MENU = + ''; /** * @class OCA.Share.ShareDialogLinkShareView @@ -85,6 +110,9 @@ /** @type {Function} **/ _template: undefined, + /** @type {Function} **/ + _popoverMenuTemplate: undefined, + /** @type {boolean} **/ showLink: true, @@ -96,7 +124,9 @@ 'change .publicUploadCheckbox': 'onAllowPublicUploadChange', 'change .publicEditingCheckbox': 'onAllowPublicEditingChange', 'change .hideFileListCheckbox': 'onHideFileListChange', - 'click .showPasswordCheckbox': 'onShowPasswordClick' + 'click .showPasswordCheckbox': 'onShowPasswordClick', + 'click .icon-more': 'onToggleMenu', + 'click .pop-up': 'onPopUpClick' }, initialize: function(options) { @@ -142,6 +172,9 @@ var clipboard = new Clipboard('.clipboardButton'); clipboard.on('success', function(e) { + event.preventDefault(); + event.stopPropagation(); + var $input = $(e.trigger); $input.tooltip('hide') .attr('data-original-title', t('core', 'Copied!')) @@ -149,9 +182,13 @@ .tooltip({placement: 'bottom', trigger: 'manual'}) .tooltip('show'); _.delay(function() { - $input.tooltip('hide') - .attr('data-original-title', t('core', 'Copy')) - .tooltip('fixTitle'); + $input.tooltip('hide'); + if (OC.Share.Social.Collection.size() == 0) { + $input.attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); + } else { + $input.tooltip("destroy"); + } }, 3000); }); clipboard.on('error', function (e) { @@ -171,9 +208,13 @@ .tooltip({placement: 'bottom', trigger: 'manual'}) .tooltip('show'); _.delay(function () { - $input.tooltip('hide') - .attr('data-original-title', t('core', 'Copy')) - .tooltip('fixTitle'); + $input.tooltip('hide'); + if (OC.Share.Social.Collection.size() == 0) { + $input.attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); + } else { + $input.tooltip("destroy"); + } }, 3000); }); @@ -354,6 +395,26 @@ && isLinkShare && this.model.updatePermissionPossible(); + var link = this.model.get('linkShare').link; + var social = []; + OC.Share.Social.Collection.each(function(model) { + var url = model.get('url'); + url = url.replace('{{reference}}', link); + + social.push({ + url: url, + label: t('core', 'Share to {name}', {name: model.get('name')}), + name: model.get('name'), + iconClass: model.get('iconClass') + }); + }); + + var popover = this.popoverMenuTemplate({ + cid: this.cid, + copyLabel: t('core', 'Copy'), + social: social + }); + this.$el.html(linkShareTemplate({ cid: this.cid, shareAllowed: true, @@ -376,16 +437,35 @@ publicEditingLabel: t('core', 'Allow editing'), hideFileListLabel: t('core', 'File drop (upload only)'), mailPrivatePlaceholder: t('core', 'Email link to person'), - mailButtonText: t('core', 'Send') + mailButtonText: t('core', 'Send'), + singleAction: OC.Share.Social.Collection.size() == 0, + popoverMenu: popover })); - this.$el.find('.clipboardButton').tooltip({placement: 'bottom', title: t('core', 'Copy'), trigger: 'hover'}); + if (OC.Share.Social.Collection.size() == 0) { + this.$el.find('.clipboardButton').tooltip({ + placement: 'bottom', + title: t('core', 'Copy'), + trigger: 'hover' + }); + } this.delegateEvents(); return this; }, + onToggleMenu: function(event) { + event.preventDefault(); + event.stopPropagation(); + var $element = $(event.target); + var $li = $element.closest('.oneline'); + var $menu = $li.find('.popovermenu'); + + OC.showMenu(null, $menu); + this._menuOpen = $li.data('share-id'); + }, + /** * @returns {Function} from Handlebars * @private @@ -395,6 +475,35 @@ this._template = Handlebars.compile(TEMPLATE); } return this._template; + }, + + /** + * 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); + }, + + onPopUpClick: function(event) { + event.preventDefault(); + event.stopPropagation(); + + var url = $(event.currentTarget).data('url'); + $(event.currentTarget).tooltip('hide'); + if (url) { + var width = 600; + var height = 400; + var left = (screen.width/2)-(width/2); + var top = (screen.height/2)-(height/2); + + window.open(url, 'name', 'width=' + width + ', height=' + height + ', top=' + top + ', left=' + left); + } } }); diff --git a/core/js/sharesocialmanager.js b/core/js/sharesocialmanager.js new file mode 100644 index 0000000000000..c1db48dda6237 --- /dev/null +++ b/core/js/sharesocialmanager.js @@ -0,0 +1,53 @@ +/** + * @copyright 2017, Roeland Jago Douma + * + * @author Roeland Jago Douma + * + * @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 . + * + */ + +(function() { + if (!OC.Share) { + OC.Share = {}; + } + + OC.Share.Social = {}; + + var SocialModel = OC.Backbone.Model.extend({ + defaults: { + /** used for sorting social buttons */ + key: null, + /** url to open, {{reference}} will be replaced with the link */ + url: null, + /** Name to show in the tooltip */ + name: null, + /** Icon class to display */ + iconClass: null + } + }); + + OC.Share.Social.Model = SocialModel; + + var SocialCollection = OC.Backbone.Collection.extend({ + model: OC.Share.Social.Model, + + comparator: 'key' + }); + + + OC.Share.Social.Collection = new SocialCollection; +})(); diff --git a/lib/private/Share/Share.php b/lib/private/Share/Share.php index 6abaa7dd41377..38b12a57ccfbc 100644 --- a/lib/private/Share/Share.php +++ b/lib/private/Share/Share.php @@ -94,6 +94,7 @@ public static function registerBackend($itemType, $class, $collectionOf = null, if(count(self::$backendTypes) === 1) { \OC_Util::addScript('core', 'shareconfigmodel'); \OC_Util::addScript('core', 'shareitemmodel'); + \OC_Util::addScript('core', 'sharesocialmanager'); \OC_Util::addScript('core', 'sharedialogresharerinfoview'); \OC_Util::addScript('core', 'sharedialoglinkshareview'); \OC_Util::addScript('core', 'sharedialogexpirationview');