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,