Merge remote-tracking branch 'origin/master'

v1.18.x
Julian Lam 11 years ago
commit 0869765e2b

@ -33,5 +33,8 @@
"motd.get": "Get NodeBB",
"motd.fork": "Fork",
"motd.like": "Like",
"motd.follow": "Follow"
"motd.follow": "Follow",
"previouspage": "Previous Page",
"nextpage": "Next Page"
}

@ -396,6 +396,16 @@ var socket,
});
};
app.enableInfiniteLoading = function(callback) {
$(window).off('scroll').on('scroll', function() {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom) {
callback();
}
});
}
var titleObj = {
active: false,
interval: undefined,

@ -44,11 +44,9 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
function enableInfiniteLoading() {
if(!config.usePagination) {
$(window).off('scroll').on('scroll', function (ev) {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom && !loadingMoreTopics) {
Category.loadMoreTopics(cid);
app.enableInfiniteLoading(function() {
if(!loadingMoreTopics) {
Category.loadMoreTopics(templates.get('category_id'));
}
});
} else {
@ -91,7 +89,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
addActiveUser(data);
socket.emit('categories.getPageCount', templates.get('category_id'), function(err, newPageCount) {
pagination.recreatePaginationLinks('category', newPageCount);
pagination.recreatePaginationLinks(newPageCount);
});
$('#topics-container span.timeago').timeago();

@ -10,43 +10,73 @@ define(function() {
pagination.currentPage = parseInt(currentPage, 10);
pagination.pageCount = parseInt(pageCount, 10);
updatePageLinks();
pagination.recreatePaginationLinks(pageCount);
$('.pagination')
.on('click', '.previous', function() {
return pagination.loadPage(pagination.currentPage - 1);
}).on('click', '.next', function() {
return pagination.loadPage(pagination.currentPage + 1);
}).on('click', '.page', function() {
return pagination.loadPage($(this).attr('data-page'));
}).on('click', '.select_page', function(e) {
e.preventDefault();
bootbox.prompt('Enter page number:', function(pageNum) {
pagination.loadPage(pageNum);
});
});
}
$('.pagination').on('click', '.previous', function() {
pagination.loadPage(pagination.currentPage - 1);
});
pagination.recreatePaginationLinks = function(newPageCount) {
pagination.pageCount = parseInt(newPageCount, 10);
$('.pagination').on('click', '.next', function() {
pagination.loadPage(pagination.currentPage + 1);
});
var pagesToShow = [1];
if(pagination.pageCount !== 1) {
pagesToShow.push(pagination.pageCount);
}
$('.pagination').on('click', '.page', function() {
pagination.loadPage($(this).attr('data-page'));
});
}
var previous = pagination.currentPage - 1;
var next = pagination.currentPage + 1;
pagination.recreatePaginationLinks = function(template, newPageCount) {
pagination.pageCount = parseInt(newPageCount, 10);
if(previous > 1 && pagesToShow.indexOf(previous) === -1) {
pagesToShow.push(previous);
}
if(next < pagination.pageCount && pagesToShow.indexOf(next) === -1) {
pagesToShow.push(next);
}
if(pagesToShow.indexOf(pagination.currentPage) === -1) {
pagesToShow.push(pagination.currentPage);
}
pagesToShow.sort(function(a, b) {
return parseInt(a, 10) - parseInt(b, 10);
});
var pages = [];
for(var i=1; i<=pagination.pageCount; ++i) {
pages.push({pageNumber: i});
var html = '';
for(var i=0; i<pagesToShow.length; ++i) {
if(i > 0) {
if (pagesToShow[i] - 1 !== pagesToShow[i-1]) {
html += '<li><a class="select_page" href="#">|</a></li>';
}
}
html += '<li class="page" data-page="' + pagesToShow[i] + '"><a href="#">' + pagesToShow[i] + '</a></li>';
}
var html = templates.prepare(templates[template].blocks['pages']).parse({pages:pages});
html = $(html);
$('.pagination li.page').remove();
html.insertAfter($('.pagination li.previous'));
$(html).insertAfter($('.pagination li.previous'));
updatePageLinks();
}
pagination.loadPage = function(page, callback) {
page = parseInt(page, 10);
if(!utils.isNumber(page) || page < 1 || page > pagination.pageCount) {
return;
return false;
}
ajaxify.go(window.location.pathname.slice(1) + '?page=' + page);
return true;
}
function updatePageLinks() {

@ -1,20 +1,16 @@
define(function() {
var Recent = {};
Recent.newTopicCount = 0;
Recent.newPostCount = 0;
Recent.loadingMoreTopics = false;
var newTopicCount = 0,
newPostCount = 0,
loadingMoreTopics = false;
var active = '';
Recent.init = function() {
app.enterRoom('recent_posts');
ajaxify.register_events([
'event:new_topic',
'event:new_post'
]);
Recent.watchForNewPosts();
function getActiveSection() {
var url = window.location.href,
@ -37,26 +33,34 @@ define(function() {
$(this).addClass('hide');
});
socket.on('event:new_topic', function(data) {
++Recent.newTopicCount;
Recent.updateAlertText();
app.enableInfiniteLoading(function() {
if(!loadingMoreTopics) {
Recent.loadMoreTopics();
}
});
};
socket.on('event:new_post', function(data) {
++Recent.newPostCount;
Recent.watchForNewPosts = function () {
newPostCount = 0;
newTopicCount = 0;
ajaxify.register_events([
'event:new_topic',
'event:new_post'
]);
socket.on('event:new_topic', function(data) {
++newTopicCount;
Recent.updateAlertText();
});
$(window).off('scroll').on('scroll', function() {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom && !Recent.loadingMoreTopics) {
Recent.loadMoreTopics();
}
socket.on('event:new_post', function(data) {
++newPostCount;
Recent.updateAlertText();
});
};
}
Recent.updateAlertText = function() {
var text = 'There';
@ -76,41 +80,43 @@ define(function() {
text += '. Click here to reload.';
$('#new-topics-alert').html(text).removeClass('hide').fadeIn('slow');
$('#category-no-topics').addClass('hide');
}
Recent.onTopicsLoaded = function(topics) {
var html = templates.prepare(templates['recent'].blocks['topics']).parse({
Recent.loadMoreTopics = function() {
loadingMoreTopics = true;
socket.emit('topics.loadMoreRecentTopics', {
after: $('#topics-container').children('li').length,
term: active
}, function(err, data) {
if(err) {
return app.alertError(err.message);
}
if (data.topics && data.topics.length) {
Recent.onTopicsLoaded('recent', data.topics);
}
loadingMoreTopics = false;
});
}
Recent.onTopicsLoaded = function(template, topics) {
var html = templates.prepare(templates[template].blocks['topics']).parse({
topics: topics
});
translator.translate(html, function(translatedHTML) {
var container = $('#topics-container');
$('#category-no-topics').remove();
html = $(translatedHTML);
container.append(html);
$('#topics-container').append(html);
$('span.timeago').timeago();
app.createUserTooltips();
app.makeNumbersHumanReadable(html.find('.human-readable-number'));
});
}
Recent.loadMoreTopics = function() {
Recent.loadingMoreTopics = true;
socket.emit('topics.loadMoreRecentTopics', {
after: $('#topics-container').children('li').length,
term: active
}, function(err, data) {
if(err) {
return app.alertError(err.message);
}
if (data.topics && data.topics.length) {
Recent.onTopicsLoaded(data.topics);
}
Recent.loadingMoreTopics = false;
});
}
return Recent;
});

@ -346,10 +346,8 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
function enableInfiniteLoading() {
if(!config.usePagination) {
$(window).off('scroll').on('scroll', function() {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom && !infiniteLoaderActive && $('#post-container').children().length) {
app.enableInfiniteLoading(function() {
if (!infiniteLoaderActive && $('#post-container').children().length) {
loadMorePosts(tid, function(posts) {
fixDeleteStateForPosts();
});
@ -396,7 +394,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
socket.emit('posts.getRawPost', pid, function(err, post) {
if(err) {
return app.alert(err.message);
return app.alertError(err.message);
}
var quoted = '';
if(post) {
@ -895,47 +893,34 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
}
function toggle_post_delete_state(pid) {
var postEl = $(document.querySelector('#post-container li[data-pid="' + pid + '"]'));
if (postEl[0]) {
quoteEl = postEl.find('.quote'),
favEl = postEl.find('.favourite'),
replyEl = postEl.find('.post_reply');
var postEl = $('#post-container li[data-pid="' + pid + '"]');
socket.emit('posts.getPrivileges', pid, function(err, privileges) {
if(err) {
return app.alert(err.message);
}
if (privileges.editable) {
if (!postEl.hasClass('deleted')) {
toggle_post_tools(pid, false);
} else {
toggle_post_tools(pid, true);
}
}
if (postEl.length) {
postEl.toggleClass('deleted');
postEl.toggleClass('deleted');
toggle_post_tools(pid, postEl.hasClass('deleted'));
updatePostCount();
});
updatePostCount();
}
}
function toggle_post_tools(pid, state) {
var postEl = $(document.querySelector('#post-container li[data-pid="' + pid + '"]')),
function toggle_post_tools(pid, isDeleted) {
var postEl = $('#post-container li[data-pid="' + pid + '"]'),
quoteEl = $(postEl[0].querySelector('.quote')),
favEl = $(postEl[0].querySelector('.favourite')),
replyEl = $(postEl[0].querySelector('.post_reply'));
replyEl = $(postEl[0].querySelector('.post_reply')),
chatEl = $(postEl[0].querySelector('.chat'));
if (state) {
quoteEl.removeClass('none');
favEl.removeClass('none');
replyEl.removeClass('none');
} else {
if (isDeleted) {
quoteEl.addClass('none');
favEl.addClass('none');
replyEl.addClass('none');
chatEl.addClass('none');
} else {
quoteEl.removeClass('none');
favEl.removeClass('none');
replyEl.removeClass('none');
chatEl.removeClass('none');
}
}
@ -1065,9 +1050,9 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
function onNewPostPagination(data) {
var posts = data.posts;
socket.emit('topics.getPageCount', tid, function(err, newPageCount) {
socket.emit('topics.getPageCount', templates.get('topic_id'), function(err, newPageCount) {
pagination.recreatePaginationLinks('topic', newPageCount);
pagination.recreatePaginationLinks(newPageCount);
if(pagination.currentPage === pagination.pageCount) {
createNewPosts(data);

@ -1,53 +1,15 @@
define(function() {
define(['forum/recent'], function(recent) {
var Unread = {},
loadingMoreTopics = false;
Unread.init = function() {
app.enterRoom('recent_posts');
ajaxify.register_events([
'event:new_topic',
'event:new_post',
'topics.markAllRead'
]);
var newTopicCount = 0,
newPostCount = 0;
$('#new-topics-alert').on('click', function() {
$(this).addClass('hide');
});
socket.on('event:new_topic', function(data) {
++newTopicCount;
updateAlertText();
});
function updateAlertText() {
var text = 'There';
if (newTopicCount > 1) {
text += ' are ' + newTopicCount + ' new topics';
} else if (newTopicCount === 1) {
text += ' is a new topic';
}
if (newPostCount > 1) {
text += (newTopicCount?' and ':' are ') + newPostCount + ' new posts';
} else if(newPostCount === 1) {
text += (newTopicCount?' and ':' is ') + ' a new post';
}
text += '. Click here to reload.';
$('#new-topics-alert').html(text).removeClass('hide').fadeIn('slow');
$('#category-no-topics').addClass('hidden');
}
socket.on('event:new_post', function(data) {
++newPostCount;
updateAlertText();
});
recent.watchForNewPosts();
$('#mark-allread-btn').on('click', function() {
var btn = $(this);
@ -67,24 +29,19 @@ define(function() {
});
});
function onTopicsLoaded(topics) {
var html = templates.prepare(templates['unread'].blocks['topics']).parse({
topics: topics
});
translator.translate(html, function(translatedHTML) {
var container = $('#topics-container');
if ($("body").height() <= $(window).height() && $('#topics-container').children().length >= 20) {
$('#load-more-btn').show();
}
$('#category-no-topics').remove();
$('#load-more-btn').on('click', function() {
loadMoreTopics();
});
html = $(translatedHTML);
container.append(html);
$('span.timeago').timeago();
app.createUserTooltips();
app.makeNumbersHumanReadable(html.find('.human-readable-number'));
});
}
app.enableInfiniteLoading(function() {
if(!loadingMoreTopics) {
loadMoreTopics();
}
});
function loadMoreTopics() {
loadingMoreTopics = true;
@ -96,7 +53,7 @@ define(function() {
}
if (data.topics && data.topics.length) {
onTopicsLoaded(data.topics);
recent.onTopicsLoaded('unread', data.topics);
$('#topics-container').attr('data-next-start', data.nextStart);
} else {
$('#load-more-btn').hide();
@ -105,23 +62,6 @@ define(function() {
loadingMoreTopics = false;
});
}
$(window).off('scroll').on('scroll', function() {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom && !loadingMoreTopics) {
loadMoreTopics();
}
});
if ($("body").height() <= $(window).height() && $('#topics-container').children().length >= 20) {
$('#load-more-btn').show();
}
$('#load-more-btn').on('click', function() {
loadMoreTopics();
});
};
return Unread;

@ -87,11 +87,8 @@
<!-- IF usePagination -->
<div class="text-center">
<ul class="pagination">
<li class="previous pull-left"><a href="#">&larr; Older</a></li>
<!-- BEGIN pages -->
<li class="page" data-page="{pages.pageNumber}"><a href="#">{pages.pageNumber}</a></li>
<!-- END pages -->
<li class="next pull-right"><a href="#">Newer &rarr;</a></li>
<li class="previous pull-left"><a href="#"><i class="fa fa-chevron-left"></i> [[global:previouspage]]</a></li>
<li class="next pull-right"><a href="#">[[global:nextpage]] <i class="fa fa-chevron-right"></i></a></li>
</ul>
</div>
<!-- ENDIF usePagination -->

@ -186,7 +186,7 @@
<!-- IF privileges.write -->
<button class="btn btn-primary post_reply" type="button">[[topic:reply]]</button>
<!-- ENDIF privileges.write -->
<div class="btn-group thread-tools hide">
<div class="btn-group thread-tools hide dropup">
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button">[[topic:thread_tools.title]] <span class="caret"></span></button>
<ul class="dropdown-menu pull-right">
<li><a href="#" class="markAsUnreadForAll"><i class="fa fa-inbox"></i> [[topic:thread_tools.markAsUnreadForAll]]</a></li>
@ -206,11 +206,8 @@
<!-- IF usePagination -->
<div class="text-center">
<ul class="pagination">
<li class="previous pull-left"><a href="#">&larr; Older</a></li>
<!-- BEGIN pages -->
<li class="page" data-page="{pages.pageNumber}"><a href="#">{pages.pageNumber}</a></li>
<!-- END pages -->
<li class="next pull-right"><a href="#">Newer &rarr;</a></li>
<li class="previous pull-left"><a href="#"><i class="fa fa-chevron-left"></i> [[global:previouspage]]</a></li>
<li class="next pull-right"><a href="#">[[global:nextpage]] <i class="fa fa-chevron-right"></i></a></li>
</ul>
</div>
<!-- ENDIF usePagination -->

@ -66,15 +66,15 @@ var db = require('./database.js'),
});
}
function getPages(next) {
Categories.getPages(category_id, next);
function getPageCount(next) {
Categories.getPageCount(category_id, next);
}
async.parallel([getTopicIds, getActiveUsers, getSidebars, getPages], function(err, results) {
async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) {
var tids = results[0],
active_users = results[1],
sidebars = results[2],
pages = results[3];
pageCount = results[3];
var category = {
'category_name': categoryData.name,
@ -88,8 +88,7 @@ var db = require('./database.js'),
'category_id': category_id,
'active_users': [],
'topics': [],
'pages': pages,
'pageCount': pages.length,
'pageCount': pageCount,
'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false,
'sidebars': sidebars
};
@ -145,19 +144,6 @@ var db = require('./database.js'),
db.getSortedSetRevRange('categories:' + cid + ':tid', start, stop, callback);
};
Categories.getPages = function(cid, callback) {
Categories.getPageCount(cid, function(err, pageCount) {
if(err) {
return callback(err);
}
var pages = [];
for(var i=1; i<=pageCount; ++i) {
pages.push({pageNumber: i});
}
callback(null, pages);
});
};
Categories.getPageCount = function(cid, callback) {
db.sortedSetCard('categories:' + cid + ':tid', function(err, topicCount) {
if(err) {

@ -93,7 +93,17 @@ SocketPosts.uploadFile = function(socket, data, callback) {
};
SocketPosts.getRawPost = function(socket, pid, callback) {
posts.getPostField(pid, 'content', callback);
posts.getPostFields(pid, ['content', 'deleted'], function(err, data) {
if(err) {
return callback(err);
}
if(data.deleted === '1') {
return callback(new Error('This post no longer exists'));
}
callback(null, data.content);
});
};
SocketPosts.edit = function(socket, data, callback) {

@ -187,9 +187,20 @@ var winston = require('winston'),
ThreadTools.move = function(tid, cid, callback) {
topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) {
if(err) {
return callback(err);
}
var oldCid = topicData.cid;
if(!oldCid) {
return callback(new Error('invalid-topic'));
}
db.sortedSetRemove('categories:' + oldCid + ':tid', tid, function(err, result) {
if(err) {
return callback(err);
}
db.sortedSetAdd('categories:' + cid + ':tid', topicData.lastposttime, tid, function(err, result) {
if(err) {

@ -392,19 +392,6 @@ var async = require('async'),
});
}
Topics.getPages = function(tid, callback) {
Topics.getPageCount(tid, function(err, pageCount) {
if(err) {
return callback(err);
}
var pages = [];
for(var i=1; i<=pageCount; ++i) {
pages.push({pageNumber: i});
}
callback(null, pages);
});
}
Topics.getPageCount = function(tid, callback) {
db.sortedSetCard('tid:' + tid + ':posts', function(err, postCount) {
if(err) {
@ -794,11 +781,11 @@ var async = require('async'),
Topics.getCategoryData(tid, next);
}
function getPages(next) {
Topics.getPages(tid, next);
function getPageCount(next) {
Topics.getPageCount(tid, next);
}
async.parallel([getTopicData, getTopicPosts, getPrivileges, getCategoryData, getPages], function(err, results) {
async.parallel([getTopicData, getTopicPosts, getPrivileges, getCategoryData, getPageCount], function(err, results) {
if (err) {
winston.error('[Topics.getTopicWithPosts] Could not retrieve topic data: ', err.message);
return callback(err, null);
@ -808,7 +795,7 @@ var async = require('async'),
topicPosts = results[1],
privileges = results[2],
categoryData = results[3],
pages = results[4];
pageCount = results[4];
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
postsPerPage = postsPerPage ? postsPerPage : 20;
@ -824,8 +811,7 @@ var async = require('async'),
'slug': topicData.slug,
'postcount': topicData.postcount,
'viewcount': topicData.viewcount,
'pages': pages,
'pageCount': pages.length,
'pageCount': pageCount,
'unreplied': parseInt(topicData.postcount, 10) > 1,
'topic_id': tid,
'expose_tools': privileges.editable ? 1 : 0,

Loading…
Cancel
Save