From bf0fc39fee312a7081bf4aa1293465c74afd8493 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 10 Jul 2026 11:30:07 -0500 Subject: [PATCH] Fix: visibilidad de secciones de tomas por examen seleccionado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _mpApplyExamVisibility(): oculta/muestra secciones en el DOM usando sep_id de _mpAllGroups, sin depender de condicion en el esquema - Funciona aunque la BD no tenga condiciones restauradas aún - _restore_tomas_conditions.php: migración para restaurar condiciones en separadores usando prefijo del label vs opciones de _c8j2g16 Co-Authored-By: Claude Sonnet 4.6 --- _restore_tomas_conditions.php | 58 +++++++++++++++++++++++++++++++++++ ver_formulario_enviado.php | 48 ++++++++++++++++++++++++++--- 2 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 _restore_tomas_conditions.php diff --git a/_restore_tomas_conditions.php b/_restore_tomas_conditions.php new file mode 100644 index 0000000..bc427fb --- /dev/null +++ b/_restore_tomas_conditions.php @@ -0,0 +1,58 @@ +getConnection(); +$row = $pdo->query("SELECT esquema FROM lab_formularios WHERE id = 15 LIMIT 1")->fetch(PDO::FETCH_ASSOC); +if (!$row) { die('Formulario id=15 no encontrado.'); } + +$esquema = json_decode($row['esquema'], true); +if (!is_array($esquema)) { die('Esquema inválido.'); } + +// Obtener opciones del selector de examen +$examOptions = []; +foreach ($esquema as $c) { + if (($c['id'] ?? '') === '_c8j2g16') { $examOptions = $c['options'] ?? []; break; } +} +if (empty($examOptions)) { die('No se encontraron tipos de examen en _c8j2g16.'); } + +$restaurados = 0; +foreach ($esquema as &$campo) { + if (($campo['tipo'] ?? '') !== 'separador') continue; + if (isset($campo['condicion'])) continue; // ya tiene condicion + + $label = $campo['label'] ?? ''; + $prefix = trim(explode('·', $label)[0] ?? ''); + if (!$prefix) continue; + + // Buscar si el prefijo corresponde exactamente a un tipo de examen + if (in_array($prefix, $examOptions, true)) { + $campo['condicion'] = [ + 'campo_id' => '_c8j2g16', + 'valores' => [$prefix], + ]; + $restaurados++; + } +} +unset($campo); + +$pdo->prepare("UPDATE lab_formularios SET esquema = ? WHERE id = 15") + ->execute([json_encode($esquema, JSON_UNESCAPED_UNICODE)]); + +@unlink(__FILE__); + +echo '

+ ✅ Condiciones restauradas

+ ' . $restaurados . ' separadores actualizados con condicion sobre _c8j2g16.
+ Tipos de examen encontrados: ' . implode(', ', array_map('htmlspecialchars', $examOptions)) . '

+ Este archivo fue eliminado automáticamente.

+ ← Volver a Formularios +

'; diff --git a/ver_formulario_enviado.php b/ver_formulario_enviado.php index 808ec87..d2429b0 100644 --- a/ver_formulario_enviado.php +++ b/ver_formulario_enviado.php @@ -1288,23 +1288,63 @@ function _mpGetGroupsForExam(examName) { return result; } +// Visibilidad de secciones de tomas según examen seleccionado +// (funciona aunque la BD no tenga condiciones, usando sep_id de _mpAllGroups) +function _mpApplyExamVisibility(selectedExam) { + // Construir mapa sep_id → exam_name + var sepToExam = {}; + for (var gk in _mpAllGroups) { + var parts = gk.split('|').filter(Boolean); + var isExamGrp = parts.some(function(p) { return _mpExamOptions.indexOf(p) !== -1; }); + if (isExamGrp) { + _mpAllGroups[gk].forEach(function(sec) { + if (sec.sep_id) sepToExam[sec.sep_id] = parts[0]; + }); + } + } + if (!Object.keys(sepToExam).length) return; + + // Recorrer todos los elementos con data-campo-id dentro del doc-body + var docBody = document.querySelector('.doc-body'); + if (!docBody) return; + var inHidden = false; + docBody.querySelectorAll('[data-campo-id]').forEach(function(el) { + var cid = el.getAttribute('data-campo-id'); + if (el.classList.contains('esquema-sep')) { + if (sepToExam[cid] !== undefined) { + // Separador de toma: mostrar solo si es del examen seleccionado + inHidden = (sepToExam[cid] !== selectedExam); + el.style.display = inHidden ? 'none' : ''; + } else { + // Separador genérico (ej: Datos del paciente) — siempre visible + inHidden = false; + el.style.display = ''; + } + } else { + el.style.display = inHidden ? 'none' : ''; + } + }); +} + // Escuchar selección de tipo de examen document.addEventListener('change', function(e) { if (!_mpModoTurnero) return; - if (_mpTomasConfig !== null) return; // ya configurado var el = e.target; if (el.type !== 'radio' || el.name !== '_c8j2g16') return; var examName = el.value; - var groups = _mpGetGroupsForExam(examName); + _mpApplyExamVisibility(examName); + if (_mpTomasConfig !== null) return; // ya configurado, no mostrar panel + var groups = _mpGetGroupsForExam(examName); if (!Object.keys(groups).length) return; _mpShowCfgPanel(examName, groups); }); -// Si al cargar ya hay examen seleccionado pero sin _tomas_config → mostrar panel +// Al cargar: aplicar visibilidad si hay examen seleccionado document.addEventListener('DOMContentLoaded', function() { - if (!_mpModoTurnero || _mpTomasConfig !== null) return; var radio = document.querySelector('[name="_c8j2g16"]:checked'); if (!radio) return; + _mpApplyExamVisibility(radio.value); + if (!_mpModoTurnero || _mpTomasConfig !== null) return; var groups = _mpGetGroupsForExam(radio.value); if (Object.keys(groups).length) _mpShowCfgPanel(radio.value, groups); });