From de4e78e5b25b0c924859f9418f4541d808ecd73a Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Fri, 5 Dec 2025 16:11:37 +0100 Subject: [PATCH] Fix workflow relation variables (#16362) display many to one relations instead of one to many --- .../should-generate-field-fake-value.spec.ts | 4 +-- .../utils/generate-object-record-fields.ts | 7 ++--- .../utils/should-generate-field-fake-value.ts | 26 +++++++++++++++---- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/__tests__/should-generate-field-fake-value.spec.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/__tests__/should-generate-field-fake-value.spec.ts index e99bed9a9a..44f0262248 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/__tests__/should-generate-field-fake-value.spec.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/__tests__/should-generate-field-fake-value.spec.ts @@ -56,7 +56,7 @@ describe('shouldGenerateFieldFakeValue', () => { expect(shouldGenerateFieldFakeValue(field)).toBe(true); }); - it('should return false for many-to-one relation fields', () => { + it('should return true for many-to-one relation fields', () => { const field = getFlatFieldMetadataMock({ objectMetadataId: '20202020-0000-0000-0000-000000000001', isSystem: false, @@ -69,6 +69,6 @@ describe('shouldGenerateFieldFakeValue', () => { }, }); - expect(shouldGenerateFieldFakeValue(field)).toBe(false); + expect(shouldGenerateFieldFakeValue(field)).toBe(true); }); }); diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/generate-object-record-fields.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/generate-object-record-fields.ts index 44ac25b726..61271eb968 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/generate-object-record-fields.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/generate-object-record-fields.ts @@ -2,6 +2,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type ObjectMetadataInfo } from 'src/modules/workflow/common/workspace-services/workflow-common.workspace-service'; import { type FieldOutputSchema } from 'src/modules/workflow/workflow-builder/workflow-schema/types/output-schema.type'; import { generateFakeObjectRecord } from 'src/modules/workflow/workflow-builder/workflow-schema/utils/generate-fake-object-record'; @@ -33,7 +34,7 @@ export const generateObjectRecordFields = ({ continue; } - if (field.type !== FieldMetadataType.RELATION) { + if (!isMorphOrRelationFlatFieldMetadata(field)) { result[field.name] = generateFakeRecordField({ type: field.type, label: field.label, @@ -44,10 +45,6 @@ export const generateObjectRecordFields = ({ continue; } - if (!isDefined(field.relationTargetObjectMetadataId)) { - continue; - } - if (depth < maxDepth) { const relationTargetObjectMetadata = flatObjectMetadataMaps.byId[field.relationTargetObjectMetadataId]; diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/should-generate-field-fake-value.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/should-generate-field-fake-value.ts index c589cef30f..fa4703cc3c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/should-generate-field-fake-value.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-schema/utils/should-generate-field-fake-value.ts @@ -2,6 +2,17 @@ import { FieldMetadataType, RelationType } from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; + +const EXCLUDED_SYSTEM_FIELDS = ['searchVector', 'position']; + +const isActiveField = (field: FlatFieldMetadata) => { + return field.isActive; +}; + +const isExcludedSystemField = (field: FlatFieldMetadata) => { + return field.isSystem && EXCLUDED_SYSTEM_FIELDS.includes(field.name); +}; const isManyToOneRelationField = (field: FlatFieldMetadata) => { if (isFlatFieldMetadataOfType(field, FieldMetadataType.RELATION)) { @@ -11,12 +22,17 @@ const isManyToOneRelationField = (field: FlatFieldMetadata) => { return false; }; -const EXCLUDED_SYSTEM_FIELDS = ['searchVector', 'position']; - -export const shouldGenerateFieldFakeValue = (field: FlatFieldMetadata) => { +const isExcludedRelationField = (field: FlatFieldMetadata) => { return ( - field.isActive && - !(EXCLUDED_SYSTEM_FIELDS.includes(field.name) && field.isSystem) && + isMorphOrRelationFlatFieldMetadata(field) && !isManyToOneRelationField(field) ); }; + +export const shouldGenerateFieldFakeValue = (field: FlatFieldMetadata) => { + return ( + isActiveField(field) && + !isExcludedSystemField(field) && + !isExcludedRelationField(field) + ); +};