diff --git a/apps/dokploy/components/ui/dropdown-menu.tsx b/apps/dokploy/components/ui/dropdown-menu.tsx index bf06bb708..dcb1520f2 100644 --- a/apps/dokploy/components/ui/dropdown-menu.tsx +++ b/apps/dokploy/components/ui/dropdown-menu.tsx @@ -1,21 +1,37 @@ import { CheckIcon, ChevronRightIcon } from "lucide-react"; import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"; -import type * as React from "react"; +import * as React from "react"; import { markNestedPopupClosed } from "@/components/ui/nested-popup-context"; import { cn } from "@/lib/utils"; function DropdownMenu({ + open, + defaultOpen, onOpenChange, ...props }: React.ComponentProps) { + const [uncontrolledOpen, setUncontrolledOpen] = React.useState( + defaultOpen ?? false, + ); + const isControlled = open !== undefined; + const isOpen = isControlled ? open : uncontrolledOpen; + return ( { - if (!open) { + open={isOpen} + onOpenChange={(nextOpen) => { + // Radix closes menus on window blur, unmounting any dialog rendered inside + if (!nextOpen && !document.hasFocus()) { + return; + } + if (!isControlled) { + setUncontrolledOpen(nextOpen); + } + if (!nextOpen) { markNestedPopupClosed(); } - onOpenChange?.(open); + onOpenChange?.(nextOpen); }} {...props} />