diff --git a/diplomas/src/pages/cursosArchivo.jsx b/diplomas/src/pages/cursosArchivo.jsx index 70fc244..409eaaf 100644 --- a/diplomas/src/pages/cursosArchivo.jsx +++ b/diplomas/src/pages/cursosArchivo.jsx @@ -3,21 +3,45 @@ import Papa from "papaparse"; import * as XLSX from "xlsx"; import Layout from "@/components/layout/Layout"; import { Button } from "@/components/ui/button"; -import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; +import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog"; +import { useRouter } from "next/router"; export default function cursosArchivo() { const [archivo, setArchivo] = useState(null); const [datos, setDatos] = useState([]); const [dialogoAbierto, setDialogoAbierto] = useState(false); const [mensajeDialogo, setMensajeDialogo] = useState(""); + const [dialogoCargando, setDialogoCargando] = useState(false); + const [dialogoAdvertencia, setDialogoAdvertencia] = useState(false); + const [rutaPendiente, setRutaPendiente] = useState(null); + const router = useRouter(); useEffect(() => { if (archivo) extraerContenido(); }, [archivo]); + useEffect(() => { + const handleRouteChange = (url) => { + if (archivo && datos.length > 0) { + setDialogoAdvertencia(true); + setRutaPendiente(url); + // Cancelar navegación + throw "Bloqueo de navegación por archivo pendiente"; + } + }; + + router.events.on("routeChangeStart", handleRouteChange); + + return () => { + router.events.off("routeChangeStart", handleRouteChange); + }; + }, [archivo, datos, router]); + const registrarCursos = async () => { if (datos.length === 0) return; + setDialogoCargando(true); // Mostrar dialogo de carga + const errores = []; for (const curso of datos) { @@ -40,6 +64,8 @@ export default function cursosArchivo() { } } + setDialogoCargando(false); // Ocultar dialogo de carga + if (errores.length > 0) { setMensajeDialogo(`Se registraron algunos errores:\n${JSON.stringify(errores, null, 2)}`); } else { @@ -173,6 +199,47 @@ export default function cursosArchivo() { + + + + ); } \ No newline at end of file diff --git a/diplomas/src/pages/cursosManual.jsx b/diplomas/src/pages/cursosManual.jsx index 59b67e9..45b3524 100644 --- a/diplomas/src/pages/cursosManual.jsx +++ b/diplomas/src/pages/cursosManual.jsx @@ -7,11 +7,21 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { supabaseClient } from "@/utils/supabase"; // Importar el cliente de Supabase +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@/components/ui/dialog"; export default function CursosManual() { const [addCompetencia, setAddCompetencia] = useState(false); const [competenciasGuardadas, setCompetenciasGuardadas] = useState([]); const [loading, setLoading] = useState(false); + const [mostrarDialog, setMostrarDialog] = useState(false); + const [mensajeDialog, setMensajeDialog] = useState(""); const form = useForm({ resolver: zodResolver(cursosSchema), @@ -79,7 +89,8 @@ export default function CursosManual() { console.error("Error al guardar en Supabase:", error.message); alert("Error al guardar el curso: " + error.message); } else { - alert("Curso guardado exitosamente"); + setMensajeDialog("Curso guardado exitosamente"); + setMostrarDialog(true); form.reset(); // Reiniciar el formulario setCompetenciasGuardadas([]); // Limpiar competencias guardadas } @@ -107,6 +118,11 @@ export function CursosManualForm({ nombreSugerido = "" }) { const [addCompetencia, setAddCompetencia] = useState(false); const [competenciasGuardadas, setCompetenciasGuardadas] = useState([]); // [{id, descripcion}] const [loading, setLoading] = useState(false); + const [mostrarDialog, setMostrarDialog] = useState(false); + const [mensajeDialog, setMensajeDialog] = useState(""); + + // Estado para dialog de competencia agregada + const [mostrarDialogCompetencia, setMostrarDialogCompetencia] = useState(false); const form = useForm({ resolver: zodResolver(cursosSchema), @@ -126,14 +142,14 @@ export function CursosManualForm({ nombreSugerido = "" }) { formState: { errors }, } = form; - // Cambia para insertar la competencia en la tabla competencia + // Cambia handleSaveCompetencia para mostrar el dialog const handleSaveCompetencia = async (e) => { e.preventDefault(); const nuevaCompetencia = getValues("nuevaCompetencia").trim(); if (!nuevaCompetencia) return; // Verifica si ya existe en el estado - if (competenciasGuardadas.some(c => c.descripcion === nuevaCompetencia)) { + if (competenciasGuardadas.some((c) => c.descripcion === nuevaCompetencia)) { alert("La competencia ya fue agregada."); return; } @@ -167,6 +183,7 @@ export function CursosManualForm({ nombreSugerido = "" }) { ]); setAddCompetencia(false); setValue("nuevaCompetencia", ""); + setMostrarDialogCompetencia(true); // Mostrar dialog de éxito } catch (err) { alert("Error al guardar la competencia: " + (err.message || err)); } @@ -194,7 +211,8 @@ export function CursosManualForm({ nombreSugerido = "" }) { .single(); if (errorCurso) { - alert("Error al guardar el curso: " + errorCurso.message); + setMensajeDialog("Error al guardar el curso: " + errorCurso.message); + setMostrarDialog(true); setLoading(false); return; } @@ -211,13 +229,15 @@ export function CursosManualForm({ nombreSugerido = "" }) { .from("curso_competencia") .insert(relaciones); if (errorPivote) { - alert("Error al asociar competencias: " + errorPivote.message); + setMensajeDialog("Error al asociar competencias: " + errorPivote.message); + setMostrarDialog(true); setLoading(false); return; } } - alert("Curso guardado exitosamente"); + setMensajeDialog("Curso guardado exitosamente"); + setMostrarDialog(true); form.reset(); setCompetenciasGuardadas([]); } catch (err) { @@ -259,6 +279,9 @@ export function CursosManualForm({ nombreSugerido = "" }) { )}
+ Puedes agregar competencias nuevas sin necesidad de crear un nuevo curso. Las competencias se guardarán y podrás asociarlas a otros cursos después. +
{competenciasGuardadas.length > 0 && (