From 2d6d5bf7d6787d13c2acfab677ba00c1535315e5 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Thu, 19 Jun 2025 17:09:56 +0200 Subject: [PATCH] Prevent workflows to be opened in side panel (#12738) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Workflow views and versions are seed being opened by default into record page. Issue is that: - new views are set by default to side panel. Updated by copying the current opensIn value to the new view - users can still select side panel into their options. Disabling the button. Capture d’écran 2025-06-19 à 16 15 34 --- .../object-record/components/RecordChip.tsx | 5 +++- ...jectOptionsDropdownLayoutOpenInContent.tsx | 26 ++++++++++++++----- .../hooks/useOpenRecordFromIndexView.ts | 6 ++++- .../hooks/useCreateNewIndexRecord.ts | 6 ++++- .../utils/canOpenObjectInSidePanel.ts | 5 ++++ .../hooks/useCreateViewFromCurrentView.ts | 1 + 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-record/utils/canOpenObjectInSidePanel.ts diff --git a/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx b/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx index f2be7ca9d..2aa4b5fdc 100644 --- a/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx +++ b/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx @@ -4,6 +4,7 @@ import { getLinkToShowPage } from '@/object-metadata/utils/getLinkToShowPage'; import { useRecordChipData } from '@/object-record/hooks/useRecordChipData'; import { recordIndexOpenRecordInState } from '@/object-record/record-index/states/recordIndexOpenRecordInState'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; +import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInSidePanel'; import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType'; import { MouseEvent } from 'react'; import { useRecoilValue } from 'recoil'; @@ -52,9 +53,11 @@ export const RecordChip = ({ const { openRecordInCommandMenu } = useOpenRecordInCommandMenu(); const recordIndexOpenRecordIn = useRecoilValue(recordIndexOpenRecordInState); + const canOpenInSidePanel = canOpenObjectInSidePanel(objectNameSingular); const isSidePanelViewOpenRecordInType = - recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL; + recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL && + canOpenInSidePanel; const handleCustomClick = isDefined(onClick) ? onClick diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutOpenInContent.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutOpenInContent.tsx index 5cebd3ef8..db95410a9 100644 --- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutOpenInContent.tsx +++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownLayoutOpenInContent.tsx @@ -1,7 +1,9 @@ import { OBJECT_OPTIONS_DROPDOWN_ID } from '@/object-record/object-options-dropdown/constants/ObjectOptionsDropdownId'; import { useOptionsDropdown } from '@/object-record/object-options-dropdown/hooks/useOptionsDropdown'; import { useUpdateObjectViewOptions } from '@/object-record/object-options-dropdown/hooks/useUpdateObjectViewOptions'; +import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { recordIndexOpenRecordInState } from '@/object-record/record-index/states/recordIndexOpenRecordInState'; +import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInSidePanel'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; @@ -27,6 +29,10 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => { const recordIndexOpenRecordIn = useRecoilValue(recordIndexOpenRecordInState); const { currentView } = useGetCurrentViewOnly(); const { setAndPersistOpenRecordIn } = useUpdateObjectViewOptions(); + const { objectMetadataItem } = useRecordIndexContextOrThrow(); + const canOpenInSidePanel = canOpenObjectInSidePanel( + objectMetadataItem.nameSingular, + ); const selectedItemId = useRecoilComponentValueV2( selectedItemIdComponentState, @@ -59,12 +65,15 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => { > + onEnter={() => { + if (!canOpenInSidePanel) { + return; + } setAndPersistOpenRecordIn( ViewOpenRecordInType.SIDE_PANEL, currentView, - ) - } + ); + }} > { recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL } focused={selectedItemId === ViewOpenRecordInType.SIDE_PANEL} - onClick={() => + onClick={() => { + if (!canOpenInSidePanel) { + return; + } + setAndPersistOpenRecordIn( ViewOpenRecordInType.SIDE_PANEL, currentView, - ) - } + ); + }} + disabled={!canOpenInSidePanel} /> { }, ); - if (recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL) { + if ( + recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL && + canOpenObjectInSidePanel(objectNameSingular) + ) { openRecordInCommandMenu({ recordId, objectNameSingular, diff --git a/packages/twenty-front/src/modules/object-record/record-table/hooks/useCreateNewIndexRecord.ts b/packages/twenty-front/src/modules/object-record/record-table/hooks/useCreateNewIndexRecord.ts index 605e7a50e..1532bf584 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/hooks/useCreateNewIndexRecord.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/hooks/useCreateNewIndexRecord.ts @@ -6,6 +6,7 @@ import { useBuildRecordInputFromFilters } from '@/object-record/record-table/hoo import { useRecordTitleCell } from '@/object-record/record-title-cell/hooks/useRecordTitleCell'; import { RecordTitleCellContainerType } from '@/object-record/record-title-cell/types/RecordTitleCellContainerType'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; +import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInSidePanel'; import { AppPath } from '@/types/AppPath'; import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType'; import { useRecoilCallback } from 'recoil'; @@ -47,7 +48,10 @@ export const useCreateNewIndexRecord = ({ ...recordInputFromFilters, ...recordInput, }); - if (recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL) { + if ( + recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL && + canOpenObjectInSidePanel(objectMetadataItem.nameSingular) + ) { openRecordInCommandMenu({ recordId, objectNameSingular: objectMetadataItem.nameSingular, diff --git a/packages/twenty-front/src/modules/object-record/utils/canOpenObjectInSidePanel.ts b/packages/twenty-front/src/modules/object-record/utils/canOpenObjectInSidePanel.ts new file mode 100644 index 000000000..467590589 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/utils/canOpenObjectInSidePanel.ts @@ -0,0 +1,5 @@ +export const canOpenObjectInSidePanel = (objectNameSingular: string) => + !( + objectNameSingular === 'workflow' || + objectNameSingular === 'workflowVersion' + ); diff --git a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts index 08f9a676b..fa04fd585 100644 --- a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts @@ -125,6 +125,7 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { : undefined, type: type ?? sourceView.type, objectMetadataId: sourceView.objectMetadataId, + openRecordIn: sourceView.openRecordIn, }); if (isUndefinedOrNull(newView)) {