import DashboardLayout from "@/components/DashboardLayout"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { trpc } from "@/lib/trpc"; import { Plus, Pencil, Trash2, ExternalLink, Search, SlidersHorizontal } from "lucide-react"; import { useState, useMemo } from "react"; import { toast } from "sonner"; import { Skeleton } from "@/components/ui/skeleton"; export default function AdminFormations() { const [open, setOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const [filterActif, setFilterActif] = useState("all"); const [formData, setFormData] = useState({ nom: "", description: "", lienUnique: "", actif: true, }); const utils = trpc.useUtils(); const { data: formations, isLoading } = trpc.formations.list.useQuery(); const createMutation = trpc.formations.create.useMutation({ onSuccess: () => { utils.formations.list.invalidate(); toast.success("Formation créée avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la création : " + error.message); }, }); const updateMutation = trpc.formations.update.useMutation({ onSuccess: () => { utils.formations.list.invalidate(); toast.success("Formation mise à jour avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la mise à jour : " + error.message); }, }); const deleteMutation = trpc.formations.delete.useMutation({ onSuccess: () => { utils.formations.list.invalidate(); toast.success("Formation supprimée avec succès"); }, onError: (error) => { toast.error("Erreur lors de la suppression : " + error.message); }, }); const resetForm = () => { setFormData({ nom: "", description: "", lienUnique: "", actif: true }); setEditingId(null); }; const handleEdit = (formation: any) => { setFormData({ nom: formation.nom, description: formation.description || "", lienUnique: formation.lienUnique, actif: formation.actif, }); setEditingId(formation.id); setOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (editingId) { updateMutation.mutate({ id: editingId, ...formData }); } else { createMutation.mutate(formData); } }; const handleDelete = (id: number) => { if (confirm("Êtes-vous sûr de vouloir supprimer cette formation ?")) { deleteMutation.mutate({ id }); } }; const getInscriptionUrl = (lien: string) => { return `${window.location.origin}/inscription/${lien}`; }; // Filtrer les formations const filteredFormations = useMemo(() => { if (!formations) return []; return formations.filter(formation => { // Filtre par recherche const matchesSearch = searchTerm === "" || formation.nom.toLowerCase().includes(searchTerm.toLowerCase()) || (formation.description && formation.description.toLowerCase().includes(searchTerm.toLowerCase())); // Filtre par statut actif const matchesActif = filterActif === "all" || (filterActif === "actif" && formation.actif) || (filterActif === "inactif" && !formation.actif); return matchesSearch && matchesActif; }); }, [formations, searchTerm, filterActif]); return (

Formations

Gérez les formations et leurs liens d'inscription

{ setOpen(isOpen); if (!isOpen) resetForm(); }}>
{editingId ? "Modifier la formation" : "Nouvelle formation"} Créez une formation avec un lien d'inscription unique
setFormData({ ...formData, nom: e.target.value })} placeholder="Manager Itinova" required />