From 49f33bbe2e84520504cef69547330184ecdf7aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tha=C3=AFs?= Date: Tue, 30 Jan 2024 05:33:28 -0300 Subject: [PATCH] fix: fix record deletion optimistic effect (#3683) * fix: fix record deletion optimistic effect * fix: fix renamed method after rebase * Re-add evict --------- Co-authored-by: Charles Bochet --- .../triggerCreateRecordsOptimisticEffect.ts | 4 +-- .../triggerDeleteRecordsOptimisticEffect.ts | 10 +++--- .../triggerUpdateRecordOptimisticEffect.ts | 4 +-- .../command-menu/components/CommandMenu.tsx | 33 ++++++++++--------- ...turnObjectDropdownFilterIntoQueryFilter.ts | 11 +++---- .../hooks/useSearchFilterPerMetadataItem.ts | 32 ++++++++++-------- 6 files changed, 52 insertions(+), 42 deletions(-) diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect.ts index 13072b212..4ca7e2f92 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect.ts @@ -29,7 +29,7 @@ export const triggerCreateRecordsOptimisticEffect = ({ [objectMetadataItem.namePlural]: ( cachedConnection, { - INVALIDATE: _INVALIDATE, + DELETE: _DELETE, readField, storeFieldName: _storeFieldName, toReference, @@ -97,7 +97,7 @@ export const triggerCreateRecordsOptimisticEffect = ({ cachedEdges?.length === variables.first && nextCachedEdges.length < variables.first ) { - return INVALIDATE; + return DELETE; } if (nextCachedEdges.length > variables.first) { diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts index d2d8e1af2..51e6c3b9b 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect.ts @@ -21,7 +21,7 @@ export const triggerDeleteRecordsOptimisticEffect = ({ fields: { [objectMetadataItem.namePlural]: ( cachedConnection, - { INVALIDATE, readField, storeFieldName }, + { DELETE, readField, storeFieldName }, ) => { if ( !isCachedObjectConnection( @@ -49,12 +49,14 @@ export const triggerDeleteRecordsOptimisticEffect = ({ return nodeId && !recordIds.includes(nodeId); }) || []; + if (nextCachedEdges.length === cachedEdges?.length) + return cachedConnection; + if ( isDefined(variables?.first) && - cachedEdges?.length === variables.first && - nextCachedEdges.length < variables.first + cachedEdges?.length === variables.first ) { - return INVALIDATE; + return DELETE; } return { ...cachedConnection, edges: nextCachedEdges }; diff --git a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts index c754f4619..4da9b2839 100644 --- a/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect.ts @@ -28,7 +28,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ fields: { [objectMetadataItem.namePlural]: ( cachedConnection, - { INVALIDATE, readField, storeFieldName, toReference }, + { DELETE, readField, storeFieldName, toReference }, ) => { if ( !isCachedObjectConnection( @@ -93,7 +93,7 @@ export const triggerUpdateRecordOptimisticEffect = ({ cachedEdges?.length === variables.first && nextCachedEdges.length < variables.first ) { - return INVALIDATE; + return DELETE; } // If next edges length exceeds the required limit, diff --git a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx index 6c4bf3433..1e3a47224 100644 --- a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx +++ b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx @@ -8,6 +8,7 @@ import { Company } from '@/companies/types/Company'; import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; +import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables'; import { Person } from '@/people/types/Person'; import { IconNotes } from '@/ui/display/icon'; import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; @@ -134,33 +135,35 @@ export const CommandMenu = () => { const { records: people } = useFindManyRecords({ skip: !isCommandMenuOpened, objectNameSingular: CoreObjectNameSingular.Person, - filter: { - or: [ - { name: { firstName: { ilike: `%${search}%` } } }, - { name: { firstName: { ilike: `%${search}%` } } }, - ], - }, + filter: search + ? makeOrFilterVariables([ + { name: { firstName: { ilike: `%${search}%` } } }, + { name: { firstName: { ilike: `%${search}%` } } }, + ]) + : undefined, limit: 3, }); const { records: companies } = useFindManyRecords({ skip: !isCommandMenuOpened, objectNameSingular: CoreObjectNameSingular.Company, - filter: { - name: { ilike: `%${search}%` }, - }, + filter: search + ? { + name: { ilike: `%${search}%` }, + } + : undefined, limit: 3, }); const { records: activities } = useFindManyRecords({ skip: !isCommandMenuOpened, objectNameSingular: CoreObjectNameSingular.Activity, - filter: { - or: [ - { title: { ilike: `%${search}%` } }, - { body: { ilike: `%${search}%` } }, - ], - }, + filter: search + ? makeOrFilterVariables([ + { title: { ilike: `%${search}%` } }, + { body: { ilike: `%${search}%` } }, + ]) + : undefined, limit: 3, }); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts index 09c716ff5..5c19a8fa2 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts @@ -1,5 +1,3 @@ -import { isNonEmptyString } from '@sniptt/guards'; - import { CurrencyFilter, DateFilter, @@ -13,6 +11,7 @@ import { import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { Field } from '~/generated/graphql'; +import { isDefined } from '~/utils/isDefined'; import { Filter } from '../../object-filter-dropdown/types/Filter'; @@ -39,6 +38,10 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( ); } + if (!isDefined(rawUIFilter.value) || rawUIFilter.value === '') { + return undefined; + } + switch (rawUIFilter.definition.type) { case 'EMAIL': case 'PHONE': @@ -111,10 +114,6 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( } break; case 'RELATION': { - if (!isNonEmptyString(rawUIFilter.value)) { - break; - } - try { JSON.parse(rawUIFilter.value); } catch (e) { diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts index b2f1d8c3f..1f54a8e96 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useSearchFilterPerMetadataItem.ts @@ -1,8 +1,7 @@ -import { isNonEmptyString } from '@sniptt/guards'; - import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem'; import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter'; +import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables'; import { FieldMetadataType } from '~/generated/graphql'; import { isDefined } from '~/utils/isDefined'; @@ -17,7 +16,7 @@ export const useSearchFilterPerMetadataItem = ({ Object.fromEntries( objectMetadataItems .map((objectMetadataItem) => { - if (!isNonEmptyString(searchFilterValue)) return null; + if (searchFilterValue === '') return null; const labelIdentifierFieldMetadataItem = getLabelIdentifierFieldMetadataItem(objectMetadataItem); @@ -27,8 +26,8 @@ export const useSearchFilterPerMetadataItem = ({ if (labelIdentifierFieldMetadataItem) { switch (labelIdentifierFieldMetadataItem.type) { case FieldMetadataType.FullName: { - searchFilter = { - or: [ + if (searchFilterValue) { + const fullNameFilter = makeOrFilterVariables([ { [labelIdentifierFieldMetadataItem.name]: { firstName: { @@ -43,16 +42,23 @@ export const useSearchFilterPerMetadataItem = ({ }, }, }, - ], - }; + ]); + + if (fullNameFilter) { + searchFilter = fullNameFilter; + } + } break; } - default: - searchFilter = { - [labelIdentifierFieldMetadataItem.name]: { - ilike: `%${searchFilterValue}%`, - }, - }; + default: { + if (searchFilterValue) { + searchFilter = { + [labelIdentifierFieldMetadataItem.name]: { + ilike: `%${searchFilterValue}%`, + }, + }; + } + } } }