| "use client";
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import { useState, useRef, useEffect } from "react";
|
|
|
| export default function ColumnToggle({ columns = [], visible = {}, onToggle }) {
|
| const [open, setOpen] = useState(false);
|
| const ref = useRef(null);
|
|
|
|
|
| useEffect(() => {
|
| if (!open) return;
|
| const handler = (e) => {
|
| if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
| };
|
| document.addEventListener("mousedown", handler);
|
| return () => document.removeEventListener("mousedown", handler);
|
| }, [open]);
|
|
|
| return (
|
| <div ref={ref} style={{ position: "relative" }}>
|
| <button
|
| onClick={() => setOpen(!open)}
|
| title="Toggle columns"
|
| style={{
|
| padding: "6px 10px",
|
| borderRadius: "6px",
|
| border: "1px solid rgba(255,255,255,0.1)",
|
| background: "rgba(255,255,255,0.05)",
|
| color: "var(--text-secondary, #888)",
|
| fontSize: "13px",
|
| cursor: "pointer",
|
| display: "flex",
|
| alignItems: "center",
|
| gap: "4px",
|
| }}
|
| >
|
| <span style={{ fontSize: "14px" }}>⚙️</span>
|
| Columns
|
| </button>
|
|
|
| {open && (
|
| <div
|
| style={{
|
| position: "absolute",
|
| top: "100%",
|
| right: 0,
|
| marginTop: "4px",
|
| background: "rgba(20,20,30,0.95)",
|
| border: "1px solid rgba(255,255,255,0.1)",
|
| borderRadius: "8px",
|
| padding: "8px",
|
| zIndex: 50,
|
| minWidth: "160px",
|
| backdropFilter: "blur(12px)",
|
| }}
|
| >
|
| {columns.map((col) => (
|
| <label
|
| key={col.key}
|
| style={{
|
| display: "flex",
|
| alignItems: "center",
|
| gap: "8px",
|
| padding: "4px 8px",
|
| cursor: "pointer",
|
| fontSize: "12px",
|
| color: visible[col.key]
|
| ? "var(--text-primary, #e0e0e0)"
|
| : "var(--text-secondary, #888)",
|
| borderRadius: "4px",
|
| }}
|
| >
|
| <input
|
| type="checkbox"
|
| checked={visible[col.key] ?? true}
|
| onChange={() => onToggle(col.key)}
|
| style={{ accentColor: "#6366f1" }}
|
| />
|
| {col.label}
|
| </label>
|
| ))}
|
| </div>
|
| )}
|
| </div>
|
| );
|
| }
|
|
|