diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 7b7113930447..bf2791ea1920 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -427,6 +427,8 @@ define('admin/manage/users', [ handleUserCreate(); handleInvite(); + + handleSort(); }; function loadSearchPage(query) { @@ -479,6 +481,24 @@ define('admin/manage/users', [ }); } + function handleSort() { + $('.users-table thead th').on('click', function () { + var $this = $(this); + var sortBy = $this.attr('data-sort'); + if (!sortBy) { + return; + } + var params = utils.params(); + params.sortBy = sortBy; + if (ajaxify.data.sortBy === sortBy) { + params.sortDirection = ajaxify.data.reverse ? 'asc' : 'desc'; + } else { + params.sortDirection = 'desc'; + } + var qs = decodeURIComponent($.param(params)); + ajaxify.go('admin/manage/users?' + qs); + }); + } return Users; }); diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index ef8a9fdb649b..8b9da0f19969 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -13,8 +13,107 @@ const utils = require('../../utils'); const usersController = module.exports; -const userFields = ['uid', 'username', 'userslug', 'email', 'postcount', 'joindate', 'banned', - 'reputation', 'picture', 'flags', 'lastonline', 'email:confirmed']; +const userFields = [ + 'uid', 'username', 'userslug', 'email', 'postcount', 'joindate', 'banned', + 'reputation', 'picture', 'flags', 'lastonline', 'email:confirmed', +]; + +usersController.index = async function (req, res) { + if (req.query.query) { + await usersController.search(req, res); + } else { + await newGet(req, res); + } +}; + +async function newGet(req, res) { + const sortDirection = req.query.sortDirection || 'desc'; + const reverse = sortDirection === 'desc'; + + const page = parseInt(req.query.page, 10) || 1; + let resultsPerPage = parseInt(req.query.resultsPerPage, 10) || 50; + if (![50, 100, 250, 500].includes(resultsPerPage)) { + resultsPerPage = 50; + } + const sortBy = validator.escape(req.query.sortBy || 'joindate'); + const filterBy = Array.isArray(req.query.filter) ? req.query.filter : [req.query.filter]; + const start = Math.max(0, page - 1) * resultsPerPage; + const stop = start + resultsPerPage - 1; + + function buildSet() { + const sortToSet = { + postcount: 'users:postcount', + reputation: 'users:reputation', + joindate: 'users:joindate', + online: 'users:online', + flags: 'users:flags', + }; + + const set = [sortToSet[sortBy] || 'users:joindate']; + if (filterBy.includes('notvalidated')) { + set.push('users:notvalidated'); + } + if (filterBy.includes('banned')) { + set.push('users:banned'); + } + return set.length > 1 ? set : set[0]; + } + + async function getCount(set) { + if (Array.isArray(set)) { + return await db.sortedSetIntersectCard(set); + } + return await db.sortedSetCard(set); + } + + async function getUids(set) { + let uids = []; + console.log('get uids', set); + if (Array.isArray(set)) { + const weights = set.map((s, index) => (index ? 0 : 1)); + uids = await db[reverse ? 'getSortedSetRevIntersect' : 'getSortedSetIntersect']({ + sets: set, + start: start, + stop: stop, + weights: weights, + }); + } else { + uids = await db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, stop); + } + return uids; + } + + async function getUsersWithFields(set) { + const uids = await getUids(set); + const [isAdmin, userData] = await Promise.all([ + user.isAdministrator(uids), + user.getUsersWithFields(uids, userFields, req.uid), + ]); + userData.forEach((user, index) => { + if (user) { + user.administrator = isAdmin[index]; + } + }); + return userData; + } + const set = buildSet(); + const [count, users] = await Promise.all([ + getCount(set), + getUsersWithFields(set), + ]); + + const data = { + users: users.filter(user => user && parseInt(user.uid, 10)), + page: page, + pageCount: Math.max(1, Math.ceil(count / resultsPerPage)), + resultsPerPage: resultsPerPage, + reverse: reverse, + sortBy: sortBy, + }; + data['sort_' + sortBy] = true; + // data[section] = true; + render(req, res, data); +} usersController.search = async function (req, res) { const page = parseInt(req.query.page, 10) || 1; diff --git a/src/routes/admin.js b/src/routes/admin.js index 8eb379d127fb..eeabb93cdc6b 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -16,16 +16,17 @@ module.exports = function (app, middleware, controllers) { helpers.setupAdminPageRoute(app, '/admin/manage/privileges/:cid?', middleware, middlewares, controllers.admin.privileges.get); helpers.setupAdminPageRoute(app, '/admin/manage/tags', middleware, middlewares, controllers.admin.tags.get); - helpers.setupAdminPageRoute(app, '/admin/manage/users', middleware, middlewares, controllers.admin.users.sortByJoinDate); + helpers.setupAdminPageRoute(app, '/admin/manage/users', middleware, middlewares, controllers.admin.users.index); + // helpers.setupAdminPageRoute(app, '/admin/manage/users', middleware, middlewares, controllers.admin.users.sortByJoinDate); helpers.setupAdminPageRoute(app, '/admin/manage/users/search', middleware, middlewares, controllers.admin.users.search); - helpers.setupAdminPageRoute(app, '/admin/manage/users/latest', middleware, middlewares, controllers.admin.users.sortByJoinDate); - helpers.setupAdminPageRoute(app, '/admin/manage/users/not-validated', middleware, middlewares, controllers.admin.users.notValidated); - helpers.setupAdminPageRoute(app, '/admin/manage/users/no-posts', middleware, middlewares, controllers.admin.users.noPosts); - helpers.setupAdminPageRoute(app, '/admin/manage/users/top-posters', middleware, middlewares, controllers.admin.users.topPosters); - helpers.setupAdminPageRoute(app, '/admin/manage/users/most-reputation', middleware, middlewares, controllers.admin.users.mostReputaion); - helpers.setupAdminPageRoute(app, '/admin/manage/users/inactive', middleware, middlewares, controllers.admin.users.inactive); - helpers.setupAdminPageRoute(app, '/admin/manage/users/flagged', middleware, middlewares, controllers.admin.users.flagged); - helpers.setupAdminPageRoute(app, '/admin/manage/users/banned', middleware, middlewares, controllers.admin.users.banned); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/latest', middleware, middlewares, controllers.admin.users.sortByJoinDate); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/not-validated', middleware, middlewares, controllers.admin.users.notValidated); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/no-posts', middleware, middlewares, controllers.admin.users.noPosts); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/top-posters', middleware, middlewares, controllers.admin.users.topPosters); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/most-reputation', middleware, middlewares, controllers.admin.users.mostReputaion); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/inactive', middleware, middlewares, controllers.admin.users.inactive); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/flagged', middleware, middlewares, controllers.admin.users.flagged); + // helpers.setupAdminPageRoute(app, '/admin/manage/users/banned', middleware, middlewares, controllers.admin.users.banned); helpers.setupAdminPageRoute(app, '/admin/manage/registration', middleware, middlewares, controllers.admin.users.registrationQueue); helpers.setupAdminPageRoute(app, '/admin/manage/admins-mods', middleware, middlewares, controllers.admin.adminsMods.get); diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index f31382e6719a..0b538cc2c7db 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -30,14 +30,9 @@