v1.18.x
Julian Lam 7 years ago
parent db2cd527a1
commit a126f07471

@ -18,6 +18,7 @@
"filter-type": "Flag Type", "filter-type": "Flag Type",
"filter-type-all": "All Content", "filter-type-all": "All Content",
"filter-type-post": "Post", "filter-type-post": "Post",
"filter-type-user": "User",
"filter-state": "State", "filter-state": "State",
"filter-assignee": "Assignee UID", "filter-assignee": "Assignee UID",
"filter-cid": "Category", "filter-cid": "Category",

@ -7,15 +7,17 @@ var categories = require('../categories');
var flags = require('../flags'); var flags = require('../flags');
var analytics = require('../analytics'); var analytics = require('../analytics');
var plugins = require('../plugins'); var plugins = require('../plugins');
var adminPostQueueController = require('./admin/postqueue'); var pagination = require('../pagination');
var adminPostQueueController = require('./admin/postqueue');
var modsController = module.exports; var modsController = module.exports;
modsController.flags = {}; modsController.flags = {};
modsController.flags.list = function (req, res, next) { modsController.flags.list = function (req, res, next) {
var filters; var filters;
var hasFilter; var hasFilter;
var validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick']; var validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick', 'page', 'perPage'];
async.waterfall([ async.waterfall([
function (next) { function (next) {
async.parallel({ async.parallel({
@ -62,6 +64,11 @@ modsController.flags.list = function (req, res, next) {
} }
} }
// Pagination doesn't count as a filter
if (Object.keys(filters).length === 2 && filters.hasOwnProperty('page') && filters.hasOwnProperty('perPage')) {
hasFilter = false;
}
async.parallel({ async.parallel({
flags: async.apply(flags.list, filters, req.uid), flags: async.apply(flags.list, filters, req.uid),
analytics: async.apply(analytics.getDailyStatsForSet, 'analytics:flags', Date.now(), 30), analytics: async.apply(analytics.getDailyStatsForSet, 'analytics:flags', Date.now(), 30),
@ -92,12 +99,13 @@ modsController.flags.list = function (req, res, next) {
}, {}); }, {});
res.render('flags/list', { res.render('flags/list', {
flags: data.flags, flags: data.flags.flags,
analytics: data.analytics, analytics: data.analytics,
categories: data.categories, categories: data.categories,
hasFilter: hasFilter, hasFilter: hasFilter,
filters: filters, filters: filters,
title: '[[pages:flags]]', title: '[[pages:flags]]',
pagination: pagination.create(data.flags.page, data.flags.pageCount, req.query),
}); });
}, },
], next); ], next);

@ -51,6 +51,8 @@ Flags.init = function (callback) {
cid: function (sets, orSets, key) { cid: function (sets, orSets, key) {
prepareSets(sets, orSets, 'flags:byCid:', key); prepareSets(sets, orSets, 'flags:byCid:', key);
}, },
page: function () { /* noop */ },
perPage: function () { /* noop */ },
quick: function (sets, orSets, key, uid) { quick: function (sets, orSets, key, uid) {
switch (key) { switch (key) {
case 'mine': case 'mine':
@ -121,14 +123,16 @@ Flags.list = function (filters, uid, callback) {
var sets = []; var sets = [];
var orSets = []; var orSets = [];
if (Object.keys(filters).length > 0) { // Default filter
for (var type in filters) { filters.page = filters.hasOwnProperty('page') ? Math.abs(parseInt(filters.page, 10) || 1) : 1;
if (filters.hasOwnProperty(type)) { filters.perPage = filters.hasOwnProperty('perPage') ? Math.abs(parseInt(filters.perPage, 10) || 20) : 20;
if (Flags._filters.hasOwnProperty(type)) {
Flags._filters[type](sets, orSets, filters[type], uid); for (var type in filters) {
} else { if (filters.hasOwnProperty(type)) {
winston.warn('[flags/list] No flag filter type found: ' + type); if (Flags._filters.hasOwnProperty(type)) {
} Flags._filters[type](sets, orSets, filters[type], uid);
} else {
winston.warn('[flags/list] No flag filter type found: ' + type);
} }
} }
} }
@ -165,6 +169,11 @@ Flags.list = function (filters, uid, callback) {
} }
}, },
function (flagIds, next) { function (flagIds, next) {
// Create subset for parsing based on page number (n=20)
const flagsPerPage = Math.abs(parseInt(filters.perPage, 10) || 1);
const pageCount = Math.ceil(flagIds.length / flagsPerPage);
flagIds = flagIds.slice((filters.page - 1) * flagsPerPage, filters.page * flagsPerPage);
async.map(flagIds, function (flagId, next) { async.map(flagIds, function (flagId, next) {
async.waterfall([ async.waterfall([
async.apply(db.getObject, 'flag:' + flagId), async.apply(db.getObject, 'flag:' + flagId),
@ -206,13 +215,20 @@ Flags.list = function (filters, uid, callback) {
datetimeISO: new Date(parseInt(flagObj.datetime, 10)).toISOString(), datetimeISO: new Date(parseInt(flagObj.datetime, 10)).toISOString(),
})); }));
}); });
}, next); }, function (err, flags) {
next(err, flags, pageCount);
});
}, },
function (flags, next) { function (flags, pageCount, next) {
plugins.fireHook('filter:flags.list', { plugins.fireHook('filter:flags.list', {
flags: flags, flags: flags,
page: filters.page,
}, function (err, data) { }, function (err, data) {
next(err, data.flags); next(err, {
flags: data.flags,
page: data.page,
pageCount: pageCount,
});
}); });
}, },
], callback); ], callback);

Loading…
Cancel
Save