From 7e6f909d993f4e90e07ccc0fe2b6be165998e5b6 Mon Sep 17 00:00:00 2001 From: hjlarry Date: Thu, 26 Mar 2026 15:14:58 +0800 Subject: [PATCH] fix: correct position --- .../workflow/selection-contextmenu.tsx | 69 ++++++++++++------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/web/app/components/workflow/selection-contextmenu.tsx b/web/app/components/workflow/selection-contextmenu.tsx index 28acead508..c6281b71b4 100644 --- a/web/app/components/workflow/selection-contextmenu.tsx +++ b/web/app/components/workflow/selection-contextmenu.tsx @@ -18,14 +18,14 @@ import { import { useTranslation } from 'react-i18next' import { useStore as useReactFlowStore, useStoreApi } from 'reactflow' import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuGroupLabel, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/app/components/base/ui/dropdown-menu' + ContextMenu, + ContextMenuContent, + ContextMenuGroup, + ContextMenuGroupLabel, + ContextMenuItem, + ContextMenuSeparator, + ContextMenuTrigger, +} from '@/app/components/base/ui/context-menu' import { useNodesReadOnly, useNodesSyncDraft } from './hooks' import { useSelectionInteractions } from './hooks/use-selection-interactions' import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history' @@ -275,9 +275,29 @@ const SelectionContextmenu = () => { const { handleSyncWorkflowDraft } = useNodesSyncDraft() const { saveStateToHistory } = useWorkflowHistory() - const menuPosition = useMemo(() => { + const { menuPosition, anchor } = useMemo(() => { const container = document.querySelector('#workflow-container') - return getMenuPosition(selectionMenu, container?.getBoundingClientRect()) + const containerRect = container?.getBoundingClientRect() + const position = getMenuPosition(selectionMenu, containerRect) + + if (!containerRect) { + return { + menuPosition: position, + anchor: undefined, + } + } + + return { + menuPosition: position, + anchor: { + getBoundingClientRect: () => DOMRect.fromRect({ + width: 0, + height: 0, + x: containerRect.x + position.left, + y: containerRect.y + position.top, + }), + }, + } }, [selectionMenu]) useEffect(() => { @@ -360,44 +380,43 @@ const SelectionContextmenu = () => { top: menuPosition.top, }} > - { if (!open) handleSelectionContextmenuCancel() }} > - + - - + {menuSections.map((section, sectionIndex) => ( - - {sectionIndex > 0 && } - + + {sectionIndex > 0 && } + {t(section.titleKey, { defaultValue: section.titleKey, ns: 'workflow' })} - + {section.items.map((item) => { const Icon = item.icon return ( - handleAlignNodes(item.alignType)} > {t(item.translationKey, { defaultValue: item.translationKey, ns: 'workflow' })} - + ) })} - + ))} - - + + ) }