diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts
index e5586d2868..f3cff741c7 100644
--- a/packages/twenty-front/src/generated-metadata/graphql.ts
+++ b/packages/twenty-front/src/generated-metadata/graphql.ts
@@ -1500,7 +1500,6 @@ export enum FeatureFlagKey {
IS_NOTE_TARGET_MIGRATED = 'IS_NOTE_TARGET_MIGRATED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED = 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED',
- IS_RECORD_PAGE_LAYOUT_ENABLED = 'IS_RECORD_PAGE_LAYOUT_ENABLED',
IS_SSE_DB_EVENTS_ENABLED = 'IS_SSE_DB_EVENTS_ENABLED',
IS_TASK_TARGET_MIGRATED = 'IS_TASK_TARGET_MIGRATED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'
diff --git a/packages/twenty-front/src/generated/graphql.ts b/packages/twenty-front/src/generated/graphql.ts
index 43787e83d9..518933c6f3 100644
--- a/packages/twenty-front/src/generated/graphql.ts
+++ b/packages/twenty-front/src/generated/graphql.ts
@@ -1472,7 +1472,6 @@ export enum FeatureFlagKey {
IS_NOTE_TARGET_MIGRATED = 'IS_NOTE_TARGET_MIGRATED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED = 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED',
- IS_RECORD_PAGE_LAYOUT_ENABLED = 'IS_RECORD_PAGE_LAYOUT_ENABLED',
IS_SSE_DB_EVENTS_ENABLED = 'IS_SSE_DB_EVENTS_ENABLED',
IS_TASK_TARGET_MIGRATED = 'IS_TASK_TARGET_MIGRATED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'
diff --git a/packages/twenty-front/src/modules/command-menu/pages/calendar-event/components/CommandMenuCalendarEventPage.tsx b/packages/twenty-front/src/modules/command-menu/pages/calendar-event/components/CommandMenuCalendarEventPage.tsx
index 7f4107ff8f..71d7563209 100644
--- a/packages/twenty-front/src/modules/command-menu/pages/calendar-event/components/CommandMenuCalendarEventPage.tsx
+++ b/packages/twenty-front/src/modules/command-menu/pages/calendar-event/components/CommandMenuCalendarEventPage.tsx
@@ -60,7 +60,6 @@ export const CommandMenuCalendarEventPage = () => {
},
layoutType: PageLayoutType.RECORD_PAGE,
isInRightDrawer: true,
- isLegacyRecordShowPage: true,
}}
>
diff --git a/packages/twenty-front/src/modules/command-menu/pages/record-page/components/CommandMenuRecordPage.tsx b/packages/twenty-front/src/modules/command-menu/pages/record-page/components/CommandMenuRecordPage.tsx
index 0273ffd9ad..c70182eecd 100644
--- a/packages/twenty-front/src/modules/command-menu/pages/record-page/components/CommandMenuRecordPage.tsx
+++ b/packages/twenty-front/src/modules/command-menu/pages/record-page/components/CommandMenuRecordPage.tsx
@@ -6,7 +6,7 @@ import { CommandMenuPageComponentInstanceContext } from '@/command-menu/states/c
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { INFORMATION_BANNER_HEIGHT } from '@/information-banner/constants/InformationBannerHeight';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
-import { PageLayoutDispatcher } from '@/object-record/record-show/components/PageLayoutDispatcher';
+import { PageLayoutRecordPageRenderer } from '@/object-record/record-show/components/PageLayoutRecordPageRenderer';
import { useRecordShowPage } from '@/object-record/record-show/hooks/useRecordShowPage';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { useComponentInstanceStateContext } from '@/ui/utilities/state/component-state/hooks/useComponentInstanceStateContext';
@@ -80,7 +80,7 @@ export const CommandMenuRecordPage = () => {
recordId: objectRecordId,
}}
>
- = {
},
layoutType: PageLayoutType.RECORD_PAGE,
isInRightDrawer: false,
- // TODO: Remove once the traditional record show page is removed.
- isLegacyRecordShowPage: true,
}}
>
diff --git a/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/__stories__/RecordDetailRelationSection.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/__stories__/RecordDetailRelationSection.stories.tsx
index d140077955..01de52e994 100644
--- a/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/__stories__/RecordDetailRelationSection.stories.tsx
+++ b/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/__stories__/RecordDetailRelationSection.stories.tsx
@@ -43,8 +43,6 @@ const meta: Meta = {
},
layoutType: PageLayoutType.RECORD_PAGE,
isInRightDrawer: false,
- // TODO: Remove once the traditional record show page is removed.
- isLegacyRecordShowPage: true,
}}
>
{
- const isRecordPageEnabled = useIsFeatureEnabled(
- FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED,
- );
-
- if (
- targetRecordIdentifier.targetObjectNameSingular ===
- CoreObjectNameSingular.Dashboard ||
- isRecordPageEnabled
- ) {
- return (
-
- );
- }
-
- return (
- <>
-
-
-
-
-
- >
- );
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx
deleted file mode 100644
index 6087b0734a..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { type CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { ShowPageContainer } from '@/ui/layout/page/components/ShowPageContainer';
-import { RightDrawerProvider } from '@/ui/layout/right-drawer/contexts/RightDrawerContext';
-
-import { InformationBannerDeletedRecord } from '@/information-banner/components/deleted-record/InformationBannerDeletedRecord';
-
-import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
-import { RecordShowContainerContextStoreTargetedRecordsEffect } from '@/object-record/record-show/components/RecordShowContainerContextStoreTargetedRecordsEffect';
-import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
-import { useRecordShowContainerTabs } from '@/object-record/record-show/hooks/useRecordShowContainerTabs';
-import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
-import { ShowPageSubContainer } from '@/ui/layout/show-page/components/ShowPageSubContainer';
-import styled from '@emotion/styled';
-import { useRecoilValue } from 'recoil';
-
-const StyledShowPageBannerContainer = styled.div`
- z-index: 1;
-`;
-
-type RecordShowContainerProps = {
- objectNameSingular: string;
- objectRecordId: string;
- isInRightDrawer?: boolean;
-};
-
-export const RecordShowContainer = ({
- objectNameSingular,
- objectRecordId,
- isInRightDrawer = false,
-}: RecordShowContainerProps) => {
- const { objectMetadataItem } = useObjectMetadataItem({
- objectNameSingular,
- });
-
- const { isPrefetchLoading, recordLoading } = useRecordShowContainerData({
- objectRecordId,
- });
-
- const recordDeletedAt = useRecoilValue(
- recordStoreFamilySelector({
- recordId: objectRecordId,
- fieldName: 'deletedAt',
- }),
- );
-
- const { layout, tabs } = useRecordShowContainerTabs(
- objectNameSingular as CoreObjectNameSingular,
- isInRightDrawer,
- objectMetadataItem,
- );
-
- return (
-
-
- {recordDeletedAt && (
-
-
-
- )}
-
-
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowContainerTabs.ts b/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowContainerTabs.ts
deleted file mode 100644
index 131dcd874a..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowContainerTabs.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
-import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
-import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
-import { BASE_RECORD_LAYOUT } from '@/object-record/record-show/layouts/base-record-layout';
-import { COMPANY_RECORD_LAYOUT } from '@/object-record/record-show/layouts/company-record-layout';
-import { NOTE_RECORD_LAYOUT } from '@/object-record/record-show/layouts/note-record-layout';
-import { OPPORTUNITY_RECORD_LAYOUT } from '@/object-record/record-show/layouts/opportunity-record-layout';
-import { PERSON_RECORD_LAYOUT } from '@/object-record/record-show/layouts/person-record-layout';
-import { TASK_RECORD_LAYOUT } from '@/object-record/record-show/layouts/task-record-layout';
-import { WORKFLOW_RECORD_LAYOUT } from '@/object-record/record-show/layouts/workflow-record-layout';
-import { WORKFLOW_RUN_RECORD_LAYOUT } from '@/object-record/record-show/layouts/workflow-run-record-layout';
-import { WORKFLOW_VERSION_RECORD_LAYOUT } from '@/object-record/record-show/layouts/workflow-version-record-layout';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-import { evaluateTabVisibility } from '@/object-record/record-show/utils/evaluateTabVisibility';
-import { type RecordLayoutTab } from '@/ui/layout/tab-list/types/RecordLayoutTab';
-import { type SingleTabProps } from '@/ui/layout/tab-list/types/SingleTabProps';
-import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-import { useLingui } from '@lingui/react/macro';
-import { useMemo } from 'react';
-import { useRecoilValue } from 'recoil';
-import { IconHome, useIcons } from 'twenty-ui/display';
-
-// Object-specific layouts that override or extend the base layout
-const OBJECT_SPECIFIC_LAYOUTS: Partial<
- Record
-> = {
- [CoreObjectNameSingular.Note]: NOTE_RECORD_LAYOUT,
- [CoreObjectNameSingular.Task]: TASK_RECORD_LAYOUT,
- [CoreObjectNameSingular.Company]: COMPANY_RECORD_LAYOUT,
- [CoreObjectNameSingular.Person]: PERSON_RECORD_LAYOUT,
- [CoreObjectNameSingular.Opportunity]: OPPORTUNITY_RECORD_LAYOUT,
- [CoreObjectNameSingular.Workflow]: WORKFLOW_RECORD_LAYOUT,
- [CoreObjectNameSingular.WorkflowVersion]: WORKFLOW_VERSION_RECORD_LAYOUT,
- [CoreObjectNameSingular.WorkflowRun]: WORKFLOW_RUN_RECORD_LAYOUT,
-};
-
-export const useRecordShowContainerTabs = (
- targetObjectNameSingular: CoreObjectNameSingular,
- isInRightDrawer: boolean,
- objectMetadataItem: ObjectMetadataItem,
-): { layout: RecordLayout; tabs: SingleTabProps[] } => {
- const { t } = useLingui();
- const isMobile = useIsMobile();
- const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
-
- const currentWorkspace = useRecoilValue(currentWorkspaceState);
- const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
- const { getIcon } = useIcons();
-
- // Merge base layout with object-specific layout
- const recordLayout: RecordLayout = useMemo(() => {
- return {
- ...BASE_RECORD_LAYOUT,
- ...(OBJECT_SPECIFIC_LAYOUTS[targetObjectNameSingular] || {}),
- tabs: {
- ...BASE_RECORD_LAYOUT.tabs,
- ...(OBJECT_SPECIFIC_LAYOUTS[targetObjectNameSingular]?.tabs || {}),
- },
- };
- }, [targetObjectNameSingular]);
-
- return {
- layout: recordLayout,
- tabs: Object.entries(recordLayout.tabs)
- .filter(
- (entry): entry is [string, NonNullable] =>
- entry[1] !== null && entry[1] !== undefined,
- )
- .sort(([, a], [, b]) => a.position - b.position)
- .map(([key, { title, icon, hide, cards }]) => {
- const Icon = getIcon(icon);
-
- // Special handling for fields tab
- if (key === 'fields') {
- return {
- id: key,
- title,
- Icon,
- cards,
- hide:
- !(isMobile || isInRightDrawer) ||
- recordLayout.hideFieldsInSidePanel,
- };
- }
-
- // Use extracted visibility evaluation logic
- const shouldHide = evaluateTabVisibility(hide, {
- isMobile,
- isInRightDrawer,
- currentWorkspace,
- objectMetadataItems,
- objectPermissionsByObjectMetadataId,
- targetObjectMetadataItem: objectMetadataItem,
- });
-
- return {
- id: key,
- title,
- Icon,
- cards,
- hide: shouldHide,
- };
- })
- // When isInRightDrawer === true, we merge first and second tab into first tab
- .reduce((acc, tab, index, array) => {
- if (isInRightDrawer && array.length > 1) {
- if (index === 0) {
- return [
- ...acc,
- {
- id: 'home',
- title: t`Home`,
- Icon: IconHome,
- cards: [
- ...(tab.hide ? [] : tab.cards),
- ...(array[1].hide ? [] : array[1].cards),
- ],
- hide: false,
- },
- ];
- }
- if (index === 1) {
- return acc;
- }
- }
- return [...acc, tab];
- }, []),
- };
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/base-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/base-record-layout.ts
deleted file mode 100644
index a0beb6ad42..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/base-record-layout.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const BASE_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- fields: {
- title: 'Fields',
- icon: 'IconList',
- position: 100,
- cards: [{ type: CardType.FieldCard }],
- hide: {
- ifMobile: false,
- ifDesktop: true,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- timeline: {
- title: 'Timeline',
- icon: 'IconTimelineEvent',
- position: 200,
- cards: [{ type: CardType.TimelineCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: true,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- tasks: {
- title: 'Tasks',
- icon: 'IconCheckbox',
- position: 300,
- cards: [{ type: CardType.TaskCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [CoreObjectNameSingular.Task],
- ifRelationsMissing: ['taskTargets'],
- ifNoReadPermission: true,
- ifNoReadPermissionObject: CoreObjectNameSingular.Task,
- },
- },
- notes: {
- title: 'Notes',
- icon: 'IconNotes',
- position: 400,
- cards: [{ type: CardType.NoteCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [CoreObjectNameSingular.Note],
- ifRelationsMissing: ['noteTargets'],
- ifNoReadPermission: true,
- ifNoReadPermissionObject: CoreObjectNameSingular.Note,
- },
- },
- files: {
- title: 'Files',
- icon: 'IconPaperclip',
- position: 500,
- cards: [{ type: CardType.FileCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [CoreObjectNameSingular.Attachment],
- ifRelationsMissing: ['attachments'],
- },
- },
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/company-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/company-record-layout.ts
deleted file mode 100644
index ca11130b6e..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/company-record-layout.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const COMPANY_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- emails: {
- title: 'Emails',
- position: 600,
- icon: 'IconMail',
- cards: [{ type: CardType.EmailCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- calendar: {
- title: 'Calendar',
- position: 700,
- icon: 'IconCalendarEvent',
- cards: [{ type: CardType.CalendarCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/note-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/note-record-layout.ts
deleted file mode 100644
index e5e7f424d9..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/note-record-layout.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const NOTE_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- richText: {
- title: 'Note',
- position: 101,
- icon: 'IconNotes',
- cards: [{ type: CardType.FieldRichTextCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- tasks: null,
- notes: null,
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/opportunity-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/opportunity-record-layout.ts
deleted file mode 100644
index ab6157c172..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/opportunity-record-layout.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const OPPORTUNITY_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- emails: {
- title: 'Emails',
- position: 600,
- icon: 'IconMail',
- cards: [{ type: CardType.EmailCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- calendar: {
- title: 'Calendar',
- position: 700,
- icon: 'IconCalendarEvent',
- cards: [{ type: CardType.CalendarCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/person-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/person-record-layout.ts
deleted file mode 100644
index fc18e172d0..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/person-record-layout.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const PERSON_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- emails: {
- title: 'Emails',
- position: 600,
- icon: 'IconMail',
- cards: [{ type: CardType.EmailCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- calendar: {
- title: 'Calendar',
- position: 700,
- icon: 'IconCalendarEvent',
- cards: [{ type: CardType.CalendarCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/task-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/task-record-layout.ts
deleted file mode 100644
index 38f2a99421..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/task-record-layout.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const TASK_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- richText: {
- title: 'Note',
- position: 101,
- icon: 'IconNotes',
- cards: [{ type: CardType.FieldRichTextCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- tasks: null,
- notes: null,
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-record-layout.ts
deleted file mode 100644
index d730896e78..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-record-layout.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const WORKFLOW_RECORD_LAYOUT: RecordLayout = {
- hideSummaryAndFields: true,
- tabs: {
- workflow: {
- title: 'Flow',
- position: 101,
- icon: 'IconSettings',
- cards: [{ type: CardType.WorkflowCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- timeline: null,
- fields: null,
- tasks: null,
- notes: null,
- files: null,
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-run-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-run-record-layout.ts
deleted file mode 100644
index d4ae735dc9..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-run-record-layout.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const WORKFLOW_RUN_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- workflowRun: {
- title: 'Flow',
- position: 101,
- icon: 'IconSettings',
- cards: [{ type: CardType.WorkflowRunCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- timeline: null,
- tasks: null,
- notes: null,
- files: null,
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-version-record-layout.ts b/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-version-record-layout.ts
deleted file mode 100644
index 241d1ca732..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/layouts/workflow-version-record-layout.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { CardType } from '@/object-record/record-show/types/CardType';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export const WORKFLOW_VERSION_RECORD_LAYOUT: RecordLayout = {
- tabs: {
- workflowVersion: {
- title: 'Flow',
- position: 101,
- icon: 'IconSettings',
- cards: [{ type: CardType.WorkflowVersionCard }],
- hide: {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- },
- },
- timeline: null,
- tasks: null,
- notes: null,
- files: null,
- },
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayout.ts b/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayout.ts
deleted file mode 100644
index d7333374cd..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayout.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { type RecordLayoutTab } from '@/ui/layout/tab-list/types/RecordLayoutTab';
-
-export type RecordLayout = {
- hideSummaryAndFields?: boolean;
- hideFieldsInSidePanel?: boolean;
- tabs: Record;
-};
diff --git a/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayoutMap.ts b/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayoutMap.ts
deleted file mode 100644
index 30a04080eb..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/types/RecordLayoutMap.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-
-export type RecordLayoutMap = Record;
diff --git a/packages/twenty-front/src/modules/object-record/record-show/utils/__tests__/evaluateTabVisibility.test.ts b/packages/twenty-front/src/modules/object-record/record-show/utils/__tests__/evaluateTabVisibility.test.ts
deleted file mode 100644
index 15ed6a8f9c..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/utils/__tests__/evaluateTabVisibility.test.ts
+++ /dev/null
@@ -1,273 +0,0 @@
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
-import {
- type TabVisibilityContext,
- evaluateTabVisibility,
-} from '@/object-record/record-show/utils/evaluateTabVisibility';
-import { type ObjectPermissions } from 'twenty-shared/types';
-import { FeatureFlagKey, FieldMetadataType } from '~/generated/graphql';
-
-const makeObjectMetadataItem = (
- overrides: Partial = {},
-): ObjectMetadataItem => {
- return {
- id: '1',
- nameSingular: CoreObjectNameSingular.Company,
- namePlural: 'companies',
- labelSingular: 'Company',
- labelPlural: 'Companies',
- isActive: true,
- isCustom: false,
- isLabelSyncedWithName: false,
- isRemote: false,
- isSearchable: true,
- isSystem: false,
- isUIReadOnly: false,
- createdAt: '',
- updatedAt: '',
- description: '',
- fields: [],
- readableFields: [],
- updatableFields: [],
- labelIdentifierFieldMetadataId: '',
- indexMetadatas: [],
- icon: '',
- shortcut: '',
- standardOverrides: undefined,
- imageIdentifierFieldMetadataId: undefined,
- duplicateCriteria: undefined,
- ...overrides,
- };
-};
-
-const makeObjectPermissions = (
- overrides: Partial = {},
-): ObjectPermissions => {
- return {
- canReadObjectRecords: true,
- canUpdateObjectRecords: true,
- canSoftDeleteObjectRecords: true,
- canDestroyObjectRecords: true,
- restrictedFields: {},
- rowLevelPermissionPredicates: [],
- rowLevelPermissionPredicateGroups: [],
- ...overrides,
- };
-};
-
-describe('evaluateTabVisibility', () => {
- const baseContext: TabVisibilityContext = {
- isMobile: false,
- isInRightDrawer: false,
- currentWorkspace: {
- featureFlags: [{ key: FeatureFlagKey.IS_AI_ENABLED, value: true }],
- },
- objectMetadataItems: [makeObjectMetadataItem()],
- objectPermissionsByObjectMetadataId: {
- '1': { ...makeObjectPermissions(), objectMetadataId: '1' },
- },
- targetObjectMetadataItem: makeObjectMetadataItem(),
- };
-
- const baseConfig = {
- ifMobile: false,
- ifDesktop: false,
- ifInRightDrawer: false,
- ifFeaturesDisabled: [],
- ifRequiredObjectsInactive: [],
- ifRelationsMissing: [],
- };
-
- it('returns true if ifMobile and isMobile', () => {
- expect(
- evaluateTabVisibility(
- { ...baseConfig, ifMobile: true },
- { ...baseContext, isMobile: true },
- ),
- ).toBe(true);
- });
-
- it('returns true if ifDesktop and not isMobile', () => {
- expect(
- evaluateTabVisibility(
- { ...baseConfig, ifDesktop: true },
- { ...baseContext, isMobile: false },
- ),
- ).toBe(true);
- });
-
- it('returns true if ifInRightDrawer and isInRightDrawer', () => {
- expect(
- evaluateTabVisibility(
- { ...baseConfig, ifInRightDrawer: true },
- { ...baseContext, isInRightDrawer: true },
- ),
- ).toBe(true);
- });
-
- it('returns true if feature flag is disabled', () => {
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifFeaturesDisabled: [FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED],
- },
- baseContext,
- ),
- ).toBe(true);
- });
-
- it('returns false if feature flag is enabled', () => {
- const ctx = {
- ...baseContext,
- currentWorkspace: {
- featureFlags: [
- { key: FeatureFlagKey.IS_AI_ENABLED, value: true },
- { key: FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED, value: true },
- ],
- },
- };
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifFeaturesDisabled: [FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED],
- },
- ctx,
- ),
- ).toBe(false);
- });
-
- it('returns true if required object is inactive', () => {
- const ctx = {
- ...baseContext,
- objectMetadataItems: [
- ...baseContext.objectMetadataItems,
- makeObjectMetadataItem({
- id: '2',
- nameSingular: CoreObjectNameSingular.Person,
- isActive: false,
- }),
- ],
- };
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifRequiredObjectsInactive: [CoreObjectNameSingular.Person],
- },
- ctx,
- ),
- ).toBe(true);
- });
-
- it('returns true if relation is missing', () => {
- const ctx = {
- ...baseContext,
- targetObjectMetadataItem: makeObjectMetadataItem({ fields: [] }),
- };
- expect(
- evaluateTabVisibility(
- { ...baseConfig, ifRelationsMissing: ['contact'] },
- ctx,
- ),
- ).toBe(true);
- });
-
- it('returns true if no read permission', () => {
- const ctx = {
- ...baseContext,
- objectMetadataItems: [
- ...baseContext.objectMetadataItems,
- makeObjectMetadataItem({
- id: '2',
- nameSingular: CoreObjectNameSingular.Person,
- }),
- ],
- objectPermissionsByObjectMetadataId: {
- ...baseContext.objectPermissionsByObjectMetadataId,
- '2': {
- ...makeObjectPermissions({ canReadObjectRecords: false }),
- objectMetadataId: '2',
- },
- },
- };
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifNoReadPermission: true,
- ifNoReadPermissionObject: CoreObjectNameSingular.Person,
- },
- ctx,
- ),
- ).toBe(true);
- });
-
- it('returns false if no hide conditions are met', () => {
- expect(evaluateTabVisibility(baseConfig, baseContext)).toBe(false);
- });
-
- it('returns false if required object is active', () => {
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifRequiredObjectsInactive: [CoreObjectNameSingular.Company],
- },
- baseContext,
- ),
- ).toBe(false);
- });
-
- it('returns false if relation exists and is active', () => {
- const ctx = {
- ...baseContext,
- targetObjectMetadataItem: makeObjectMetadataItem({
- fields: [
- {
- name: 'contact',
- type: FieldMetadataType.RELATION,
- isActive: true,
- } as any,
- ],
- }),
- };
- expect(
- evaluateTabVisibility(
- { ...baseConfig, ifRelationsMissing: ['contact'] },
- ctx,
- ),
- ).toBe(false);
- });
-
- it('returns false if read permission exists', () => {
- const ctx = {
- ...baseContext,
- objectMetadataItems: [
- ...baseContext.objectMetadataItems,
- makeObjectMetadataItem({
- id: '2',
- nameSingular: CoreObjectNameSingular.Person,
- }),
- ],
- objectPermissionsByObjectMetadataId: {
- ...baseContext.objectPermissionsByObjectMetadataId,
- '2': {
- ...makeObjectPermissions({ canReadObjectRecords: true }),
- objectMetadataId: '2',
- },
- },
- };
- expect(
- evaluateTabVisibility(
- {
- ...baseConfig,
- ifNoReadPermission: true,
- ifNoReadPermissionObject: CoreObjectNameSingular.Person,
- },
- ctx,
- ),
- ).toBe(false);
- });
-});
diff --git a/packages/twenty-front/src/modules/object-record/record-show/utils/evaluateTabVisibility.ts b/packages/twenty-front/src/modules/object-record/record-show/utils/evaluateTabVisibility.ts
deleted file mode 100644
index f4a6365f35..0000000000
--- a/packages/twenty-front/src/modules/object-record/record-show/utils/evaluateTabVisibility.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { isDefined } from 'twenty-shared/utils';
-
-import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
-import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
-import { type TabVisibilityConfig } from '@/ui/layout/tab-list/types/TabVisibilityConfig';
-import { type ObjectPermissions } from 'twenty-shared/types';
-import { FieldMetadataType, type FeatureFlagDto } from '~/generated/graphql';
-
-export type TabVisibilityContext = {
- isMobile: boolean;
- isInRightDrawer: boolean;
- currentWorkspace: {
- featureFlags?: FeatureFlagDto[] | null;
- } | null;
- objectMetadataItems: ObjectMetadataItem[];
- objectPermissionsByObjectMetadataId: Record<
- string,
- ObjectPermissions & { objectMetadataId: string }
- >;
- targetObjectMetadataItem: ObjectMetadataItem;
-};
-
-export const evaluateTabVisibility = (
- hide: TabVisibilityConfig,
- context: TabVisibilityContext,
-): boolean => {
- const {
- isMobile,
- isInRightDrawer,
- currentWorkspace,
- objectMetadataItems,
- objectPermissionsByObjectMetadataId,
- } = context;
-
- const baseHide =
- (hide.ifMobile && isMobile) ||
- (hide.ifDesktop && !isMobile) ||
- (hide.ifInRightDrawer && isInRightDrawer);
-
- if (baseHide) {
- return true;
- }
-
- const featureNotEnabled =
- hide.ifFeaturesDisabled.length > 0 &&
- !hide.ifFeaturesDisabled.every((flagKey) => {
- const featureFlags = currentWorkspace?.featureFlags;
- if (!featureFlags) {
- return false;
- }
- return !!featureFlags.find((flag) => flag.key === flagKey && flag.value);
- });
-
- if (featureNotEnabled) {
- return true;
- }
-
- const requiredObjectInactive = hide.ifRequiredObjectsInactive.some(
- (requiredObjectName) => {
- const objectMetadataItem = objectMetadataItems.find(
- (item) => item.nameSingular === requiredObjectName,
- );
- return !objectMetadataItem?.isActive;
- },
- );
-
- if (requiredObjectInactive) {
- return true;
- }
-
- const relationMissing = hide.ifRelationsMissing.some((relationName) => {
- return !context.targetObjectMetadataItem.fields.some(
- (field) =>
- field.name === relationName &&
- field.type === FieldMetadataType.RELATION &&
- field.isActive === true,
- );
- });
-
- if (relationMissing) {
- return true;
- }
-
- const noReadPermission =
- hide.ifNoReadPermission === true &&
- isDefined(hide.ifNoReadPermissionObject) &&
- (() => {
- const targetObjectMetadataId = objectMetadataItems.find(
- (item) => item.nameSingular === hide.ifNoReadPermissionObject,
- )?.id;
-
- if (!isDefined(targetObjectMetadataId)) {
- return false;
- }
-
- const objectPermissions = getObjectPermissionsForObject(
- objectPermissionsByObjectMetadataId,
- targetObjectMetadataId,
- );
-
- return objectPermissions.canReadObjectRecords === false;
- })();
-
- if (noReadPermission) {
- return true;
- }
-
- return false;
-};
diff --git a/packages/twenty-front/src/modules/page-layout/components/PageLayoutContent.tsx b/packages/twenty-front/src/modules/page-layout/components/PageLayoutContent.tsx
index 18b8891bdf..9dff96dd7e 100644
--- a/packages/twenty-front/src/modules/page-layout/components/PageLayoutContent.tsx
+++ b/packages/twenty-front/src/modules/page-layout/components/PageLayoutContent.tsx
@@ -8,18 +8,9 @@ import { usePageLayoutTabWithVisibleWidgetsOrThrow } from '@/page-layout/hooks/u
import { useReorderPageLayoutWidgets } from '@/page-layout/hooks/useReorderPageLayoutWidgets';
import { isPageLayoutInEditModeComponentState } from '@/page-layout/states/isPageLayoutInEditModeComponentState';
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import {
- FeatureFlagKey,
- PageLayoutTabLayoutMode,
- PageLayoutType,
-} from '~/generated/graphql';
+import { PageLayoutTabLayoutMode, PageLayoutType } from '~/generated/graphql';
export const PageLayoutContent = () => {
- const isRecordPageEnabled = useIsFeatureEnabled(
- FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED,
- );
-
const isPageLayoutInEditMode = useRecoilComponentValue(
isPageLayoutInEditModeComponentState,
);
@@ -37,10 +28,8 @@ export const PageLayoutContent = () => {
const isRecordPageLayout =
currentPageLayout.type === PageLayoutType.RECORD_PAGE;
- const isCanvasLayout =
- isRecordPageEnabled && layoutMode === PageLayoutTabLayoutMode.CANVAS;
- const isVerticalList =
- isRecordPageEnabled && layoutMode === PageLayoutTabLayoutMode.VERTICAL_LIST;
+ const isCanvasLayout = layoutMode === PageLayoutTabLayoutMode.CANVAS;
+ const isVerticalList = layoutMode === PageLayoutTabLayoutMode.VERTICAL_LIST;
if (isCanvasLayout) {
return ;
diff --git a/packages/twenty-front/src/modules/ui/layout/contexts/LayoutRenderingContext.tsx b/packages/twenty-front/src/modules/ui/layout/contexts/LayoutRenderingContext.tsx
index fd9d159dd5..28bd4965a1 100644
--- a/packages/twenty-front/src/modules/ui/layout/contexts/LayoutRenderingContext.tsx
+++ b/packages/twenty-front/src/modules/ui/layout/contexts/LayoutRenderingContext.tsx
@@ -11,9 +11,6 @@ export type LayoutRenderingContextType = {
layoutType: PageLayoutType;
isInRightDrawer: boolean;
-
- /** TODO: Remove once the traditional record show page is removed. */
- isLegacyRecordShowPage?: boolean;
};
export const [LayoutRenderingProvider, useLayoutRenderingContext] =
diff --git a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx
deleted file mode 100644
index 038dccacb2..0000000000
--- a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageLeftContainer.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import styled from '@emotion/styled';
-import { type ReactNode } from 'react';
-
-import { PAGE_LAYOUT_LEFT_PANEL_CONTAINER_WIDTH } from '@/page-layout/constants/PageLayoutLeftPanelContainerWidth';
-import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
-
-const StyledOuterContainer = styled.div<{ isMobile: boolean }>`
- background: ${({ theme }) => theme.background.secondary};
- border-bottom-left-radius: 8px;
- border-right: ${({ theme, isMobile }) =>
- isMobile ? 'none' : `1px solid ${theme.border.color.medium}`};
- border-top-left-radius: 8px;
- display: flex;
- flex-direction: column;
- gap: ${({ theme }) => theme.spacing(3)};
- z-index: 10;
- width: 'auto';
-`;
-
-const StyledInnerContainer = styled.div<{ isMobile: boolean }>`
- display: flex;
- flex-direction: column;
- width: ${({ isMobile }) =>
- isMobile ? `100%` : `${PAGE_LAYOUT_LEFT_PANEL_CONTAINER_WIDTH}px`};
-`;
-
-const StyledIntermediateContainer = styled.div`
- display: flex;
- flex-direction: column;
- padding-bottom: ${({ theme }) => theme.spacing(3)};
-`;
-
-export type ShowPageLeftContainerProps = {
- children: ReactNode;
-};
-
-export const ShowPageLeftContainer = ({
- children,
-}: ShowPageLeftContainerProps) => {
- const isMobile = useIsMobile();
-
- return (
-
- {isMobile ? (
-
- {children}
-
- ) : (
-
-
-
- {children}
-
-
-
- )}
-
- );
-};
diff --git a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSubContainer.tsx b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSubContainer.tsx
deleted file mode 100644
index 9d1c6b3860..0000000000
--- a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageSubContainer.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-import { RecordShowRightDrawerActionMenu } from '@/action-menu/components/RecordShowRightDrawerActionMenu';
-import { RecordShowRightDrawerOpenRecordButton } from '@/action-menu/components/RecordShowRightDrawerOpenRecordButton';
-import { CommandMenuPageComponentInstanceContext } from '@/command-menu/states/contexts/CommandMenuPageComponentInstanceContext';
-import { FieldsCard } from '@/object-record/record-show/components/FieldsCard';
-import { SummaryCard } from '@/object-record/record-show/components/SummaryCard';
-import { type RecordLayout } from '@/object-record/record-show/types/RecordLayout';
-import { getCardComponent } from '@/object-record/record-show/utils/getCardComponent';
-import { RightDrawerFooter } from '@/ui/layout/right-drawer/components/RightDrawerFooter';
-import { ShowPageLeftContainer } from '@/ui/layout/show-page/components/ShowPageLeftContainer';
-import { getShowPageTabListComponentId } from '@/ui/layout/show-page/utils/getShowPageTabListComponentId';
-import { TabList } from '@/ui/layout/tab-list/components/TabList';
-
-import { type TargetRecordIdentifier } from '@/ui/layout/contexts/TargetRecordIdentifier';
-import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
-import { TabListComponentInstanceContext } from '@/ui/layout/tab-list/states/contexts/TabListComponentInstanceContext';
-import { type SingleTabProps } from '@/ui/layout/tab-list/types/SingleTabProps';
-import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-import { useComponentInstanceStateContext } from '@/ui/utilities/state/component-state/hooks/useComponentInstanceStateContext';
-import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
-import { css } from '@emotion/react';
-import styled from '@emotion/styled';
-import React from 'react';
-import { isDefined } from 'twenty-shared/utils';
-
-const StyledShowPageRightContainer = styled.div`
- display: flex;
- flex-direction: column;
- height: 100%;
- justify-content: start;
- width: 100%;
- overflow: auto;
-`;
-
-const StyledTabListContainer = styled.div<{ shouldDisplay: boolean }>`
- ${({ shouldDisplay }) =>
- !shouldDisplay &&
- css`
- height: 0;
- overflow: hidden;
- visibility: hidden;
- `}
-`;
-
-const StyledTabList = styled(TabList)`
- padding-left: ${({ theme }) => theme.spacing(2)};
-`;
-
-const StyledContentContainer = styled.div<{ isInRightDrawer: boolean }>`
- flex: 1;
- overflow-y: auto;
- background: ${({ theme }) => theme.background.primary};
- padding-bottom: ${({ theme, isInRightDrawer }) =>
- isInRightDrawer ? theme.spacing(16) : 0};
-`;
-
-type ShowPageSubContainerProps = {
- layout?: RecordLayout;
- tabs: SingleTabProps[];
- targetRecordIdentifier: TargetRecordIdentifier;
- isInRightDrawer?: boolean;
- loading: boolean;
-};
-
-export const ShowPageSubContainer = ({
- tabs,
- layout,
- targetRecordIdentifier,
- loading,
- isInRightDrawer = false,
-}: ShowPageSubContainerProps) => {
- const commandMenuPageComponentInstance = useComponentInstanceStateContext(
- CommandMenuPageComponentInstanceContext,
- );
-
- const tabListComponentId = getShowPageTabListComponentId({
- pageId: commandMenuPageComponentInstance?.instanceId,
- targetObjectId: targetRecordIdentifier.id,
- });
- const activeTabId = useRecoilComponentValue(
- activeTabIdComponentState,
- tabListComponentId,
- );
-
- const isMobile = useIsMobile();
-
- const summaryCard = (
-
- );
-
- const fieldsCard = ;
-
- const renderActiveTabContent = () => {
- const activeTab = tabs.find((tab) => tab.id === activeTabId);
- if (!activeTab?.cards?.length) return null;
-
- return (
- <>
- {activeTab.cards.map((card, index) => (
-
- {getCardComponent(card.type, card.configuration)}
-
- ))}
- >
- );
- };
-
- const visibleTabs = tabs.filter((tab) => !tab.hide);
-
- const isInCommandMenu = isDefined(commandMenuPageComponentInstance);
-
- const displaySummaryAndFields =
- layout && !layout.hideSummaryAndFields && !isMobile && !isInRightDrawer;
-
- return (
-
- {displaySummaryAndFields && (
-
- {summaryCard}
- {fieldsCard}
-
- )}
-
- 1}>
-
-
- {(isMobile || isInRightDrawer) && !isInCommandMenu && summaryCard}
-
- {renderActiveTabContent()}
-
- {isInRightDrawer && (
- ,
- ,
- ]}
- />
- )}
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/ui/layout/show-page/constants/ShowPageAddButtonDropdownId.ts b/packages/twenty-front/src/modules/ui/layout/show-page/constants/ShowPageAddButtonDropdownId.ts
deleted file mode 100644
index 833d71422b..0000000000
--- a/packages/twenty-front/src/modules/ui/layout/show-page/constants/ShowPageAddButtonDropdownId.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const SHOW_PAGE_ADD_BUTTON_DROPDOWN_ID = 'show-page-add-button-dropdown';
diff --git a/packages/twenty-front/src/modules/ui/layout/tab-list/types/RecordLayoutTab.ts b/packages/twenty-front/src/modules/ui/layout/tab-list/types/RecordLayoutTab.ts
deleted file mode 100644
index 9a061cdf90..0000000000
--- a/packages/twenty-front/src/modules/ui/layout/tab-list/types/RecordLayoutTab.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { type LayoutCard } from '@/ui/layout/tab-list/types/LayoutCard';
-import { type TabVisibilityConfig } from '@/ui/layout/tab-list/types/TabVisibilityConfig';
-
-export type RecordLayoutTab = {
- title: string;
- position: number;
- icon: string;
- hide: TabVisibilityConfig;
- cards: LayoutCard[];
-};
diff --git a/packages/twenty-front/src/modules/ui/layout/tab-list/types/TabVisibilityConfig.ts b/packages/twenty-front/src/modules/ui/layout/tab-list/types/TabVisibilityConfig.ts
deleted file mode 100644
index 3b553174f0..0000000000
--- a/packages/twenty-front/src/modules/ui/layout/tab-list/types/TabVisibilityConfig.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { type CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { type FeatureFlagKey } from '~/generated/graphql';
-
-export type TabVisibilityConfig = {
- ifMobile: boolean;
- ifDesktop: boolean;
- ifInRightDrawer: boolean;
- ifFeaturesDisabled: FeatureFlagKey[];
- ifRequiredObjectsInactive: CoreObjectNameSingular[];
- ifRelationsMissing: string[];
- ifNoReadPermission?: boolean;
- ifNoReadPermissionObject?: CoreObjectNameSingular;
-};
diff --git a/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx b/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx
index 0f08d76883..3c363e134b 100644
--- a/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx
+++ b/packages/twenty-front/src/pages/object-record/RecordShowPage.tsx
@@ -7,7 +7,7 @@ import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainCo
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { MainContainerLayoutWithCommandMenu } from '@/object-record/components/MainContainerLayoutWithCommandMenu';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
-import { PageLayoutDispatcher } from '@/object-record/record-show/components/PageLayoutDispatcher';
+import { PageLayoutRecordPageRenderer } from '@/object-record/record-show/components/PageLayoutRecordPageRenderer';
import { RecordShowPageSSESubscribeEffect } from '@/object-record/record-show/components/RecordShowPageSSESubscribeEffect';
import { useRecordShowPage } from '@/object-record/record-show/hooks/useRecordShowPage';
import { computeRecordShowComponentInstanceId } from '@/object-record/record-show/utils/computeRecordShowComponentInstanceId';
@@ -58,11 +58,12 @@ export const RecordShowPage = () => {
recordId: objectRecordId,
}}
>
-
{
IS_AI_ENABLED: false,
IS_APPLICATION_ENABLED: false,
IS_IMAP_SMTP_CALDAV_ENABLED: false,
- IS_RECORD_PAGE_LAYOUT_ENABLED: false,
IS_PUBLIC_DOMAIN_ENABLED: false,
IS_EMAILING_DOMAIN_ENABLED: false,
IS_DASHBOARD_V2_ENABLED: false,
@@ -264,7 +263,6 @@ describe('WorkspaceEntityManager', () => {
IS_JSON_FILTER_ENABLED: false,
IS_AI_ENABLED: false,
IS_APPLICATION_ENABLED: false,
- IS_RECORD_PAGE_LAYOUT_ENABLED: false,
IS_PUBLIC_DOMAIN_ENABLED: false,
IS_EMAILING_DOMAIN_ENABLED: false,
IS_DASHBOARD_V2_ENABLED: false,
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 515e95a668..08032f4f02 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
@@ -36,11 +36,6 @@ export const seedFeatureFlags = async ({
workspaceId: workspaceId,
value: true,
},
- {
- key: FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED,
- workspaceId: workspaceId,
- value: true,
- },
{
key: FeatureFlagKey.IS_PUBLIC_DOMAIN_ENABLED,
workspaceId: workspaceId,
diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/constant/default-feature-flags.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/constant/default-feature-flags.ts
index 3c06510065..35e5be517f 100644
--- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/constant/default-feature-flags.ts
+++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/constant/default-feature-flags.ts
@@ -4,5 +4,4 @@ export const DEFAULT_FEATURE_FLAGS = [
FeatureFlagKey.IS_ATTACHMENT_MIGRATED,
FeatureFlagKey.IS_NOTE_TARGET_MIGRATED,
FeatureFlagKey.IS_TASK_TARGET_MIGRATED,
- FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED,
] as const satisfies FeatureFlagKey[];