From 1ebb551864fbab926460ce8999e99f3d58a3400c Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 6 Apr 2024 10:53:19 +0200 Subject: [PATCH] fix(filters): make sure the same filter attribute is transformed in all instances Resolves https://community.vikunja.io/t/filter-setting-s/1791/13 --- frontend/src/helpers/filters.test.ts | 22 +++++++++++++++++++++- frontend/src/helpers/filters.ts | 4 ++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/frontend/src/helpers/filters.test.ts b/frontend/src/helpers/filters.test.ts index 502362926..c6935d9a4 100644 --- a/frontend/src/helpers/filters.test.ts +++ b/frontend/src/helpers/filters.test.ts @@ -107,7 +107,7 @@ describe('Filter Transformation', () => { expect(transformed).toBe('project = 1') }) - + it('should resolve project and labels independently', () => { const transformed = transformFilterStringForApi( 'project = lorem && labels = ipsum', @@ -117,6 +117,16 @@ describe('Filter Transformation', () => { expect(transformed).toBe('project = 1 && labels = 2') }) + + it('should transform the same attribute multiple times', () => { + const transformed = transformFilterStringForApi( + 'dueDate = now/d || dueDate > now/w+1w', + nullTitleToIdResolver, + nullTitleToIdResolver, + ) + + expect(transformed).toBe('due_date = now/d || due_date > now/w+1w') + }) }) describe('To API', () => { @@ -198,5 +208,15 @@ describe('Filter Transformation', () => { expect(transformed).toBe('project in lorem, ipsum') }) + + it('should transform the same attribute multiple times', () => { + const transformed = transformFilterStringFromApi( + 'due_date = now/d || due_date > now/w+1w', + nullIdToTitleResolver, + nullIdToTitleResolver, + ) + + expect(transformed).toBe('dueDate = now/d || dueDate > now/w+1w') + }) }) }) diff --git a/frontend/src/helpers/filters.ts b/frontend/src/helpers/filters.ts index f19c8365d..de76a3171 100644 --- a/frontend/src/helpers/filters.ts +++ b/frontend/src/helpers/filters.ts @@ -127,7 +127,7 @@ export function transformFilterStringForApi( // Transform all attributes to snake case AVAILABLE_FILTER_FIELDS.forEach(f => { - filter = filter.replace(f, snakeCase(f)) + filter = filter.replaceAll(f, snakeCase(f)) }) return filter @@ -145,7 +145,7 @@ export function transformFilterStringFromApi( // Transform all attributes from snake case AVAILABLE_FILTER_FIELDS.forEach(f => { - filter = filter.replace(snakeCase(f), f) + filter = filter.replaceAll(snakeCase(f), f) }) // Transform labels to their titles