From f845a0d09f6acaf4442d9e381292ff2479e9576b Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 19 Oct 2018 21:08:24 +0300 Subject: [PATCH] Show created pages in menu (#11) * Show created pages in menu * reverse children sorting --- src/routes/index.js | 6 ++++-- src/routes/middlewares/pages.js | 33 +++++++++++++++++++++++++++++++++ src/utils/asyncMiddleware.js | 11 +++++++++++ src/views/components/aside.twig | 33 +++++++++++++++++---------------- 4 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 src/routes/middlewares/pages.js create mode 100644 src/utils/asyncMiddleware.js diff --git a/src/routes/index.js b/src/routes/index.js index f2a1c2f..6ad5d78 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -5,8 +5,10 @@ const home = require('./home'); const pages = require('./pages'); const api = require('./api'); -router.use('/', home); -router.use('/', pages); +const pagesMiddleware = require('./middlewares/pages'); + +router.use('/', pagesMiddleware, home); +router.use('/', pagesMiddleware, pages); router.use('/api', api); module.exports = router; diff --git a/src/routes/middlewares/pages.js b/src/routes/middlewares/pages.js new file mode 100644 index 0000000..0d8b867 --- /dev/null +++ b/src/routes/middlewares/pages.js @@ -0,0 +1,33 @@ +const Pages = require('../../controllers/pages'); +const asyncMiddleware = require('../../utils/asyncMiddleware'); + +/** + * Process one-level pages list to parent-childrens list + * @param {Page[]} pages - list of all available pages + * @return {Page[]} + */ +function createMenuTree(pages) { + return pages.filter(page => page._parent === '0').map(page => { + return Object.assign({ + children: pages.filter(child => child._parent === page._id).reverse() + }, page.data); + }); +} + +/** + * Middleware for all /page/... routes + * @param req + * @param res + * @param next + */ +module.exports = asyncMiddleware(async function (req, res, next) { + try { + const menu = await Pages.getAll(); + + res.locals.menu = createMenuTree(menu); + } catch (error) { + console.log('Can not load menu:', error); + } + + next(); +}); diff --git a/src/utils/asyncMiddleware.js b/src/utils/asyncMiddleware.js new file mode 100644 index 0000000..4bb27ce --- /dev/null +++ b/src/utils/asyncMiddleware.js @@ -0,0 +1,11 @@ +/** + * Helper for making async middlewares for express router + * @param fn + * @return {function(*=, *=, *=)} + */ +module.exports = function asyncMiddlware(fn) { + return (req, res, next) => { + Promise.resolve(fn(req, res, next)) + .catch(next); + }; +}; diff --git a/src/views/components/aside.twig b/src/views/components/aside.twig index 1888f57..7ae5fd8 100644 --- a/src/views/components/aside.twig +++ b/src/views/components/aside.twig @@ -1,19 +1,20 @@
-
- - Base concepts - - -
+ {% if firstLevelPage.children is not empty %} + + {% endif %} + + {% endfor %}