'use client'; export const dynamic = 'force-dynamic'; 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 { Badge } from 'primereact/badge'; 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 Equipe { id: number; nom: string; description: string; specialite: string; statut: 'ACTIVE' | 'INACTIVE' | 'EN_MISSION' | 'DISPONIBLE'; chefEquipeId?: number; chefEquipeNom?: string; nombreEmployes: number; employes: Array<{ id: number; nom: string; prenom: string; metier: string; }>; chantierActuel?: string; dateCreation: string; competencesEquipe: string[]; tauxOccupation: number; } const EquipesPage = () => { const [equipes, setEquipes] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedEquipes, setSelectedEquipes] = useState([]); const [deleteDialog, setDeleteDialog] = useState(false); const [equipeToDelete, setEquipeToDelete] = useState(null); const router = useRouter(); const specialiteOptions = [ { label: 'Toutes', value: null }, { label: 'Gros œuvre', value: 'GROS_OEUVRE' }, { label: 'Second œuvre', value: 'SECOND_OEUVRE' }, { label: 'Finitions', value: 'FINITIONS' }, { label: 'Électricité', value: 'ELECTRICITE' }, { label: 'Plomberie', value: 'PLOMBERIE' }, { label: 'Charpente', value: 'CHARPENTE' }, { label: 'Couverture', value: 'COUVERTURE' }, { label: 'Terrassement', value: 'TERRASSEMENT' } ]; useEffect(() => { loadEquipes(); }, []); const loadEquipes = async () => { try { setLoading(true); console.log('🔄 Chargement des équipes...'); const response = await apiClient.get('/api/equipes'); console.log('✅ Équipes chargées:', response.data); setEquipes(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des équipes:', error); setEquipes([]); } finally { setLoading(false); } }; const confirmDeleteEquipe = (equipe: Equipe) => { setEquipeToDelete(equipe); setDeleteDialog(true); }; const deleteEquipe = async () => { if (equipeToDelete) { try { await apiClient.delete(`/api/equipes/${equipeToDelete.id}`); setEquipes(equipes.filter(e => e.id !== equipeToDelete.id)); setDeleteDialog(false); setEquipeToDelete(null); console.log('✅ Équipe supprimée avec succès'); } catch (error) { console.error('❌ Erreur lors de la suppression:', error); } } }; const toggleStatutEquipe = async (equipe: Equipe) => { try { const newStatut = equipe.statut === 'ACTIVE' ? 'INACTIVE' : 'ACTIVE'; const endpoint = newStatut === 'ACTIVE' ? 'activer' : 'desactiver'; await apiClient.post(`/api/equipes/${equipe.id}/${endpoint}`); setEquipes(equipes.map(e => e.id === equipe.id ? { ...e, statut: newStatut } : e )); console.log(`✅ Statut équipe ${newStatut.toLowerCase()}`); } catch (error) { console.error('❌ Erreur lors du changement de statut:', error); } }; const statutBodyTemplate = (rowData: Equipe) => { const getSeverity = (statut: string) => { switch (statut) { case 'ACTIVE': return 'success'; case 'INACTIVE': return 'danger'; case 'EN_MISSION': return 'warning'; case 'DISPONIBLE': return 'info'; default: return 'secondary'; } }; return ; }; const specialiteBodyTemplate = (rowData: Equipe) => { const getSpecialiteColor = (specialite: string) => { const colors: { [key: string]: string } = { 'GROS_OEUVRE': 'danger', 'SECOND_OEUVRE': 'warning', 'FINITIONS': 'success', 'ELECTRICITE': 'info', 'PLOMBERIE': 'primary', 'CHARPENTE': 'help', 'COUVERTURE': 'secondary', 'TERRASSEMENT': 'contrast' }; return colors[specialite] || 'secondary'; }; return ; }; const chefEquipeBodyTemplate = (rowData: Equipe) => { if (rowData.chefEquipeNom) { return (
{rowData.chefEquipeNom}
); } return Non assigné; }; const employesBodyTemplate = (rowData: Equipe) => { return (
employés {rowData.employes && rowData.employes.length > 0 && (
{rowData.employes.slice(0, 2).map((emp, index) => ( ))} {rowData.employes.length > 2 && ( )}
)}
); }; const occupationBodyTemplate = (rowData: Equipe) => { const getOccupationColor = (taux: number) => { if (taux >= 90) return 'danger'; if (taux >= 70) return 'warning'; if (taux >= 40) return 'success'; return 'info'; }; return (
{rowData.chantierActuel && ( {rowData.chantierActuel} )}
); }; const competencesBodyTemplate = (rowData: Equipe) => { return (
{rowData.competencesEquipe?.slice(0, 3).map((comp, index) => ( ))} {rowData.competencesEquipe?.length > 3 && ( )}
); }; const actionBodyTemplate = (rowData: Equipe) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setGlobalFilter(e.target.value)} />
); }; const header = (

Gestion des Équipes

e.statut === 'ACTIVE').length} severity="success" /> Actives e.statut === 'DISPONIBLE').length} severity="info" /> Disponibles e.statut === 'EN_MISSION').length} severity="warning" /> En mission
); return (
setSelectedEquipes(e.value)} selectionMode="multiple" responsiveLayout="scroll" >
setDeleteDialog(false)} message={`Êtes-vous sûr de vouloir supprimer l'équipe "${equipeToDelete?.nom}" ?`} header="Confirmation de suppression" icon="pi pi-exclamation-triangle" accept={deleteEquipe} reject={() => setDeleteDialog(false)} acceptLabel="Oui" rejectLabel="Non" acceptClassName="p-button-danger" />
); }; export default EquipesPage;