From d6c53b40bb1cc9cbf7a9f2a9760bdbe5325e5a84 Mon Sep 17 00:00:00 2001 From: Sonarly Claude Code Date: Wed, 18 Feb 2026 22:49:42 +0000 Subject: [PATCH] Fix ADDRESS field persist error when lat/lng values are strings The addressLat and addressLng fields use the NUMERIC type (BigFloat scalar), which can arrive as strings in some data paths. The Zod validation schema in isFieldAddressValue only accepted numbers, causing the persist operation to throw "Invalid value to persist" for ADDRESS type fields. Updated the schema and types to accept both string and number values for addressLat and addressLng. Co-Authored-By: Claude Opus 4.6 --- .../record-field/ui/types/FieldInputDraftValue.ts | 4 ++-- .../record-field/ui/types/FieldMetadata.ts | 4 ++-- .../guards/__tests__/isFieldAddressValue.test.ts | 15 +++++++++++++++ .../ui/types/guards/isFieldAddressValue.ts | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldInputDraftValue.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldInputDraftValue.ts index f40baedab82..836bf5ec6fc 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldInputDraftValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldInputDraftValue.ts @@ -55,8 +55,8 @@ export type FieldAddressDraftValue = { addressState: string | null; addressPostcode: string | null; addressCountry: string | null; - addressLat: number | null; - addressLng: number | null; + addressLat: number | string | null; + addressLng: number | string | null; }; export type FieldJsonDraftValue = string; export type FieldActorDraftValue = { diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts index f12819776e6..2a4ad1107c1 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts @@ -267,8 +267,8 @@ export type FieldAddressValue = { addressState: string | null; addressPostcode: string | null; addressCountry: string | null; - addressLat: number | null; - addressLng: number | null; + addressLat: number | string | null; + addressLng: number | string | null; }; export type FieldSelectValue = string | null; export type FieldMultiSelectValue = string[] | null; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/__tests__/isFieldAddressValue.test.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/__tests__/isFieldAddressValue.test.ts index 9e0e1e891ea..ddf1a81913e 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/__tests__/isFieldAddressValue.test.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/__tests__/isFieldAddressValue.test.ts @@ -34,6 +34,21 @@ describe('isFieldAddressValue', () => { ).toBe(true); }); + it('should return true for address values with string lat/lng', () => { + expect( + isFieldAddressValue({ + addressStreet1: '', + addressStreet2: '', + addressCity: '', + addressState: '', + addressPostcode: '', + addressCountry: 'Türkiye', + addressLat: '38.963745', + addressLng: '35.243322', + }), + ).toBe(true); + }); + it('should return false for incomplete address', () => { expect(isFieldAddressValue({ addressStreet1: '123 Main St' })).toBe(false); }); diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts index 157ba39f6c0..5b411e36c6e 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts @@ -10,8 +10,8 @@ export const addressSchema = z.object({ addressState: z.string().nullable(), addressPostcode: z.string().nullable(), addressCountry: z.string().nullable(), - addressLat: z.number().nullable(), - addressLng: z.number().nullable(), + addressLat: z.union([z.number(), z.string()]).nullable(), + addressLng: z.union([z.number(), z.string()]).nullable(), }); export const isFieldAddressValue = (