'use client'; import React, { useState, useEffect } from 'react'; import RoleProtectedPage from '@/components/RoleProtectedPage'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Dropdown } from 'primereact/dropdown'; import { Tag } from 'primereact/tag'; import { Card } from 'primereact/card'; import { Toolbar } from 'primereact/toolbar'; import { Dialog } from 'primereact/dialog'; import { Toast } from 'primereact/toast'; import { ConfirmDialog } from 'primereact/confirmdialog'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../services/api-client'; interface Employe { id: number; nom: string; prenom: string; email: string; telephone: string; metier: string; statut: 'ACTIF' | 'INACTIF' | 'CONGE' | 'FORMATION'; dateEmbauche: string; salaire: number; equipeId?: number; competences: string[]; certifications: string[]; } const EmployesPageContent = () => { const [employes, setEmployes] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedEmployes, setSelectedEmployes] = useState([]); const [deleteDialog, setDeleteDialog] = useState(false); const [employeToDelete, setEmployeToDelete] = useState(null); const router = useRouter(); const statutOptions = [ { label: 'Tous', value: null }, { label: 'Actif', value: 'ACTIF' }, { label: 'Inactif', value: 'INACTIF' }, { label: 'Congé', value: 'CONGE' }, { label: 'Formation', value: 'FORMATION' } ]; const metierOptions = [ { label: 'Tous', value: null }, { 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(() => { loadEmployes(); }, []); const loadEmployes = async () => { try { setLoading(true); console.log('🔄 Chargement des employés...'); const response = await apiClient.get('/api/employes'); console.log('✅ Employés chargés:', response.data); setEmployes(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des employés:', error); setEmployes([]); } finally { setLoading(false); } }; const confirmDeleteEmploye = (employe: Employe) => { setEmployeToDelete(employe); setDeleteDialog(true); }; const deleteEmploye = async () => { if (employeToDelete) { try { await apiClient.delete(`/api/employes/${employeToDelete.id}`); setEmployes(employes.filter(e => e.id !== employeToDelete.id)); setDeleteDialog(false); setEmployeToDelete(null); console.log('✅ Employé supprimé avec succès'); } catch (error) { console.error('❌ Erreur lors de la suppression:', error); } } }; const toggleStatutEmploye = async (employe: Employe) => { try { const newStatut = employe.statut === 'ACTIF' ? 'INACTIF' : 'ACTIF'; const endpoint = newStatut === 'ACTIF' ? 'activer' : 'desactiver'; await apiClient.post(`/api/employes/${employe.id}/${endpoint}`); setEmployes(employes.map(e => e.id === employe.id ? { ...e, statut: newStatut } : e )); console.log(`✅ Statut employé ${newStatut.toLowerCase()}`); } catch (error) { console.error('❌ Erreur lors du changement de statut:', error); } }; const statutBodyTemplate = (rowData: Employe) => { const getSeverity = (statut: string) => { switch (statut) { case 'ACTIF': return 'success'; case 'INACTIF': return 'danger'; case 'CONGE': return 'warning'; case 'FORMATION': return 'info'; default: return 'secondary'; } }; return ; }; const actionBodyTemplate = (rowData: Employe) => { return (
); }; const competencesBodyTemplate = (rowData: Employe) => { return (
{rowData.competences?.slice(0, 3).map((comp, index) => ( ))} {rowData.competences?.length > 3 && ( )}
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setGlobalFilter(e.target.value)} />
); }; const header = (

Gestion des Employés

setGlobalFilter(e.target.value)} />
); return (
setSelectedEmployes(e.value)} responsiveLayout="scroll" >
setDeleteDialog(false)} message={`Êtes-vous sûr de vouloir supprimer l'employé ${employeToDelete?.prenom} ${employeToDelete?.nom} ?`} header="Confirmation de suppression" icon="pi pi-exclamation-triangle" accept={deleteEmploye} reject={() => setDeleteDialog(false)} acceptLabel="Oui" rejectLabel="Non" acceptClassName="p-button-danger" />
); }; const EmployesPage = () => { return ( ); }; export default EmployesPage;