early modview, somewhat scuffed

merge-requests/208/head
fatchan 4 years ago
parent f540d07e67
commit 529e6bfacc
  1. 2
      controllers/forms.js
  2. 10
      controllers/pages.js
  3. 7
      gulp/res/js/hover.js
  4. 10
      gulp/res/js/live.js
  5. 6
      models/forms/makepost.js
  6. 31
      models/pages/manage/board.js
  7. 2
      models/pages/manage/index.js
  8. 26
      models/pages/manage/thread.js
  9. 3
      views/includes/actionfooter_manage.pug
  10. 10
      views/includes/postform.pug
  11. 16
      views/mixins/managenav.pug
  12. 7
      views/mixins/post.pug
  13. 4
      views/pages/account.pug
  14. 28
      views/pages/board.pug
  15. 63
      views/pages/thread.pug

@ -75,7 +75,7 @@ const express = require('express')
//make new post
router.post('/board/:board/post', dnsblCheck, sessionRefresh, Boards.exists, calcPerms, banCheck, postFiles, paramConverter, verifyCaptcha, numFiles, makePostController);
//router.post('/board/:board/modpost', dnsblCheck, sessionRefresh, Boards.exists, calcPerms, banCheck, isLoggedIn, hasPerms(3), postFiles, paramConverter, csrf, numFiles, makePostController); //mod post has token instead of captcha
router.post('/board/:board/modpost', dnsblCheck, sessionRefresh, Boards.exists, calcPerms, banCheck, isLoggedIn, hasPerms(3), postFiles, paramConverter, csrf, numFiles, makePostController); //mod post has token instead of captcha
//post actions
router.post('/board/:board/actions', sessionRefresh, Boards.exists, calcPerms, banCheck, paramConverter, verifyCaptcha, actionController); //public, with captcha

@ -12,7 +12,7 @@ const express = require('express')
, sessionRefresh = require(__dirname+'/../helpers/sessionrefresh.js')
, csrf = require(__dirname+'/../helpers/checks/csrfmiddleware.js')
//page models
, { manageReports, manageBanners, manageSettings, manageBans } = require(__dirname+'/../models/pages/manage/')
, { manageReports, manageBanners, manageSettings, manageBans, manageBoard, manageThread } = require(__dirname+'/../models/pages/manage/')
, { globalManageSettings, globalManageReports, globalManageBans,
globalManageRecent, globalManageAccounts, globalManageNews, globalManageLogs } = require(__dirname+'/../models/pages/globalmanage/')
, { changePassword, home, register, login, logout, create,
@ -43,11 +43,9 @@ router.get('/:board/manage/reports.html', sessionRefresh, isLoggedIn, Boards.exi
router.get('/:board/manage/bans.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(3), csrf, manageBans);
router.get('/:board/manage/settings.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(2), csrf, manageSettings);
router.get('/:board/manage/banners.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(2), csrf, manageBanners);
/*
todo: dynamic mod pages with no captcha required for mod forms
router.get('/:board/manage/:page(1[0-9]{0,}|[2-9]{1,}|index).html', sessionRefresh, isLoggedIn, Boards.exists, paramConverter, calcPerms, hasPerms(2), csrf, manageBoard);
router.get('/:board/manage/thread/:id(\\d+).html', sessionRefresh, isLoggedIn, Boards.exists, paramConverter, calcPerms, hasPerms(2), csrf, manageThread);
*/
// if (mod view enabled) {
router.get('/:board/manage/:page(1[0-9]{0,}|[2-9]{1,}|index).html', sessionRefresh, isLoggedIn, Boards.exists, paramConverter, calcPerms, hasPerms(3), csrf, manageBoard);
router.get('/:board/manage/thread/:id(\\d+).html', sessionRefresh, isLoggedIn, Boards.exists, paramConverter, calcPerms, hasPerms(3), csrf, Posts.exists, manageThread);
//global manage pages
router.get('/globalmanage/reports.html', sessionRefresh, isLoggedIn, calcPerms, hasPerms(1), csrf, globalManageReports);

@ -62,7 +62,12 @@ window.addEventListener('DOMContentLoaded', (event) => {
const toggleHighlightPost = async function (e) {
hovering = e.type === 'mouseover';
const jsonPath = this.pathname.replace(/html$/, 'json');
let jsonParts = this.pathname.split('/');
let jsonPath;
if (jsonParts[2] === 'manage') {
jsonParts.splice(2,1);
jsonPath = `${jsonParts.join('/').replace(/\.html$/, '.json')}`;
}
if (!this.hash) {
return; //non-post number board quote
}

@ -83,7 +83,12 @@ window.addEventListener('settingsReady', function(event) { //after domcontentloa
window.dispatchEvent(newPostEvent);
}
const jsonPath = window.location.pathname.replace(/\.html$/, '.json');
let jsonParts = window.location.pathname.split('/');
let jsonPath;
if (jsonParts[2] === 'manage') {
jsonParts.splice(2,1);
jsonPath = `${jsonParts.join('/').replace(/\.html$/, '.json')}`;
}
const fetchNewPosts = async () => {
console.log('fetching posts from api');
updateLive('Fetching posts...', 'yellow');
@ -127,7 +132,7 @@ window.addEventListener('settingsReady', function(event) { //after domcontentloa
if (supportsWebSockets) {
updateButton.style.display = 'none';
const roomParts = window.location.pathname.replace(/\.html$/, '').split('/');
const room = `${roomParts[1]}-${roomParts[3]}`;
const room = `${roomParts[1]}-${roomParts[roomParts.length-1]}`;
socket = io({
transports: ['websocket'],
reconnectionAttempts: 5
@ -178,7 +183,6 @@ window.addEventListener('settingsReady', function(event) { //after domcontentloa
socket.close();
supportsWebSockets = false;
enableLive();
});
socket.on('newPost', newPost);
} else {

@ -466,7 +466,7 @@ module.exports = async (req, res, next) => {
}
}
const successRedirect = `/${req.params.board}/thread/${req.body.thread || postId}.html#${postId}`;
const successRedirect = `/${req.params.board}/${req.path.endsWith('/modpost') ? 'manage/' : ''}thread/${req.body.thread || postId}.html#${postId}`;
const buildOptions = {
'threadId': data.thread || postId,
@ -475,7 +475,7 @@ module.exports = async (req, res, next) => {
if (req.headers['x-using-live'] != null && data.thread) {
//defer build and post will come live
res.json({
res.json({
'postId': postId,
'redirect': successRedirect
});
@ -487,7 +487,7 @@ module.exports = async (req, res, next) => {
//build immediately and refresh when built
await buildThread(buildOptions);
if (req.headers['x-using-xhr'] != null) {
res.json({
res.json({
'postId': postId,
'redirect': successRedirect
});

@ -0,0 +1,31 @@
'use strict';
const Posts = require(__dirname+'/../../../db/posts.js');
module.exports = async (req, res, next) => {
const page = req.params.page === 'index' ? 1 : Number(req.params.page);
let maxPage;
let threads;
try {
maxPage = Math.min(Math.ceil((await Posts.getPages(req.params.board)) / 10), Math.ceil(res.locals.board.settings.threadLimit/10)) || 1;
if (page > maxPage) {
return next();
}
threads = await Posts.getRecent(req.params.board, page);
} catch (err) {
return next(err);
}
res
.set('Cache-Control', 'private, max-age=5')
.render('board', {
modview: true,
page,
maxPage,
threads,
board: res.locals.board,
csrf: req.csrfToken(),
});
}

@ -5,4 +5,6 @@ module.exports = {
manageSettings: require(__dirname+'/settings.js'),
manageBans: require(__dirname+'/bans.js'),
manageBanners: require(__dirname+'/banners.js'),
manageBoard: require(__dirname+'/board.js'),
manageThread: require(__dirname+'/thread.js'),
}

@ -0,0 +1,26 @@
'use strict';
const Posts = require(__dirname+'/../../../db/posts.js');
module.exports = async (req, res, next) => {
let thread;
try {
thread = await Posts.getThread(res.locals.board._id, res.locals.thread.postId);
if (!thread) {
return next(); //deleted between exists
}
} catch (err) {
return next(err);
}
res
.set('Cache-Control', 'private, max-age=5')
.render('thread', {
modview: true,
board: res.locals.board,
thread,
csrf: req.csrfToken(),
});
}

@ -16,6 +16,9 @@ details.toggle-label
| Global Report
label
input#report(type='text', name='report_reason', placeholder='report reason' autocomplete='off')
label
input.post-check(type='checkbox', name='delete_ip_thread' value='1')
| Delete from IP in thread
label
input.post-check(type='checkbox', name='delete_ip_board' value='1')
| Delete from IP on board

@ -3,11 +3,13 @@
- const messageRequired = (!isThread && board.settings.forceThreadMessage) || (isThread && board.settings.forceReplyMessage);
- const fileRequired = (!isThread && board.settings.forceThreadFile) || (isThread && board.settings.forceReplyFile);
section.form-wrapper.flex-center
form.form-post#postform(action=`/forms/board/${board._id}/post`, enctype='multipart/form-data', method='POST')
form.form-post#postform(action=`/forms/board/${board._id}/${modview ? 'mod' : ''}post`, enctype='multipart/form-data', method='POST')
if modview
input(type='hidden' name='_csrf' value=csrf)
input(type='hidden' name='thread' value=isThread ? thread.postId : null)
section.row.jsonly
.noselect#dragHandle
if board.settings.forceAnon
if board.settings.forceAnon && !modview
section.row
.label Sage
label.postform-style.ph-5
@ -49,11 +51,11 @@ section.form-wrapper.flex-center
label.postform-style.ph-5.ml-1.fh
input(type='checkbox', name='spoiler', value='true')
| Spoiler
if board.settings.userPostSpoiler || board.settings.userPostDelete || board.settings.userPostUnlink
if board.settings.userPostSpoiler || board.settings.userPostDelete || board.settings.userPostUnlink || modview
section.row
.label Password
input(type='password', name='postpassword', autocomplete='off' placeholder='password to delete/spoiler/unlink later' maxlength='50')
if (board.settings.captchaMode === 1 && !isThread) || board.settings.captchaMode === 2
if ((board.settings.captchaMode === 1 && !isThread) || board.settings.captchaMode === 2) && !modview
section.row
.label
span Captcha

@ -1,10 +1,16 @@
mixin managenav(selected)
mixin managenav(selected, upLevel)
nav.pages
a(href='reports.html' class=(selected === 'reports' ? 'bold' : '')) [Reports]
if selected === 'index'
include ../includes/boardpages.pug
|
else
a(href=`${upLevel ? '../' : ''}index.html` class=(selected === 'index' ? 'bold' : '')) [Mod Index]
|
a(href=`${upLevel ? '../' : ''}reports.html` class=(selected === 'reports' ? 'bold' : '')) [Reports]
|
a(href='bans.html' class=(selected === 'bans' ? 'bold' : '')) [Bans]
a(href=`${upLevel ? '../' : ''}bans.html` class=(selected === 'bans' ? 'bold' : '')) [Bans]
|
if permLevel < 3
a(href='settings.html' class=(selected === 'settings' ? 'bold' : '')) [Settings]
a(href=`${upLevel ? '../' : ''}settings.html` class=(selected === 'settings' ? 'bold' : '')) [Settings]
|
a(href='banners.html' class=(selected === 'banners' ? 'bold' : '')) [Banners]
a(href=`${upLevel ? '../' : ''}banners.html` class=(selected === 'banners' ? 'bold' : '')) [Banners]

@ -2,7 +2,7 @@ include ./report.pug
mixin post(post, truncate, manage=false, globalmanage=false, ban=false)
.anchor(id=post.postId)
div(class=`post-container ${post.thread || ban === true ? '' : 'op'}` data-board=post.board data-post-id=post.postId data-user-id=post.userId)
- const postURL = `/${post.board}/thread/${post.thread || post.postId}.html`;
- const postURL = `/${post.board}/${modview ? 'manage/' : ''}thread/${post.thread || post.postId}.html`;
.post-info
span.noselect
label
@ -80,6 +80,7 @@ mixin post(post, truncate, manage=false, globalmanage=false, ban=false)
img.file-thumb(src=`/img/thumb-${file.hash}${file.thumbextension}` height=file.geometry.thumbheight width=file.geometry.thumbwidth)
else
img.file-thumb(src=`/img/${file.filename}` height=file.geometry.height width=file.geometry.width)
- if (post.message && modview) { post.message = post.message.replace(new RegExp(`<a class="quote" href="/${post.board}`, 'g'), `<a class="quote" href="/${post.board}/manage`); } //quick & dirty solution to a bigger problem/design issue
- let truncatedMessage = post.message;
if post.message
if truncate
@ -112,7 +113,7 @@ mixin post(post, truncate, manage=false, globalmanage=false, ban=false)
if post.previewbacklinks.length > 0
div.replies.mt-5.ml-5 Replies:
each backlink in post.previewbacklinks
a.quote(href=`/${post.board}/thread/${post.thread || post.postId}.html#${backlink.postId}`) &gt;&gt;#{backlink.postId}
a.quote(href=`${postURL}#${backlink.postId}`) &gt;&gt;#{backlink.postId}
|
if post.previewbacklinks.length < post.backlinks.length
- const ombls = post.backlinks.length-post.previewbacklinks.length;
@ -120,7 +121,7 @@ mixin post(post, truncate, manage=false, globalmanage=false, ban=false)
else if post.backlinks && post.backlinks.length > 0
div.replies.mt-5.ml-5 Replies:
each backlink in post.backlinks
a.quote(href=`/${post.board}/thread/${post.thread || post.postId}.html#${backlink.postId}`) &gt;&gt;#{backlink.postId}
a.quote(href=`${postURL}#${backlink.postId}`) &gt;&gt;#{backlink.postId}
|
if manage === true
each r in post.reports

@ -25,6 +25,8 @@ block content
li
a(href=`/${b}/index.html`) /#{b}/
| -
a(href=`/${b}/manage/index.html`) Mod Index
| ,
a(href=`/${b}/manage/reports.html`) Reports
| ,
a(href=`/${b}/manage/bans.html`) Bans
@ -42,6 +44,8 @@ block content
li
a(href=`/${b}/index.html`) /#{b}/
| -
a(href=`/${b}/manage/index.html`) Mod Index
| ,
a(href=`/${b}/manage/reports.html`) Reports
| ,
a(href=`/${b}/manage/bans.html`) Bans

@ -1,6 +1,7 @@
extends ../layout.pug
include ../mixins/post.pug
include ../mixins/boardnav.pug
include ../mixins/managenav.pug
include ../mixins/boardheader.pug
block head
@ -8,16 +9,19 @@ block head
title /#{board._id}/ - #{board.settings.name} - page #{page}
block content
+boardheader()
+boardheader(modview ? 'Mod View' : null)
br
include ../includes/postform.pug
br
include ../includes/announcements.pug
include ../includes/stickynav.pug
.pages
include ../includes/boardpages.pug
+boardnav(null, false, false)
form(action='/forms/board/'+board._id+'/actions' method='POST' enctype='application/x-www-form-urlencoded')
if modview
+managenav('index')
else
.pages
include ../includes/boardpages.pug
+boardnav(null, false, false)
form(action=`/forms/board/${board._id}/${modview ? 'mod' : ''}actions` method='POST' enctype='application/x-www-form-urlencoded')
hr(size=1)
if threads.length === 0
p No posts.
@ -28,7 +32,13 @@ block content
for post in thread.replies
+post(post, true)
hr(size=1)
.pages
include ../includes/boardpages.pug
+boardnav(null, false, false)
include ../includes/actionfooter.pug
if modview
+managenav('index')
else
.pages
include ../includes/boardpages.pug
+boardnav(null, false, false)
if modview
include ../includes/actionfooter_manage.pug
else
include ../includes/actionfooter.pug

@ -1,42 +1,47 @@
extends ../layout.pug
include ../mixins/post.pug
include ../mixins/boardnav.pug
include ../mixins/managenav.pug
include ../mixins/boardheader.pug
block head
script(src='/js/all.js')
title /#{board._id}/ - #{thread.subject||thread.postId}
meta(property='og:site_name', value=meta.siteName)
meta(property='og:title', content=thread.subject)
meta(property='og:url', content=meta.url)
meta(property='og:description', content=thread.nomarkup)
if thread.files.length > 0
if thread.spoiler
meta(property='og:image', content='/img/spoiler.png')
else
- const file = thread.files[0];
- const maintype = file.mimetype.split('/')[0];
case maintype
when 'image'
meta(property='og:image', content=`/img/${file.filename}`)
when 'video'
meta(property='og:video', content=`/img/${file.filename}`)
when 'audio'
meta(property='og:audio', content=`/img/${file.filename}`)
default
- break
if !modview
meta(property='og:site_name', value=meta.siteName)
meta(property='og:title', content=thread.subject)
meta(property='og:url', content=meta.url)
meta(property='og:description', content=thread.nomarkup)
if thread.files.length > 0
if thread.spoiler
meta(property='og:image', content='/img/spoiler.png')
else
- const file = thread.files[0];
- const maintype = file.mimetype.split('/')[0];
case maintype
when 'image'
meta(property='og:image', content=`/img/${file.filename}`)
when 'video'
meta(property='og:video', content=`/img/${file.filename}`)
when 'audio'
meta(property='og:audio', content=`/img/${file.filename}`)
default
- break
block content
+boardheader()
+boardheader(modview ? 'Mod View' : null)
br
include ../includes/postform.pug
br
include ../includes/announcements.pug
include ../includes/stickynav.pug
.pages
+boardnav(null, true, true)
if modview
+managenav(null, true)
else
.pages
+boardnav(null, true, true)
- const uids = board.settings.ids ? new Set() : void 0;
form(action=`/forms/board/${board._id}/actions` method='POST' enctype='application/x-www-form-urlencoded')
form(action=`/forms/board/${board._id}/${modview ? 'mod' : ''}actions` method='POST' enctype='application/x-www-form-urlencoded')
hr(size=1)
.thread
- uids && thread.userId && uids.add(thread.userId)
@ -46,8 +51,11 @@ block content
+post(post)
hr(size=1)
.statwrap
.pages
+boardnav(null, true, true)
if modview
+managenav(null, true)
else
.pages
+boardnav(null, true, true)
#threadstats
span #{thread.replyposts} repl#{thread.replyposts === 1 ? 'y' : 'ies'}
| |
@ -59,4 +67,7 @@ block content
.dot#livecolor
| Connecting...
input.postform-style.ml-5.di(type='button' value='Update')
include ../includes/actionfooter.pug
if modview
include ../includes/actionfooter_manage.pug
else
include ../includes/actionfooter.pug

Loading…
Cancel
Save