'use client' import { useMemo, useState, useCallback } from 'react' import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Switch } from '@/components/ui/switch' import { Label } from '@/components/ui/label' import { Trash2, AlertTriangle, Loader2, RefreshCw } from 'lucide-react' import { cn } from '@/lib/utils' import type { CustomerType } from '@/types' import type { AnnotatedCustomerRow } from '@/lib/import/customers/types' let idCounter = 0 const newId = () => `cust_row_${++idCounter}_${Date.now()}` interface EditableCustomerRow extends AnnotatedCustomerRow { id: string } interface CustomersEditStepProps { rows: AnnotatedCustomerRow[] onExecute: (rows: AnnotatedCustomerRow[], updateDuplicates: boolean) => void onBack: () => void isLoading: boolean error: string | null } const TYPE_LABELS: Record = { individual: 'Privatperson', swedish_business: 'Svenskt företag eller organisation', eu_business: 'EU-företag', non_eu_business: 'Utomeuropeiskt företag', } export default function CustomersEditStep({ rows: initialRows, onExecute, onBack, isLoading, error, }: CustomersEditStepProps) { const [rows, setRows] = useState(() => initialRows.map((r) => ({ ...r, id: newId() })), ) const [updateDuplicates, setUpdateDuplicates] = useState(false) const liveDuplicateCount = useMemo( () => rows.filter((r) => r.duplicate_match !== null).length, [rows], ) const newCount = rows.length - liveDuplicateCount const hasErrors = useMemo( () => rows.some((r) => !r.is_valid), [rows], ) const canContinue = rows.length > 0 && !hasErrors && !isLoading const updateRow = useCallback((id: string, updates: Partial) => { setRows((prev) => prev.map((r) => (r.id === id ? { ...r, ...updates } : r)), ) }, []) const deleteRow = useCallback((id: string) => { setRows((prev) => prev.filter((r) => r.id !== id)) }, []) const handleExecute = () => { if (!canContinue) return const stripped: AnnotatedCustomerRow[] = rows.map(({ id: _id, ...rest }) => rest) onExecute(stripped, updateDuplicates) } return ( Granska kunder Kontrollera att uppgifterna stämmer. Du kan justera namn och kundtyp inline, eller ta bort rader. {newCount} ny{newCount === 1 ? '' : 'a'} kund{newCount === 1 ? '' : 'er'} skapas {liveDuplicateCount > 0 ? ` och ${liveDuplicateCount} matchar befintliga.` : '.'} {/* Duplicate handling banner */} {liveDuplicateCount > 0 && (

{liveDuplicateCount} rader matchar befintliga kunder (på orgnummer eller e-post).

{updateDuplicates && (

Endast fält med värden i filen skrivs över. Tomma fält i filen lämnar befintliga värden orörda.

)}
)} {/* Table */}
{rows.map((row) => ( ))}
Namn Kundtyp Orgnr E-post Status
updateRow(row.id, { name: e.target.value })} className="h-8" /> {row.org_number || '—'} {row.email || '—'}
{!row.is_valid && ( )} {row.duplicate_match ? ( {updateDuplicates ? 'Uppdateras' : 'Hoppas över'} ) : ( Ny )}
{hasErrors && (

Vissa rader har valideringsfel (markerade i rött). Åtgärda eller ta bort dem innan du fortsätter.

)} {error && (

{error}

)}
) }