+
+
+ {t.selectProduct}
+
+
+
+ {t.relationshipPurpose}
+
+
+
+ {file ? (
+
+
{
+ const picked = e.target.files?.[0];
+ if (picked) void handleFileSelect(picked);
+ }}
+ />
+
+
+
+ {file.name}
+
+ {(file.size / 1024).toFixed(1)} KB · {totalRows} rows
+
+
+
+
+
+ ) : (
+
+ )}
+
+ {headers.length > 0 && (
+
+
{t.mapColumns}
+
+
+
+
+ | {t.csvColumn} |
+ {t.mapsToField} |
+
+
+
+ {headers.map((header) => (
+
+
+ {header}
+ |
+
+ |
+
+ ))}
+
+
+
+
+ )}
+
+
+
+
+
+
+ )}
+
+ {!loading && step === "preview" && preview && (
+
+
+
+ {preview.summary.totalRows}
+ {t.totalRows}
+
+
+ {preview.summary.validCount}
+ {t.validRowsCount}
+
+
0 ? "warning" : ""}`}
+ >
+
+ {preview.summary.duplicateCount}
+
+ {t.duplicatesCount}
+
+
0 ? "danger" : ""}`}
+ >
+ {preview.summary.invalidCount}
+ {t.invalidCount}
+
+
+
+
+
+
+
+
+
+
+ {previewTab === "valid" && (
+
+ {preview.validRows.length === 0 ? (
+
+ No valid rows ready to import.
+
+ ) : (
+
+
+
+ | {t.rowIndex} |
+ {t.name} |
+ {t.email} |
+ {t.company} |
+ {t.title} |
+
+
+
+ {preview.validRows.slice(0, 100).map((row) => (
+
+ | {row.rowIndex} |
+
+ {row.person.name}
+ |
+ {row.person.email || "—"} |
+
+ {row.company?.name || row.company?.domain || "—"}
+ |
+ {row.person.title || "—"} |
+
+ ))}
+
+
+ )}
+ {preview.validRows.length > 100 && (
+
+ Showing first 100 of {preview.validRows.length} valid rows.
+
+ )}
+
+ )}
+
+ {previewTab === "duplicates" && (
+
+
+
+
{t.duplicateReviewNote}
+
+
+ {preview.duplicateRows.length === 0 ? (
+
{t.noDuplicatesFound}
+ ) : (
+
+
+
+ | {t.rowIndex} |
+ {t.name} |
+ {t.email} |
+ {t.company} |
+ {t.reason} |
+
+
+
+ {preview.duplicateRows.map((row) => (
+
+ | {row.rowIndex} |
+ {row.person.name} |
+ {row.person.email || "—"} |
+
+ {row.company?.name || row.company?.domain || "—"}
+ |
+
+
+ {row.reasons.map((reason) => (
+ -
+
+ {reason.message}
+
+
+ ))}
+
+ |
+
+ ))}
+
+
+ )}
+
+
+ )}
+
+ {previewTab === "invalid" && (
+
+
+ {preview.invalidRows.length === 0 ? (
+
{t.noInvalidRows}
+ ) : (
+
+
+
+ | {t.rowIndex} |
+ {t.importReason} |
+
+
+
+ {preview.invalidRows.map((row) => (
+
+ | {row.rowIndex} |
+
+
+ {row.errors.map((err) => (
+ -
+
+ {err}
+
+
+ ))}
+
+ |
+
+ ))}
+
+
+ )}
+
+
+ )}
+
+
+
+
+ {preview.summary.duplicateCount > 0 ? (
+
+ ) : (
+
+ )}
+
+
+ )}
+
+ {!loading && step === "summary" && summary && (
+