From 25442a89caf6749b0e159654bdac5cfca226a7c0 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sun, 26 Jan 2014 17:17:34 -0500 Subject: [PATCH] closes #878 --- public/src/forum/category.js | 3 +- public/src/forum/recent.js | 3 +- public/src/forum/unread.js | 4 +- public/templates/category.tpl | 2 +- public/templates/recent.tpl | 2 +- public/templates/unread.tpl | 2 +- src/categories.js | 70 ++++++++++++++++++++--------------- src/socket.io/categories.js | 10 ++--- src/socket.io/topics.js | 6 +-- src/topics.js | 35 ++++++++++-------- tests/categories.js | 6 +-- 11 files changed, 77 insertions(+), 66 deletions(-) diff --git a/public/src/forum/category.js b/public/src/forum/category.js index 29dcffa269..e61443337b 100644 --- a/public/src/forum/category.js +++ b/public/src/forum/category.js @@ -145,7 +145,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { loadingMoreTopics = true; socket.emit('categories.loadMore', { cid: cid, - after: $('#topics-container').children('.category-item').length + after: $('#topics-container').attr('data-nextstart') }, function (err, data) { if(err) { return app.alertError(err.message); @@ -153,6 +153,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { if (data && data.topics.length) { Category.onTopicsLoaded(data.topics); + $('#topics-container').attr('data-nextstart', data.nextStart); } loadingMoreTopics = false; }); diff --git a/public/src/forum/recent.js b/public/src/forum/recent.js index 966ce0058d..17d4602403 100644 --- a/public/src/forum/recent.js +++ b/public/src/forum/recent.js @@ -86,7 +86,7 @@ define(function() { Recent.loadMoreTopics = function() { loadingMoreTopics = true; socket.emit('topics.loadMoreRecentTopics', { - after: $('#topics-container').children('li').length, + after: $('#topics-container').attr('data-nextstart'), term: active }, function(err, data) { if(err) { @@ -95,6 +95,7 @@ define(function() { if (data.topics && data.topics.length) { Recent.onTopicsLoaded('recent', data.topics); + $('#topics-container').attr('data-nextstart', data.nextStart); } loadingMoreTopics = false; diff --git a/public/src/forum/unread.js b/public/src/forum/unread.js index b562ce1502..4f3024fbab 100644 --- a/public/src/forum/unread.js +++ b/public/src/forum/unread.js @@ -46,7 +46,7 @@ define(['forum/recent'], function(recent) { function loadMoreTopics() { loadingMoreTopics = true; socket.emit('topics.loadMoreUnreadTopics', { - after: parseInt($('#topics-container').attr('data-next-start'), 10) + after: $('#topics-container').attr('data-nextstart') }, function(err, data) { if(err) { return app.alertError(err.message); @@ -54,7 +54,7 @@ define(['forum/recent'], function(recent) { if (data.topics && data.topics.length) { recent.onTopicsLoaded('unread', data.topics); - $('#topics-container').attr('data-next-start', data.nextStart); + $('#topics-container').attr('data-nextstart', data.nextStart); } else { $('#load-more-btn').hide(); } diff --git a/public/templates/category.tpl b/public/templates/category.tpl index 5b578dc604..a8b73e765c 100644 --- a/public/templates/category.tpl +++ b/public/templates/category.tpl @@ -28,7 +28,7 @@
-
    +
    • diff --git a/public/templates/recent.tpl b/public/templates/recent.tpl index 71ce3054d7..27fbf7ad94 100644 --- a/public/templates/recent.tpl +++ b/public/templates/recent.tpl @@ -21,7 +21,7 @@
      -
        +
        • diff --git a/public/templates/unread.tpl b/public/templates/unread.tpl index 114e8cba83..36874fd2b8 100644 --- a/public/templates/unread.tpl +++ b/public/templates/unread.tpl @@ -16,7 +16,7 @@
          -
            +
            • diff --git a/src/categories.js b/src/categories.js index a2aee70091..31e425c27b 100644 --- a/src/categories.js +++ b/src/categories.js @@ -1,8 +1,8 @@ -var db = require('./database.js'), - posts = require('./posts.js'), - utils = require('./../public/src/utils.js'), - user = require('./user.js'), - topics = require('./topics.js'), +var db = require('./database'), + posts = require('./posts'), + utils = require('./../public/src/utils'), + user = require('./user'), + topics = require('./topics'), plugins = require('./plugins'), CategoryTools = require('./categoryTools'), meta = require('./meta'), @@ -52,8 +52,8 @@ var db = require('./database.js'), return callback(err); } - function getTopicIds(next) { - Categories.getTopicIds(category_id, start, end, next); + function getTopics(next) { + Categories.getCategoryTopics(category_id, start, end, current_user, next); } function getActiveUsers(next) { @@ -70,9 +70,12 @@ var db = require('./database.js'), Categories.getPageCount(category_id, next); } - async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) { - var tids = results[0], - active_users = results[1], + async.parallel([getTopics, getActiveUsers, getSidebars, getPageCount], function(err, results) { + if(err) { + return callback(err); + } + + var active_users = results[1], sidebars = results[2], pageCount = results[3]; @@ -87,27 +90,22 @@ var db = require('./database.js'), 'topic_row_size': 'col-md-9', 'category_id': category_id, 'active_users': [], - 'topics': [], + 'topics': results[0].topics, + 'nextStart': results[0].nextStart, 'pageCount': pageCount, 'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false, 'sidebars': sidebars }; - function getTopics(next) { - topics.getTopicsByTids(tids, category_id, current_user, next); - } - function getModerators(next) { Categories.getModerators(category_id, next); } function getActiveUsers(next) { - user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], function(err, users) { - next(err, users); - }); + user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], next); } - if (tids.length === 0) { + if (!category.topics.length) { getModerators(function(err, moderators) { category.moderator_block_class = moderators.length > 0 ? '' : 'none'; category.moderators = moderators; @@ -116,11 +114,10 @@ var db = require('./database.js'), callback(null, category); }); } else { - async.parallel([getTopics, getModerators, getActiveUsers], function(err, results) { - category.topics = results[0]; - category.moderator_block_class = results[1].length > 0 ? '' : 'none'; - category.moderators = results[1]; - category.active_users = results[2]; + async.parallel([getModerators, getActiveUsers], function(err, results) { + category.moderator_block_class = results[0].length > 0 ? '' : 'none'; + category.moderators = results[0]; + category.active_users = results[1]; category.show_sidebar = category.topics.length > 0 ? 'show' : 'hidden'; callback(null, category); }); @@ -131,13 +128,26 @@ var db = require('./database.js'), }; Categories.getCategoryTopics = function(cid, start, stop, uid, callback) { - Categories.getTopicIds(cid, start, stop, function(err, tids) { - if(err) { - return callback(err); - } + async.waterfall([ + function(next) { + Categories.getTopicIds(cid, start, stop, next); + }, + function(tids, next) { + topics.getTopicsByTids(tids, cid, uid, next); + }, + function(topics, next) { + db.sortedSetRevRank('categories:' + cid + ':tid', topics[topics.length - 1].tid, function(err, rank) { + if(err) { + return next(err); + } - topics.getTopicsByTids(tids, cid, uid, callback); - }); + return next(null, { + topics: topics, + nextStart: parseInt(rank, 10) + 1 + }); + }); + } + ], callback); }; Categories.getTopicIds = function(cid, start, stop, callback) { diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index eaac85b4ac..4ccc949779 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -18,14 +18,10 @@ SocketCategories.loadMore = function(socket, data, callback) { var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20; - var start = data.after, + var start = parseInt(data.after, 10), end = start + topicsPerPage - 1; - - categories.getCategoryTopics(data.cid, start, end, socket.uid, function(err, topics) { - callback(err, { - topics: topics - }); - }); +console.log(start, end); + categories.getCategoryTopics(data.cid, start, end, socket.uid, callback); }; SocketCategories.getPageCount = function(socket, cid, callback) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index b81b484610..e290efc59e 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -236,7 +236,7 @@ SocketTopics.loadMore = function(socket, data, callback) { var postsPerPage = parseInt(meta.config.postsPerPage, 10); postsPerPage = postsPerPage ? postsPerPage : 20; - var start = data.after, + var start = parseInt(data.after, 10), end = start + postsPerPage - 1; async.parallel({ @@ -256,14 +256,14 @@ SocketTopics.loadMoreRecentTopics = function(socket, data, callback) { return callback(new Error('invalid data')); } - var start = data.after, + var start = parseInt(data.after, 10), end = start + 9; topics.getLatestTopics(socket.uid, start, end, data.term, callback); }; SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { - var start = data.after, + var start = parseInt(data.after, 10), end = start + 9; topics.getUnreadTopics(socket.uid, start, end, callback); diff --git a/src/topics.js b/src/topics.js index 76a98767d9..580b1e15d3 100644 --- a/src/topics.js +++ b/src/topics.js @@ -448,11 +448,7 @@ var async = require('async'), async.filter(tids, function(tid, next) { threadTools.privileges(tid, current_user, function(err, privileges) { - if (!err && privileges.read) { - next(true); - } else { - next(false); - } + next(!err && privileges.read); }); }, function(tids) { Topics.getTopicsByTids(tids, 0, current_user, function(err, topicData) { @@ -466,7 +462,7 @@ var async = require('async'), } db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { - latestTopics.lastIndex = rank; + latestTopics.nextStart = parseInt(rank,10) + 1; latestTopics.topics = topicData; callback(null, latestTopics); }); @@ -549,7 +545,7 @@ var async = require('async'), return parseInt(read[index], 10) === 0; }); - // Filter out topics that belong to categories that this user cannot access + async.filter(newtids, function(tid, next) { threadTools.privileges(tid, uid, function(err, privileges) { if (!err && privileges.read) { @@ -599,16 +595,23 @@ var async = require('async'), return callback(err); } - unreadTopics.topics = topicData; - unreadTopics.nextStart = stop + 1; - if (!topicData || topicData.length === 0) { - unreadTopics.no_topics_message = 'show'; - } - if (uid === 0 || topicData.length === 0) { - unreadTopics.show_markallread_button = 'hidden'; - } + db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { + if(err) { + return callback(err); + } + + unreadTopics.topics = topicData; + unreadTopics.nextStart = parseInt(rank, 10) + 1; + + if (!topicData || topicData.length === 0) { + unreadTopics.no_topics_message = 'show'; + } + if (uid === 0 || topicData.length === 0) { + unreadTopics.show_markallread_button = 'hidden'; + } - callback(null, unreadTopics); + callback(null, unreadTopics); + }); }); } diff --git a/tests/categories.js b/tests/categories.js index ba9cf3b702..770ad0b498 100644 --- a/tests/categories.js +++ b/tests/categories.js @@ -43,9 +43,9 @@ describe('Categories', function() { describe('.getCategoryTopics', function() { it('should return a list of topics', function(done) { - Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, topics) { - assert(Array.isArray(topics)); - assert(topics.every(function(topic) { + Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, result) { + assert(Array.isArray(result.topics)); + assert(result.topics.every(function(topic) { return topic instanceof Object; }));