diff --git a/public/src/admin/general/social.js b/public/src/admin/general/social.js new file mode 100644 index 0000000000..6816eb3909 --- /dev/null +++ b/public/src/admin/general/social.js @@ -0,0 +1,27 @@ +"use strict"; +/*global define, socket*/ + +define('admin/general/social', [], function() { + var social = {}; + + social.init = function() { + $('#save').on('click', function() { + var networks = []; + $('#postSharingNetworks input[type="checkbox"]').each(function() { + if ($(this).prop('checked')) { + networks.push($(this).attr('id')); + } + }); + + socket.emit('admin.social.savePostSharingNetworks', networks, function(err) { + if (err) { + return app.alertError(err); + } + + app.alertSuccess('Successfully saved Post Sharing Networks!'); + }); + }); + }; + + return social; +}); diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index f5c648ca24..d59cd38371 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -33,6 +33,8 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator return app.alertError(err); } data.posts.display_move_tools = data.posts.display_move_tools && index !== 0; + data.postSharing = data.postSharing.filter(function(share) { return share.activated === true; }); + templates.parse('partials/topic/post-menu-list', data, function(html) { translator.translate(html, function(html) { dropdownMenu.html(html); diff --git a/public/src/modules/share.js b/public/src/modules/share.js index 1413921fc9..c0648009f0 100644 --- a/public/src/modules/share.js +++ b/public/src/modules/share.js @@ -31,17 +31,19 @@ define('share', function() { return false; }); - addHandler('.twitter-share', function () { + addHandler('[component="share/twitter"]', function () { return openShare('https://twitter.com/intent/tweet?text=' + encodeURIComponent(name) + '&url=', getPostUrl($(this)), 550, 420); }); - addHandler('.facebook-share', function () { + addHandler('[component="share/facebook"]', function () { return openShare('https://www.facebook.com/sharer/sharer.php?u=', getPostUrl($(this)), 626, 436); }); - addHandler('.google-share', function () { + addHandler('[component="share/google"]', function () { return openShare('https://plus.google.com/share?url=', getPostUrl($(this)), 500, 570); }); + + $(window).trigger('action:share.addHandlers', {openShare: openShare}); }; function addHandler(selector, callback) { diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 0580bd42a4..8b9b1cafc7 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -22,6 +22,7 @@ var adminController = { sounds: require('./admin/sounds'), homepage: require('./admin/homepage'), navigation: require('./admin/navigation'), + social: require('./admin/social'), themes: require('./admin/themes'), users: require('./admin/users'), uploads: require('./admin/uploads'), diff --git a/src/controllers/admin/social.js b/src/controllers/admin/social.js new file mode 100644 index 0000000000..d8f87af060 --- /dev/null +++ b/src/controllers/admin/social.js @@ -0,0 +1,20 @@ +'use strict'; + +var social = require('../../social'); + +var socialController = {}; + + +socialController.get = function(req, res, next) { + social.getPostSharing(function(err, posts) { + if (err) { + return next(err); + } + + res.render('admin/general/social', { + posts: posts + }); + }); +}; + +module.exports = socialController; \ No newline at end of file diff --git a/src/routes/admin.js b/src/routes/admin.js index 9424a1cda3..f5d4d039a1 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -48,6 +48,7 @@ function addRoutes(router, middleware, controllers) { router.get('/general/sounds', middlewares, controllers.admin.sounds.get); router.get('/general/navigation', middlewares, controllers.admin.navigation.get); router.get('/general/homepage', middlewares, controllers.admin.homepage.get); + router.get('/general/social', middlewares, controllers.admin.social.get); router.get('/manage/categories', middlewares, controllers.admin.categories.getAll); router.get('/manage/categories/:category_id', middlewares, controllers.admin.categories.get); diff --git a/src/social.js b/src/social.js new file mode 100644 index 0000000000..c450421dcb --- /dev/null +++ b/src/social.js @@ -0,0 +1,58 @@ +"use strict"; + +var plugins = require('./plugins'); +var db = require('./database'); +var async = require('async'); + +var social = {}; + +social.getPostSharing = function(callback) { + var networks = [ + { + id: "facebook", + name: "Facebook", + class: "fa-facebook" + }, + { + id: "twitter", + name: "Twitter", + class: "fa-twitter" + }, + { + id: "google", + name: "Google+", + class: "fa-google-plus" + } + ]; + + async.waterfall([ + function(next) { + plugins.fireHook('filter:social.posts', networks, next); + }, + function(networks, next) { + db.getSetMembers('social:posts.activated', function(err, activated) { + if (err) { + return next(err); + } + + networks.forEach(function(network, i) { + networks[i].activated = (activated.indexOf(network.id) !== -1); + }); + + next(null, networks); + }); + } + ], callback); +}; + +social.setActivePostSharingNetworks = function(networkIDs, callback) { + db.delete('social:posts.activated', function(err) { + if (!networkIDs.length) { + return callback(err); + } + + db.setAdd('social:posts.activated', networkIDs, callback); + }); +}; + +module.exports = social; \ No newline at end of file diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 03f971b166..ec863e4c39 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -25,6 +25,7 @@ var async = require('async'), rewards: require('./admin/rewards'), navigation: require('./admin/navigation'), rooms: require('./admin/rooms'), + social: require('./admin/social'), themes: {}, plugins: {}, widgets: {}, diff --git a/src/socket.io/admin/social.js b/src/socket.io/admin/social.js new file mode 100644 index 0000000000..68b3241c64 --- /dev/null +++ b/src/socket.io/admin/social.js @@ -0,0 +1,10 @@ +"use strict"; + +var social = require('../../social'), + SocketSocial = {}; + +SocketSocial.savePostSharingNetworks = function(socket, data, callback) { + social.setActivePostSharingNetworks(data, callback); +}; + +module.exports = SocketSocial; \ No newline at end of file diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index 8c63385baf..c3f08461fe 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -8,6 +8,7 @@ var websockets = require('../index'); var socketTopics = require('../topics'); var privileges = require('../../privileges'); var plugins = require('../../plugins'); +var social = require('../../social'); var favourites = require('../../favourites'); module.exports = function(SocketPosts) { @@ -29,6 +30,9 @@ module.exports = function(SocketPosts) { }, tools: function(next) { plugins.fireHook('filter:post.tools', {pid: data.pid, uid: socket.uid, tools: []}, next); + }, + postSharing: function(next) { + social.getPostSharing(next); } }, function(err, results) { if (err) { diff --git a/src/upgrade.js b/src/upgrade.js index 59d5e6b954..2d2001fc41 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -10,7 +10,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2016, 0, 23); + latestSchema = Date.UTC(2016, 1, 25); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -410,6 +410,34 @@ Upgrade.upgrade = function(callback) { winston.info('[2016/01/23] Creating Global moderators group skipped!'); next(); } + }, + function(next) { + thisSchemaDate = Date.UTC(2016, 1, 25); + + if (schemaDate < thisSchemaDate) { + updatesMade = true; + winston.info('[2016/02/25] Social: Post Sharing'); + + var social = require('./social'); + async.parallel([ + function (next) { + social.setActivePostSharingNetworks(['facebook', 'google', 'twitter'], next); + }, + function (next) { + db.deleteObjectField('config', 'disableSocialButtons', next); + } + ], function(err) { + if (err) { + return next(err); + } + + winston.info('[2016/02/25] Social: Post Sharing done!'); + Upgrade.update(thisSchemaDate, next); + }); + } else { + winston.info('[2016/02/25] Social: Post Sharing skipped!'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!! diff --git a/src/views/admin/general/social.tpl b/src/views/admin/general/social.tpl new file mode 100644 index 0000000000..5ce9ccfc84 --- /dev/null +++ b/src/views/admin/general/social.tpl @@ -0,0 +1,24 @@ +
+ + \ No newline at end of file diff --git a/src/views/admin/partials/menu.tpl b/src/views/admin/partials/menu.tpl index cb4efad079..a0027c0621 100644 --- a/src/views/admin/partials/menu.tpl +++ b/src/views/admin/partials/menu.tpl @@ -7,6 +7,7 @@