Groups ui team ui
This commit is contained in:
parent
95685c3be3
commit
fa7711e6a7
@ -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" />
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user