diff --git a/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecords.ts index 5fd639305c..a348b1cbd1 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useCreateManyRecords.ts @@ -133,7 +133,7 @@ export const useCreateManyRecords = < currentWorkspaceMember: currentWorkspaceMember, recordInput: { ...baseOptimisticRecordInputCreatedBy, - ...recordToCreate, + ...sanitizedRecord, }, objectPermissionsByObjectMetadataId, }), diff --git a/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts index ef1ba30e71..34002485fe 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts @@ -101,8 +101,7 @@ export const useCreateOneRecord = < objectMetadataItems, recordInput: { ...computeOptimisticCreateRecordBaseRecordInput(objectMetadataItem), - ...recordInput, - id: idForCreation, + ...sanitizedInput, }, objectPermissionsByObjectMetadataId, }); diff --git a/packages/twenty-front/src/modules/object-record/utils/__tests__/computeOptimisticRecordFromInput.test.ts b/packages/twenty-front/src/modules/object-record/utils/__tests__/computeOptimisticRecordFromInput.test.ts index e3e1dddc89..4f43c2c5e7 100644 --- a/packages/twenty-front/src/modules/object-record/utils/__tests__/computeOptimisticRecordFromInput.test.ts +++ b/packages/twenty-front/src/modules/object-record/utils/__tests__/computeOptimisticRecordFromInput.test.ts @@ -5,6 +5,7 @@ import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordF import { generateDepthRecordGqlFieldsFromRecord } from '@/object-record/graphql/record-gql-fields/utils/generateDepthRecordGqlFieldsFromRecord'; import { type FieldActorForInputValue } from '@/object-record/record-field/ui/types/FieldMetadata'; import { computeOptimisticRecordFromInput } from '@/object-record/utils/computeOptimisticRecordFromInput'; +import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput'; import { type WorkspaceMember } from '@/workspace-member/types/WorkspaceMember'; import { InMemoryCache } from '@apollo/client'; import { mockedWorkspaceMemberRecords } from '~/testing/mock-data/generated/data/workspaceMembers/mock-workspaceMembers-data'; @@ -274,4 +275,31 @@ describe('computeOptimisticRecordFromInput', () => { `"Should never occur, encountered unknown fields unknwon, foo, bar in objectMetadataItem person"`, ); }); + + // Regression test for #15800 + it('should not throw when the input has been sanitized first', () => { + const cache = new InMemoryCache(); + const personObjectMetadataItem = getMockObjectMetadataItemOrThrow('person'); + + const sanitizedInput = sanitizeRecordInput({ + objectMetadataItem: personObjectMetadataItem, + recordInput: { + city: 'Paris', + nonExistentField: 'should be stripped', + }, + }); + + const result = computeOptimisticRecordFromInput({ + currentWorkspaceMember, + objectMetadataItems: getTestEnrichedObjectMetadataItemsMock(), + objectMetadataItem: personObjectMetadataItem, + recordInput: sanitizedInput, + cache, + objectPermissionsByObjectMetadataId: {}, + }); + + expect(result).toEqual({ + city: 'Paris', + }); + }); });