import { useState, useEffect } from "react"; import { useRoute, useLocation } from "wouter"; import { trpc } from "@/lib/trpc"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Plus, Trash2, GripVertical, Save, Eye } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Slider } from "@/components/ui/slider"; import { toast } from "sonner"; import DashboardLayout from "@/components/DashboardLayout"; type QuestionType = "choix_multiple" | "echelle" | "texte_libre" | "oui_non"; interface Question { id?: number; ordre: number; texte: string; typeQuestion: QuestionType; options?: string; echelleMin?: number; echelleMax?: number; echelleLabelMin?: string; echelleLabelMax?: string; obligatoire: boolean; } export default function AdminQuestionnaireEdit() { const [, params] = useRoute("/admin/questionnaires/:id"); const [, navigate] = useLocation(); const questionnaireId = params?.id === "nouveau" ? null : parseInt(params?.id || "0"); const [titre, setTitre] = useState(""); const [type, setType] = useState<"satisfaction" | "evaluation_pre" | "evaluation_post">("satisfaction"); const [description, setDescription] = useState(""); const [actif, setActif] = useState(true); const [envoiAutomatique, setEnvoiAutomatique] = useState(false); const [delaiEnvoiJours, setDelaiEnvoiJours] = useState(1); const [questions, setQuestions] = useState([]); const [showPreview, setShowPreview] = useState(false); const { data: questionnaire } = trpc.questionnaires.getById.useQuery( { id: questionnaireId! }, { enabled: !!questionnaireId } ); const { data: existingQuestions } = trpc.questions.list.useQuery( { questionnaireId: questionnaireId! }, { enabled: !!questionnaireId } ); const createMutation = trpc.questionnaires.create.useMutation({ onSuccess: async (data) => { // Créer les questions for (const question of questions) { await createQuestionMutation.mutateAsync({ questionnaireId: data.id, ...question, }); } toast.success("Questionnaire créé avec succès"); navigate("/admin/questionnaires"); }, onError: (error) => { toast.error("Erreur : " + error.message); }, }); const updateMutation = trpc.questionnaires.update.useMutation({ onSuccess: async () => { // Mettre à jour les questions for (const question of questions) { if (question.id) { await updateQuestionMutation.mutateAsync({ id: question.id, ...question, }); } else { await createQuestionMutation.mutateAsync({ questionnaireId: questionnaireId!, ...question, }); } } toast.success("Questionnaire mis à jour avec succès"); navigate("/admin/questionnaires"); }, onError: (error) => { toast.error("Erreur : " + error.message); }, }); const createQuestionMutation = trpc.questions.create.useMutation(); const updateQuestionMutation = trpc.questions.update.useMutation(); const deleteQuestionMutation = trpc.questions.delete.useMutation(); useEffect(() => { if (questionnaire) { setTitre(questionnaire.titre); setType(questionnaire.type); setDescription(questionnaire.description || ""); setActif(questionnaire.actif); setEnvoiAutomatique(questionnaire.envoiAutomatique); setDelaiEnvoiJours(questionnaire.delaiEnvoiJours); } }, [questionnaire]); useEffect(() => { if (existingQuestions) { setQuestions(existingQuestions.map(q => ({ id: q.id, ordre: q.ordre, texte: q.texte, typeQuestion: q.typeQuestion, options: q.options || undefined, echelleMin: q.echelleMin || undefined, echelleMax: q.echelleMax || undefined, echelleLabelMin: q.echelleLabelMin || undefined, echelleLabelMax: q.echelleLabelMax || undefined, obligatoire: q.obligatoire, }))); } }, [existingQuestions]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!titre.trim()) { toast.error("Le titre du questionnaire est obligatoire"); return; } if (questions.length === 0) { toast.error("Ajoutez au moins une question"); return; } const data = { titre, type, description: description || undefined, actif, envoiAutomatique, delaiEnvoiJours, }; if (questionnaireId) { updateMutation.mutate({ id: questionnaireId, ...data }); } else { createMutation.mutate(data); } }; const addQuestion = () => { setQuestions([ ...questions, { ordre: questions.length + 1, texte: "", typeQuestion: "texte_libre", obligatoire: false, }, ]); }; const updateQuestion = (index: number, field: keyof Question, value: any) => { const newQuestions = [...questions]; newQuestions[index] = { ...newQuestions[index], [field]: value }; setQuestions(newQuestions); }; const removeQuestion = async (index: number) => { const question = questions[index]; if (question.id) { await deleteQuestionMutation.mutateAsync({ id: question.id }); } setQuestions(questions.filter((_, i) => i !== index)); }; const getQuestionTypeLabel = (type: QuestionType) => { const labels = { texte_libre: "Texte libre", choix_multiple: "Choix multiple", echelle: "Échelle", oui_non: "Oui/Non", }; return labels[type]; }; return (

{questionnaireId ? "Modifier le questionnaire" : "Nouveau questionnaire"}

Informations générales
setTitre(e.target.value)} placeholder="Ex: Questionnaire de satisfaction Manager Itinova" required />