From c0f1f6c7de5f05d93f52ca11a337c21ae1d8a104 Mon Sep 17 00:00:00 2001 From: alma Date: Mon, 5 May 2025 11:00:26 +0200 Subject: [PATCH] missions --- components/missions/missions-admin-panel.tsx | 236 +++++++++++++++---- 1 file changed, 195 insertions(+), 41 deletions(-) diff --git a/components/missions/missions-admin-panel.tsx b/components/missions/missions-admin-panel.tsx index 572068e6..ffae5870 100644 --- a/components/missions/missions-admin-panel.tsx +++ b/components/missions/missions-admin-panel.tsx @@ -17,8 +17,14 @@ import { CardContent } from "../ui/card"; import { Badge } from "../ui/badge"; -import { X, Search, UserPlus, Users } from "lucide-react"; +import { X, Search, UserPlus, Users, PlusCircle, AlertCircle, Check } from "lucide-react"; import { toast } from "../ui/use-toast"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger +} from "../ui/dropdown-menu"; // Define interfaces for user and group data interface User { @@ -38,6 +44,10 @@ interface Group { membersCount: number; } +// User role types in mission +type GuardienRole = 'temps' | 'parole' | 'memoire'; +type UserRole = GuardienRole | 'volontaire'; + export function MissionsAdminPanel() { const [selectedServices, setSelectedServices] = useState([]); const [selectedProfils, setSelectedProfils] = useState([]); @@ -46,11 +56,15 @@ export function MissionsAdminPanel() { const [gardienDuTemps, setGardienDuTemps] = useState(null); const [gardienDeLaParole, setGardienDeLaParole] = useState(null); const [gardienDeLaMemoire, setGardienDeLaMemoire] = useState(null); + const [volontaires, setVolontaires] = useState([]); // State for storing fetched data const [users, setUsers] = useState([]); const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); + + // Check if mission is valid (has all required guardiens) + const isMissionValid = gardienDuTemps !== null && gardienDeLaParole !== null && gardienDeLaMemoire !== null; // Fetch users and groups on component mount useEffect(() => { @@ -140,23 +154,40 @@ export function MissionsAdminPanel() { (group.name?.toLowerCase() || "").includes(searchTerm.toLowerCase()) ); - // Function to check if a user is already assigned for a role + // Function to check if a user is already assigned to any role const isUserAssigned = (userId: string) => { return gardienDuTemps === userId || gardienDeLaParole === userId || - gardienDeLaMemoire === userId; + gardienDeLaMemoire === userId || + volontaires.includes(userId); }; - // Function to get role name by user id - const getUserRole = (userId: string) => { - if (gardienDuTemps === userId) return "Gardien du Temps"; - if (gardienDeLaParole === userId) return "Gardien de la Parole"; - if (gardienDeLaMemoire === userId) return "Gardien de la Mémoire"; + // Function to get user's role + const getUserRole = (userId: string): UserRole | null => { + if (gardienDuTemps === userId) return 'temps'; + if (gardienDeLaParole === userId) return 'parole'; + if (gardienDeLaMemoire === userId) return 'memoire'; + if (volontaires.includes(userId)) return 'volontaire'; return null; }; - // Function to assign a user to a role - const assignUserRole = (userId: string, role: 'temps' | 'parole' | 'memoire') => { + // Function to get role display name + const getRoleDisplayName = (role: UserRole | null): string => { + switch(role) { + case 'temps': return "Gardien du Temps"; + case 'parole': return "Gardien de la Parole"; + case 'memoire': return "Gardien de la Mémoire"; + case 'volontaire': return "Volontaire"; + default: return ""; + } + }; + + // Function to assign a user to a specific guardian role + const assignGuardienRole = (userId: string, role: GuardienRole) => { + // Remove from any existing role first + removeUserFromAllRoles(userId); + + // Assign to new role if (role === 'temps') { setGardienDuTemps(userId); } else if (role === 'parole') { @@ -164,18 +195,41 @@ export function MissionsAdminPanel() { } else if (role === 'memoire') { setGardienDeLaMemoire(userId); } + + toast({ + title: "Rôle assigné", + description: `L'utilisateur a été assigné comme ${getRoleDisplayName(role)}`, + }); }; - // Function to remove a user from a role - const removeUserRole = (role: 'temps' | 'parole' | 'memoire') => { - if (role === 'temps') { - setGardienDuTemps(null); - } else if (role === 'parole') { - setGardienDeLaParole(null); - } else if (role === 'memoire') { - setGardienDeLaMemoire(null); + // Function to assign a user as volunteer + const assignVolontaire = (userId: string) => { + // Remove from any existing role first + removeUserFromAllRoles(userId); + + // Add to volunteers + setVolontaires(prev => [...prev, userId]); + + toast({ + title: "Rôle assigné", + description: "L'utilisateur a été assigné comme Volontaire", + }); + }; + + // Function to remove a user from all roles + const removeUserFromAllRoles = (userId: string) => { + if (gardienDuTemps === userId) setGardienDuTemps(null); + if (gardienDeLaParole === userId) setGardienDeLaParole(null); + if (gardienDeLaMemoire === userId) setGardienDeLaMemoire(null); + if (volontaires.includes(userId)) { + setVolontaires(prev => prev.filter(id => id !== userId)); } }; + + // Check if all guardian roles are filled + const areAllGuardiensFilled = (): boolean => { + return gardienDuTemps !== null && gardienDeLaParole !== null && gardienDeLaMemoire !== null; + }; // Function to fetch group members const fetchGroupMembers = async (groupId: string) => { @@ -632,7 +686,24 @@ export function MissionsAdminPanel() {
-

Les Gardiens de l'Intention

+
+

Les Gardiens de l'Intention

+ +
+ {!isMissionValid && ( +
+ + Les 3 gardiens doivent être assignés +
+ )} + {isMissionValid && ( +
+ + Tous les gardiens sont assignés +
+ )} +
+
{/* Gardien du Temps */} @@ -643,7 +714,7 @@ export function MissionsAdminPanel() {
+
+
Volontaires ({volontaires.length})
+ {volontaires.length > 0 ? ( +
+ {volontaires.map(userId => { + const user = users.find(u => u.id === userId); + if (!user) return null; + return ( + + {user.firstName} {user.lastName} + + + ); + })} +
+ ) : ( +
Aucun volontaire assigné
+ )} +
+
{user.email}
+ + {/* User role controls */} {isUserAssigned(user.id) ? (
- - {getUserRole(user.id)} + + {getRoleDisplayName(getUserRole(user.id))}
) : ( -
+
+ + + + + + assignGuardienRole(user.id, 'temps')} + disabled={gardienDuTemps !== null} + className={`cursor-pointer ${gardienDuTemps !== null ? 'opacity-50 cursor-not-allowed' : ''}`} + > + Gardien du Temps + + assignGuardienRole(user.id, 'parole')} + disabled={gardienDeLaParole !== null} + className={`cursor-pointer ${gardienDeLaParole !== null ? 'opacity-50 cursor-not-allowed' : ''}`} + > + Gardien de la Parole + + assignGuardienRole(user.id, 'memoire')} + disabled={gardienDeLaMemoire !== null} + className={`cursor-pointer ${gardienDeLaMemoire !== null ? 'opacity-50 cursor-not-allowed' : ''}`} + > + Gardien de la Mémoire + + + +
)} @@ -967,8 +1102,27 @@ export function MissionsAdminPanel() {
-