From 9853d6c0956cba37f50cf6d4dd542b213cc3269b Mon Sep 17 00:00:00 2001 From: Weiko Date: Mon, 15 Sep 2025 15:28:05 +0200 Subject: [PATCH] Add fields selection in calendar view (#14500) --- ...ctOptionsDropdownCalendarFieldsContent.tsx | 6 ++ .../ObjectOptionsDropdownCustomView.tsx | 72 +++++++++---------- .../components/RecordCalendarTopBar.tsx | 20 +++++- .../components/ViewPickerContentEffect.tsx | 23 ++++++ 4 files changed, 82 insertions(+), 39 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCalendarFieldsContent.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCalendarFieldsContent.tsx index aa8c1e55a9..4f8dad4b52 100644 --- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCalendarFieldsContent.tsx +++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCalendarFieldsContent.tsx @@ -1,5 +1,6 @@ import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { useObjectOptionsDropdown } from '@/object-record/object-options-dropdown/hooks/useObjectOptionsDropdown'; +import { recordIndexCalendarFieldMetadataIdState } from '@/object-record/record-index/states/recordIndexCalendarFieldMetadataIdState'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; @@ -11,6 +12,7 @@ import { useUpdateCurrentView } from '@/views/hooks/useUpdateCurrentView'; import { useGetAvailableFieldsForCalendar } from '@/views/view-picker/hooks/useGetAvailableFieldsForCalendar'; import { useLingui } from '@lingui/react/macro'; import { useState } from 'react'; +import { useSetRecoilState } from 'recoil'; import { IconChevronLeft, IconSettings, useIcons } from 'twenty-ui/display'; import { MenuItem, MenuItemSelect } from 'twenty-ui/navigation'; import { FieldMetadataType } from '~/generated-metadata/graphql'; @@ -27,6 +29,9 @@ export const ObjectOptionsDropdownCalendarFieldsContent = () => { const { updateCurrentView } = useUpdateCurrentView(); const { navigateToDateFieldSettings } = useGetAvailableFieldsForCalendar(); + const setRecordIndexCalendarFieldMetadataId = useSetRecoilState( + recordIndexCalendarFieldMetadataIdState, + ); const availableFieldsForCalendar = objectMetadataItem.fields.filter( (field) => field.type === FieldMetadataType.DATE || @@ -46,6 +51,7 @@ export const ObjectOptionsDropdownCalendarFieldsContent = () => { const handleCalendarFieldChange = async ( fieldMetadataItem: FieldMetadataItem, ) => { + setRecordIndexCalendarFieldMetadataId(fieldMetadataItem.id); await updateCurrentView({ calendarFieldMetadataId: fieldMetadataItem.id, }); diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx index a60abf1059..03984199cd 100644 --- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx +++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx @@ -97,7 +97,7 @@ export const ObjectOptionsDropdownCustomView = ({ const selectableItemIdArray = [ 'Layout', - ...(customViewData?.type !== ViewType.Calendar ? ['Fields'] : []), + 'Fields', ...(customViewData?.type === ViewType.Calendar ? ['CalendarDateField', 'CalendarView'] : []), @@ -185,50 +185,48 @@ export const ObjectOptionsDropdownCustomView = ({ )} + onContentChange('fields')} + > + onContentChange('fields')} + LeftIcon={IconListDetails} + text={t`Fields`} + contextualText={`${visibleBoardFields.length} shown`} + hasSubMenu + /> + {customViewData?.type !== ViewType.Calendar && ( - <> +
onContentChange('fields')} + itemId="Group" + onEnter={() => + isDefined(recordGroupFieldMetadata) + ? onContentChange('recordGroups') + : onContentChange('recordGroupFields') + } > onContentChange('fields')} - LeftIcon={IconListDetails} - text={t`Fields`} - contextualText={`${visibleBoardFields.length} shown`} - hasSubMenu - /> - -
- + focused={selectedItemId === 'Group'} + onClick={() => isDefined(recordGroupFieldMetadata) ? onContentChange('recordGroups') : onContentChange('recordGroupFields') } - > - - isDefined(recordGroupFieldMetadata) - ? onContentChange('recordGroups') - : onContentChange('recordGroupFields') - } - LeftIcon={IconLayoutList} - text={t`Group`} - contextualText={ - isDefaultView - ? t`Not available on Default View` - : recordGroupFieldMetadata?.label - } - hasSubMenu - disabled={isDefaultView} - /> - -
- + LeftIcon={IconLayoutList} + text={t`Group`} + contextualText={ + isDefaultView + ? t`Not available on Default View` + : recordGroupFieldMetadata?.label + } + hasSubMenu + disabled={isDefaultView} + /> + +
)} {isDefaultView && ( { RecordCalendarComponentInstanceContext, ); + const recordIndexCalendarLayout = useRecoilValue( + recordIndexCalendarLayoutState, + ); + return (