diff --git a/packages/twenty-front/src/modules/object-record/cache/hooks/useCreateOneRecordInCache.ts b/packages/twenty-front/src/modules/object-record/cache/hooks/useCreateOneRecordInCache.ts index 2dd6dc9fb..b2b80c0ed 100644 --- a/packages/twenty-front/src/modules/object-record/cache/hooks/useCreateOneRecordInCache.ts +++ b/packages/twenty-front/src/modules/object-record/cache/hooks/useCreateOneRecordInCache.ts @@ -7,7 +7,7 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord'; -import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { prefillRecord } from '@/object-record/utils/prefillRecord'; import { capitalize } from 'twenty-shared'; @@ -28,7 +28,7 @@ export const useCreateOneRecordInCache = ({ objectMetadataItem, input: record, }); - const recordGqlFields = generateDepthOneRecordGqlFields({ + const recordGqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: prefilledRecord, }); diff --git a/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts new file mode 100644 index 000000000..5f5de3f64 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts @@ -0,0 +1,49 @@ +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; +import { + getPersonObjectMetadataItem, + getPersonRecord, +} from '~/testing/mock-data/people'; + +describe('computeDepthOneRecordGqlFieldsFromRecord', () => { + const objectMetadataItem = getPersonObjectMetadataItem(); + it('Should handle basic call', () => { + const personRecord = getPersonRecord(); + const result = computeDepthOneRecordGqlFieldsFromRecord({ + objectMetadataItem, + record: personRecord, + }); + expect(result).toMatchInlineSnapshot(` +{ + "attachments": false, + "avatarUrl": false, + "calendarEventParticipants": false, + "city": true, + "company": true, + "companyId": false, + "createdAt": true, + "createdBy": true, + "deletedAt": true, + "emails": false, + "favorites": false, + "id": true, + "intro": false, + "jobTitle": true, + "linkedinLink": true, + "messageParticipants": false, + "name": true, + "noteTargets": true, + "performanceRating": false, + "phones": true, + "pointOfContactForOpportunities": false, + "position": true, + "searchVector": false, + "taskTargets": true, + "timelineActivities": false, + "updatedAt": false, + "whatsapp": false, + "workPreference": false, + "xLink": true, +} +`); + }); +}); diff --git a/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/generateDepthOneRecordGqlFields.test.ts b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/generateDepthOneRecordGqlFields.test.ts index dcde53c7d..78f7b9692 100644 --- a/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/generateDepthOneRecordGqlFields.test.ts +++ b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/generateDepthOneRecordGqlFields.test.ts @@ -1,52 +1,8 @@ import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; -import { - getPersonObjectMetadataItem, - getPersonRecord, -} from '~/testing/mock-data/people'; +import { getPersonObjectMetadataItem } from '~/testing/mock-data/people'; describe('generateDepthOneRecordGqlFields', () => { const objectMetadataItem = getPersonObjectMetadataItem(); - it('Should handle basic call with both objectMetadataItem and record', () => { - const personRecord = getPersonRecord(); - const result = generateDepthOneRecordGqlFields({ - objectMetadataItem, - record: personRecord, - }); - expect(result).toMatchInlineSnapshot(` -{ - "attachments": false, - "avatarUrl": false, - "calendarEventParticipants": false, - "city": true, - "company": true, - "companyId": false, - "createdAt": true, - "createdBy": true, - "deletedAt": true, - "emails": false, - "favorites": false, - "id": true, - "intro": false, - "jobTitle": true, - "linkedinLink": true, - "messageParticipants": false, - "name": true, - "noteTargets": true, - "performanceRating": false, - "phones": true, - "pointOfContactForOpportunities": false, - "position": true, - "searchVector": false, - "taskTargets": true, - "timelineActivities": false, - "updatedAt": false, - "whatsapp": false, - "workPreference": false, - "xLink": true, -} -`); - }); - it('Should handle basic call with standalone objectMetadataItem', () => { const result = generateDepthOneRecordGqlFields({ objectMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord.ts b/packages/twenty-front/src/modules/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord.ts new file mode 100644 index 000000000..9f81f92c0 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord.ts @@ -0,0 +1,29 @@ +import { + GenerateDepthOneRecordGqlFields, + generateDepthOneRecordGqlFields, +} from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { ObjectRecord } from '@/object-record/types/ObjectRecord'; + +type ComputeDepthOneRecordGqlFieldsFromRecordArgs = + GenerateDepthOneRecordGqlFields & { + record: Partial; + }; +export const computeDepthOneRecordGqlFieldsFromRecord = ({ + objectMetadataItem, + record, +}: ComputeDepthOneRecordGqlFieldsFromRecordArgs) => { + const depthOneRecordGqlFields = generateDepthOneRecordGqlFields({ + objectMetadataItem, + }); + const recordKeys = Object.keys(record); + + return Object.keys(depthOneRecordGqlFields).reduce>( + (acc, key) => { + return { + ...acc, + [key]: recordKeys.includes(key), + }; + }, + depthOneRecordGqlFields, + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/graphql/utils/generateDepthOneRecordGqlFields.ts b/packages/twenty-front/src/modules/object-record/graphql/utils/generateDepthOneRecordGqlFields.ts index ae321bb40..0c76661bd 100644 --- a/packages/twenty-front/src/modules/object-record/graphql/utils/generateDepthOneRecordGqlFields.ts +++ b/packages/twenty-front/src/modules/object-record/graphql/utils/generateDepthOneRecordGqlFields.ts @@ -1,30 +1,14 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isDefined } from 'twenty-shared'; +export type GenerateDepthOneRecordGqlFields = { + objectMetadataItem: ObjectMetadataItem; +}; export const generateDepthOneRecordGqlFields = ({ objectMetadataItem, - record, -}: { - objectMetadataItem: ObjectMetadataItem; - record?: Record; -}) => { - const gqlFieldsFromObjectMetadataItem = objectMetadataItem.fields.reduce< - Record - >((acc, field) => { +}: GenerateDepthOneRecordGqlFields) => + objectMetadataItem.fields.reduce>((acc, field) => { return { ...acc, [field.name]: true, }; }, {}); - - if (isDefined(record)) { - return Object.keys(gqlFieldsFromObjectMetadataItem).reduce((acc, key) => { - return { - ...acc, - [key]: Object.keys(record).includes(key), - }; - }, gqlFieldsFromObjectMetadataItem); - } - - return gqlFieldsFromObjectMetadataItem; -}; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx index b46bf4ba2..11e43b351 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx @@ -2,7 +2,7 @@ import { renderHook, waitFor } from '@testing-library/react'; import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; -import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { personIds, personRecords, @@ -115,7 +115,7 @@ describe('useDeleteManyRecords', () => { objectMetadataItem, objectMetadataItems, record, - recordGqlFields: generateDepthOneRecordGqlFields({ + recordGqlFields: computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record, }), diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx index ba80fd6f6..50704f96b 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx @@ -3,7 +3,7 @@ import { act } from 'react'; import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; -import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { query, responseData, @@ -169,7 +169,7 @@ describe('useDeleteOneRecord', () => { describe('B. Starting from filled cache', () => { beforeEach(() => { - const recordGqlFields = generateDepthOneRecordGqlFields({ + const recordGqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: personRecord, }); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useAttachRelatedRecordFromRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useAttachRelatedRecordFromRecord.ts index ddbda5587..0d7c8e7d8 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useAttachRelatedRecordFromRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useAttachRelatedRecordFromRecord.ts @@ -4,7 +4,7 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; -import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { isDefined } from 'twenty-shared'; @@ -85,7 +85,7 @@ export const useAttachRelatedRecordFromRecord = ({ ...cachedRelatedRecord, [fieldOnRelatedObject]: previousRecord, }; - const gqlFields = generateDepthOneRecordGqlFields({ + const gqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem: relatedObjectMetadataItem, record: previousRecordWithRelation, }); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts index d202c4271..8b40a1aca 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts @@ -8,6 +8,7 @@ import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordF import { getObjectTypename } from '@/object-record/cache/utils/getObjectTypename'; import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; import { useRefetchAggregateQueries } from '@/object-record/hooks/useRefetchAggregateQueries'; import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation'; @@ -105,7 +106,7 @@ export const useUpdateOneRecord = < isDefined(cachedRecordWithConnection); if (shouldHandleOptimisticCache) { - const recordGqlFields = generateDepthOneRecordGqlFields({ + const recordGqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: optimisticRecordInput, }); @@ -165,7 +166,7 @@ export const useUpdateOneRecord = < ).filter((diffKey) => !cachedRecordKeys.has(diffKey)); const recordGqlFields = { - ...generateDepthOneRecordGqlFields({ + ...computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: cachedRecord, }), 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 70c18219e..cfb00f9c9 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 @@ -1,6 +1,6 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; -import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { computeDepthOneRecordGqlFieldsFromRecord } from '@/object-record/graphql/utils/computeDepthOneRecordGqlFieldsFromRecord'; import { FieldActorForInputValue } from '@/object-record/record-field/types/FieldMetadata'; import { computeOptimisticRecordFromInput } from '@/object-record/utils/computeOptimisticRecordFromInput'; import { InMemoryCache } from '@apollo/client'; @@ -123,7 +123,7 @@ describe('computeOptimisticRecordFromInput', () => { (field) => field.name === 'id', ), }; - const recordGqlFields = generateDepthOneRecordGqlFields({ + const recordGqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: companyRecord, }); @@ -168,7 +168,7 @@ describe('computeOptimisticRecordFromInput', () => { (field) => field.name === 'id', ), }; - const recordGqlFields = generateDepthOneRecordGqlFields({ + const recordGqlFields = computeDepthOneRecordGqlFieldsFromRecord({ objectMetadataItem, record: companyRecord, });