/** * Admin CSV Rates Management Page * * ADMIN-only page for: * - Uploading CSV rate files * - Viewing CSV configurations * - Managing carrier rate data */ 'use client'; import { useEffect, useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Loader2, RefreshCw, Trash2 } from 'lucide-react'; import { CsvUpload } from '@/components/admin/CsvUpload'; import { listCsvFiles, deleteCsvFile, type CsvFileInfo } from '@/lib/api/admin/csv-rates'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; export default function AdminCsvRatesPage() { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchFiles = async () => { setLoading(true); setError(null); try { const data = await listCsvFiles(); setFiles(data.files || []); } catch (err: any) { setError(err?.message || 'Erreur lors du chargement des fichiers'); } finally { setLoading(false); } }; useEffect(() => { fetchFiles(); }, []); const handleDelete = async (filename: string) => { if (!confirm(`Êtes-vous sûr de vouloir supprimer le fichier ${filename} ?`)) { return; } try { await deleteCsvFile(filename); alert(`Fichier supprimé: ${filename}`); fetchFiles(); // Refresh list } catch (err: any) { alert(`Erreur: ${err?.message || 'Impossible de supprimer le fichier'}`); } }; return (
{/* Page Header */}

Gestion des tarifs CSV

Interface d'administration pour gérer les fichiers CSV de tarifs maritimes

ADMIN SEULEMENT
{/* Upload Section */} {/* Configurations Table */}
Configurations CSV actives Liste de toutes les compagnies avec fichiers CSV configurés
{error && ( {error} )} {loading ? (
) : files.length === 0 ? (
Aucun fichier trouvé. Uploadez un fichier CSV pour commencer.
) : (
Fichier Taille Lignes Date d'upload Actions {files.map((file) => ( {file.filename} {(file.size / 1024).toFixed(2)} KB {file.rowCount ? ( {file.rowCount} lignes ) : ( - )}
{new Date(file.uploadedAt).toLocaleDateString('fr-FR')}
))}
)}
{/* Info Card */} Informations

Format CSV requis : Consultez la documentation pour la liste complète des colonnes obligatoires.

Taille maximale : 10 MB par fichier

Mise à jour : Uploader un nouveau fichier pour une compagnie existante écrasera l'ancien fichier.

Validation : Le système valide automatiquement la structure du CSV lors de l'upload.

); }