diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts new file mode 100644 index 0000000000..477d5abd6b --- /dev/null +++ b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts @@ -0,0 +1,2 @@ +export const MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER = + 'e8c7e9c5-2b4f-4a75-ae46-ea331809106c'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts new file mode 100644 index 0000000000..8cba6d1ae8 --- /dev/null +++ b/packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts @@ -0,0 +1,27 @@ +import { defineViewField } from 'twenty-sdk/define'; + +import { MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier'; +import { MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier'; + +// TODO: hardcoded because the published twenty-sdk (2.14.0) predates the +// calendarEventRecordPageFields view. Replace both with +// STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.calendarEvent.views.calendarEventRecordPageFields +// once the SDK is republished with this view. +const CALENDAR_EVENT_RECORD_PAGE_FIELDS_VIEW_UNIVERSAL_IDENTIFIER = + 'c73668d1-022d-4eaf-b825-4e2548180db6'; +const CALENDAR_EVENT_RECORD_PAGE_FIELDS_GENERAL_GROUP_UNIVERSAL_IDENTIFIER = + 'aeadeb9e-3673-4c0c-8845-f59cb1e6ca42'; + +export default defineViewField({ + universalIdentifier: + MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER, + viewUniversalIdentifier: + CALENDAR_EVENT_RECORD_PAGE_FIELDS_VIEW_UNIVERSAL_IDENTIFIER, + viewFieldGroupUniversalIdentifier: + CALENDAR_EVENT_RECORD_PAGE_FIELDS_GENERAL_GROUP_UNIVERSAL_IDENTIFIER, + fieldMetadataUniversalIdentifier: + MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER, + position: 8, + isVisible: true, + size: 150, +}); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication.ts new file mode 100644 index 0000000000..3f6c84a967 --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication.ts @@ -0,0 +1,20 @@ +import { useCallback } from 'react'; + +import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; +import { getIsMetadataItemFromStandardApplication } from '@/object-metadata/utils/getIsMetadataItemFromStandardApplication'; +import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; + +export const useGetIsMetadataItemFromStandardApplication = () => { + const currentWorkspace = useAtomStateValue(currentWorkspaceState); + + const applications = currentWorkspace?.installedApplications; + + return useCallback( + (metadataItem: { applicationId?: string | null }) => + getIsMetadataItemFromStandardApplication( + metadataItem, + applications ?? [], + ), + [applications], + ); +}; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getIsMetadataItemFromStandardApplication.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getIsMetadataItemFromStandardApplication.test.ts new file mode 100644 index 0000000000..863d50471e --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getIsMetadataItemFromStandardApplication.test.ts @@ -0,0 +1,55 @@ +import { getIsMetadataItemFromStandardApplication } from '@/object-metadata/utils/getIsMetadataItemFromStandardApplication'; +import { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER } from 'twenty-shared/application'; + +describe('getIsMetadataItemFromStandardApplication', () => { + const applications = [ + { + id: 'standard-application-id', + universalIdentifier: TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, + }, + { + id: 'workspace-custom-application-id', + universalIdentifier: 'workspace-custom-application-universal-id', + }, + { + id: 'installed-application-id', + universalIdentifier: 'installed-application-universal-id', + }, + ]; + + it('should return true when metadata item belongs to the standard application', () => { + expect( + getIsMetadataItemFromStandardApplication( + { applicationId: 'standard-application-id' }, + applications, + ), + ).toBe(true); + }); + + it('should return false when metadata item belongs to the workspace custom application', () => { + expect( + getIsMetadataItemFromStandardApplication( + { applicationId: 'workspace-custom-application-id' }, + applications, + ), + ).toBe(false); + }); + + it('should return false when metadata item belongs to an installed application', () => { + expect( + getIsMetadataItemFromStandardApplication( + { applicationId: 'installed-application-id' }, + applications, + ), + ).toBe(false); + }); + + it('should return undefined when metadata item application cannot be resolved', () => { + expect( + getIsMetadataItemFromStandardApplication( + { applicationId: 'unknown-application-id' }, + applications, + ), + ).toBeUndefined(); + }); +}); diff --git a/packages/twenty-front/src/modules/object-metadata/utils/getIsMetadataItemFromStandardApplication.ts b/packages/twenty-front/src/modules/object-metadata/utils/getIsMetadataItemFromStandardApplication.ts new file mode 100644 index 0000000000..6ce6a9997a --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/utils/getIsMetadataItemFromStandardApplication.ts @@ -0,0 +1,26 @@ +import { isTwentyStandardApplication } from '@/applications/utils/isTwentyStandardApplication'; +import { isDefined } from 'twenty-shared/utils'; + +type ApplicationLike = { + id: string; + universalIdentifier?: string | null; +}; + +export const getIsMetadataItemFromStandardApplication = ( + metadataItem: { applicationId?: string | null }, + applications: ApplicationLike[], +): boolean | undefined => { + if (!isDefined(metadataItem.applicationId)) { + return undefined; + } + + const application = applications.find( + (application) => application.id === metadataItem.applicationId, + ); + + if (!isDefined(application) || !isDefined(application.universalIdentifier)) { + return undefined; + } + + return isTwentyStandardApplication(application); +}; diff --git a/packages/twenty-front/src/modules/object-record/read-only/hooks/useIsRecordFieldReadOnly.ts b/packages/twenty-front/src/modules/object-record/read-only/hooks/useIsRecordFieldReadOnly.ts index 390c90ab84..c581642355 100644 --- a/packages/twenty-front/src/modules/object-record/read-only/hooks/useIsRecordFieldReadOnly.ts +++ b/packages/twenty-front/src/modules/object-record/read-only/hooks/useIsRecordFieldReadOnly.ts @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition'; import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject'; @@ -26,8 +26,8 @@ export const useIsRecordFieldReadOnly = ({ ); const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const objectPermissions = getObjectPermissionsForObject( objectPermissionsByObjectMetadataId, @@ -51,7 +51,8 @@ export const useIsRecordFieldReadOnly = ({ return isRecordFieldReadOnly({ isRecordReadOnly, isSystemObject: objectMetadataItem.isSystem, - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), objectPermissions, fieldMetadataItem, fieldDefinition, diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isRecordFieldReadOnly.test.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isRecordFieldReadOnly.test.ts index 6bc42422cb..921b4f5ff1 100644 --- a/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isRecordFieldReadOnly.test.ts +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isRecordFieldReadOnly.test.ts @@ -10,7 +10,6 @@ describe('isRecordFieldReadOnly', () => { const mockParams = { isRecordReadOnly: false, - isFieldCustom: false, objectPermissions: mockObjectPermissions, fieldMetadataId: 'field-123', fieldMetadataType: FieldMetadataType.TEXT, @@ -88,7 +87,35 @@ describe('isRecordFieldReadOnly', () => { expect(result).toBe(false); }); - it('should return true when field is non-custom on a system object', () => { + it('should return true when field is from the standard application on a system object', () => { + const result = isRecordFieldReadOnly({ + ...mockParams, + isSystemObject: true, + isFieldFromStandardApplication: true, + fieldMetadataItem: { + id: 'field-123', + isUIEditable: true, + }, + }); + + expect(result).toBe(true); + }); + + it('should return false when field is not from the standard application on a system object', () => { + const result = isRecordFieldReadOnly({ + ...mockParams, + isSystemObject: true, + isFieldFromStandardApplication: false, + fieldMetadataItem: { + id: 'field-123', + isUIEditable: true, + }, + }); + + expect(result).toBe(false); + }); + + it('should return true when field application is not resolved on a system object', () => { const result = isRecordFieldReadOnly({ ...mockParams, isSystemObject: true, @@ -101,20 +128,6 @@ describe('isRecordFieldReadOnly', () => { expect(result).toBe(true); }); - it('should return false when field is custom on a system object', () => { - const result = isRecordFieldReadOnly({ - ...mockParams, - isSystemObject: true, - isFieldCustom: true, - fieldMetadataItem: { - id: 'field-123', - isUIEditable: true, - }, - }); - - expect(result).toBe(false); - }); - it('should return false when isSystemObject is not provided', () => { const result = isRecordFieldReadOnly({ ...mockParams, diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/isRecordFieldReadOnly.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/isRecordFieldReadOnly.ts index 3c05292491..9865ee7d18 100644 --- a/packages/twenty-front/src/modules/object-record/read-only/utils/isRecordFieldReadOnly.ts +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/isRecordFieldReadOnly.ts @@ -15,7 +15,7 @@ type ObjectPermissionsByObjectMetadataId = Record< type IsRecordFieldReadOnlyParams = { isRecordReadOnly: boolean; isSystemObject?: boolean; - isFieldCustom: boolean; + isFieldFromStandardApplication?: boolean; fieldMetadataItem: Pick; objectPermissions: ObjectPermission; fieldDefinition?: FieldDefinition; @@ -26,7 +26,7 @@ export const isRecordFieldReadOnly = ({ objectPermissions, isRecordReadOnly, isSystemObject, - isFieldCustom, + isFieldFromStandardApplication, fieldMetadataItem, fieldDefinition, objectPermissionsByObjectMetadataId, @@ -44,9 +44,14 @@ export const isRecordFieldReadOnly = ({ objectPermissionsByObjectMetadataId, }); + // Keep system-object standard fields read-only. If the application origin + // cannot be resolved yet, fail closed until metadata finishes loading. + const isReadOnlyStandardFieldOnSystemObject = + isSystemObject === true && isFieldFromStandardApplication !== false; + return ( isRecordReadOnly || - (isSystemObject === true && !isFieldCustom) || + isReadOnlyStandardFieldOnSystemObject || !(fieldMetadataItem.isUIEditable ?? true) || fieldReadOnlyByPermissions || oneToManyTargetReadOnly diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCardBody.tsx b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCardBody.tsx index 3ae30f63c5..aba2f69082 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCardBody.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCardBody.tsx @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly'; import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext'; import { StopPropagationContainer } from '@/object-record/record-board/record-board-card/components/StopPropagationContainer'; @@ -55,8 +55,8 @@ export const RecordBoardCardBody = () => { const setRecordBoardCardHoverPosition = useSetAtomComponentState( recordBoardCardHoverPositionComponentState, ); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const handleMouseEnter = (index: number) => { setRecordBoardCardHoverPosition(index); @@ -78,10 +78,11 @@ export const RecordBoardCardBody = () => { isRecordFieldReadOnly: isRecordFieldReadOnly({ isRecordReadOnly, isSystemObject: objectMetadataItem.isSystem, - isFieldCustom: getIsMetadataItemCustom({ - applicationId: - correspondingFieldDefinition.metadata.applicationId, - }), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication({ + applicationId: + correspondingFieldDefinition.metadata.applicationId, + }), objectPermissions, fieldMetadataItem: { id: recordField.fieldMetadataItemId, diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/record-calendar-card/components/RecordCalendarCardBody.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/record-calendar-card/components/RecordCalendarCardBody.tsx index fc827cff4d..48472183c0 100644 --- a/packages/twenty-front/src/modules/object-record/record-calendar/record-calendar-card/components/RecordCalendarCardBody.tsx +++ b/packages/twenty-front/src/modules/object-record/record-calendar/record-calendar-card/components/RecordCalendarCardBody.tsx @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly'; import { StopPropagationContainer } from '@/object-record/record-board/record-board-card/components/StopPropagationContainer'; @@ -64,8 +64,8 @@ export const RecordCalendarCardBody = ({ const setRecordCalendarCardHoverPosition = useSetAtomComponentState( recordCalendarCardHoverPositionComponentState, ); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const handleMouseEnter = (index: number) => { setRecordCalendarCardHoverPosition(index); @@ -87,10 +87,11 @@ export const RecordCalendarCardBody = ({ isRecordFieldReadOnly: isRecordFieldReadOnly({ isRecordReadOnly, isSystemObject: objectMetadataItem.isSystem, - isFieldCustom: getIsMetadataItemCustom({ - applicationId: - correspondingFieldDefinition.metadata.applicationId, - }), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication({ + applicationId: + correspondingFieldDefinition.metadata.applicationId, + }), objectPermissions, fieldMetadataItem: { id: recordField.fieldMetadataItemId, diff --git a/packages/twenty-front/src/modules/object-record/record-field-list/components/RecordFieldList.tsx b/packages/twenty-front/src/modules/object-record/record-field-list/components/RecordFieldList.tsx index 1f985bdbc2..4f6aeb95d4 100644 --- a/packages/twenty-front/src/modules/object-record/record-field-list/components/RecordFieldList.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field-list/components/RecordFieldList.tsx @@ -1,5 +1,5 @@ import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell'; -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; @@ -58,8 +58,8 @@ export const RecordFieldList = ({ const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); const { objectMetadataItems } = useObjectMetadataItems(); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const { useUpdateOneObjectRecordMutation } = useRecordShowContainerActions({ objectNameSingular, @@ -131,7 +131,10 @@ export const RecordFieldList = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication( + fieldMetadataItem, + ), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, @@ -187,7 +190,8 @@ export const RecordFieldList = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, @@ -267,7 +271,8 @@ export const RecordFieldList = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextGeneric.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextGeneric.tsx index ed17e596f2..8587d85103 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextGeneric.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextGeneric.tsx @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject'; import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField'; import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly'; @@ -44,8 +44,8 @@ export const RecordTableCellFieldContextGeneric = ({ fieldDefinitionByFieldMetadataItemId[recordField.fieldMetadataItemId]; const updateRecord = useContext(RecordTableUpdateContext); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); let hasObjectReadPermissions = objectPermissions.canReadObjectRecords; @@ -113,9 +113,10 @@ export const RecordTableCellFieldContextGeneric = ({ isRecordFieldReadOnly({ isRecordReadOnly: isRecordReadOnly ?? false, isSystemObject: objectMetadataItem.isSystem, - isFieldCustom: getIsMetadataItemCustom({ - applicationId: fieldDefinition.metadata.applicationId, - }), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication({ + applicationId: fieldDefinition.metadata.applicationId, + }), objectPermissions, fieldMetadataItem: { id: fieldDefinition.fieldMetadataId, diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextLabelIdentifier.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextLabelIdentifier.tsx index 073aae7f57..597d4018c5 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextLabelIdentifier.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextLabelIdentifier.tsx @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject'; import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly'; import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; @@ -46,8 +46,8 @@ export const RecordTableCellFieldContextLabelIdentifier = ({ const hasObjectReadPermissions = objectPermissions.canReadObjectRecords; const updateRecord = useContext(RecordTableUpdateContext); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const fieldDefinition = fieldDefinitionByFieldMetadataItemId[recordField.fieldMetadataItemId]; @@ -70,9 +70,10 @@ export const RecordTableCellFieldContextLabelIdentifier = ({ isRecordFieldReadOnly({ isRecordReadOnly: isRecordReadOnly ?? false, isSystemObject: objectMetadataItem.isSystem, - isFieldCustom: getIsMetadataItemCustom({ - applicationId: fieldDefinition.metadata.applicationId, - }), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication({ + applicationId: fieldDefinition.metadata.applicationId, + }), objectPermissions, fieldMetadataItem: { id: recordField.fieldMetadataItemId, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetActionFieldEdit.tsx b/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetActionFieldEdit.tsx index a182c45a02..f18727c3b7 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetActionFieldEdit.tsx +++ b/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetActionFieldEdit.tsx @@ -1,5 +1,5 @@ import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById'; -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions'; @@ -49,8 +49,8 @@ export const WidgetActionFieldEdit = () => { ); const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const { useUpdateOneObjectRecordMutation } = useRecordShowContainerActions({ objectNameSingular: objectMetadataItem.nameSingular, @@ -116,7 +116,8 @@ export const WidgetActionFieldEdit = () => { objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/field/components/FieldWidgetDisplay.tsx b/packages/twenty-front/src/modules/page-layout/widgets/field/components/FieldWidgetDisplay.tsx index 43478882db..db2067932f 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/field/components/FieldWidgetDisplay.tsx +++ b/packages/twenty-front/src/modules/page-layout/widgets/field/components/FieldWidgetDisplay.tsx @@ -1,4 +1,4 @@ -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { type EnrichedObjectMetadataItem } from '@/object-metadata/types/EnrichedObjectMetadataItem'; import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions'; @@ -54,8 +54,8 @@ export const FieldWidgetDisplay = ({ }); const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const { useUpdateOneObjectRecordMutation } = useRecordShowContainerActions({ objectNameSingular: objectMetadataItem.nameSingular, @@ -98,7 +98,8 @@ export const FieldWidgetDisplay = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/fields/components/FieldsWidgetFieldItem.tsx b/packages/twenty-front/src/modules/page-layout/widgets/fields/components/FieldsWidgetFieldItem.tsx index 5c4bf0890d..de51bb64e2 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/fields/components/FieldsWidgetFieldItem.tsx +++ b/packages/twenty-front/src/modules/page-layout/widgets/fields/components/FieldsWidgetFieldItem.tsx @@ -1,5 +1,5 @@ import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell'; -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { type EnrichedObjectMetadataItem } from '@/object-metadata/types/EnrichedObjectMetadataItem'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; @@ -51,7 +51,8 @@ export const FieldsWidgetFieldItem = ({ instanceId, onMouseEnter, }: FieldsWidgetFieldItemProps) => { - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const isActivityTarget = isActivityTargetField( fieldMetadataItem.name, @@ -83,7 +84,8 @@ export const FieldsWidgetFieldItem = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/hooks/useWidgetActions.ts b/packages/twenty-front/src/modules/page-layout/widgets/hooks/useWidgetActions.ts index 08b25ab2a6..d0eb999d2f 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/hooks/useWidgetActions.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/hooks/useWidgetActions.ts @@ -1,5 +1,5 @@ import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById'; -import { useGetIsMetadataItemCustom } from '@/object-metadata/hooks/useGetIsMetadataItemCustom'; +import { useGetIsMetadataItemFromStandardApplication } from '@/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions'; @@ -41,8 +41,8 @@ export const useWidgetActions = ({ ); const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); - - const getIsMetadataItemCustom = useGetIsMetadataItemCustom(); + const getIsMetadataItemFromStandardApplication = + useGetIsMetadataItemFromStandardApplication(); const isRecordReadOnly = useIsRecordReadOnly({ recordId: targetRecord.id, @@ -85,7 +85,8 @@ export const useWidgetActions = ({ objectPermissionsByObjectMetadataId, objectMetadataId: objectMetadataItem.id, }), - isFieldCustom: getIsMetadataItemCustom(fieldMetadataItem), + isFieldFromStandardApplication: + getIsMetadataItemFromStandardApplication(fieldMetadataItem), fieldMetadataItem: { id: fieldMetadataItem.id, isUIEditable: fieldMetadataItem.isUIEditable ?? true,