From 6237598a307c0dc60c0c18d42b424ad5cb2c0c9a Mon Sep 17 00:00:00 2001
From: nitin <142569587+ehconitin@users.noreply.github.com>
Date: Mon, 22 Jun 2026 14:54:32 +0530
Subject: [PATCH] Fix meeting bot CalendarEvent field visibility and
editability (#21883)
- Add the meeting bot preference field to the CalendarEvent record page
fields view.
- Use a Standard-app ownership gate for record field read-only logic.
- Allow app-owned and workspace-custom fields on system objects to
follow isUIEditable and permissions.
---
...r-event-view-field-universal-identifier.ts | 2 +
...preference-on-calendar-event.view-field.ts | 27 +++++++++
...etIsMetadataItemFromStandardApplication.ts | 20 +++++++
...etadataItemFromStandardApplication.test.ts | 55 +++++++++++++++++++
...etIsMetadataItemFromStandardApplication.ts | 26 +++++++++
.../hooks/useIsRecordFieldReadOnly.ts | 9 +--
.../__tests__/isRecordFieldReadOnly.test.ts | 45 +++++++++------
.../read-only/utils/isRecordFieldReadOnly.ts | 11 +++-
.../components/RecordBoardCardBody.tsx | 15 ++---
.../components/RecordCalendarCardBody.tsx | 15 ++---
.../components/RecordFieldList.tsx | 17 ++++--
.../RecordTableCellFieldContextGeneric.tsx | 13 +++--
...rdTableCellFieldContextLabelIdentifier.tsx | 13 +++--
.../components/WidgetActionFieldEdit.tsx | 9 +--
.../field/components/FieldWidgetDisplay.tsx | 9 +--
.../components/FieldsWidgetFieldItem.tsx | 8 ++-
.../widgets/hooks/useWidgetActions.ts | 9 +--
17 files changed, 233 insertions(+), 70 deletions(-)
create mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts
create mode 100644 packages/twenty-front/src/modules/object-metadata/hooks/useGetIsMetadataItemFromStandardApplication.ts
create mode 100644 packages/twenty-front/src/modules/object-metadata/utils/__tests__/getIsMetadataItemFromStandardApplication.test.ts
create mode 100644 packages/twenty-front/src/modules/object-metadata/utils/getIsMetadataItemFromStandardApplication.ts
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,