From 0efe315790deed2632e1a27babbac0189cd8a20f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 12 Aug 2016 12:57:23 +0300 Subject: [PATCH] closes #4631 --- public/src/client/topic/events.js | 2 +- public/src/client/topic/posts.js | 2 +- public/src/client/topic/threadTools.js | 26 ++++++++++++++++++++++---- src/privileges/topics.js | 15 +++++++++------ src/topics/create.js | 4 ++++ src/topics/posts.js | 2 +- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 0c6ee5ea06..68a864198e 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -188,7 +188,7 @@ define('forum/topic/events', [ var isDeleted = postEl.hasClass('deleted'); postTools.toggle(data.pid, isDeleted); - if (!app.user.isAdmin && !app.user.isGlobalMod && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) { + if (!ajaxify.data.privileges.isAdminOrMod && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) { postEl.find('[component="post/tools"]').toggleClass('hidden', isDeleted); if (isDeleted) { postEl.find('[component="post/content"]').translateHtml('[[topic:post_is_deleted]]'); diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index b31b5fc0ed..656364b3a1 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -31,7 +31,7 @@ define('forum/topic/posts', [ post.display_delete_tools = (ajaxify.data.privileges['posts:delete'] && post.selfPost) || ajaxify.data.privileges.isAdminOrMod; post.display_moderator_tools = post.display_edit_tools || post.display_delete_tools; post.display_move_tools = ajaxify.data.privileges.isAdminOrMod; - post.display_post_menu = ajaxify.data.privileges.isAdminOrMod || post.selfPost || ((app.user.uid || ajaxify.data.postSharing.length) && !post.deleted); + post.display_post_menu = ajaxify.data.privileges.isAdminOrMod || (post.selfPost && !ajaxify.data.locked) || ((app.user.uid || ajaxify.data.postSharing.length) && !post.deleted); }); updatePostCounts(data.posts); diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 3110b92a4d..a18c069cd5 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -173,15 +173,24 @@ define('forum/topic/threadTools', [ return; } - var isLocked = data.isLocked && !app.user.isAdmin; + var isLocked = data.isLocked && !ajaxify.data.privileges.isAdminOrMod; components.get('topic/lock').toggleClass('hidden', data.isLocked); components.get('topic/unlock').toggleClass('hidden', !data.isLocked); - components.get('topic/reply/container').toggleClass('hidden', isLocked); - components.get('topic/reply/locked').toggleClass('hidden', !isLocked); - threadEl.find('[component="post/reply"], [component="post/quote"], [component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked); + var hideReply = (data.isLocked || ajaxify.data.deleted) && !ajaxify.data.privileges.isAdminOrMod; + + components.get('topic/reply/container').toggleClass('hidden', hideReply); + components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !data.isLocked || ajaxify.data.deleted); + + threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply); + threadEl.find('[component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked); + + threadEl.find('[component="post"][data-uid="'+app.user.uid+'"].deleted [component="post/tools"]').toggleClass('hidden', isLocked); + $('[component="post/header"] i.fa-lock').toggleClass('hidden', !data.isLocked); + $('[component="post/tools"] .dropdown-menu').html(''); + ajaxify.data.locked = data.isLocked; }; ThreadTools.setDeleteState = function(data) { @@ -195,9 +204,17 @@ define('forum/topic/threadTools', [ components.get('topic/purge').toggleClass('hidden', !data.isDelete); components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete); + var hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod; + + components.get('topic/reply/container').toggleClass('hidden', hideReply); + components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !ajaxify.data.locked || data.isDelete); + threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply); + threadEl.toggleClass('deleted', data.isDelete); + ajaxify.data.deleted = data.isDelete; }; + ThreadTools.setPinnedState = function(data) { var threadEl = components.get('topic'); if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { @@ -207,6 +224,7 @@ define('forum/topic/threadTools', [ components.get('topic/pin').toggleClass('hidden', data.isPinned); components.get('topic/unpin').toggleClass('hidden', !data.isPinned); $('[component="post/header"] i.fa-thumb-tack').toggleClass('hidden', !data.isPinned); + ajaxify.data.pinned = data.isPinned; }; function setFollowState(state) { diff --git a/src/privileges/topics.js b/src/privileges/topics.js index c9f0ec717a..b6fffb8a6a 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -17,7 +17,7 @@ module.exports = function(privileges) { privileges.topics.get = function(tid, uid, callback) { var topic; async.waterfall([ - async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked']), + async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']), function(_topic, next) { topic = _topic; async.parallel({ @@ -42,14 +42,19 @@ module.exports = function(privileges) { var disabled = parseInt(results.disabled, 10) === 1; var locked = parseInt(topic.locked, 10) === 1; + var deleted = parseInt(topic.deleted, 10) === 1; + var isAdminOrMod = results.isAdministrator || results.isModerator; var editable = isAdminOrMod; var deletable = isAdminOrMod || (results.isOwner && results['topics:delete'][0]); plugins.fireHook('filter:privileges.topics.get', { - 'topics:reply': (results['topics:reply'][0] && !locked) || isAdminOrMod, - read: results.read[0] || isAdminOrMod, + 'topics:reply': (results['topics:reply'][0] && !locked && !deleted) || isAdminOrMod, 'topics:read': results['topics:read'][0] || isAdminOrMod, + 'topics:delete': (results.isOwner && results['topics:delete'][0]) || isAdminOrMod, + 'posts:edit': (results['posts:edit'][0] && !locked) || isAdminOrMod, + 'posts:delete': (results['posts:delete'][0] && !locked) || isAdminOrMod, + read: results.read[0] || isAdminOrMod, view_thread_tools: editable || deletable, editable: editable, deletable: deletable, @@ -57,9 +62,7 @@ module.exports = function(privileges) { isAdminOrMod: isAdminOrMod, disabled: disabled, tid: tid, - uid: uid, - 'posts:edit': (results['posts:edit'][0] && !locked) || isAdminOrMod, - 'posts:delete': (results['posts:delete'][0] && !locked) || isAdminOrMod + uid: uid }, callback); }); }; diff --git a/src/topics/create.js b/src/topics/create.js index c79e0758f4..cd1bf23a62 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -205,6 +205,10 @@ module.exports = function(Topics) { return next(new Error('[[error:topic-locked]]')); } + if (parseInt(results.topicData.deleted, 10) === 1 && !results.isAdminOrMod) { + return next(new Error('[[error:topic-deleted]]')); + } + if (!results.canReply) { return next(new Error('[[error:no-privileges]]')); } diff --git a/src/topics/posts.js b/src/topics/posts.js index 45e46cd3c8..80bde62334 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -145,7 +145,7 @@ module.exports = function(Topics) { post.display_delete_tools = topicPrivileges.isAdminOrMod || (post.selfPost && topicPrivileges['posts:delete']); post.display_moderator_tools = post.display_edit_tools || post.display_delete_tools; post.display_move_tools = topicPrivileges.isAdminOrMod && post.index !== 0; - post.display_post_menu = topicPrivileges.isAdminOrMod || post.selfPost || ((loggedIn || topicData.postSharing.length) && !post.deleted); + post.display_post_menu = topicPrivileges.isAdminOrMod || (post.selfPost && !topicData.locked) || ((loggedIn || topicData.postSharing.length) && !post.deleted); post.ip = topicPrivileges.isAdminOrMod ? post.ip : undefined; if (post.deleted && !(topicPrivileges.isAdminOrMod || post.selfPost)) {