"use client"; import * as React from "react"; import { CheckCircle, ClipboardCopy, Download, RefreshCw, Trash2, X, } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Switch } from "@/components/ui/switch"; import { cn } from "@/lib/utils"; import { COPYABLE_FIELDS, type ResponseCard } from "./columns"; interface SelectionToolbarProps { selectedIds: string[]; selectedRows: ResponseCard[]; onMarkReviewed?: (ids: string[]) => void; onMarkExported?: (ids: string[]) => void; onReprocess?: (ids: string[]) => void; onDelete?: (ids: string[]) => void; onClear: () => void; } const DEFAULT_COPY_FIELDS = new Set(["name", "email"]); function formatFieldValue(value: unknown): string { if (value == null) return ""; if (typeof value === "boolean") return value ? "Yes" : "No"; if (Array.isArray(value)) return value.filter(Boolean).join(", "); if (typeof value === "object") { try { const arr = Object.values(value).flat().filter(Boolean); return arr.join(", "); } catch { return String(value); } } return String(value); } export function SelectionToolbar({ selectedIds, selectedRows, onMarkReviewed, onMarkExported, onReprocess, onDelete, onClear, }: SelectionToolbarProps) { const count = selectedIds.length; const [copyFields, setCopyFields] = React.useState>( () => new Set(DEFAULT_COPY_FIELDS) ); const [copyOpen, setCopyOpen] = React.useState(false); const toggleCopyField = (field: string) => { setCopyFields((prev) => { const next = new Set(prev); if (next.has(field)) next.delete(field); else next.add(field); return next; }); }; const handleCopyToClipboard = async () => { const fields = COPYABLE_FIELDS.filter((f) => copyFields.has(f.field)); if (fields.length === 0) { toast.error("Select at least one field to copy"); return; } if (fields.length === 1) { const field = fields[0]; const values = selectedRows .map((row) => formatFieldValue(row[field.field])) .filter(Boolean); await navigator.clipboard.writeText(values.join("\n")); toast.success(`Copied ${values.length} ${field.label.toLowerCase()} value(s)`); } else { const header = fields.map((f) => f.label).join("\t"); const rows = selectedRows.map((row) => fields.map((f) => formatFieldValue(row[f.field])).join("\t") ); await navigator.clipboard.writeText([header, ...rows].join("\n")); toast.success( `Copied ${selectedRows.length} row(s) with ${fields.length} field(s)` ); } setCopyOpen(false); }; return (
0 ? "translate-y-0 opacity-100" : "pointer-events-none translate-y-4 opacity-0" )} >
{onMarkReviewed && ( )} {onMarkExported && ( )} {onReprocess && ( )} } > Copy

What to copy

{COPYABLE_FIELDS.map(({ field, label }) => ( ))}
{onDelete && ( )}
); }