mirror of
https://github.com/codex-team/codex.docs.git
synced 2025-08-08 15:05:26 +02:00
refactor createmenutree
This commit is contained in:
parent
d1e48cbb64
commit
7ae354d143
3 changed files with 58 additions and 31 deletions
|
@ -23,6 +23,15 @@ class PagesOrder {
|
|||
return order;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all records about page's order
|
||||
*
|
||||
* @returns {Promise<PagesOrder[]>}
|
||||
*/
|
||||
static async getAll() {
|
||||
return Model.getAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the child page to the parent's order list
|
||||
*
|
||||
|
|
|
@ -34,6 +34,19 @@ class PageOrder {
|
|||
return new PageOrder(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all pages which match passed query object
|
||||
*
|
||||
* @param {Object} query
|
||||
* @returns {Promise<Page[]>}
|
||||
*/
|
||||
static async getAll(query = {}) {
|
||||
const docs = await db.find(query);
|
||||
|
||||
return Promise.all(docs.map(doc => new PageOrder(doc)));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*
|
||||
|
|
|
@ -4,44 +4,48 @@ const asyncMiddleware = require('../../utils/asyncMiddleware');
|
|||
|
||||
/**
|
||||
* Process one-level pages list to parent-children list
|
||||
* @param {string[]} pages - list of all available pages
|
||||
*
|
||||
* @param {string} parentPageId - parent page id
|
||||
* @param {Page[]} pages - list of all available pages
|
||||
* @param {PagesOrder[]} pagesOrder - list of pages order
|
||||
* @param {number} level
|
||||
* @param {number} currentLevel
|
||||
*
|
||||
* @return {Page[]}
|
||||
*/
|
||||
async function createMenuTree(pages, level = 1, currentLevel = 1) {
|
||||
return await Promise.all(pages.map(async pageId => {
|
||||
const parent = await Pages.get(pageId);
|
||||
function createMenuTree(parentPageId, pages, pagesOrder, level = 1, currentLevel = 1) {
|
||||
let childrenOrder = pagesOrder.find(order => order.data.page === parentPageId);
|
||||
|
||||
/**
|
||||
* By default we accept that deepestChildren is empty Array
|
||||
* @type {Array}
|
||||
*/
|
||||
let deepestChildren = [];
|
||||
/**
|
||||
* branch is a page children in tree
|
||||
* if we got some children order on parents tree, then we push found pages in order sequence
|
||||
* otherwise just find all pages includes parent tree
|
||||
*/
|
||||
let branch = [];
|
||||
if (childrenOrder) {
|
||||
branch = childrenOrder.order.map( pageId => {
|
||||
return pages.find( page => page._id === pageId);
|
||||
});
|
||||
} else {
|
||||
branch = pages.filter( page => page._parent === parentPageId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Here we try to check parent's children order
|
||||
* If we got something, pluck to found Page deeper and get its children order
|
||||
*/
|
||||
try {
|
||||
/**
|
||||
* Go deeper until we didn't get the deepest level
|
||||
* On each 'currentLevel' create new Menu Tree with ordered Page ids
|
||||
*/
|
||||
if (currentLevel !== level) {
|
||||
const children = await PagesOrder.get(pageId);
|
||||
deepestChildren = await createMenuTree(children.order, level, currentLevel + 1)
|
||||
}
|
||||
} catch (e) {}
|
||||
/**
|
||||
* stop recursion when we got the passed max level
|
||||
*/
|
||||
if (currentLevel === level + 1) {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign parent's children with found Menu Tree
|
||||
*/
|
||||
/**
|
||||
* Each parents children can have subbranches
|
||||
*/
|
||||
return branch.filter(page => page && page._id).map( page => {
|
||||
return Object.assign({
|
||||
children: deepestChildren
|
||||
}, parent.data);
|
||||
}));
|
||||
children: createMenuTree(page._id, pages, pagesOrder, level, currentLevel + 1)
|
||||
}, page.data);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -57,8 +61,9 @@ module.exports = asyncMiddleware(async function (req, res, next) {
|
|||
*/
|
||||
const parentIdOfRootPages = '0';
|
||||
try {
|
||||
const rootPages = await PagesOrder.get(parentIdOfRootPages);
|
||||
res.locals.menu = await createMenuTree(rootPages.order, 2);
|
||||
const pages = await Pages.getAll();
|
||||
const pagesOrder = await PagesOrder.getAll();
|
||||
res.locals.menu = createMenuTree(parentIdOfRootPages, pages, pagesOrder, 2);
|
||||
} catch (error) {
|
||||
console.log('Can not load menu:', error);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue