feat: crear nuevo paciente desde modal de agendamiento (enfermero portal)
This commit is contained in:
+116
-5
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user