From d2c7bddf180430e3af855b87661481192da9b6a6 Mon Sep 17 00:00:00 2001 From: BenitoBB Date: Mon, 19 May 2025 08:31:49 -0600 Subject: [PATCH] feat: refactor diploma dialogs to improve structure and user experience, including enhanced layout and state management --- .../components/dialogs/crearDiplomaDialog.jsx | 104 +++++++++--------- .../dialogs/vistaPreviaDiplomaDialog.jsx | 72 ++---------- diplomas/src/pages/diplomasVista.jsx | 50 ++++----- 3 files changed, 85 insertions(+), 141 deletions(-) diff --git a/diplomas/src/components/dialogs/crearDiplomaDialog.jsx b/diplomas/src/components/dialogs/crearDiplomaDialog.jsx index 4aebf5c..b9e05df 100644 --- a/diplomas/src/components/dialogs/crearDiplomaDialog.jsx +++ b/diplomas/src/components/dialogs/crearDiplomaDialog.jsx @@ -1,9 +1,10 @@ -import { useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, + DialogDescription, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; @@ -15,7 +16,7 @@ const DISEÑOS = [ { id: 2, nombre: "Diseño Moderno" }, ]; -function CrearDiplomaDialog({ +export default function CrearDiplomaDialog({ open, onOpenChange, alumno, @@ -26,13 +27,13 @@ function CrearDiplomaDialog({ fecha, setFecha, }) { - const [diseñoSeleccionado, setDiseñoSeleccionado] = useState( - DISEÑOS[0]?.id || null - ); + const [diseñoSeleccionado, setDiseñoSeleccionado] = useState(DISEÑOS[0]?.id || null); const toggleCompetencia = (id) => { setCompetenciasAcreditadas((prev) => - prev.includes(id) ? prev.filter((cid) => cid !== id) : [...prev, id] + prev.includes(id) + ? prev.filter((cid) => cid !== id) + : [...prev, id] ); }; @@ -43,64 +44,61 @@ function CrearDiplomaDialog({ .select("competencia(id, descripcion)") .eq("curso_id", alumno.curso.id) .then(({ data }) => { - const comps = data?.map((c) => c.competencia) || []; + const comps = data?.map((c) => c.competencia).filter(Boolean) || []; setCompetencias(comps); setCompetenciasAcreditadas(comps.map((c) => c.id)); // todas seleccionadas por default }); } - }, [alumno]); + }, [alumno, setCompetencias, setCompetenciasAcreditadas]); const handleCrearDiploma = async () => { // Aquí va la lógica para crear el diploma en la base de datos - // 1. Insertar en Diploma - // 2. Insertar en Diploma_Competencia - // 3. (Opcional) Generar PDF y enviar - - // Ejemplo de inserción (ajusta según tu lógica real) - // await supabaseClient.from("Diploma").insert({...}); - // await supabaseClient.from("Diploma_Competencia").insert([...]); - onOpenChange(false); - // Aquí puedes mostrar un mensaje de éxito o iniciar la generación del PDF }; - if (!alumno) return null; + if (!open || !alumno) return null; return ( -
-

Crear Diploma

-
- - {competencias.map((comp) => ( -
- toggleCompetencia(comp.id)} - className="mr-2" - /> - {comp.descripcion} -
- ))} -
-
- - -
-
+ + + + Crear Diploma + + Selecciona las competencias acreditadas para el diploma. + + +
+ + {competencias.map((comp) => ( +
+ toggleCompetencia(comp.id)} + className="mr-2" + /> + {comp.descripcion} +
+ ))} +
+
+ + setFecha(e.target.value)} + /> +
+ + + + +
+
); } - -export default CrearDiplomaDialog; diff --git a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx index 41ff331..82567e6 100644 --- a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx +++ b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx @@ -19,12 +19,14 @@ function VistaPreviaDiplomaDialog({ }) { const [mostrarVistaPrevia, setMostrarVistaPrevia] = useState(false); - if (!alumno) return null; + if (!open || !alumno) return null; - const competenciasMostradas = - Array.isArray(competenciasAcreditadas) && competenciasAcreditadas.length > 0 - ? competencias.filter((comp) => competenciasAcreditadas.includes(comp.id)) - : []; + // Filtra solo las competencias seleccionadas si se pasa el array de acreditadas + const competenciasMostradas = Array.isArray(competenciasAcreditadas) + ? (Array.isArray(competencias) ? competencias : []).filter((comp) => + competenciasAcreditadas.includes(comp.id) + ) + : (Array.isArray(competencias) ? competencias : []); const competenciasParaPDF = Array.isArray(competenciasMostradas) && competenciasMostradas.length > 0 @@ -32,8 +34,8 @@ function VistaPreviaDiplomaDialog({ : []; return ( -
-

Diploma

+
+

Diploma

Alumno: {alumno.nombre}
@@ -51,61 +53,9 @@ function VistaPreviaDiplomaDialog({
Fecha: {fecha || new Date().toLocaleDateString()}
-
- - } - fileName={`Diploma_${alumno.nombre}.pdf`} - > - {({ loading }) => - loading ? ( - - ) : ( - - ) - } - - +
+ Vista previa
- - {/* Vista previa del PDF */} - {mostrarVistaPrevia && ( -
-
-
- - - -
- -
-
- )}
); } diff --git a/diplomas/src/pages/diplomasVista.jsx b/diplomas/src/pages/diplomasVista.jsx index 6f2cd19..fe6af1d 100644 --- a/diplomas/src/pages/diplomasVista.jsx +++ b/diplomas/src/pages/diplomasVista.jsx @@ -4,7 +4,6 @@ import { supabaseClient } from "@/utils/supabase"; import { Button } from "@/components/ui/button"; import CrearDiplomaDialog from "@/components/dialogs/crearDiplomaDialog"; import VistaPreviaDiplomaDialog from "@/components/dialogs/vistaPreviaDiplomaDialog"; -import { Dialog, DialogContent } from "@/components/ui/dialog"; export default function DiplomasVista() { const [alumnos, setAlumnos] = useState([]); @@ -80,33 +79,30 @@ export default function DiplomasVista() {
{/* Dialog para crear diploma y vista previa juntos */} - - -
-
- -
-
- -
+ {mostrarDialog && ( +
+
+ +
- -
+
+ )} ); }