From 625466f38d6bc8742215e3f8c1ca52ed1ff989bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:31:02 +0100 Subject: [PATCH] Fix optimistic effect for implicit and filters (#9935) The optimistic effect for record creations and updates wasn't working properly for `and filters` without explicit `and`. The problem was located inside `isRecordMatchingFilter` which didn't consider implicit `and filters` as `and filters`. This caused queries to be updated by the optimistic effect even if they didn't match the root query filter. I also removed `fetchPolicy: 'cache-and-network'` from a query. This was a temporary fix for this issue. Co-authored-by: Lucas Bordeau --- .../useFindManyRecordsSelectedInContextStore.ts | 1 - .../record-filter/utils/isRecordMatchingFilter.ts | 13 +++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts b/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts index 5a7b25bfb..5743292a5 100644 --- a/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts +++ b/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts @@ -53,7 +53,6 @@ export const useFindManyRecordsSelectedInContextStore = ({ contextStoreTargetedRecordsRule.mode === 'selection' && contextStoreTargetedRecordsRule.selectedRecordIds.length === 0, limit, - fetchPolicy: 'cache-and-network', }); return { diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts index 073846bd1..1124458b6 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts @@ -50,6 +50,9 @@ const isAndFilter = ( filter: RecordGqlOperationFilter, ): filter is AndObjectRecordFilter => 'and' in filter && !!filter.and; +const isImplicitAndFilter = (filter: RecordGqlOperationFilter) => + Object.keys(filter).length > 1; + const isOrFilter = ( filter: RecordGqlOperationFilter, ): filter is OrObjectRecordFilter => 'or' in filter && !!filter.or; @@ -71,6 +74,16 @@ export const isRecordMatchingFilter = ({ return true; } + if (isImplicitAndFilter(filter)) { + return Object.entries(filter).every(([filterKey, value]) => + isRecordMatchingFilter({ + record, + filter: { [filterKey]: value }, + objectMetadataItem, + }), + ); + } + if (isAndFilter(filter)) { const filterValue = filter.and;