From 8abf651a46c60429a4e04b0a341c0a2e675ec6a5 Mon Sep 17 00:00:00 2001 From: Boaz Poolman Date: Fri, 21 Jan 2022 16:21:00 +0100 Subject: [PATCH] feat: Sort relations on more than 1 field --- server/config/type.js | 22 ++++++++++++++-------- server/config/types.js | 4 ++-- server/utils/index.js | 14 +++++++++----- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/server/config/type.js b/server/config/type.js index ff82ed8..a7b9ea1 100644 --- a/server/config/type.js +++ b/server/config/type.js @@ -99,18 +99,22 @@ const ConfigType = class ConfigType { const entity = await queryAPI.update({ where: combinedUidWhereFilter, data: query }); // Delete/create relations. - await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortField }) => { + await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortFields }) => { const relationQueryApi = strapi.query(queryString); - existingConfig = sanitizeConfig(existingConfig, relationName, relationSortField); - configContent = sanitizeConfig(configContent, relationName, relationSortField); + existingConfig = sanitizeConfig(existingConfig, relationName, relationSortFields); + configContent = sanitizeConfig(configContent, relationName, relationSortFields); - const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortField); - const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortField); + const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortFields[0]); + const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortFields[0]); await Promise.all(configToDelete.map(async (config) => { + const whereClause = {}; + relationSortFields.map((sortField) => { + whereClause[sortField] = config[sortField]; + }); await relationQueryApi.delete({ where: { - [relationSortField]: config[relationSortField], + ...whereClause, [parentName]: entity.id, }, }); @@ -168,13 +172,15 @@ const ConfigType = class ConfigType { if (shouldExclude) return; const formattedConfig = { ...sanitizeConfig(config) }; - await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortField, parentName }) => { + await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortFields, parentName }) => { const relations = await noLimit(strapi.query(queryString), { where: { [parentName]: combinedUidWhereFilter }, }); relations.map((relation) => sanitizeConfig(relation)); - relations.sort(dynamicSort(relationSortField)); + relationSortFields.map((sortField) => { + relations.sort(dynamicSort(sortField)); + }); formattedConfig[relationName] = relations; })); diff --git a/server/config/types.js b/server/config/types.js index a4923bc..c337f20 100644 --- a/server/config/types.js +++ b/server/config/types.js @@ -17,7 +17,7 @@ const types = (strapi) => { queryString: 'admin::permission', relationName: 'permissions', parentName: 'role', - relationSortField: 'action', + relationSortFields: ['action', 'subject'], }], }, ]; @@ -32,7 +32,7 @@ const types = (strapi) => { queryString: 'plugin::users-permissions.permission', relationName: 'permissions', parentName: 'role', - relationSortField: 'action', + relationSortFields: ['action'], }], }); } diff --git a/server/utils/index.js b/server/utils/index.js index 3d8f440..7572fd4 100644 --- a/server/utils/index.js +++ b/server/utils/index.js @@ -37,14 +37,16 @@ const dynamicSort = (property) => { return (a, b) => { if (sortOrder === -1) { - return b[property].localeCompare(a[property]); - } else { + if (b[property]) { + return b[property].localeCompare(a[property]); + } + } else if (a[property]) { return a[property].localeCompare(b[property]); } }; }; -const sanitizeConfig = (config, relation, relationSortField) => { +const sanitizeConfig = (config, relation, relationSortFields) => { delete config._id; delete config.id; delete config.updatedAt; @@ -63,8 +65,10 @@ const sanitizeConfig = (config, relation, relationSortField) => { formattedRelations.push(relationEntity); }); - if (relationSortField) { - formattedRelations.sort(dynamicSort(relationSortField)); + if (relationSortFields) { + relationSortFields.map((sortField) => { + formattedRelations.sort(dynamicSort(sortField)); + }); } config[relation] = formattedRelations;