File "VisualizarAnexos.php.bak"
Full Path: C:/wamp64/www/sistemas/ManualAPP/VisualizarAnexos.php.bak
File size: 26.29 KB
MIME-type: text/x-php
Charset: utf-8
<?php
session_start();
header("Cache-control: private");
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$itemsPerPage = 30;
$dateFilter = isset($_GET['date']) ? $_GET['date'] : '';
$searchTerm = isset($_GET['search']) ? $_GET['search'] : '';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Visualizador de Manuales APP</title>
<link rel="icon" type="image/png" href="../img/icono1.png">
<meta name="author" content="Sebastian Obando">
<meta name="copyright" content="Sebastian Obando">
<!-- Bootstrap 5 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
body {
height: 100vh;
background-image: linear-gradient(to right, #FF8626, #025159);
padding-top: 20px;
padding-bottom: 20px;
}
.logo {
display: block;
margin: 0 auto 1.5rem;
}
.document-container {
border-radius: 20px;
background: #fff;
width: 100%;
max-width: 900px;
padding: 40px;
box-shadow: 10px 10px 20px 0 rgb(0 0 0 / 30%);
margin: 0 auto;
}
.document-card {
border: 2px solid #d9534f;
border-radius: 10px;
padding: 15px;
margin-bottom: 15px;
transition: all 0.3s ease;
}
.document-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
.document-card.selected {
background-color: #e3f2fd;
border-color: #2196f3;
}
.btn-view {
background-color: #5bc0de;
color: white;
border: none;
}
.btn-download {
background-color: #d9534f;
color: white;
border: none;
}
.btn-view:hover, .btn-download:hover {
opacity: 0.8;
}
h2 {
color: black;
text-align: center;
margin-bottom: 30px;
}
.search-container {
margin-bottom: 20px;
position: relative;
}
.search-input-container {
position: relative;
}
.clear-search {
position: absolute;
right: 45px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: #666;
cursor: pointer;
display: none;
z-index: 3;
}
.clear-search:hover {
color: #333;
}
.search-stats {
background: #f8f9fa;
padding: 10px 15px;
border-radius: 8px;
margin-bottom: 15px;
border-left: 4px solid #007bff;
}
.no-results {
display: none;
text-align: center;
padding: 40px 20px;
color: #666;
background: #f8f9fa;
border-radius: 10px;
margin: 20px 0;
}
.highlight {
background-color: #ffeb3b;
font-weight: bold;
padding: 2px 4px;
border-radius: 3px;
}
.loading {
opacity: 0.7;
pointer-events: none;
}
.keyboard-shortcut {
font-size: 0.8em;
color: #666;
margin-top: 5px;
}
.stats-badge {
background: #979393;
color: white;
padding: 5px 10px;
border-radius: 15px;
font-size: 0.85em;
margin-left: 10px;
}
/* Added pagination styles */
.pagination-container {
margin-top: 30px;
display: flex;
justify-content: center;
align-items: center;
gap: 15px;
}
.pagination-info {
background: #f8f9fa;
padding: 8px 15px;
border-radius: 20px;
font-size: 0.9em;
color: #666;
}
.date-filter-container {
background: #f8f9fa;
padding: 15px;
border-radius: 10px;
margin-bottom: 20px;
border-left: 4px solid #28a745;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.document-card {
animation: fadeIn 0.3s ease;
}
</style>
</head>
<body>
<div class="container">
<div class="document-container">
<!-- Logo -->
<img src="../img/LOGO.png" alt="" width="37" height="37" class="logo" style="width: 250px; height: auto;" />
<?php
$directorio = 'ANEXOS/';
$allFiles = array();
$totalDocuments = 0;
if(file_exists($directorio)) {
$archivos = scandir($directorio);
$archivos = array_diff($archivos, array('.', '..'));
// Filter files by date if specified
foreach($archivos as $archivo) {
$ruta_archivo = $directorio . $archivo;
$fileDate = date('Y-m-d', filemtime($ruta_archivo));
// Apply date filter if specified
if($dateFilter && $fileDate != $dateFilter) {
continue;
}
// Apply search filter if specified
if($searchTerm && stripos($archivo, $searchTerm) === false) {
continue;
}
$allFiles[] = array(
'name' => $archivo,
'path' => $ruta_archivo,
'date' => $fileDate,
'time' => filemtime($ruta_archivo)
);
}
// Sort by modification time (newest first)
usort($allFiles, function($a, $b) {
return $b['time'] - $a['time'];
});
$totalDocuments = count($allFiles);
$totalPages = ceil($totalDocuments / $itemsPerPage);
$offset = ($page - 1) * $itemsPerPage;
$currentPageFiles = array_slice($allFiles, $offset, $itemsPerPage);
}
?>
<h2>
Documentos Anexados
<span class="stats-badge" id="totalStats">
<i class="fas fa-file-alt"></i>
<?php echo $totalDocuments; ?> documentos
</span>
</h2>
<hr>
<div class="mb-4">
<a href="javascript:history.back()" class="btn btn-danger me-2">
<i class="fas fa-undo"></i> Regresar
</a>
<a href="../index.php" class="btn btn-warning me-2">
<i class="fas fa-house"></i> Menu
</a>
</div>
<!-- Added date filter form -->
<form method="GET" class="date-filter-container">
<div class="row align-items-end">
<div class="col-md-4">
<label for="dateFilter" class="form-label">
<i class="fas fa-calendar-alt"></i> Filtrar por fecha:
</label>
<input type="date"
id="dateFilter"
name="date"
class="form-control"
value="<?php echo htmlspecialchars($dateFilter); ?>">
</div>
<div class="col-md-4">
<label for="searchFilter" class="form-label">
<i class="fas fa-search"></i> Buscar por nombre:
</label>
<input type="text"
id="searchFilter"
name="search"
class="form-control"
placeholder="Nombre del archivo..."
value="<?php echo htmlspecialchars($searchTerm); ?>">
</div>
<div class="col-md-4">
<button type="submit" class="btn btn-primary me-2">
<i class="fas fa-filter"></i> Filtrar
</button>
<a href="?" class="btn btn-outline-secondary">
<i class="fas fa-times"></i> Limpiar
</a>
</div>
</div>
<?php if($dateFilter || $searchTerm): ?>
<div class="mt-2">
<small class="text-muted">
Filtros activos:
<?php if($dateFilter): ?>
<span class="badge bg-info">Fecha: <?php echo $dateFilter; ?></span>
<?php endif; ?>
<?php if($searchTerm): ?>
<span class="badge bg-info">Búsqueda: "<?php echo htmlspecialchars($searchTerm); ?>"</span>
<?php endif; ?>
</small>
</div>
<?php endif; ?>
</form>
<!-- Barra de búsqueda mejorada -->
<div class="search-container">
<div class="search-input-container">
<div class="input-group">
<input type="text"
id="searchInput"
class="form-control"
placeholder="Buscar documentos en tiempo real..."
aria-label="Buscar documento"
autocomplete="off">
<button class="clear-search" id="clearSearch" title="Limpiar búsqueda">
<i class="fas fa-times"></i>
</button>
<button class="btn btn-outline-secondary" type="button" id="searchButton">
<i class="fas fa-search"></i> Buscar
</button>
</div>
</div>
<div class="keyboard-shortcut">
<i class="fas fa-keyboard"></i>
<strong>Escape</strong> para limpiar
</div>
</div>
<!-- Estadísticas de búsqueda -->
<div class="search-stats" id="searchStats">
<i class="fas fa-chart-bar"></i>
Mostrando <span id="resultsCount"><?php echo count($currentPageFiles); ?></span>
de <span id="totalDocuments"><?php echo $totalDocuments; ?></span> documentos
<?php if($totalPages > 1): ?>
- Página <?php echo $page; ?> de <?php echo $totalPages; ?>
<?php endif; ?>
</div>
<!-- Mensaje sin resultados -->
<div id="noResults" class="no-results">
<i class="fas fa-search fa-3x mb-3" style="color: #ddd;"></i>
<h4>No se encontraron resultados</h4>
<p>Intenta con otros términos de búsqueda</p>
<button class="btn btn-outline-primary" onclick="clearSearch()">
<i class="fas fa-refresh"></i> Limpiar filtros
</button>
</div>
<div class="row" id="documentsContainer">
<?php
if(count($currentPageFiles) > 0) {
foreach($currentPageFiles as $fileInfo) {
$archivo = $fileInfo['name'];
$ruta_archivo = $fileInfo['path'];
$extension = strtolower(pathinfo($archivo, PATHINFO_EXTENSION));
$icono = "";
$puedeVisualizar = false;
// Asignar icono y determinar si se puede visualizar
switch($extension) {
case 'pdf':
$icono = "<i class='fas fa-file-pdf text-danger me-2'></i>";
$puedeVisualizar = true;
break;
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
$icono = "<i class='fas fa-file-image text-success me-2'></i>";
$puedeVisualizar = true;
break;
case 'txt':
$icono = "<i class='fas fa-file-alt text-info me-2'></i>";
$puedeVisualizar = true;
break;
case 'doc':
case 'docx':
$icono = "<i class='fas fa-file-word text-primary me-2'></i>";
$puedeVisualizar = false;
break;
case 'xls':
case 'xlsx':
$icono = "<i class='fas fa-file-excel text-success me-2'></i>";
$puedeVisualizar = false;
break;
default:
$icono = "<i class='fas fa-file text-secondary me-2'></i>";
$puedeVisualizar = false;
}
echo "
<div class='col-md-6 document-item' data-filename='".strtolower($archivo)."' data-date='{$fileInfo['date']}'>
<div class='document-card' onclick='selectDocument(this)'>
<div class='d-flex justify-content-between align-items-center'>
<div class='text-truncate flex-grow-1'>
{$icono}
<span class='fw-bold document-name' title='".htmlspecialchars($archivo)."'>" . htmlspecialchars($archivo) . "</span>
<br><small class='text-muted'><i class='fas fa-clock'></i> {$fileInfo['date']}</small>
</div>
<div class='btn-group'>
".($puedeVisualizar ?
"<a href='{$ruta_archivo}' target='_blank' class='btn btn-sm btn-view me-1' title='Visualizar documento'>
<i class='fas fa-eye'></i> Ver
</a>" : "")."
<a href='{$ruta_archivo}' download class='btn btn-sm btn-download' title='Descargar documento'>
<i class='fas fa-download'></i> Descargar
</a>
</div>
</div>
</div>
</div>";
}
} else {
if($dateFilter || $searchTerm) {
echo "<div class='col-12'>
<div class='alert alert-warning'>
<i class='fas fa-filter me-2'></i> No se encontraron documentos con los filtros aplicados.
</div>
</div>";
} else {
echo "<div class='col-12'>
<div class='alert alert-info'>
<i class='fas fa-info-circle me-2'></i> No hay documentos en la carpeta ANEXOS.
</div>
</div>";
}
}
?>
</div>
<!-- Added pagination controls -->
<?php if($totalPages > 1): ?>
<div class="pagination-container">
<div class="pagination-info">
Mostrando <?php echo ($offset + 1); ?> - <?php echo min($offset + $itemsPerPage, $totalDocuments); ?>
de <?php echo $totalDocuments; ?> documentos
</div>
<nav aria-label="Navegación de páginas">
<ul class="pagination mb-0">
<?php if($page > 1): ?>
<li class="page-item">
<a class="page-link" href="?page=<?php echo ($page-1); ?><?php echo $dateFilter ? '&date='.$dateFilter : ''; ?><?php echo $searchTerm ? '&search='.urlencode($searchTerm) : ''; ?>">
<i class="fas fa-chevron-left"></i> Anterior
</a>
</li>
<?php endif; ?>
<?php
$startPage = max(1, $page - 2);
$endPage = min($totalPages, $page + 2);
if($startPage > 1): ?>
<li class="page-item">
<a class="page-link" href="?page=1<?php echo $dateFilter ? '&date='.$dateFilter : ''; ?><?php echo $searchTerm ? '&search='.urlencode($searchTerm) : ''; ?>">1</a>
</li>
<?php if($startPage > 2): ?>
<li class="page-item disabled"><span class="page-link">...</span></li>
<?php endif; ?>
<?php endif; ?>
<?php for($i = $startPage; $i <= $endPage; $i++): ?>
<li class="page-item <?php echo ($i == $page) ? 'active' : ''; ?>">
<a class="page-link" href="?page=<?php echo $i; ?><?php echo $dateFilter ? '&date='.$dateFilter : ''; ?><?php echo $searchTerm ? '&search='.urlencode($searchTerm) : ''; ?>">
<?php echo $i; ?>
</a>
</li>
<?php endfor; ?>
<?php if($endPage < $totalPages): ?>
<?php if($endPage < $totalPages - 1): ?>
<li class="page-item disabled"><span class="page-link">...</span></li>
<?php endif; ?>
<li class="page-item">
<a class="page-link" href="?page=<?php echo $totalPages; ?><?php echo $dateFilter ? '&date='.$dateFilter : ''; ?><?php echo $searchTerm ? '&search='.urlencode($searchTerm) : ''; ?>">
<?php echo $totalPages; ?>
</a>
</li>
<?php endif; ?>
<?php if($page < $totalPages): ?>
<li class="page-item">
<a class="page-link" href="?page=<?php echo ($page+1); ?><?php echo $dateFilter ? '&date='.$dateFilter : ''; ?><?php echo $searchTerm ? '&search='.urlencode($searchTerm) : ''; ?>">
Siguiente <i class="fas fa-chevron-right"></i>
</a>
</li>
<?php endif; ?>
</ul>
</nav>
</div>
<?php endif; ?>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('searchInput');
const searchButton = document.getElementById('searchButton');
const clearButton = document.getElementById('clearSearch');
const documentItems = document.querySelectorAll('.document-item');
const noResults = document.getElementById('noResults');
const searchStats = document.getElementById('searchStats');
const resultsCount = document.getElementById('resultsCount');
const totalDocuments = document.getElementById('totalDocuments');
let isSearching = false;
const totalDocs = documentItems.length;
// Auto-focus en el campo de búsqueda
searchInput.focus();
// Función principal de filtrado (búsqueda en tiempo real)
function filterDocuments() {
if (isSearching) return;
isSearching = true;
searchButton.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Buscando...';
setTimeout(() => {
const searchTerm = searchInput.value.toLowerCase().trim();
let hasResults = false;
let visibleCount = 0;
clearButton.style.display = searchTerm ? 'block' : 'none';
documentItems.forEach(item => {
const documentName = item.querySelector('.document-name').textContent.toLowerCase();
const filename = item.getAttribute('data-filename');
if (documentName.includes(searchTerm) || filename.includes(searchTerm)) {
item.style.display = 'block';
hasResults = true;
visibleCount++;
highlightText(item.querySelector('.document-name'), searchTerm);
} else {
item.style.display = 'none';
removeHighlight(item.querySelector('.document-name'));
}
});
resultsCount.textContent = visibleCount;
if (searchTerm && !hasResults) {
noResults.style.display = 'block';
searchStats.style.display = 'none';
} else {
noResults.style.display = 'none';
searchStats.style.display = 'block';
}
searchButton.innerHTML = '<i class="fas fa-search"></i> Buscar';
isSearching = false;
}, 300);
}
function highlightText(element, searchTerm) {
if (!searchTerm) return;
const originalText = element.getAttribute('data-original') || element.textContent;
element.setAttribute('data-original', originalText);
const regex = new RegExp(`(${searchTerm})`, 'gi');
const highlightedText = originalText.replace(regex, '<span class="highlight">$1</span>');
element.innerHTML = highlightedText;
}
function removeHighlight(element) {
const originalText = element.getAttribute('data-original');
if (originalText) {
element.textContent = originalText;
}
}
function clearSearch() {
searchInput.value = '';
clearButton.style.display = 'none';
documentItems.forEach(item => {
item.style.display = 'block';
removeHighlight(item.querySelector('.document-name'));
});
resultsCount.textContent = totalDocs;
noResults.style.display = 'none';
searchStats.style.display = 'block';
searchInput.focus();
}
function selectDocument(card) {
document.querySelectorAll('.document-card').forEach(c => c.classList.remove('selected'));
card.classList.add('selected');
}
// Event listeners
searchButton.addEventListener('click', filterDocuments);
clearButton.addEventListener('click', clearSearch);
searchInput.addEventListener('input', function() {
clearTimeout(window.searchTimeout);
window.searchTimeout = setTimeout(filterDocuments, 300);
});
searchInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
filterDocuments();
}
});
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.key === 'f') {
e.preventDefault();
searchInput.focus();
searchInput.select();
}
if (e.key === 'Escape') {
clearSearch();
}
});
window.selectDocument = selectDocument;
window.clearSearch = clearSearch;
});
</script>
</body>
</html>