agenda-profecionistas
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tabla con Búsqueda, Paginación y Exportación a Excel</title>
<!-- Bootstrap CSS para estilos de la página -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- SweetAlert2 CSS para alertas personalizadas -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css">
</head>
<body>
<div class="container">
<div class="row mt-4">
<!-- Botón para abrir el formulario modal -->
<div class="col-md-4">
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#formularioModal">
Abrir Formulario
</button>
</div>
<!-- Campo de búsqueda -->
<div class="col-md-4">
<input type="text" id="searchInput" class="form-control" placeholder="Buscar...">
</div>
<!-- Botón para exportar a Excel -->
<div class="col-md-4">
<button id="exportButton" class="btn btn-success">Exportar a Excel</button>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<!-- Tabla para mostrar los datos -->
<table class="table" id="tabla-datos">
<thead>
<tr>
<th scope="col">id</th>
<th scope="col">Nombre</th>
<th scope="col">Correo</th>
<th scope="col">Celular</th>
<th scope="col">Tel</th>
<th scope="col">Horario</th>
<th scope="col">Fecha</th>
<th scope="col">Cédula</th>
<th scope="col">Domicilio</th>
</tr>
</thead>
<tbody class="tabla">
<!-- Aquí se mostrarán los datos cargados -->
</tbody>
</table>
<!-- Paginación -->
<div id="pagination" class="mt-3"></div>
</div>
</div>
</div>
<!-- Modal para el formulario -->
<div class="modal fade" id="formularioModal" tabindex="-1" aria-labelledby="formularioModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="formularioModalLabel">Formulario</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- Formulario para ingresar datos -->
<form id="formulario">
<div class="mb-6 row mt-3">
<div class="col-1">
<label for="nombre" class="form-label">Nombre:</label>
</div>
<div class="col">
<input type="text" class="form-control" id="nombre" name="nombre" required>
</div>
<div class="col-1">
<label for="correo" class="form-label">Correo:</label>
</div>
<div class="col">
<input type="email" class="form-control" name="correo" id="correo">
</div>
</div>
<div class="mb-6 row">
<div class="col">
<label for="celular" class="form-label">Celular:</label>
<input type="tel" class="form-control" name="celular" id="celular">
</div>
<div class="col">
<label for="tel_oficina" class="form-label">Tel. Oficina:</label>
<input type="tel" class="form-control" name="tel_oficina" id="tel_oficina">
</div>
<div class="col">
<label for="horario_disponible" class="form-label">Horario Disponible:</label>
<input type="text" class="form-control" name="horario_disponible" id="horario_disponible">
</div>
<div class="col">
<label for="fecha_registro" class="form-label">Fecha de Registro:</label>
<input type="date" class="form-control" name="fecha_registro" id="fecha_registro" required>
</div>
<div class="col">
<label for="cedula_profesional" class="form-label">Cédula Profesional:</label>
<input type="text" class="form-control" name="cedula_profesional" id="cedula_profesional">
</div>
</div>
<div class="mb-6 row t-3">
<div class="col">
<label for="exampleFormControlTextarea1" class="form-label">Domicilio</label>
<textarea class="form-control" name="domicilio" id="domicilio" rows="3"></textarea>
</div>
<div class="col-1 text-center">
<button type="submit" class="btn btn-primary mt-5">Enviar</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- SweetAlert2 JS -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- XLSX JS -->
<script src="https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js"></script>
<script>
// Evento para manejar el envío del formulario
document.getElementById("formulario").addEventListener("submit", function(event) {
event.preventDefault(); // Evita que el formulario se envíe automáticamente
// Obtiene los valores de los campos del formulario
var formData = new FormData(document.getElementById("formulario"));
console.log("formData", [...formData.entries()]);
// Envía los datos al servidor utilizando Fetch API
fetch("http://localhost/0-MVC-SITE-v5-SOLICITUDES/EJERCICIOS-COMPONENTES/profesionistas.php", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
console.log(data); // Muestra la respuesta del servidor en la consola
if (data.status === "success") {
// Mostrar alerta de éxito
Swal.fire({
title: '¡Guardado!',
text: 'Los datos se han guardado correctamente.',
icon: 'success',
confirmButtonText: 'OK',
timer: 1000, // Se cierra automáticamente después de 3 segundos
timerProgressBar: true
});
// Si la respuesta del servidor es exitosa, actualiza la tabla
traer();
// Cerrar la ventana modal
var modal = bootstrap.Modal.getInstance(document.getElementById('formularioModal'));
modal.hide();
// Resetear el formulario
document.getElementById("formulario").reset();
} else {
// Mostrar alerta de error
Swal.fire({
title: 'Error',
text: data.message,
icon: 'error',
confirmButtonText: 'OK',
timer: 1000, // Se cierra automáticamente después de 3 segundos
timerProgressBar: true
});
}
})
.catch(error => {
console.error("Error:", error);
Swal.fire({
title: 'Error',
text: 'Hubo un problema al guardar los datos.',
icon: 'error',
confirmButtonText: 'OK'
});
});
});
// Evento para cargar los datos al iniciar la página
window.addEventListener("load", traer);
let datosGlobales = [];
let paginaActual = 1;
// Evento para manejar la búsqueda
document.getElementById('searchInput').addEventListener('input', function() {
paginaActual = 1;
mostrarTabla(datosGlobales);
});
// Evento para manejar la exportación a Excel
document.getElementById('exportButton').addEventListener('click', exportToExcel);
// Función para traer los datos del servidor
function traer() {
fetch("http://localhost/0-MVC-SITE-v5-SOLICITUDES/EJERCICIOS-COMPONENTES/profesionistas.php")
.then(res => res.json())
.then(datos => {
datosGlobales = datos;
mostrarTabla(datosGlobales);
})
.catch(error => console.error("Error:", error));
}
const filasPorPagina = 5;
function mostrarTabla(datos) {
const searchInput = document.getElementById('searchInput').value.toLowerCase();
const tbody = document.querySelector(".tabla");
tbody.innerHTML = '';
// Filtrar los datos según el texto de búsqueda
const datosFiltrados = datos.filter(item => {
return Object.values(item).some(value =>
value.toString().toLowerCase().includes(searchInput)
);
});
// Calcular el total de páginas
const totalPaginas = Math.ceil(datosFiltrados.length / filasPorPagina);
// Calcular el inicio y el fin de los datos que se mostrarán en la página actual
const inicio = (paginaActual - 1) * filasPorPagina;
const fin = inicio + filasPorPagina;
// Obtener los datos que se mostrarán en la página actual
const datosParaMostrar = datosFiltrados.slice(inicio, fin);
// Agrega las filas a la tabla
for (let valor of datosParaMostrar) {
tbody.innerHTML += `
<tr>
<td>${valor.id}</td>
<td>${valor.nombre}</td>
<td>${valor.correo}</td>
<td>${valor.celular}</td>
<td>${valor.tel_oficina}</td>
<td>${valor.horario_disponible}</td>
<td>${valor.fecha_registro}</td>
<td>${valor.cedula_profesional}</td>
<td>${valor.domicilio}</td>
</tr>`;
}
// Genera la paginación
generarPaginacion(totalPaginas);
}
// Función para generar la paginación
function generarPaginacion(totalPaginas) {
const paginationDiv = document.getElementById('pagination');//Seleccionar el Contenedor de Paginación:
paginationDiv.innerHTML = ''; // Limpiar el contenido previo de la paginación
// Crear un botón por cada página
for (let i = 1; i <= totalPaginas; i++) {
const boton = document.createElement('button'); // Crear un botón
boton.classList.add('btn', 'btn-primary', 'me-2'); // Añadir clases de Bootstrap para estilo
boton.innerText = i; // Establecer el número de página como texto del botón
boton.addEventListener('click', function() { // Añadir evento de clic al botón
paginaActual = i; // Establecer la página actual a la que se ha hecho clic
mostrarTabla(datosGlobales); // Mostrar los datos de la página actual
});
paginationDiv.appendChild(boton); // Añadir el botón al contenedor de paginación
}
}
/*
La función generarPaginacion crea dinámicamente botones de paginación basados en el número total de páginas (totalPaginas).
Cada botón, al ser clicado, actualiza la página actual (paginaActual) y refresca la tabla para mostrar los datos correspondientes a esa página.
Esto permite una navegación fácil y eficiente entre diferentes conjuntos de datos en la tabla.*/
// Función para exportar la tabla a un archivo Excel
function exportToExcel() {
const tabla = document.getElementById('tabla-datos');
const wb = XLSX.utils.table_to_book(tabla, {sheet: "Sheet1"});
XLSX.writeFile(wb, "TablaDatos.xlsx");
}
</script>
</body>
</html>
Comentarios
Publicar un comentario