import { useState, useEffect } from 'react'; import { router } from '@inertiajs/react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Info } from 'lucide-react'; import { toast } from '@/components/custom-toast'; import { useTranslation } from 'react-i18next'; interface ColumnMappingModalProps { isOpen: boolean; onClose: () => void; excelColumns: string[]; databaseFields: { key: string; required?: boolean }[]; importRoute: string; data: Record[]; previewData?: Record[]; } export function ColumnMappingModal({ isOpen, onClose, excelColumns, databaseFields, importRoute, data, previewData = [] }: ColumnMappingModalProps) { const { t } = useTranslation(); const [mapping, setMapping] = useState>({}); const [isImporting, setIsImporting] = useState(false); useEffect(() => { if (isOpen && excelColumns.length > 0) { const autoMapping: Record = {}; databaseFields.forEach(field => { const match = excelColumns.find(col =>col.toLowerCase().replace(/[_\s]/g, '') === field.key.toLowerCase().replace(/[_\s]/g, '')); if (match) { autoMapping[field.key] = match; } }); setMapping(autoMapping); } }, [isOpen, excelColumns, databaseFields]); const handleSubmit = () => { if (!data || data.length === 0) { toast.error(t('No data available for import')); return; } const requiredFields = databaseFields.filter(f => f.required); const missingFields = requiredFields.filter(f => !mapping[f.key]); if (missingFields.length > 0) { toast.error(t('Please map all required fields: {{fields}}', { fields: missingFields.map(f => f.key).join(', ') })); return; } // Map data according to column mapping const mappedData = (data || []).map(row => { const mappedRow: Record = {}; Object.entries(mapping).forEach(([dbField, excelColumn]) => { mappedRow[dbField] = row[excelColumn]; }); return mappedRow; }); setIsImporting(true); toast.loading(t('Importing...')); router.post(route(importRoute), { data: mappedData }, { preserveState: true, onSuccess: (page) => { onClose(); setIsImporting(false); toast.dismiss(); if (page.props.flash.success) { toast.success(t(page.props.flash.success)); } else if (page.props.flash.error) { toast.error(t(page.props.flash.error)); } }, onError: (errors) => { setIsImporting(false); toast.dismiss(); if (typeof errors === 'string') { toast.error(errors); } else { toast.error(t('Failed to import')); } } }); }; return ( !open && onClose()} modal={false}> {t('Map Columns')} {t('Map your CSV columns to database fields')}

{t('Column Mapping & Preview')}

{databaseFields.map((field) => ( ))} {previewData.map((row, idx) => ( {databaseFields.map(field => ( ))} ))}
{field.key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} {field.required && *}
{mapping[field.key] ? (row[mapping[field.key]] || empty) : -}

{t('Showing all {{count}} rows', { count: previewData.length })}

); }