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"
|
<button type="button" class="btn btn-link btn-sm p-0 ms-1 text-danger"
|
||||||
onclick="agendaNueva.limpiarPaciente()">✕</button>
|
onclick="agendaNueva.limpiarPaciente()">✕</button>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
|
|
||||||
<!-- Dirección -->
|
<!-- Dirección -->
|
||||||
@@ -894,6 +929,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
const agendaNueva = {
|
const agendaNueva = {
|
||||||
_modal: null,
|
_modal: null,
|
||||||
_buscarTimer: null,
|
_buscarTimer: null,
|
||||||
|
_nuevoPac: false,
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
this._modal = new bootstrap.Modal('#modalNuevaAgenda');
|
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-elegido').classList.add('d-none');
|
||||||
document.getElementById('na-paciente-buscar').classList.remove('d-none');
|
document.getElementById('na-paciente-buscar').classList.remove('d-none');
|
||||||
document.getElementById('na-error').classList.add('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');
|
const btn = document.getElementById('na-btn-guardar');
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i>Agendar';
|
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i>Agendar';
|
||||||
@@ -977,6 +1022,11 @@ const agendaNueva = {
|
|||||||
nombre + (telefono ? ` · ${telefono}` : '');
|
nombre + (telefono ? ` · ${telefono}` : '');
|
||||||
document.getElementById('na-paciente-elegido').classList.remove('d-none');
|
document.getElementById('na-paciente-elegido').classList.remove('d-none');
|
||||||
document.getElementById('na-sugerencias').classList.add('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)
|
// Siempre rellenar la dirección del paciente (editable)
|
||||||
if (direccion) document.getElementById('na-direccion').value = direccion;
|
if (direccion) document.getElementById('na-direccion').value = direccion;
|
||||||
if (barrio) document.getElementById('na-barrio').value = barrio;
|
if (barrio) document.getElementById('na-barrio').value = barrio;
|
||||||
@@ -988,23 +1038,84 @@ const agendaNueva = {
|
|||||||
document.getElementById('na-paciente-id').value = '';
|
document.getElementById('na-paciente-id').value = '';
|
||||||
document.getElementById('na-paciente-buscar').value = '';
|
document.getElementById('na-paciente-buscar').value = '';
|
||||||
document.getElementById('na-paciente-elegido').classList.add('d-none');
|
document.getElementById('na-paciente-elegido').classList.add('d-none');
|
||||||
|
document.getElementById('na-paciente-buscar').disabled = false;
|
||||||
document.getElementById('na-paciente-buscar').focus();
|
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() {
|
async guardar() {
|
||||||
const pacId = +document.getElementById('na-paciente-id').value;
|
const pacIdInicial = +document.getElementById('na-paciente-id').value;
|
||||||
const direccion = document.getElementById('na-direccion').value.trim();
|
const direccion = document.getElementById('na-direccion').value.trim();
|
||||||
const fecha = document.getElementById('na-fecha').value;
|
const fecha = document.getElementById('na-fecha').value;
|
||||||
document.getElementById('na-error').classList.add('d-none');
|
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 (!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');
|
const btn = document.getElementById('na-btn-guardar');
|
||||||
btn.disabled = true;
|
btn.disabled = true;
|
||||||
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span>Guardando…';
|
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 = {
|
const datos = {
|
||||||
paciente_id: pacId,
|
paciente_id: pacId,
|
||||||
direccion,
|
direccion,
|
||||||
|
|||||||
Reference in New Issue
Block a user