diff --git a/src/pages/taskmanager/components/task-detail/TaskDetailActionBar.tsx b/src/pages/taskmanager/components/task-detail/TaskDetailActionBar.tsx index 6f3d96f..34b8864 100644 --- a/src/pages/taskmanager/components/task-detail/TaskDetailActionBar.tsx +++ b/src/pages/taskmanager/components/task-detail/TaskDetailActionBar.tsx @@ -84,7 +84,7 @@ const TaskDetailActionBar: FC = ({ activeTab, onTabChange, labelsPopover, {(Object.keys(popoverByTab) as PopoverTab[]).map((tab) => popoverByTab[tab] ? ( - + onTabChange(tab)}> {popoverByTab[tab]} ) : null, diff --git a/src/pages/taskmanager/components/task-detail/TaskDetailPopoverPanel.tsx b/src/pages/taskmanager/components/task-detail/TaskDetailPopoverPanel.tsx index 6e23bc9..b101494 100644 --- a/src/pages/taskmanager/components/task-detail/TaskDetailPopoverPanel.tsx +++ b/src/pages/taskmanager/components/task-detail/TaskDetailPopoverPanel.tsx @@ -1,4 +1,4 @@ -import { type FC, type ReactNode, useLayoutEffect, useState } from "react"; +import { type FC, type ReactNode, useEffect, useLayoutEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { clx } from "../../../../helpers/utils"; @@ -7,10 +7,12 @@ type Props = { children: ReactNode; className?: string; width?: number; + onClose?: () => void; }; -const TaskDetailPopoverPanel: FC = ({ anchorRef, children, className, width = 300 }) => { +const TaskDetailPopoverPanel: FC = ({ anchorRef, children, className, width = 300, onClose }) => { const [position, setPosition] = useState<{ top: number; left: number } | null>(null); + const panelRef = useRef(null); useLayoutEffect(() => { const updatePosition = () => { @@ -38,10 +40,25 @@ const TaskDetailPopoverPanel: FC = ({ anchorRef, children, className, wid }; }, [anchorRef, width]); + useEffect(() => { + if (!onClose) return; + + const handlePointerDown = (event: PointerEvent) => { + const target = event.target as Node; + if (panelRef.current?.contains(target)) return; + if (anchorRef.current?.contains(target)) return; + onClose(); + }; + + document.addEventListener("pointerdown", handlePointerDown); + return () => document.removeEventListener("pointerdown", handlePointerDown); + }, [anchorRef, onClose]); + if (!position) return null; return createPortal(