import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Wand2, Check, Save, X } from "lucide-react"; import type { ScannedSource, ScannedFile, SourceConfig, AmountMode, ColumnMapping, ImportConfigTemplate, } from "../../shared/types"; import ColumnMappingEditor from "./ColumnMappingEditor"; interface SourceConfigPanelProps { source: ScannedSource; config: SourceConfig; selectedFiles: ScannedFile[]; importedFileNames?: Set; headers: string[]; configTemplates: ImportConfigTemplate[]; onConfigChange: (config: SourceConfig) => void; onFileToggle: (file: ScannedFile) => void; onSelectAllFiles: () => void; onAutoDetect: () => void; onSaveAsTemplate: (name: string) => void; onApplyTemplate: (id: number) => void; onUpdateTemplate: () => void; onDeleteTemplate: (id: number) => void; selectedTemplateId: number | null; isLoading?: boolean; } export default function SourceConfigPanel({ source, config, selectedFiles, importedFileNames, headers, configTemplates, onConfigChange, onFileToggle, onSelectAllFiles, onAutoDetect, onSaveAsTemplate, onApplyTemplate, onUpdateTemplate, onDeleteTemplate, selectedTemplateId, isLoading, }: SourceConfigPanelProps) { const { t } = useTranslation(); const [showSaveTemplate, setShowSaveTemplate] = useState(false); const [templateName, setTemplateName] = useState(""); const selectClass = "w-full px-3 py-2 text-sm rounded-lg border border-[var(--border)] bg-[var(--card)] text-[var(--foreground)] focus:outline-none focus:ring-2 focus:ring-[var(--primary)]"; const inputClass = selectClass; const updateConfig = (partial: Partial) => { onConfigChange({ ...config, ...partial }); }; return (

{t("import.config.title")} — {source.folder_name}

{/* Template row */}
{selectedTemplateId && ( <> )}
{showSaveTemplate ? (
setTemplateName(e.target.value)} placeholder={t("import.config.templateName")} className={inputClass + " w-48"} autoFocus onKeyDown={(e) => { if (e.key === "Enter" && templateName.trim()) { onSaveAsTemplate(templateName.trim()); setTemplateName(""); setShowSaveTemplate(false); } else if (e.key === "Escape") { setShowSaveTemplate(false); setTemplateName(""); } }} />
) : ( )}
{/* Source name */}
updateConfig({ name: e.target.value })} className={inputClass} />
{/* Basic settings */}
{/* Skip lines & header */}
updateConfig({ skipLines: parseInt(e.target.value) || 0 }) } className={inputClass} />
{/* Sign convention */}
{/* Column mapping */} {headers.length > 0 && ( onConfigChange({ ...config, columnMapping: mapping }) } onAmountModeChange={(mode: AmountMode) => onConfigChange({ ...config, amountMode: mode }) } /> )} {/* File selection */}

{t("import.config.selectFiles")}

{source.files.map((file) => { const isSelected = selectedFiles.some( (f) => f.file_path === file.file_path ); const isImported = importedFileNames?.has(file.filename) ?? false; return ( ); })}
); }