'use client'; import { useState, useEffect } from 'react'; import ChauffeurForm from './ChauffeurForm'; interface Chauffeur { id: string; nom: string; prenom: string; dateNaissance: string; telephone: string; email: string; adresse: string; heuresContrat: number; dateDebutContrat: string; dateFinContrat: string | null; heuresRestantes?: number; status?: string; } export default function ChauffeursTable() { const [chauffeurs, setChauffeurs] = useState([]); const [search, setSearch] = useState(''); const [loading, setLoading] = useState(true); const [showForm, setShowForm] = useState(false); const [editingChauffeur, setEditingChauffeur] = useState(null); const [viewingChauffeur, setViewingChauffeur] = useState(null); const fetchChauffeurs = async (searchTerm: string = '') => { setLoading(true); try { const url = searchTerm ? `/api/chauffeurs?search=${encodeURIComponent(searchTerm)}` : '/api/chauffeurs'; const response = await fetch(url); if (response.ok) { const data = await response.json(); setChauffeurs(data); } } catch (error) { console.error('Erreur lors du chargement des chauffeurs:', error); } finally { setLoading(false); } }; useEffect(() => { const timeoutId = setTimeout(() => { fetchChauffeurs(search); }, 300); // Debounce de 300ms pour la recherche return () => clearTimeout(timeoutId); }, [search]); useEffect(() => { fetchChauffeurs(); }, []); const handleDelete = async (id: string) => { if (!confirm('Êtes-vous sûr de vouloir supprimer ce chauffeur ?')) { return; } try { const response = await fetch(`/api/chauffeurs/${id}`, { method: 'DELETE', }); if (response.ok) { fetchChauffeurs(search); } else { alert('Erreur lors de la suppression'); } } catch (error) { console.error('Erreur lors de la suppression:', error); alert('Erreur lors de la suppression'); } }; const handleEdit = (chauffeur: Chauffeur) => { setEditingChauffeur(chauffeur); setShowForm(true); }; const handleView = async (id: string) => { try { const response = await fetch(`/api/chauffeurs/${id}`); if (response.ok) { const data = await response.json(); setViewingChauffeur(data); } } catch (error) { console.error('Erreur lors de la récupération:', error); } }; const handleFormClose = () => { setShowForm(false); setEditingChauffeur(null); fetchChauffeurs(search); }; const getInitials = (nom: string, prenom: string) => { return `${prenom.charAt(0)}${nom.charAt(0)}`.toUpperCase(); }; const getStatusColor = (status: string) => { switch (status) { case 'Disponible': return 'bg-lgreen text-white'; case 'Vacances': return 'bg-lblue text-white'; case 'Arrêt Maladie': return 'bg-lorange text-white'; default: return 'bg-gray-200 text-gray-700'; } }; const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', year: 'numeric' }); }; const getProgressPercentage = (restantes: number, total: number) => { return ((total - restantes) / total) * 100; }; return ( <> {/* Barre de recherche et actions */}
{/* Barre de recherche */}
setSearch(e.target.value)} className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-lblue focus:border-transparent" />
{/* Boutons d'action */}
{/* Tableau */}
{loading ? (
Chargement...
) : chauffeurs.length === 0 ? (
Aucun chauffeur trouvé
) : (
{chauffeurs.map((chauffeur) => ( ))}
NOM CONTACT ADRESSE NOMBRES D'HEURES STATUS ACTIONS
{getInitials(chauffeur.nom, chauffeur.prenom)}
{chauffeur.prenom} {chauffeur.nom}
Né le {formatDate(chauffeur.dateNaissance)}
{chauffeur.telephone}
{chauffeur.email}
{chauffeur.adresse}
{chauffeur.heuresRestantes || chauffeur.heuresContrat}h restantes sur {chauffeur.heuresContrat}h
{chauffeur.status && ( {chauffeur.status} )}
)}
{/* Modal formulaire */} {showForm && ( )} {/* Modal vue détaillée */} {viewingChauffeur && (
{/* Header sobre */}
{getInitials(viewingChauffeur.nom, viewingChauffeur.prenom)}

{viewingChauffeur.prenom} {viewingChauffeur.nom}

Informations détaillées du chauffeur

{/* Contenu scrollable */}
{/* Section Informations personnelles */}

Informations personnelles

Date de naissance
{formatDate(viewingChauffeur.dateNaissance)}
Adresse
{viewingChauffeur.adresse}
{/* Section Contrat */}

Informations contractuelles

Contrat d'heure
{viewingChauffeur.heuresContrat}h
Date de début
{formatDate(viewingChauffeur.dateDebutContrat)}
{viewingChauffeur.dateFinContrat && (
Date de fin
{formatDate(viewingChauffeur.dateFinContrat)}
)} {viewingChauffeur.heuresRestantes !== undefined && (
Heures restantes
{viewingChauffeur.heuresRestantes}h / {viewingChauffeur.heuresContrat}h
)} {viewingChauffeur.status && (
Status
{viewingChauffeur.status}
)}
{/* Footer sobre */}
)} ); }