diff --git a/src/backend/controllers/pages.ts b/src/backend/controllers/pages.ts index 6a4bd07..59f8c33 100644 --- a/src/backend/controllers/pages.ts +++ b/src/backend/controllers/pages.ts @@ -62,6 +62,47 @@ class Pages { return nullFilteredPages; } + /** + * Group given pages with descending order of creation time + * + * @param {pages[]} pages - pages to group + * @returns {Page[]} + */ + public static group(pages: Page[]): Page[] { + const result: Page[] = []; + const obj:Record> = {}; + + pages.sort((a, b) => { + if (a.body.time > b.body.time) { + return 1; + } + + if (a.body.time < b.body.time) { + return -1; + } + + return 0; + }).forEach(doc => { + if (doc._parent === '0' && typeof doc._id === 'string') { + obj[doc._id] = []; + obj[doc._id].push(doc); + } else if (doc._parent !== '0' && doc._parent && doc._id) { + obj[doc._id] = []; + obj[doc._parent].push(doc); + } + }); + + Object.entries(obj).forEach(([, value]) => { + if (value.length <=0) { + return; + } else { + result.push(...value); + } + }); + + return result; + } + /** * Set all children elements to null * diff --git a/src/backend/models/page.ts b/src/backend/models/page.ts index 3983395..d90b186 100644 --- a/src/backend/models/page.ts +++ b/src/backend/models/page.ts @@ -84,45 +84,9 @@ class Page { * @returns {Promise} */ public static async getAll(query: Record = {}): Promise { - const result: PageData[] = []; - const obj = {}; - let docs = await pagesDb.find(query); + const docs = await pagesDb.find(query); - docs = docs.sort((a, b) => { - if (a.body.time > b.body.time) { - return 1; - } - - if (a.body.time < b.body.time) { - return -1; - } - - return 0; - }); - docs.forEach(doc => { - if(doc.parent === '0') { - // @ts-ignore - obj[doc._id] = []; - // @ts-ignore - obj[doc._id].push(doc); - } else { - // @ts-ignore - obj[doc._id] = []; - // @ts-ignore - obj[doc.parent].push(doc); - } - }); - Object.entries(obj).forEach(([key, value]) => { - // @ts-ignore - if(!key || value.length <=0) { - return; - } else { - // @ts-ignore - result.push(...value); - } - }); - - return Promise.all(result.map(doc => new Page(doc))); + return Promise.all(docs.map(doc => new Page(doc))); } /** diff --git a/src/backend/routes/pages.ts b/src/backend/routes/pages.ts index 82c8107..174abb9 100644 --- a/src/backend/routes/pages.ts +++ b/src/backend/routes/pages.ts @@ -12,9 +12,10 @@ const router = express.Router(); router.get('/page/new', verifyToken, allowEdit, async (req: Request, res: Response, next: NextFunction) => { try { const pagesAvailable = await Pages.getAll(); + const groupedPagesAvailable = Pages.group(pagesAvailable); res.render('pages/form', { - pagesAvailable, + groupedPagesAvailable, page: null, }); } catch (error) { diff --git a/src/backend/views/pages/form.twig b/src/backend/views/pages/form.twig index 2e3bc13..cb56940 100644 --- a/src/backend/views/pages/form.twig +++ b/src/backend/views/pages/form.twig @@ -22,7 +22,7 @@ {% endif %}