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'); | 			$(this).addClass('hide'); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|  | 		if (!config.usePagination) { | ||||||
| 			infinitescroll.init(Recent.loadMoreTopics); | 			infinitescroll.init(Recent.loadMoreTopics); | ||||||
|  | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	Recent.watchForNewPosts = function () { | 	Recent.watchForNewPosts = function () { | ||||||
|   | |||||||
| @@ -16,7 +16,9 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i | |||||||
| 			loadMoreTopics(); | 			loadMoreTopics(); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|  | 		if (!config.usePagination) { | ||||||
| 			infinitescroll.init(loadMoreTopics); | 			infinitescroll.init(loadMoreTopics); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		function loadMoreTopics(direction) { | 		function loadMoreTopics(direction) { | ||||||
| 			if(direction < 0 || !$('[component="category"]').length) { | 			if(direction < 0 || !$('[component="category"]').length) { | ||||||
|   | |||||||
| @@ -78,7 +78,9 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' | |||||||
| 			loadMoreTopics(); | 			loadMoreTopics(); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|  | 		if (!config.usePagination) { | ||||||
| 			infinitescroll.init(loadMoreTopics); | 			infinitescroll.init(loadMoreTopics); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		function loadMoreTopics(direction) { | 		function loadMoreTopics(direction) { | ||||||
| 			if(direction < 0 || !$('[component="category"]').length) { | 			if(direction < 0 || !$('[component="category"]').length) { | ||||||
|   | |||||||
| @@ -1,26 +1,63 @@ | |||||||
|  |  | ||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
|  | var async = require('async'); | ||||||
| var nconf = require('nconf'); | var nconf = require('nconf'); | ||||||
|  |  | ||||||
|  | var db = require('../database'); | ||||||
|  | var privileges = require('../privileges'); | ||||||
|  | var user = require('../user'); | ||||||
| var topics = require('../topics'); | var topics = require('../topics'); | ||||||
| var meta = require('../meta'); | var meta = require('../meta'); | ||||||
| var helpers = require('./helpers'); | var helpers = require('./helpers'); | ||||||
|  | var pagination = require('../pagination'); | ||||||
|  |  | ||||||
| var recentController = {}; | var recentController = {}; | ||||||
|  |  | ||||||
| recentController.get = function(req, res, next) { | 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) { | 		if (err) { | ||||||
| 			return next(err); | 			return next(err); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		var data = {}; | ||||||
|  | 		data.topics = topics; | ||||||
|  | 		data.nextStart = stop + 1; | ||||||
| 		data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; | 		data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; | ||||||
| 		data.rssFeedUrl = nconf.get('relative_path') + '/recent.rss'; | 		data.rssFeedUrl = nconf.get('relative_path') + '/recent.rss'; | ||||||
| 		data.title = '[[pages:recent]]'; | 		data.title = '[[pages:recent]]'; | ||||||
|  | 		data.pagination = pagination.create(page, pageCount); | ||||||
| 		if (req.path.startsWith('/api/recent') || req.path.startsWith('/recent')) { | 		if (req.path.startsWith('/api/recent') || req.path.startsWith('/recent')) { | ||||||
| 			data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]); | 			data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -5,15 +5,16 @@ var async = require('async'); | |||||||
| var nconf = require('nconf'); | var nconf = require('nconf'); | ||||||
| var validator = require('validator'); | var validator = require('validator'); | ||||||
|  |  | ||||||
| var meta = require('../meta'); | var user = require('../user'); | ||||||
| var topics = require('../topics'); | var topics = require('../topics'); | ||||||
|  | var pagination = require('../pagination'); | ||||||
| var helpers =  require('./helpers'); | var helpers =  require('./helpers'); | ||||||
|  |  | ||||||
| var tagsController = {}; | var tagsController = {}; | ||||||
|  |  | ||||||
| tagsController.getTag = function(req, res, next) { | tagsController.getTag = function(req, res, next) { | ||||||
| 	var tag = validator.escape(req.params.tag); | 	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 = { | 	var templateData = { | ||||||
| 		topics: [], | 		topics: [], | ||||||
| @@ -21,18 +22,33 @@ tagsController.getTag = function(req, res, next) { | |||||||
| 		breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]), | 		breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]), | ||||||
| 		title: '[[pages:tag, ' + tag + ']]' | 		title: '[[pages:tag, ' + tag + ']]' | ||||||
| 	}; | 	}; | ||||||
|  | 	var settings; | ||||||
|  | 	var topicCount = 0; | ||||||
| 	async.waterfall([ | 	async.waterfall([ | ||||||
| 		function (next) { | 		function (next) { | ||||||
| 			topics.getTagTids(req.params.tag, 0, stop, next); | 			user.getSettings(req.uid, next); | ||||||
| 		}, | 		}, | ||||||
| 		function (tids, next) { | 		function (_settings, next) { | ||||||
| 			if (Array.isArray(tids) && !tids.length) { | 			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); | 				topics.deleteTag(req.params.tag); | ||||||
| 				return res.render('tag', templateData); | 				return res.render('tag', templateData); | ||||||
| 			} | 			} | ||||||
|  | 			topicCount = results.topicCount; | ||||||
| 			topics.getTopics(tids, req.uid, next); | 			topics.getTopics(results.tids, req.uid, next); | ||||||
| 		} | 		} | ||||||
| 	], function(err, topics) { | 	], function(err, topics) { | ||||||
| 		if (err) { | 		if (err) { | ||||||
| @@ -54,7 +70,9 @@ tagsController.getTag = function(req, res, next) { | |||||||
| 			} | 			} | ||||||
| 		]; | 		]; | ||||||
| 		templateData.topics = topics; | 		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); | 		res.render('tag', templateData); | ||||||
| 	}); | 	}); | ||||||
|   | |||||||
| @@ -2,9 +2,10 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
| var async = require('async'); | var async = require('async'); | ||||||
| var meta = require('../meta'); |  | ||||||
| var categories = require('../categories'); | var categories = require('../categories'); | ||||||
| var privileges = require('../privileges'); | var privileges = require('../privileges'); | ||||||
|  | var pagination = require('../pagination'); | ||||||
| var user = require('../user'); | var user = require('../user'); | ||||||
| var topics = require('../topics'); | var topics = require('../topics'); | ||||||
| var helpers = require('./helpers'); | var helpers = require('./helpers'); | ||||||
| @@ -14,7 +15,7 @@ var unreadController = {}; | |||||||
| var validFilter = {'': true, 'new': true, 'watched': true}; | var validFilter = {'': true, 'new': true, 'watched': true}; | ||||||
|  |  | ||||||
| unreadController.get = function(req, res, next) { | 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 results; | ||||||
| 	var cid = req.query.cid; | 	var cid = req.query.cid; | ||||||
| 	var filter = req.params.filter || ''; | 	var filter = req.params.filter || ''; | ||||||
| @@ -22,45 +23,36 @@ unreadController.get = function(req, res, next) { | |||||||
| 	if (!validFilter[filter]) { | 	if (!validFilter[filter]) { | ||||||
| 		return next(); | 		return next(); | ||||||
| 	} | 	} | ||||||
|  | 	var settings; | ||||||
| 	async.waterfall([ | 	async.waterfall([ | ||||||
| 		function(next) { | 		function(next) { | ||||||
| 			async.parallel({ | 			async.parallel({ | ||||||
| 				watchedCategories: function(next) { | 				watchedCategories: function(next) { | ||||||
| 					user.getWatchedCategories(req.uid, next); | 					getWatchedCategories(req.uid, cid, next); | ||||||
| 				}, | 				}, | ||||||
| 				unreadTopics: function(next) { | 				settings: function(next) { | ||||||
| 					topics.getUnreadTopics(cid, req.uid, 0, stop, filter, next); | 					user.getSettings(req.uid, next); | ||||||
| 				} | 				} | ||||||
| 			}, next); | 			}, next); | ||||||
| 		}, | 		}, | ||||||
| 		function(_results, next) { | 		function(_results, next) { | ||||||
| 			results = _results; | 			results = _results; | ||||||
|  | 			settings = results.settings; | ||||||
| 			privileges.categories.filterCids('read', results.watchedCategories, req.uid, next); | 			var start = Math.max(0, (page - 1) * settings.topicsPerPage); | ||||||
| 		}, | 			var stop = start + settings.topicsPerPage - 1; | ||||||
| 		function(cids, next) { | 			topics.getUnreadTopics(cid, req.uid, start, stop, filter, next); | ||||||
| 			categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor'], next); |  | ||||||
| 		} | 		} | ||||||
| 	], function(err, categories) { | 	], function(err, data) { | ||||||
| 		if (err) { | 		if (err) { | ||||||
| 			return next(err); | 			return next(err); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		categories = categories.filter(function(category) { | 		data.categories = results.watchedCategories.categories; | ||||||
| 			return category && !category.link; | 		data.selectedCategory = results.watchedCategories.selectedCategory; | ||||||
| 		}); |  | ||||||
| 		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]]'}]); | 		data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); | ||||||
| 		results.unreadTopics.title = '[[pages:unread]]'; | 		data.title = '[[pages:unread]]'; | ||||||
| 		results.unreadTopics.filters = [{ | 		data.filters = [{ | ||||||
| 			name: '[[unread:all-topics]]', | 			name: '[[unread:all-topics]]', | ||||||
| 			url: 'unread', | 			url: 'unread', | ||||||
| 			selected: filter === '', | 			selected: filter === '', | ||||||
| @@ -77,16 +69,46 @@ unreadController.get = function(req, res, next) { | |||||||
| 			filter: 'watched' | 			filter: 'watched' | ||||||
| 		}]; | 		}]; | ||||||
|  |  | ||||||
| 		results.unreadTopics.selectedFilter = results.unreadTopics.filters.filter(function(filter) { | 		data.selectedFilter = data.filters.filter(function(filter) { | ||||||
| 			return filter && filter.selected; | 			return filter && filter.selected; | ||||||
| 		})[0]; | 		})[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) { | unreadController.unreadTotal = function(req, res, next) { | ||||||
| 	var filter = req.params.filter || ''; | 	var filter = req.params.filter || ''; | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ module.exports = function(SocketTopics) { | |||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	SocketTopics.markCategoryTopicsRead = function(socket, cid, callback) { | 	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) { | 			if (err) { | ||||||
| 				return callback(err); | 				return callback(err); | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -19,17 +19,13 @@ module.exports = function(Topics) { | |||||||
| 			callback = filter; | 			callback = filter; | ||||||
| 			filter = ''; | 			filter = ''; | ||||||
| 		} | 		} | ||||||
|  | 		Topics.getUnreadTids(0, uid, filter, function(err, tids) { | ||||||
| 		Topics.getUnreadTids(0, uid, 0, 99, filter, function(err, tids) { | 			callback(err, Array.isArray(tids) ? tids.length : 0); | ||||||
| 			callback(err, tids ? tids.length : 0); |  | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  |  | ||||||
| 	Topics.getUnreadTopics = function(cid, uid, start, stop, filter, callback) { | 	Topics.getUnreadTopics = function(cid, uid, start, stop, filter, callback) { | ||||||
| 		if (!callback) { |  | ||||||
| 			callback = filter; |  | ||||||
| 			filter = ''; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		var unreadTopics = { | 		var unreadTopics = { | ||||||
| 			showSelect: true, | 			showSelect: true, | ||||||
| @@ -39,12 +35,21 @@ module.exports = function(Topics) { | |||||||
|  |  | ||||||
| 		async.waterfall([ | 		async.waterfall([ | ||||||
| 			function(next) { | 			function(next) { | ||||||
| 				Topics.getUnreadTids(cid, uid, start, stop, filter, next); | 				Topics.getUnreadTids(cid, uid, filter, next); | ||||||
| 			}, | 			}, | ||||||
| 			function(tids, next) { | 			function(tids, next) { | ||||||
|  | 				unreadTopics.topicCount = tids.length; | ||||||
|  |  | ||||||
| 				if (!tids.length) { | 				if (!tids.length) { | ||||||
| 					return next(null, []); | 					return next(null, []); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | 				if (stop === -1) { | ||||||
|  | 					tids = tids.slice(start); | ||||||
|  | 				} else { | ||||||
|  | 					tids = tids.slice(start, stop + 1); | ||||||
|  | 				} | ||||||
|  |  | ||||||
| 				Topics.getTopicsByTids(tids, uid, next); | 				Topics.getTopicsByTids(tids, uid, next); | ||||||
| 			}, | 			}, | ||||||
| 			function(topicData, next) { | 			function(topicData, next) { | ||||||
| @@ -63,12 +68,7 @@ module.exports = function(Topics) { | |||||||
| 		return Date.now() - (parseInt(meta.config.unreadCutoff, 10) || 2) * 86400000; | 		return Date.now() - (parseInt(meta.config.unreadCutoff, 10) || 2) * 86400000; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	Topics.getUnreadTids = function(cid, uid, start, stop, filter, callback) { | 	Topics.getUnreadTids = function(cid, uid, filter, callback) { | ||||||
| 		if (!callback) { |  | ||||||
| 			callback = filter; |  | ||||||
| 			filter = ''; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		uid = parseInt(uid, 10); | 		uid = parseInt(uid, 10); | ||||||
| 		if (uid === 0) { | 		if (uid === 0) { | ||||||
| 			return callback(null, []); | 			return callback(null, []); | ||||||
| @@ -136,19 +136,9 @@ module.exports = function(Topics) { | |||||||
| 			}, | 			}, | ||||||
| 			function (tids, next) { | 			function (tids, next) { | ||||||
|  |  | ||||||
| 				tids = tids.slice(0, 100); | 				tids = tids.slice(0, 200); | ||||||
|  |  | ||||||
| 				filterTopics(uid, tids, cid, ignoredCids, next); | 				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); | 		], callback); | ||||||
| 	}; | 	}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user