feat(bandeja): filtros por fecha, nombre, # orden y estado

- Inputs desde/hasta pasan al API y filtran por rango de fechas
- Buscador cubre nombre, número de orden, código y examen
- API usa fecha cuando se pasa, sesión actual como fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-29 20:22:22 -05:00
co-authored by Claude Sonnet 4.6
parent 4cb133010a
commit 118e98b360
2 changed files with 23 additions and 14 deletions
+9 -4
View File
@@ -352,11 +352,13 @@ Layout::open('Bandeja del día', 'fas fa-layer-group');
<div class="bnd-wrap">
<div class="bnd-topbar">
<span class="bnd-title"><i class="fas fa-layer-group"></i> Bandeja del día</span>
<span class="bnd-title"><i class="fas fa-layer-group"></i> Bandeja</span>
<span class="bnd-chip bnd-chip-total" id="st-total"><i class="fas fa-users"></i> —</span>
<span class="bnd-chip bnd-chip-pend" id="st-pend"><i class="fas fa-clock"></i> Por revisar: —</span>
<span class="bnd-chip bnd-chip-vis" id="st-vis"><i class="fas fa-eye"></i> Vistos: —</span>
<span class="bnd-chip bnd-chip-mp" id="st-mp"><i class="fas fa-exclamation-triangle"></i> Muestras pend.: —</span>
<input type="date" id="bnd-desde" onchange="_bndRefrescarLista()" style="border:1px solid #cbd5e1;border-radius:6px;padding:3px 7px;font-size:.78rem;color:#475569;background:#fff;outline:none">
<input type="date" id="bnd-hasta" onchange="_bndRefrescarLista()" style="border:1px solid #cbd5e1;border-radius:6px;padding:3px 7px;font-size:.78rem;color:#475569;background:#fff;outline:none">
<select id="bnd-filtro-estado" onchange="_bndFiltrar()" style="border:1px solid #cbd5e1;border-radius:6px;padding:3px 8px;font-size:.78rem;color:#475569;background:#fff;cursor:pointer;outline:none">
<option value="">Todos los estados</option>
<option value="en_espera_lugar">En espera</option>
@@ -374,7 +376,7 @@ Layout::open('Bandeja del día', 'fas fa-layer-group');
<div class="bnd-body">
<div class="bnd-list">
<div class="bnd-search-box">
<input type="text" id="bnd-filtro" placeholder="Buscar por nombre o examen…" oninput="_bndFiltrar()" autocomplete="off">
<input type="text" id="bnd-filtro" placeholder="Nombre, # orden o examen…" oninput="_bndFiltrar()" autocomplete="off">
</div>
<div class="bnd-list-scroll" id="bnd-list-scroll">
<div class="bnd-section-hdr">Cargando...</div>
@@ -436,7 +438,10 @@ async function _bndRefrescarLista() {
spin.style.transform = 'rotate(360deg)';
setTimeout(()=>{ spin.style.transition=''; spin.style.transform=''; }, 400);
const res = await fetch(BND_API).then(r=>r.json()).catch(()=>null);
const desde = document.getElementById('bnd-desde')?.value || '';
const hasta = document.getElementById('bnd-hasta')?.value || '';
const qs = (desde && hasta) ? `?desde=${desde}&hasta=${hasta}` : '';
const res = await fetch(BND_API + qs).then(r=>r.json()).catch(()=>null);
if (!res?.ok) return;
_bndAllData = res;
@@ -453,7 +458,7 @@ function _bndFiltrar() {
const q = (document.getElementById('bnd-filtro')?.value || '').toLowerCase().trim();
const st = document.getElementById('bnd-filtro-estado')?.value || '';
const match = t =>
(!q || (t.paciente_nombre || '').toLowerCase().includes(q) || (t.examenes_txt || '').toLowerCase().includes(q)) &&
(!q || (t.paciente_nombre || '').toLowerCase().includes(q) || (t.examenes_txt || '').toLowerCase().includes(q) || String(t.numero_orden || '').includes(q) || (t.codigo || '').toLowerCase().includes(q)) &&
(!st || (st === 'muestras_pendientes' ? +t.muestras_pendientes > 0 : t.estado === st));
_renderLista(