mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	closes #4434
This commit is contained in:
		| @@ -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 () { | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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]]'}]); | ||||
| 		} | ||||
|   | ||||
| @@ -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 (tids, next) { | ||||
| 			if (Array.isArray(tids) && !tids.length) { | ||||
| 		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 (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); | ||||
| 	}); | ||||
|   | ||||
| @@ -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; | ||||
| 		data.categories = results.watchedCategories.categories; | ||||
| 		data.selectedCategory = results.watchedCategories.selectedCategory; | ||||
|  | ||||
| 		results.unreadTopics.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); | ||||
| 		results.unreadTopics.title = '[[pages:unread]]'; | ||||
| 		results.unreadTopics.filters = [{ | ||||
| 		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 || ''; | ||||
|   | ||||
| @@ -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); | ||||
| 			} | ||||
|   | ||||
| @@ -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); | ||||
| 	}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user