import { useState, useRef, useEffect } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faColumns3 } from '@fortawesome/pro-duotone-svg-icons'; import { Button } from '@/components/base/buttons/button'; import type { FC } from 'react'; const ColumnsIcon: FC<{ className?: string }> = ({ className }) => ( ); export type ColumnDef = { id: string; label: string; defaultVisible?: boolean; }; interface ColumnToggleProps { columns: ColumnDef[]; visibleColumns: Set; onToggle: (columnId: string) => void; } export const ColumnToggle = ({ columns, visibleColumns, onToggle }: ColumnToggleProps) => { const [open, setOpen] = useState(false); const panelRef = useRef(null); useEffect(() => { if (!open) return; const handler = (e: MouseEvent) => { if (panelRef.current && !panelRef.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); }, [open]); return (
{open && (
Show/Hide Columns
{columns.map(col => ( ))}
)}
); }; export const useColumnVisibility = (columns: ColumnDef[]) => { const [visibleColumns, setVisibleColumns] = useState>(() => { return new Set(columns.filter(c => c.defaultVisible !== false).map(c => c.id)); }); const toggle = (columnId: string) => { setVisibleColumns(prev => { const next = new Set(prev); if (next.has(columnId)) { next.delete(columnId); } else { next.add(columnId); } return next; }); }; return { visibleColumns, toggle }; };