diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/__stories__/ObjectOptionsDropdownContent.stories.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/__stories__/ObjectOptionsDropdownContent.stories.tsx index 3ae9fe7602..200b735b0f 100644 --- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/__stories__/ObjectOptionsDropdownContent.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/__stories__/ObjectOptionsDropdownContent.stories.tsx @@ -98,6 +98,7 @@ const createStory = (contentId: ObjectOptionsContentId | null): Story => ({ objectNameSingular: 'company', objectMetadataItem: companyObjectMetadataItem, recordIndexId: instanceId, + viewBarInstanceId: instanceId, fieldDefinitionByFieldMetadataItemId, fieldMetadataItemByFieldMetadataItemId, labelIdentifierFieldMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/contexts/RecordCalendarContext.ts b/packages/twenty-front/src/modules/object-record/record-calendar/contexts/RecordCalendarContext.ts new file mode 100644 index 0000000000..64febe8c8f --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-calendar/contexts/RecordCalendarContext.ts @@ -0,0 +1,15 @@ +import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { type RecordField } from '@/object-record/record-field/types/RecordField'; +import { type ObjectPermission } from '~/generated/graphql'; +import { createRequiredContext } from '~/utils/createRequiredContext'; + +type RecordCalendarContextValue = { + viewBarInstanceId: string; + objectNameSingular: string; + objectMetadataItem: ObjectMetadataItem; + objectPermissions: ObjectPermission; + visibleRecordFields: RecordField[]; +}; + +export const [RecordCalendarContextProvider, useRecordCalendarContextOrThrow] = + createRequiredContext('RecordCalendarContext'); diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext.ts b/packages/twenty-front/src/modules/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext.ts new file mode 100644 index 0000000000..976dc7e5ca --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext.ts @@ -0,0 +1,4 @@ +import { createComponentInstanceContext } from '@/ui/utilities/state/component-state/utils/createComponentInstanceContext'; + +export const RecordCalendarComponentInstanceContext = + createComponentInstanceContext(); diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/__stories__/perf/ChipFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/__stories__/perf/ChipFieldDisplay.perf.stories.tsx index 842e5fa37e..3a13d453ec 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/__stories__/perf/ChipFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/__stories__/perf/ChipFieldDisplay.perf.stories.tsx @@ -48,6 +48,7 @@ const meta: Meta = { objectNameSingular: CoreObjectNameSingular.Company, objectMetadataItem: companyObjectMetadataItem, recordIndexId: instanceId, + viewBarInstanceId: instanceId, fieldDefinitionByFieldMetadataItemId, fieldMetadataItemByFieldMetadataItemId, labelIdentifierFieldMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexCalendarContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexCalendarContainer.tsx new file mode 100644 index 0000000000..3a53cf779b --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexCalendarContainer.tsx @@ -0,0 +1,45 @@ +import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; +import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPermissionsForObject'; +import { RecordCalendarContextProvider } from '@/object-record/record-calendar/contexts/RecordCalendarContext'; +import { RecordCalendarComponentInstanceContext } from '@/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext'; +import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; + +type RecordIndexCalendarContainerProps = { + recordCalendarInstanceId: string; + viewBarInstanceId: string; +}; + +export const RecordIndexCalendarContainer = ({ + viewBarInstanceId, + recordCalendarInstanceId, +}: RecordIndexCalendarContainerProps) => { + const { objectNameSingular } = useRecordIndexContextOrThrow(); + + const { objectMetadataItem } = useObjectMetadataItem({ + objectNameSingular, + }); + + const objectPermissions = useObjectPermissionsForObject( + objectMetadataItem.id, + ); + + return ( + + + Calendar View + + + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainer.tsx index e5dd2ce691..423451be6c 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainer.tsx @@ -13,6 +13,7 @@ import { InformationBannerWrapper } from '@/information-banner/components/Inform import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { SpreadsheetImportProvider } from '@/spreadsheet-import/provider/components/SpreadsheetImportProvider'; +import { RecordIndexCalendarContainer } from '@/object-record/record-index/components/RecordIndexCalendarContainer'; import { RecordIndexFiltersToContextStoreEffect } from '@/object-record/record-index/components/RecordIndexFiltersToContextStoreEffect'; import { RecordIndexTableContainerEffect } from '@/object-record/record-index/components/RecordIndexTableContainerEffect'; import { ViewBar } from '@/views/components/ViewBar'; @@ -66,10 +67,7 @@ export const RecordIndexContainer = () => { {recordIndexViewType === ViewType.Table && ( <> - + )} @@ -87,6 +85,14 @@ export const RecordIndexContainer = () => { )} + {recordIndexViewType === ViewType.Calendar && ( + + + + )} ); diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainerGater.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainerGater.tsx index 0754007daa..892aa781f2 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainerGater.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainerGater.tsx @@ -73,6 +73,7 @@ export const RecordIndexContainerGater = () => { value={{ objectPermissionsByObjectMetadataId, recordIndexId, + viewBarInstanceId: recordIndexId, objectNamePlural: objectMetadataItem.namePlural, objectNameSingular: objectMetadataItem.nameSingular, objectMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx index 0a17963c7d..4caf3ac7be 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx @@ -9,14 +9,13 @@ import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/ho type RecordIndexTableContainerProps = { recordTableId: string; - viewBarId: string; }; export const RecordIndexTableContainer = ({ recordTableId, - viewBarId, }: RecordIndexTableContainerProps) => { - const { objectNameSingular } = useRecordIndexContextOrThrow(); + const { objectNameSingular, viewBarInstanceId } = + useRecordIndexContextOrThrow(); const isRecordIndexRemoveSortingModalOpened = useRecoilComponentValue( isModalOpenedComponentState, @@ -39,7 +38,7 @@ export const RecordIndexTableContainer = ({ {isRecordIndexRemoveSortingModalOpened && ( diff --git a/packages/twenty-front/src/modules/object-record/record-index/contexts/RecordIndexContext.ts b/packages/twenty-front/src/modules/object-record/record-index/contexts/RecordIndexContext.ts index 4b95ae7707..da480bd6ec 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/contexts/RecordIndexContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/contexts/RecordIndexContext.ts @@ -17,6 +17,7 @@ export type RecordIndexContextValue = { ObjectPermissions & { objectMetadataId: string } >; recordIndexId: string; + viewBarInstanceId: string; recordFieldByFieldMetadataItemId: Record; labelIdentifierFieldMetadataItem: FieldMetadataItem | undefined; fieldMetadataItemByFieldMetadataItemId: Record; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx index 65e0da538b..f1cd9cd865 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx @@ -142,6 +142,7 @@ const meta: Meta = { // TODO: update performance mocks with new data, and merge with common mocks if possible objectMetadataItem: mockPerformance.objectMetadataItem as any, recordIndexId: 'recordIndexId', + viewBarInstanceId: 'recordIndexId', fieldDefinitionByFieldMetadataItemId, fieldMetadataItemByFieldMetadataItemId, labelIdentifierFieldMetadataItem, diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/SettingsDataModelLabelIdentifierPreviewContextWrapper.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/SettingsDataModelLabelIdentifierPreviewContextWrapper.tsx index 0e2586bfee..0f858df3c3 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/SettingsDataModelLabelIdentifierPreviewContextWrapper.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/SettingsDataModelLabelIdentifierPreviewContextWrapper.tsx @@ -34,6 +34,7 @@ export const SettingsDataModelLabelIdentifierPreviewContextWrapper = ({ objectMetadataItem, objectPermissionsByObjectMetadataId: {}, recordIndexId: '', + viewBarInstanceId: '', recordFieldByFieldMetadataItemId: {}, labelIdentifierFieldMetadataItem, fieldMetadataItemByFieldMetadataItemId: {}, diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx index fae745ec5d..469db706af 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx +++ b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx @@ -56,6 +56,7 @@ export const SignInBackgroundMockContainer = () => { value={{ objectPermissionsByObjectMetadataId: {}, recordIndexId, + viewBarInstanceId: recordIndexId, objectNamePlural, objectNameSingular, objectMetadataItem: objectMetadataItem ?? objectMetadataItems[0], diff --git a/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx b/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx index b1c4530c2c..151931e3e9 100644 --- a/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx +++ b/packages/twenty-front/src/modules/views/components/__stories__/ViewBarFilterDropdown.stories.tsx @@ -93,6 +93,7 @@ const meta: Meta = { objectNameSingular: CoreObjectNameSingular.Company, objectMetadataItem: companyObjectMetadataItem, recordIndexId: instanceId, + viewBarInstanceId: instanceId, labelIdentifierFieldMetadataItem, recordFieldByFieldMetadataItemId, fieldDefinitionByFieldMetadataItemId, diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx index 375db2a8ca..992d9be2ca 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx @@ -185,6 +185,7 @@ export const WorkflowEditActionFindRecords = ({ objectNameSingular: selectedObjectMetadataItem.nameSingular, objectMetadataItem: selectedObjectMetadataItem, recordIndexId: instanceId, + viewBarInstanceId: instanceId, objectPermissionsByObjectMetadataId, labelIdentifierFieldMetadataItem, recordFieldByFieldMetadataItemId, diff --git a/packages/twenty-front/src/testing/decorators/RecordTableDecorator.tsx b/packages/twenty-front/src/testing/decorators/RecordTableDecorator.tsx index 776d84376c..8b0055cd60 100644 --- a/packages/twenty-front/src/testing/decorators/RecordTableDecorator.tsx +++ b/packages/twenty-front/src/testing/decorators/RecordTableDecorator.tsx @@ -145,6 +145,7 @@ const InternalTableContextProviders = ({ objectMetadataItem: objectMetadataItem, objectPermissionsByObjectMetadataId, recordIndexId: 'record-index', + viewBarInstanceId: 'viewBarInstanceId', labelIdentifierFieldMetadataItem, recordFieldByFieldMetadataItemId, fieldDefinitionByFieldMetadataItemId, diff --git a/packages/twenty-front/src/testing/jest/JestRecordIndexContextProviderWrapper.tsx b/packages/twenty-front/src/testing/jest/JestRecordIndexContextProviderWrapper.tsx index 0302460cee..a74a00b88e 100644 --- a/packages/twenty-front/src/testing/jest/JestRecordIndexContextProviderWrapper.tsx +++ b/packages/twenty-front/src/testing/jest/JestRecordIndexContextProviderWrapper.tsx @@ -28,6 +28,7 @@ export const JestRecordIndexContextProviderWrapper = ({ objectNameSingular: objectMetadataItem.nameSingular, objectMetadataItem: objectMetadataItem, recordIndexId: 'recordIndexId', + viewBarInstanceId: 'recordIndexId', labelIdentifierFieldMetadataItem, recordFieldByFieldMetadataItemId, fieldDefinitionByFieldMetadataItemId, diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts index d4d48a7fdf..27459b70a1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts @@ -70,6 +70,11 @@ export const seedFeatureFlags = async ( workspaceId: workspaceId, value: false, }, + { + key: FeatureFlagKey.IS_CALENDAR_VIEW_ENABLED, + workspaceId: workspaceId, + value: true, + }, ]) .execute(); };