1
0
Fork 0
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:
Murod Khaydarov 2019-02-16 00:25:20 +03:00
parent d1e48cbb64
commit 7ae354d143
No known key found for this signature in database
GPG key ID: C480BA53A8D274C5
3 changed files with 58 additions and 31 deletions

View file

@ -23,6 +23,15 @@ class PagesOrder {
return order; 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 * Pushes the child page to the parent's order list
* *

View file

@ -34,6 +34,19 @@ class PageOrder {
return new PageOrder(data); 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 * @constructor
* *

View file

@ -4,44 +4,48 @@ const asyncMiddleware = require('../../utils/asyncMiddleware');
/** /**
* Process one-level pages list to parent-children list * 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} level
* @param {number} currentLevel * @param {number} currentLevel
* *
* @return {Page[]} * @return {Page[]}
*/ */
async function createMenuTree(pages, level = 1, currentLevel = 1) { function createMenuTree(parentPageId, pages, pagesOrder, level = 1, currentLevel = 1) {
return await Promise.all(pages.map(async pageId => { let childrenOrder = pagesOrder.find(order => order.data.page === parentPageId);
const parent = await Pages.get(pageId);
/** /**
* By default we accept that deepestChildren is empty Array * branch is a page children in tree
* @type {Array} * 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 deepestChildren = []; */
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 * stop recursion when we got the passed max level
* If we got something, pluck to found Page deeper and get its children order */
*/ if (currentLevel === level + 1) {
try { return [];
/** }
* 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) {}
/** /**
* 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({ return Object.assign({
children: deepestChildren children: createMenuTree(page._id, pages, pagesOrder, level, currentLevel + 1)
}, parent.data); }, page.data);
})); });
} }
/** /**
@ -57,8 +61,9 @@ module.exports = asyncMiddleware(async function (req, res, next) {
*/ */
const parentIdOfRootPages = '0'; const parentIdOfRootPages = '0';
try { try {
const rootPages = await PagesOrder.get(parentIdOfRootPages); const pages = await Pages.getAll();
res.locals.menu = await createMenuTree(rootPages.order, 2); const pagesOrder = await PagesOrder.getAll();
res.locals.menu = createMenuTree(parentIdOfRootPages, pages, pagesOrder, 2);
} catch (error) { } catch (error) {
console.log('Can not load menu:', error); console.log('Can not load menu:', error);
} }