diff --git a/controladores/actualizar_concierto.php b/controladores/actualizar_concierto.php new file mode 100644 index 0000000..411b69b --- /dev/null +++ b/controladores/actualizar_concierto.php @@ -0,0 +1,68 @@ +<?php +include 'conexion.php'; + +if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id'])) { + $id = intval($_GET['id']); + $consulta = "SELECT * FROM conciertos WHERE id_concierto = ?"; + $stmt = $conexionBD->prepare($consulta); + $stmt->bind_param("i", $id); + $stmt->execute(); + $resultado = $stmt->get_result(); + $concierto = $resultado->fetch_assoc(); + + if ($concierto) { + $consulta_zonas = "SELECT * FROM zonas WHERE id_concierto = ?"; + $stmt_zonas = $conexionBD->prepare($consulta_zonas); + $stmt_zonas->bind_param("i", $id); + $stmt_zonas->execute(); + $resultado_zonas = $stmt_zonas->get_result(); + while ($zona = $resultado_zonas->fetch_assoc()) { + $concierto['zonas'][] = $zona; + } + echo json_encode($concierto); + } else { + echo json_encode(["error" => "Concierto no encontrado"]); + } + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $datos = json_decode(file_get_contents("php://input"), true); + if (!$datos || !isset($datos['id'])) { + echo json_encode(["actualizacionCorrecta" => false, "error" => "Datos incompletos"]); + exit; + } + + // Actualizar la información del concierto + $consulta = "UPDATE conciertos SET nombre_concierto=?, artista=?, fecha=?, calle=?, colonia=?, numero_direccion=?, codigo_postal=?, estado=?, capacidad_total=? WHERE id_concierto=?"; + $stmt = $conexionBD->prepare($consulta); + $stmt->bind_param("ssssssissi", + $datos['nombre_concierto'], + $datos['artista'], + $datos['fecha'], + $datos['calle'], + $datos['colonia'], + $datos['numero_direccion'], + $datos['codigo_postal'], + $datos['estado'], + $datos['capacidad_total'], + $datos['id'] + ); + $stmt->execute(); + + // Actualizar la información de las zonas + foreach ($datos['zonas'] as $zona) { + $consulta_zonas = "UPDATE zonas SET capacidad=?, precio=? WHERE id_concierto=? AND nombre_zona=?"; + $stmt_zona = $conexionBD->prepare($consulta_zonas); + $stmt_zona->bind_param("idis", + $zona['capacidad'], + $zona['precio'], + $datos['id'], + $zona['nombre_zona'] + ); + $stmt_zona->execute(); + } + + echo json_encode(["actualizacionCorrecta" => true]); + exit; +} \ No newline at end of file diff --git a/controladores/buscar_conciertos.php b/controladores/buscar_conciertos.php deleted file mode 100644 index e69de29..0000000 diff --git a/controladores/eliminar_concierto.php b/controladores/eliminar_concierto.php new file mode 100644 index 0000000..b1553d3 --- /dev/null +++ b/controladores/eliminar_concierto.php @@ -0,0 +1,35 @@ +<?php +include 'conexion.php'; + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $datos = json_decode(file_get_contents("php://input"), true); + + if (!isset($datos['id'])) { + echo json_encode(["eliminacionCorrecta" => false, "error" => "ID de concierto no proporcionado"]); + exit; + } + + $id = intval($datos['id']); + + // Eliminar las zonas relacionadas con el concierto + $consulta_zonas = "DELETE FROM zonas WHERE id_concierto = ?"; + $stmt_zonas = $conexionBD->prepare($consulta_zonas); + $stmt_zonas->bind_param("i", $id); + $stmt_zonas->execute(); + + // Eliminar el concierto + $consulta = "DELETE FROM conciertos WHERE id_concierto = ?"; + $stmt = $conexionBD->prepare($consulta); + $stmt->bind_param("i", $id); + $stmt->execute(); + + if ($stmt->affected_rows > 0) { + echo json_encode(["eliminacionCorrecta" => true]); + } else { + echo json_encode(["eliminacionCorrecta" => false, "error" => "No se pudo eliminar el concierto"]); + } + exit; +} else { + echo json_encode(["error" => "Método no permitido"]); + exit; +} diff --git a/controladores/obtener_concierto.php b/controladores/obtener_concierto.php new file mode 100644 index 0000000..f6e6e11 --- /dev/null +++ b/controladores/obtener_concierto.php @@ -0,0 +1,38 @@ +<?php +include 'conexion.php'; + +header('Content-Type: application/json'); +error_reporting(E_ALL); +ini_set('display_errors', 1); + +if (!isset($_GET['id'])) { + echo json_encode(["error" => "ID de concierto no proporcionado"]); + exit; +} + +$id = intval($_GET['id']); +$consulta = "SELECT * FROM conciertos WHERE id_concierto = ?"; +$stmt = $conexionBD->prepare($consulta); +$stmt->bind_param("i", $id); +$stmt->execute(); +$resultado = $stmt->get_result(); +$concierto = $resultado->fetch_assoc(); + +if (!$concierto) { + echo json_encode(["error" => "Concierto no encontrado"]); + exit; +} + +$consulta_zonas = "SELECT * FROM zonas WHERE id_concierto = ?"; +$stmt_zonas = $conexionBD->prepare($consulta_zonas); +$stmt_zonas->bind_param("i", $id); +$stmt_zonas->execute(); +$resultado_zonas = $stmt_zonas->get_result(); + +$concierto['zonas'] = []; +while ($zona = $resultado_zonas->fetch_assoc()) { + $concierto['zonas'][] = $zona; +} + +echo json_encode($concierto); +exit; diff --git a/css/modalActualizar.css b/css/modalActualizar.css new file mode 100644 index 0000000..0d06d5b --- /dev/null +++ b/css/modalActualizar.css @@ -0,0 +1,40 @@ +.modal { + display: none; + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.182); + display: flex; + justify-content: center; + align-items: center; +} + +.modal-contenido { + background: #343d46; + width: 200px; + height: 100px; + padding: 20px; + border-radius: 10px; + text-align: center; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +} + +modal-contenido p{ + color: black; +} + +.btn-modal { + padding: 10px 20px; + background: #1c1b2b; + color: white; + border: none; + cursor: pointer; + border-radius: 5px; +} + +.btn-modal:hover { + background: #0056b3; +} \ No newline at end of file diff --git a/css/modalEliminar.css b/css/modalEliminar.css new file mode 100644 index 0000000..591d4e8 --- /dev/null +++ b/css/modalEliminar.css @@ -0,0 +1,70 @@ +.modal { + display: none; + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; +} + +.modal-contenido { + background: #25253e; + width: 300px; + padding: 20px; + border-radius: 10px; + text-align: center; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +} + +.modal-contenido p { + color: #ffffff; + font-size: 16px; + margin-bottom: 10px; +} + + +.btn-modal { + margin-top: 10px; + padding: 10px 20px; + background: #1c1b2b; + color: white; + border: none; + cursor: pointer; + border-radius: 5px; + font-size: 14px; + transition: background 0.3s ease-in-out; +} + +.btn-modal:hover { + background: #0056b3; +} + +.modal-confirmacion { + background: #2b2b3a; + width: 320px; + padding: 25px; + border-radius: 12px; + text-align: center; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); +} + +#btnCancelarEliminar { + background: #5a6268; +} + +#btnCancelarEliminar:hover { + background: #444b50; +} + +#btnConfirmarEliminar{ + background-color: #f5524c; +} + +#btnConfirmarEliminar:hover{ + background: #c9302c; +} \ No newline at end of file diff --git a/editarConciertos.html b/editarConciertos.html new file mode 100644 index 0000000..1c5e935 --- /dev/null +++ b/editarConciertos.html @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html lang="es"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Editar Concierto</title> + <link rel="stylesheet" href="css/conciertos.css"> + <link rel="stylesheet" href="css/formulario.css"> + <link rel="stylesheet" href="css/modalActualizar.css"> +</head> +<body> + + <!-- Navbar --> + <nav> + <a href="ventanaInsertarConcierto.html" class="navbar-brand">TicketFei</a> + <div class="nav-links"> + <a href="ventanaInsertarConcierto.html">Crear Conciertos</a> + <a href="ventanaConciertos.html">Ver Conciertos</a> + <a href="#">Reporte Ventas</a> + </div> + </nav> + + <!-- Contenedor --> + <div class="container"> + <h2 class="text-center">Editar Concierto</h2> + <form id="formulario"> + + <!-- Paso 1: Datos generales --> + <div id="paso1"> + <div class="mb-3"> + <label for="nombre_concierto">Nombre del Concierto:</label> + <input type="text" id="nombre_concierto" required> + </div> + <div class="mb-3"> + <label for="artista">Artista:</label> + <input type="text" id="artista" required> + </div> + <div class="mb-3"> + <label for="fecha">Fecha del Concierto:</label> + <input type="date" id="fecha" required> + </div> + <button type="button" class="btn next-btn" onclick="siguientePaso(2)">Siguiente</button> + </div> + + <!-- Paso 2: Dirección --> + <div id="paso2" class="d-none"> + <div class="mb-3"> + <label for="calle">Calle:</label> + <input type="text" id="calle" required> + </div> + <div class="mb-3"> + <label for="colonia">Colonia:</label> + <input type="text" id="colonia" required> + </div> + <div class="mb-3"> + <label for="numero_direccion">Número exterior:</label> + <input type="text" id="numero_direccion" required> + </div> + <div class="mb-3"> + <label for="codigo_postal">Código Postal:</label> + <input type="text" id="codigo_postal" required> + </div> + <div class="mb-3"> + <label for="estado">Estado:</label> + <input type="text" id="estado" required> + </div> + <div class="mb-3"> + <label for="capacidad_total">Capacidad Total:</label> + <input type="number" id="capacidad_total" required> + </div> + <button type="button" class="btn prev-btn" onclick="siguientePaso(1)">Anterior</button> + <button type="button" class="btn next-btn" onclick="siguientePaso(3)">Siguiente</button> + </div> + + <!-- Paso 3: Zonas --> + <div id="paso3" class="d-none"> + <fieldset> + <legend>Zonas</legend> + + <div class="mb-3"> + <label>Zona General - Capacidad:</label> + <input type="number" id="capacidad_general" required oninput="actualizarCapacidad()"> + <label>Precio:</label> + <input type="number" step="0.01" id="precio_general" required> + </div> + + <div class="mb-3"> + <label>Zona Plata - Capacidad:</label> + <input type="number" id="capacidad_plata" required oninput="actualizarCapacidad()"> + <label>Precio:</label> + <input type="number" step="0.01" id="precio_plata" required> + </div> + + <div class="mb-3"> + <label>Zona Oro - Capacidad:</label> + <input type="number" id="capacidad_oro" required oninput="actualizarCapacidad()"> + <label>Precio:</label> + <input type="number" step="0.01" id="precio_oro" required> + </div> + + <div class="mb-3"> + <label>Zona VIP - Capacidad:</label> + <input type="number" id="capacidad_vip" required oninput="actualizarCapacidad()"> + <label>Precio:</label> + <input type="number" step="0.01" id="precio_vip" required> + </div> + </fieldset> + + <!-- Agregar capacidad disponible --> + <p>Capacidad disponible: <span id="capacidad_disponible">0</span></p> + + <button type="button" class="btn prev-btn" onclick="siguientePaso(2)">Anterior</button> + <button type="submit" class="btn submit-btn">Actualizar Concierto</button> + </div> + </form> + <div id="mensaje" class="mt-3 text-center"></div> + </div> + + <div id="modalMensaje" class="modal"> + <div class="modal-contenido"> + <p id="modalTexto"></p> + <button id="cerrarModal" class="btn-modal">Cerrar</button> + </div> + </div> + + <script src="js/editarConcierto.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/conciertos.js b/js/conciertos.js index a4016bf..4f44c17 100644 --- a/js/conciertos.js +++ b/js/conciertos.js @@ -5,6 +5,61 @@ document.addEventListener("DOMContentLoaded", () => { const listaConciertos = document.getElementById("listaConciertos"); const buscadorBoton = document.getElementById("buscadorBoton"); const buscadorInput = document.getElementById("buscadorColaborador"); +const modal = document.getElementById("modalMensaje"); +const modalTexto = document.getElementById("modalTexto"); +const cerrarModal = document.getElementById("cerrarModal"); +const modalConfirmacion = document.getElementById("modalConfirmacion"); +const modalConfirmarTexto = document.getElementById("modalConfirmarTexto"); +const btnConfirmarEliminar = document.getElementById("btnConfirmarEliminar"); +const btnCancelarEliminar = document.getElementById("btnCancelarEliminar"); +let conciertoIdEliminar = null; // Para almacenar el ID del concierto a eliminar + +// Ocultar modales al inicio +modal.style.display = "none"; +modalConfirmacion.style.display = "none"; + +// Función para mostrar modal de mensaje (confirmación de eliminación exitosa) +function mostrarModal(mensaje) { + modalTexto.textContent = mensaje; + modal.style.display = "flex"; + setTimeout(() => { + modal.style.display = "none"; + }, 2000); // Se cierra automáticamente en 2 segundos +} + +// Función para mostrar el modal de confirmación antes de eliminar +function mostrarModalConfirmacion(id) { + conciertoIdEliminar = id; + modalConfirmarTexto.textContent = "¿Estás seguro de que deseas eliminar este concierto?"; + modalConfirmacion.style.display = "flex"; +} + +// Evento para cerrar el modal de confirmación sin eliminar +btnCancelarEliminar.addEventListener("click", () => { + modalConfirmacion.style.display = "none"; +}); + +// Evento para confirmar eliminación +btnConfirmarEliminar.addEventListener("click", async () => { + if (conciertoIdEliminar) { + await eliminarConcierto(conciertoIdEliminar); + } + modalConfirmacion.style.display = "none"; // Cierra el modal después de eliminar +}); + +// Evento para cerrar el modal de mensaje manualmente +cerrarModal.addEventListener("click", () => { + modal.style.display = "none"; +}); + +window.addEventListener("click", (event) => { + if (event.target === modal) { + modal.style.display = "none"; + } + if (event.target === modalConfirmacion) { + modalConfirmacion.style.display = "none"; + } +}); async function cargarConciertos(filtro = "") { try { @@ -42,8 +97,8 @@ async function cargarConciertos(filtro = "") { <div class="menu-container"> <button class="menu-btn">⋮</button> <div class="menu"> - <button class="edit">Editar</button> - <button class="delete">Eliminar</button> + <button class="edit" data-id="${concierto.id}">Editar</button> + <button class="delete" data-id="${concierto.id}">Eliminar</button> </div> </div> <img src="img/concierto_${concierto.id}.jpg" alt="Concierto" class="card-img"> @@ -58,6 +113,17 @@ async function cargarConciertos(filtro = "") { <button class="btn-comprar">Comprar Boletos</button> `; + // Evento para editar + tarjeta.querySelector(".edit").addEventListener("click", () => { + window.location.href = `editarConciertos.html?id=${concierto.id}`; + }); + + // Evento para eliminar usando el modal de confirmación + tarjeta.querySelector(".delete").addEventListener("click", (e) => { + const id = e.target.dataset.id; + mostrarModalConfirmacion(id); + }); + listaConciertos.appendChild(tarjeta); tarjetas.push(tarjeta); }); @@ -91,3 +157,27 @@ document.addEventListener("click", (e) => { }); } }); + +/** 🔹 Función para eliminar el concierto usando modal */ +async function eliminarConcierto(id) { + try { + const respuesta = await fetch("controladores/eliminar_concierto.php", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ id }) + }); + + const resultado = await respuesta.json(); + if (resultado.eliminacionCorrecta) { + mostrarModal("Concierto eliminado correctamente"); + cargarConciertos(); // Recargar la lista + } else { + mostrarModal("Error al eliminar el concierto"); + } + } catch (error) { + console.error(error); + mostrarModal("Error de conexión con el servidor"); + } +} diff --git a/js/editarConcierto.js b/js/editarConcierto.js new file mode 100644 index 0000000..7c0b7b0 --- /dev/null +++ b/js/editarConcierto.js @@ -0,0 +1,194 @@ +const params = new URLSearchParams(window.location.search); +const conciertoId = params.get("id"); +const formulario = document.getElementById("formulario"); +const modal = document.getElementById("modalMensaje"); +const modalTexto = document.getElementById("modalTexto"); +const cerrarModal = document.getElementById("cerrarModal"); +let capacidadTotal = 0; + +modal.style.display = "none"; + +function mostrarModal(mensaje) { + modalTexto.textContent = mensaje; + modal.style.display = "flex"; +} + +cerrarModal.addEventListener("click", () => { + modal.style.display = "none"; +}); + +window.addEventListener("click", (event) => { + if (event.target === modal) { + modal.style.display = "none"; + } +}); + +function siguientePaso(paso) { + document.querySelectorAll("[id^='paso']").forEach(p => p.classList.add("d-none")); + document.getElementById(`paso${paso}`).classList.remove("d-none"); + + if (paso === 3) { + capacidadTotal = parseInt(document.getElementById("capacidad_total").value) || 0; + document.getElementById("capacidad_disponible").textContent = capacidadTotal; + // ✅ Llamar a actualizar capacidad después de cargar los datos + actualizarCapacidad(); + } +} + +// ✅ Función para actualizar la capacidad disponible +function actualizarCapacidad() { + let sumaZonas = 0; + ["capacidad_general", "capacidad_plata", "capacidad_oro", "capacidad_vip"].forEach(id => { + sumaZonas += parseInt(document.getElementById(id).value) || 0; + }); + + let capacidadDisponibleElement = document.getElementById("capacidad_disponible"); + let restante = capacidadTotal - sumaZonas; + + if (restante < 0) { + capacidadDisponibleElement.textContent = "⚠️ Excede la capacidad total"; + capacidadDisponibleElement.style.color = "red"; + } else if (restante > 0) { + capacidadDisponibleElement.textContent = `⚠️ Faltan ${restante} lugares`; + capacidadDisponibleElement.style.color = "orange"; + } else { + capacidadDisponibleElement.textContent = `✅ Todo correcto`; + capacidadDisponibleElement.style.color = "green"; + } +} + +// ✅ Función para validar la capacidad antes de actualizar +function validarCapacidadZonas() { + let sumaZonas = 0; + ["capacidad_general", "capacidad_plata", "capacidad_oro", "capacidad_vip"].forEach(id => { + sumaZonas += parseInt(document.getElementById(id).value) || 0; + }); + + let capacidadTotalInput = parseInt(document.getElementById("capacidad_total").value); + + if (sumaZonas < capacidadTotalInput) { + mostrarModal(`⚠️ Error: La suma de las capacidades es menor`); + return false; + } + + if (sumaZonas > capacidadTotalInput) { + mostrarModal(`⚠️ Error: La suma de las capacidades es mayor`); + return false; + } + + return true; +} + +// ✅ Bloquear la actualización si la validación no pasa +formulario.addEventListener("submit", async (event) => { + event.preventDefault(); + + if (!validarCapacidadZonas()) { + return; // 🚫 Bloquear la actualización si la validación falla + } + + await actualizarConcierto(conciertoId); +}); + +// ✅ Función para cargar los datos del concierto +async function cargarDatosConcierto(id) { + try { + const respuesta = await fetch(`/ProyectoTicketFei/controladores/obtener_concierto.php?id=${id}`); + if (!respuesta.ok) throw new Error("Error al cargar los datos del concierto"); + + const concierto = await respuesta.json(); + + document.getElementById("nombre_concierto").value = concierto.nombre_concierto; + document.getElementById("artista").value = concierto.artista; + document.getElementById("fecha").value = concierto.fecha; + document.getElementById("calle").value = concierto.calle; + document.getElementById("colonia").value = concierto.colonia; + document.getElementById("numero_direccion").value = concierto.numero_direccion; + document.getElementById("codigo_postal").value = concierto.codigo_postal; + document.getElementById("estado").value = concierto.estado; + document.getElementById("capacidad_total").value = concierto.capacidad_total; + capacidadTotal = parseInt(concierto.capacidad_total); // Guardar la capacidad total + + if (concierto.zonas && concierto.zonas.length > 0) { + concierto.zonas.forEach(zona => { + switch (zona.nombre_zona) { + case "General": + document.getElementById("capacidad_general").value = zona.capacidad; + document.getElementById("precio_general").value = zona.precio; + break; + case "Plata": + document.getElementById("capacidad_plata").value = zona.capacidad; + document.getElementById("precio_plata").value = zona.precio; + break; + case "Oro": + document.getElementById("capacidad_oro").value = zona.capacidad; + document.getElementById("precio_oro").value = zona.precio; + break; + case "VIP": + document.getElementById("capacidad_vip").value = zona.capacidad; + document.getElementById("precio_vip").value = zona.precio; + break; + } + }); + } else { + console.warn("⚠️ No se encontraron zonas para este concierto."); + } + + } catch (error) { + console.error("❌ Error en cargarDatosConcierto:", error); + } +} + +// ✅ Función para actualizar el concierto +async function actualizarConcierto(id) { + if (!validarCapacidadZonas()) return; // 🚫 Bloquear la actualización si la validación falla + + const datosConcierto = { + id: id, + nombre_concierto: document.getElementById("nombre_concierto").value.trim(), + artista: document.getElementById("artista").value.trim(), + fecha: document.getElementById("fecha").value, + calle: document.getElementById("calle").value.trim(), + colonia: document.getElementById("colonia").value.trim(), + numero_direccion: document.getElementById("numero_direccion").value.trim(), + codigo_postal: document.getElementById("codigo_postal").value.trim(), + estado: document.getElementById("estado").value.trim(), + capacidad_total: document.getElementById("capacidad_total").value, + zonas: [ + { nombre_zona: "General", capacidad: document.getElementById("capacidad_general").value, precio: document.getElementById("precio_general").value }, + { nombre_zona: "Plata", capacidad: document.getElementById("capacidad_plata").value, precio: document.getElementById("precio_plata").value }, + { nombre_zona: "Oro", capacidad: document.getElementById("capacidad_oro").value, precio: document.getElementById("precio_oro").value }, + { nombre_zona: "VIP", capacidad: document.getElementById("capacidad_vip").value, precio: document.getElementById("precio_vip").value } + ] + }; + + try { + const respuesta = await fetch("/ProyectoTicketFei/controladores/actualizar_concierto.php", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(datosConcierto) + }); + + const resultado = await respuesta.json(); + if (resultado.actualizacionCorrecta) { + mostrarModal("✅ Concierto actualizado correctamente"); + setTimeout(() => { + window.location.href = "ventanaConciertos.html"; + }, 2000); + } else { + mostrarModal("⚠️ Error al actualizar el concierto"); + } + } catch (error) { + console.error(error); + mostrarModal("⚠️ Error de conexión con el servidor"); + } +} + +// ✅ Llamar a cargar los datos cuando la página cargue +(async function () { + if (conciertoId) { + await cargarDatosConcierto(conciertoId); + } +})(); diff --git a/ventanaConciertos.html b/ventanaConciertos.html index 11952e8..ab16651 100644 --- a/ventanaConciertos.html +++ b/ventanaConciertos.html @@ -7,6 +7,7 @@ <script src="https://cdn.tailwindcss.com"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script> <link rel="stylesheet" href="css/conciertos.css"> + <link rel="stylesheet" href="css/modalEliminar.css"> </head> <body> @@ -25,6 +26,23 @@ <div id="listaConciertos"></div> + <!-- Modal de mensaje --> + <div id="modalMensaje" class="modal"> + <div id="modalPanel" class="modal-contenido"> + <p id="modalTexto"></p> + <button id="cerrarModal" class="btn-modal">Cerrar</button> + </div> + </div> + + <!-- Modal de confirmación --> + <div id="modalConfirmacion" class="modal"> + <div class="modal-contenido"> + <p id="modalConfirmarTexto"></p> + <button id="btnCancelarEliminar" class="btn-modal">Cancelar</button> + <button id="btnConfirmarEliminar" class="btn-modal">Eliminar</button> + </div> + </div> + <script src="js/conciertos.js"></script> </body>