From ebf0b603f51512d59860eec2686f7c0eceae71ca Mon Sep 17 00:00:00 2001 From: fatchan Date: Mon, 24 Jun 2019 13:55:45 +0000 Subject: [PATCH] public banner page for board and rebuilds when board banners updated in manage page --- build.js | 7 +++++++ controllers/pages.js | 8 ++++++-- gulp/res/css/style.css | 6 +++++- models/forms/deletebanners.js | 15 +++++++++++++-- models/forms/uploadbanners.js | 12 ++++++++++-- models/pages/banners.js | 29 ++++++++--------------------- models/pages/randombanner.js | 29 +++++++++++++++++++++++++++++ views/includes/bannersheader.pug | 2 ++ views/includes/boardheader.pug | 2 +- views/includes/catalogheader.pug | 2 +- views/includes/pages.pug | 16 +++------------- views/includes/postform.pug | 1 + views/mixins/post.pug | 2 +- views/pages/banners.pug | 14 ++++++++++++++ views/pages/board.pug | 2 +- views/pages/manage.pug | 2 +- 16 files changed, 103 insertions(+), 46 deletions(-) create mode 100644 models/pages/randombanner.js create mode 100644 views/includes/bannersheader.pug create mode 100644 views/pages/banners.pug diff --git a/build.js b/build.js index 7803982c..4ffdc2fb 100644 --- a/build.js +++ b/build.js @@ -36,6 +36,13 @@ function addBacklinks(thread, preview) { //preview means this is not the full th module.exports = { + buildBanners: async(board) => { +console.log('building banners', `${board._id}/banners.html`); + return render(`${board._id}/banners.html`, 'banners.pug', { + board: board + }); + }, + buildCatalog: async (board) => { console.log('building catalog', `${board._id}/catalog.html`); if (!board._id) { diff --git a/controllers/pages.js b/controllers/pages.js index d121b0aa..36c91d29 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -18,6 +18,7 @@ const express = require('express') , board = require(__dirname+'/../models/pages/board.js') , catalog = require(__dirname+'/../models/pages/catalog.js') , banners = require(__dirname+'/../models/pages/banners.js') + , randombanner = require(__dirname+'/../models/pages/randombanner.js') , captchaPage = require(__dirname+'/../models/pages/captchapage.js') , captcha = require(__dirname+'/../models/pages/captcha.js') , thread = require(__dirname+'/../models/pages/thread.js'); @@ -50,12 +51,15 @@ router.get('/logout', (req, res, next) => { router.get('/captcha', captcha); // random board banner -router.get('/banners', banners); +router.get('/randombanner', randombanner); + +//public board banners page +router.get('/:board/banners.html', Boards.exists, banners); //board manage page router.get('/:board/manage.html', Boards.exists, isLoggedIn, hasPerms, csrf, manage); -//board manage page +//global manage page router.get('/globalmanage.html', isLoggedIn, hasPerms, csrf, globalManage); // board page/recents diff --git a/gulp/res/css/style.css b/gulp/res/css/style.css index 9042d589..148a6dc6 100644 --- a/gulp/res/css/style.css +++ b/gulp/res/css/style.css @@ -23,11 +23,15 @@ body { flex-direction: column; } +.bold { + font-weight: bold; +} + pre { font-family: inherit; margin: 1em 2em; white-space: pre-wrap; - word-break: break-word; + overflow-wrap: break-word; } .replies { diff --git a/models/forms/deletebanners.js b/models/forms/deletebanners.js index 2d4ba234..697d954d 100644 --- a/models/forms/deletebanners.js +++ b/models/forms/deletebanners.js @@ -2,18 +2,29 @@ const remove = require('fs-extra').remove , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') - , Boards = require(__dirname+'/../../db/boards.js'); + , Boards = require(__dirname+'/../../db/boards.js') + , { buildBanners } = require(__dirname+'/../../build.js') module.exports = async (req, res, next) => { - const redirect = `/${req.params.board}/manage.html` + const redirect = `/${req.params.board}/manage.html`; + //delete file of all selected banners await Promise.all(req.body.checkedbanners.map(async filename => { remove(`${uploadDirectory}banner/${req.params.board}/${filename}`); })); + //remove from db await Boards.removeBanners(req.params.board, req.body.checkedbanners); + //update res locals banners in memory + res.locals.board.banners = res.locals.board.banners.filter(banner => { + return !req.body.checkedbanners.includes(banner); + }); + + //rebuild public banners page + await buildBanners(res.locals.board); + return res.render('message', { 'title': 'Success', 'message': `Deleted banners.`, diff --git a/models/forms/uploadbanners.js b/models/forms/uploadbanners.js index d303c5f9..70dd901f 100644 --- a/models/forms/uploadbanners.js +++ b/models/forms/uploadbanners.js @@ -8,12 +8,13 @@ const path = require('path') , imageIdentify = require(__dirname+'/../../helpers/files/imageidentify.js') , deleteTempFiles = require(__dirname+'/../../helpers/files/deletetempfiles.js') , Boards = require(__dirname+'/../../db/boards.js') + , { buildBanners } = require(__dirname+'/../../build.js') module.exports = async (req, res, next) => { const redirect = `/${req.params.board}/manage.html` - // check all mime types befoer we try saving anything + // check all mime types before we try saving anything for (let i = 0; i < res.locals.numFiles; i++) { if (!fileCheckMimeType(req.files.file[i].mimetype, {image: true, animatedImage: true, video: false})) { await deleteTempFiles(req).catch(e => console.error); @@ -69,11 +70,18 @@ module.exports = async (req, res, next) => { await remove(file.tempFilePath); } - // because express middleware is autistic i need to do this + deleteTempFiles(req).catch(e => console.error); + // add banners to the db await Boards.addBanners(req.params.board, filenames); + //add banners to board in memory + res.locals.board.banners = res.locals.board.banners.concat(filenames); + + // rebuild the public banners page + await buildBanners(res.locals.board); + return res.render('message', { 'title': 'Success', 'message': `Uploaded ${filenames.length} new banners.`, diff --git a/models/pages/banners.js b/models/pages/banners.js index 33c36290..d6ee6f00 100644 --- a/models/pages/banners.js +++ b/models/pages/banners.js @@ -1,29 +1,16 @@ 'use strict'; -const Boards = require(__dirname+'/../../db/boards.js'); +const { buildBanners } = require(__dirname+'/../../build.js') + , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js'); module.exports = async (req, res, next) => { - if (!req.query.board) { - return next(); - } + try { + await buildBanners(res.locals.board); + } catch (err) { + return next(err); + } - //agregate to get single random item from banners array - const board = await Boards.db.aggregate([ - { - '$unwind': '$banners' - }, - { - '$sample': { - 'size' : 1 - } - } - ]).toArray().then(res => res[0]); - - if (board && board.banners != null) { - return res.redirect(`/banner/${req.query.board}/${board.banners}`); - } - - return res.redirect('/img/defaultbanner.png'); + return res.sendFile(`${uploadDirectory}html/${req.params.board}/banners.html`); } diff --git a/models/pages/randombanner.js b/models/pages/randombanner.js new file mode 100644 index 00000000..33c36290 --- /dev/null +++ b/models/pages/randombanner.js @@ -0,0 +1,29 @@ +'use strict'; + +const Boards = require(__dirname+'/../../db/boards.js'); + +module.exports = async (req, res, next) => { + + if (!req.query.board) { + return next(); + } + + //agregate to get single random item from banners array + const board = await Boards.db.aggregate([ + { + '$unwind': '$banners' + }, + { + '$sample': { + 'size' : 1 + } + } + ]).toArray().then(res => res[0]); + + if (board && board.banners != null) { + return res.redirect(`/banner/${req.query.board}/${board.banners}`); + } + + return res.redirect('/img/defaultbanner.png'); + +} diff --git a/views/includes/bannersheader.pug b/views/includes/bannersheader.pug new file mode 100644 index 00000000..64315fa8 --- /dev/null +++ b/views/includes/bannersheader.pug @@ -0,0 +1,2 @@ +section.board-header + h1.board-title Banners (#[a.no-decoration(href=`/${board._id}/index.html`) /#{board._id}/]) diff --git a/views/includes/boardheader.pug b/views/includes/boardheader.pug index 5f685c90..4bdaa9b1 100644 --- a/views/includes/boardheader.pug +++ b/views/includes/boardheader.pug @@ -1,5 +1,5 @@ section.board-header - img.board-banner(src=`/banners?board=${board._id}` width='300' height='100') + img.board-banner(src=`/randombanner?board=${board._id}` width='300' height='100') br a.no-decoration(href=`/${board._id}/index.html`) h1.board-title /#{board._id}/ - #{board.name} diff --git a/views/includes/catalogheader.pug b/views/includes/catalogheader.pug index 70d632cc..e51ea971 100644 --- a/views/includes/catalogheader.pug +++ b/views/includes/catalogheader.pug @@ -1,4 +1,4 @@ section.board-header - img.board-banner(src=`/banners?board=${board._id}` width='300' height='100') + img.board-banner(src=`/randombanner?board=${board._id}` width='300' height='100') br h1.board-title Catalog (#[a.no-decoration(href=`/${board._id}/index.html`) /#{board._id}/]) diff --git a/views/includes/pages.pug b/views/includes/pages.pug index d9456ea4..41aaec96 100644 --- a/views/includes/pages.pug +++ b/views/includes/pages.pug @@ -1,15 +1,5 @@ | Page: -if page === 1 - a(href=`/${board._id}/index.html`) [#{1}] - | -else - a(href=`/${board._id}/index.html`) #{1} - | -- for(let i = 2; i <= maxPage; i++) - if i === page - a(href=`/${board._id}/${i}.html`) [#{i}] - | - else - a(href=`/${board._id}/${i}.html`) #{i} - | +- for(let i = 1; i <= maxPage; i++) + a(class=`${page === i ? 'bold' : ''}` href=`/${board._id}/${i === 1 ? 'index' : i}.html`) [#{i}] + | | | diff --git a/views/includes/postform.pug b/views/includes/postform.pug index acbcdaab..4696c7cb 100644 --- a/views/includes/postform.pug +++ b/views/includes/postform.pug @@ -60,3 +60,4 @@ section.form-wrapper.flex-center span.required * | = required field input(type='submit', value=`New ${isThread ? 'Reply' : 'Thread'}`) + diff --git a/views/mixins/post.pug b/views/mixins/post.pug index edfa8479..5d9f5f2a 100644 --- a/views/mixins/post.pug +++ b/views/mixins/post.pug @@ -1,6 +1,6 @@ mixin post(post, truncate, manage=false, globalmanage=false) .anchor(id=post.postId) - article(class='post-container '+(post.thread ? '' : 'op')) + article(class=`post-container ${post.thread ? '' : 'op'}`) - const postURL = `/${post.board}/thread/${post.thread || post.postId}.html#${post.postId}`; header.post-info if globalmanage diff --git a/views/pages/banners.pug b/views/pages/banners.pug new file mode 100644 index 00000000..d863bc50 --- /dev/null +++ b/views/pages/banners.pug @@ -0,0 +1,14 @@ +extends ../layout.pug + +block head + title /#{board._id}/ - Banners + +block content + include ../includes/bannersheader.pug + hr(size=1) + section.catalog + if board.banners.length > 0 + each banner in board.banners + img.board-banner(src=`/banner/${board._id}/${banner}` width='300' height='100') + else + p Board has no custom banners. diff --git a/views/pages/board.pug b/views/pages/board.pug index 740ca861..f0aece95 100644 --- a/views/pages/board.pug +++ b/views/pages/board.pug @@ -2,7 +2,7 @@ extends ../layout.pug include ../mixins/post.pug block head - title /#{board._id}/ - #{board.description} + title /#{board._id}/ - #{board.description} - page #{page} block content include ../includes/boardheader.pug diff --git a/views/pages/manage.pug b/views/pages/manage.pug index 97a484de..3cb488dd 100644 --- a/views/pages/manage.pug +++ b/views/pages/manage.pug @@ -3,7 +3,7 @@ include ../mixins/post.pug include ../mixins/ban.pug block head - title Manage + title /#{board._id}/ - Manage block content include ../includes/boardheader.pug