'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { MultiSelect } from 'primereact/multiselect'; import { Button } from 'primereact/button'; import { Toolbar } from 'primereact/toolbar'; import { Message } from 'primereact/message'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Tag } from 'primereact/tag'; import { useRouter, useParams } from 'next/navigation'; import { apiClient } from '../../../../../services/api-client'; interface EquipeEdit { nom: string; description: string; specialite: string; chefEquipeId?: number; employeIds: number[]; competencesRequises: string[]; localisation: string; } interface Employe { id: number; nom: string; prenom: string; metier: string; statut: string; competences: string[]; niveauExperience: string; } const EditEquipePage = () => { const [equipe, setEquipe] = useState({ nom: '', description: '', specialite: '', employeIds: [], competencesRequises: [], localisation: '' }); const [equipeOriginale, setEquipeOriginale] = useState(null); const [employes, setEmployes] = useState([]); const [employesDisponibles, setEmployesDisponibles] = useState([]); const [employesSelectionnes, setEmployesSelectionnes] = useState([]); const [loading, setLoading] = useState(false); const [loadingData, setLoadingData] = useState(true); const [errors, setErrors] = useState<{ [key: string]: string }>({}); const router = useRouter(); const params = useParams(); const equipeId = params.id; const specialiteOptions = [ { 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' } ]; const competencesOptions = [ { label: 'Maçonnerie', value: 'MACONNERIE' }, { label: 'Coffrage', value: 'COFFRAGE' }, { label: 'Ferraillage', value: 'FERRAILLAGE' }, { label: 'Électricité générale', value: 'ELECTRICITE_GENERALE' }, { label: 'Électricité industrielle', value: 'ELECTRICITE_INDUSTRIELLE' }, { label: 'Plomberie sanitaire', value: 'PLOMBERIE_SANITAIRE' }, { label: 'Chauffage', value: 'CHAUFFAGE' }, { label: 'Climatisation', value: 'CLIMATISATION' }, { label: 'Charpente bois', value: 'CHARPENTE_BOIS' }, { label: 'Charpente métallique', value: 'CHARPENTE_METALLIQUE' }, { label: 'Couverture tuile', value: 'COUVERTURE_TUILE' }, { label: 'Étanchéité', value: 'ETANCHEITE' }, { label: 'Peinture', value: 'PEINTURE' }, { label: 'Carrelage', value: 'CARRELAGE' }, { label: 'Parquet', value: 'PARQUET' }, { label: 'Plâtrerie', value: 'PLATRERIE' }, { label: 'Conduite d\'engins', value: 'CONDUITE_ENGINS' }, { label: 'Terrassement', value: 'TERRASSEMENT' }, { label: 'VRD', value: 'VRD' } ]; useEffect(() => { if (equipeId) { loadEquipeData(); loadEmployesDisponibles(); } }, [equipeId]); const loadEquipeData = async () => { try { console.log('🔄 Chargement des données équipe...', equipeId); const response = await apiClient.get(`/api/equipes/${equipeId}`); const equipeData = response.data; console.log('✅ Données équipe chargées:', equipeData); setEquipeOriginale(equipeData); setEquipe({ nom: equipeData.nom, description: equipeData.description || '', specialite: equipeData.specialite, chefEquipeId: equipeData.chefEquipeId, employeIds: equipeData.employes?.map((emp: any) => emp.id) || [], competencesRequises: equipeData.competencesEquipe || [], localisation: equipeData.localisation || '' }); setEmployesSelectionnes(equipeData.employes || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); } }; const loadEmployesDisponibles = async () => { try { setLoadingData(true); console.log('🔄 Chargement des employés disponibles...'); const response = await apiClient.get('/api/employes/disponibles'); console.log('✅ Employés disponibles chargés:', response.data); setEmployesDisponibles(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des employés:', error); } finally { setLoadingData(false); } }; const validateForm = () => { const newErrors: { [key: string]: string } = {}; if (!equipe.nom.trim()) { newErrors.nom = 'Le nom de l\'équipe est requis'; } if (!equipe.specialite) { newErrors.specialite = 'La spécialité est requise'; } if (equipe.employeIds.length === 0) { newErrors.employes = 'Au moins un employé doit être sélectionné'; } if (equipe.competencesRequises.length === 0) { newErrors.competences = 'Au moins une compétence doit être sélectionnée'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } try { setLoading(true); console.log('🔄 Mise à jour de l\'équipe...', equipe); const response = await apiClient.put(`/api/equipes/${equipeId}`, equipe); console.log('✅ Équipe mise à jour avec succès:', response.data); router.push(`/equipes/${equipeId}`); } catch (error) { console.error('❌ Erreur lors de la mise à jour:', error); } finally { setLoading(false); } }; const handleEmployeSelection = (selectedEmployeIds: number[]) => { setEquipe({ ...equipe, employeIds: selectedEmployeIds }); // Mettre à jour la liste des employés sélectionnés pour l'affichage const allEmployes = [...employesDisponibles, ...(equipeOriginale?.employes || [])]; const selected = allEmployes.filter(emp => selectedEmployeIds.includes(emp.id)); setEmployesSelectionnes(selected); // Auto-sélectionner les compétences des employés sélectionnés const competencesEmployes = selected.flatMap(emp => emp.competences || []); const competencesUniques = [...new Set(competencesEmployes)]; setEquipe(prev => ({ ...prev, competencesRequises: [...new Set([...prev.competencesRequises, ...competencesUniques])] })); }; const employeOptionTemplate = (option: Employe) => { return (
{option.prenom} {option.nom}
{option.metier} - {option.niveauExperience}
); }; const employeSelectedTemplate = (option: Employe) => { return `${option.prenom} ${option.nom}`; }; const metierBodyTemplate = (rowData: Employe) => { 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 competencesBodyTemplate = (rowData: Employe) => { return (
{rowData.competences?.slice(0, 2).map((comp, index) => ( ))} {rowData.competences?.length > 2 && ( +{rowData.competences.length - 2} )}
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; if (loadingData) { return (
); } // Combiner les employés disponibles avec les employés actuels de l'équipe const tousEmployes = [ ...employesDisponibles, ...(equipeOriginale?.employes || []).filter((emp: any) => !employesDisponibles.some(disp => disp.id === emp.id) ) ]; return (
setEquipe({ ...equipe, nom: e.target.value })} className={errors.nom ? 'p-invalid' : ''} placeholder="Ex: Équipe Gros Œuvre A" /> {errors.nom && {errors.nom}}
setEquipe({ ...equipe, specialite: e.value })} placeholder="Sélectionner une spécialité" className={errors.specialite ? 'p-invalid' : ''} /> {errors.specialite && {errors.specialite}}
setEquipe({ ...equipe, description: e.target.value })} rows={3} placeholder="Description de l'équipe et de ses missions..." />
setEquipe({ ...equipe, localisation: e.target.value })} placeholder="Ville ou région de base" />
handleEmployeSelection(e.value)} optionLabel="nom" optionValue="id" placeholder="Sélectionner les employés" itemTemplate={employeOptionTemplate} selectedItemTemplate={employeSelectedTemplate} className={errors.employes ? 'p-invalid' : ''} filter showClear /> {errors.employes && {errors.employes}}
setEquipe({ ...equipe, competencesRequises: e.value })} placeholder="Sélectionner les compétences" className={errors.competences ? 'p-invalid' : ''} filter showClear /> {errors.competences && {errors.competences}}
{employesSelectionnes.length > 0 ? ( `${rowData.prenom} ${rowData.nom}`} /> ) : ( )}

Modifiez les informations de l'équipe selon vos besoins.

Vous pouvez ajouter ou retirer des employés.

Les compétences sont mises à jour automatiquement.

Attention: retirer des employés peut affecter les plannings en cours.

); }; export default EditEquipePage;