From 666a2e60b897d92edbe0a08163c3872d17c2c421 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:26:13 -0500 Subject: [PATCH] Revert "feat: soporte multi-archivo en modal Agendar Domicilio" This reverts commit 45ef99991b173ca3be236f1205e852c8ce934be9. --- conversations.php | 218 ++++++++++++++++++++++------------------------ 1 file changed, 105 insertions(+), 113 deletions(-) diff --git a/conversations.php b/conversations.php index 7490308..00037d9 100644 --- a/conversations.php +++ b/conversations.php @@ -6589,13 +6589,30 @@ if (!isUserLoggedIn()) { + + - + @@ -6850,10 +6867,10 @@ if (!isUserLoggedIn()) { // ══════════════════════════════════════════════════════════════════════════════ const labDomicilio = (() => { // Estado interno - let _msgId = null; - let _localFiles = []; // string[] — nombres de archivos ya en el servidor - let _newOrderFiles = []; // File[] — archivos nuevos pendientes de subir - let _convId = null; + let _msgId = null; + let _localFile = null; + let _newOrderFile = null; // nuevo archivo de orden cargado desde el modal + let _convId = null; let _pacienteId = null; let _isNewPaciente = false; // true = paciente nuevo (no existe en BD aún) let _pacNombre = ''; @@ -6945,9 +6962,9 @@ const labDomicilio = (() => { /* Abre el modal desde el botón del mensaje imagen */ abrir(msgId, localFile, convId) { - _msgId = msgId || null; - _localFiles = localFile ? [localFile] : []; - _convId = convId ? parseInt(convId) : null; + _msgId = msgId || null; + _localFile = localFile|| null; + _convId = convId ? parseInt(convId) : null; // Guardar también el userId actual para usarContacto cuando convId no esté disponible if (!_convId && typeof chatApp !== 'undefined' && chatApp.currentUserId) { _convId = '__user:' + chatApp.currentUserId; @@ -6956,7 +6973,7 @@ const labDomicilio = (() => { mostrarFormulario(); labDomicilio._resetFull(); - labDomicilio._renderFilesPanel(); + labDomicilio._updateOrdenPreview(); if (!_bsModal) _bsModal = new bootstrap.Modal('#modalAgendarDomicilio', { backdrop: true, keyboard: true }); _bsModal.show(); @@ -6967,10 +6984,10 @@ const labDomicilio = (() => { /* Reset completo (nombre paciente + todos los campos) */ _resetFull() { - _pacienteId = null; - _pacNombre = ''; - _histDirs = []; - _newOrderFiles = []; + _pacienteId = null; + _pacNombre = ''; + _histDirs = []; + _newOrderFile = null; $('labdom-pac-busq').value = ''; $('labdom-pac-list').style.display = 'none'; $('labdom-pac-buscar').classList.remove('d-none'); @@ -6992,94 +7009,71 @@ const labDomicilio = (() => { labDomicilio._resetDomicilio(); }, - /* Renderiza la lista de órdenes médicas adjuntas (soporta múltiples archivos) */ - _renderFilesPanel() { - const listDiv = document.getElementById('labdom-files-list'); + /* Actualiza la previa de orden médica en el modal (imagen o icono de archivo) */ + _updateOrdenPreview() { + const prevDiv = document.getElementById('labdom-img-prev'); const addBtn = document.getElementById('labdom-btn-add-orden'); - if (!listDiv) return; - const iconMap = { pdf: 'fas fa-file-pdf text-danger', doc: 'fas fa-file-word text-primary', docx: 'fas fa-file-word text-primary', mp4: 'fas fa-file-video text-warning', mkv: 'fas fa-file-video text-warning', mp3: 'fas fa-file-audio text-success', ogg: 'fas fa-file-audio text-success', webm: 'fas fa-file-video text-warning' }; - const total = _localFiles.length + _newOrderFiles.length; - if (total === 0) { - listDiv.classList.add('d-none'); - listDiv.innerHTML = ''; - if (addBtn) addBtn.innerHTML = 'Adjuntar orden médica (opcional)'; - return; - } - if (addBtn) addBtn.innerHTML = 'Añadir otro archivo'; - let html = '
'; - _localFiles.forEach((fname, i) => { - const isImg = /\.(jpg|jpeg|png|gif|webp|bmp)$/i.test(fname); - const ext = (fname || '').split('.').pop().toLowerCase(); - const iCls = iconMap[ext] || 'fas fa-file text-secondary'; - const thumb = isImg - ? `` - : ``; - html += `
-
${thumb}
- ${escLab(fname)} - -
`; - }); - _newOrderFiles.forEach((file, i) => { - const isImg = /^image\//.test(file.type); - const ext = file.name.split('.').pop().toLowerCase(); - const iCls = iconMap[ext] || 'fas fa-file text-secondary'; - const tid = `labdom-nth-${i}`; - const thumb = isImg - ? `` - : ``; - html += `
-
${thumb}
- ${escLab(file.name)} nuevo - -
`; - }); - html += '
'; - listDiv.innerHTML = html; - listDiv.classList.remove('d-none'); - // Cargar previsualizaciones de imágenes nuevas - _newOrderFiles.forEach((file, i) => { - if (/^image\//.test(file.type)) { - const img = document.getElementById(`labdom-nth-${i}`); - if (img) { const rd = new FileReader(); rd.onload = ev => { img.src = ev.target.result; }; rd.readAsDataURL(file); } + const imgEl = document.getElementById('labdom-img-el'); + const iconEl = document.getElementById('labdom-file-icon'); + const nameEl = document.getElementById('labdom-file-name'); + if (!prevDiv) return; + if (_localFile || _newOrderFile) { + prevDiv.style.display = ''; + if (addBtn) addBtn.style.display = 'none'; + const fileName = _newOrderFile ? _newOrderFile.name : (_localFile || ''); + if (nameEl) nameEl.textContent = fileName; + const isImage = /\.(jpg|jpeg|png|gif|webp|bmp)$/i.test(fileName); + if (isImage) { + if (imgEl) { + imgEl.style.display = ''; + if (_newOrderFile) { + const reader = new FileReader(); + reader.onload = ev => { imgEl.src = ev.target.result; }; + reader.readAsDataURL(_newOrderFile); + } else { + imgEl.src = `uploads/media/${_localFile}`; + } + } + if (iconEl) iconEl.style.display = 'none'; + } else { + if (imgEl) imgEl.style.display = 'none'; + if (iconEl) { + const ext = (fileName || '').split('.').pop().toLowerCase(); + const iconMap = { pdf: 'fas fa-file-pdf text-danger', doc: 'fas fa-file-word text-primary', docx: 'fas fa-file-word text-primary', mp4: 'fas fa-file-video text-warning', mkv: 'fas fa-file-video text-warning', mp3: 'fas fa-file-audio text-success', ogg: 'fas fa-file-audio text-success', webm: 'fas fa-file-video text-warning' }; + iconEl.innerHTML = ``; + iconEl.style.display = 'flex'; + } } - }); + } else { + prevDiv.style.display = 'none'; + if (addBtn) addBtn.style.display = ''; + } }, - /* Abre el selector de archivo para agregar una o más órdenes médicas */ - _agregarArchivo() { + /* Abre el selector de archivo para cambiar o agregar la orden médica */ + _cambiarOrden() { const inp = document.getElementById('labdom-orden-input'); if (!inp) return; const handler = (e) => { inp.removeEventListener('change', handler); - const files = e.target.files; - if (!files || !files.length) return; - for (const f of files) _newOrderFiles.push(f); - labDomicilio._renderFilesPanel(); + const file = e.target.files && e.target.files[0]; + if (!file) return; + _newOrderFile = file; + _localFile = null; + labDomicilio._updateOrdenPreview(); inp.value = ''; }; inp.addEventListener('change', handler); inp.click(); }, - /* Elimina un archivo concreto de la lista (local = del servidor, new = pendiente subir) */ - _eliminarArchivo(source, index) { - if (source === 'local') { - if (index === 0) _msgId = null; - _localFiles.splice(index, 1); - } else { - _newOrderFiles.splice(index, 1); - } - labDomicilio._renderFilesPanel(); - }, - - /* Mantiene compatibilidad con código externo que llame _eliminarOrden() */ + /* Elimina la orden médica adjunta */ _eliminarOrden() { - if (!confirm('¿Eliminar todas las órdenes médicas adjuntas?')) return; - _localFiles = []; - _newOrderFiles = []; - _msgId = null; - labDomicilio._renderFilesPanel(); + if (!confirm('¿Eliminar la orden médica adjunta?')) return; + _localFile = null; + _newOrderFile = null; + _msgId = null; + labDomicilio._updateOrdenPreview(); }, /* Muestra/oculta el campo «nombre del seguro» según la selección */ @@ -7416,23 +7410,22 @@ const labDomicilio = (() => { notas_admin: fv('labdom-notas') || null, }; - // Subir todos los archivos nuevos y añadirlos a _localFiles - for (const file of _newOrderFiles) { + // Subir nuevo archivo de orden si el usuario cambió o agregó uno desde el modal + if (_newOrderFile) { try { const fd = new FormData(); - fd.append('file', file); + fd.append('file', _newOrderFile); const upRes = await fetch('api/lab/upload_orden.php', { method: 'POST', body: fd }); const upData = await upRes.json(); if (upData.success && upData.local_file) { - _localFiles.push(upData.local_file); + _localFile = upData.local_file; + _newOrderFile = null; } } catch (_e) { /* silencioso — no bloquea el flujo */ } } - _newOrderFiles = []; - // Crear registro de orden por cada archivo y enlazarlo al domicilio - let firstOrdenId = null; - for (let _fi = 0; _fi < _localFiles.length; _fi++) { + // Si hay orden médica (original o recién subida), crear registro y enlazar + if (_localFile) { try { const convIdNum = (_convId && !String(_convId).startsWith('__user:')) ? parseInt(_convId) : null; @@ -7441,20 +7434,19 @@ const labDomicilio = (() => { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ paciente_id: _pacienteId, - local_file: _localFiles[_fi], - media_message_id: (_fi === 0 ? _msgId : null) || null, + local_file: _localFile, + media_message_id: _msgId || null, conversation_id: convIdNum, examenes_solicitados: datos.examenes_solicitados, estado: 'pendiente', }), }); const orData = await orRes.json(); - if (orData.success && orData.orden_id && firstOrdenId === null) { - firstOrdenId = orData.orden_id; + if (orData.success && orData.orden_id) { + datos.orden_id = orData.orden_id; } } catch (_) { /* no bloquea si falla la creación de la orden */ } } - if (firstOrdenId) datos.orden_id = firstOrdenId; try { const r = await fetch('api/lab/save_domicilio.php', { @@ -7606,9 +7598,9 @@ const labDomicilio = (() => { pacienteId: _pacienteId, pacNombre: _pacNombre, histDirs: [..._histDirs], - msgId: _msgId, - localFiles: [..._localFiles], - newOrderFiles: [..._newOrderFiles], + msgId: _msgId, + localFile: _localFile, + newOrderFile: _newOrderFile, cardVisible: !document.getElementById('labdom-pac-card')?.classList.contains('d-none'), pacInfo: { nombre: document.getElementById('labdom-pac-nombre')?.value || '', @@ -7691,13 +7683,13 @@ const labDomicilio = (() => { labDomicilio._resetFull(); // limpia el DOM // Restaurar estado interno DESPUÉS del reset (para que no se sobreescriba) - _convId = sesion.convId; - _pacienteId = sesion.pacienteId; - _pacNombre = sesion.pacNombre; - _histDirs = sesion.histDirs || []; - _msgId = sesion.msgId; - _localFiles = sesion.localFiles || []; - _newOrderFiles = sesion.newOrderFiles || []; + _convId = sesion.convId; + _pacienteId = sesion.pacienteId; + _pacNombre = sesion.pacNombre; + _histDirs = sesion.histDirs || []; + _msgId = sesion.msgId; + _localFile = sesion.localFile; + _newOrderFile = sesion.newOrderFile || null; // Restaurar campos del formulario const f = sesion.fields || {}; @@ -7742,7 +7734,7 @@ const labDomicilio = (() => { } labDomicilio._calcTotal(); - labDomicilio._renderFilesPanel(); + labDomicilio._updateOrdenPreview(); // Abrir el modal if (!_bsModal) _bsModal = new bootstrap.Modal('#modalAgendarDomicilio', { backdrop: true, keyboard: true });