"use client"; import { useState, useEffect } from "react"; import { Users, User, Trash2, Building2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { useToast } from "@/hooks/use-toast"; import { AdminManagementService, Team, } from "@/services/admin-management-service"; import { TreeCategoryHeader, TreeItemRow } from "@/components/admin"; import { TreeViewPage } from "../tree-view-page"; import { useTreeView } from "@/hooks/use-tree-view"; import { useFormDialog } from "@/hooks/use-form-dialog"; interface User { uuid: string; firstName: string; lastName: string; teamName?: string; hasEvaluations: boolean; } interface UserFormData { firstName: string; lastName: string; teamId: string; } export function UsersManagement() { const [users, setUsers] = useState([]); const [teams, setTeams] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [deletingUserId, setDeletingUserId] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const [userFormData, setUserFormData] = useState({ firstName: "", lastName: "", teamId: "", }); const { toast } = useToast(); const { isCreateDialogOpen, openCreateDialog, closeCreateDialog } = useFormDialog(); // Utilisation du hook factorisé const { filteredDataByCategory: filteredUsersByTeam, expandedCategories: expandedTeams, toggleCategory: toggleTeam, expandAll, collapseAll, } = useTreeView({ data: users, searchFields: ["firstName", "lastName"], groupBy: (user) => user.teamName || "Sans équipe", searchTerm, onSearchChange: setSearchTerm, }); useEffect(() => { fetchUsers(); fetchTeams(); }, []); const fetchUsers = async () => { setIsLoading(true); setError(null); try { const response = await fetch("/api/admin/users"); if (!response.ok) { throw new Error("Erreur lors de la récupération des utilisateurs"); } const usersData = await response.json(); setUsers(usersData); } catch (err: any) { setError(err.message || "Erreur lors du chargement des utilisateurs"); } finally { setIsLoading(false); } }; const fetchTeams = async () => { try { const teamsData = await AdminManagementService.getTeams(); setTeams(teamsData); } catch (error) { console.error("Error fetching teams:", error); } }; const handleCreateUser = async () => { if (!userFormData.firstName || !userFormData.lastName) { toast({ title: "Erreur", description: "Veuillez remplir tous les champs obligatoires", variant: "destructive", }); return; } try { // TODO: Implémenter la création d'utilisateur toast({ title: "Succès", description: "Utilisateur créé avec succès", }); setUserFormData({ firstName: "", lastName: "", teamId: "" }); closeCreateDialog(); // Rafraîchir la liste fetchUsers(); } catch (error: any) { toast({ title: "Erreur", description: error.message || "Erreur lors de la création de l'utilisateur", variant: "destructive", }); } }; const handleDeleteUser = async (user: User) => { if (user.teamName) { toast({ title: "Action impossible", description: "Retirez d'abord l'utilisateur de son équipe avant de le supprimer", variant: "destructive", }); return; } if ( !confirm( `Êtes-vous sûr de vouloir supprimer définitivement ${user.firstName} ${user.lastName} ?\n\nCette action supprimera aussi toutes ses évaluations par skills et est irréversible.` ) ) { return; } setDeletingUserId(user.uuid); try { await AdminManagementService.deleteUser(user.uuid); // Mettre à jour la liste locale setUsers((prev) => prev.filter((u) => u.uuid !== user.uuid)); toast({ title: "Succès", description: `${user.firstName} ${user.lastName} a été supprimé avec succès`, }); } catch (err: any) { toast({ title: "Erreur", description: err.message || "Erreur lors de la suppression de l'utilisateur", variant: "destructive", }); } finally { setDeletingUserId(null); } }; if (isLoading) { return (

Gestion des utilisateurs

{[1, 2, 3].map((i) => (
))}
); } if (error) { return (

Gestion des utilisateurs

{error}

); } const headerActions = ( Créer un nouvel utilisateur
setUserFormData({ ...userFormData, firstName: e.target.value, }) } placeholder="Prénom de l'utilisateur" />
setUserFormData({ ...userFormData, lastName: e.target.value, }) } placeholder="Nom de l'utilisateur" />
); const emptyState = (

{searchTerm ? "Aucun utilisateur trouvé" : "Aucun utilisateur"}

{searchTerm ? "Essayez de modifier vos critères de recherche" : "Commencez par créer votre premier utilisateur"}

); return ( 0} emptyState={emptyState} headerActions={headerActions} > {Object.entries(filteredUsersByTeam).map( ([teamName, teamUsers], index) => (
toggleTeam(teamName)} icon={} itemCount={teamUsers.length} itemLabel="utilisateur" showSeparator={index > 0} canDelete={false} isDirection={false} /> {/* Liste des utilisateurs de l'équipe */} {expandedTeams.has(teamName) && (
{teamUsers.map((user, userIndex) => ( } title={`${user.firstName} ${user.lastName}`} badges={[ { text: user.hasEvaluations ? "A des évaluations" : "Aucune évaluation", variant: user.hasEvaluations ? "default" : "outline", }, ]} onDelete={() => handleDeleteUser(user)} canDelete={!user.teamName} showSeparator={userIndex > 0} additionalInfo={

{user.teamName ? `Équipe: ${user.teamName}` : "Aucune équipe"}

} /> ))}
)}
) )}
); }