document.addEventListener("DOMContentLoaded", function () {
// Manejo del formulario de login
const loginForm = document.getElementById("loginForm");
if (loginForm) {
loginForm.addEventListener("submit", handleLogin);
}
// Configuración inicial del dashboard
if (document.body.classList.contains("admin")) {
initializeDashboard();
}
});
// Función para manejar el login
function handleLogin(e) {
e.preventDefault();
const formData = new FormData(this);
fetch(this.action, {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((data) => {
if (data.success) {
window.location.href = data.redirect;
} else {
alert(data.message);
}
})
.catch((error) => console.error("Error:", error));
}
// Inicialización del dashboard
function initializeDashboard() {
setupSidebarNavigation();
loadInitialData();
const activeSection = document.querySelector(".sidebar-menu li.active");
if (activeSection) {
const sectionId = activeSection.getAttribute("data-section");
showSection(sectionId, true);
}
}
// Configuración del menú lateral
function setupSidebarNavigation() {
document.querySelectorAll(".sidebar-menu li").forEach((item) => {
if (item.getAttribute("data-section")) {
item.addEventListener("click", function () {
const section = this.getAttribute("data-section");
showSection(section);
});
}
});
}
// Carga de datos iniciales
function loadInitialData() {
const profesorId = getProfesorId();
if (!profesorId) {
console.error("No se pudo obtener el ID del profesor");
return;
}
fetch(`api/cursos.php?profesor_id=${profesorId}`)
.then((response) => response.json())
.then((courses) => {
// Cargar estudiantes y diplomas
Promise.all([
fetch(`api/alumnos.php?profesor_id=${profesorId}`).then((res) =>
res.json()
),
fetch(`api/diplomas.php?profesor_id=${profesorId}`).then((res) =>
res.json()
),
]).then(([students, diplomas]) => {
updateProfessorStats(courses, students, diplomas);
});
})
.catch((error) => console.error("Error:", error));
}
// Actualización de estadísticas
function updateProfessorStats(courses, students, diplomas) {
document.getElementById("active-courses-count").textContent = courses.length;
document.getElementById("students-count").textContent = students.length;
document.getElementById("diplomas-count").textContent = diplomas.length || 0;
}
// Obtención del ID del profesor
function getProfesorId() {
try {
// 1. Verificar en el elemento del DOM (primera opción)
const profesorElement = document.getElementById("current-profesor");
if (profesorElement && profesorElement.dataset.id) {
return profesorElement.dataset.id;
}
// 2. Verificar en sessionStorage/localStorage
const storedUser =
sessionStorage.getItem("currentUser") ||
localStorage.getItem("currentUser");
if (storedUser) {
const user = JSON.parse(storedUser);
if (user && user.profesor_id) {
return user.profesor_id;
}
}
console.log(
"No se encontró el ID del profesor en el DOM o en el almacenamiento"
);
return null;
} catch (error) {
console.error("Error en getProfesorId:", error);
return null;
}
}
function showModal(title, content, buttons = []) {
// Remover modal existente si hay
const existing = document.getElementById("modal-overlay");
if (existing) existing.remove();
const modalOverlay = document.createElement("div");
modalOverlay.className = "modal-overlay";
modalOverlay.id = "modal-overlay";
const modal = document.createElement("div");
modal.className = "modal";
modal.innerHTML = `
${content}
`;
modalOverlay.appendChild(modal);
document.body.appendChild(modalOverlay);
document.body.style.overflow = "hidden";
// Cerrar con el botón de la esquina
document.getElementById("modal-close-btn").addEventListener("click", closeModal);
// Agregar botones y handlers
const footer = document.getElementById("modal-footer");
buttons.forEach((btn) => {
const button = document.createElement("button");
button.className = "btn " + btn.class;
button.innerText = btn.text;
button.addEventListener("click", () => {
if (typeof btn.handler === "function") {
btn.handler();
} else if (typeof btn.handler === "string") {
if (btn.handler.endsWith(")")) {
eval(btn.handler); // deleteStudent(5)
} else if (typeof window[btn.handler] === "function") {
window[btn.handler](); // closeModal
}
}
});
footer.appendChild(button);
});
}
window.showFullDescription = function (descripcion) {
showModal("Descripción del Curso", `${descripcion}
`);
};
window.closeModal = function () {
const modal = document.getElementById("modal-overlay");
if (modal) {
modal.remove();
document.body.style.overflow = "";
}
};
function showToast(type, message) {
const toast = document.createElement("div");
toast.className = `toast toast-${type}`;
toast.textContent = message;
document.body.appendChild(toast);
setTimeout(() => {
toast.classList.add("fade-out");
setTimeout(() => toast.remove(), 300);
}, 3000);
}
// Manejo de secciones
function showSection(sectionId, isInitialLoad = false) {
updateActiveMenu(sectionId);
const sectionElement = document.getElementById(`${sectionId}-content`);
if (!sectionElement) return;
document.querySelectorAll(".content-section").forEach((s) => {
s.classList.remove("active");
});
sectionElement.classList.add("active");
// Cargar siempre los datos del dashboard al acceder
if (sectionId === "dashboard") {
loadInitialData();
} else {
loadDynamicContent(sectionId, sectionElement);
}
}
function updateActiveMenu(sectionId) {
document.querySelectorAll(".sidebar-menu li").forEach((li) => {
li.classList.remove("active");
});
const activeItem = document.querySelector(
`.sidebar-menu li[data-section="${sectionId}"]`
);
if (activeItem) activeItem.classList.add("active");
}
// Carga de contenido dinámico
function loadDynamicContent(sectionId, container) {
container.innerHTML = 'Cargando...
';
switch (sectionId) {
case "dashboard":
loadDashboardContent(container);
break;
case "courses":
loadProfessorCourses(container);
break;
case "students":
loadStudentsManagement(container);
break;
case "diplomas":
loadDiplomasSection(container);
break;
default:
container.innerHTML =
'
Sección no implementada ';
}
}
// Carga del dashboard
async function loadDashboardContent(container, forceReload = false) {
try {
// Mostrar loader
container.innerHTML = 'Cargando datos...
';
// Obtener siempre los datos frescos del servidor
const profesorId = getProfesorId();
if (!profesorId) {
throw new Error("Debes iniciar sesión nuevamente");
}
// Usar caché solo si no es un forceReload
const cacheKey = `dashboardData-${profesorId}`;
if (!forceReload && sessionStorage.getItem(cacheKey)) {
const cachedData = JSON.parse(sessionStorage.getItem(cacheKey));
renderDashboard(container, cachedData);
return;
}
// Obtener datos frescos
const [coursesRes, studentsRes, diplomasRes] = await Promise.all([
fetch(`api/cursos.php?profesor_id=${profesorId}&t=${Date.now()}`),
fetch(`api/alumnos.php?t=${Date.now()}`),
fetch(`api/diplomas.php?profesor_id=${profesorId}&t=${Date.now()}`),
]);
const [coursesData, studentsData, diplomasData] = await Promise.all([
coursesRes.json(),
studentsRes.json(),
diplomasRes.json(),
]);
if (
!coursesData.success ||
!studentsData.success ||
!diplomasData.success
) {
throw new Error("Error en los datos recibidos");
}
const dashboardData = {
cursos: coursesData.data,
alumnos: studentsData.data,
diplomas: diplomasData.data,
lastUpdated: new Date().toLocaleTimeString(),
};
// Guardar en caché y renderizar
sessionStorage.setItem(cacheKey, JSON.stringify(dashboardData));
renderDashboard(container, dashboardData);
} catch (error) {
console.error("Error:", error);
container.innerHTML = `
Error al cargar datos
${error.message}
Reintentar
`;
}
}
function renderDashboard(container, data) {
const activeCourses = data.cursos.filter((c) => c.estado === "activo");
const totalStudents = data.alumnos.length;
const totalDiplomas = data.diplomas.length;
container.innerHTML = `
Resumen:
• ${
activeCourses.length
} cursos activos
• ${totalStudents} alumnos registrados
• ${totalDiplomas} diplomas emitidos
Mis Cursos Activos
${renderCoursesPreview(activeCourses)}
`;
}
// Gestión de cursos
function loadProfessorCourses(container) {
fetch(`api/cursos.php?profesor_id=${getProfesorId()}`)
.then((response) => response.json())
.then((res) => {
if (!res.success) throw new Error("No se pudieron cargar los cursos");
const courses = res.data;
container.innerHTML = `
Lista de Cursos
Nombre
Descripción
Tipo
Estado
Acciones
${courses
.map((course) => {
const desc = course.descripcion || "-";
const safeDesc = desc.replace(/"/g, """).replace(/'/g, "\\'");
return `
${course.nombre}
${desc}
${formatCourseType(course.tipo)}
${course.estado}
Editar
Eliminar
`;
})
.join("")}
`;
// Evaluar si se debe mostrar "Leer más" en cada descripción
setTimeout(() => {
courses.forEach(course => {
const span = document.getElementById(`desc-${course.id}`);
const leerMas = document.getElementById(`readmore-${course.id}`);
if (span && leerMas && span.scrollWidth > span.clientWidth) {
const safeDesc = (course.descripcion || "")
.replace(/'/g, "\\'")
.replace(/"/g, """)
.replace(/\n/g, "\\n");
leerMas.innerHTML = `
Leer más
`;
}
});
}, 0);
setupCourseForm();
})
.catch((err) => {
console.error("Error al cargar cursos:", err);
container.innerHTML = `No se pudieron cargar los cursos
`;
});
}
function formatCourseType(type) {
const types = {
pildora: "Píldora",
inyeccion: "Inyección",
tratamiento: "Tratamiento"
};
return types[type] || type;
}
window.createCourse = function (data, callback) {
fetch("api/cursos.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((res) => {
if (res.success) {
callback(true, "Curso creado correctamente");
} else {
callback(false, res.error || "Error al crear curso");
}
})
.catch(() => {
callback(false, "No se pudo conectar con el servidor");
});
};
window.updateCourse = function (id, data, callback) {
data.id = id;
fetch("api/cursos.php", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((res) => {
if (res.success) {
callback(true, "Curso actualizado correctamente");
} else {
callback(false, res.error || "Error al actualizar curso");
}
})
.catch(() => {
callback(false, "No se pudo conectar con el servidor");
});
};
function setupCourseForm() {
const courseTypeSelect = document.getElementById('courseType');
const competencesField = document.getElementById('competencesField');
const competenciasInput = competencesField
? competencesField.querySelector('input[name="competencias"]')
: null;
if (courseTypeSelect && competenciasInput) {
courseTypeSelect.addEventListener('change', function () {
const isTratamiento = this.value === 'tratamiento';
competencesField.classList.toggle('oculto', !isTratamiento);
competenciasInput.required = isTratamiento;
if (!isTratamiento) {
competenciasInput.value = '';
}
});
const isTratamiento = courseTypeSelect.value === 'tratamiento';
competencesField.classList.toggle('oculto', !isTratamiento);
competenciasInput.required = isTratamiento;
}
const form = document.getElementById("courseForm");
if (!form) return;
const cancelBtn = document.getElementById("cancelCourseBtn");
const submitBtn = form.querySelector("button[type='submit']");
const submitText = document.getElementById("submitCourseText");
const spinner = document.getElementById("submitCourseSpinner");
if (cancelBtn) {
cancelBtn.addEventListener("click", function () {
form.reset();
competencesField.classList.add("oculto");
form.dataset.editing = "false";
delete form.dataset.courseId;
submitText.textContent = "Guardar";
spinner.style.display = "none";
submitBtn.disabled = false;
cancelBtn.style.display = "none";
});
}
form.addEventListener("submit", function (e) {
e.preventDefault();
submitText.textContent = "Procesando...";
spinner.style.display = "inline-block";
submitBtn.disabled = true;
const formData = new FormData(this);
const jsonData = {
nombre: formData.get("nombre"),
descripcion: formData.get("descripcion"),
competencias: formData.get("competencias"),
tipo: formData.get("tipo"),
estado: formData.get("estado"),
profesor_id: getProfesorId(),
};
const isEdit = form.dataset.editing === "true";
const courseId = form.dataset.courseId;
const callback = (success, message) => {
if (success) {
showToast("success", message);
showSection("courses");
} else {
showToast("error", message);
}
submitText.textContent = isEdit ? "Actualizar Curso" : "Guardar";
spinner.style.display = "none";
submitBtn.disabled = false;
};
if (isEdit) {
updateCourse(courseId, jsonData, callback);
} else {
createCourse(jsonData, callback);
}
});
}
window.editCourse = function (id) {
fetch(`api/cursos.php?profesor_id=${getProfesorId()}`)
.then((response) => response.json())
.then((res) => {
const course = res.data.find((c) => c.id == id);
if (!course) return;
const form = document.getElementById("courseForm");
form.nombre.value = course.nombre;
form.descripcion.value = course.descripcion || "";
form.tipo.value = course.tipo;
form.estado.value = course.estado || "activo";
const competencesField = document.getElementById("competencesField");
const competenciasInput = competencesField.querySelector('input[name="competencias"]');
if (course.tipo === "tratamiento") {
competencesField.classList.remove("oculto");
competenciasInput.value = course.competencias || "";
competenciasInput.required = true;
} else {
competencesField.classList.add("oculto");
competenciasInput.value = "";
competenciasInput.required = false;
}
form.dataset.editing = "true";
form.dataset.courseId = id;
form.querySelector("button[type='submit']").textContent = "Actualizar Curso";
document.getElementById("cancelCourseBtn").style.display = "inline-block";
form.scrollIntoView({ behavior: "smooth" });
});
};
window.confirmDeleteCourse = function (id) {
showModal(
"Confirmar eliminación",
"¿Estás seguro de eliminar este curso? Esta acción no se puede deshacer.",
[
{
text: "Cancelar",
class: "btn-outline",
handler: "closeModal",
},
{
text: "Eliminar",
class: "btn-danger",
handler: `deleteCourse(${id})`,
},
]
);
};
window.deleteCourse = function (id) {
fetch(`api/cursos.php?id=${id}`, {
method: "DELETE",
})
.then((response) => response.json())
.then((data) => {
if (data.success) {
showToast("success", "Curso eliminado correctamente");
closeModal();
loadProfessorCourses(document.querySelector("#courses-content"));
} else {
showToast("error", data.error || "No se pudo eliminar el curso");
}
})
.catch((error) => {
showToast("error", "Error al eliminar el curso");
});
};
// Gestión de alumnos
function loadStudentsManagement(container) {
container.innerHTML = 'Cargando alumnos...
';
fetch("api/alumnos.php")
.then((response) => {
if (!response.ok) throw new Error("Error en la respuesta del servidor");
return response.json();
})
.then((data) => {
if (!data.success)
throw new Error(data.error || "Error al obtener alumnos");
container.innerHTML = `
${renderStudentForm()}
${renderStudentsTable(data.data || [])}
`;
setupStudentForm();
(data.data || []).forEach((alumno) => loadStudentCourses(alumno.id));
})
.catch((error) => {
console.error("Error:", error);
container.innerHTML = `
Error al cargar alumnos
${error.message}
Reintentar
`;
});
}
function renderStudentForm() {
return `
`;
}
function setupStudentForm() {
const form = document.getElementById("studentForm");
if (!form) return;
// Referencias a selects
const tipoCurso = document.getElementById("tipoCurso");
const curso = document.getElementById("curso");
// Cargar cursos dinámicamente
tipoCurso.addEventListener("change", () => {
const tipo = tipoCurso.value;
curso.innerHTML = 'Cargando... ';
fetch(`api/cursos.php?tipo=${tipo}`)
.then((res) => res.json())
.then((data) => {
if (data.success) {
curso.innerHTML = 'Seleccionar curso ';
data.data.forEach((c) => {
const opt = document.createElement("option");
opt.value = c.id;
opt.textContent = c.nombre;
curso.appendChild(opt);
});
} else {
curso.innerHTML = 'Sin resultados ';
}
})
.catch(() => {
curso.innerHTML = 'Error al cargar ';
});
});
// Guardar alumno
form.addEventListener("submit", function (e) {
e.preventDefault();
submitStudentForm(); // ✅ Usa función unificada que detecta si es edición o nuevo
});
const searchInput = document.getElementById("studentSearch");
if (searchInput) {
searchInput.addEventListener("input", function () {
filterStudents(this.value.toLowerCase());
});
}
}
function submitStudentForm() {
const form = document.getElementById("studentForm");
const submitBtn = form.querySelector('button[type="submit"]');
const submitText = document.getElementById("submitText");
const spinner = document.getElementById("submitSpinner");
// Mostrar spinner
submitText.textContent = "Procesando...";
spinner.style.display = "inline-block";
submitBtn.disabled = true;
const formData = new FormData(form);
const jsonData = {
nombre: formData.get("nombre"),
email: formData.get("email"),
telefono: formData.get("telefono"),
curso_id: document.getElementById("curso").value, // ✅ Cambio aquí
};
const isEdit = form.dataset.editing === "true";
const studentId = form.dataset.studentId;
const url = "api/alumnos.php";
const method = isEdit ? "PUT" : "POST";
if (isEdit) {
jsonData.id = studentId;
}
fetch(url, {
method: method,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(jsonData),
})
.then((response) => response.json())
.then((data) => {
if (!data.success)
throw new Error(data.error || "Error al guardar alumno");
showToast(
"success",
data.message || (isEdit ? "Alumno actualizado" : "Alumno creado")
);
resetStudentForm();
loadStudentsManagement(document.querySelector("#students-content"));
})
.catch((error) => {
showToast("error", error.message || "Error en el servidor");
})
.finally(() => {
submitText.textContent = "Guardar";
spinner.style.display = "none";
submitBtn.disabled = false;
});
}
window.createStudent = function (data) {
fetch("api/alumnos.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
if (data.success) {
showSection("students");
}
})
.catch((error) => console.error("Error:", error));
};
window.updateStudent = function (id, data) {
data.id = id;
fetch("api/alumnos.php", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
if (data.success) {
showSection("students");
}
})
.catch((error) => console.error("Error:", error));
};
window.editStudent = function (id) {
fetch(`api/alumnos.php`)
.then((response) => response.json())
.then((data) => {
if (!data.success)
throw new Error(data.error || "Error al obtener alumnos");
const alumno = data.data.find((a) => a.id == id);
if (!alumno) throw new Error("Alumno no encontrado");
const form = document.getElementById("studentForm");
form.nombre.value = alumno.nombre;
form.email.value = alumno.email;
form.telefono.value = alumno.telefono || "";
form.dataset.editing = "true";
form.dataset.studentId = id;
document.getElementById("submitText").textContent = "Actualizar";
document.getElementById("cancelBtn").style.display = "inline-block";
// 👇 Precargar tipo y curso si el alumno tiene asignación
fetch(`api/alumnos-cursos.php?alumno_id=${id}`)
.then((res) => res.json())
.then((asignaciones) => {
if (asignaciones.success && asignaciones.data.length > 0) {
const curso = asignaciones.data[0];
const tipoCursoSelect = document.getElementById("tipoCurso");
const cursoSelect = document.getElementById("curso");
tipoCursoSelect.value = curso.tipo;
tipoCursoSelect.dispatchEvent(new Event("change"));
setTimeout(() => {
cursoSelect.value = curso.id;
}, 300);
}
});
form.scrollIntoView({ behavior: "smooth" });
})
.catch((error) => {
showToast("error", error.message || "Error al cargar alumno");
});
};
window.deleteStudent = function (id) {
if (!id) {
showToast("error", "ID de alumno no proporcionado");
return;
}
fetch(`api/alumnos.php?id=${id}`, {
method: "DELETE",
})
.then((response) => response.json())
.then((data) => {
if (!data.success)
throw new Error(data.error || "Error al eliminar alumno");
showToast("success", data.message || "Alumno eliminado");
closeModal();
loadStudentsManagement(document.querySelector("#students-content"));
})
.catch((error) => {
showToast("error", error.message || "Error al eliminar alumno");
});
};
window.confirmDeleteStudent = function (id) {
showModal(
"Confirmar eliminación",
"¿Estás seguro de eliminar este alumno? Esta acción no se puede deshacer.",
[
{
text: "Cancelar",
class: "btn-outline",
handler: "closeModal",
},
{
text: "Eliminar",
class: "btn-danger",
handler: "deleteStudent(" + id + ")"
},
]
);
};
window.resetStudentForm = function () {
const form = document.getElementById("studentForm");
form.reset();
form.dataset.editing = "false";
delete form.dataset.studentId;
document.getElementById("submitText").textContent = "Guardar";
document.getElementById("cancelBtn").style.display = "none";
};
function filterStudents(searchTerm) {
const rows = document.querySelectorAll(".students-table tbody tr");
rows.forEach((row) => {
const nombre = row.cells[0].textContent.toLowerCase();
const email = row.cells[1].textContent.toLowerCase();
const telefono = row.cells[2].textContent.toLowerCase();
if (
nombre.includes(searchTerm) ||
email.includes(searchTerm) ||
telefono.includes(searchTerm)
) {
row.style.display = "";
} else {
row.style.display = "none";
}
});
}
//alumnos-cursos
function renderStudentsTable(alumnos) {
if (alumnos.length === 0) {
return `
No hay alumnos registrados
Comienza agregando tu primer alumno
`;
}
return `
Nombre
Email
Teléfono
Cursos
Acciones
${alumnos
.map(
(alumno) => `
${alumno.nombre}
${alumno.email}
${alumno.telefono || "-"}
${renderCourseBadges(alumno.id)}
Editar
Eliminar
`
)
.join("")}
`;
}
function renderCourseBadges(alumnoId) {
return '
'; // Se cargará dinámicamente
}
async function loadStudentCourses(alumnoId) {
try {
const response = await fetch(
`api/alumnos-cursos.php?alumno_id=${alumnoId}`
);
const data = await response.json();
if (data.success) {
const container = document.getElementById(`courses-${alumnoId}`);
if (container) {
container.innerHTML =
data.data
.map(
(curso) => `
${curso.nombre}
×
`
)
.join("") || 'Sin cursos ';
}
}
} catch (error) {
console.error("Error loading student courses:", error);
}
}
window.showAssignStudentModal = async function () {
try {
console.log("Mostrando modal de vinculación");
const profesorId = getProfesorId();
if (!profesorId) {
console.error("No se pudo obtener el ID del profesor");
showToast("error", "No se pudo identificar al profesor");
return;
}
// Mostrar loader mientras se cargan los datos
const tempModalContent = `Cargando datos...
`;
showModal("Vincular Alumnos a Curso", tempModalContent);
// Cargar cursos y alumnos en paralelo
const [cursosRes, alumnosRes] = await Promise.all([
fetch(`api/cursos.php?profesor_id=${profesorId}`),
fetch("api/alumnos.php"),
]);
const [cursosData, alumnosData] = await Promise.all([
cursosRes.json(),
alumnosRes.json(),
]);
if (!cursosData || !alumnosData || !alumnosData.success) {
closeModal();
throw new Error("Error al cargar datos necesarios");
}
// Crear contenido del modal
const modalHtml = `
Seleccionar Curso
${cursosData
.map(
(curso) => `${curso.nombre} `
)
.join("")}
`;
// Actualizar el contenido del modal
const modalBody = document.querySelector(".modal-body");
if (modalBody) {
modalBody.innerHTML = modalHtml;
}
// Crear el footer si no existe
let modalFooter = document.querySelector(".modal-footer");
if (!modalFooter) {
modalFooter = document.createElement("div");
modalFooter.className = "modal-footer";
document.querySelector(".modal").appendChild(modalFooter);
}
// Actualizar el contenido del footer
modalFooter.innerHTML = `
Cancelar
Confirmar Vinculación
`;
// Función para vincular alumnos seleccionados
window.assignStudentsToCourse = async function () {
const cursoId = document.getElementById("selectCurso").value;
const selectedAlumnos = Array.from(
document.querySelectorAll('input[name="alumnos"]:checked')
).map((input) => input.value);
if (selectedAlumnos.length === 0) {
showToast("warning", "Selecciona al menos un alumno");
return;
}
try {
const response = await fetch("api/alumnos-cursos.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
curso_id: cursoId,
alumnos: selectedAlumnos,
}),
});
const result = await response.json();
if (result.success) {
showToast("success", "Alumnos vinculados exitosamente");
closeModal();
loadStudentsManagement(document.querySelector("#students-content"));
} else {
showToast("error", result.error || "Error al vincular");
}
} catch (error) {
console.error("Error al vincular:", error);
showToast("error", "Error al realizar la vinculación");
}
};
} catch (error) {
console.error("Error en showAssignStudentModal:", error);
closeModal();
showToast("error", "Error al cargar datos para vinculación");
}
};
window.unassignStudent = async function (alumnoId, cursoId) {
if (confirm("¿Desvincular este alumno del curso?")) {
try {
const response = await fetch(
`api/alumnos-cursos.php?alumno_id=${alumnoId}&curso_id=${cursoId}`,
{
method: "DELETE",
}
);
const data = await response.json();
if (data.success) {
showToast("success", data.message);
loadStudentCourses(alumnoId);
} else {
showToast("error", data.error || "Error al desvincular");
}
} catch (error) {
showToast("error", "Error en la conexión");
}
}
};
// Gestión de diplomas
function loadDiplomasSection(container) {
container.innerHTML = 'Cargando diplomas...
';
fetch(`api/diploma.php?profesor_id=${getProfesorId()}`)
.then((response) => {
if (!response.ok) throw new Error("Error en la respuesta del servidor");
return response.json();
})
.then((data) => {
if (!data.success)
throw new Error(data.error || "Error al obtener diplomas");
if (data.data.length === 0) {
container.innerHTML = `
Diplomas Emitidos
No hay diplomas registrados aún
`;
return;
}
container.innerHTML = `
Diplomas Emitidos
Alumno
Email
Curso
Tipo
Fecha
Código
Acciones
${data.data
.map(
(diploma) => `
${diploma.alumno_nombre}
${diploma.alumno_email}
${diploma.curso_nombre}
${diploma.curso_tipo}
${diploma.fecha_formateada}
${diploma.codigo_unico}
Descargar
Reenviar
`
)
.join("")}
`;
})
.catch((error) => {
console.error("Error:", error);
container.innerHTML = `
Error al cargar diplomas
${error.message}
Reintentar
`;
});
}
// Funciones auxiliares
function generateCoursesPreview(courses) {
if (!courses.length) return "No tienes cursos activos
";
return `
Nombre
Tipo
Estado
${courses
.map(
(course) => `
${course.nombre || "Sin nombre"}
${
course.tipo || "N/A"
}
${course.estado || "N/A"}
`
)
.join("")}
`;
}
function getCourseTypeClass(type) {
const types = {
inyeccion: "type-inyeccion",
pildora: "type-pildora",
tratamiento: "type-tratamiento",
};
return types[type] || "";
}
// Funciones globales para diplomas
window.downloadDiploma = function (codigo) {
window.open(`certificado.php?codigo=${codigo}`, "_blank");
};
window.resendDiploma = function (codigo) {
fetch(`api/diplomas.php?action=resend&codigo=${codigo}`)
.then((response) => response.json())
.then((data) => {
if (data.success) {
alert("Diploma reenviado exitosamente");
} else {
alert("Error: " + (data.error || "No se pudo reenviar el diploma"));
}
})
.catch((error) => {
console.error("Error:", error);
alert("Error al reenviar el diploma");
});
};
window.handleCSVUpload = function (event) {
const file = event.target.files[0];
if (!file) return;
const resultadoDiv = document.getElementById("resultadoCSV");
if (resultadoDiv) resultadoDiv.innerHTML = "";
const reader = new FileReader();
reader.onload = function (e) {
const lines = e.target.result.split("\n").map(line => line.trim()).filter(Boolean);
const alumnos = [];
for (let i = 1; i < lines.length; i++) {
const [nombre, email, telefono, tipoCurso, nombreCurso] = lines[i].split(",").map(s => s.trim());
if (!nombre || !email || !telefono || !tipoCurso || !nombreCurso) {
continue;
}
alumnos.push({ nombre, email, telefono, tipoCurso, nombreCurso });
}
if (alumnos.length === 0) {
showToast("error", "El archivo CSV no contiene datos válidos");
if (resultadoDiv) resultadoDiv.innerHTML = `No se encontraron alumnos válidos en el archivo.
`;
return;
}
fetch("api/importar_csv.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ alumnos }),
})
.then(res => res.json())
.then(data => {
if (data.success) {
showToast("success", data.message || "Alumnos importados correctamente");
if (resultadoDiv) resultadoDiv.innerHTML = `${data.message}
`;
loadStudentsManagement(document.querySelector("#students-content"));
} else {
if (data.conflicts && data.conflicts.length > 0) {
const list = `${data.conflicts.map(msg => `${msg} `).join("")} `;
showModal("Errores en Importación CSV", `No se importaron alumnos por los siguientes errores:
${list}`);
if (resultadoDiv) resultadoDiv.innerHTML = `${list}
`;
} else {
showToast("error", data.error || "Error al importar alumnos");
if (resultadoDiv) resultadoDiv.innerHTML = `${data.error || "Error desconocido"}
`;
}
}
})
.catch(() => {
showToast("error", "Error al procesar el archivo");
if (resultadoDiv) resultadoDiv.innerHTML = `Error al procesar el archivo.
`;
});
};
reader.readAsText(file);
};