mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-05-06 19:36:41 +02:00
feat: flags list sorting, closes #8569
This commit is contained in:
@@ -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]]' }]),
|
||||
|
||||
Reference in New Issue
Block a user