From 6edd006c7b909e5d428aa4d5858219834aaec682 Mon Sep 17 00:00:00 2001 From: Ruslan Semak Date: Tue, 15 Apr 2025 12:11:57 +0300 Subject: [PATCH] feat: Custom sorting at page tree --- server/graph/resolvers/page.js | 41 +++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/server/graph/resolvers/page.js b/server/graph/resolvers/page.js index 9e99686a..a629be11 100644 --- a/server/graph/resolvers/page.js +++ b/server/graph/resolvers/page.js @@ -173,8 +173,8 @@ module.exports = { async singleByPath(obj, args, context, info) { let page = await WIKI.models.pages.getPageFromDb({ path: args.path, - locale: args.locale, - }); + locale: args.locale + }) if (page) { if (WIKI.auth.checkAccess(context.req.user, ['manage:pages', 'delete:pages'], { path: page.path, @@ -281,7 +281,42 @@ module.exports = { builder.orWhereIn('id', _.isString(curPage.ancestors) ? JSON.parse(curPage.ancestors) : curPage.ancestors) } } - }).orderBy([{ column: 'isFolder', order: 'desc' }, 'title']) + }) + + // Ruslan: Custom sorting for "Tree Navigation" for folder "Users" + // const customSortingOrder = [ + // '📁 Шаблон', + // 'Landing' + // ] + + const emojiRegex = /^[\u{1F300}-\u{1F6FF}\u{1F900}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u + const russianRegex = /[\u0400-\u04FF]/ + + const userPrefix = 'Users/' + results.sort((a, b) => { + if (a.isFolder !== b.isFolder) { + return b.isFolder - a.isFolder + } + + if (a.path.startsWith(userPrefix) || a.path.startsWith(userPrefix)) { + // Emoji first + const aIsEmoji = emojiRegex.test(a.title) + const bIsEmoji = emojiRegex.test(b.title) + + if (aIsEmoji && !bIsEmoji) return -1 + if (!aIsEmoji && bIsEmoji) return 1 + + // Russian second, only by first letter due to title must contain russian + english + const aIsRussian = russianRegex.test(a.title[0]) + const bIsRussian = russianRegex.test(b.title[1]) + + if (aIsRussian && !bIsRussian) return -1 + if (!aIsRussian && bIsRussian) return 1 + } + + return a.title.localeCompare(b.title) + }) + return results.filter(r => { return WIKI.auth.checkAccess(context.req.user, ['read:pages'], { path: r.path,