From 84a7b6690bb08c7b3be8ef19e59b3b8c05ef31c4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 13 May 2016 14:08:50 +0300 Subject: [PATCH] closes #4434 --- public/src/client/recent.js | 4 +- public/src/client/tag.js | 4 +- public/src/client/unread.js | 4 +- src/controllers/recent.js | 41 ++++++++++++++++- src/controllers/tags.js | 36 +++++++++++---- src/controllers/unread.js | 80 ++++++++++++++++++++++------------ src/socket.io/topics/unread.js | 2 +- src/topics/unread.js | 40 +++++++---------- 8 files changed, 142 insertions(+), 69 deletions(-) diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 641beb5ca9..22777be4f6 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -23,7 +23,9 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite $(this).addClass('hide'); }); - infinitescroll.init(Recent.loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(Recent.loadMoreTopics); + } }; Recent.watchForNewPosts = function () { diff --git a/public/src/client/tag.js b/public/src/client/tag.js index 1758539b61..b475c7406b 100644 --- a/public/src/client/tag.js +++ b/public/src/client/tag.js @@ -16,7 +16,9 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i loadMoreTopics(); }); - infinitescroll.init(loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(loadMoreTopics); + } function loadMoreTopics(direction) { if(direction < 0 || !$('[component="category"]').length) { diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 9300377ce3..5a3ec3543c 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -78,7 +78,9 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' loadMoreTopics(); }); - infinitescroll.init(loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(loadMoreTopics); + } function loadMoreTopics(direction) { if(direction < 0 || !$('[component="category"]').length) { diff --git a/src/controllers/recent.js b/src/controllers/recent.js index 6883929be4..fe9355c533 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -1,26 +1,63 @@ 'use strict'; +var async = require('async'); var nconf = require('nconf'); +var db = require('../database'); +var privileges = require('../privileges'); +var user = require('../user'); var topics = require('../topics'); var meta = require('../meta'); var helpers = require('./helpers'); +var pagination = require('../pagination'); var recentController = {}; recentController.get = function(req, res, next) { + var page = parseInt(req.query.page, 10) || 1; + var pageCount = 1; + var stop = 0; + var topicCount = 0; + var settings; - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + async.waterfall([ + function (next) { + async.parallel({ + settings: function(next) { + user.getSettings(req.uid, next); + }, + tids: function (next) { + db.getSortedSetRevRange('topics:recent', 0, 199, next); + } + }, next); + }, + function (results, next) { + settings = results.settings; + privileges.topics.filterTids('read', results.tids, req.uid, next); + }, + function (tids, next) { + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + stop = start + settings.topicsPerPage - 1; - topics.getTopicsFromSet('topics:recent', req.uid, 0, stop, function(err, data) { + topicCount = tids.length; + pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); + tids = tids.slice(start, stop + 1); + + topics.getTopicsByTids(tids, req.uid, next); + } + ], function(err, topics) { if (err) { return next(err); } + var data = {}; + data.topics = topics; + data.nextStart = stop + 1; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; data.rssFeedUrl = nconf.get('relative_path') + '/recent.rss'; data.title = '[[pages:recent]]'; + data.pagination = pagination.create(page, pageCount); if (req.path.startsWith('/api/recent') || req.path.startsWith('/recent')) { data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]); } diff --git a/src/controllers/tags.js b/src/controllers/tags.js index af8f6058c0..45ab3424aa 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -5,15 +5,16 @@ var async = require('async'); var nconf = require('nconf'); var validator = require('validator'); -var meta = require('../meta'); +var user = require('../user'); var topics = require('../topics'); +var pagination = require('../pagination'); var helpers = require('./helpers'); var tagsController = {}; tagsController.getTag = function(req, res, next) { var tag = validator.escape(req.params.tag); - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + var page = parseInt(req.query.page, 10) || 1; var templateData = { topics: [], @@ -21,18 +22,33 @@ tagsController.getTag = function(req, res, next) { breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]), title: '[[pages:tag, ' + tag + ']]' }; - + var settings; + var topicCount = 0; async.waterfall([ function (next) { - topics.getTagTids(req.params.tag, 0, stop, next); + user.getSettings(req.uid, next); + }, + function (_settings, next) { + settings = _settings; + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + var stop = start + settings.topicsPerPage - 1; + templateData.nextStart = stop + 1; + async.parallel({ + topicCount: function(next) { + topics.getTagTopicCount(tag, next); + }, + tids: function(next) { + topics.getTagTids(req.params.tag, start, stop, next); + } + }, next); }, - function (tids, next) { - if (Array.isArray(tids) && !tids.length) { + function (results, next) { + if (Array.isArray(results.tids) && !results.tids.length) { topics.deleteTag(req.params.tag); return res.render('tag', templateData); } - - topics.getTopics(tids, req.uid, next); + topicCount = results.topicCount; + topics.getTopics(results.tids, req.uid, next); } ], function(err, topics) { if (err) { @@ -54,7 +70,9 @@ tagsController.getTag = function(req, res, next) { } ]; templateData.topics = topics; - templateData.nextStart = stop + 1; + + var pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); + templateData.pagination = pagination.create(page, pageCount); res.render('tag', templateData); }); diff --git a/src/controllers/unread.js b/src/controllers/unread.js index d72099e7c5..0fc32c390c 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -2,9 +2,10 @@ 'use strict'; var async = require('async'); -var meta = require('../meta'); + var categories = require('../categories'); var privileges = require('../privileges'); +var pagination = require('../pagination'); var user = require('../user'); var topics = require('../topics'); var helpers = require('./helpers'); @@ -14,7 +15,7 @@ var unreadController = {}; var validFilter = {'': true, 'new': true, 'watched': true}; unreadController.get = function(req, res, next) { - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + var page = parseInt(req.query.page, 10) || 1; var results; var cid = req.query.cid; var filter = req.params.filter || ''; @@ -22,45 +23,36 @@ unreadController.get = function(req, res, next) { if (!validFilter[filter]) { return next(); } - + var settings; async.waterfall([ function(next) { async.parallel({ watchedCategories: function(next) { - user.getWatchedCategories(req.uid, next); + getWatchedCategories(req.uid, cid, next); }, - unreadTopics: function(next) { - topics.getUnreadTopics(cid, req.uid, 0, stop, filter, next); + settings: function(next) { + user.getSettings(req.uid, next); } }, next); }, function(_results, next) { results = _results; - - privileges.categories.filterCids('read', results.watchedCategories, req.uid, next); - }, - function(cids, next) { - categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor'], next); + settings = results.settings; + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + var stop = start + settings.topicsPerPage - 1; + topics.getUnreadTopics(cid, req.uid, start, stop, filter, next); } - ], function(err, categories) { + ], function(err, data) { if (err) { return next(err); } - categories = categories.filter(function(category) { - return category && !category.link; - }); - categories.forEach(function(category) { - category.selected = parseInt(category.cid, 10) === parseInt(cid, 10); - if (category.selected) { - results.unreadTopics.selectedCategory = category; - } - }); - results.unreadTopics.categories = categories; - - results.unreadTopics.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); - results.unreadTopics.title = '[[pages:unread]]'; - results.unreadTopics.filters = [{ + data.categories = results.watchedCategories.categories; + data.selectedCategory = results.watchedCategories.selectedCategory; + + data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); + data.title = '[[pages:unread]]'; + data.filters = [{ name: '[[unread:all-topics]]', url: 'unread', selected: filter === '', @@ -77,16 +69,46 @@ unreadController.get = function(req, res, next) { filter: 'watched' }]; - results.unreadTopics.selectedFilter = results.unreadTopics.filters.filter(function(filter) { + data.selectedFilter = data.filters.filter(function(filter) { return filter && filter.selected; })[0]; - results.unreadTopics.querystring = req.query.cid ? ('?cid=' + req.query.cid) : ''; + data.querystring = req.query.cid ? ('?cid=' + req.query.cid) : ''; - res.render('unread', results.unreadTopics); + data.pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage)); + data.pagination = pagination.create(page, data.pageCount, req.query); + + res.render('unread', data); }); }; +function getWatchedCategories(uid, selectedCid, callback) { + async.waterfall([ + function (next) { + user.getWatchedCategories(uid, next); + }, + function (cids, next) { + privileges.categories.filterCids('read', cids, uid, next); + }, + function (cids, next) { + categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor'], next); + }, + function (categoryData, next) { + categoryData = categoryData.filter(function(category) { + return category && !category.link; + }); + var selectedCategory; + categoryData.forEach(function(category) { + category.selected = parseInt(category.cid, 10) === parseInt(selectedCid, 10); + if (category.selected) { + selectedCategory = category; + } + }); + next(null, {categories: categoryData, selectedCategory: selectedCategory}); + } + ], callback); +} + unreadController.unreadTotal = function(req, res, next) { var filter = req.params.filter || ''; diff --git a/src/socket.io/topics/unread.js b/src/socket.io/topics/unread.js index 056b80b041..4a6153b397 100644 --- a/src/socket.io/topics/unread.js +++ b/src/socket.io/topics/unread.js @@ -46,7 +46,7 @@ module.exports = function(SocketTopics) { }; SocketTopics.markCategoryTopicsRead = function(socket, cid, callback) { - topics.getUnreadTids(cid, socket.uid, 0, -1, function(err, tids) { + topics.getUnreadTids(cid, socket.uid, function(err, tids) { if (err) { return callback(err); } diff --git a/src/topics/unread.js b/src/topics/unread.js index ac2e6d63a3..9dcfd8bdd9 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -19,17 +19,13 @@ module.exports = function(Topics) { callback = filter; filter = ''; } - - Topics.getUnreadTids(0, uid, 0, 99, filter, function(err, tids) { - callback(err, tids ? tids.length : 0); + Topics.getUnreadTids(0, uid, filter, function(err, tids) { + callback(err, Array.isArray(tids) ? tids.length : 0); }); }; + Topics.getUnreadTopics = function(cid, uid, start, stop, filter, callback) { - if (!callback) { - callback = filter; - filter = ''; - } var unreadTopics = { showSelect: true, @@ -39,12 +35,21 @@ module.exports = function(Topics) { async.waterfall([ function(next) { - Topics.getUnreadTids(cid, uid, start, stop, filter, next); + Topics.getUnreadTids(cid, uid, filter, next); }, function(tids, next) { + unreadTopics.topicCount = tids.length; + if (!tids.length) { return next(null, []); } + + if (stop === -1) { + tids = tids.slice(start); + } else { + tids = tids.slice(start, stop + 1); + } + Topics.getTopicsByTids(tids, uid, next); }, function(topicData, next) { @@ -63,12 +68,7 @@ module.exports = function(Topics) { return Date.now() - (parseInt(meta.config.unreadCutoff, 10) || 2) * 86400000; }; - Topics.getUnreadTids = function(cid, uid, start, stop, filter, callback) { - if (!callback) { - callback = filter; - filter = ''; - } - + Topics.getUnreadTids = function(cid, uid, filter, callback) { uid = parseInt(uid, 10); if (uid === 0) { return callback(null, []); @@ -136,19 +136,9 @@ module.exports = function(Topics) { }, function (tids, next) { - tids = tids.slice(0, 100); + tids = tids.slice(0, 200); filterTopics(uid, tids, cid, ignoredCids, next); - }, - function (tids, next) { - - if (stop === -1) { - tids = tids.slice(start); - } else { - tids = tids.slice(start, stop + 1); - } - - next(null, tids); } ], callback); };