améliore l'import (normalisation colonnes)

This commit is contained in:
Yannick Le Duc
2025-09-21 20:47:14 +02:00
parent f9bb1caf32
commit ae753dab4e
3 changed files with 57 additions and 3 deletions

1
.gitignore vendored
View File

@@ -39,3 +39,4 @@ yarn-error.log*
# typescript # typescript
*.tsbuildinfo *.tsbuildinfo
next-env.d.ts next-env.d.ts
test-74-yald.ods

View File

@@ -8,7 +8,7 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
import { Upload, FileText, Download, AlertCircle } from 'lucide-react'; import { Upload, FileText, Download, AlertCircle } from 'lucide-react';
import { BaseModal } from './base/BaseModal'; import { BaseModal } from './base/BaseModal';
import { ErrorDisplay } from './base/ErrorDisplay'; import { ErrorDisplay } from './base/ErrorDisplay';
import { parseCSV, parseExcel, getExpectedColumns, downloadTemplate, validateFileType } from '@/lib/file-utils'; import { parseCSV, parseExcel, getExpectedColumns, downloadTemplate, validateFileType, normalizeParsedData } from '@/lib/file-utils';
interface ImportFileModalProps { interface ImportFileModalProps {
isOpen: boolean; isOpen: boolean;
@@ -52,7 +52,9 @@ export default function ImportFileModal({
return; return;
} }
setPreview(result.data.slice(0, 5)); // Afficher les 5 premières lignes // Normaliser les données pour correspondre aux colonnes attendues
const normalizedData = normalizeParsedData(result.data, type);
setPreview(normalizedData.slice(0, 5)); // Afficher les 5 premières lignes
} }
}; };
@@ -69,7 +71,9 @@ export default function ImportFileModal({
return; return;
} }
onImport(result.data); // Normaliser les données pour correspondre aux colonnes attendues
const normalizedData = normalizeParsedData(result.data, type);
onImport(normalizedData);
onClose(); onClose();
setFile(null); setFile(null);
setPreview([]); setPreview([]);

View File

@@ -132,6 +132,55 @@ export function getExpectedColumns(type: 'propositions' | 'participants'): strin
} }
} }
/**
* Normalise les noms de colonnes pour améliorer la compatibilité
*/
export function normalizeColumnName(columnName: string): string {
if (!columnName) return '';
const normalized = columnName.toLowerCase().trim();
// Mappings pour les colonnes communes
const mappings: { [key: string]: string } = {
'email': 'Email',
'e-mail': 'Email',
'mail': 'Email',
'courriel': 'Email',
'prénom': 'Prénom',
'prenom': 'Prénom',
'firstname': 'Prénom',
'first_name': 'Prénom',
'nom': 'Nom',
'lastname': 'Nom',
'last_name': 'Nom',
'titre': 'Titre',
'title': 'Titre',
'description': 'Description',
'desc': 'Description'
};
return mappings[normalized] || columnName;
}
/**
* Normalise les données parsées pour correspondre aux colonnes attendues
*/
export function normalizeParsedData(data: any[], type: 'propositions' | 'participants'): any[] {
const expectedColumns = getExpectedColumns(type);
return data.map(row => {
const normalizedRow: any = {};
// Normaliser chaque colonne
Object.keys(row).forEach(key => {
const normalizedKey = normalizeColumnName(key);
normalizedRow[normalizedKey] = row[key];
});
return normalizedRow;
});
}
export async function downloadTemplate(type: 'propositions' | 'participants'): Promise<void> { export async function downloadTemplate(type: 'propositions' | 'participants'): Promise<void> {
const columns = getExpectedColumns(type); const columns = getExpectedColumns(type);