diff --git a/components/missions/missions-admin-panel.tsx b/components/missions/missions-admin-panel.tsx index 30b82881..eae84a51 100644 --- a/components/missions/missions-admin-panel.tsx +++ b/components/missions/missions-admin-panel.tsx @@ -18,22 +18,25 @@ import { } from "../ui/card"; import { Badge } from "../ui/badge"; import { X, Search, UserPlus, Users } from "lucide-react"; +import { toast } from "../ui/use-toast"; -// Mock user data - in a real app, this would come from an API -const mockUsers = [ - { id: '1', username: 'user1', firstName: 'John', lastName: 'Doe', email: 'john@example.com' }, - { id: '2', username: 'user2', firstName: 'Jane', lastName: 'Smith', email: 'jane@example.com' }, - { id: '3', username: 'user3', firstName: 'Alice', lastName: 'Johnson', email: 'alice@example.com' }, - { id: '4', username: 'user4', firstName: 'Bob', lastName: 'Brown', email: 'bob@example.com' }, - { id: '5', username: 'user5', firstName: 'Eva', lastName: 'Martinez', email: 'eva@example.com' }, -]; +// Define interfaces for user and group data +interface User { + id: string; + username: string; + firstName: string; + lastName: string; + email: string; + roles?: string[]; + enabled?: boolean; +} -// Mock group data -const mockGroups = [ - { id: '1', name: 'Group A', path: '/group-a', membersCount: 3 }, - { id: '2', name: 'Group B', path: '/group-b', membersCount: 5 }, - { id: '3', name: 'Group C', path: '/group-c', membersCount: 2 }, -]; +interface Group { + id: string; + name: string; + path: string; + membersCount: number; +} export function MissionsAdminPanel() { const [selectedServices, setSelectedServices] = useState([]); @@ -43,21 +46,101 @@ export function MissionsAdminPanel() { const [gardienDuTemps, setGardienDuTemps] = useState(null); const [gardienDeLaParole, setGardienDeLaParole] = useState(null); const [gardienDeLaMemoire, setGardienDeLaMemoire] = useState(null); - + + // State for storing fetched data + const [users, setUsers] = useState([]); + const [groups, setGroups] = useState([]); + const [loading, setLoading] = useState(true); + + // Fetch users and groups on component mount + useEffect(() => { + const fetchData = async () => { + setLoading(true); + try { + await Promise.all([fetchUsers(), fetchGroups()]); + } catch (error) { + console.error("Error fetching data:", error); + } finally { + setLoading(false); + } + }; + + fetchData(); + }, []); + + // Function to fetch users from API + const fetchUsers = async () => { + try { + const response = await fetch("/api/users"); + if (!response.ok) { + throw new Error("Failed to fetch users"); + } + const data = await response.json(); + setUsers(data); + } catch (error) { + console.error("Error fetching users:", error); + toast({ + title: "Erreur", + description: "Erreur lors de la récupération des utilisateurs", + variant: "destructive", + }); + } + }; + + // Function to fetch groups from API + const fetchGroups = async () => { + try { + const response = await fetch("/api/groups"); + if (!response.ok) { + throw new Error("Failed to fetch groups"); + } + const data = await response.json(); + + // Fetch member counts for groups + const groupsWithCounts = await Promise.all( + (Array.isArray(data) ? data : []).map(async (group) => { + try { + const membersResponse = await fetch(`/api/groups/${group.id}/members`); + if (membersResponse.ok) { + const members = await membersResponse.json(); + return { + ...group, + membersCount: Array.isArray(members) ? members.length : 0 + }; + } + return {...group, membersCount: 0}; + } catch (error) { + console.error(`Error fetching members for group ${group.id}:`, error); + return {...group, membersCount: 0}; + } + }) + ); + + setGroups(groupsWithCounts); + } catch (error) { + console.error("Error fetching groups:", error); + toast({ + title: "Erreur", + description: "Erreur lors de la récupération des groupes", + variant: "destructive", + }); + } + }; + // Filtered users based on search term - const filteredUsers = mockUsers.filter(user => - user.username.toLowerCase().includes(searchTerm.toLowerCase()) || - user.email.toLowerCase().includes(searchTerm.toLowerCase()) || - user.firstName.toLowerCase().includes(searchTerm.toLowerCase()) || - user.lastName.toLowerCase().includes(searchTerm.toLowerCase()) + const filteredUsers = users.filter(user => + (user.username?.toLowerCase() || "").includes(searchTerm.toLowerCase()) || + (user.email?.toLowerCase() || "").includes(searchTerm.toLowerCase()) || + (user.firstName?.toLowerCase() || "").includes(searchTerm.toLowerCase()) || + (user.lastName?.toLowerCase() || "").includes(searchTerm.toLowerCase()) ); // Filtered groups based on search term - const filteredGroups = mockGroups.filter(group => - group.name.toLowerCase().includes(searchTerm.toLowerCase()) + const filteredGroups = groups.filter(group => + (group.name?.toLowerCase() || "").includes(searchTerm.toLowerCase()) ); - // Function to check if a user is already selected for a role + // Function to check if a user is already assigned for a role const isUserAssigned = (userId: string) => { return gardienDuTemps === userId || gardienDeLaParole === userId || @@ -94,6 +177,44 @@ export function MissionsAdminPanel() { } }; + // Function to fetch group members + const fetchGroupMembers = async (groupId: string) => { + try { + const response = await fetch(`/api/groups/${groupId}/members`); + if (!response.ok) { + throw new Error("Failed to fetch group members"); + } + const data = await response.json(); + return data; + } catch (error) { + console.error(`Error fetching members for group ${groupId}:`, error); + toast({ + title: "Erreur", + description: "Erreur lors de la récupération des membres du groupe", + variant: "destructive", + }); + return []; + } + }; + + // Handler for viewing group members + const handleViewGroupMembers = async (groupId: string, groupName: string) => { + try { + setLoading(true); + const members = await fetchGroupMembers(groupId); + // Here you would typically open a dialog to show members + // For this implementation, we'll just show a toast with the count + toast({ + title: `Membres de ${groupName}`, + description: `${members.length} membres trouvés dans ce groupe`, + }); + } catch (error) { + console.error("Error handling group members:", error); + } finally { + setLoading(false); + } + }; + return (
@@ -524,36 +645,49 @@ export function MissionsAdminPanel() { size="sm" onClick={() => removeUserRole('temps')} className="text-red-600 hover:bg-red-50 border-red-200 h-8" + disabled={loading} > Supprimer )}
- {gardienDuTemps ? ( -
- {(() => { - const user = mockUsers.find(u => u.id === gardienDuTemps); - return user ? ( -
-
- {user.firstName[0]}{user.lastName[0]} -
-
-
{user.firstName} {user.lastName}
-
{user.email}
-
-
- ) : "Utilisateur non trouvé"; - })()} + {loading ? ( +
+
+
+
+
+
+
+
) : ( -
-
- + gardienDuTemps ? ( +
+ {(() => { + const user = users.find(u => u.id === gardienDuTemps); + return user ? ( +
+
+ {user.firstName?.[0] || ""}{user.lastName?.[0] || ""} +
+
+
{user.firstName} {user.lastName}
+
{user.email}
+
+
+ ) : "Utilisateur non trouvé"; + })()}
- Aucun utilisateur sélectionné -
+ ) : ( +
+
+ +
+ Aucun utilisateur sélectionné +
+ ) )}
@@ -567,36 +701,49 @@ export function MissionsAdminPanel() { size="sm" onClick={() => removeUserRole('parole')} className="text-red-600 hover:bg-red-50 border-red-200 h-8" + disabled={loading} > Supprimer )}
- {gardienDeLaParole ? ( -
- {(() => { - const user = mockUsers.find(u => u.id === gardienDeLaParole); - return user ? ( -
-
- {user.firstName[0]}{user.lastName[0]} -
-
-
{user.firstName} {user.lastName}
-
{user.email}
-
-
- ) : "Utilisateur non trouvé"; - })()} + {loading ? ( +
+
+
+
+
+
+
+
) : ( -
-
- + gardienDeLaParole ? ( +
+ {(() => { + const user = users.find(u => u.id === gardienDeLaParole); + return user ? ( +
+
+ {user.firstName?.[0] || ""}{user.lastName?.[0] || ""} +
+
+
{user.firstName} {user.lastName}
+
{user.email}
+
+
+ ) : "Utilisateur non trouvé"; + })()}
- Aucun utilisateur sélectionné -
+ ) : ( +
+
+ +
+ Aucun utilisateur sélectionné +
+ ) )}
@@ -610,36 +757,49 @@ export function MissionsAdminPanel() { size="sm" onClick={() => removeUserRole('memoire')} className="text-red-600 hover:bg-red-50 border-red-200 h-8" + disabled={loading} > Supprimer )}
- {gardienDeLaMemoire ? ( -
- {(() => { - const user = mockUsers.find(u => u.id === gardienDeLaMemoire); - return user ? ( -
-
- {user.firstName[0]}{user.lastName[0]} -
-
-
{user.firstName} {user.lastName}
-
{user.email}
-
-
- ) : "Utilisateur non trouvé"; - })()} + {loading ? ( +
+
+
+
+
+
+
+
) : ( -
-
- + gardienDeLaMemoire ? ( +
+ {(() => { + const user = users.find(u => u.id === gardienDeLaMemoire); + return user ? ( +
+
+ {user.firstName?.[0] || ""}{user.lastName?.[0] || ""} +
+
+
{user.firstName} {user.lastName}
+
{user.email}
+
+
+ ) : "Utilisateur non trouvé"; + })()}
- Aucun utilisateur sélectionné -
+ ) : ( +
+
+ +
+ Aucun utilisateur sélectionné +
+ ) )}
@@ -655,6 +815,7 @@ export function MissionsAdminPanel() { size="sm" onClick={() => setSelectedTab('users')} className={selectedTab === 'users' ? 'bg-blue-600 text-white' : 'text-gray-700'} + disabled={loading} > Utilisateurs @@ -664,6 +825,7 @@ export function MissionsAdminPanel() { size="sm" onClick={() => setSelectedTab('groups')} className={selectedTab === 'groups' ? 'bg-blue-600 text-white' : 'text-gray-700'} + disabled={loading} > Groupes @@ -679,100 +841,121 @@ export function MissionsAdminPanel() { value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} className="pl-9 bg-white text-gray-900 border-gray-300" + disabled={loading} /> -
- {selectedTab === 'users' ? ( - filteredUsers.length > 0 ? ( -
- {filteredUsers.map(user => ( -
-
-
- {user.firstName[0]}{user.lastName[0]} -
-
-
{user.firstName} {user.lastName}
-
{user.email}
-
-
- {isUserAssigned(user.id) ? ( + {loading ? ( +
+
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+
+ ))} +
+
+ ) : ( +
+ {selectedTab === 'users' ? ( + filteredUsers.length > 0 ? ( +
+ {filteredUsers.map(user => ( +
- - {getUserRole(user.id)} - - -
- ) : ( -
- -
- )} -
- ))} -
- ) : ( -
- Aucun utilisateur trouvé -
- ) - ) : ( - filteredGroups.length > 0 ? ( -
- {filteredGroups.map(group => ( -
-
-
- -
-
-
{group.name}
-
{group.membersCount} membres
+
+ {user.firstName?.[0] || ""}{user.lastName?.[0] || ""} +
+
+
{user.firstName} {user.lastName}
+
{user.email}
+
+ {isUserAssigned(user.id) ? ( +
+ + {getUserRole(user.id)} + + +
+ ) : ( +
+ +
+ )}
- -
- ))} -
+ ))} +
+ ) : ( +
+ Aucun utilisateur trouvé +
+ ) ) : ( -
- Aucun groupe trouvé -
- ) - )} -
+ filteredGroups.length > 0 ? ( +
+ {filteredGroups.map(group => ( +
+
+
+ +
+
+
{group.name}
+
{group.membersCount} membres
+
+
+ +
+ ))} +
+ ) : ( +
+ Aucun groupe trouvé +
+ ) + )} +
+ )}