From 24b37eb87c1304eef06c91a192f3e948675bbe01 Mon Sep 17 00:00:00 2001 From: SebastianMC <23032356+SebastianMC@users.noreply.github.com> Date: Thu, 24 Aug 2023 00:09:04 +0200 Subject: [PATCH] Bugfix in sorterByMetadataField - reverse order working correctly now - new unit tests --- src/custom-sort/custom-sort.spec.ts | 35 +++++++++++++++++++++++++++++ src/custom-sort/custom-sort.ts | 6 ++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/custom-sort/custom-sort.spec.ts b/src/custom-sort/custom-sort.spec.ts index 038f4a9..1a39df9 100644 --- a/src/custom-sort/custom-sort.spec.ts +++ b/src/custom-sort/custom-sort.spec.ts @@ -2274,3 +2274,38 @@ describe('CustomSortOrder.byMetadataFieldAlphabeticalReverse', () => { expect(result3).toBe(SORT_ITEMS_ARE_EQUAL) }) }) + +describe('sorterByMetadataField', () => { + it.each([ + [true,'abc','def',-1, 'a', 'a'], + [true,'xyz','klm',1, 'b', 'b'], + [true,'mmm','mmm',0, 'c', 'c'], + [true,'mmm','mmm',-1, 'd', 'e'], + [true,'mmm','mmm',1, 'e', 'd'], + [true,'abc',undefined,-1, 'a','a'], + [true,undefined,'klm',1, 'b','b'], + [true,undefined,undefined,0, 'a','a'], + [true,undefined,undefined,-1, 'a','b'], + [true,undefined,undefined,1, 'd','c'], + [false,'abc','def',1, 'a', 'a'], + [false,'xyz','klm',-1, 'b', 'b'], + [false,'mmm','mmm',0, 'c', 'c'], + [false,'mmm','mmm',1, 'd', 'e'], + [false,'mmm','mmm',-1, 'e', 'd'], + [false,'abc',undefined,1, 'a','a'], + [false,undefined,'klm',-1, 'b','b'], + [false,undefined,undefined,0, 'a','a'], + [false,undefined,undefined,1, 'a','b'], + [false,undefined,undefined,-1, 'd','c'], + + ])('straight order %s, comparing %s and %s should return %s for sortStrings %s and %s', + (straight: boolean, metadataA: string|undefined, metadataB: string|undefined, order: number, sortStringA: string, sortStringB) => { + const sorterFn = sorterByMetadataField(!straight, false) + const itemA: Partial = {metadataFieldValue: metadataA, sortString: sortStringA} + const itemB: Partial = {metadataFieldValue: metadataB, sortString: sortStringB} + const result = sorterFn(itemA as FolderItemForSorting, itemB as FolderItemForSorting) + + // then + expect(result).toBe(order) + }) +}) diff --git a/src/custom-sort/custom-sort.ts b/src/custom-sort/custom-sort.ts index d4133d3..8b56aec 100644 --- a/src/custom-sort/custom-sort.ts +++ b/src/custom-sort/custom-sort.ts @@ -71,7 +71,7 @@ const TrueAlphabetical: boolean = true const ReverseOrder: boolean = true const StraightOrder: boolean = false -const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean) => SorterFn = (reverseOrder: boolean, trueAlphabetical?: boolean) => { +export const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean) => SorterFn = (reverseOrder: boolean, trueAlphabetical?: boolean) => { const collatorCompareFn: CollatorCompareFn = trueAlphabetical ? CollatorTrueAlphabeticalCompare : CollatorCompare return (a: FolderItemForSorting, b: FolderItemForSorting) => { if (reverseOrder) { @@ -87,8 +87,8 @@ const sorterByMetadataField:(reverseOrder?: boolean, trueAlphabetical?: boolean) } } // Item with metadata goes before the w/o metadata - if (a.metadataFieldValue) return reverseOrder ? 1 : -1 - if (b.metadataFieldValue) return reverseOrder ? -1 : 1 + if (a.metadataFieldValue) return -1 + if (b.metadataFieldValue) return 1 // Fallback -> requested sort by metadata, yet none of two items contain it, use alphabetical by name return collatorCompareFn(a.sortString, b.sortString) }