From 06d0a41915998918c2c162d609ee0eeded0a849d Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle <schiessle@owncloud.com> Date: Tue, 2 Jun 2015 14:12:47 +0200 Subject: [PATCH] add social media button for diaspora, twitter, facebook and google+ --- .../css/3rdparty/gs-share/style.css | 49 +++++ apps/files_sharing/css/settings-personal.css | 3 + apps/files_sharing/img/gs-share.png | Bin 0 -> 863 bytes .../js/3rdparty/gs-share/gs-share.js | 206 ++++++++++++++++++ apps/files_sharing/js/settings-personal.js | 15 ++ apps/files_sharing/settings-personal.php | 7 + .../templates/settings-personal.php | 69 +++++- 7 files changed, 343 insertions(+), 6 deletions(-) create mode 100644 apps/files_sharing/css/3rdparty/gs-share/style.css create mode 100644 apps/files_sharing/css/settings-personal.css create mode 100644 apps/files_sharing/img/gs-share.png create mode 100644 apps/files_sharing/js/3rdparty/gs-share/gs-share.js create mode 100644 apps/files_sharing/js/settings-personal.js diff --git a/apps/files_sharing/css/3rdparty/gs-share/style.css b/apps/files_sharing/css/3rdparty/gs-share/style.css new file mode 100644 index 00000000000..c699ddb3db5 --- /dev/null +++ b/apps/files_sharing/css/3rdparty/gs-share/style.css @@ -0,0 +1,49 @@ +.js-gs-share, .gs-share [aria-hidden="true"], .gs-share-form[aria-hidden="true"] { + display: none; +} + +.js-gs-share-enabled .js-gs-share { + display: inline; + float: left; +} + +.gs-share .js-gs-share[href] { + display: inline; +} + +.gs-share [aria-hidden="false"], .gs-share-form[aria-hidden="false"] { + display: block; + margin-top: 40px; +} + +.gs-share { + position: relative; +} + +.gs-share-form { + background: #FFF; + border: 1px solid #000; + border-radius: 5px; + padding: 5px; + position: absolute; + z-index: 1; +} + +.gs-share [for="gs-account"], .gs-share [type="text"] { + display: block; + margin-bottom: 8px; +} + +.gs-share [type="submit"] { + display: block; + margin-top: 8px; +} + +.gs-share--icon { + border: none; + cursor: pointer; + min-height: 32px; + padding: 0; + padding-left: 33px; + background: transparent url('../../../img/gs-share.png') no-repeat left center; +} diff --git a/apps/files_sharing/css/settings-personal.css b/apps/files_sharing/css/settings-personal.css new file mode 100644 index 00000000000..de438844c7f --- /dev/null +++ b/apps/files_sharing/css/settings-personal.css @@ -0,0 +1,3 @@ +#fileSharingSettings img { + cursor: pointer; +} diff --git a/apps/files_sharing/img/gs-share.png b/apps/files_sharing/img/gs-share.png new file mode 100644 index 0000000000000000000000000000000000000000..25b0c4d06fee747919b945d3ded988ca368283a1 GIT binary patch literal 863 zcmV-l1EBngP)<h;3K|Lk000e1NJLTq0012T001Be0{{R3*{Oq00004%P)t-s0001@ zBrvBZF`^<dq9ib)Br&5WE~6wcq9ib)Bru{SFrp+dpCB-zBru{SFq|tZq9re(BrvJ~ zRiPv?qa`q;BsZcZFQOzc{{R4^B{8BTFrg(cq9ib)Brv8SETS$hq9ib(Brv5SFry_e zqb4z;B`~5TFMt35q9ie)Au^&QF#rGmr7Jf7{{H^`{h}o?qbD+_FFUV9PWS8Vr!YIF zEjYbnYp_L7`0wzkH9+v(-uUqF+NZ3$UufgL!K*n#vP)IenxELBr?gI3(v_O&%gwDm zNdEl&$bE#WHbJgGN~tqH$bN;wZ+E3CHt5L9(v_RwwYloe(4;9fwp3lhaCgm!kM!l| z-m$gMj+M=dk)|y<=Eca@p{MTG+N3BnvrJaGT4VnF{NA&-_UY=rW^coBd9q1Ur7Snl zkCprO_U_l&vPx8~KS|V^psYMc(UY0mtFQd`_~^>b=ETSS`}@IecH_Lju}4wZqo}V! zO#Alt&W)4Gf{E$O&-3Er`SJ4h>g%H>GWF-^@7UVGZFSL<ngTto6951JDs)m#Qvm21 zG_XG>K=$F${t(@n5|Y{jlZy^~ngN)UXYTJ83#x!6VK2j{0=O=q=)ZFS00B=)L_t(2 zk#*BmbHY#%1>nVsTdBLt-3Eu^b$54ncX$2Wy$K0)BIjk#>=&O2fW_e?a&bB=0CuCS zu`$}grig^tz$(<UR=(^l2`ej@`F3(B=teBWH!}#wT|_*53vDh4%Z$d42-!dOtgjIg zn3L$$<>^5Lw{UxQ#l0%gbIfK@qMmC;z<DCkFkSa_505V+x_2ZxiP*`NT?WU*>Z7N2 zrRxMTgCg})ZA;gwp@C76wo~=d>1|=-6={&FpUx!r)Fa}j3Lu8*`21pZTC5$2ckKN6 zjpI{Lti64R&+Pq@3_eKSm-M?4KT@f02Hzj0N@i}-AM))!vjSC?qqm9JYvLuES*Sou zl%s_lgCZJo05m2AG--g1TBpyZn3FucP7N|C;jWo4M*x*&tQN>)ZWW7#3fMrcytGIb po15sbRb3%#HLiMBZC&I4)gN^Zi>YM1$QS?s002ovPDHLkV1k>Crt$y) literal 0 HcmV?d00001 diff --git a/apps/files_sharing/js/3rdparty/gs-share/gs-share.js b/apps/files_sharing/js/3rdparty/gs-share/gs-share.js new file mode 100644 index 00000000000..fd4442708a4 --- /dev/null +++ b/apps/files_sharing/js/3rdparty/gs-share/gs-share.js @@ -0,0 +1,206 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// @license magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt MPL 2.0 +document.addEventListener('DOMContentLoaded', function () { + 'use strict'; + /** + * 'Share' widget for GNU social + * http://code.chromic.org/project/view/2/ + * + * We make a few assumptions about the target instance: + * 1) The API root is in the default location + * 2) Fancy URLs are enabled + * 3) CORS is allowed + * 4) The Bookmark plugin is enabled + * + * If 1), 3) or 4) are wrong, we fall back to a regular + * notice (instead of a bookmark notice) + * + * If 2) is wrong the user will be directed to a 404 :( + */ + + // TODO: input sanitation [1], [2] + // TODO: server-side fallback if JS is disabled + + var createForm, + bindClicks, + frm, + shareAsNotice, + shareAsBookmark, + extractURLParams, + shareURL, + shareTitle, + closest, + i18n = window.i18n; + + /** + * Internationalization + */ + if (i18n === undefined) { + i18n = { + invalidId: 'The account id provided is invalid', + yourAcctId: 'Your account ID:', + idPlaceholder: 'user@example.org', + shareAsBookmark: 'Share as a bookmark' + }; + } + + shareAsNotice = function (title, url, domain) { + window.open('http://' + domain + '/notice/new?status_textarea=' + title + ' ' + url); // [1] + }; + + shareAsBookmark = function (title, url, domain) { + window.open('http://' + domain + '/main/bookmark/new?url=' + url + '&title=' + title); // [2] + }; + + /** + * Extract parameters from query string + * + * ex: + * ?foo=bar&baz=test + * will return: + * {foo: 'bar', baz: 'test'} + */ + extractURLParams = function (queryStr) { + var parts = queryStr.substr(1).split('&'), + i, len, keyVal, params = {}; + + for (i = 0, len = parts.length; i < len; i += 1) { + keyVal = parts[i].split('='); + params[keyVal[0]] = keyVal[1]; + } + + return params; + }; + + // Create the form that we'll re-use throughout the page + createForm = function () { + var err = document.createElement('div'); + err.setAttribute('class', 'gs-share-err'); + err.setAttribute('tabindex', '-1'); + err.setAttribute('aria-hidden', 'true'); + err.textContent = i18n.invalidId; + + frm = document.createElement('form'); + + frm.setAttribute('class', 'gs-share-form'); + frm.setAttribute('tabindex', '-1'); + frm.setAttribute('aria-hidden', 'true'); + + frm.innerHTML = '<label for="gs-account">' + i18n.yourAcctId + '</label>' + + '<input type="text" id="gs-account" placeholder="' + i18n.idPlaceholder + '" />' + + '<input type="checkbox" id="gs-bookmark" /> <label for="gs-bookmark">' + i18n.shareAsBookmark + '</label>' + + '<input type="submit" value="Share"/>'; + frm.insertBefore(err, frm.firstChild); + + // Submit handler + frm.addEventListener('submit', function (e) { + e.preventDefault(); + + var accountParts = document.getElementById('gs-account').value.split('@'), + username, domain, xhr, bookmarkURL; + + if (accountParts.length === 2) { + err.setAttribute('aria-hidden', 'true'); + + username = accountParts[0]; + domain = accountParts[1]; + bookmarkURL = 'http://' + domain + '/api/bookmarks/' + username + '.json'; + + // Try bookmark + if (document.getElementById('gs-bookmark').checked) { + xhr = new XMLHttpRequest(); + + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200) { // Success + shareAsBookmark(shareTitle, shareURL, domain); + } else { // Failure, fallback to regular notice + shareAsNotice(shareTitle, shareURL, domain); + } + } + }; + + xhr.open('GET', bookmarkURL, true); + xhr.send(); + } else { // Regular notice + shareAsNotice(shareTitle, shareURL, domain); + } + } else { // Invalid account id + err.setAttribute('aria-hidden', 'false'); + err.focus(); + } + }); + + // Keydown handler + frm.addEventListener('keydown', function (e) { + if (e.keyCode === 27) { // Escape key closes the dialog + frm.parentElement.getElementsByClassName('js-gs-share')[0].focus(); + frm.setAttribute('aria-hidden', 'true'); + } + }); + + document.body.appendChild(frm); + }; + + /** + * Something similar to jQuery.closest + * + * Given `elm`, return the closest parent with class `cls` + * or false if there is no matching ancestor. + */ + closest = function (elm, cls) { + while (elm !== document) { + if (elm.classList.contains(cls)) { + return elm; + } + + elm = elm.parentNode; + } + + return false; + }; + + bindClicks = function () { + document.addEventListener('click', function (e) { + var target = e.target, + urlParams, + lnk = closest(target, 'js-gs-share'); + + // Don't do anything on right/middle click or if ctrl or shift was pressed while left-clicking + if (!e.button && !e.ctrlKey && !e.shiftKey && lnk) { + e.preventDefault(); + + // Check for submission information in href first + if (lnk.search !== undefined) { + urlParams = extractURLParams(lnk.search); + shareURL = urlParams.url; + shareTitle = urlParams.title; + } else { // If it's not there, try data-* attributes. If not, use current document url and title + shareURL = lnk.getAttribute('data-url') || window.location.href; + shareTitle = lnk.getAttribute('data-title') || document.title; + } + + // Move form after the clicked link + lnk.parentNode.appendChild(frm); + + // Show form + frm.setAttribute('aria-hidden', 'false'); + + // Focus on form + frm.focus(); + } else if (!frm.contains(target)) { + frm.setAttribute('aria-hidden', 'true'); + } + }); + }; + + // Flag that js is enabled + document.body.classList.add('js-gs-share-enabled'); + + createForm(); + bindClicks(); +}); +// @license-end diff --git a/apps/files_sharing/js/settings-personal.js b/apps/files_sharing/js/settings-personal.js new file mode 100644 index 00000000000..800579d1eca --- /dev/null +++ b/apps/files_sharing/js/settings-personal.js @@ -0,0 +1,15 @@ +$(document).ready(function() { + + $('#fileSharingSettings img').click(function() { + var url = $(this).data('url'); + 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/apps/files_sharing/settings-personal.php b/apps/files_sharing/settings-personal.php index 1aff784b488..d95c15001e3 100644 --- a/apps/files_sharing/settings-personal.php +++ b/apps/files_sharing/settings-personal.php @@ -22,11 +22,18 @@ \OC_Util::checkLoggedIn(); +$l = \OC::$server->getL10N('files_sharing'); + $uid = \OC::$server->getUserSession()->getUser()->getUID(); $server = \OC::$server->getURLGenerator()->getAbsoluteURL('/'); $cloudID = $uid . '@' . rtrim(\OCA\Files_Sharing\Helper::removeProtocolFromUrl($server), '/'); +$url = 'https://owncloud.org/federation'; $tmpl = new OCP\Template('files_sharing', 'settings-personal'); +$tmpl->assign('outgoingServer2serverShareEnabled', \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled()); +$tmpl->assign('message_with_URL', $l->t('Share with me through my #ownCloud federation Id %s see %s', [$cloudID, $url])); +$tmpl->assign('message_without_URL', $l->t('Share with me through my #ownCloud federation Id %s', [$cloudID])); +$tmpl->assign('reference', $url); $tmpl->assign('cloudId', $cloudID); return $tmpl->fetchPage(); diff --git a/apps/files_sharing/templates/settings-personal.php b/apps/files_sharing/templates/settings-personal.php index 84d8e8a1b13..84efd1dd1db 100644 --- a/apps/files_sharing/templates/settings-personal.php +++ b/apps/files_sharing/templates/settings-personal.php @@ -1,12 +1,69 @@ <?php /** @var OC_L10N $l */ /** @var array $_ */ +script('files_sharing', 'settings-personal'); +style('files_sharing', 'settings-personal'); +script('files_sharing', '3rdparty/gs-share/gs-share'); +style('files_sharing', '3rdparty/gs-share/style'); ?> -<div id="fileSharingSettings" class="section"> - <h2><?php p($l->t('Federated Cloud'));?></h2> - <p> - <?php p($l->t('Your Federated Cloud ID: %s', [$_['cloudId']])); ?> - </p> +<?php if ($_['outgoingServer2serverShareEnabled']): ?> + <div id="fileSharingSettings" class="section"> + <h2><?php p($l->t('Federated Cloud')); ?></h2> -</div> + <p> + <?php p($l->t('Your Federated Cloud ID: %s', [$_['cloudId']])); ?> + </p> + + <p> + + <h3><?php p($l->t('Share your Federated Cloud Id:')); ?></h3> + + <p> + + <div class='gs-share'> + <button data-url='<?php p($_['reference']); ?>' + data-title='<?php p(urlencode($_['message_without_URL'])); ?>' + class='js-gs-share gs-share--icon'> + </button> + </div> + + + <img src='TODO: Add Diaspora Button' style="border: 0px solid;" + alt='Share on Diaspora' + data-url='http://sharetodiaspora.github.io/?title=<?php p($_['message_without_URL']); ?>&url=<?php p($_['reference']); ?>'/> + <img src='TODO: Add Twitter Button' alt=' | Share on Twitter' + data-url='https://twitter.com/intent/tweet?text=<?php p(urlencode($_['message_with_URL'])); ?>'/> + <img src='TODO: Add Facebook Button' alt=' | Share on Facebook' + data-url='https://www.facebook.com/sharer/sharer.php?u=<?php p($_['reference']); ?>'/> + <img src='TODO: Add Google+ Button' alt=' | Share on Google+' + data-url='https://plus.google.com/share?url=<?php p($_['reference']); ?>'/> + + </p> + + <br/> + + <h3><?php p($l->t('Add your Federated Cloud Id to your homepage:')); ?></h3> + + <p> + + <a href="<?php p($_['reference']); ?>"> + <img src='TODO: Add Example Banner/Button' + alt='<?php p($_['message_with_URL']); ?>'/> + </a> + + <br/> + <?php p($l->t('HTML Code:')); ?> + <br/> + + <xmp> + <a href="<?php p($_['reference']); ?>"> + <img src='TODO: Add Banner/Button' + alt='<?php p($_['message_with_URL']); ?>'/> + </a> + </xmp> + + </p> + + </div> +<?php endif; ?> -- GitLab