diff --git a/components/users/users-table.tsx b/components/users/users-table.tsx index 2048cb64..633485e3 100644 --- a/components/users/users-table.tsx +++ b/components/users/users-table.tsx @@ -12,7 +12,7 @@ import { import { Button } from "@/components/ui/button"; import { useSession } from "next-auth/react"; import { Input } from "@/components/ui/input"; -import { MoreHorizontal, Trash, Edit, UserPlus } from "lucide-react"; +import { MoreHorizontal, Trash, Edit, UserPlus, Key, Lock, Unlock } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, @@ -46,6 +46,7 @@ interface User { email: string; createdTimestamp: number; roles: string[]; + enabled: boolean; } interface Role { @@ -72,14 +73,16 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { const [searchTerm, setSearchTerm] = useState(""); const [newUserDialog, setNewUserDialog] = useState(false); const [editUserDialog, setEditUserDialog] = useState(false); + const [manageRolesDialog, setManageRolesDialog] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const [formData, setFormData] = useState({ username: "", - firstName: "", lastName: "", + firstName: "", email: "", password: "", roles: [] as string[], + enabled: true, }); useEffect(() => { @@ -149,6 +152,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { email: "", password: "", roles: [], + enabled: true, }); toast({ @@ -176,10 +180,56 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { email: user.email || "", password: "", roles: user.roles || [], + enabled: user.enabled, }); setEditUserDialog(true); }; + const handleManageRoles = async (userId: string) => { + const user = users.find(u => u.id === userId); + if (!user) return; + + setSelectedUser(user); + setFormData(prev => ({ ...prev, roles: user.roles || [] })); + setManageRolesDialog(true); + }; + + const handleUpdateRoles = async () => { + if (!selectedUser) return; + + try { + const response = await fetch(`/api/users/${selectedUser.id}/roles`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + roles: formData.roles, + }), + }); + + if (!response.ok) { + throw new Error("Erreur lors de la mise à jour des rôles"); + } + + await fetchUsers(); + + setManageRolesDialog(false); + setSelectedUser(null); + + toast({ + title: "Succès", + description: "Les rôles ont été mis à jour avec succès", + }); + } catch (error) { + toast({ + title: "Erreur", + description: error instanceof Error ? error.message : "Une erreur est survenue", + variant: "destructive", + }); + } + }; + const handleUpdateUser = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedUser) return; @@ -197,15 +247,11 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { }), }); - const data = await response.json(); - if (!response.ok) { - throw new Error(data.error || "Erreur lors de la modification de l'utilisateur"); + throw new Error("Erreur lors de la modification de l'utilisateur"); } - setUsers(prevUsers => prevUsers.map(u => - u.id === selectedUser.id ? { ...u, ...data } : u - )); + await fetchUsers(); setEditUserDialog(false); setSelectedUser(null); @@ -223,55 +269,6 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { } }; - const handleManageRoles = async (userId: string) => { - const user = users.find(u => u.id === userId); - if (!user) return; - - setSelectedUser(user); - setFormData(prev => ({ ...prev, roles: user.roles || [] })); - setEditUserDialog(true); - }; - - const handleUpdateRoles = async () => { - if (!selectedUser) return; - - try { - const response = await fetch(`/api/users/${selectedUser.id}/roles`, { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - roles: formData.roles, - }), - }); - - const data = await response.json(); - - if (!response.ok) { - throw new Error(data.error || "Erreur lors de la mise à jour des rôles"); - } - - setUsers(prevUsers => prevUsers.map(u => - u.id === selectedUser.id ? { ...u, roles: formData.roles } : u - )); - - setEditUserDialog(false); - setSelectedUser(null); - - toast({ - title: "Succès", - description: "Les rôles ont été mis à jour avec succès", - }); - } catch (error) { - toast({ - title: "Erreur", - description: error instanceof Error ? error.message : "Une erreur est survenue", - variant: "destructive", - }); - } - }; - const handleDelete = async (userId: string) => { try { const response = await fetch(`/api/users/${userId}`, { @@ -299,6 +296,67 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { } }; + const handleChangePassword = async (userId: string) => { + const newPassword = prompt("Entrez le nouveau mot de passe:"); + if (!newPassword) return; + + try { + const response = await fetch(`/api/users/${userId}/password`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ password: newPassword }), + }); + + if (!response.ok) { + throw new Error("Erreur lors du changement de mot de passe"); + } + + toast({ + title: "Succès", + description: "Le mot de passe a été modifié avec succès", + }); + } catch (error) { + toast({ + title: "Erreur", + description: error instanceof Error ? error.message : "Une erreur est survenue", + variant: "destructive", + }); + } + }; + + const handleToggleUserStatus = async (userId: string, currentStatus: boolean) => { + try { + const response = await fetch(`/api/users/${userId}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ enabled: !currentStatus }), + }); + + if (!response.ok) { + throw new Error("Erreur lors de la modification du statut de l'utilisateur"); + } + + setUsers(prevUsers => prevUsers.map(u => + u.id === userId ? { ...u, enabled: !currentStatus } : u + )); + + toast({ + title: "Succès", + description: `L'utilisateur a été ${!currentStatus ? "activé" : "désactivé"} avec succès`, + }); + } catch (error) { + toast({ + title: "Erreur", + description: error instanceof Error ? error.message : "Une erreur est survenue", + variant: "destructive", + }); + } + }; + const filteredUsers = useMemo(() => { let filtered = users; @@ -351,14 +409,6 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { required /> -
- - setFormData(prev => ({ ...prev, firstName: e.target.value }))} - /> -
setFormData(prev => ({ ...prev, lastName: e.target.value }))} />
+
+ + setFormData(prev => ({ ...prev, firstName: e.target.value }))} + /> +
- +
+ {roles.map((role) => ( +
+ { + setFormData(prev => ({ + ...prev, + roles: e.target.checked + ? [...prev.roles, role.name] + : prev.roles.filter(r => r !== role.name) + })); + }} + /> + +
+ ))} +
+
+ {formData.roles.map(role => ( + + {role} + + + ))} +
+ + ))} +
+ + ))} +
+ + + + + ); }