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 003accf780..1363fdf638 100644 --- a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx +++ b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventDetails.tsx @@ -1,6 +1,7 @@ import { css, useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; +import { useCallback, useState } from 'react'; import { CalendarEventParticipantsResponseStatus } from '@/activities/calendar/components/CalendarEventParticipantsResponseStatus'; import { type CalendarEvent } from '@/activities/calendar/types/CalendarEvent'; @@ -8,13 +9,20 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition'; -import { useIsRecordReadOnly } from '@/object-record/read-only/hooks/useIsRecordReadOnly'; +import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPermissionsForObject'; +import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { RecordFieldsScopeContextProvider } from '@/object-record/record-field-list/contexts/RecordFieldsScopeContext'; import { useFieldListFieldMetadataItems } from '@/object-record/record-field-list/hooks/useFieldListFieldMetadataItems'; -import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; +import { + FieldContext, + type RecordUpdateHook, + type RecordUpdateHookParams, +} from '@/object-record/record-field/ui/contexts/FieldContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/ui/states/contexts/RecordFieldComponentInstanceContext'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; +import { useIsRecordReadOnly } from '@/object-record/read-only/hooks/useIsRecordReadOnly'; +import { isRecordFieldReadOnly } from '@/object-record/read-only/utils/isRecordFieldReadOnly'; import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId'; import { isDefined } from 'twenty-shared/utils'; import { Chip, ChipAccent, ChipSize, ChipVariant } from 'twenty-ui/components'; @@ -113,42 +121,77 @@ export const CalendarEventDetails = ({ const { calendarEventParticipants } = calendarEvent; + const { updateOneRecord } = useUpdateOneRecord({ + objectNameSingular: CoreObjectNameSingular.CalendarEvent, + }); + + const [isUpdating, setIsUpdating] = useState(false); + const updateEntity = useCallback( + ({ variables }: RecordUpdateHookParams) => { + setIsUpdating(true); + void updateOneRecord({ + idToUpdate: variables.where.id as string, + updateOneRecordInput: variables.updateOneRecordInput, + }).finally(() => setIsUpdating(false)); + }, + [updateOneRecord], + ); + + const useUpdateOneCalendarEventRecordMutation: RecordUpdateHook = () => [ + updateEntity, + { loading: isUpdating }, + ]; + + const objectPermissions = useObjectPermissionsForObject( + objectMetadataItem.id, + ); const isRecordReadOnly = useIsRecordReadOnly({ recordId: calendarEvent.id, objectMetadataId: objectMetadataItem.id, }); - const renderField = (fieldMetadataItem: FieldMetadataItem) => ( - - [() => undefined, { loading: false }], - maxWidth: 300, - isRecordFieldReadOnly: isRecordReadOnly, - }} - > - { + const isReadOnly = isRecordFieldReadOnly({ + isRecordReadOnly, + objectPermissions, + fieldMetadataItem: { + id: fieldMetadataItem.id, + isUIReadOnly: fieldMetadataItem.isUIReadOnly ?? false, + }, + }); + + return ( + + - - - - - ); + + + + + + ); + }; return ( { viewableRecordIdComponentState, ); + const { recordGqlFields } = useGenerateDepthRecordGqlFieldsFromObject({ + objectNameSingular: CoreObjectNameSingular.CalendarEvent, + depth: 1, + }); + + const calendarEventRecordGqlFields = { + ...recordGqlFields, + calendarEventParticipants: { + id: true, + person: true, + workspaceMember: true, + isOrganizer: true, + responseStatus: true, + handle: true, + createdAt: true, + calendarEventId: true, + updatedAt: true, + displayName: true, + }, + }; + const { record: calendarEvent } = useFindOneRecord({ - objectNameSingular: - FIND_ONE_CALENDAR_EVENT_OPERATION_SIGNATURE.objectNameSingular, + objectNameSingular: CoreObjectNameSingular.CalendarEvent, objectRecordId: viewableRecordId ?? '', - recordGqlFields: FIND_ONE_CALENDAR_EVENT_OPERATION_SIGNATURE.fields, + recordGqlFields: calendarEventRecordGqlFields, // TODO: this is not executed on sub-sequent runs, make sure that it is intended onCompleted: (record) => { upsertRecordsInStore({ partialRecords: [record] }); diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/__stories__/WorkflowDiagramStepNodeEditableContent.stories.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/__stories__/WorkflowDiagramStepNodeEditableContent.stories.tsx index 2225734c5f..3be93464ee 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/__stories__/WorkflowDiagramStepNodeEditableContent.stories.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/__stories__/WorkflowDiagramStepNodeEditableContent.stories.tsx @@ -153,7 +153,7 @@ export const Catalog: CatalogStory<
{ - if (args.selected) { + if (args.selected === true) { set( workflowSelectedNodeComponentState.atomFamily({ instanceId: 'workflow-visualizer-instance-id',