mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 12:05:57 +01:00
closes #878
This commit is contained in:
@@ -145,7 +145,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
|||||||
loadingMoreTopics = true;
|
loadingMoreTopics = true;
|
||||||
socket.emit('categories.loadMore', {
|
socket.emit('categories.loadMore', {
|
||||||
cid: cid,
|
cid: cid,
|
||||||
after: $('#topics-container').children('.category-item').length
|
after: $('#topics-container').attr('data-nextstart')
|
||||||
}, function (err, data) {
|
}, function (err, data) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return app.alertError(err.message);
|
return app.alertError(err.message);
|
||||||
@@ -153,6 +153,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
|||||||
|
|
||||||
if (data && data.topics.length) {
|
if (data && data.topics.length) {
|
||||||
Category.onTopicsLoaded(data.topics);
|
Category.onTopicsLoaded(data.topics);
|
||||||
|
$('#topics-container').attr('data-nextstart', data.nextStart);
|
||||||
}
|
}
|
||||||
loadingMoreTopics = false;
|
loadingMoreTopics = false;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ define(function() {
|
|||||||
Recent.loadMoreTopics = function() {
|
Recent.loadMoreTopics = function() {
|
||||||
loadingMoreTopics = true;
|
loadingMoreTopics = true;
|
||||||
socket.emit('topics.loadMoreRecentTopics', {
|
socket.emit('topics.loadMoreRecentTopics', {
|
||||||
after: $('#topics-container').children('li').length,
|
after: $('#topics-container').attr('data-nextstart'),
|
||||||
term: active
|
term: active
|
||||||
}, function(err, data) {
|
}, function(err, data) {
|
||||||
if(err) {
|
if(err) {
|
||||||
@@ -95,6 +95,7 @@ define(function() {
|
|||||||
|
|
||||||
if (data.topics && data.topics.length) {
|
if (data.topics && data.topics.length) {
|
||||||
Recent.onTopicsLoaded('recent', data.topics);
|
Recent.onTopicsLoaded('recent', data.topics);
|
||||||
|
$('#topics-container').attr('data-nextstart', data.nextStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadingMoreTopics = false;
|
loadingMoreTopics = false;
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ define(['forum/recent'], function(recent) {
|
|||||||
function loadMoreTopics() {
|
function loadMoreTopics() {
|
||||||
loadingMoreTopics = true;
|
loadingMoreTopics = true;
|
||||||
socket.emit('topics.loadMoreUnreadTopics', {
|
socket.emit('topics.loadMoreUnreadTopics', {
|
||||||
after: parseInt($('#topics-container').attr('data-next-start'), 10)
|
after: $('#topics-container').attr('data-nextstart')
|
||||||
}, function(err, data) {
|
}, function(err, data) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return app.alertError(err.message);
|
return app.alertError(err.message);
|
||||||
@@ -54,7 +54,7 @@ define(['forum/recent'], function(recent) {
|
|||||||
|
|
||||||
if (data.topics && data.topics.length) {
|
if (data.topics && data.topics.length) {
|
||||||
recent.onTopicsLoaded('unread', data.topics);
|
recent.onTopicsLoaded('unread', data.topics);
|
||||||
$('#topics-container').attr('data-next-start', data.nextStart);
|
$('#topics-container').attr('data-nextstart', data.nextStart);
|
||||||
} else {
|
} else {
|
||||||
$('#load-more-btn').hide();
|
$('#load-more-btn').hide();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<div class="category row">
|
<div class="category row">
|
||||||
<div class="{topic_row_size}">
|
<div class="{topic_row_size}">
|
||||||
<ul id="topics-container" itemscope itemtype="http://www.schema.org/ItemList">
|
<ul id="topics-container" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}">
|
||||||
<meta itemprop="itemListOrder" content="descending">
|
<meta itemprop="itemListOrder" content="descending">
|
||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item {topics.deleted-class}" itemprop="itemListElement">
|
<li class="category-item {topics.deleted-class}" itemprop="itemListElement">
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<div class="category row">
|
<div class="category row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<ul id="topics-container">
|
<ul id="topics-container" data-nextstart="{nextStart}">
|
||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item {topics.deleted-class}">
|
<li class="category-item {topics.deleted-class}">
|
||||||
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<div class="category row">
|
<div class="category row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<ul id="topics-container" data-next-start="{nextStart}">
|
<ul id="topics-container" data-nextstart="{nextStart}">
|
||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item {topics.deleted-class}">
|
<li class="category-item {topics.deleted-class}">
|
||||||
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
var db = require('./database.js'),
|
var db = require('./database'),
|
||||||
posts = require('./posts.js'),
|
posts = require('./posts'),
|
||||||
utils = require('./../public/src/utils.js'),
|
utils = require('./../public/src/utils'),
|
||||||
user = require('./user.js'),
|
user = require('./user'),
|
||||||
topics = require('./topics.js'),
|
topics = require('./topics'),
|
||||||
plugins = require('./plugins'),
|
plugins = require('./plugins'),
|
||||||
CategoryTools = require('./categoryTools'),
|
CategoryTools = require('./categoryTools'),
|
||||||
meta = require('./meta'),
|
meta = require('./meta'),
|
||||||
@@ -52,8 +52,8 @@ var db = require('./database.js'),
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTopicIds(next) {
|
function getTopics(next) {
|
||||||
Categories.getTopicIds(category_id, start, end, next);
|
Categories.getCategoryTopics(category_id, start, end, current_user, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getActiveUsers(next) {
|
function getActiveUsers(next) {
|
||||||
@@ -70,9 +70,12 @@ var db = require('./database.js'),
|
|||||||
Categories.getPageCount(category_id, next);
|
Categories.getPageCount(category_id, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) {
|
async.parallel([getTopics, getActiveUsers, getSidebars, getPageCount], function(err, results) {
|
||||||
var tids = results[0],
|
if(err) {
|
||||||
active_users = results[1],
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var active_users = results[1],
|
||||||
sidebars = results[2],
|
sidebars = results[2],
|
||||||
pageCount = results[3];
|
pageCount = results[3];
|
||||||
|
|
||||||
@@ -87,27 +90,22 @@ var db = require('./database.js'),
|
|||||||
'topic_row_size': 'col-md-9',
|
'topic_row_size': 'col-md-9',
|
||||||
'category_id': category_id,
|
'category_id': category_id,
|
||||||
'active_users': [],
|
'active_users': [],
|
||||||
'topics': [],
|
'topics': results[0].topics,
|
||||||
|
'nextStart': results[0].nextStart,
|
||||||
'pageCount': pageCount,
|
'pageCount': pageCount,
|
||||||
'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false,
|
'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false,
|
||||||
'sidebars': sidebars
|
'sidebars': sidebars
|
||||||
};
|
};
|
||||||
|
|
||||||
function getTopics(next) {
|
|
||||||
topics.getTopicsByTids(tids, category_id, current_user, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getModerators(next) {
|
function getModerators(next) {
|
||||||
Categories.getModerators(category_id, next);
|
Categories.getModerators(category_id, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getActiveUsers(next) {
|
function getActiveUsers(next) {
|
||||||
user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], function(err, users) {
|
user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], next);
|
||||||
next(err, users);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tids.length === 0) {
|
if (!category.topics.length) {
|
||||||
getModerators(function(err, moderators) {
|
getModerators(function(err, moderators) {
|
||||||
category.moderator_block_class = moderators.length > 0 ? '' : 'none';
|
category.moderator_block_class = moderators.length > 0 ? '' : 'none';
|
||||||
category.moderators = moderators;
|
category.moderators = moderators;
|
||||||
@@ -116,11 +114,10 @@ var db = require('./database.js'),
|
|||||||
callback(null, category);
|
callback(null, category);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
async.parallel([getTopics, getModerators, getActiveUsers], function(err, results) {
|
async.parallel([getModerators, getActiveUsers], function(err, results) {
|
||||||
category.topics = results[0];
|
category.moderator_block_class = results[0].length > 0 ? '' : 'none';
|
||||||
category.moderator_block_class = results[1].length > 0 ? '' : 'none';
|
category.moderators = results[0];
|
||||||
category.moderators = results[1];
|
category.active_users = results[1];
|
||||||
category.active_users = results[2];
|
|
||||||
category.show_sidebar = category.topics.length > 0 ? 'show' : 'hidden';
|
category.show_sidebar = category.topics.length > 0 ? 'show' : 'hidden';
|
||||||
callback(null, category);
|
callback(null, category);
|
||||||
});
|
});
|
||||||
@@ -131,13 +128,26 @@ var db = require('./database.js'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Categories.getCategoryTopics = function(cid, start, stop, uid, callback) {
|
Categories.getCategoryTopics = function(cid, start, stop, uid, callback) {
|
||||||
Categories.getTopicIds(cid, start, stop, function(err, tids) {
|
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) {
|
if(err) {
|
||||||
return callback(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) {
|
Categories.getTopicIds = function(cid, start, stop, callback) {
|
||||||
|
|||||||
@@ -18,14 +18,10 @@ SocketCategories.loadMore = function(socket, data, callback) {
|
|||||||
|
|
||||||
var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
|
var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
|
||||||
|
|
||||||
var start = data.after,
|
var start = parseInt(data.after, 10),
|
||||||
end = start + topicsPerPage - 1;
|
end = start + topicsPerPage - 1;
|
||||||
|
console.log(start, end);
|
||||||
categories.getCategoryTopics(data.cid, start, end, socket.uid, function(err, topics) {
|
categories.getCategoryTopics(data.cid, start, end, socket.uid, callback);
|
||||||
callback(err, {
|
|
||||||
topics: topics
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketCategories.getPageCount = function(socket, cid, callback) {
|
SocketCategories.getPageCount = function(socket, cid, callback) {
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ SocketTopics.loadMore = function(socket, data, callback) {
|
|||||||
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
||||||
postsPerPage = postsPerPage ? postsPerPage : 20;
|
postsPerPage = postsPerPage ? postsPerPage : 20;
|
||||||
|
|
||||||
var start = data.after,
|
var start = parseInt(data.after, 10),
|
||||||
end = start + postsPerPage - 1;
|
end = start + postsPerPage - 1;
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
@@ -256,14 +256,14 @@ SocketTopics.loadMoreRecentTopics = function(socket, data, callback) {
|
|||||||
return callback(new Error('invalid data'));
|
return callback(new Error('invalid data'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var start = data.after,
|
var start = parseInt(data.after, 10),
|
||||||
end = start + 9;
|
end = start + 9;
|
||||||
|
|
||||||
topics.getLatestTopics(socket.uid, start, end, data.term, callback);
|
topics.getLatestTopics(socket.uid, start, end, data.term, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
|
SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
|
||||||
var start = data.after,
|
var start = parseInt(data.after, 10),
|
||||||
end = start + 9;
|
end = start + 9;
|
||||||
|
|
||||||
topics.getUnreadTopics(socket.uid, start, end, callback);
|
topics.getUnreadTopics(socket.uid, start, end, callback);
|
||||||
|
|||||||
@@ -448,11 +448,7 @@ var async = require('async'),
|
|||||||
|
|
||||||
async.filter(tids, function(tid, next) {
|
async.filter(tids, function(tid, next) {
|
||||||
threadTools.privileges(tid, current_user, function(err, privileges) {
|
threadTools.privileges(tid, current_user, function(err, privileges) {
|
||||||
if (!err && privileges.read) {
|
next(!err && privileges.read);
|
||||||
next(true);
|
|
||||||
} else {
|
|
||||||
next(false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}, function(tids) {
|
}, function(tids) {
|
||||||
Topics.getTopicsByTids(tids, 0, current_user, function(err, topicData) {
|
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) {
|
db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) {
|
||||||
latestTopics.lastIndex = rank;
|
latestTopics.nextStart = parseInt(rank,10) + 1;
|
||||||
latestTopics.topics = topicData;
|
latestTopics.topics = topicData;
|
||||||
callback(null, latestTopics);
|
callback(null, latestTopics);
|
||||||
});
|
});
|
||||||
@@ -549,7 +545,7 @@ var async = require('async'),
|
|||||||
return parseInt(read[index], 10) === 0;
|
return parseInt(read[index], 10) === 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Filter out topics that belong to categories that this user cannot access
|
|
||||||
async.filter(newtids, function(tid, next) {
|
async.filter(newtids, function(tid, next) {
|
||||||
threadTools.privileges(tid, uid, function(err, privileges) {
|
threadTools.privileges(tid, uid, function(err, privileges) {
|
||||||
if (!err && privileges.read) {
|
if (!err && privileges.read) {
|
||||||
@@ -599,8 +595,14 @@ var async = require('async'),
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) {
|
||||||
|
if(err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
unreadTopics.topics = topicData;
|
unreadTopics.topics = topicData;
|
||||||
unreadTopics.nextStart = stop + 1;
|
unreadTopics.nextStart = parseInt(rank, 10) + 1;
|
||||||
|
|
||||||
if (!topicData || topicData.length === 0) {
|
if (!topicData || topicData.length === 0) {
|
||||||
unreadTopics.no_topics_message = 'show';
|
unreadTopics.no_topics_message = 'show';
|
||||||
}
|
}
|
||||||
@@ -610,6 +612,7 @@ var async = require('async'),
|
|||||||
|
|
||||||
callback(null, unreadTopics);
|
callback(null, unreadTopics);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Topics.getUnreadTids(uid, start, stop, function(err, unreadTids) {
|
Topics.getUnreadTids(uid, start, stop, function(err, unreadTids) {
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ describe('Categories', function() {
|
|||||||
|
|
||||||
describe('.getCategoryTopics', function() {
|
describe('.getCategoryTopics', function() {
|
||||||
it('should return a list of topics', function(done) {
|
it('should return a list of topics', function(done) {
|
||||||
Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, topics) {
|
Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, result) {
|
||||||
assert(Array.isArray(topics));
|
assert(Array.isArray(result.topics));
|
||||||
assert(topics.every(function(topic) {
|
assert(result.topics.every(function(topic) {
|
||||||
return topic instanceof Object;
|
return topic instanceof Object;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user