mirror of
https://github.com/andwati/dokploy.git
synced 2026-10-18 03:02:56 +00:00
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:
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user