'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 } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface NouvelleEquipe { nom: string; description: string; specialite: string; chefEquipeId?: number; employeIds: number[]; competencesRequises: string[]; } interface Employe { id: number; nom: string; prenom: string; metier: string; statut: string; competences: string[]; niveauExperience: string; } const NouvelleEquipePage = () => { const [equipe, setEquipe] = useState({ nom: '', description: '', specialite: '', employeIds: [], competencesRequises: [] }); const [employes, setEmployes] = useState([]); const [employesDisponibles, setEmployesDisponibles] = useState([]); const [employesSelectionnes, setEmployesSelectionnes] = useState([]); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState<{ [key: string]: string }>({}); const router = useRouter(); 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(() => { loadEmployesDisponibles(); }, []); const loadEmployesDisponibles = async () => { try { 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); } }; 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('🔄 Création de l\'équipe...', equipe); const response = await apiClient.post('/api/equipes', equipe); console.log('✅ Équipe créée avec succès:', response.data); router.push('/equipes'); } catch (error) { console.error('❌ Erreur lors de la création:', 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 selected = employesDisponibles.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 (
); }; 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..." />
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}`} /> ) : ( )}

Une équipe efficace compte généralement 3 à 8 employés.

Mélangez les niveaux d'expérience pour un meilleur encadrement.

Assurez-vous que les compétences correspondent à la spécialité.

Désignez un chef d'équipe expérimenté après la création.

); }; export default NouvelleEquipePage;