From 7dac60cfee91554e6c5bc45d46b4623554e04e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:27:55 +0100 Subject: [PATCH] Fix useFindManyRecords withSoftDeleterFilter (#11056) Fixes #11038 # Fix useFindManyRecords withSoftDeleterFilter The error came from a faulty implementation of the `withSoftDeleted` parameter inside `useFindManyRecords` and from the fact that `withSoftDeleted: true` was added to access deleted records actions. However, this parameter was always set in `useFindManyRecordsSelectedInContextStore` instead of considering whether the filter was active or not. ``` const withSoftDeleterFilter = { or: [{ deletedAt: { is: 'NULL' } }, { deletedAt: { is: 'NOT_NULL' } }], }; ``` The final filter was incorrectly doing an `or` operation between the base filter and `withSoftDeleterFilter` when it should have been an `and`: ``` filter: { ...filter, ...(withSoftDeleted ? withSoftDeleterFilter : {}), } ``` The correct implementation should be: ``` filter: filter || withSoftDeleted ? { and: [ ...(filter ? [filter] : []), ...(withSoftDeleted ? [withSoftDeleterFilter] : []), ], } : undefined, ``` # Fix useFindManyRecordsSelectedInContextStore - Check if the soft deleted filter is active before using the `withSoftDeleterFilter` parameter --- .../ResetContextToSelectionCommandButton.tsx | 3 ++- ...seFindManyRecordsSelectedInContextStore.ts | 22 ++++++++++++++++++- .../object-record/hooks/useFindManyRecords.ts | 12 +++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/twenty-front/src/modules/command-menu/components/ResetContextToSelectionCommandButton.tsx b/packages/twenty-front/src/modules/command-menu/components/ResetContextToSelectionCommandButton.tsx index 459a0216e..3bd5433fd 100644 --- a/packages/twenty-front/src/modules/command-menu/components/ResetContextToSelectionCommandButton.tsx +++ b/packages/twenty-front/src/modules/command-menu/components/ResetContextToSelectionCommandButton.tsx @@ -1,5 +1,6 @@ import { CommandMenuContextRecordsChip } from '@/command-menu/components/CommandMenuContextRecordsChip'; import { CommandMenuItem } from '@/command-menu/components/CommandMenuItem'; +import { COMMAND_MENU_PREVIOUS_COMPONENT_INSTANCE_ID } from '@/command-menu/constants/CommandMenuPreviousComponentInstanceId'; import { RESET_CONTEXT_TO_SELECTION } from '@/command-menu/constants/ResetContextToSelection'; import { useResetPreviousCommandMenuContext } from '@/command-menu/hooks/useResetPreviousCommandMenuContext'; import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState'; @@ -48,7 +49,7 @@ export const ResetContextToSelectionCommandButton = () => { RightComponent={ } onClick={resetPreviousCommandMenuContext} 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 02a84b96c..4730f463e 100644 --- a/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts +++ b/packages/twenty-front/src/modules/context-store/hooks/useFindManyRecordsSelectedInContextStore.ts @@ -3,9 +3,12 @@ import { contextStoreFiltersComponentState } from '@/context-store/states/contex import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters'; import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; +import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies'; +import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; +import { useRecoilValue } from 'recoil'; export const useFindManyRecordsSelectedInContextStore = ({ instanceId, @@ -35,6 +38,23 @@ export const useFindManyRecordsSelectedInContextStore = ({ const { filterValueDependencies } = useFilterValueDependencies(); + const objectMetadataItems = useRecoilValue(objectMetadataItemsState); + + const allFieldMetadataItems = objectMetadataItems.flatMap( + (objectMetadataItem) => objectMetadataItem.fields, + ); + + const isSoftDeleteFilterActive = contextStoreFilters.some((filter) => { + const foundFieldMetadataItem = allFieldMetadataItems.find( + (fieldMetadataItem) => fieldMetadataItem.id === filter.fieldMetadataId, + ); + + return ( + foundFieldMetadataItem?.name === 'deletedAt' && + filter.operand === RecordFilterOperand.IsNotEmpty + ); + }); + const queryFilter = computeContextStoreFilters( contextStoreTargetedRecordsRule, contextStoreFilters, @@ -46,7 +66,7 @@ export const useFindManyRecordsSelectedInContextStore = ({ const { records, loading, totalCount } = useFindManyRecords({ objectNameSingular: objectMetadataItem?.nameSingular ?? '', filter: queryFilter, - withSoftDeleted: true, + withSoftDeleted: isSoftDeleteFilterActive, orderBy: [ { position: 'AscNullsFirst', diff --git a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts index 3d8e2329f..c24945b72 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts @@ -72,14 +72,14 @@ export const useFindManyRecords = ({ useQuery(findManyRecordsQuery, { skip: skip || !objectMetadataItem, variables: { - ...(filter || withSoftDeleted + filter: withSoftDeleted ? { - filter: { - ...filter, - ...(withSoftDeleted ? withSoftDeleterFilter : {}), - }, + and: [ + ...(filter ? [filter] : []), + ...(withSoftDeleted ? [withSoftDeleterFilter] : []), + ], } - : {}), + : filter, orderBy, lastCursor: cursorFilter?.cursor ?? undefined, limit,