import { MoreVertical } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; import type { Person } from "../../types"; interface AllocationBarMenuProps { onEdit: () => void; onClone?: () => void; onSelectAllToRight?: () => void; onToggleMultiSelect?: () => void; multiSelectActive?: boolean; onDelete?: () => void; transferPeople?: Person[]; onTransferPerson?: (personId: number) => void; } export function AllocationBarMenuTrigger({ onEdit, onClone, onSelectAllToRight, onToggleMultiSelect, multiSelectActive = false, onDelete, transferPeople = [], onTransferPerson, }: AllocationBarMenuProps) { const triggerRef = useRef(null); const menuRef = useRef(null); const [open, setOpen] = useState(false); const [transferOpen, setTransferOpen] = useState(false); const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null); useEffect(() => { if (!open) return; const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") { setOpen(false); setTransferOpen(false); } }; const onPointerDown = (event: PointerEvent) => { const target = event.target as Node; if (triggerRef.current?.contains(target)) return; if (menuRef.current?.contains(target)) return; setOpen(false); setTransferOpen(false); }; window.addEventListener("keydown", onKey); const timer = window.setTimeout(() => { window.addEventListener("pointerdown", onPointerDown); }, 0); return () => { window.clearTimeout(timer); window.removeEventListener("keydown", onKey); window.removeEventListener("pointerdown", onPointerDown); }; }, [open]); const toggleMenu = (event: React.MouseEvent) => { event.stopPropagation(); event.preventDefault(); if (open) { setOpen(false); setTransferOpen(false); return; } const rect = triggerRef.current?.getBoundingClientRect(); if (!rect) return; setAnchor({ top: rect.bottom + 4, left: rect.right - 200 }); setOpen(true); }; const close = () => { setOpen(false); setTransferOpen(false); }; const run = (event: React.MouseEvent, action: () => void) => { event.preventDefault(); event.stopPropagation(); close(); window.setTimeout(() => action(), 0); }; return ( <> {open && anchor ? createPortal(
event.stopPropagation()} onPointerDown={(event) => event.stopPropagation()} ref={menuRef} style={{ position: "fixed", top: anchor.top, left: Math.max(8, anchor.left), zIndex: 3500 }} > {onTransferPerson && transferPeople.length > 0 ? ( <> {transferOpen ? (
) : null} ) : null} {onClone ? ( ) : null} {onSelectAllToRight ? ( ) : null} {onToggleMultiSelect ? ( ) : null} {onDelete ? ( ) : null}
, document.body, ) : null} ); }