"use client" import { DateRangePicker } from "@/components/forms/date-range-picker" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectProject } from "@/components/forms/select-project" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Separator } from "@/components/ui/separator" import { useTransactionFilters } from "@/hooks/use-transaction-filters" import { Category, Field, Project } from "@/prisma/client" import { formatDate } from "date-fns" import { Download, Loader2 } from "lucide-react" import { useState } from "react" const deselectedFields = ["files", "text"] export function ExportTransactionsDialog({ fields, categories, projects, total, children, }: { fields: Field[] categories: Category[] projects: Project[] total: number children: React.ReactNode }) { const [isLoading, setIsLoading] = useState(false) const [exportFilters, setExportFilters] = useTransactionFilters() const [exportFields, setExportFields] = useState( fields.map((field) => (deselectedFields.includes(field.code) ? "" : field.code)) ) const [includeAttachments, setIncludeAttachments] = useState(true) const handleSubmit = async () => { setIsLoading(true) try { const response = await fetch( `/export/transactions?${new URLSearchParams({ search: exportFilters?.search || "", dateFrom: exportFilters?.dateFrom || "", dateTo: exportFilters?.dateTo || "", ordering: exportFilters?.ordering || "", categoryCode: exportFilters?.categoryCode || "", projectCode: exportFilters?.projectCode || "", fields: exportFields.join(","), includeAttachments: includeAttachments.toString(), }).toString()}` ) if (!response.ok) { throw new Error("Export failed") } // Get the filename from the Content-Disposition header const contentDisposition = response.headers.get("Content-Disposition") const filename = contentDisposition?.split("filename=")[1]?.replace(/"/g, "") || "transactions.zip" // Create a blob from the response const blob = await response.blob() // Create a download link and trigger it const url = window.URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = filename document.body.appendChild(a) a.click() window.URL.revokeObjectURL(url) document.body.removeChild(a) } catch (error) { console.error("Export failed:", error) // You might want to show an error message to the user here } finally { setIsLoading(false) } } return ( {children} Export {total} Transaction{total !== 1 ? "s" : ""} Export selected transactions and files as a CSV file or a ZIP archive
{exportFilters.search && (
Search query: {exportFilters.search}
)}
Time range: { setExportFilters({ ...exportFilters, dateFrom: date?.from ? formatDate(date.from, "yyyy-MM-dd") : undefined, dateTo: date?.to ? formatDate(date.to, "yyyy-MM-dd") : undefined, }) }} />
setExportFilters({ ...exportFilters, categoryCode: value })} placeholder="All Categories" emptyValue="All Categories" /> setExportFilters({ ...exportFilters, projectCode: value })} placeholder="All Projects" emptyValue="All Projects" />
Fields to be included in CSV
{fields.map((field) => (
))}
) }