import React, { useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Download, Plus, X } from "lucide-react"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { useToast } from "@/components/ui/use-toast"; export default function CustomReportBuilder({ events, staff, invoices }) { const { toast } = useToast(); const [reportConfig, setReportConfig] = useState({ name: "", dataSource: "events", dateRange: "30", fields: [], filters: [], groupBy: "", }); const dataSourceFields = { events: ['event_name', 'business_name', 'status', 'date', 'total', 'requested', 'hub'], staff: ['employee_name', 'position', 'department', 'hub_location', 'rating', 'reliability_score'], invoices: ['invoice_number', 'business_name', 'amount', 'status', 'issue_date', 'due_date'], }; const handleFieldToggle = (field) => { setReportConfig(prev => ({ ...prev, fields: prev.fields.includes(field) ? prev.fields.filter(f => f !== field) : [...prev.fields, field], })); }; const handleGenerateReport = () => { if (!reportConfig.name || reportConfig.fields.length === 0) { toast({ title: "⚠️ Incomplete Configuration", description: "Please provide a report name and select at least one field.", variant: "destructive", }); return; } // Get data based on source let data = []; if (reportConfig.dataSource === 'events') data = events; else if (reportConfig.dataSource === 'staff') data = staff; else if (reportConfig.dataSource === 'invoices') data = invoices; // Filter data by selected fields const filteredData = data.map(item => { const filtered = {}; reportConfig.fields.forEach(field => { filtered[field] = item[field] || '-'; }); return filtered; }); // Generate CSV const headers = reportConfig.fields.join(','); const rows = filteredData.map(item => reportConfig.fields.map(field => `"${item[field]}"`).join(',') ); const csv = [headers, ...rows].join('\n'); const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${reportConfig.name.replace(/\s+/g, '-').toLowerCase()}-${new Date().toISOString().split('T')[0]}.csv`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); toast({ title: "✅ Report Generated", description: `${reportConfig.name} has been exported successfully.`, }); }; const handleExportJSON = () => { if (!reportConfig.name || reportConfig.fields.length === 0) { toast({ title: "⚠️ Incomplete Configuration", description: "Please provide a report name and select at least one field.", variant: "destructive", }); return; } let data = []; if (reportConfig.dataSource === 'events') data = events; else if (reportConfig.dataSource === 'staff') data = staff; else if (reportConfig.dataSource === 'invoices') data = invoices; const filteredData = data.map(item => { const filtered = {}; reportConfig.fields.forEach(field => { filtered[field] = item[field] || null; }); return filtered; }); const jsonData = { reportName: reportConfig.name, generatedAt: new Date().toISOString(), dataSource: reportConfig.dataSource, recordCount: filteredData.length, data: filteredData, }; const blob = new Blob([JSON.stringify(jsonData, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${reportConfig.name.replace(/\s+/g, '-').toLowerCase()}-${new Date().toISOString().split('T')[0]}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); toast({ title: "✅ JSON Exported", description: `${reportConfig.name} exported as JSON.`, }); }; const availableFields = dataSourceFields[reportConfig.dataSource] || []; return (

Custom Report Builder

Create custom reports with selected fields and filters

{/* Configuration Panel */} Report Configuration
setReportConfig(prev => ({ ...prev, name: e.target.value }))} placeholder="e.g., Monthly Performance Report" />
{availableFields.map(field => (
handleFieldToggle(field)} />
))}
{/* Preview Panel */} Report Preview {reportConfig.name && (

{reportConfig.name}

)}
{reportConfig.dataSource.charAt(0).toUpperCase() + reportConfig.dataSource.slice(1)}
{reportConfig.fields.length > 0 && (
{reportConfig.fields.map(field => ( {field.replace(/_/g, ' ')} ))}
)}
{/* Saved Report Templates */} Quick Templates
); }