From b7c68e082ebff7ab63514ee6311161a824460617 Mon Sep 17 00:00:00 2001
From: nitin <142569587+ehconitin@users.noreply.github.com>
Date: Tue, 16 Jun 2026 16:22:54 +0530
Subject: [PATCH] Enable inline field editing in calendar event details
(#21666)
before -
https://github.com/user-attachments/assets/b6645bb5-0ffc-4281-b054-2035c865ba77
after -
https://github.com/user-attachments/assets/a62a1134-c959-4281-aefe-b04e310b4926
---
.../components/CalendarEventDetails.tsx | 114 +++++++++++++-----
1 file changed, 81 insertions(+), 33 deletions(-)
diff --git a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx
index f678ab7583..8d5baa9ed3 100644
--- a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx
+++ b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx
@@ -12,8 +12,12 @@ import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPe
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { useIsRecordReadOnly } from '@/object-record/read-only/hooks/useIsRecordReadOnly';
import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly';
+import { RecordFieldListCellEditModePortal } from '@/object-record/record-field-list/anchored-portal/components/RecordFieldListCellEditModePortal';
+import { RecordFieldListCellHoveredPortal } from '@/object-record/record-field-list/anchored-portal/components/RecordFieldListCellHoveredPortal';
import { RecordFieldsScopeContextProvider } from '@/object-record/record-field-list/contexts/RecordFieldsScopeContext';
import { useFieldListFieldMetadataItems } from '@/object-record/record-field-list/hooks/useFieldListFieldMetadataItems';
+import { RecordFieldListComponentInstanceContext } from '@/object-record/record-field-list/states/contexts/RecordFieldListComponentInstanceContext';
+import { recordFieldListHoverPositionComponentState } from '@/object-record/record-field-list/states/recordFieldListHoverPositionComponentState';
import {
FieldContext,
type RecordUpdateHook,
@@ -23,6 +27,7 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
+import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import {
@@ -104,6 +109,23 @@ export const CalendarEventDetails = ({
excludeCreatedAtAndUpdatedAt: true,
});
+ const {
+ inlineFieldMetadataItems: portalPositionInlineFieldMetadataItems,
+ legacyActivityTargetFieldMetadataItems,
+ } = useFieldListFieldMetadataItems({
+ objectNameSingular: CoreObjectNameSingular.CalendarEvent,
+ });
+
+ const portalPositionFieldMetadataItems = [
+ ...legacyActivityTargetFieldMetadataItems,
+ ...portalPositionInlineFieldMetadataItems,
+ ];
+
+ const setRecordFieldListHoverPosition = useSetAtomComponentState(
+ recordFieldListHoverPositionComponentState,
+ INPUT_ID_PREFIX,
+ );
+
const standardFieldOrder = [
'startsAt',
'endsAt',
@@ -177,6 +199,11 @@ export const CalendarEventDetails = ({
objectPermissionsByObjectMetadataId,
});
+ const portalPosition = portalPositionFieldMetadataItems.findIndex(
+ (portalPositionFieldMetadataItem) =>
+ portalPositionFieldMetadataItem.id === fieldMetadataItem.id,
+ );
+
return (
@@ -188,6 +215,15 @@ export const CalendarEventDetails = ({
useUpdateRecord: useUpdateOneCalendarEventRecordMutation,
maxWidth: 300,
isRecordFieldReadOnly: isReadOnly,
+ anchorId: getRecordFieldInputInstanceId({
+ recordId: calendarEvent.id,
+ fieldName: fieldMetadataItem.name,
+ prefix: INPUT_ID_PREFIX,
+ }),
+ onMouseEnter: () =>
+ setRecordFieldListHoverPosition(
+ portalPosition === -1 ? null : portalPosition,
+ ),
}}
>
-
+
@@ -211,39 +247,51 @@ export const CalendarEventDetails = ({
-
-
- }
- label={t`Event`}
- />
-
-
-
- {calendarEvent.title}
-
-
- {t`Created`}{' '}
- {beautifyPastDateRelativeToNow(
- new Date(calendarEvent.externalCreatedAt),
- )}
-
-
-
- {standardFields.slice(0, 2).map(renderField)}
- {calendarEventParticipants && (
-
+
+
+ }
+ label={t`Event`}
/>
- )}
- {standardFields.slice(2).map(renderField)}
- {customFields.map(renderField)}
-
-
+
+
+
+ {calendarEvent.title}
+
+
+ {t`Created`}{' '}
+ {beautifyPastDateRelativeToNow(
+ new Date(calendarEvent.externalCreatedAt),
+ )}
+
+
+
+ {standardFields.slice(0, 2).map(renderField)}
+ {calendarEventParticipants && (
+
+ )}
+ {standardFields.slice(2).map(renderField)}
+ {customFields.map(renderField)}
+
+
+
+
+
);
};