feat(turnero): botón de llamado por registro en lugar/toma de muestras

- Agrega botón campana por cada card en cola (solo turnos en_espera_lugar)
- Click en card abre ficha sin llamar; campana llama ese turno específico
- Llamar siguiente ahora también llama de verdad (antes solo abría ficha)
- Cards en_servicio mantienen indicador de estetoscopio sin botón

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-02 23:25:34 -05:00
co-authored by Claude Sonnet 4.6
parent 6adbcc3059
commit 910edeb876
+11 -11
View File
@@ -448,18 +448,20 @@ function renderCola(snap) {
lista.innerHTML = items.map(t => {
const enServicio = t.estado === 'en_servicio';
const esActivo = turnoActivo?.id == t.id;
const onclick = enServicio
? `seleccionarSinLlamar(${t.id})`
: `seleccionarSinLlamar(${t.id})`;
const indicador = enServicio
? `<div class="ms-auto d-flex flex-column align-items-center" style="gap:1px">
? `<div class="ms-auto d-flex flex-column align-items-center" style="gap:1px;flex-shrink:0">
<i class="fas fa-stethoscope text-success" style="font-size:.85rem"></i>
<span style="font-size:.58rem;color:#16a34a;font-weight:700">EN SERVICIO</span>
</div>`
: `<i class="fas fa-chevron-right text-muted ms-auto" style="font-size:.7rem"></i>`;
: `<button onclick="event.stopPropagation();llamarTurnoEspecifico(${t.id})"
title="Llamar turno ${escHtml(t.codigo)}"
style="flex-shrink:0;background:#2563eb;border:none;color:#fff;
border-radius:7px;padding:5px 9px;font-size:.78rem;cursor:pointer">
<i class="fas fa-bell"></i>
</button>`;
return `
<div class="cola-card ${enServicio ? 'en-servicio-card' : ''} ${esActivo ? 'activo' : ''}"
style="cursor:pointer" onclick="${onclick}"
style="cursor:pointer" onclick="seleccionarSinLlamar(${t.id})"
title="${enServicio ? 'Ver turno en servicio' : `Ver turno ${escHtml(t.codigo)}`}">
<div class="prio-dot" style="background:${t.prioridad_color}">${t.prioridad_codigo}</div>
<div class="turno-info">
@@ -503,15 +505,13 @@ async function rellamarDesdeCard(turnoId) {
await abrirFicha(json.turno);
}
// ── Llamar siguiente: selecciona el primero en espera sin llamarlo
// ── Llamar siguiente: llama al primero en espera ─────────────
async function llamarSiguiente() {
const primero = [..._colaMap.values()].find(t => t.estado === 'en_espera_lugar');
if (!primero) { mostrarToast('Cola vacía — no hay turnos en espera.', 'warn', 3000); return; }
await seleccionarSinLlamar(primero.id);
await _llamar({});
}
async function llamarTurnoEspecifico(turnoId) {
await seleccionarSinLlamar(turnoId);
await _llamar({ turno_id: turnoId });
}
async function _llamar(extra) {