From d0bc5ec9c718d67113ec116889c9dc97dd36f97c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 18 Nov 2014 14:33:14 -0500 Subject: [PATCH] client/topics.js refactor ability to dismiss all flags --- public/src/admin/manage/flags.js | 14 ++ public/src/client/topic.js | 262 +----------------------------- public/src/client/topic/events.js | 8 +- public/src/client/topic/posts.js | 253 +++++++++++++++++++++++++++++ src/posts/delete.js | 3 + src/posts/flags.js | 4 + src/socket.io/admin.js | 4 + src/views/admin/manage/flags.tpl | 10 ++ 8 files changed, 300 insertions(+), 258 deletions(-) create mode 100644 public/src/client/topic/posts.js diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index 8a07ba03af..c6dc4b11af 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -6,7 +6,9 @@ define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable' Flags.init = function() { $('.post-container .content img').addClass('img-responsive'); + handleDismiss(); + handleDismissAll(); handleDelete(); handleInfiniteScroll(); }; @@ -22,6 +24,18 @@ define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable' }); } + function handleDismissAll() { + $('#dismissAll').on('click', function() { + socket.emit('admin.dismissAllFlags', function(err) { + if (err) { + return app.alertError(err.message); + } + + $('.post-container').empty().text('No flagged posts!'); + }); + }); + } + function handleDelete() { $('.flags').on('click', '.delete', function() { var btn = $(this); diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 4ca730947d..cd3963acff 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -3,17 +3,16 @@ /* globals define, app, templates, translator, socket, bootbox, config, ajaxify, RELATIVE_PATH, utils */ -var dependencies = [ +define('forum/topic', [ 'forum/pagination', 'forum/infinitescroll', 'forum/topic/threadTools', 'forum/topic/postTools', 'forum/topic/events', 'forum/topic/browsing', + 'forum/topic/posts', 'navigator' -]; - -define('forum/topic', dependencies, function(pagination, infinitescroll, threadTools, postTools, events, browsing, navigator) { +], function(pagination, infinitescroll, threadTools, postTools, events, browsing, posts, navigator) { var Topic = {}, currentUrl = ''; @@ -24,8 +23,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT app.removeAlert('bookmark'); events.removeListeners(); - - socket.removeListener('event:new_post', onNewPost); } }); @@ -42,9 +39,7 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT app.enterRoom('topic_' + tid); - processPage($('.topic')); - - showBottomPostBar(); + posts.processPage($('.topic')); postTools.init(tid, thread_state); threadTools.init(tid, thread_state); @@ -52,20 +47,14 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT handleSorting(); - hidePostToolsForDeletedPosts(); - enableInfiniteLoadingOrPagination(); addBlockQuoteHandler(); - addBlockquoteEllipses($('.topic .post-content > blockquote')); - handleBookmark(tid); navigator.init('.posts > .post-row', postCount, Topic.toTop, Topic.toBottom, Topic.navigatorCallback, Topic.calculateIndex); - setupSocketListeners(); - $(window).on('scroll', updateTopicTitle); $(window).trigger('action:topic.loaded'); @@ -73,12 +62,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT socket.emit('topics.enter', tid); }; - function setupSocketListeners() { - socket.removeListener('event:new_post', onNewPost); - - socket.on('event:new_post', onNewPost); - } - Topic.toTop = function() { navigator.scrollTop(0); }; @@ -133,31 +116,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT }); } - function showBottomPostBar() { - if($('#post-container .post-row').length > 1 || !$('#post-container li[data-index="0"]').length) { - $('.bottom-post-bar').removeClass('hide'); - } - } - - function onNewPost(data) { - var tid = ajaxify.variables.get('topic_id'); - if(data && data.posts && data.posts.length && parseInt(data.posts[0].tid, 10) !== parseInt(tid, 10)) { - return; - } - - if(config.usePagination) { - return onNewPostPagination(data); - } - - for (var i=0; i'); - } - }); - } function enableInfiniteLoadingOrPagination() { if(!config.usePagination) { - infinitescroll.init(loadMorePosts, $('#post-container .post-row[data-index="0"]').height()); + infinitescroll.init(posts.loadMorePosts, $('#post-container .post-row[data-index="0"]').height()); } else { navigator.hide(); @@ -187,11 +137,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT } } - function hidePostToolsForDeletedPosts() { - $('#post-container li.deleted').each(function() { - postTools.toggle($(this).attr('data-pid'), true); - }); - } function updateTopicTitle() { if($(window).scrollTop() > 50) { @@ -252,203 +197,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT return index; }; - function onNewPostPagination(data) { - var posts = data.posts; - socket.emit('topics.getPageCount', ajaxify.variables.get('topic_id'), function(err, newPageCount) { - - pagination.recreatePaginationLinks(newPageCount); - - if (pagination.currentPage === pagination.pageCount) { - createNewPosts(data); - } else if(data.posts && data.posts.length && parseInt(data.posts[0].uid, 10) === parseInt(app.uid, 10)) { - pagination.loadPage(pagination.pageCount); - } - }); - } - - function createNewPosts(data, callback) { - callback = callback || function() {}; - if(!data || (data.posts && !data.posts.length)) { - return callback(false); - } - - function removeAlreadyAddedPosts() { - data.posts = data.posts.filter(function(post) { - return $('#post-container li[data-pid="' + post.pid +'"]').length === 0; - }); - } - - var after = null, - before = null; - - function findInsertionPoint() { - var firstPostTimestamp = parseInt(data.posts[0].timestamp, 10); - var firstPostVotes = parseInt(data.posts[0].votes, 10); - var firstPostIndex = parseInt(data.posts[0].index, 10); - - var firstReply = $('#post-container li.post-row[data-index!="0"]').first(); - var lastReply = $('#post-container li.post-row[data-index!="0"]').last(); - - if (config.topicPostSort === 'oldest_to_newest') { - if (firstPostTimestamp < parseInt(firstReply.attr('data-timestamp'), 10)) { - before = firstReply; - } else if(firstPostTimestamp >= parseInt(lastReply.attr('data-timestamp'), 10)) { - after = lastReply; - } - } else if(config.topicPostSort === 'newest_to_oldest') { - if (firstPostTimestamp > parseInt(firstReply.attr('data-timestamp'), 10)) { - before = firstReply; - } else if(firstPostTimestamp <= parseInt(lastReply.attr('data-timestamp'), 10)) { - after = lastReply; - } - } else if(config.topicPostSort === 'most_votes') { - if (firstPostVotes > parseInt(firstReply.attr('data-votes'), 10)) { - before = firstReply; - } else if(firstPostVotes < parseInt(firstReply.attr('data-votes'), 10)) { - after = lastReply; - } else { - if (firstPostIndex > parseInt(firstReply.attr('data-index'), 10)) { - before = firstReply; - } else if(firstPostIndex <= parseInt(firstReply.attr('data-index'), 10)) { - after = lastReply; - } - } - } - } - - removeAlreadyAddedPosts(); - if(!data.posts.length) { - return callback(false); - } - - findInsertionPoint(); - - data.title = $('
').text(ajaxify.variables.get('topic_name')).html(); - data.viewcount = ajaxify.variables.get('viewcount'); - - infinitescroll.parseAndTranslate('topic', 'posts', data, function(html) { - if(after) { - html.insertAfter(after); - } else if(before) { - // Save document height and position for future reference (about 5 lines down) - var height = $(document).height(), - scrollTop = $(document).scrollTop(), - originalPostEl = $('li[data-index="0"]'); - - // Insert the new post - html.insertBefore(before); - - // If the user is not at the top of the page... (or reasonably so...) - if (scrollTop > originalPostEl.offset().top) { - // Now restore the relative position the user was on prior to new post insertion - $(document).scrollTop(scrollTop + ($(document).height() - height)); - } - } else { - $('#post-container').append(html); - } - - html.hide().fadeIn('slow'); - - addBlockquoteEllipses(html.find('.post-content > blockquote')); - - $(window).trigger('action:posts.loaded'); - onNewPostsLoaded(html, data.posts); - callback(true); - }); - } - - function onNewPostsLoaded(html, posts) { - - var pids = []; - for(var i=0; i'); - } - }); - postTools.updatePostCount(); - showBottomPostBar(); - } - - function toggleModTools(pid, privileges) { - var postEl = $('.post-row[data-pid="' + pid + '"]'); - - if (!privileges.editable) { - postEl.find('.edit, .delete, .purge').remove(); - } - if (!privileges.move) { - postEl.find('.move').remove(); - } - postEl.find('.reply, .quote').toggleClass('hidden', !$('.post_reply').length); - var isSelfPost = parseInt(postEl.attr('data-uid'), 10) === parseInt(app.uid, 10); - postEl.find('.chat, .flag').toggleClass('hidden', isSelfPost || !app.uid); - } - - function loadMorePosts(direction) { - if (!$('#post-container').length || navigator.scrollActive) { - return; - } - - var reverse = config.topicPostSort === 'newest_to_oldest' || config.topicPostSort === 'most_votes'; - - infinitescroll.calculateAfter(direction, '#post-container .post-row[data-index!="0"]', config.postsPerPage, reverse, function(after, offset, el) { - loadPostsAfter(after); - }); - } - - function loadPostsAfter(after) { - var tid = ajaxify.variables.get('topic_id'); - if (!utils.isNumber(tid) || !utils.isNumber(after) || (after === 0 && $('#post-container li.post-row[data-index="1"]').length)) { - return; - } - - var indicatorEl = $('.loading-indicator'); - if (!indicatorEl.is(':animated')) { - indicatorEl.fadeIn(); - } - - infinitescroll.loadMore('topics.loadMore', { - tid: tid, - after: after - }, function (data, done) { - - indicatorEl.fadeOut(); - - if (data && data.posts && data.posts.length) { - createNewPosts(data, function(postsCreated) { - done(); - }); - hidePostToolsForDeletedPosts(); - } else { - socket.emit('topics.markAsRead', [tid]); - navigator.update(); - done(); - } - }); - } return Topic; }); diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index d4883cdd53..cf33e15bc7 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -3,7 +3,12 @@ /* globals app, ajaxify, define, socket, translator, templates */ -define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', 'forum/topic/threadTools'], function(browsing, postTools, threadTools) { +define('forum/topic/events', [ + 'forum/topic/browsing', + 'forum/topic/postTools', + 'forum/topic/threadTools', + 'forum/topic/posts' +], function(browsing, postTools, threadTools, posts) { var Events = {}; @@ -41,6 +46,7 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' 'posts.unvote': togglePostVote, 'event:new_notification': onNewNotification, + 'event:new_post': posts.onNewPost, 'event:topic.notifyTyping': onNotifyTyping, 'event:topic.stopNotifyTyping': onStopNotifyTyping diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js new file mode 100644 index 0000000000..57626e24aa --- /dev/null +++ b/public/src/client/topic/posts.js @@ -0,0 +1,253 @@ + +'use strict'; + +/* globals config, app, ajaxify, define, socket, utils */ + +define('forum/topic/posts', [ + 'forum/pagination', + 'forum/infinitescroll', + 'forum/topic/postTools', + 'navigator' +], function(pagination, infinitescroll, postTools, navigator) { + + var Posts = {}; + + Posts.onNewPost = function(data) { + var tid = ajaxify.variables.get('topic_id'); + if(data && data.posts && data.posts.length && parseInt(data.posts[0].tid, 10) !== parseInt(tid, 10)) { + return; + } + + if(config.usePagination) { + return onNewPostPagination(data); + } + + for (var i=0; i= parseInt(lastReply.attr('data-timestamp'), 10)) { + after = lastReply; + } + } else if(config.topicPostSort === 'newest_to_oldest') { + if (firstPostTimestamp > parseInt(firstReply.attr('data-timestamp'), 10)) { + before = firstReply; + } else if(firstPostTimestamp <= parseInt(lastReply.attr('data-timestamp'), 10)) { + after = lastReply; + } + } else if(config.topicPostSort === 'most_votes') { + if (firstPostVotes > parseInt(firstReply.attr('data-votes'), 10)) { + before = firstReply; + } else if(firstPostVotes < parseInt(firstReply.attr('data-votes'), 10)) { + after = lastReply; + } else { + if (firstPostIndex > parseInt(firstReply.attr('data-index'), 10)) { + before = firstReply; + } else if(firstPostIndex <= parseInt(firstReply.attr('data-index'), 10)) { + after = lastReply; + } + } + } + } + + removeAlreadyAddedPosts(); + if(!data.posts.length) { + return callback(false); + } + + findInsertionPoint(); + + data.title = $('
').text(ajaxify.variables.get('topic_name')).html(); + data.viewcount = ajaxify.variables.get('viewcount'); + + infinitescroll.parseAndTranslate('topic', 'posts', data, function(html) { + if(after) { + html.insertAfter(after); + } else if(before) { + // Save document height and position for future reference (about 5 lines down) + var height = $(document).height(), + scrollTop = $(document).scrollTop(), + originalPostEl = $('li[data-index="0"]'); + + // Insert the new post + html.insertBefore(before); + + // If the user is not at the top of the page... (or reasonably so...) + if (scrollTop > originalPostEl.offset().top) { + // Now restore the relative position the user was on prior to new post insertion + $(document).scrollTop(scrollTop + ($(document).height() - height)); + } + } else { + $('#post-container').append(html); + } + + html.hide().fadeIn('slow'); + + $(window).trigger('action:posts.loaded'); + onNewPostsLoaded(html, data.posts); + callback(true); + }); + } + + function onNewPostsLoaded(html, posts) { + + var pids = []; + for(var i=0; i'); + } + }); + postTools.updatePostCount(); + addBlockquoteEllipses(element.find('.post-content > blockquote')); + hidePostToolsForDeletedPosts(element); + showBottomPostBar(); + }; + + function showBottomPostBar() { + if($('#post-container .post-row').length > 1 || !$('#post-container li[data-index="0"]').length) { + $('.bottom-post-bar').removeClass('hide'); + } + } + + function hidePostToolsForDeletedPosts(element) { + element.find('li.deleted').each(function() { + postTools.toggle($(this).attr('data-pid'), true); + }); + } + + function addBlockquoteEllipses(blockquotes) { + blockquotes.each(function() { + var $this = $(this); + if ($this.find(':hidden:not(br)').length && !$this.find('.toggle').length) { + $this.append(''); + } + }); + } + + return Posts; + +}); diff --git a/src/posts/delete.js b/src/posts/delete.js index 05ad297d1c..fa3efe3ce8 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -27,6 +27,9 @@ module.exports = function(Posts) { }, function(next) { removeFromCategoryRecentPosts(pid, postData.tid, next); + }, + function(next) { + db.sortedSetRemove('posts:flagged', pid, next); } ], function(err) { callback(err, postData); diff --git a/src/posts/flags.js b/src/posts/flags.js index 638163e9b8..c3b591b001 100644 --- a/src/posts/flags.js +++ b/src/posts/flags.js @@ -39,6 +39,10 @@ module.exports = function(Posts) { }); }; + Posts.dismissAllFlags = function(callback) { + db.delete('posts:flagged', callback); + }; + Posts.getFlags = function(uid, start, end, callback) { db.getSortedSetRevRange('posts:flagged', start, end, function(err, pids) { if (err) { diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index c55e04a5ad..db7d62d8e3 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -260,6 +260,10 @@ SocketAdmin.dismissFlag = function(socket, pid, callback) { posts.dismissFlag(pid, callback); }; +SocketAdmin.dismissAllFlags = function(socket, data, callback) { + posts.dismissAllFlags(callback); +}; + SocketAdmin.getMoreFlags = function(socket, after, callback) { if (!parseInt(after, 10)) { return callback('[[error:invalid-data]]'); diff --git a/src/views/admin/manage/flags.tpl b/src/views/admin/manage/flags.tpl index ec38dec18d..4697c951fe 100644 --- a/src/views/admin/manage/flags.tpl +++ b/src/views/admin/manage/flags.tpl @@ -41,6 +41,16 @@ +
+
+
Flags Control Panel
+
+
+ +
+
+
+