import React, { useState, useEffect } from 'react'; import { useAuth } from '../context/AuthContext'; import Sidebar from '../components/Sidebar'; import { Users, CheckCircle, XCircle, Clock, Calendar, FileText, Menu, Eye, MessageSquare } from 'lucide-react'; const Collaborateur = () => { const { user } = useAuth(); const [sidebarOpen, setSidebarOpen] = useState(false); const isEmployee = user?.role === 'Collaborateur'||'Apprenti'; const [teamMembers, setTeamMembers] = useState([]); const [pendingRequests, setPendingRequests] = useState([]); const [allRequests, setAllRequests] = useState([]); const [isLoading, setIsLoading] = useState(true); const [selectedRequest, setSelectedRequest] = useState(null); const [showValidationModal, setShowValidationModal] = useState(false); const [validationComment, setValidationComment] = useState(''); const [validationAction, setValidationAction] = useState(''); useEffect(() => { if (user?.id) { fetchTeamData(); } }, [user]); const fetchTeamData = async () => { try { setIsLoading(true); // Récupérer les membres de l'équipe await fetchTeamMembers(); // Récupérer les demandes en attente await fetchPendingRequests(); // Récupérer toutes les demandes de l'équipe await fetchAllTeamRequests(); } catch (error) { console.error('Erreur lors de la récupération des données équipe:', error); } finally { setIsLoading(false); } }; const fetchTeamMembers = async () => { try { const response = await fetch(`/getTeamMembers?manager_id=${user.id}`); const text = await response.text(); console.log('Réponse équipe:', text); const data = JSON.parse(text); if (data.success) { setTeamMembers(data.team_members || []); } } catch (error) { console.error('Erreur récupération équipe:', error); setTeamMembers([]); } }; const fetchPendingRequests = async () => { try { const response = await fetch(`/getPendingRequests?manager_id=${user.id}`); const text = await response.text(); console.log('Réponse demandes en attente:', text); const data = JSON.parse(text); if (data.success) { setPendingRequests(data.requests || []); } } catch (error) { console.error('Erreur récupération demandes en attente:', error); setPendingRequests([]); } }; const fetchAllTeamRequests = async () => { try { const response = await fetch(`/getAllTeamRequests?SuperieurId=${user.id}`); const text = await response.text(); console.log('Réponse toutes demandes équipe:', text); const data = JSON.parse(text); if (data.success) { setAllRequests(data.requests || []); } } catch (error) { console.error('Erreur récupération toutes demandes:', error); console.log('Réponse brute:', text); setAllRequests([]); } }; const handleValidateRequest = async (requestId, action, comment = '') => { try { const response = await fetch('/validateRequest', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ request_id: requestId, action: action, // 'approve' ou 'reject' comment: comment, validator_id: user.id }), }); const text = await response.text(); console.log('Réponse validation:', text); const data = JSON.parse(text); if (data.success) { // Rafraîchir les données await fetchTeamData(); setShowValidationModal(false); setSelectedRequest(null); setValidationComment(''); alert(`Demande ${action === 'approve' ? 'approuvée' : 'refusée'} avec succès !`); } else { alert(`Erreur: ${data.message}`); } } catch (error) { console.error('Erreur validation:', error); alert('Erreur lors de la validation'); } }; const openValidationModal = (request, action) => { setSelectedRequest(request); setValidationAction(action); setValidationComment(''); setShowValidationModal(true); }; const getStatusColor = (status) => { switch (status) { case 'En attente': return 'bg-yellow-100 text-yellow-800'; case 'Validée': case 'Approuvé': return 'bg-green-100 text-green-800'; case 'Refusée': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getTypeColor = (type) => { switch (type) { case 'Congés payés': case 'Congé payé': return 'bg-blue-100 text-blue-800'; case 'RTT': return 'bg-green-100 text-green-800'; case 'Congé maladie': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (isLoading) { return (
Chargement des données équipe...
Équipe
{teamMembers.length}
membres
En attente
{pendingRequests.length}
demandes
Aucune demande en attente
{request.date_display}
Soumis le {request.submitted_display}
{request.days}j
Aucun membre d'équipe
{member.prenom} {member.nom}
{member.email}
{allRequests.filter(r => r.employee_id === member.id && r.status === 'En attente').length} en attente
{allRequests.filter(r => r.employee_id === member.id).length} total
Aucune demande
{request.employee_name}
{request.type} {request.status}{request.date_display}
Soumis le {request.submitted_display}
{request.reason && (Motif : {request.reason}
)} {request.file && (Document joint
{request.days}j
{selectedRequest.employee_name}
{selectedRequest.type} - {selectedRequest.date_display}
{selectedRequest.days} jour(s)
{selectedRequest.reason && (Motif: {selectedRequest.reason}
)} {selectedRequest.file && (Document joint