From f86c5e78b1f43a651aa1228ba76d8a3d3f38afe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Delassus?= Date: Tue, 18 Nov 2025 11:14:38 +0100 Subject: [PATCH] fix(workflow): UUID filter in "Search Records" action (#15817) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - add a regression test that reproduces the workflow "Search Records → ID is " failure (issue #15067 / #15746) - adjust `turnRecordFilterIntoRecordGqlOperationFilter` so UUID filters fall back to the literal value when no `recordIdsForUuid` context is provided, always emitting an `in` clause ## Testing - npx nx test twenty-shared -- --testPathPattern=computeRecordGqlOperationFilter.test.ts --coverage=false - Manual: workflow "Search Records" with filter "ID is " now returns the correct record Fixes #15067 Fixes #15746 --------- Co-authored-by: remi Co-authored-by: Lucas Bordeau --- .../computeRecordGqlOperationFilter.test.ts | 42 +++++++++++++++++++ .../turnRecordFilterIntoGqlOperationFilter.ts | 4 +- 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 packages/twenty-shared/src/utils/filter/__tests__/computeRecordGqlOperationFilter.test.ts diff --git a/packages/twenty-shared/src/utils/filter/__tests__/computeRecordGqlOperationFilter.test.ts b/packages/twenty-shared/src/utils/filter/__tests__/computeRecordGqlOperationFilter.test.ts new file mode 100644 index 0000000000..ab02020562 --- /dev/null +++ b/packages/twenty-shared/src/utils/filter/__tests__/computeRecordGqlOperationFilter.test.ts @@ -0,0 +1,42 @@ +import { computeRecordGqlOperationFilter } from '../computeRecordGqlOperationFilter'; +import type { RecordFilter } from '../turnRecordFilterGroupIntoGqlOperationFilter'; + +import { FieldMetadataType } from '@/types/FieldMetadataType'; +import type { PartialFieldMetadataItem } from '@/types/PartialFieldMetadataItem'; +import { ViewFilterOperand } from '@/types/ViewFilterOperand'; + +describe('computeRecordGqlOperationFilter', () => { + it('should match Is UUID', () => { + const companyIdField: PartialFieldMetadataItem = { + id: 'company-id-field', + name: 'id', + label: 'ID', + type: FieldMetadataType.UUID, + }; + + const uuidValue = '4f83d5c0-7c7a-4f67-9f29-0a6aad1f4eb1'; + + const recordFilters: RecordFilter[] = [ + { + id: 'uuid-filter', + fieldMetadataId: companyIdField.id, + value: uuidValue, + type: 'UUID', + operand: ViewFilterOperand.IS, + }, + ]; + + const filter = computeRecordGqlOperationFilter({ + fields: [companyIdField], + recordFilters, + recordFilterGroups: [], + filterValueDependencies: {}, + }); + + expect(filter).toEqual({ + id: { + in: [uuidValue], + }, + }); + }); +}); diff --git a/packages/twenty-shared/src/utils/filter/turnRecordFilterIntoGqlOperationFilter.ts b/packages/twenty-shared/src/utils/filter/turnRecordFilterIntoGqlOperationFilter.ts index b64b4896e7..b2baffea11 100644 --- a/packages/twenty-shared/src/utils/filter/turnRecordFilterIntoGqlOperationFilter.ts +++ b/packages/twenty-shared/src/utils/filter/turnRecordFilterIntoGqlOperationFilter.ts @@ -70,13 +70,11 @@ type TurnRecordFilterIntoRecordGqlOperationFilterParams = { filterValueDependencies?: RecordFilterValueDependencies; recordFilter: RecordFilter; fieldMetadataItems: FieldShared[]; - recordIdsForUuid?: string[]; }; export const turnRecordFilterIntoRecordGqlOperationFilter = ({ recordFilter, fieldMetadataItems, - recordIdsForUuid, filterValueDependencies, }: TurnRecordFilterIntoRecordGqlOperationFilterParams): | RecordGqlOperationFilter @@ -1303,7 +1301,7 @@ export const turnRecordFilterIntoRecordGqlOperationFilter = ({ }; } case 'UUID': { - const recordIds = recordIdsForUuid; + const recordIds = arrayOfUuidOrVariableSchema.parse(recordFilter.value); if (!isDefined(recordIds) || recordIds.length === 0) return;