UNPKG

q42-cms-components

Version:

145 lines (120 loc) 3.96 kB
import { ServerStore } from './server-store.js'; class PageStore extends ServerStore { constructor() { super({ initial: { pages: [], schema: { properties: {}, oneOf: [] } }, loaders: { pages: () => this.fetch('/pages/all'), schema: () => this.fetch('/versions/schema') }, computed: { pageTree: () => PageStore.sortPages(PageStore.parsePageTree(this.pages)), types: () => { var result = {}; this.schema.oneOf.forEach(s => { result[s.properties.$type.enum[0]] = s; }); return result; } } }); } /** * Parses the given flat pagelist and creates a nested structure of pages * using the parent property of pages. */ static parsePageTree(pageList) { pageList.forEach(page => page.path = page.parentId ? '/' + page.name : ''); let getSubPagesById = id => pageList.filter(page => page.parentId === id); pageList.forEach((page) => { page.children = getSubPagesById(page.id); page.children.forEach(subPage => { 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); } /** * Sorts the given array so that it can be displayed in the page tree. * @param pageTree nested list of pages. * @returns sorted pageTree */ static sortPages(pageTree) { let sortByName = (a, b) => { if(a.name < b.name) { return -1; } if(a.name > b.name) { return 1; } return 0; }; let pageSorter = (a, b) => { if(a.children && a.children.length && b.children && b.children.length) { // Both have child pages. return sortByName(a, b); } if(a.children && a.children.length) { return -1; } if(b.children && b.children.length) { return 1; } // Both pages do not have child pages, only use name to sort. return sortByName(a, b); }; pageTree = pageTree.sort(pageSorter); // Apply recursive sorting on sub arrays. pageTree.forEach(page => { if(page.children && page.children.length) { page.children = PageStore.sortPages(page.children); } }); return pageTree; } getPageById(id) { return this.fetch(`/pages/${id}`).then(page => { return this.fetch(`/pages/${id}/versions`).then(versions => { page.versions = versions; return page; }); }); } create(version, name, parentId) { return this.postJson('/versions/create', version, { name, parentId }).then(this.updaters.pages); } updateVersion(version) { return this.putJson(`/versions/update/${version.id}`, version).then(this.updaters.pages); } publishVersion(version) { return this.post(`/versions/publish/${version.id}`); } depublishVersion(version) { return this.post(`/versions/depublish/${version.id}`); } copyVersion(version) { return this.post(`/versions/copy/${version.id}`); } deleteVersion(version) { return this.del(`/versions/${version.id}`, version).then(this.updaters.pages); } previewUrl(version, versionCounter) { return version.id ? this.url(`/versions/preview/${version.id}?counter=${versionCounter}`) : null; } move(page, newParentId) { return this.post(`/pages/${page.id}/move`, { newParentId }).then(this.updaters.pages); } rename(page, name) { return this.post(`/pages/${page.id}/rename`, { name }).then(this.updaters.pages); } deletePage(page) { return this.del(`/pages/${page.id}`, page).then(this.updaters.pages); } } export const pageStore = new PageStore();