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:
parent
8f63a269a8
commit
4882ef24dc
1 changed files with 32 additions and 27 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue