From 47cdd5310bf58f59f52d5ceed726fd50d7a0e518 Mon Sep 17 00:00:00 2001 From: Jed Date: Tue, 28 Jan 2025 19:02:52 +0100 Subject: [PATCH] adds method to sort all documents and pages --- lib/methods/export.js | 89 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/lib/methods/export.js b/lib/methods/export.js index 09dc4e6..fae0150 100644 --- a/lib/methods/export.js +++ b/lib/methods/export.js @@ -7,7 +7,7 @@ const { uniqBy, uniqueId } = require('lodash'); const MAX_RECURSION = 10; -module.exports = self => { +module.exports = (self) => { return { async export(req, manager, reporting = null) { if (!req.user) { @@ -33,9 +33,11 @@ module.exports = self => { const hasRelatedTypes = !!relatedTypes.length; - const docs = (await self.getDocs(req, ids, hasRelatedTypes, manager, reporting)) + const docs = (await self.getDocs(req, ids, manager, reporting)) .map((doc) => self.apos.util.clonePermanent(doc)); + if (!hasRelatedTypes) { + self.sortDocs(docs); return self.exportFile( req, reporting, @@ -55,6 +57,8 @@ module.exports = self => { }); } + self.sortDocs(allDocs); + if (!format.includeAttachments) { return self.exportFile( req, @@ -88,6 +92,18 @@ module.exports = self => { }) ); + for (const { + _id, title, aposMode, level, rank + } of allDocs) { + console.log('doc:', { + _id, + title, + aposMode, + level, + rank + }); + } + return self.exportFile( req, reporting, @@ -101,28 +117,69 @@ module.exports = self => { ); }, + sortDocs(docs) { + docs.sort((a, b) => { + if (!self.apos.page.isPage(a) && !self.apos.page.isPage(b)) { + return 0; + } + if (self.apos.page.isPage(a) && !self.apos.page.isPage(b)) { + return -1; + } + if (!self.apos.page.isPage(a) && self.apos.page.isPage(b)) { + return 1; + } + if (a.aposMode === 'draft' && b.aposMode === 'published') { + return -1; + } + if (a.aposMode === 'published' && b.aposMode === 'draft') { + return 1; + } + if (a.level > b.level) { + return 1; + } + if (a.level < b.level) { + return -1; + } + if (a.rank < b.rank) { + return -1; + } + if (a.rank > b.rank) { + return 1; + } + return 0; + }); + }, + // Get docs via their manager in order to populate them // so that we can retrieve their relationships IDs later, // and to let the manager handle permissions. - async getDocs(req, docsIds, includeRelationships, manager, reporting) { + async getDocs(req, docsIds, manager, reporting) { if (!docsIds.length) { return []; } + /* const isPage = self.apos.instanceOf(manager, '@apostrophecms/page'); */ const { draftIds, publishedIds } = self.getAllModesIds(docsIds); const isReqDraft = req.mode === 'draft'; const docs = []; const draftReq = isReqDraft ? req : req.clone({ mode: 'draft' }); - const draftDocs = await manager + const cursor = await manager .findForEditing(draftReq, { _id: { $in: draftIds } }) - .relationships(includeRelationships) - .toArray(); + .relationships(false); + + /* if (isPage) { */ + /* cursor.sort({ */ + /* level: 1, */ + /* rank: 1 */ + /* }); */ + /* } */ + const draftDocs = await cursor.toArray(); docs.push(...draftDocs); @@ -133,7 +190,7 @@ module.exports = self => { $in: publishedIds } }) - .relationships(includeRelationships) + .relationships(false) .toArray(); docs.push(...publishedDocs); @@ -225,7 +282,7 @@ module.exports = self => { if (!field.withType && !fieldValue) { continue; } - if (field.withType && relatedTypes && !relatedTypesIncludes(field.withType)) { + if (field.withType && relatedTypes && !self.relatedTypesIncludes(field.withType, relatedTypes)) { continue; } if (field.withType && !self.canExport(req, field.withType)) { @@ -290,16 +347,16 @@ module.exports = self => { }); } } + }, - function relatedTypesIncludes(name) { - if ([ '@apostrophecms/any-page-type', '@apostrophecms/page' ].includes(name)) { - return relatedTypes.some(type => { - const module = self.apos.modules[type]; - return self.apos.instanceOf(module, '@apostrophecms/page-type'); - }); - } - return relatedTypes.includes(name); + relatedTypesIncludes(name, relatedTypes) { + if ([ '@apostrophecms/any-page-type', '@apostrophecms/page' ].includes(name)) { + return relatedTypes.some(type => { + const module = self.apos.modules[type]; + return self.apos.instanceOf(module, '@apostrophecms/page-type'); + }); } + return relatedTypes.includes(name); }, async getRelatedDocsFromRichTextWidget(req, {