mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-06-23 19:00:11 +02:00
closes #6043
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
"filter-type": "Flag Type",
|
||||
"filter-type-all": "All Content",
|
||||
"filter-type-post": "Post",
|
||||
"filter-type-user": "User",
|
||||
"filter-state": "State",
|
||||
"filter-assignee": "Assignee UID",
|
||||
"filter-cid": "Category",
|
||||
|
||||
@@ -7,15 +7,17 @@ var categories = require('../categories');
|
||||
var flags = require('../flags');
|
||||
var analytics = require('../analytics');
|
||||
var plugins = require('../plugins');
|
||||
var adminPostQueueController = require('./admin/postqueue');
|
||||
var pagination = require('../pagination');
|
||||
|
||||
var adminPostQueueController = require('./admin/postqueue');
|
||||
var modsController = module.exports;
|
||||
modsController.flags = {};
|
||||
|
||||
modsController.flags.list = function (req, res, next) {
|
||||
var filters;
|
||||
var hasFilter;
|
||||
var validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick'];
|
||||
var validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick', 'page', 'perPage'];
|
||||
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
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({
|
||||
flags: async.apply(flags.list, filters, req.uid),
|
||||
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', {
|
||||
flags: data.flags,
|
||||
flags: data.flags.flags,
|
||||
analytics: data.analytics,
|
||||
categories: data.categories,
|
||||
hasFilter: hasFilter,
|
||||
filters: filters,
|
||||
title: '[[pages:flags]]',
|
||||
pagination: pagination.create(data.flags.page, data.flags.pageCount, req.query),
|
||||
});
|
||||
},
|
||||
], next);
|
||||
|
||||
38
src/flags.js
38
src/flags.js
@@ -51,6 +51,8 @@ Flags.init = function (callback) {
|
||||
cid: function (sets, orSets, key) {
|
||||
prepareSets(sets, orSets, 'flags:byCid:', key);
|
||||
},
|
||||
page: function () { /* noop */ },
|
||||
perPage: function () { /* noop */ },
|
||||
quick: function (sets, orSets, key, uid) {
|
||||
switch (key) {
|
||||
case 'mine':
|
||||
@@ -121,14 +123,16 @@ Flags.list = function (filters, uid, callback) {
|
||||
var sets = [];
|
||||
var orSets = [];
|
||||
|
||||
if (Object.keys(filters).length > 0) {
|
||||
for (var type in filters) {
|
||||
if (filters.hasOwnProperty(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);
|
||||
}
|
||||
// Default filter
|
||||
filters.page = filters.hasOwnProperty('page') ? Math.abs(parseInt(filters.page, 10) || 1) : 1;
|
||||
filters.perPage = filters.hasOwnProperty('perPage') ? Math.abs(parseInt(filters.perPage, 10) || 20) : 20;
|
||||
|
||||
for (var type in filters) {
|
||||
if (filters.hasOwnProperty(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) {
|
||||
// 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.waterfall([
|
||||
async.apply(db.getObject, 'flag:' + flagId),
|
||||
@@ -206,13 +215,20 @@ Flags.list = function (filters, uid, callback) {
|
||||
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', {
|
||||
flags: flags,
|
||||
page: filters.page,
|
||||
}, function (err, data) {
|
||||
next(err, data.flags);
|
||||
next(err, {
|
||||
flags: data.flags,
|
||||
page: data.page,
|
||||
pageCount: pageCount,
|
||||
});
|
||||
});
|
||||
},
|
||||
], callback);
|
||||
|
||||
Reference in New Issue
Block a user