diff --git a/ver_formulario_enviado.php b/ver_formulario_enviado.php index 576b763..7930bde 100644 --- a/ver_formulario_enviado.php +++ b/ver_formulario_enviado.php @@ -1037,6 +1037,10 @@ function _addExamWizardHtml(string $cid): string { $_saltarSeccion = false; $_mpSkipSec = false; // toma excluida por _tomas_config; siempre ocultar sin importar modoEditar + // Atributos heredados por los campos de la sección actual. Sin esto, una + // sección cuya condición no se cumple ocultaba solo su encabezado y dejaba + // sus campos (hora, observaciones, firma) sueltos y visibles. + $_secAttr = ''; foreach ($esquema as $campo): $tipo = $campo['tipo'] ?? ''; if ($tipo === 'separador'): @@ -1056,6 +1060,10 @@ function _addExamWizardHtml(string $cid): string { $_saltarSeccion = true; $_mpSkipSec = true; } + // La sección queda en el DOM (el JS puede mostrarla si cambian de examen) + // pero oculta, y sus campos heredan el mismo estado. + $_secAttr = ' data-sep-id="' . esc2($campo['id'] ?? '') . '"' + . (($_saltarSeccion && $modoEditar) ? ' style="display:none"' : ''); if (($_saltarSeccion && !$modoEditar) || $_mpSkipSec) continue; ?>
>
@@ -1102,8 +1110,8 @@ function _addExamWizardHtml(string $cid): string { $_firmaGlobalPacienteUsada = true; } ?> -
-
+
> +
>
@@ -1205,7 +1213,7 @@ function _addExamWizardHtml(string $cid): string { if ($tipo === 'parrafo'): $ws = !empty($campo['flujoLibre']) ? 'normal' : 'pre-wrap'; ?> -
+
>
$rendered = nl2br(htmlspecialchars($rendered, ENT_QUOTES)); ?> -
+
>
-
+
> @@ -1261,7 +1269,7 @@ function _addExamWizardHtml(string $cid): string { if ($tipo === 'radio'): $opts = $campo['opciones'] ?? $campo['options'] ?? []; ?> -
+
>
@@ -1283,7 +1291,7 @@ function _addExamWizardHtml(string $cid): string { $checkedArr = is_array($prefill) ? $prefill : (is_string($prefill) && $prefill !== '' ? (json_decode($prefill, true) ?: [$prefill]) : []); ?> -
+
>
@@ -1303,7 +1311,7 @@ function _addExamWizardHtml(string $cid): string { if ($tipo === 'select'): $opts = $campo['opciones'] ?? $campo['options'] ?? []; ?> -
+
>
-
+
> @@ -1699,7 +1707,12 @@ function _mpGetGroupsForExam(examName) { // Visibilidad de secciones de tomas según examen seleccionado. // Oculta TODOS los sep_ids de _mpAllGroups por defecto; // muestra solo los del grupo cuya clave coincide con el examen. -function _mpApplyExamVisibility(selectedExam) { +// Acepta un examen o varios: un paciente puede tener Glicemia y Prolactina a la +// vez, y cada uno aporta sus propias secciones de toma. +function _mpApplyExamVisibility(selectedExams) { + var exams = selectedExams == null ? [] + : (Array.isArray(selectedExams) ? selectedExams : [selectedExams]); + // 1. Todos los sep_ids que son secciones de toma var allTomaSeps = {}; for (var gk in _mpAllGroups) { @@ -1707,16 +1720,19 @@ function _mpApplyExamVisibility(selectedExam) { } if (!Object.keys(allTomaSeps).length) return; - // 2. Sep_ids del examen seleccionado + // 2. Sep_ids de todos los exámenes seleccionados var examSeps = {}; - if (selectedExam) { - var groups = _mpGetGroupsForExam(selectedExam); + exams.forEach(function(ex) { + if (!ex) return; + var groups = _mpGetGroupsForExam(ex); for (var gk2 in groups) { groups[gk2].forEach(function(s) { if (s.sep_id) examSeps[s.sep_id] = true; }); } - } + }); - // 3. Recorrer hijos directos del contenedor de campos (.campos-grid) + // 3. Recorrer hijos directos del contenedor de campos (.campos-grid). + // Los campos llevan data-sep-id, así que se ocultan junto a su encabezado + // en vez de quedar sueltos cuando la sección no aplica. var container = document.querySelector('.campos-grid') || document.querySelector('.doc-body'); if (!container) return; var inHidden = false; @@ -1724,17 +1740,23 @@ function _mpApplyExamVisibility(selectedExam) { if (child.classList.contains('esquema-sep')) { var cid = child.getAttribute('data-campo-id') || ''; inHidden = allTomaSeps[cid] !== undefined ? !examSeps[cid] : false; - child.style.display = inHidden ? 'none' : ''; } else { - child.style.display = inHidden ? 'none' : ''; + var sid = child.getAttribute('data-sep-id'); + if (sid && allTomaSeps[sid] !== undefined) inHidden = !examSeps[sid]; } + child.style.display = inHidden ? 'none' : ''; }); } -// Helper: leer examen seleccionado (funciona para radio name=_c8j2g16 y checkbox name=_c8j2g16[]) +// Helper: exámenes seleccionados (radio name=_c8j2g16 o checkbox name=_c8j2g16[]) +function _mpGetExamNames() { + return Array.from(document.querySelectorAll('[name="_c8j2g16"]:checked,[name="_c8j2g16[]"]:checked')) + .map(function(el) { return el.value; }); +} +// Compatibilidad: primer examen seleccionado function _mpGetExamName() { - var el = document.querySelector('[name="_c8j2g16"]:checked,[name="_c8j2g16[]"]:checked'); - return el ? el.value : null; + var n = _mpGetExamNames(); + return n.length ? n[0] : null; } function _mpSetExamChecked(name) { var esc = name.replace(/"/g, '\\"'); @@ -1783,8 +1805,7 @@ function _mpRenderBadges() { document.addEventListener('change', function(e) { var el = e.target; if (el.name.replace(/\[\]$/, '') !== '_c8j2g16') return; - var examName = _mpGetExamName(); - _mpApplyExamVisibility(examName); + _mpApplyExamVisibility(_mpGetExamNames()); if (_mpModoTurnero) _mpRenderBadges(); }); @@ -1810,7 +1831,9 @@ document.addEventListener('DOMContentLoaded', function() { if (!examName) examName = saved.split('||').filter(Boolean)[0] || ''; } } catch(e) {} - _mpApplyExamVisibility(examName); + // Los checkboxes ya quedaron restaurados arriba: aplicar sobre todos los + // marcados, no solo el primero. + _mpApplyExamVisibility(_mpGetExamNames()); if (_mpModoTurnero) { _mpRenderBadges(); // Auto-abrir solo si hay un examen sin configurar (nuevo). Si todos configurados, no abrir. @@ -2188,6 +2211,10 @@ function _mpRefreshCards(signedFid, nextFid) { // Auto-scroll y auto-fill hora a la primera firma pendiente al cargar document.addEventListener('DOMContentLoaded', function() { + // Aplicar visibilidad al abrir: antes solo corría al cambiar el examen o al + // usar el panel de configuración, así que un formulario ya configurado que se + // abría desde bandeja o historial mostraba secciones que no correspondían. + _mpApplyExamVisibility(_mpGetExamNames()); _mpRenderCards(); setTimeout(function() { var fw = document.querySelector('.firma-pro-widget:not([style*="display:none"])');