Dashboard del turnero: desglose por recepcionista y por bacteriólogo
This commit is contained in:
@@ -287,6 +287,18 @@ try {
|
||||
<div class="lugar-grid" id="lugarGrid"></div>
|
||||
</div>
|
||||
|
||||
<!-- Desglose por recepcionista -->
|
||||
<div class="section-card" id="sectionRecepcionista" style="display:none">
|
||||
<div class="section-title"><i class="fas fa-user-check me-1"></i>Por recepcionista</div>
|
||||
<div class="lugar-grid" id="recepcionistaGrid"></div>
|
||||
</div>
|
||||
|
||||
<!-- Desglose por bacteriólogo -->
|
||||
<div class="section-card" id="sectionBacteriologo" style="display:none">
|
||||
<div class="section-title"><i class="fas fa-user-nurse me-1"></i>Por bacteriólogo</div>
|
||||
<div class="lugar-grid" id="bacteriologoGrid"></div>
|
||||
</div>
|
||||
|
||||
<!-- Tabla detalle de turnos -->
|
||||
<div class="section-card">
|
||||
<div class="d-flex align-items-center justify-content-between mb-3 flex-wrap gap-2">
|
||||
@@ -445,7 +457,8 @@ function mostrarError(msg) {
|
||||
|
||||
// ── Render ───────────────────────────────────────────────────
|
||||
function renderDashboard(json) {
|
||||
const { sesion, resumen, por_prioridad, por_lugar, consent_stats = {}, turnos } = json;
|
||||
const { sesion, resumen, por_prioridad, por_lugar, consent_stats = {}, turnos,
|
||||
por_recepcionista = [], por_bacteriologo = [] } = json;
|
||||
|
||||
// ── Sesión info ────────────────────────────────────────
|
||||
const si = document.getElementById('sesionInfo');
|
||||
@@ -536,11 +549,41 @@ function renderDashboard(json) {
|
||||
secLug.style.display = 'none';
|
||||
}
|
||||
|
||||
// ── Tarjetas por persona ───────────────────────────────
|
||||
renderPersonas('sectionRecepcionista', 'recepcionistaGrid', por_recepcionista, [
|
||||
['Turnos', p => p.total],
|
||||
['Atendidos', p => p.atendidos],
|
||||
['Ausentes', p => p.ausentes],
|
||||
['T. recepción prom.', p => p.tiempo_promedio_min !== null ? p.tiempo_promedio_min + ' min' : '—'],
|
||||
]);
|
||||
|
||||
renderPersonas('sectionBacteriologo', 'bacteriologoGrid', por_bacteriologo, [
|
||||
['Turnos', p => p.total],
|
||||
['Finalizados', p => p.finalizados],
|
||||
['En servicio', p => p.en_servicio],
|
||||
['T. servicio prom.', p => p.tiempo_promedio_min !== null ? p.tiempo_promedio_min + ' min' : '—'],
|
||||
]);
|
||||
|
||||
// ── Tabla de turnos ────────────────────────────────────
|
||||
_turnos = turnos;
|
||||
renderTabla(turnos);
|
||||
}
|
||||
|
||||
// Tarjetas "quién atendió a cuántos". Reutiliza el grid de lugares para que
|
||||
// las tres secciones se vean iguales.
|
||||
function renderPersonas(sectionId, gridId, filas, columnas) {
|
||||
const sec = document.getElementById(sectionId);
|
||||
if (!filas || !filas.length) { sec.style.display = 'none'; return; }
|
||||
sec.style.display = '';
|
||||
document.getElementById(gridId).innerHTML = filas.map(p => `
|
||||
<div class="lugar-card">
|
||||
<div class="lc-name"><i class="fas fa-user text-primary me-1"></i>${escHtml(p.nombre || '—')}</div>
|
||||
${columnas.map(([lbl, val]) =>
|
||||
`<div class="lc-row"><span>${lbl}</span><span>${escHtml(String(val(p) ?? '—'))}</span></div>`
|
||||
).join('')}
|
||||
</div>`).join('');
|
||||
}
|
||||
|
||||
function kpiCard(val, lbl, sub) {
|
||||
return `<div class="kpi-card">
|
||||
<div class="kpi-val">${val !== null && val !== undefined ? escHtml(String(val)) : '—'}</div>
|
||||
|
||||
Reference in New Issue
Block a user