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[];