'use client'; import React, { useState, useEffect } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Tag } from 'primereact/tag'; import { Card } from 'primereact/card'; import { Toolbar } from 'primereact/toolbar'; import { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { Badge } from 'primereact/badge'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface EmployeDisponible { id: number; nom: string; prenom: string; email: string; telephone: string; metier: string; niveauExperience: string; competences: string[]; certifications: string[]; equipeId?: number; equipeNom?: string; prochainChantier?: string; dateProchainChantier?: string; disponibleJusquau?: string; } const EmployesDisponiblesPage = () => { const [employes, setEmployes] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [dateRecherche, setDateRecherche] = useState(null); const [metierFiltre, setMetierFiltre] = useState(''); const router = useRouter(); const metierOptions = [ { label: 'Tous les métiers', value: '' }, { label: 'Maçon', value: 'MACON' }, { label: 'Électricien', value: 'ELECTRICIEN' }, { label: 'Plombier', value: 'PLOMBIER' }, { label: 'Charpentier', value: 'CHARPENTIER' }, { label: 'Peintre', value: 'PEINTRE' }, { label: 'Chef d\'équipe', value: 'CHEF_EQUIPE' }, { label: 'Conducteur', value: 'CONDUCTEUR' } ]; useEffect(() => { loadEmployesDisponibles(); }, [dateRecherche, metierFiltre]); const loadEmployesDisponibles = async () => { try { setLoading(true); console.log('🔄 Chargement des employés disponibles...'); let url = '/api/employes/disponibles'; const params = new URLSearchParams(); if (dateRecherche) { params.append('date', dateRecherche.toISOString().split('T')[0]); } if (metierFiltre) { params.append('metier', metierFiltre); } if (params.toString()) { url += `?${params.toString()}`; } const response = await apiClient.get(url); console.log('✅ Employés disponibles chargés:', response.data); setEmployes(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des employés disponibles:', error); setEmployes([]); } finally { setLoading(false); } }; const metierBodyTemplate = (rowData: EmployeDisponible) => { const getMetierColor = (metier: string) => { const colors: { [key: string]: string } = { 'MACON': 'info', 'ELECTRICIEN': 'warning', 'PLOMBIER': 'primary', 'CHARPENTIER': 'success', 'PEINTRE': 'secondary', 'CHEF_EQUIPE': 'danger', 'CONDUCTEUR': 'help' }; return colors[metier] || 'secondary'; }; return ; }; const experienceBodyTemplate = (rowData: EmployeDisponible) => { const getExperienceColor = (niveau: string) => { switch (niveau) { case 'DEBUTANT': return 'info'; case 'INTERMEDIAIRE': return 'warning'; case 'EXPERIMENTE': return 'success'; case 'EXPERT': return 'danger'; default: return 'secondary'; } }; return ; }; const disponibiliteBodyTemplate = (rowData: EmployeDisponible) => { return (
Disponible
{rowData.disponibleJusquau && ( Jusqu'au {new Date(rowData.disponibleJusquau).toLocaleDateString('fr-FR')} )}
); }; const prochainChantierBodyTemplate = (rowData: EmployeDisponible) => { if (rowData.prochainChantier) { return (
{rowData.dateProchainChantier && ( Début: {new Date(rowData.dateProchainChantier).toLocaleDateString('fr-FR')} )}
); } return Aucun; }; const competencesBodyTemplate = (rowData: EmployeDisponible) => { return (
{rowData.competences?.slice(0, 3).map((comp, index) => ( ))} {rowData.competences?.length > 3 && ( )}
); }; const actionBodyTemplate = (rowData: EmployeDisponible) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setDateRecherche(e.value as Date)} placeholder="Date de recherche" dateFormat="dd/mm/yy" showIcon /> setMetierFiltre(e.value)} placeholder="Filtrer par métier" /> setGlobalFilter(e.target.value)} />
); }; const header = (

Employés Disponibles ({employes.length})

!e.prochainChantier).length} severity="success" /> Libres e.prochainChantier).length} severity="warning" /> Avec prochain chantier
); return (
); }; export default EmployesDisponiblesPage;