Checkpoint: Centralisation de la création des formateurs

## Modifications effectuées :

### Page Formateurs (Configuration > Formateurs)
- Suppression du bouton "Ajouter un formateur"
- Suppression du dialogue de création et des mutations associées
- Ajout d'un message informatif indiquant que la création se fait via Configuration > Utilisateurs
- La page conserve les fonctionnalités de modification et suppression des formateurs existants

### Logique de création
- Les formateurs doivent maintenant être créés uniquement via Configuration > Utilisateurs
- Lors de la création d'un utilisateur avec le rôle "Formateur", celui-ci apparaît automatiquement dans la page Formateurs
- Cette centralisation évite les doublons et simplifie le workflow de gestion

La page Formateurs devient une page de consultation et de gestion (modification email, suppression) plutôt qu'une page de création.
This commit is contained in:
Manus
2026-01-07 11:13:59 -05:00
parent f423eb003b
commit 5367c7ea7a
2 changed files with 22 additions and 81 deletions

View File

@@ -33,10 +33,10 @@ import {
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { toast } from "sonner";
import { Plus, Pencil, Trash2, Mail, User, AlertCircle, CheckCircle2 } from "lucide-react";
import { Pencil, Trash2, Mail, User, AlertCircle, CheckCircle2 } from "lucide-react";
export default function AdminFormateurs() {
const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
const [selectedFormateur, setSelectedFormateur] = useState<{
@@ -50,17 +50,7 @@ export default function AdminFormateurs() {
});
const { data: formateurs, isLoading, refetch } = trpc.formateurs.list.useQuery();
const createMutation = trpc.formateurs.create.useMutation({
onSuccess: () => {
toast.success("Formateur créé avec succès");
setIsCreateDialogOpen(false);
setFormData({ nom: "", email: "" });
refetch();
},
onError: (error) => {
toast.error(`Erreur: ${error.message}`);
},
});
const updateMutation = trpc.formateurs.update.useMutation({
onSuccess: () => {
toast.success("Formateur mis à jour avec succès");
@@ -84,16 +74,7 @@ export default function AdminFormateurs() {
},
});
const handleCreate = () => {
if (!formData.nom.trim()) {
toast.error("Le nom est obligatoire");
return;
}
createMutation.mutate({
nom: formData.nom.trim(),
email: formData.email.trim() || undefined,
});
};
const handleEdit = () => {
if (!selectedFormateur) return;
@@ -133,20 +114,18 @@ export default function AdminFormateurs() {
return (
<DashboardLayout>
<div className="space-y-6">
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-bold">Gestion des Formateurs</h1>
<p className="text-muted-foreground">
Gérez les formateurs et leurs adresses email pour les notifications
</p>
</div>
<Button onClick={() => {
setFormData({ nom: "", email: "" });
setIsCreateDialogOpen(true);
}}>
<Plus className="h-4 w-4 mr-2" />
Ajouter un formateur
</Button>
<div>
<h1 className="text-2xl font-bold">Gestion des Formateurs</h1>
<p className="text-muted-foreground">
Gérez les formateurs et leurs adresses email pour les notifications
</p>
<Card className="mt-4 border-blue-200 bg-blue-50">
<CardContent className="pt-4">
<p className="text-sm text-blue-700">
<strong>Note :</strong> Pour créer un nouveau formateur, rendez-vous dans <strong>Configuration &gt; Utilisateurs</strong> et créez un compte avec le rôle "Formateur". Les formateurs créés apparaîtront automatiquement ici.
</p>
</CardContent>
</Card>
</div>
{/* Alerte si des formateurs n'ont pas d'email */}
@@ -304,50 +283,7 @@ export default function AdminFormateurs() {
</CardContent>
</Card>
{/* Dialog de création */}
<Dialog open={isCreateDialogOpen} onOpenChange={setIsCreateDialogOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>Ajouter un formateur</DialogTitle>
<DialogDescription>
Renseignez les informations du nouveau formateur. L'email est optionnel mais
nécessaire pour recevoir les notifications.
</DialogDescription>
</DialogHeader>
<div className="space-y-4 py-4">
<div className="space-y-2">
<Label htmlFor="nom">Nom complet *</Label>
<Input
id="nom"
value={formData.nom}
onChange={(e) => setFormData({ ...formData, nom: e.target.value })}
placeholder="Jean Dupont"
/>
</div>
<div className="space-y-2">
<Label htmlFor="email">Adresse email</Label>
<Input
id="email"
type="email"
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
placeholder="jean.dupont@exemple.fr"
/>
<p className="text-sm text-muted-foreground">
L'email permet de recevoir les notifications d'inscription et d'annulation.
</p>
</div>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => setIsCreateDialogOpen(false)}>
Annuler
</Button>
<Button onClick={handleCreate} disabled={createMutation.isPending}>
{createMutation.isPending ? "Création..." : "Créer"}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
{/* Dialog de modification */}
<Dialog open={isEditDialogOpen} onOpenChange={setIsEditDialogOpen}>