This commit is contained in:
Lizandro Guarnizo
2026-06-16 15:03:40 -05:00
parent eaa8a23af6
commit 6be28ae5af
3 changed files with 200 additions and 3 deletions
+60 -3
View File
@@ -94,6 +94,17 @@ Layout::open('Historial de Turnos', 'fas fa-history');
.detail-item { background:#fff; border:1px solid #e2e8f0; border-radius:8px; padding:8px 12px; }
.detail-item .d-lbl { font-size:.67rem; text-transform:uppercase; letter-spacing:.07em; color:#94a3b8; }
.detail-item .d-val { font-size:.85rem; font-weight:600; color:#1e293b; }
/* ── Documentos firmados ── */
.docs-section { margin-top:10px; padding-top:10px; border-top:1px solid #e2e8f0; }
.docs-lbl { font-size:.65rem; font-weight:700; text-transform:uppercase; letter-spacing:.07em; color:#94a3b8; margin-bottom:5px; }
.doc-pill { display:inline-flex; align-items:center; gap:4px; padding:3px 10px; border-radius:99px;
font-size:.73rem; font-weight:600; margin:2px 2px; text-decoration:none; transition:opacity .15s; }
.doc-pill:hover { opacity:.8; }
.doc-pill.firmado { background:#dcfce7; color:#166534; border:1px solid #bbf7d0; }
.doc-pill.enviado { background:#fef9c3; color:#78350f; border:1px solid #fde68a; }
.doc-pill.pendiente{ background:#f1f5f9; color:#64748b; border:1px solid #e2e8f0; }
.docs-empty { font-size:.78rem; color:#94a3b8; font-style:italic; }
</style>
<!-- ── Encabezado ────────────────────────────────────────────── -->
@@ -414,8 +425,8 @@ function renderTabla(turnos) {
<td class="text-nowrap small text-muted">${horaEnt}</td>
<td>
<button class="btn btn-sm btn-outline-secondary py-0 px-2"
onclick="toggleDetalle('${rowId}', this)"
title="Ver detalles de timestamps">
onclick="toggleDetalle('${rowId}', this, ${t.id})"
title="Ver detalles">
<i class="fas fa-chevron-down" style="font-size:.65rem"></i>
</button>
</td>
@@ -452,10 +463,14 @@ function renderDetalle(t) {
<div class="d-lbl">${it.lbl}</div>
<div class="d-val">${it.val}</div>
</div>`).join('')}
</div>
<div class="docs-section" id="docs-${t.id}">
<div class="docs-lbl"><i class="fas fa-file-signature me-1"></i>Documentos</div>
<span class="text-muted small"><i class="fas fa-spinner fa-spin me-1"></i>Cargando…</span>
</div>`;
}
function toggleDetalle(rowId, btn) {
function toggleDetalle(rowId, btn, turnoId) {
const row = document.getElementById(rowId);
const icon = btn.querySelector('i');
if (!row) return;
@@ -463,6 +478,48 @@ function toggleDetalle(rowId, btn) {
row.style.display = visible ? 'none' : '';
icon.className = visible ? 'fas fa-chevron-down' : 'fas fa-chevron-up';
icon.style.fontSize = '.65rem';
if (!visible && turnoId) {
const docsEl = document.getElementById(`docs-${turnoId}`);
if (docsEl && !docsEl.dataset.loaded) {
docsEl.dataset.loaded = '1';
cargarDocumentosTurno(turnoId, docsEl);
}
}
}
const BASE_URL_ROOT = '<?= BASE_URL ?>';
async function cargarDocumentosTurno(turnoId, container) {
try {
const res = await fetch(`${API}get_consentimientos.php?turno_id=${turnoId}`);
const json = await res.json();
if (!json.ok) { container.querySelector('span').textContent = 'Error al cargar'; return; }
const list = json.consentimientos || [];
if (!list.length) {
container.innerHTML = '<div class="docs-lbl"><i class="fas fa-file-signature me-1"></i>Documentos</div>'
+ '<span class="docs-empty">Sin documentos para este turno</span>';
return;
}
const LBLS = { firmado:'Firmado', enviado:'Enviado', visto:'Visto', pendiente:'Pendiente' };
const pills = list.map(c => {
const est = c.estado || 'pendiente';
const nombre = esc(c.formulario_nombre || 'Documento');
if (est === 'firmado' && c.token) {
const url = BASE_URL_ROOT + 'ver_formulario_enviado.php?token=' + encodeURIComponent(c.token);
return `<a class="doc-pill firmado" href="${url}" target="_blank">
<i class="fas fa-check-circle"></i>${nombre}
<i class="fas fa-external-link-alt ms-1" style="font-size:.6rem;opacity:.6"></i>
</a>`;
}
const cls = est === 'enviado' || est === 'visto' ? 'enviado' : 'pendiente';
const ico = est === 'enviado' ? 'fa-paper-plane' : (est === 'visto' ? 'fa-eye' : 'fa-clock');
return `<span class="doc-pill ${cls}"><i class="fas ${ico}"></i>${nombre}</span>`;
}).join('');
container.innerHTML = '<div class="docs-lbl"><i class="fas fa-file-signature me-1"></i>Documentos</div>' + pills;
} catch(_) {
const sp = container.querySelector('span');
if (sp) sp.textContent = 'Error de conexión';
}
}
// ── Paginación ────────────────────────────────────────────────