import { X, Check } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Checkbox } from "@/components/ui/checkbox"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { ALL_COLUMNS, COLUMN_GROUPS, DEFAULT_VISIBLE_COLUMNS } from "@/lib/config/placement-columns"; interface ColumnSelectorDialogProps { open: boolean; onOpenChange: (open: boolean) => void; visibleColumns: Set; onVisibleColumnsChange: (columns: Set) => void; } export function ColumnSelectorDialog({ open, onOpenChange, visibleColumns, onVisibleColumnsChange, }: ColumnSelectorDialogProps) { const handleToggleColumn = (columnId: string) => { const next = new Set(visibleColumns); if (next.has(columnId)) { // Don't allow hiding required columns const column = ALL_COLUMNS.find((c) => c.id === columnId); if (column?.required) return; next.delete(columnId); } else { next.add(columnId); } onVisibleColumnsChange(next); }; const handleToggleGroup = (groupId: string, select: boolean) => { const groupColumns = ALL_COLUMNS.filter((c) => c.group === groupId); const next = new Set(visibleColumns); groupColumns.forEach((column) => { if (column.required) return; if (select) { next.add(column.id); } else { next.delete(column.id); } }); onVisibleColumnsChange(next); }; const isGroupFullySelected = (groupId: string): boolean => { const groupColumns = ALL_COLUMNS.filter((c) => c.group === groupId); return groupColumns.every((c) => c.required || visibleColumns.has(c.id)); }; const isGroupPartiallySelected = (groupId: string): boolean => { const groupColumns = ALL_COLUMNS.filter((c) => c.group === groupId); return groupColumns.some((c) => visibleColumns.has(c.id)) && !isGroupFullySelected(groupId); }; const handleReset = () => { onVisibleColumnsChange(new Set(DEFAULT_VISIBLE_COLUMNS)); }; const handleSelectAll = () => { onVisibleColumnsChange(new Set(ALL_COLUMNS.map((c) => c.id))); }; const handleSelectNone = () => { onVisibleColumnsChange( new Set(ALL_COLUMNS.filter((c) => c.required).map((c) => c.id)) ); }; return ( Выбор колонок Выберите колонки для отображения в таблице размещений
{/* Quick actions */}
{/* Column groups */} {COLUMN_GROUPS.map((group) => { const groupColumns = ALL_COLUMNS.filter((c) => c.group === group.id); return (
handleToggleGroup(group.id, !!checked)} /> {isGroupPartiallySelected(group.id) && ( (частично выбрано) )}
{groupColumns.map((column) => (
handleToggleColumn(column.id)} disabled={column.required} />
))}
); })}
); }