| "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> |
| ); |
| } |
|
|