diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index a532693cc8..62ac232630 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -442,6 +442,46 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { return false; }); + $('#post-container').on('click', '.upvote', function() { + var post = $(this).parents('.post-row'), + pid = post.attr('data-pid'), + upvoted = post.find('.votes').attr('data-vote-status') === 'upvoted'; + + if (upvoted === true) { + socket.emit('posts.unvote', { + pid: pid, + room_id: app.currentRoom + }); + } else { + socket.emit('posts.upvote', { + pid: pid, + room_id: app.currentRoom + }); + } + + return false; + }); + + $('#post-container').on('click', '.downvote', function() { + var post = $(this).parents('.post-row'), + pid = post.attr('data-pid'), + downvoted = post.find('.votes').attr('data-vote-status') === 'downvoted'; + + if (downvoted === true) { + socket.emit('posts.unvote', { + pid: pid, + room_id: app.currentRoom + }); + } else { + socket.emit('posts.downvote', { + pid: pid, + room_id: app.currentRoom + }); + } + + return false; + }); + $('#post-container').on('click', '.flag', function() { bootbox.confirm('Are you sure you want to flag this post?', function(confirm) { if (confirm) { @@ -576,7 +616,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { 'event:topic_deleted', 'event:topic_restored', 'event:topic:locked', 'event:topic_unlocked', 'event:topic_pinned', 'event:topic_unpinned', 'event:topic_moved', 'event:post_edited', 'event:post_deleted', 'event:post_restored', - 'posts.favourite', 'user.isOnline' + 'posts.favourite', 'user.isOnline', 'posts.upvote', 'posts.downvote' ]); socket.on('get_users_in_room', function(data) { @@ -759,6 +799,58 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { }); }); + socket.on('posts.upvote', function(data) { + if (data && data.pid) { + var post = $('li[data-pid="' + data.pid + '"]'), + upvote = post.find('.upvote'), + downvote = post.find('.downvote'), + votes = post.find('.votes'); + + upvote.addClass('btn-primary'); + downvote.removeClass('btn-primary'); + votes.attr('data-vote-status', 'upvoted'); + } + }); + + socket.on('posts.downvote', function(data) { + if (data && data.pid) { + var post = $('li[data-pid="' + data.pid + '"]'), + upvote = post.find('.upvote'), + downvote = post.find('.downvote'), + votes = post.find('.votes'), + currentVotes = parseInt(votes.attr('data-votes'), 10) - 1; + + downvote.addClass('btn-primary'); + upvote.removeClass('btn-primary'); + votes.html(currentVotes) + .attr('data-votes', currentVotes) + .attr('data-vote-status', 'downvoted'); + } + }); + + socket.on('posts.unvote', function(data) { + if (data && data.pid) { + var post = $('li[data-pid="' + data.pid + '"]'), + upvote = post.find('.upvote'), + downvote = post.find('.downvote'), + votes = post.find('.votes'), + status = votes.attr('data-vote-status'), + currentVotes = parseInt(votes.attr('data-votes'), 10); + + if (status === 'upvoted') { + currentVotes --; + upvote.removeClass('btn-primary'); + } else if (status === 'downvoted') { + currentVotes ++; + downvote.removeClass('btn-primary'); + } + + votes.html(currentVotes) + .attr('data-votes', currentVotes) + .attr('data-vote-status', ''); + } + }); + socket.on('posts.favourite', function(data) { if (data && data.pid) { var favBtn = $('li[data-pid="' + data.pid + '"] .favourite'); @@ -803,17 +895,16 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { }); function adjust_rep(value, pid, uid) { - var post_rep = jQuery('.post_rep_' + pid), - user_rep = jQuery('.user_rep_' + uid); - - var ptotal = parseInt(post_rep.html(), 10), - utotal = parseInt(user_rep.html(), 10); + var votes = $('li[data-pid="' + pid + '"] .votes'), + reputationElements = $('.reputation[data-uid="' + uid + '"]'), + currentVotes = parseInt(votes.attr('data-votes'), 10), + reputation = parseInt(reputationElements.attr('data-reputation'), 10); - ptotal += value; - utotal += value; + currentVotes += value; + reputation += value; - post_rep.html(ptotal + ' '); - user_rep.html(utotal + ' '); + reputationElements.html(currentVotes).attr('data-votes', currentVotes); + reputationElements.html(reputation); } function set_locked_state(locked, alert) {