diff --git a/diplomas/src/pages/cursosVista.jsx b/diplomas/src/pages/cursosVista.jsx index 47db636..7025191 100644 --- a/diplomas/src/pages/cursosVista.jsx +++ b/diplomas/src/pages/cursosVista.jsx @@ -21,13 +21,19 @@ export default function CursosVista() { const [competenciasGuardadas, setCompetenciasGuardadas] = useState([]); const [mostrarModal, setMostrarModal] = useState(false); const [modalMensaje, setModalMensaje] = useState(""); + const [todasCompetencias, setTodasCompetencias] = useState([]); - // Estado para confirmación de eliminación + // Para eliminar curso const [confirmarEliminar, setConfirmarEliminar] = useState(false); const [cursoAEliminar, setCursoAEliminar] = useState(null); + // Para eliminar competencia + const [dialogQuitarComp, setDialogQuitarComp] = useState(false); + const [compAEliminar, setCompAEliminar] = useState(null); + useEffect(() => { cargarCursos(); + cargarTodasCompetencias(); }, []); const cargarCursos = async () => { @@ -41,7 +47,7 @@ export default function CursosVista() { curso_competencia ( competencia ( id, - nombre + descripcion ) ) `) @@ -49,7 +55,6 @@ export default function CursosVista() { if (error) { console.error("Error al cargar cursos:", error.message); } else { - // Transformar los datos para que las competencias estén directamente en el objeto curso const cursosConCompetencias = data.map((curso) => ({ ...curso, competencias: curso.curso_competencia.map((cc) => cc.competencia), @@ -58,6 +63,14 @@ export default function CursosVista() { } }; + const cargarTodasCompetencias = async () => { + const { data, error } = await supabaseClient + .from("competencia") + .select("id, descripcion") + .order("id", { ascending: true }); + if (!error) setTodasCompetencias(data); + }; + const iniciarEdicion = (curso) => { setCursoEditando(curso.id); setNuevoNombre(curso.nombre); @@ -74,19 +87,47 @@ export default function CursosVista() { setCompetenciasGuardadas([]); }; + // Guardar cambios en curso y competencias const guardarEdicion = async (id) => { - const { error } = await supabaseClient + // Validar que no haya competencias repetidas + const ids = competenciasGuardadas.map(c => c?.id).filter(Boolean); + const setIds = new Set(ids); + if (ids.length !== setIds.size) { + setModalMensaje("No puedes repetir competencias en un curso."); + setMostrarModal(true); + return; + } + // Actualiza datos del curso + const { error: errorCurso } = await supabaseClient .from("curso") .update({ nombre: nuevoNombre, descripcion: nuevaDescripcion, horas: nuevaHoras, - //competencias: competenciasGuardadas, }) .eq("id", id); - if (error) { - console.error("Error actualizando curso:", error.message); + // Actualiza competencias (tabla pivote) + // 1. Elimina todas las competencias actuales del curso + await supabaseClient + .from("curso_competencia") + .delete() + .eq("curso_id", id); + + // 2. Inserta las nuevas competencias seleccionadas + const competenciasAInsertar = competenciasGuardadas + .filter(c => c && c.id) + .map(c => ({ + curso_id: id, + competencia_id: c.id, + })); + if (competenciasAInsertar.length > 0) { + await supabaseClient + .from("curso_competencia") + .insert(competenciasAInsertar); + } + + if (errorCurso) { setModalMensaje("Error al actualizar el curso"); } else { setModalMensaje("Curso actualizado exitosamente"); @@ -107,7 +148,6 @@ export default function CursosVista() { .delete() .eq("id", cursoAEliminar); if (error) { - console.error("Error eliminando curso:", error.message); setModalMensaje("Error al eliminar el curso"); } else { setModalMensaje("Curso eliminado exitosamente"); @@ -117,6 +157,18 @@ export default function CursosVista() { setMostrarModal(true); }; + // Dialog para quitar competencia + const pedirConfirmacionQuitarComp = (idx) => { + setCompAEliminar(idx); + setDialogQuitarComp(true); + }; + + const quitarCompetencia = () => { + setCompetenciasGuardadas(competenciasGuardadas.filter((_, i) => i !== compAEliminar)); + setDialogQuitarComp(false); + setCompAEliminar(null); + }; + return (
@@ -157,14 +209,53 @@ export default function CursosVista() { /> - - setCompetenciasGuardadas(e.target.value.split(", ")) - } - placeholder="Competencias (separadas por comas)" - /> +
+ {competenciasGuardadas.map((comp, idx) => ( +
+ + +
+ ))} + +
- {/* Modal de confirmación */} + {/* Dialog para eliminar curso */} @@ -241,6 +339,34 @@ export default function CursosVista() { + {/* Dialog para eliminar competencia */} + + + + + Quitar competencia + + + ¿Estás seguro de que deseas quitar esta competencia del curso? + + + + + + + + + {/* Modal de resultado */} @@ -257,4 +383,4 @@ export default function CursosVista() {
); -} +} \ No newline at end of file