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 && (
)}
{/* 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 && (
{/* ADVANCED FILTER */}
{enableAdvancedFilter && (
-
{openMenu === "filter" && (
-
onAdvancedFilter({ ...f, columnKey })}
onClear={() => onAdvancedFilter(null)}
/>
)}
)}
{/* PIN COLUMN */}
-
{openMenu === "pin" && (
-
-
-
)}
)}
);
};
export default PmsHeaderOption;