diff --git a/helpers/checks/actionchecker.js b/helpers/checks/actionchecker.js index dad87614..06f4cf48 100644 --- a/helpers/checks/actionchecker.js +++ b/helpers/checks/actionchecker.js @@ -34,8 +34,8 @@ module.exports = (req, res) => { for (let i = 0; i < actions.length; i++) { const action = actions[i]; - const bodyHasAction = req.body[action.name]; - if (bodyHasAction) { + const bodyAction = req.body[action.name]; + if (bodyAction != null) { validActions.push(action.name); if (action.global) { numGlobal++; diff --git a/helpers/paramconverter.js b/helpers/paramconverter.js index 5d5801eb..1ae6502a 100644 --- a/helpers/paramconverter.js +++ b/helpers/paramconverter.js @@ -5,7 +5,7 @@ const { ObjectId } = require(__dirname+'/../db/db.js') 'checkedreports', 'checkedbans', 'checkedbanners', 'checkedaccounts', 'countries']) //only these should be arrays, since express bodyparser can output arrays , trimFields = ['tags', 'uri', 'moderators', 'filters', 'announcement', 'description', 'message', 'name', 'subject', 'email', 'postpassword', 'password', 'default_name', 'report_reason', 'ban_reason', 'log_message', 'custom_css'] //trim if we dont want filed with whitespace - , numberFields = ['lock_reset', 'captcha_reset', 'filter_mode', 'lock_mode', 'message_r9k_mode', 'file_r9k_mode', 'captcha_mode', + , numberFields = ['sticky', 'lock_reset', 'captcha_reset', 'filter_mode', 'lock_mode', 'message_r9k_mode', 'file_r9k_mode', 'captcha_mode', 'tph_trigger', 'pph_trigger', 'pph_trigger_action', 'tph_trigger_action', 'bump_limit', 'reply_limit', 'move_to_thread', 'postId', 'max_files', 'thread_limit', 'thread', 'max_thread_message_length', 'max_reply_message_length', 'min_thread_message_length', 'min_reply_message_length', 'auth_level'] //convert these to numbers before they hit our routes , banDurationRegex = /^(?[\d]+y)?(?[\d]+mo)?(?[\d]+w)?(?[\d]+d)?(?[\d]+h)?(?[\d]+m)?(?[\d]+s)?$/ @@ -47,7 +47,7 @@ module.exports = (req, res, next) => { for (let i = 0; i < numberFields.length; i++) { const field = numberFields[i]; - if (req.body[field]) { + if (req.body[field] != null) { const num = parseInt(req.body[field]); if (Number.isSafeInteger(num)) { req.body[field] = num; diff --git a/models/forms/actionhandler.js b/models/forms/actionhandler.js index a23deeb1..fb67ced1 100644 --- a/models/forms/actionhandler.js +++ b/models/forms/actionhandler.js @@ -208,8 +208,8 @@ module.exports = async (req, res, next) => { } messages.push(message); } - if (req.body.sticky) { - const { message, action, query } = stickyPosts(res.locals.posts); + if (req.body.sticky != null) { + const { message, action, query } = stickyPosts(res.locals.posts, req.body.sticky); if (action) { modlogActions.push('Sticky'); combinedQuery[action] = { ...combinedQuery[action], ...query} diff --git a/models/forms/makepost.js b/models/forms/makepost.js index 6b763bc6..df507771 100644 --- a/models/forms/makepost.js +++ b/models/forms/makepost.js @@ -468,8 +468,9 @@ module.exports = async (req, res, next) => { Object.assign(data, { 'replyposts': 0, 'replyfiles': 0, - //NOTE: these are numbers because we XOR them for toggling in action handler + //NOTE: sticky is a number, 0 = not sticky, higher numbers are a priority and will be sorted in descending order 'sticky': Mongo.NumberInt(0), + //NOTE: these are numbers because we XOR them for toggling in action handler 'locked': Mongo.NumberInt(0), 'bumplocked': Mongo.NumberInt(0), 'cyclic': Mongo.NumberInt(0), diff --git a/models/forms/stickyposts.js b/models/forms/stickyposts.js index b20ac29e..788752ca 100644 --- a/models/forms/stickyposts.js +++ b/models/forms/stickyposts.js @@ -2,7 +2,7 @@ const { NumberInt } = require(__dirname+'/../../db/db.js') -module.exports = (posts) => { +module.exports = (posts, sticky) => { const filteredposts = posts.filter(post => { return !post.thread @@ -14,13 +14,13 @@ module.exports = (posts) => { }; } + const stickyValue = NumberInt(sticky); + return { - message: `Toggled sticky for ${filteredposts.length} thread(s)`, - action: '$bit', + message: `Set sticky for ${filteredposts.length} thread(s) to ${sticky}`, + action: '$set', query: { - 'sticky': { - 'xor': NumberInt(1) - }, + 'sticky': stickyValue, } }; diff --git a/views/includes/actionfooter_manage.pug b/views/includes/actionfooter_manage.pug index 4630d415..ff48158b 100644 --- a/views/includes/actionfooter_manage.pug +++ b/views/includes/actionfooter_manage.pug @@ -74,8 +74,7 @@ details.toggle-label#actionform input.post-check(type='checkbox', name='edit' value='1') | Edit Post label - input.post-check(type='checkbox', name='sticky' value='1') - | Toggle Sticky + input(type='text', name='sticky' placeholder='Sticky priority, 0 = unsticky') label input.post-check(type='checkbox', name='lock' value='1') | Toggle Lock