feat: crear nuevo paciente desde modal de agendamiento (enfermero portal)

This commit is contained in:
Lizandro Guarnizo
2026-03-12 23:18:31 -05:00
parent 2b46057ac1
commit e9c8cf7d9b
+116 -5
View File
@@ -743,6 +743,41 @@ document.addEventListener('DOMContentLoaded', () => {
<button type="button" class="btn btn-link btn-sm p-0 ms-1 text-danger"
onclick="agendaNueva.limpiarPaciente()">✕</button>
</div>
<!-- Crear nuevo paciente -->
<div id="na-crear-toggle" class="mt-2">
<button type="button" class="btn btn-link btn-sm p-0 text-success"
onclick="agendaNueva.toggleNuevoPac()">
<i class="fas fa-user-plus me-1"></i>
<span id="na-crear-toggle-txt">Crear nuevo paciente</span>
</button>
</div>
<div id="na-nuevo-pac-panel" class="d-none border rounded p-2 mt-2" style="background:#f0fff4">
<div class="small fw-semibold text-success mb-2">
<i class="fas fa-user-plus me-1"></i>Datos del nuevo paciente
</div>
<div class="mb-2">
<label class="form-label small mb-1">Nombre completo <span class="text-danger">*</span></label>
<input type="text" id="na-np-nombre" class="form-control form-control-sm"
placeholder="Juan Pérez García">
</div>
<div class="row g-2 mb-2">
<div class="col-6">
<label class="form-label small mb-1">Teléfono</label>
<input type="tel" id="na-np-telefono" class="form-control form-control-sm"
placeholder="3001234567">
</div>
<div class="col-6">
<label class="form-label small mb-1">Fecha nacimiento</label>
<input type="date" id="na-np-fnac" class="form-control form-control-sm">
</div>
</div>
<div>
<label class="form-label small mb-1">Correo electrónico</label>
<input type="email" id="na-np-email" class="form-control form-control-sm"
placeholder="paciente@correo.com">
</div>
</div>
</div>
<!-- Dirección -->
@@ -894,6 +929,7 @@ document.addEventListener('DOMContentLoaded', () => {
const agendaNueva = {
_modal: null,
_buscarTimer: null,
_nuevoPac: false,
init() {
this._modal = new bootstrap.Modal('#modalNuevaAgenda');
@@ -924,6 +960,15 @@ const agendaNueva = {
document.getElementById('na-paciente-elegido').classList.add('d-none');
document.getElementById('na-paciente-buscar').classList.remove('d-none');
document.getElementById('na-error').classList.add('d-none');
// Reset panel nuevo paciente
this._nuevoPac = false;
document.getElementById('na-nuevo-pac-panel').classList.add('d-none');
document.getElementById('na-np-nombre').value = '';
document.getElementById('na-np-telefono').value = '';
document.getElementById('na-np-fnac').value = '';
document.getElementById('na-np-email').value = '';
document.getElementById('na-crear-toggle-txt').textContent = 'Crear nuevo paciente';
document.getElementById('na-paciente-buscar').disabled = false;
const btn = document.getElementById('na-btn-guardar');
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i>Agendar';
@@ -977,6 +1022,11 @@ const agendaNueva = {
nombre + (telefono ? ` · ${telefono}` : '');
document.getElementById('na-paciente-elegido').classList.remove('d-none');
document.getElementById('na-sugerencias').classList.add('d-none');
// Ocultar panel nuevo paciente si estaba abierto
this._nuevoPac = false;
document.getElementById('na-nuevo-pac-panel').classList.add('d-none');
document.getElementById('na-crear-toggle-txt').textContent = 'Crear nuevo paciente';
document.getElementById('na-paciente-buscar').disabled = false;
// Siempre rellenar la dirección del paciente (editable)
if (direccion) document.getElementById('na-direccion').value = direccion;
if (barrio) document.getElementById('na-barrio').value = barrio;
@@ -988,23 +1038,84 @@ const agendaNueva = {
document.getElementById('na-paciente-id').value = '';
document.getElementById('na-paciente-buscar').value = '';
document.getElementById('na-paciente-elegido').classList.add('d-none');
document.getElementById('na-paciente-buscar').disabled = false;
document.getElementById('na-paciente-buscar').focus();
},
toggleNuevoPac() {
this._nuevoPac = !this._nuevoPac;
const panel = document.getElementById('na-nuevo-pac-panel');
const txt = document.getElementById('na-crear-toggle-txt');
const buscar = document.getElementById('na-paciente-buscar');
if (this._nuevoPac) {
panel.classList.remove('d-none');
txt.textContent = '← Buscar paciente existente';
// Limpiar selección previa
document.getElementById('na-paciente-id').value = '';
document.getElementById('na-paciente-elegido').classList.add('d-none');
buscar.value = '';
buscar.disabled = true;
document.getElementById('na-sugerencias').classList.add('d-none');
document.getElementById('na-np-nombre').focus();
} else {
panel.classList.add('d-none');
txt.textContent = 'Crear nuevo paciente';
buscar.disabled = false;
buscar.focus();
}
},
async guardar() {
const pacId = +document.getElementById('na-paciente-id').value;
const direccion = document.getElementById('na-direccion').value.trim();
const fecha = document.getElementById('na-fecha').value;
const pacIdInicial = +document.getElementById('na-paciente-id').value;
const direccion = document.getElementById('na-direccion').value.trim();
const fecha = document.getElementById('na-fecha').value;
document.getElementById('na-error').classList.add('d-none');
if (!pacId) { this._mostrarError('Selecciona un paciente de la lista.'); return; }
// Validaciones básicas
if (!pacIdInicial && !this._nuevoPac) {
this._mostrarError('Selecciona un paciente de la lista o crea uno nuevo.');
return;
}
if (!direccion) { this._mostrarError('La dirección es obligatoria.'); return; }
if (!fecha) { this._mostrarError('La fecha es obligatoria.'); return; }
if (!fecha) { this._mostrarError('La fecha es obligatoria.'); return; }
const btn = document.getElementById('na-btn-guardar');
btn.disabled = true;
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span>Guardando…';
let pacId = pacIdInicial;
// Si es paciente nuevo, crearlo primero
if (this._nuevoPac) {
const nombre = document.getElementById('na-np-nombre').value.trim();
if (!nombre) {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i>Agendar';
this._mostrarError('El nombre del nuevo paciente es obligatorio.');
return;
}
try {
const rPac = await fetch('api/lab/save_paciente.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
nombre_completo: nombre,
telefono: document.getElementById('na-np-telefono').value.trim() || null,
fecha_nacimiento: document.getElementById('na-np-fnac').value || null,
email: document.getElementById('na-np-email').value.trim() || null,
}),
});
const dPac = await rPac.json();
if (!dPac.success) throw new Error(dPac.error || 'Error al crear paciente');
pacId = dPac.id;
} catch (e) {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i>Agendar';
this._mostrarError('No se pudo crear el paciente: ' + e.message);
return;
}
}
const datos = {
paciente_id: pacId,
direccion,