import { Page } from '../types/api'; import { getCmsSettings } from '../tools/settings'; export default class PageTree { items: Page[] = []; constructor(pageList: Page[]) { this.items = this.sortPages(this.parsePageTree(pageList)); } parsePageTree(pageList: Page[]): Page[] { // TODO remove path property as we can use .url instead pageList.forEach((page) => (page.path = page.parentId ? '/' + page.name : '')); const getSubPagesById = (id: string) => pageList.filter((page) => page.parentId === id); pageList.forEach((page) => { page.children = getSubPagesById(page.id); page.children.forEach((subPage: Page) => { subPage.path = page.path + subPage.path; // Mark subpages as child so we can remove them later. subPage.isChild = true; }); page.path = page.path || '/'; }); return pageList.filter((page) => !page.isChild); } sortPages(pageTree: Page[]): Page[] { const sortByName = (a: Page, b: Page) => { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; }; pageTree = pageTree.sort(sortByName); if (getCmsSettings().pageTreeSorting) { pageTree = pageTree.sort(getCmsSettings().pageTreeSorting); } // Apply recursive sorting on sub arrays. pageTree.forEach((page) => { if (page.children && page.children.length) { page.children = this.sortPages(page.children); } }); return pageTree; } }