From bc3c406fd0c7539b1b4efa3bc4fd911f0376dcc5 Mon Sep 17 00:00:00 2001 From: SirRobert-1 Date: Mon, 26 May 2025 08:53:51 -0600 Subject: [PATCH] fix: update import path for CursosManualForm component --- diplomas/src/components/cursosManualForm.jsx | 290 +++++++++++++++++++ diplomas/src/pages/alumnosArchivo.jsx | 2 +- 2 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 diplomas/src/components/cursosManualForm.jsx diff --git a/diplomas/src/components/cursosManualForm.jsx b/diplomas/src/components/cursosManualForm.jsx new file mode 100644 index 0000000..14719c1 --- /dev/null +++ b/diplomas/src/components/cursosManualForm.jsx @@ -0,0 +1,290 @@ +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { cursosSchema } from "@/schemas/CursosSchema"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { supabaseClient } from "@/utils/supabase"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@/components/ui/dialog"; + +export function CursosManualForm({ nombreSugerido = "" }) { + const [addCompetencia, setAddCompetencia] = useState(false); + const [competenciasGuardadas, setCompetenciasGuardadas] = useState([]); + const [loading, setLoading] = useState(false); + const [mostrarDialog, setMostrarDialog] = useState(false); + const [mensajeDialog, setMensajeDialog] = useState(""); + const [mostrarDialogCompetencia, setMostrarDialogCompetencia] = useState(false); + + const form = useForm({ + resolver: zodResolver(cursosSchema), + defaultValues: { + nombre: nombreSugerido, + descripcion: "", + horas: 0, + nuevaCompetencia: "", + }, + }); + + const { + register, + handleSubmit, + setValue, + getValues, + formState: { errors }, + } = form; + + const handleSaveCompetencia = async (e) => { + e.preventDefault(); + const nuevaCompetencia = getValues("nuevaCompetencia").trim(); + if (!nuevaCompetencia) return; + + if (competenciasGuardadas.some((c) => c.descripcion === nuevaCompetencia)) { + alert("La competencia ya fue agregada."); + return; + } + + let competenciaId = null; + try { + const { data: existente } = await supabaseClient + .from("competencia") + .select("id") + .eq("descripcion", nuevaCompetencia) + .maybeSingle(); + + if (existente && existente.id) { + competenciaId = existente.id; + } else { + const { data: insertada, error } = await supabaseClient + .from("competencia") + .insert([{ descripcion: nuevaCompetencia }]) + .select("id") + .single(); + if (error) throw error; + competenciaId = insertada.id; + } + + setCompetenciasGuardadas([ + ...competenciasGuardadas, + { id: competenciaId, descripcion: nuevaCompetencia }, + ]); + setAddCompetencia(false); + setValue("nuevaCompetencia", ""); + setMostrarDialogCompetencia(true); + } catch (err) { + alert("Error al guardar la competencia: " + (err.message || err)); + } + }; + + const handleDeleteCompetencia = (index) => { + setCompetenciasGuardadas( + competenciasGuardadas.filter((_, i) => i !== index) + ); + }; + + const onSubmit = async (data) => { + const { nombre, descripcion } = data; + const horas = parseInt(data.horas, 10); + + setLoading(true); + + try { + const { data: cursoInsertado, error: errorCurso } = await supabaseClient + .from("curso") + .insert([{ nombre, descripcion, horas }]) + .select("id") + .single(); + + if (errorCurso) { + setMensajeDialog("Error al guardar el curso: " + errorCurso.message); + setMostrarDialog(true); + setLoading(false); + return; + } + + const cursoId = cursoInsertado.id; + const relaciones = competenciasGuardadas.map((c) => ({ + curso_id: cursoId, + competencia_id: c.id, + })); + + if (relaciones.length > 0) { + const { error: errorPivote } = await supabaseClient + .from("curso_competencia") + .insert(relaciones); + if (errorPivote) { + setMensajeDialog( + "Error al asociar competencias: " + errorPivote.message + ); + setMostrarDialog(true); + setLoading(false); + return; + } + } + + setMensajeDialog("Curso guardado exitosamente"); + setMostrarDialog(true); + form.reset(); + setCompetenciasGuardadas([]); + } catch (err) { + alert("Ocurrió un error inesperado"); + } finally { + setLoading(false); + } + }; + + return ( +
+ + {errors.nombre && ( +

{errors.nombre.message}

+ )} + +