differentiate between report reason and ban reason, improve actions form, renamed some stuff

merge-requests/208/head
fatchan 5 years ago
parent ff4f6c4758
commit e80e9e4452
  1. 22
      controllers/forms.js
  2. 2
      controllers/pages.js
  3. 2
      db/accounts.js
  4. 4
      db/bans.js
  5. 2
      db/boards.js
  6. 10
      db/posts.js
  7. 2
      db/trips.js
  8. 2
      models/forms/ban-poster.js
  9. 2
      models/forms/report-post.js
  10. 14
      models/pages/globalmanage.js
  11. 8
      models/pages/manage.js
  12. 2
      server.js
  13. 36
      static/css/style.css
  14. 57
      views/includes/deletefooter.pug
  15. 4
      views/mixins/post.pug
  16. 3
      views/pages/board.pug
  17. 30
      views/pages/globalmanage.pug
  18. 7
      views/pages/manage.pug
  19. 1
      views/pages/thread.pug
  20. 2
      wipe.js

@ -154,9 +154,12 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a
if (req.body.password && req.body.password.length > 50) {
errors.push('Password must be 50 characters or less');
}
if (req.body.reason && req.body.reason.length > 50) {
if (req.body.report_reason && req.body.report_reason.length > 50) {
errors.push('Report must be 50 characters or less');
}
if (req.body.ban_reason && req.body.ban_reason.length > 50) {
errors.push('Ban reason must be 50 characters or less');
}
if (!(req.body.report
|| req.body.delete
|| req.body.dismiss
@ -165,12 +168,9 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a
|| req.body.global_ban)) {
errors.push('Invalid actions selected')
}
if (req.body.report && (!req.body.reason || req.body.reason.length === 0)) {
if (req.body.report && (!req.body.report_reason || req.body.report_reason.length === 0)) {
errors.push('Reports must have a reason')
}
if ((req.body.ban || req.body.global_ban) && (!req.body.reason || req.body.reason.length === 0)) {
errors.push('Bans must have a reason')
}
if (errors.length > 0) {
return res.status(400).render('message', {
@ -266,5 +266,17 @@ router.post('/board/:board/unban', Boards.exists, banCheck, hasPerms, numberConv
});
router.post('/global/actions', hasPerms, numberConverter, async(req, res, next) => {
//TODO
});
router.post('/global/unban', hasPerms, numberConverter, async(req, res, next) => {
//TODO
});
module.exports = router;

@ -2,7 +2,7 @@
const express = require('express')
, router = express.Router()
, Boards = require(__dirname+'/../db-models/boards.js')
, Boards = require(__dirname+'/../db/boards.js')
, hasPerms = require(__dirname+'/../helpers/haspermsmiddleware.js')
, isLoggedIn = require(__dirname+'/../helpers/isloggedin.js')
, numberConverter = require(__dirname+'/../helpers/number-converter.js')

@ -1,7 +1,7 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('accounts')
, bcrypt = require('bcrypt');

@ -1,7 +1,7 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('bans');
module.exports = {
@ -26,7 +26,7 @@ module.exports = {
}).toArray();
},
getAll: () => { // for a global ban manage page maybe? still TODO
getAllBans: () => {
return db.find({}).toArray();
},

@ -1,6 +1,6 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan');
module.exports = {

@ -1,6 +1,6 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
const Mongo = require(__dirname+'/db.js')
, Boards = require(__dirname+'/boards.js')
, db = Mongo.client.db('jschan').collection('posts');
@ -246,14 +246,6 @@ module.exports = {
'reports.0': {
'$exists': true
}
}, {
'projection': {
'salt': 0,
'password': 0,
'ip': 0,
}
}).sort({
'board': 1
}).toArray();
},

@ -1,6 +1,6 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('tripcodes');
module.exports = {

@ -24,7 +24,7 @@ module.exports = async (req, res, next, board, checkedPosts) => {
const bans = posts.map(post => {
return {
'ip': post.ip,
'reason': req.body.reason || 'No reason specified',
'reason': req.body.ban_reason || 'No reason specified',
'board': board,
'post': req.body.preserve_post ? post : null,
'issuer': req.session.user.username,

@ -6,7 +6,7 @@ module.exports = async (req, res, next) => {
const ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
const report = {
'reason': req.body.reason,
'reason': req.body.report_reason,
'date': new Date(),
'ip': ip
}

@ -1,20 +1,24 @@
'use strict';
const Posts = require(__dirname+'/../../db/posts.js');
const Posts = require(__dirname+'/../../db/posts.js')
, Bans = require(__dirname+'/../../db/bans.js');
module.exports = async (req, res, next) => {
let posts;
let reports;
let bans;
try {
posts = await Posts.getAllReports();
reports = await Posts.getAllReports();
bans = await Bans.getAllBans();
} catch (err) {
return next(err);
return next(err)
}
//render the page
res.render('globalmanage', {
csrf: req.csrfToken(),
posts: posts
reports,
bans,
});
}

@ -5,10 +5,10 @@ const Posts = require(__dirname+'/../../db/posts.js')
module.exports = async (req, res, next) => {
let posts;
let reports;
let bans;
try {
posts = await Posts.getReports(req.params.board);
reports = await Posts.getReports(req.params.board);
bans = await Bans.getBoardBans(req.params.board);
} catch (err) {
return next(err)
@ -17,8 +17,8 @@ module.exports = async (req, res, next) => {
//render the page
res.render('manage', {
csrf: req.csrfToken(),
posts: posts,
bans: bans || [],
reports,
bans,
});
}

@ -13,7 +13,7 @@ const express = require('express')
, bodyParser = require('body-parser')
, cookieParser = require('cookie-parser')
, configs = require(__dirname+'/configs/main.json')
, Mongo = require(__dirname+'/helpers/db.js')
, Mongo = require(__dirname+'/db/db.js')
, upload = require('express-fileupload');
(async () => {

@ -9,6 +9,10 @@ body {
margin: 0;
}
.pages a {
text-decoration: none;
}
object {
object-fit: scale-down;
}
@ -57,9 +61,9 @@ object {
.catalog {
display:flex;
flex-direction: row;
align-items:flex-start;
flex-wrap: wrap;
justify-content: space-evenly;
flex-flow: row wrap;
}
.spoiler {
@ -126,13 +130,26 @@ input, textarea {
margin: 10px 0;
}
.actions {
background: #D6DAF0;
border-color: #B7C5D9;
border-width: 0 1px 1px 0;
border-style: none solid solid none;
max-width: 100%;
display: flex;
flex-direction: column;
margin: 2px 0;
padding: 2px;
}
.action-wrapper {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.action-wrapper * {
margin: 3px 0;
.actions label {
margin: 2px 0;
}
.form-post {
@ -211,7 +228,8 @@ input textarea {
}
.post-container, .ban {
margin: 1px;
box-sizing: border-box;
margin: 2px 0;
padding: 2px;
background: #D6DAF0;
border-color: #B7C5D9;
@ -242,7 +260,7 @@ input textarea {
font-weight: bold;
}
.post-container.op .post-info {
.post-container.op .post-info, .catalog-tile-content .post-info {
background: none;
}
@ -320,10 +338,6 @@ hr {
@media only screen and (max-width: 800px) {
body {
/*font-size: 14pt;*/
}
input {
height: 30px;
}
@ -352,8 +366,6 @@ hr {
.catalog-tile {
overflow-y: hidden;
width: 49%;
justify-content: space-evenly;
}
.boards-table {

@ -1,25 +1,32 @@
.action-wrapper Actions:
label
input.post-check(type='checkbox', name='delete' value=1)
| Delete Post
label
input.post-check(type='checkbox', name='spoiler' value=1)
| Spoiler Images
label
input#password(type='text', name='password', placeholder='post password' autocomplete='off')
.action-wrapper Mod Actions:
label
input.post-check(type='checkbox', name='dismiss' value=1)
| Dismiss Reports
label
input.post-check(type='checkbox', name='ban' value=1)
| Ban Poster
label
input.post-check(type='checkbox', name='global_ban' value=1)
| Global Ban Poster
label
input.post-check(type='checkbox', name='preserve_post' value=1)
| Show Post In Ban
label
input#report(type='text', name='reason', placeholder='ban reason' autocomplete='off')
input(type='submit', value='submit')
.action-wrapper
.actions Actions:
label
input.post-check(type='checkbox', name='delete' value=1)
| Delete Post
label
input.post-check(type='checkbox', name='spoiler' value=1)
| Spoiler Images
label
input#password(type='text', name='password', placeholder='post password' autocomplete='off')
label
input.post-check(type='checkbox', name='report' value=1)
| Report Post
label
input#report(type='text', name='report_reason', placeholder='report reason' autocomplete='off')
.actions Mod Actions:
label
input.post-check(type='checkbox', name='dismiss' value=1)
| Dismiss Reports
label
input.post-check(type='checkbox', name='ban' value=1)
| Ban Poster
label
input.post-check(type='checkbox', name='global_ban' value=1)
| Global Ban Poster
label
input.post-check(type='checkbox', name='preserve_post' value=1)
| Show Post In Ban
label
input#report(type='text', name='ban_reason', placeholder='ban reason' autocomplete='off')
input(type='submit', value='submit')

@ -12,7 +12,7 @@ mixin post(post, truncate, showreports)
span.post-name #{post.name}
span #{post.date.toLocaleString()}
span.user-id(style=`background: #${post.userId}`) #{post.userId}
span: a(href=`/${post.board}/thread/${post.thread ? post.thread : post.postId}#${post.postId}`) ##{post.postId}
span: a(href=`/${post.board}/thread/${post.thread || post.postId}#${post.postId}`) ##{post.postId}
if post.files.length > 0
.post-files
each file in post.files
@ -40,7 +40,7 @@ mixin post(post, truncate, showreports)
}
if truncated
blockquote.post-message !{truncatedMessage}
p Message too long. #[a(href=`/${post.board}/thread/${post.thread == null ? post.postId : post.thread}#${post.postId}`) Click here] to view the full text.
p Message too long. #[a(href=`/${post.board}/thread/${post.thread || post.postId}#${post.postId}`) Click here] to view the full text.
else
blockquote.post-message !{post.message}
else

@ -6,7 +6,6 @@ block head
block content
include ../includes/boardheader.pug
hr(size=1)
include ../includes/postform.pug
.mode Posting mode: Thread [#[a.no-decoration(href=`/${board._id}/catalog`) Catalog]]
hr(size=1)
@ -22,7 +21,7 @@ block content
+post(thread, true)
for post in thread.replies
+post(post, true)
hr(size=1)
hr(size=1)
include ../includes/pages.pug
hr(size=1)
include ../includes/deletefooter.pug

@ -1,11 +1,35 @@
extends ../layout.pug
include ../mixins/post.pug
include ../mixins/ban.pug
block head
title Manage
block content
h1.board-title Global Management
hr(size=1)
p under construction
h4 All Reports:
form(action=`/forms/global/actions` method='POST' enctype='application/x-www-form-urlencoded')
input(type='hidden' name='_csrf' value=csrf)
if reports.length === 0
p No reports.
hr(size=1)
else
for report in reports
section.thread
+post(report, false, true)
hr(size=1)
include ../includes/deletefooter.pug
hr(size=1)
h4 All Bans:
form(action=`/forms/global/unban` method='POST' enctype='application/x-www-form-urlencoded')
input(type='hidden' name='_csrf' value=csrf)
if bans.length === 0
p No bans.
hr(size=1)
else
for ban in bans
section.thread
+ban(ban)
hr(size=1)
section.action-wrapper
input(type='submit', value='unban')

@ -7,17 +7,16 @@ block head
block content
include ../includes/boardheader.pug
hr(size=1)
h4 Reports:
form(action=`/forms/board/${board._id}/actions` method='POST' enctype='application/x-www-form-urlencoded')
input(type='hidden' name='_csrf' value=csrf)
if posts.length === 0
if reports.length === 0
p No reports.
hr(size=1)
else
for post in posts
for report in reports
section.thread
+post(post, false, true)
+post(report, false, true)
hr(size=1)
include ../includes/deletefooter.pug
hr(size=1)

@ -11,7 +11,6 @@ block head
block content
include ../includes/boardheader.pug
hr(size=1)
include ../includes/postform.pug
.mode Posting mode: Reply [#[a.no-decoration(href=`/${board._id}`) Go Back]]
hr(size=1)

@ -1,6 +1,6 @@
'use strict';
const Mongo = require(__dirname+'/helpers/db.js')
const Mongo = require(__dirname+'/db/db.js')
, util = require('util')
, path = require('path')
, fs = require('fs')

Loading…
Cancel
Save