diff --git a/src/components/MultiSelectToolbar.tsx b/src/components/MultiSelectToolbar.tsx index 1f8ab7cc..f20f4a49 100644 --- a/src/components/MultiSelectToolbar.tsx +++ b/src/components/MultiSelectToolbar.tsx @@ -17,13 +17,18 @@ const STACK_GAP = 20; export function MultiSelectToolbar() { const { t } = useI18n(); const { nodes, onNodesChange, createGroup, removeNodesFromGroup } = useWorkflowStore(); - const { getViewport } = useReactFlow(); + const { flowToScreenPosition, getNodesBounds } = useReactFlow(); const selectedNodes = useMemo( () => nodes.filter((node) => node.selected), [nodes] ); + const hasSelectedGroupNode = useMemo( + () => selectedNodes.some((node) => node.type === "group"), + [selectedNodes] + ); + // Check if any selected nodes are in a group const selectedNodeGroups = useMemo(() => { const groupIds = new Set(selectedNodes.map((n) => n.groupId).filter(Boolean)); @@ -36,27 +41,14 @@ export function MultiSelectToolbar() { const toolbarPosition = useMemo(() => { if (selectedNodes.length < 2) return null; - const viewport = getViewport(); - - // Find bounding box of selected nodes - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - - selectedNodes.forEach((node) => { - const nodeWidth = (node.style?.width as number) || node.measured?.width || 220; - minX = Math.min(minX, node.position.x); - minY = Math.min(minY, node.position.y); - maxX = Math.max(maxX, node.position.x + nodeWidth); + const bounds = getNodesBounds(selectedNodes.map((node) => node.id)); + const topCenter = flowToScreenPosition({ + x: bounds.x + bounds.width / 2, + y: bounds.y, }); - // Convert flow coordinates to screen coordinates - const centerX = (minX + maxX) / 2; - const screenX = centerX * viewport.zoom + viewport.x; - const screenY = minY * viewport.zoom + viewport.y - 50; // 50px above the top - - return { x: screenX, y: screenY }; - }, [selectedNodes, getViewport]); + return { x: topCenter.x, y: topCenter.y - 50 }; + }, [flowToScreenPosition, getNodesBounds, selectedNodes]); const handleStackHorizontally = () => { if (selectedNodes.length < 2) return; @@ -260,7 +252,7 @@ export function MultiSelectToolbar() {
{/* Group/Ungroup buttons */} - {someInGroup ? ( + {someInGroup && !hasSelectedGroupNode ? (