import React, { useState, useMemo } from 'react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { FaCheckCircle, FaTimesCircle, FaExclamationCircle, FaInfoCircle, FaExclamationTriangle } from 'react-icons/fa'; import Modal from '../Modal'; import ParseExcelErrors from './ExcelError'; import { errorsByRows, ExcelError } from '@/utils/excel.errors'; interface Props { parsedExcel: { rows?: any[]; errors?: any[] }, duplicateRows?: { duplicates: ExcelCodegenDuplicatesMap, count: number }, infos: { email: string; name: string; passport_id: string }[]; } export interface ExcelCodegenDuplicatesMap { email: Map; passport_id: Map; } const CodeGenImportSummary: React.FC = ({ infos, parsedExcel, duplicateRows }) => { const [showErrorsModal, setShowErrorsModal] = useState(false); const [showDuplicatesModal, setShowDuplicatesModal] = useState(false); const errorCount = Object.entries(errorsByRows(parsedExcel.errors as ExcelError[])).length || 0; const fieldMapper = { "passport_id": "Passport/National ID", "email": "E-mail" } return ( <> Import Summary
{`${parsedExcel.rows?.length} total spreadsheet rows`} {parsedExcel.rows && parsedExcel.rows.filter(row => row === null).length > 0 && ( {` (${parsedExcel.rows.filter(row => row === null).length} empty)`} )}
{infos.length > 0 ? ( ) : ( )} {`${infos.length} new code${infos.length > 1 ? "s" : ''} to generate`}
{(duplicateRows && duplicateRows.count > 0) && (
{duplicateRows.count} duplicate entries in file
)} {errorCount > 0 && (
{errorCount} invalid rows
)}
{((duplicateRows && duplicateRows.count > 0) || errorCount > 0) && (

The following will be excluded from import:

    {duplicateRows && duplicateRows.count > 0 && (
  • {duplicateRows.count} rows with duplicate values
    {(Object.keys(duplicateRows.duplicates) as Array).map(field => { const duplicates = Array.from(duplicateRows.duplicates[field].entries()) .filter((entry) => entry[1].length > 1); if (duplicates.length === 0) return null; return (
    {fieldMapper[field]}: rows { duplicates.map(([_, rows]) => rows.join(', ')).join('; ') }
    ); })}
  • )} {errorCount > 0 && (
  • {errorCount} rows with invalid or missing information
    Rows: {Object.keys(errorsByRows(parsedExcel.errors || [])).join(', ')}
  • )}
)}
setShowErrorsModal(false)}> <>

Validation Errors

setShowDuplicatesModal(false)}> <>

Duplicate Entries

{duplicateRows && < div className="space-y-6"> {(Object.keys(duplicateRows.duplicates) as Array).map(field => { const duplicates = Array.from(duplicateRows!.duplicates[field].entries()) .filter((entry): entry is [string, number[]] => entry[1].length > 1); if (duplicates.length === 0) return null; return (

{fieldMapper[field]} duplicates

{duplicates.length} {duplicates.length === 1 ? 'duplicate' : 'duplicates'}
{duplicates.map(([value, rows]) => (
{value}
Appears in rows: {rows.join(', ')}
{rows.length} occurrences
))}
); })} }
); }; export default CodeGenImportSummary;