import { useState, useRef, useEffect } from "react"; import { useDropdownPosition } from "./useGridCore"; const OPERATORS = { number: [ { key: "eq", label: "Equals" }, { key: "neq", label: "Not Equal" }, { key: "gt", label: "Greater Than" }, { key: "gte", label: "Greater or Equal" }, { key: "lt", label: "Less Than" }, { key: "lte", label: "Less or Equal" }, { key: "between", label: "Between" }, ], text: [ { key: "contains", label: "Contains" }, { key: "starts", label: "Starts With" }, { key: "ends", label: "Ends With" }, { key: "eq", label: "Equals" }, ], date: [ { key: "before", label: "Before" }, { key: "after", label: "After" }, { key: "between", label: "Between" }, ], }; // ----------- FILTER UI COMPONENT ---------- function AdvanceFilter({ type = "number", onApply, onClear }) { const [operation, setOperator] = useState(""); const [value1, setValue1] = useState(""); const [value2, setValue2] = useState(""); const ops = OPERATORS[type]; const apply = () => { if (!operation) return; if (operation === "between") { onApply({ operation, from: value1, to: value2, }); } else { onApply({ operation, value: value1, }); } }; return (
e.stopPropagation()} style={{ width: 240 }} >
{/* Values */} {operation && (
{operation !== "between" ? ( setValue1(e.target.value)} /> ) : (
setValue1(e.target.value)} /> setValue2(e.target.value)} />
)}
)} {/* Buttons */}
); } // -------- HEADER OPTION --------------- const PmsHeaderOption = ({ column, pinned, onPinLeft, onPinRight, onUnpin, onAdvancedFilter, }) => { const { key: columnKey, enableAdvancedFilter } = column; const rootRef = useRef(null); const btnRef = useRef(null); const menuRef = useRef(null); const filterBtnRef = useRef(null); const filterMenuRef = useRef(null); const pinBtnRef = useRef(null); const pinMenuRef = useRef(null); const [open, setOpen] = useState(false); const [openMenu, setOpenMenu] = useState(null); // Main dropdown position const mainStyle = useDropdownPosition(btnRef, menuRef, open, 0); // Submenus const filterStyle = useDropdownPosition( filterBtnRef, filterMenuRef, openMenu === "filter", 1 ); const pinStyle = useDropdownPosition( pinBtnRef, pinMenuRef, openMenu === "pin", 1 ); const toggleMenu = (name, e) => { e.stopPropagation(); setOpenMenu((prev) => (prev === name ? null : name)); }; // ---------------------------- // CLOSE WHEN CLICKING OUTSIDE // ---------------------------- useEffect(() => { const handleOutside = (e) => { if (!rootRef.current) return; if (!rootRef.current.contains(e.target)) { setOpen(false); setOpenMenu(null); } }; if (open) document.addEventListener("mousedown", handleOutside); return () => document.removeEventListener("mousedown", handleOutside); }, [open]); return (
{/* BUTTON */} {/* MAIN MENU */} {open && ( )}
); }; export default PmsHeaderOption;