diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index a1272e944c..de3f40966e 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -347,13 +347,25 @@ define(function() { confirmDel = confirm((deleteAction ? 'Delete' : 'Restore') + ' this post?'); if (confirmDel) { - deleteAction ? + if(deleteAction) { socket.emit('api:posts.delete', { - pid: pid - }) : + pid: pid, + tid: tid + }, function(err) { + if(err) { + return app.alertError('Can\'t delete post!'); + } + }); + } else { socket.emit('api:posts.restore', { - pid: pid + pid: pid, + tid: tid + }, function(err) { + if(err) { + return app.alertError('Can\'t restore post!'); + } }); + } } }); @@ -546,11 +558,15 @@ define(function() { }); socket.on('event:post_deleted', function(data) { - if (data.pid) toggle_post_delete_state(data.pid, true); + if (data.pid) { + toggle_post_delete_state(data.pid); + } }); socket.on('event:post_restored', function(data) { - if (data.pid) toggle_post_delete_state(data.pid, true); + if (data.pid) { + toggle_post_delete_state(data.pid); + } }); socket.on('api:post.privileges', function(privileges) { @@ -709,6 +725,7 @@ define(function() { } else { postEl.toggleClass('none'); } + updatePostCount(); }); socket.emit('api:post.privileges', pid); } @@ -871,10 +888,14 @@ define(function() { var after = null, firstPid = data.posts[0].pid; $('#post-container li[data-pid]').each(function() { - if(parseInt(firstPid, 10) > parseInt($(this).attr('data-pid'), 10)) - after = $(this); - else - return false; + if(parseInt(firstPid, 10) > parseInt($(this).attr('data-pid'), 10)) { + after = $(this); + if(after.hasClass('main-post')) { + after = after.next(); + } + } else { + return false; + } }); return after; } @@ -908,9 +929,14 @@ define(function() { app.addCommasToNumbers(); $('span.timeago').timeago(); $('.post-content img').addClass('img-responsive'); + updatePostCount(); }); } + function updatePostCount() { + $('#topic-post-count').html($('#post-container li[data-pid]:not(.deleted)').length); + } + function loadMorePosts(tid, callback) { var indicatorEl = $('.loading-indicator'); diff --git a/public/templates/topic.tpl b/public/templates/topic.tpl index 8a4102fde1..26c0967f99 100644 --- a/public/templates/topic.tpl +++ b/public/templates/topic.tpl @@ -103,7 +103,7 @@
posts - {postcount} | + {postcount} | views {viewcount} | browsing diff --git a/src/postTools.js b/src/postTools.js index 90f9fd25bf..aebd4bd691 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -139,15 +139,13 @@ var RDB = require('./redis.js'), RDB.zadd('users:postcount', postcount, postData.uid); }); - io.sockets. in ('topic_' + postData.tid).emit('event:post_deleted', { - pid: pid - }); - // Delete the thread if it is the last undeleted post threadTools.getLatestUndeletedPid(postData.tid, function(err, pid) { if (err && err.message === 'no-undeleted-pids-found') { threadTools.delete(postData.tid, -1, function(err) { - if (err) winston.error('Could not delete topic (tid: ' + postData.tid + ')', err.stack); + if (err) { + winston.error('Could not delete topic (tid: ' + postData.tid + ')', err.stack); + } }); } else { posts.getPostField(pid, 'timestamp', function(err, timestamp) { @@ -159,15 +157,22 @@ var RDB = require('./redis.js'), Feed.updateTopic(postData.tid); Feed.updateRecent(); - callback(); + callback(null); }); }; - PostTools.privileges(pid, uid, function(privileges) { - if (privileges.editable) { - success(); + posts.getPostField(pid, 'deleted', function(err, deleted) { + if(deleted === '1') { + return callback(new Error('Post already deleted!')); } + + PostTools.privileges(pid, uid, function(privileges) { + if (privileges.editable) { + success(); + } + }); }); + } PostTools.restore = function(uid, pid, callback) { @@ -180,10 +185,6 @@ var RDB = require('./redis.js'), user.incrementUserFieldBy(postData.uid, 'postcount', 1); - io.sockets. in ('topic_' + postData.tid).emit('event:post_restored', { - pid: pid - }); - threadTools.getLatestUndeletedPid(postData.tid, function(err, pid) { posts.getPostField(pid, 'timestamp', function(err, timestamp) { topics.updateTimestamp(postData.tid, timestamp); @@ -206,10 +207,16 @@ var RDB = require('./redis.js'), }); }; - PostTools.privileges(pid, uid, function(privileges) { - if (privileges.editable) { - success(); - } + posts.getPostField(pid, 'deleted', function(err, deleted) { + if(deleted === '0') { + return callback(new Error('Post already restored')); + } + + PostTools.privileges(pid, uid, function(privileges) { + if (privileges.editable) { + success(); + } + }); }); } diff --git a/src/websockets.js b/src/websockets.js index e51dc8362c..2eeb1474e9 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -1,36 +1,37 @@ -var cookie = require('cookie'), +var cookie = require('cookie'), express = require('express'), - user = require('./user.js'), - Groups = require('./groups'), - posts = require('./posts.js'), - favourites = require('./favourites.js'), - utils = require('../public/src/utils.js'), util = require('util'), - topics = require('./topics.js'), - categories = require('./categories.js'), - notifications = require('./notifications.js'), - threadTools = require('./threadTools.js'), - postTools = require('./postTools.js'), - meta = require('./meta.js'), async = require('async'), + fs = require('fs'), + nconf = require('nconf'), + winston = require('winston'), + RedisStoreLib = require('connect-redis')(express), RDB = require('./redis'), - util = require('util'), - logger = require('./logger.js'), - fs = require('fs'), RedisStore = new RedisStoreLib({ client: RDB, ttl: 60 * 60 * 24 * 14 }), - nconf = require('nconf'), + + user = require('./user'), + Groups = require('./groups'), + posts = require('./posts'), + favourites = require('./favourites'), + utils = require('../public/src/utils'), + topics = require('./topics'), + categories = require('./categories'), + notifications = require('./notifications'), + threadTools = require('./threadTools'), + postTools = require('./postTools'), + meta = require('./meta'), + logger = require('./logger'), socketCookieParser = express.cookieParser(nconf.get('secret')), admin = { - 'categories': require('./admin/categories.js'), - 'user': require('./admin/user.js') + 'categories': require('./admin/categories'), + 'user': require('./admin/user') }, - plugins = require('./plugins'), - winston = require('winston'); + plugins = require('./plugins'); var users = {}, @@ -43,8 +44,9 @@ module.exports.logoutUser = function(uid) { userSockets[uid][i].emit('event:disconnect'); userSockets[uid][i].disconnect(); - if(!userSockets[uid]) + if(!userSockets[uid]) { return; + } } } } @@ -569,15 +571,33 @@ module.exports.init = function(io) { postTools.edit(uid, data.pid, data.title, data.content, data.images); }); - socket.on('api:posts.delete', function(data) { - postTools.delete(uid, data.pid, function() { + socket.on('api:posts.delete', function(data, callback) { + postTools.delete(uid, data.pid, function(err) { + if(err) { + return callback(err); + } + posts.getTopicPostStats(); + + io.sockets.in('topic_' + data.tid).emit('event:post_deleted', { + pid: data.pid + }); + callback(null); }); }); - socket.on('api:posts.restore', function(data) { - postTools.restore(uid, data.pid, function() { + socket.on('api:posts.restore', function(data, callback) { + postTools.restore(uid, data.pid, function(err) { + if(err) { + return callback(err); + } + posts.getTopicPostStats(); + + io.sockets.in('topic_' + data.tid).emit('event:post_restored', { + pid: data.pid + }); + callback(null); }); });