feat(uses): admin list pagination

This commit is contained in:
OldHawk
2017-10-14 23:15:53 +08:00
parent d37c85be43
commit 63b3ebacea
4 changed files with 139 additions and 47 deletions

View File

@@ -705,6 +705,7 @@ module.exports = {
* @torrentsPerPage: torrents list page settings
* @torrentsCommentsPerPage: torrent comments list settings
* @tracesPerPage: system traces log list page settings
* @adminUserListPerPage: admin manage users list page settings
*/
itemsPerPage: {
topicsPerPage: 10,
@@ -712,7 +713,8 @@ module.exports = {
topicsSearchPerPage: 10,
torrentsPerPage: 15,
torrentsCommentsPerPage: 10,
tracesPerPage: 30
tracesPerPage: 30,
adminUserListPerPage: 15
},
/**

View File

@@ -5,10 +5,12 @@
.module('users.admin')
.controller('UserListController', UserListController);
UserListController.$inject = ['$scope', '$filter', 'AdminService', 'DebugConsoleService'];
UserListController.$inject = ['$scope', '$filter', 'AdminService', 'DebugConsoleService', 'MeanTorrentConfig', '$timeout'];
function UserListController($scope, $filter, AdminService, mtDebug) {
function UserListController($scope, $filter, AdminService, mtDebug, MeanTorrentConfig, $timeout) {
var vm = this;
vm.itemsPerPageConfig = MeanTorrentConfig.meanTorrentConfig.itemsPerPage;
vm.buildPager = buildPager;
vm.figureOutItemsToDisplay = figureOutItemsToDisplay;
vm.pageChanged = pageChanged;
@@ -16,56 +18,61 @@
vm.searchAdmin = false;
vm.searchOper = false;
AdminService.query(function (data) {
vm.users = data;
mtDebug.info(data);
vm.buildPager();
});
/**
* buildPager
*/
function buildPager() {
vm.pagedItems = [];
vm.itemsPerPage = 15;
vm.itemsPerPage = vm.itemsPerPageConfig.adminUserListPerPage;
vm.currentPage = 1;
vm.figureOutItemsToDisplay();
}
/**
* figureOutItemsToDisplay
* @param callback
*/
function figureOutItemsToDisplay() {
vm.resultUsers = vm.users;
if (vm.searchVip) {
vm.resultUsers = $filter('filter')(vm.resultUsers, {
isVip: true
});
}
if (vm.searchAdmin) {
vm.resultUsers = $filter('filter')(vm.resultUsers, {
isAdmin: true
});
}
if (vm.searchOper) {
vm.resultUsers = $filter('filter')(vm.resultUsers, {
isOper: true
});
}
vm.filteredItems = $filter('filter')(vm.resultUsers, {
$: vm.search
function figureOutItemsToDisplay(callback) {
vm.getUsers(vm.currentPage, function (items) {
vm.filterLength = items.total;
vm.pagedItems = items.rows;
if (callback) callback();
});
vm.filterLength = vm.filteredItems.length;
var begin = ((vm.currentPage - 1) * vm.itemsPerPage);
var end = begin + vm.itemsPerPage;
vm.pagedItems = vm.filteredItems.slice(begin, end);
}
/**
* getUsers
* @param p
* @param callback
*/
vm.getUsers = function (p, callback) {
AdminService.get({
skip: (p - 1) * vm.itemsPerPage,
limit: vm.itemsPerPage,
isVip: vm.searchVip || undefined,
isOper: vm.searchOper || undefined,
isAdmin: vm.searchAdmin || undefined,
keys: vm.search
}, function (data) {
mtDebug.info(data);
callback(data);
});
};
/**
* pageChanged
*/
function pageChanged() {
vm.figureOutItemsToDisplay();
var element = angular.element('#top_of_users_list');
vm.figureOutItemsToDisplay(function () {
$timeout(function () {
$('html,body').animate({scrollTop: element[0].offsetTop + 15}, 200);
}, 10);
});
}
}

View File

@@ -1,22 +1,22 @@
<section class="container">
<div class="page-header">
<section class="container" ng-init="vm.buildPager();">
<div class="page-header" id="top_of_users_list">
<div class="row">
<div class="col-md-4">
<h3>{{ 'USERS_LIST' | translate}}</h3>
</div>
<div class="col-md-4 checkbox-inline" style="margin-top: 1em">
<label class="checkbox-inline">
<input type="checkbox" ng-model="vm.searchVip" ng-change="vm.figureOutItemsToDisplay()"> isVip
<input type="checkbox" ng-model="vm.searchVip" ng-change="vm.currentPage = 1; vm.figureOutItemsToDisplay()"> isVip
</label>
<label class="checkbox-inline">
<input type="checkbox" ng-model="vm.searchAdmin" ng-change="vm.figureOutItemsToDisplay()"> isAdmin
<input type="checkbox" ng-model="vm.searchAdmin" ng-change="vm.currentPage = 1; vm.figureOutItemsToDisplay()"> isAdmin
</label>
<label class="checkbox-inline">
<input type="checkbox" ng-model="vm.searchOper" ng-change="vm.figureOutItemsToDisplay()"> isOper
<input type="checkbox" ng-model="vm.searchOper" ng-change="vm.currentPage = 1; vm.figureOutItemsToDisplay()"> isOper
</label>
</div>
<div class="col-md-4" style="margin-top: 1em">
<input class="form-control col-md-4" type="text" ng-model="vm.search" placeholder="Search" ng-change="vm.figureOutItemsToDisplay()"/>
<input class="form-control col-md-4" type="text" ng-model="vm.search" placeholder="Search" ng-change="vm.currentPage = 1; vm.figureOutItemsToDisplay()"/>
</div>
</div>
</div>

View File

@@ -10,6 +10,7 @@ var path = require('path'),
Peer = mongoose.model('Peer'),
Torrent = mongoose.model('Torrent'),
Complete = mongoose.model('Complete'),
async = require('async'),
errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
traceLogCreate = require(path.resolve('./config/lib/tracelog')).create;
@@ -17,6 +18,8 @@ const PEERSTATE_SEEDER = 'seeder';
const PEERSTATE_LEECHER = 'leecher';
var traceConfig = config.meanTorrentConfig.trace;
var mtDebug = require(path.resolve('./config/lib/debug'));
/**
* Show the current user
*/
@@ -81,14 +84,94 @@ exports.delete = function (req, res) {
* List of Users
*/
exports.list = function (req, res) {
User.find({}, '-salt -password -providerData').sort('-created').populate('user', 'displayName').exec(function (err, users) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
}
var condition = {};
var keysA = [];
var skip = 0;
var limit = 0;
var isVip = false;
var isOper = false;
var isAdmin = false;
res.json(users);
if (req.query.skip !== undefined) {
skip = parseInt(req.query.skip, 10);
}
if (req.query.limit !== undefined) {
limit = parseInt(req.query.limit, 10);
}
if (req.query.isVip !== undefined) {
isVip = req.query.isVip;
}
if (req.query.isOper !== undefined) {
isOper = req.query.isOper;
}
if (req.query.isAdmin !== undefined) {
isAdmin = req.query.isAdmin;
}
if (req.query.keys && req.query.keys.length > 0) {
var keysS = req.query.keys + '';
var keysT = keysS.split(' ');
keysT.forEach(function (it) {
var ti = new RegExp(it, 'i');
keysA.push(ti);
});
}
if (isVip === 'true') {
condition.isVip = true;
}
if (isOper === 'true') {
condition.roles = {$in: ['oper']};
}
if (isAdmin === 'true') {
condition.roles = {$in: ['admin']};
}
if (isOper === 'true' && isAdmin === 'true') {
condition.roles = {$in: ['oper', 'admin']};
}
if (keysA.length > 0) {
condition.$or = [
{displayName: {'$all': keysA}},
{email: {'$all': keysA}},
{username: {'$all': keysA}}
];
}
mtDebug.debugBlue(condition);
var countQuery = function (callback) {
User.count(condition, function (err, count) {
if (err) {
callback(err, null);
} else {
callback(null, count);
}
});
};
var findQuery = function (callback) {
User.find(condition, '-salt -password -providerData')
.sort('-created')
.populate('invited_by', 'username displayName profileImageURL isVip uploaded downloaded')
.skip(skip)
.limit(limit)
.exec(function (err, users) {
if (err) {
callback(err, null);
} else {
callback(null, users);
}
});
};
async.parallel([countQuery, findQuery], function (err, results) {
if (err) {
mtDebug.debugRed(err);
return res.status(422).send(err);
} else {
res.json({rows: results[1], total: results[0]});
}
});
};