mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-29 10:06:13 +01:00
refactor user search
use pagination on results removed infinite scroll changed the term and section to use the query param as well pagination urls respect search
This commit is contained in:
@@ -1,43 +1,13 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/* globals define, socket, utils */
|
/* globals define */
|
||||||
|
|
||||||
define('forum/account/followers', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) {
|
define('forum/account/followers', ['forum/account/header'], function(header) {
|
||||||
var Followers = {};
|
var Followers = {};
|
||||||
|
|
||||||
Followers.init = function() {
|
Followers.init = function() {
|
||||||
header.init();
|
header.init();
|
||||||
|
|
||||||
infinitescroll.init(function(direction) {
|
|
||||||
Followers.loadMore(direction, 'account/followers', 'followers:' + ajaxify.data.uid);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Followers.loadMore = function(direction, tpl, set) {
|
|
||||||
if (direction < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
infinitescroll.loadMore('user.loadMore', {
|
|
||||||
set: set,
|
|
||||||
after: $('#users-container').attr('data-nextstart')
|
|
||||||
}, function(data, done) {
|
|
||||||
if (data.users && data.users.length) {
|
|
||||||
onUsersLoaded(tpl, data.users, done);
|
|
||||||
$('#users-container').attr('data-nextstart', data.nextStart);
|
|
||||||
} else {
|
|
||||||
done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function onUsersLoaded(tpl, users, callback) {
|
|
||||||
app.parseAndTranslate(tpl, 'users', {users: users}, function(html) {
|
|
||||||
$('#users-container').append(html);
|
|
||||||
utils.addCommasToNumbers(html.find('.formatted-number'));
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return Followers;
|
return Followers;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,15 +2,11 @@
|
|||||||
|
|
||||||
/* globals define */
|
/* globals define */
|
||||||
|
|
||||||
define('forum/account/following', ['forum/account/header', 'forum/infinitescroll', 'forum/account/followers'], function(header, infinitescroll, followers) {
|
define('forum/account/following', ['forum/account/header'], function(header) {
|
||||||
var Following = {};
|
var Following = {};
|
||||||
|
|
||||||
Following.init = function() {
|
Following.init = function() {
|
||||||
header.init();
|
header.init();
|
||||||
|
|
||||||
infinitescroll.init(function(direction) {
|
|
||||||
followers.loadMore(direction, 'account/following', 'following:' + ajaxify.data.uid);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return Following;
|
return Following;
|
||||||
|
|||||||
@@ -22,15 +22,10 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
|
|||||||
|
|
||||||
$('#advanced-search').off('submit').on('submit', function(e) {
|
$('#advanced-search').off('submit').on('submit', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
searchModule.query(getSearchData(), function() {
|
||||||
var input = $('#search-input');
|
$('#search-input').val('');
|
||||||
|
|
||||||
var searchData = getSearchData();
|
|
||||||
searchData.term = input.val();
|
|
||||||
|
|
||||||
searchModule.query(searchData, function() {
|
|
||||||
input.val('');
|
|
||||||
});
|
});
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
handleSavePreferences();
|
handleSavePreferences();
|
||||||
@@ -43,7 +38,7 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
|
|||||||
var searchData = {
|
var searchData = {
|
||||||
in: $('#search-in').val()
|
in: $('#search-in').val()
|
||||||
};
|
};
|
||||||
|
searchData.term = $('#search-input').val();
|
||||||
if (searchData.in === 'posts' || searchData.in === 'titlesposts' || searchData.in === 'titles') {
|
if (searchData.in === 'posts' || searchData.in === 'titlesposts' || searchData.in === 'titles') {
|
||||||
searchData.by = form.find('#posted-by-user').val();
|
searchData.by = form.find('#posted-by-user').val();
|
||||||
searchData.categories = form.find('#posted-in-categories').val();
|
searchData.categories = form.find('#posted-in-categories').val();
|
||||||
@@ -71,6 +66,10 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
|
|||||||
params = utils.merge(searchData, params);
|
params = utils.merge(searchData, params);
|
||||||
|
|
||||||
if (params) {
|
if (params) {
|
||||||
|
if (params.term) {
|
||||||
|
$('#search-input').val(params.term);
|
||||||
|
}
|
||||||
|
|
||||||
if (params.in) {
|
if (params.in) {
|
||||||
$('#search-in').val(params.in);
|
$('#search-in').val(params.in);
|
||||||
updateFormItemVisiblity(params.in);
|
updateFormItemVisiblity(params.in);
|
||||||
|
|||||||
@@ -1,16 +1,24 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/* globals define, socket, app, templates, bootbox, ajaxify */
|
/* globals define, socket, app, templates, bootbox, utils */
|
||||||
|
|
||||||
define('forum/users', ['translator'], function(translator) {
|
define('forum/users', ['translator'], function(translator) {
|
||||||
var Users = {};
|
var Users = {};
|
||||||
|
|
||||||
var loadingMoreUsers = false;
|
var searchTimeoutID = 0;
|
||||||
|
|
||||||
|
$(window).on('action:ajaxify.start', function() {
|
||||||
|
if (searchTimeoutID) {
|
||||||
|
clearTimeout(searchTimeoutID);
|
||||||
|
searchTimeoutID = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Users.init = function() {
|
Users.init = function() {
|
||||||
app.enterRoom('user_list');
|
app.enterRoom('user_list');
|
||||||
|
|
||||||
$('.nav-pills li').removeClass('active').find('a[href="' + window.location.pathname + '"]').parent().addClass('active');
|
var section = utils.params().section ? ('?section=' + utils.params().section) : '';
|
||||||
|
$('.nav-pills li').removeClass('active').find('a[href="' + window.location.pathname + section + '"]').parent().addClass('active');
|
||||||
|
|
||||||
handleSearch();
|
handleSearch();
|
||||||
|
|
||||||
@@ -18,110 +26,55 @@ define('forum/users', ['translator'], function(translator) {
|
|||||||
|
|
||||||
socket.removeListener('event:user_status_change', onUserStatusChange);
|
socket.removeListener('event:user_status_change', onUserStatusChange);
|
||||||
socket.on('event:user_status_change', onUserStatusChange);
|
socket.on('event:user_status_change', onUserStatusChange);
|
||||||
|
|
||||||
$('#load-more-users-btn').on('click', loadMoreUsers);
|
|
||||||
|
|
||||||
$(window).off('scroll').on('scroll', function() {
|
|
||||||
var bottom = ($(document).height() - $(window).height()) * 0.9;
|
|
||||||
|
|
||||||
if ($(window).scrollTop() > bottom && !loadingMoreUsers) {
|
|
||||||
loadMoreUsers();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function loadMoreUsers() {
|
|
||||||
if ($('#search-user').val()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ajaxify.data.setName) {
|
|
||||||
startLoading(ajaxify.data.setName, $('#users-container').children('.registered-user').length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function startLoading(set, after) {
|
|
||||||
loadingMoreUsers = true;
|
|
||||||
|
|
||||||
socket.emit('user.loadMore', {
|
|
||||||
set: set,
|
|
||||||
after: after
|
|
||||||
}, function(err, data) {
|
|
||||||
if (err) {
|
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data && data.users.length) {
|
|
||||||
onUsersLoaded(data);
|
|
||||||
$('#load-more-users-btn').removeClass('disabled');
|
|
||||||
} else {
|
|
||||||
$('#load-more-users-btn').addClass('disabled');
|
|
||||||
}
|
|
||||||
loadingMoreUsers = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function onUsersLoaded(data) {
|
|
||||||
data.users = data.users.filter(function(user) {
|
|
||||||
return !$('.users-box[data-uid="' + user.uid + '"]').length;
|
|
||||||
});
|
|
||||||
|
|
||||||
templates.parse('users', 'users', data, function(html) {
|
|
||||||
translator.translate(html, function(translated) {
|
|
||||||
translated = $(translated);
|
|
||||||
$('#users-container').append(translated);
|
|
||||||
translated.find('span.timeago').timeago();
|
|
||||||
utils.addCommasToNumbers(translated.find('.formatted-number'));
|
|
||||||
$('#users-container .anon-user').appendTo($('#users-container'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleSearch() {
|
function handleSearch() {
|
||||||
var timeoutId = 0;
|
searchTimeoutID = 0;
|
||||||
|
|
||||||
$('#search-user').on('keyup', function() {
|
$('#search-user').on('keyup', function() {
|
||||||
if (timeoutId) {
|
if (searchTimeoutID) {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(searchTimeoutID);
|
||||||
timeoutId = 0;
|
searchTimeoutID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
timeoutId = setTimeout(doSearch, 250);
|
searchTimeoutID = setTimeout(doSearch, 150);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.search select, .search input[type="checkbox"]').on('change', function() {
|
$('.search select, .search input[type="checkbox"]').on('change', function() {
|
||||||
doSearch();
|
doSearch();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.users').on('click', '.pagination a', function() {
|
|
||||||
doSearch($(this).attr('data-page'));
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function doSearch(page) {
|
function doSearch(page) {
|
||||||
|
$('[component="user/search/icon"]').removeClass('fa-search').addClass('fa-spinner fa-spin');
|
||||||
var username = $('#search-user').val();
|
var username = $('#search-user').val();
|
||||||
page = page || 1;
|
page = page || 1;
|
||||||
|
|
||||||
if (!username) {
|
|
||||||
return loadPage(page);
|
|
||||||
}
|
|
||||||
var activeSection = getActiveSection();
|
var activeSection = getActiveSection();
|
||||||
socket.emit('user.search', {
|
|
||||||
query: username,
|
var query = {
|
||||||
page: page,
|
section: activeSection,
|
||||||
searchBy: 'username',
|
page: page
|
||||||
sortBy: $('.search select').val() || getSortBy(),
|
};
|
||||||
onlineOnly: $('.search .online-only').is(':checked') || (activeSection === 'online'),
|
|
||||||
bannedOnly: activeSection === 'banned',
|
if (!username) {
|
||||||
flaggedOnly: activeSection === 'flagged'
|
return loadPage(query);
|
||||||
}, function(err, data) {
|
|
||||||
if (err) {
|
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
renderSearchResults(data);
|
query.term = username;
|
||||||
});
|
query.sortBy = getSortBy();
|
||||||
|
|
||||||
|
if ($('.search .online-only').is(':checked') || (activeSection === 'online')) {
|
||||||
|
query.onlineOnly = true;
|
||||||
|
}
|
||||||
|
if (activeSection === 'banned') {
|
||||||
|
query.bannedOnly = true;
|
||||||
|
}
|
||||||
|
if (activeSection === 'flagged') {
|
||||||
|
query.flaggedOnly = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadPage(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSortBy() {
|
function getSortBy() {
|
||||||
@@ -137,16 +90,17 @@ define('forum/users', ['translator'], function(translator) {
|
|||||||
return sortBy;
|
return sortBy;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadPage(page) {
|
|
||||||
var section = getActiveSection();
|
function loadPage(query) {
|
||||||
section = section !== 'users' ? section : '';
|
var qs = decodeURIComponent($.param(query));
|
||||||
$.get('/api/users/' + section + '?page=' + page, function(data) {
|
$.get('/api/users?' + qs, renderSearchResults).fail(function(xhrErr) {
|
||||||
renderSearchResults(data);
|
if (xhrErr && xhrErr.responseJSON && xhrErr.responseJSON.error) {
|
||||||
|
app.alertError(xhrErr.responseJSON.error);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderSearchResults(data) {
|
function renderSearchResults(data) {
|
||||||
$('#load-more-users-btn').addClass('hide');
|
|
||||||
templates.parse('partials/paginator', {pagination: data.pagination}, function(html) {
|
templates.parse('partials/paginator', {pagination: data.pagination}, function(html) {
|
||||||
$('.pagination-container').replaceWith(html);
|
$('.pagination-container').replaceWith(html);
|
||||||
});
|
});
|
||||||
@@ -156,6 +110,7 @@ define('forum/users', ['translator'], function(translator) {
|
|||||||
translated = $(translated);
|
translated = $(translated);
|
||||||
$('#users-container').html(translated);
|
$('#users-container').html(translated);
|
||||||
translated.find('span.timeago').timeago();
|
translated.find('span.timeago').timeago();
|
||||||
|
$('[component="user/search/icon"]').addClass('fa-search').removeClass('fa-spinner fa-spin');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -173,9 +128,7 @@ define('forum/users', ['translator'], function(translator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getActiveSection() {
|
function getActiveSection() {
|
||||||
var url = window.location.href;
|
return utils.params().section || '';
|
||||||
var parts = url.split('/');
|
|
||||||
return parts[parts.length - 1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleInvite() {
|
function handleInvite() {
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ define('search', ['navigator', 'translator'], function(nav, translator) {
|
|||||||
return app.alertError('[[error:invalid-search-term]]');
|
return app.alertError('[[error:invalid-search-term]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
ajaxify.go('search/' + term + '?' + createQueryString(data));
|
ajaxify.go('search?' + createQueryString(data));
|
||||||
callback();
|
callback();
|
||||||
} else {
|
} else {
|
||||||
var cleanedTerm = term.replace(topicSearch[0], ''),
|
var cleanedTerm = term.replace(topicSearch[0], '');
|
||||||
tid = topicSearch[1];
|
var tid = topicSearch[1];
|
||||||
|
|
||||||
if (cleanedTerm.length > 0) {
|
if (cleanedTerm.length > 0) {
|
||||||
Search.queryTopic(tid, cleanedTerm, callback);
|
Search.queryTopic(tid, cleanedTerm, callback);
|
||||||
@@ -38,6 +38,7 @@ define('search', ['navigator', 'translator'], function(nav, translator) {
|
|||||||
var searchIn = data['in'] || 'titlesposts';
|
var searchIn = data['in'] || 'titlesposts';
|
||||||
var postedBy = data.by || '';
|
var postedBy = data.by || '';
|
||||||
var query = {
|
var query = {
|
||||||
|
term: data.term,
|
||||||
'in': searchIn
|
'in': searchIn
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async'),
|
var async = require('async');
|
||||||
|
|
||||||
user = require('../../user'),
|
var user = require('../../user');
|
||||||
helpers = require('../helpers'),
|
var helpers = require('../helpers');
|
||||||
accountHelpers = require('./helpers');
|
var accountHelpers = require('./helpers');
|
||||||
|
var pagination = require('../../pagination');
|
||||||
|
|
||||||
var followController = {};
|
var followController = {};
|
||||||
|
|
||||||
@@ -19,6 +20,11 @@ followController.getFollowers = function(req, res, next) {
|
|||||||
function getFollow(tpl, name, req, res, callback) {
|
function getFollow(tpl, name, req, res, callback) {
|
||||||
var userData;
|
var userData;
|
||||||
|
|
||||||
|
var page = parseInt(req.query.page, 10) || 1;
|
||||||
|
var resultsPerPage = 50;
|
||||||
|
var start = Math.max(0, page - 1) * resultsPerPage;
|
||||||
|
var stop = start + resultsPerPage - 1;
|
||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function(next) {
|
function(next) {
|
||||||
accountHelpers.getBaseUser(req.params.userslug, req.uid, next);
|
accountHelpers.getBaseUser(req.params.userslug, req.uid, next);
|
||||||
@@ -29,7 +35,7 @@ function getFollow(tpl, name, req, res, callback) {
|
|||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
var method = name === 'following' ? 'getFollowing' : 'getFollowers';
|
var method = name === 'following' ? 'getFollowing' : 'getFollowers';
|
||||||
user[method](userData.uid, 0, 49, next);
|
user[method](userData.uid, start, stop, next);
|
||||||
}
|
}
|
||||||
], function(err, users) {
|
], function(err, users) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -37,8 +43,10 @@ function getFollow(tpl, name, req, res, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
userData.users = users;
|
userData.users = users;
|
||||||
userData.nextStart = 50;
|
|
||||||
userData.title = '[[pages:' + tpl + ', ' + userData.username + ']]';
|
userData.title = '[[pages:' + tpl + ', ' + userData.username + ']]';
|
||||||
|
var count = name === 'following' ? userData.followingCount : userData.followerCount;
|
||||||
|
var pageCount = Math.ceil(count / resultsPerPage);
|
||||||
|
userData.pagination = pagination.create(page, pageCount);
|
||||||
userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:' + name + ']]'}]);
|
userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:' + name + ']]'}]);
|
||||||
|
|
||||||
res.render(tpl, userData);
|
res.render(tpl, userData);
|
||||||
|
|||||||
@@ -133,7 +133,19 @@ helpers.getBaseUser = function(userslug, callerUID, callback) {
|
|||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
user: function(next) {
|
user: function(next) {
|
||||||
user.getUserFields(uid, ['uid', 'username', 'userslug', 'picture', 'cover:url', 'cover:position', 'status', 'lastonline', 'groupTitle'], next);
|
user.getUserFields(uid, [
|
||||||
|
'uid',
|
||||||
|
'username',
|
||||||
|
'userslug',
|
||||||
|
'picture',
|
||||||
|
'cover:url',
|
||||||
|
'cover:position',
|
||||||
|
'status',
|
||||||
|
'lastonline',
|
||||||
|
'groupTitle',
|
||||||
|
'followingCount',
|
||||||
|
'followerCount'
|
||||||
|
], next);
|
||||||
},
|
},
|
||||||
isAdmin: function(next) {
|
isAdmin: function(next) {
|
||||||
user.isAdministrator(callerUID, next);
|
user.isAdministrator(callerUID, next);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ searchController.search = function(req, res, next) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var data = {
|
var data = {
|
||||||
query: req.params.term,
|
query: req.query.term,
|
||||||
searchIn: req.query.in || 'posts',
|
searchIn: req.query.in || 'posts',
|
||||||
postedBy: req.query.by,
|
postedBy: req.query.by,
|
||||||
categories: req.query.categories,
|
categories: req.query.categories,
|
||||||
@@ -59,7 +59,7 @@ searchController.search = function(req, res, next) {
|
|||||||
searchData.showAsTopics = req.query.showAs === 'topics';
|
searchData.showAsTopics = req.query.showAs === 'topics';
|
||||||
searchData.title = '[[global:header.search]]';
|
searchData.title = '[[global:header.search]]';
|
||||||
searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]);
|
searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]);
|
||||||
searchData.expandSearch = !req.params.term;
|
searchData.expandSearch = !req.query.term;
|
||||||
|
|
||||||
res.render('search', searchData);
|
res.render('search', searchData);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,10 +11,61 @@ var helpers = require('./helpers');
|
|||||||
|
|
||||||
var usersController = {};
|
var usersController = {};
|
||||||
|
|
||||||
|
|
||||||
|
usersController.index = function(req, res, next) {
|
||||||
|
var section = req.query.section || 'joindate';
|
||||||
|
var sectionToController = {
|
||||||
|
joindate: usersController.getUsersSortedByJoinDate,
|
||||||
|
online: usersController.getOnlineUsers,
|
||||||
|
'sort-posts': usersController.getUsersSortedByPosts,
|
||||||
|
'sort-reputation': usersController.getUsersSortedByReputation,
|
||||||
|
banned: usersController.getBannedUsers,
|
||||||
|
flagged: usersController.getFlaggedUsers
|
||||||
|
};
|
||||||
|
|
||||||
|
if (req.query.term) {
|
||||||
|
usersController.search(req, res, next);
|
||||||
|
} else if (sectionToController[section]) {
|
||||||
|
sectionToController[section](req, res, next);
|
||||||
|
} else {
|
||||||
|
usersController.getUsersSortedByJoinDate(req, res, next);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
usersController.search = function(req, res, next) {
|
||||||
|
async.parallel({
|
||||||
|
search: function(next) {
|
||||||
|
user.search({
|
||||||
|
query: req.query.term,
|
||||||
|
searchBy: req.query.searchBy || 'username',
|
||||||
|
page: req.query.page || 1,
|
||||||
|
sortBy: req.query.sortBy,
|
||||||
|
onlineOnly: req.query.onlineOnly === 'true',
|
||||||
|
bannedOnly: req.query.bannedOnly === 'true',
|
||||||
|
flaggedOnly: req.query.flaggedOnly === 'true'
|
||||||
|
}, next);
|
||||||
|
},
|
||||||
|
isAdminOrGlobalMod: function(next) {
|
||||||
|
user.isAdminOrGlobalMod(req.uid, next);
|
||||||
|
}
|
||||||
|
}, function(err, results) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var section = req.query.section || 'joindate';
|
||||||
|
|
||||||
|
results.search.isAdminOrGlobalMod = results.isAdminOrGlobalMod;
|
||||||
|
results.search.pagination = pagination.create(req.query.page, results.search.pageCount, req.query);
|
||||||
|
results.search['section_' + section] = true;
|
||||||
|
render(req, res, results.search, next);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
usersController.getOnlineUsers = function(req, res, next) {
|
usersController.getOnlineUsers = function(req, res, next) {
|
||||||
async.parallel({
|
async.parallel({
|
||||||
users: function(next) {
|
users: function(next) {
|
||||||
usersController.getUsers('users:online', req.uid, req.query.page, next);
|
usersController.getUsers('users:online', req.uid, req.query, next);
|
||||||
},
|
},
|
||||||
guests: function(next) {
|
guests: function(next) {
|
||||||
require('../socket.io/admin/rooms').getTotalGuestCount(next);
|
require('../socket.io/admin/rooms').getTotalGuestCount(next);
|
||||||
@@ -56,7 +107,7 @@ usersController.getUsersSortedByJoinDate = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
usersController.getBannedUsers = function(req, res, next) {
|
usersController.getBannedUsers = function(req, res, next) {
|
||||||
usersController.getUsers('users:banned', req.uid, req.query.page, function(err, userData) {
|
usersController.getUsers('users:banned', req.uid, req.query, function(err, userData) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
@@ -70,7 +121,7 @@ usersController.getBannedUsers = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
usersController.getFlaggedUsers = function(req, res, next) {
|
usersController.getFlaggedUsers = function(req, res, next) {
|
||||||
usersController.getUsers('users:flags', req.uid, req.query.page, function(err, userData) {
|
usersController.getUsers('users:flags', req.uid, req.query, function(err, userData) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
@@ -84,15 +135,16 @@ usersController.getFlaggedUsers = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
usersController.renderUsersPage = function(set, req, res, next) {
|
usersController.renderUsersPage = function(set, req, res, next) {
|
||||||
usersController.getUsers(set, req.uid, req.query.page, function(err, userData) {
|
usersController.getUsers(set, req.uid, req.query, function(err, userData) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
render(req, res, userData, next);
|
render(req, res, userData, next);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
usersController.getUsers = function(set, uid, page, callback) {
|
usersController.getUsers = function(set, uid, query, callback) {
|
||||||
var setToData = {
|
var setToData = {
|
||||||
'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'},
|
'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'},
|
||||||
'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'},
|
'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'},
|
||||||
@@ -112,17 +164,14 @@ usersController.getUsers = function(set, uid, page, callback) {
|
|||||||
breadcrumbs.unshift({text: '[[global:users]]', url: '/users'});
|
breadcrumbs.unshift({text: '[[global:users]]', url: '/users'});
|
||||||
}
|
}
|
||||||
|
|
||||||
page = parseInt(page, 10) || 1;
|
var page = parseInt(query.page, 10) || 1;
|
||||||
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 50;
|
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 50;
|
||||||
var start = Math.max(0, page - 1) * resultsPerPage;
|
var start = Math.max(0, page - 1) * resultsPerPage;
|
||||||
var stop = start + resultsPerPage - 1;
|
var stop = start + resultsPerPage - 1;
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
isAdministrator: function(next) {
|
isAdminOrGlobalMod: function(next) {
|
||||||
user.isAdministrator(uid, next);
|
user.isAdminOrGlobalMod(uid, next);
|
||||||
},
|
|
||||||
isGlobalMod: function(next) {
|
|
||||||
user.isGlobalModerator(uid, next);
|
|
||||||
},
|
},
|
||||||
usersData: function(next) {
|
usersData: function(next) {
|
||||||
usersController.getUsersAndCount(set, uid, start, stop, next);
|
usersController.getUsersAndCount(set, uid, start, stop, next);
|
||||||
@@ -134,16 +183,14 @@ usersController.getUsers = function(set, uid, page, callback) {
|
|||||||
|
|
||||||
var pageCount = Math.ceil(results.usersData.count / resultsPerPage);
|
var pageCount = Math.ceil(results.usersData.count / resultsPerPage);
|
||||||
var userData = {
|
var userData = {
|
||||||
loadmore_display: results.usersData.count > (stop - start + 1) ? 'block' : 'hide',
|
|
||||||
users: results.usersData.users,
|
users: results.usersData.users,
|
||||||
pagination: pagination.create(page, pageCount),
|
pagination: pagination.create(page, pageCount, query),
|
||||||
userCount: results.usersData.count,
|
userCount: results.usersData.count,
|
||||||
title: setToData[set].title || '[[pages:users/latest]]',
|
title: setToData[set].title || '[[pages:users/latest]]',
|
||||||
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
|
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
|
||||||
setName: set,
|
isAdminOrGlobalMod: results.isAdminOrGlobalMod
|
||||||
isAdminOrGlobalMod: results.isAdministrator || results.isGlobalMod
|
|
||||||
};
|
};
|
||||||
userData['route_' + set] = true;
|
userData['section_' + (query.section || 'joindate')] = true;
|
||||||
callback(null, userData);
|
callback(null, userData);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function mainRoutes(app, middleware, controllers) {
|
|||||||
setupPageRoute(app, '/compose', middleware, [], controllers.compose);
|
setupPageRoute(app, '/compose', middleware, [], controllers.compose);
|
||||||
setupPageRoute(app, '/confirm/:code', middleware, [], controllers.confirmEmail);
|
setupPageRoute(app, '/confirm/:code', middleware, [], controllers.confirmEmail);
|
||||||
setupPageRoute(app, '/outgoing', middleware, [], controllers.outgoing);
|
setupPageRoute(app, '/outgoing', middleware, [], controllers.outgoing);
|
||||||
setupPageRoute(app, '/search/:term?', middleware, [], controllers.search.search);
|
setupPageRoute(app, '/search', middleware, [], controllers.search.search);
|
||||||
setupPageRoute(app, '/reset/:code?', middleware, [], controllers.reset);
|
setupPageRoute(app, '/reset/:code?', middleware, [], controllers.reset);
|
||||||
setupPageRoute(app, '/tos', middleware, [], controllers.termsOfUse);
|
setupPageRoute(app, '/tos', middleware, [], controllers.termsOfUse);
|
||||||
|
|
||||||
@@ -73,12 +73,7 @@ function categoryRoutes(app, middleware, controllers) {
|
|||||||
function userRoutes(app, middleware, controllers) {
|
function userRoutes(app, middleware, controllers) {
|
||||||
var middlewares = [middleware.checkGlobalPrivacySettings];
|
var middlewares = [middleware.checkGlobalPrivacySettings];
|
||||||
|
|
||||||
setupPageRoute(app, '/users', middleware, middlewares, controllers.users.getUsersSortedByJoinDate);
|
setupPageRoute(app, '/users', middleware, middlewares, controllers.users.index);
|
||||||
setupPageRoute(app, '/users/online', middleware, middlewares, controllers.users.getOnlineUsers);
|
|
||||||
setupPageRoute(app, '/users/sort-posts', middleware, middlewares, controllers.users.getUsersSortedByPosts);
|
|
||||||
setupPageRoute(app, '/users/sort-reputation', middleware, middlewares, controllers.users.getUsersSortedByReputation);
|
|
||||||
setupPageRoute(app, '/users/banned', middleware, middlewares, controllers.users.getBannedUsers);
|
|
||||||
setupPageRoute(app, '/users/flagged', middleware, middlewares, controllers.users.getFlaggedUsers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function groupRoutes(app, middleware, controllers) {
|
function groupRoutes(app, middleware, controllers) {
|
||||||
@@ -94,12 +89,12 @@ module.exports = function(app, middleware, hotswapIds) {
|
|||||||
express.Router(), // plugin router
|
express.Router(), // plugin router
|
||||||
express.Router(), // main app router
|
express.Router(), // main app router
|
||||||
express.Router() // auth router
|
express.Router() // auth router
|
||||||
],
|
];
|
||||||
router = routers[1],
|
var router = routers[1];
|
||||||
pluginRouter = routers[0],
|
var pluginRouter = routers[0];
|
||||||
authRouter = routers[2],
|
var authRouter = routers[2];
|
||||||
relativePath = nconf.get('relative_path'),
|
var relativePath = nconf.get('relative_path');
|
||||||
ensureLoggedIn = require('connect-ensure-login');
|
var ensureLoggedIn = require('connect-ensure-login');
|
||||||
|
|
||||||
if (Array.isArray(hotswapIds) && hotswapIds.length) {
|
if (Array.isArray(hotswapIds) && hotswapIds.length) {
|
||||||
for(var idx,x=0;x<hotswapIds.length;x++) {
|
for(var idx,x=0;x<hotswapIds.length;x++) {
|
||||||
|
|||||||
@@ -265,51 +265,6 @@ SocketUser.getUnreadCounts = function(socket, data, callback) {
|
|||||||
}, callback);
|
}, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketUser.loadMore = function(socket, data, callback) {
|
|
||||||
if (!data || !data.set || parseInt(data.after, 10) < 0) {
|
|
||||||
return callback(new Error('[[error:invalid-data]]'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!socket.uid && !!parseInt(meta.config.privateUserInfo, 10)) {
|
|
||||||
return callback(new Error('[[error:no-privileges]]'));
|
|
||||||
}
|
|
||||||
|
|
||||||
var start = parseInt(data.after, 10);
|
|
||||||
var stop = start + 19;
|
|
||||||
|
|
||||||
async.parallel({
|
|
||||||
isAdmin: function(next) {
|
|
||||||
user.isAdministrator(socket.uid, next);
|
|
||||||
},
|
|
||||||
isGlobalMod: function(next) {
|
|
||||||
user.isGlobalModerator(socket.uid, next);
|
|
||||||
},
|
|
||||||
users: function(next) {
|
|
||||||
user.getUsersFromSet(data.set, socket.uid, start, stop, next);
|
|
||||||
}
|
|
||||||
}, function(err, results) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.set === 'users:banned' && !results.isAdmin && !results.isGlobalMod) {
|
|
||||||
return callback(new Error('[[error:no-privileges]]'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!results.isAdmin && data.set === 'users:online') {
|
|
||||||
results.users = results.users.filter(function(user) {
|
|
||||||
return user.status !== 'offline';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var result = {
|
|
||||||
users: results.users,
|
|
||||||
nextStart: stop + 1,
|
|
||||||
};
|
|
||||||
result['route_' + data.set] = true;
|
|
||||||
callback(null, result);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
SocketUser.invite = function(socket, email, callback) {
|
SocketUser.invite = function(socket, email, callback) {
|
||||||
if (!email || !socket.uid) {
|
if (!email || !socket.uid) {
|
||||||
return callback(new Error('[[error:invalid-data]]'));
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
|||||||
@@ -84,7 +84,16 @@ module.exports = function(User) {
|
|||||||
function filterAndSortUids(uids, data, callback) {
|
function filterAndSortUids(uids, data, callback) {
|
||||||
var sortBy = data.sortBy || 'joindate';
|
var sortBy = data.sortBy || 'joindate';
|
||||||
|
|
||||||
var fields = ['uid', 'status', 'lastonline', 'banned', 'flags', sortBy];
|
var fields = ['uid', sortBy];
|
||||||
|
if (data.onlineOnly) {
|
||||||
|
fields = fields.concat(['status', 'lastonline']);
|
||||||
|
}
|
||||||
|
if (data.bannedOnly) {
|
||||||
|
fields.push('banned');
|
||||||
|
}
|
||||||
|
if (data.flaggedOnly) {
|
||||||
|
fields.push('flags');
|
||||||
|
}
|
||||||
|
|
||||||
User.getUsersFields(uids, fields, function(err, userData) {
|
User.getUsersFields(uids, fields, function(err, userData) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user