feat(turnero): selector de médico tratante en recepción, visible en toma de muestras
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
ec614c2a89
commit
d3826972ad
@@ -448,6 +448,27 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Médico tratante -->
|
||||
<div class="mt-2" id="bloque-medico">
|
||||
<div class="small fw-semibold text-secondary mb-1">
|
||||
<i class="fas fa-user-md me-1"></i>Médico tratante <span class="text-muted fw-normal">(opcional)</span>
|
||||
</div>
|
||||
<div id="medico-seleccionado" class="d-none mb-1">
|
||||
<span class="badge text-bg-light border" style="font-size:.8rem;padding:5px 9px" id="medico-badge-txt"></span>
|
||||
<button type="button" class="btn btn-link btn-sm p-0 ms-1 text-danger" onclick="quitarMedico()" title="Quitar médico"><i class="fas fa-times"></i></button>
|
||||
</div>
|
||||
<div id="medico-buscador">
|
||||
<input type="text" id="inp-buscar-medico" class="form-control form-control-sm"
|
||||
placeholder="Buscar por nombre, código o doc…"
|
||||
autocomplete="off" oninput="buscarMedico()">
|
||||
<div id="medico-dropdown" class="position-relative">
|
||||
<ul id="medico-resultados" class="list-unstyled mb-0 border rounded bg-white shadow-sm position-absolute w-100 d-none"
|
||||
style="z-index:200;max-height:180px;overflow-y:auto;top:2px"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" id="inp-medico-id">
|
||||
</div>
|
||||
|
||||
<!-- Historial colapsable del paciente -->
|
||||
<div id="sec-historial-pac" class="d-none">
|
||||
<button class="hist-toggle-btn" id="btn-hist-toggle" onclick="toggleHistorialPaciente()">
|
||||
@@ -1328,6 +1349,7 @@ async function guardarSolicitud() {
|
||||
observaciones: document.getElementById('inp-obs').value.trim() || null,
|
||||
embarazada: document.getElementById('chk-embarazada').checked ? 1 : 0,
|
||||
solo_muestras: soloMuestras ? 1 : 0,
|
||||
medico_id: parseInt(document.getElementById('inp-medico-id').value) || null,
|
||||
}),
|
||||
});
|
||||
const json = await res.json();
|
||||
@@ -1672,6 +1694,53 @@ async function soltarTurno() {
|
||||
}
|
||||
|
||||
// ── Helpers ───────────────────────────────────────────────────
|
||||
// ── Médico tratante ─────────────────────────────────────────────
|
||||
let _medicoTimer = null;
|
||||
const API_MEDICOS = '<?= BASE_URL ?>modules/medicos/api/list.php';
|
||||
|
||||
function buscarMedico() {
|
||||
clearTimeout(_medicoTimer);
|
||||
const q = document.getElementById('inp-buscar-medico').value.trim();
|
||||
const ul = document.getElementById('medico-resultados');
|
||||
if (q.length < 2) { ul.classList.add('d-none'); ul.innerHTML = ''; return; }
|
||||
_medicoTimer = setTimeout(async () => {
|
||||
const res = await fetch(API_MEDICOS + '?q=' + encodeURIComponent(q));
|
||||
const json = await res.json();
|
||||
const rows = (json.data || []).slice(0, 8);
|
||||
if (!rows.length) { ul.innerHTML = '<li class="px-3 py-2 text-muted small">Sin resultados</li>'; ul.classList.remove('d-none'); return; }
|
||||
ul.innerHTML = rows.map(m =>
|
||||
`<li class="px-3 py-2 small" style="cursor:pointer;border-bottom:1px solid #f1f5f9"
|
||||
onmousedown="seleccionarMedico(${m.id},'${escJs(m.codigo)}','${escJs(m.nombres)} ${escJs(m.apellidos)}','${escJs(m.cod_especialidad||'')}')">
|
||||
<span class="fw-semibold">${esc(m.nombres)} ${esc(m.apellidos)}</span>
|
||||
<span class="text-muted ms-1">[${esc(m.codigo)}]</span>
|
||||
${m.cod_especialidad ? `<span class="badge text-bg-light ms-1" style="font-size:.7rem">${esc(m.cod_especialidad)}</span>` : ''}
|
||||
</li>`
|
||||
).join('');
|
||||
ul.classList.remove('d-none');
|
||||
}, 250);
|
||||
}
|
||||
|
||||
function seleccionarMedico(id, codigo, nombre, esp) {
|
||||
document.getElementById('inp-medico-id').value = id;
|
||||
document.getElementById('medico-badge-txt').textContent = nombre + (esp ? ' · ' + esp : '') + ' [' + codigo + ']';
|
||||
document.getElementById('medico-seleccionado').classList.remove('d-none');
|
||||
document.getElementById('medico-buscador').classList.add('d-none');
|
||||
document.getElementById('medico-resultados').classList.add('d-none');
|
||||
}
|
||||
|
||||
function quitarMedico() {
|
||||
document.getElementById('inp-medico-id').value = '';
|
||||
document.getElementById('medico-seleccionado').classList.add('d-none');
|
||||
document.getElementById('medico-buscador').classList.remove('d-none');
|
||||
document.getElementById('inp-buscar-medico').value = '';
|
||||
}
|
||||
|
||||
function resetMedico() {
|
||||
quitarMedico();
|
||||
}
|
||||
|
||||
function escJs(s) { return String(s||'').replace(/\\/g,'\\\\').replace(/'/g,"\\'"); }
|
||||
|
||||
function toggleSoloMuestras() {
|
||||
const solo = document.getElementById('chk-solo-muestras').checked;
|
||||
document.querySelectorAll('.exam-chk').forEach(c => { c.checked = false; c.disabled = solo; });
|
||||
@@ -1686,6 +1755,7 @@ function resetCheckboxes() {
|
||||
document.getElementById('inp-total').value = '';
|
||||
document.getElementById('inp-obs').value = '';
|
||||
resetPagoCombinado();
|
||||
resetMedico();
|
||||
}
|
||||
function toggleTodosExamenes(val) {
|
||||
document.querySelectorAll('.exam-chk').forEach(c => c.checked = val);
|
||||
|
||||
Reference in New Issue
Block a user