1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-08-09 07:25:21 +02:00

recursive method: create menu tree

This commit is contained in:
Murod Khaydarov 2019-01-17 01:12:17 +03:00
parent 8f63a269a8
commit 4882ef24dc
No known key found for this signature in database
GPG key ID: C480BA53A8D274C5

View file

@ -3,40 +3,46 @@ const PagesOrder = require('../../controllers/pagesOrder');
const asyncMiddleware = require('../../utils/asyncMiddleware'); const asyncMiddleware = require('../../utils/asyncMiddleware');
const RootPage = '0'; const RootPage = '0';
/** /**
* Process one-level pages list to parent-children list * Process one-level pages list to parent-children list
* @param {Page[]} pages - list of all available pages * @param {string[]} pages - list of all available pages
* @param {number} level
* @param {number} currentLevel
*
* @return {Page[]} * @return {Page[]}
*/ */
async function createMenuTree(pages) { async function createMenuTree(pages, level = 1, currentLevel = 1) {
return await Promise.all(pages.map(async pageId => {
const parent = await Pages.get(pageId);
const children = await PagesOrder.get(RootPage); /**
const firstLevelPages = []; * By default we accept that deepestChildren is empty Array
* @type {Array}
*/
let deepestChildren = [];
children.order.forEach(pageId => { /**
pages.forEach(page => { * Here we try to check parent's children page order
if (page._id === pageId) { * If we got something, pluck found page's id deeper and get its Menu Tree
firstLevelPages.push(page); */
}
});
});
return Promise.all(firstLevelPages.map(async page => {
const childrenOrdered = [];
try { try {
const children = await PagesOrder.get(page._id); /**
children.order.forEach(pageId => { * Go deeper until we didn't get the deepest level
pages.forEach(_page => { * On each 'currentLevel' create new Menu Tree with ordered Page ids
if (_page._id === pageId) { */
childrenOrdered.push(_page); if (currentLevel !== level) {
const children = await PagesOrder.get(pageId);
deepestChildren = await createMenuTree(children.order, level, currentLevel + 1)
} }
})
});
} catch (e) {} } catch (e) {}
/**
* Assign parent's children with found Menu Tree
*/
return Object.assign({ return Object.assign({
children: childrenOrdered children: deepestChildren
}, page.data); }, parent.data);
})); }));
} }
@ -48,9 +54,8 @@ async function createMenuTree(pages) {
*/ */
module.exports = asyncMiddleware(async function (req, res, next) { module.exports = asyncMiddleware(async function (req, res, next) {
try { try {
const menu = await Pages.getAll(); const rootPages = await PagesOrder.get(RootPage);
res.locals.menu = await createMenuTree(rootPages.order, 2);
res.locals.menu = await createMenuTree(menu)
} catch (error) { } catch (error) {
console.log('Can not load menu:', error); console.log('Can not load menu:', error);
} }