diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index d05a5b25a8..35fc87011a 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -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", diff --git a/src/controllers/mods.js b/src/controllers/mods.js index 69bfd7fbbf..52403a5950 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -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); diff --git a/src/flags.js b/src/flags.js index 8ea298b8e8..d508568329 100644 --- a/src/flags.js +++ b/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);