From 992d5ec2a081a0f5b2295b63ceba011d5a595165 Mon Sep 17 00:00:00 2001 From: Alma Date: Wed, 9 Apr 2025 21:25:10 +0200 Subject: [PATCH] update api users and groups and users 10 --- components/groups/groups-table.tsx | 160 +++++++++++++++++++++++++++-- components/users/users-table.tsx | 63 +++++++++--- 2 files changed, 201 insertions(+), 22 deletions(-) diff --git a/components/groups/groups-table.tsx b/components/groups/groups-table.tsx index 5e6a0a43..d5693ead 100644 --- a/components/groups/groups-table.tsx +++ b/components/groups/groups-table.tsx @@ -37,6 +37,12 @@ interface Group { membersCount: number; } +interface User { + id: string; + username: string; + email: string; +} + interface ApiError { message: string; } @@ -54,6 +60,9 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) { const [modifyGroupDialog, setModifyGroupDialog] = useState(false); const [selectedGroup, setSelectedGroup] = useState(null); const [modifiedGroupName, setModifiedGroupName] = useState(""); + const [manageMembersDialog, setManageMembersDialog] = useState(false); + const [groupMembers, setGroupMembers] = useState([]); + const [availableUsers, setAvailableUsers] = useState([]); useEffect(() => { fetchGroups(); @@ -200,19 +209,91 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) { }; const handleManageMembers = async (groupId: string) => { - try { - const group = groups.find(g => g.id === groupId); - if (!group) return; + const group = groups.find(g => g.id === groupId); + if (!group) return; - // TODO: Implement member management UI + setSelectedGroup(group); + + try { + // Fetch group members + const membersResponse = await fetch(`/api/groups/${groupId}/members`); + if (!membersResponse.ok) throw new Error("Failed to fetch group members"); + const members = await membersResponse.json(); + setGroupMembers(members); + + // Fetch all users + const usersResponse = await fetch("/api/users"); + if (!usersResponse.ok) throw new Error("Failed to fetch users"); + const users = await usersResponse.json(); + setAvailableUsers(users.filter((user: User) => !members.some((m: User) => m.id === user.id))); + + setManageMembersDialog(true); + } catch (error) { toast({ - title: "Info", - description: "La gestion des membres sera bientôt disponible", + title: "Erreur", + description: "Erreur lors de la récupération des membres", + variant: "destructive", + }); + } + }; + + const handleAddMember = async (userId: string) => { + if (!selectedGroup) return; + + try { + const response = await fetch(`/api/groups/${selectedGroup.id}/members`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ userId }), + }); + + if (!response.ok) throw new Error("Failed to add member"); + + const user = availableUsers.find(u => u.id === userId); + if (user) { + setGroupMembers(prev => [...prev, user]); + setAvailableUsers(prev => prev.filter(u => u.id !== userId)); + } + + toast({ + title: "Succès", + description: "Membre ajouté avec succès", }); } catch (error) { toast({ title: "Erreur", - description: error instanceof Error ? error.message : "Une erreur est survenue", + description: "Erreur lors de l'ajout du membre", + variant: "destructive", + }); + } + }; + + const handleRemoveMember = async (userId: string) => { + if (!selectedGroup) return; + + try { + const response = await fetch(`/api/groups/${selectedGroup.id}/members/${userId}`, { + method: "DELETE", + }); + + if (!response.ok) throw new Error("Failed to remove member"); + + const user = groupMembers.find(u => u.id === userId); + if (user) { + setAvailableUsers(prev => [...prev, user]); + setGroupMembers(prev => prev.filter(u => u.id !== userId)); + } + + toast({ + title: "Succès", + description: "Membre retiré avec succès", + }); + } catch (error) { + toast({ + title: "Erreur", + description: "Erreur lors du retrait du membre", variant: "destructive", }); } @@ -350,6 +431,71 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) { + + { + if (!open) { + setSelectedGroup(null); + setGroupMembers([]); + setAvailableUsers([]); + } + setManageMembersDialog(open); + }}> + + + Gérer les membres du groupe {selectedGroup?.name} + +
+
+ +
+ {groupMembers.length === 0 ? ( +

Aucun membre

+ ) : ( + groupMembers.map(member => ( +
+
+

{member.username}

+

{member.email}

+
+ +
+ )) + )} +
+
+
+ +
+ {availableUsers.length === 0 ? ( +

Aucun utilisateur disponible

+ ) : ( + availableUsers.map(user => ( +
+
+

{user.username}

+

{user.email}

+
+ +
+ )) + )} +
+
+
+
+
); } \ No newline at end of file diff --git a/components/users/users-table.tsx b/components/users/users-table.tsx index cc106ea9..db6aabbc 100644 --- a/components/users/users-table.tsx +++ b/components/users/users-table.tsx @@ -134,7 +134,11 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { headers: { "Content-Type": "application/json", }, - body: JSON.stringify(formData), + body: JSON.stringify({ + ...formData, + firstName: formData.firstName, + lastName: formData.lastName, + }), }); const data = await response.json(); @@ -433,14 +437,6 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { required /> -
- - setFormData(prev => ({ ...prev, lastName: e.target.value }))} - /> -
setFormData(prev => ({ ...prev, firstName: e.target.value }))} />
+
+ + setFormData(prev => ({ ...prev, lastName: e.target.value }))} + /> +
- Actions - handleEdit(user.id)}> + { + e.stopPropagation(); + handleEdit(user.id); + }} + > Modifier - handleManageRoles(user.id)}> + { + e.stopPropagation(); + handleManageRoles(user.id); + }} + > Gérer les rôles - handleChangePassword(user.id)}> + { + e.stopPropagation(); + handleChangePassword(user.id); + }} + > Changer le mot de passe - handleToggleUserStatus(user.id, user.enabled)}> + { + e.stopPropagation(); + handleToggleUserStatus(user.id, user.enabled); + }} + > {user.enabled ? ( <> @@ -578,7 +608,10 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { handleDelete(user.id)} + onClick={(e) => { + e.stopPropagation(); + handleDelete(user.id); + }} > Supprimer