Merge pull request #4953 from Dokploy/fix/dropdown-dialog-window-blur

fix(ui): keep dropdown menus open on window blur
This commit is contained in:
Mauricio Siu
2026-08-02 15:05:09 -06:00
committed by GitHub
+20 -4
View File
@@ -1,21 +1,37 @@
import { CheckIcon, ChevronRightIcon } from "lucide-react"; import { CheckIcon, ChevronRightIcon } from "lucide-react";
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"; 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 { markNestedPopupClosed } from "@/components/ui/nested-popup-context";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
function DropdownMenu({ function DropdownMenu({
open,
defaultOpen,
onOpenChange, onOpenChange,
...props ...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) { }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(
defaultOpen ?? false,
);
const isControlled = open !== undefined;
const isOpen = isControlled ? open : uncontrolledOpen;
return ( return (
<DropdownMenuPrimitive.Root <DropdownMenuPrimitive.Root
data-slot="dropdown-menu" data-slot="dropdown-menu"
onOpenChange={(open) => { open={isOpen}
if (!open) { 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(); markNestedPopupClosed();
} }
onOpenChange?.(open); onOpenChange?.(nextOpen);
}} }}
{...props} {...props}
/> />