Groups ui team ui

This commit is contained in:
alma 2026-01-11 21:53:36 +01:00
parent 95685c3be3
commit fa7711e6a7

View File

@ -160,19 +160,30 @@ export default function EquipePage() {
const response = await fetch(`/api/users/${userId}`, { const response = await fetch(`/api/users/${userId}`, {
method: "PUT", method: "PUT",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
body: JSON.stringify(editData) body: JSON.stringify({
firstName: editData.firstName || "",
lastName: editData.lastName || "",
email: editData.email || ""
})
}); });
if (!response.ok) throw new Error("Failed to update user"); if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.error || "Failed to update user");
}
setUsers(prev => prev.map(u => // Refresh user data
u.id === userId ? { ...u, ...editData } : u await fetchData();
));
toast({ title: "Succès", description: "Utilisateur modifié" }); toast({ title: "Succès", description: "Utilisateur modifié" });
setEditMode(null); setEditMode(null);
} catch (error) { } catch (error) {
toast({ title: "Erreur", description: "Échec de la modification", variant: "destructive" }); console.error("Error updating user:", error);
toast({
title: "Erreur",
description: error instanceof Error ? error.message : "Échec de la modification",
variant: "destructive"
});
} finally { } finally {
setActionLoading(null); setActionLoading(null);
} }
@ -472,70 +483,70 @@ export default function EquipePage() {
{activeTab === "users" && ( {activeTab === "users" && (
<Dialog open={newUserDialogOpen} onOpenChange={setNewUserDialogOpen}> <Dialog open={newUserDialogOpen} onOpenChange={setNewUserDialogOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button size="sm" className="h-9"> <Button size="sm" className="h-9 bg-blue-600 hover:bg-blue-700 text-white">
<Plus className="h-4 w-4 mr-2" /> <Plus className="h-4 w-4 mr-2" />
Ajouter un utilisateur Ajouter un utilisateur
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent className="sm:max-w-[500px]"> <DialogContent className="sm:max-w-[500px] bg-white">
<DialogHeader> <DialogHeader>
<DialogTitle>Nouvel utilisateur</DialogTitle> <DialogTitle>Nouvel utilisateur</DialogTitle>
</DialogHeader> </DialogHeader>
<div className="space-y-4 py-4"> <div className="space-y-4 py-4">
<div> <div>
<Label htmlFor="username">Nom d'utilisateur *</Label> <Label htmlFor="username" className="text-gray-900">Nom d'utilisateur *</Label>
<Input <Input
id="username" id="username"
value={newUserData.username} value={newUserData.username}
onChange={(e) => setNewUserData({ ...newUserData, username: e.target.value })} onChange={(e) => setNewUserData({ ...newUserData, username: e.target.value })}
className="mt-1" className="mt-1 bg-white text-gray-900 border-gray-300"
required required
/> />
</div> </div>
<div> <div>
<Label htmlFor="firstName">Prénom *</Label> <Label htmlFor="firstName" className="text-gray-900">Prénom *</Label>
<Input <Input
id="firstName" id="firstName"
value={newUserData.firstName} value={newUserData.firstName}
onChange={(e) => setNewUserData({ ...newUserData, firstName: e.target.value })} onChange={(e) => setNewUserData({ ...newUserData, firstName: e.target.value })}
className="mt-1" className="mt-1 bg-white text-gray-900 border-gray-300"
required required
/> />
</div> </div>
<div> <div>
<Label htmlFor="lastName">Nom *</Label> <Label htmlFor="lastName" className="text-gray-900">Nom *</Label>
<Input <Input
id="lastName" id="lastName"
value={newUserData.lastName} value={newUserData.lastName}
onChange={(e) => setNewUserData({ ...newUserData, lastName: e.target.value })} onChange={(e) => setNewUserData({ ...newUserData, lastName: e.target.value })}
className="mt-1" className="mt-1 bg-white text-gray-900 border-gray-300"
required required
/> />
</div> </div>
<div> <div>
<Label htmlFor="email">Email *</Label> <Label htmlFor="email" className="text-gray-900">Email *</Label>
<Input <Input
id="email" id="email"
type="email" type="email"
value={newUserData.email} value={newUserData.email}
onChange={(e) => setNewUserData({ ...newUserData, email: e.target.value })} onChange={(e) => setNewUserData({ ...newUserData, email: e.target.value })}
className="mt-1" className="mt-1 bg-white text-gray-900 border-gray-300"
required required
/> />
</div> </div>
<div> <div>
<Label htmlFor="password">Mot de passe *</Label> <Label htmlFor="password" className="text-gray-900">Mot de passe *</Label>
<Input <Input
id="password" id="password"
type="password" type="password"
value={newUserData.password} value={newUserData.password}
onChange={(e) => setNewUserData({ ...newUserData, password: e.target.value })} onChange={(e) => setNewUserData({ ...newUserData, password: e.target.value })}
className="mt-1" className="mt-1 bg-white text-gray-900 border-gray-300"
required required
/> />
</div> </div>
<div> <div>
<Label className="mb-2 block">Rôles</Label> <Label className="mb-2 block text-gray-900">Rôles</Label>
<div className="max-h-40 overflow-y-auto space-y-2 border rounded-md p-3"> <div className="max-h-40 overflow-y-auto space-y-2 border rounded-md p-3">
{roles.map(role => ( {roles.map(role => (
<label <label
@ -830,33 +841,34 @@ export default function EquipePage() {
{editMode.type === "user" && editMode.action === "edit" && ( {editMode.type === "user" && editMode.action === "edit" && (
<div className="space-y-3"> <div className="space-y-3">
<div> <div>
<label className="text-xs font-medium text-gray-600">Prénom</label> <label className="text-xs font-medium text-gray-900 block mb-1">Prénom</label>
<Input <Input
value={editData.firstName} value={editData.firstName || ""}
onChange={(e) => setEditData({ ...editData, firstName: e.target.value })} onChange={(e) => setEditData({ ...editData, firstName: e.target.value })}
className="mt-1 h-9" className="h-9 bg-white text-gray-900 border-gray-300"
/> />
</div> </div>
<div> <div>
<label className="text-xs font-medium text-gray-600">Nom</label> <label className="text-xs font-medium text-gray-900 block mb-1">Nom</label>
<Input <Input
value={editData.lastName} value={editData.lastName || ""}
onChange={(e) => setEditData({ ...editData, lastName: e.target.value })} onChange={(e) => setEditData({ ...editData, lastName: e.target.value })}
className="mt-1 h-9" className="h-9 bg-white text-gray-900 border-gray-300"
/> />
</div> </div>
<div> <div>
<label className="text-xs font-medium text-gray-600">Email</label> <label className="text-xs font-medium text-gray-900 block mb-1">Email</label>
<Input <Input
value={editData.email} type="email"
value={editData.email || ""}
onChange={(e) => setEditData({ ...editData, email: e.target.value })} onChange={(e) => setEditData({ ...editData, email: e.target.value })}
className="mt-1 h-9" className="h-9 bg-white text-gray-900 border-gray-300"
/> />
</div> </div>
<Button <Button
onClick={() => saveUserEdit(editMode.id)} onClick={() => saveUserEdit(editMode.id)}
disabled={actionLoading === editMode.id} disabled={actionLoading === editMode.id}
className="w-full bg-blue-600 hover:bg-blue-700" className="w-full bg-blue-600 hover:bg-blue-700 text-white"
> >
{actionLoading === editMode.id ? ( {actionLoading === editMode.id ? (
<Loader2 className="h-4 w-4 animate-spin mr-2" /> <Loader2 className="h-4 w-4 animate-spin mr-2" />