feat: flags list sorting, closes #8569

This commit is contained in:
Julian Lam
2020-08-18 21:03:59 -04:00
parent cabe62a06c
commit 346db0d84d
4 changed files with 68 additions and 16 deletions

View File

@@ -18,18 +18,23 @@ const modsController = module.exports;
modsController.flags = {};
modsController.flags.list = async function (req, res, next) {
let validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick', 'page', 'perPage'];
const validFilters = ['assignee', 'state', 'reporterId', 'type', 'targetUid', 'cid', 'quick', 'page', 'perPage'];
const validSorts = ['newest', 'oldest', 'reports'];
// Reset filters if explicitly requested
if (parseInt(req.query.reset, 10) === 1) {
delete req.session.flags_filters;
delete req.session.flags_sort;
}
const [isAdminOrGlobalMod, moderatedCids, data] = await Promise.all([
const results = await Promise.all([
user.isAdminOrGlobalMod(req.uid),
user.getModeratedCids(req.uid),
plugins.fireHook('filter:flags.validateFilters', { filters: validFilters }),
plugins.fireHook('filter:flags.validateSort', { sorts: validSorts }),
]);
const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results;
let [,, { filters }] = results;
if (!(isAdminOrGlobalMod || !!moderatedCids.length)) {
return next(new Error('[[error:no-privileges]]'));
@@ -39,10 +44,8 @@ modsController.flags.list = async function (req, res, next) {
res.locals.cids = moderatedCids;
}
validFilters = data.filters;
// Parse query string params for filters
let filters = validFilters.reduce(function (memo, cur) {
// Parse query string params for filters, eliminate non-valid filters
filters = filters.reduce(function (memo, cur) {
if (req.query.hasOwnProperty(cur)) {
memo[cur] = req.query[cur];
}
@@ -71,15 +74,32 @@ modsController.flags.list = async function (req, res, next) {
}
// Pagination doesn't count as a filter
if (Object.keys(filters).length === 1 && filters.hasOwnProperty('page')) {
if (
(Object.keys(filters).length === 1 && filters.hasOwnProperty('page')) ||
(Object.keys(filters).length === 2 && filters.hasOwnProperty('page') && filters.hasOwnProperty('perPage'))
) {
hasFilter = false;
}
// Save filters into session unless removed
// Parse sort from query string
let sort;
if (!req.query.sort && req.session.hasOwnProperty('flags_sort')) {
sort = req.session.flags_sort;
} else {
sort = sorts.includes(req.query.sort) ? req.query.sort : null;
}
hasFilter = hasFilter || !!sort;
// Save filters and sorting into session unless removed
req.session.flags_filters = filters;
req.session.flags_sort = sort;
const [flagsData, analyticsData, categoriesData] = await Promise.all([
flags.list(filters, req.uid),
flags.list({
filters: filters,
sort: sort,
uid: req.uid,
}),
analytics.getDailyStatsForSet('analytics:flags', Date.now(), 30),
categories.buildForSelect(req.uid, 'read'),
]);
@@ -90,6 +110,7 @@ modsController.flags.list = async function (req, res, next) {
categories: filterCategories(res.locals.cids, categoriesData),
hasFilter: hasFilter,
filters: filters,
sort: sort || 'newest',
title: '[[pages:flags]]',
pagination: pagination.create(flagsData.page, flagsData.pageCount, req.query),
breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[pages:flags]]' }]),