Fix: visibilidad de secciones de tomas por examen seleccionado

- _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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-10 11:30:07 -05:00
co-authored by Claude Sonnet 4.6
parent da2b67589e
commit bf0fc39fee
2 changed files with 102 additions and 4 deletions
+58
View File
@@ -0,0 +1,58 @@
<?php
/**
* Restaura las condiciones eliminadas por _migrate_tomas_simplify.php
* Para cada separador cuyo label empiece con un tipo de examen conocido
* (ej. "Curva de Glicemia · Minuto 0") → agrega condicion sobre _c8j2g16.
* Auto-elimina al ejecutar. Acceder como admin.
*/
require_once __DIR__ . '/config/config.php';
if (!isUserLoggedIn() || !in_array($_SESSION['admin_user']['role'] ?? '', ['admin','superadmin'], true)) {
http_response_code(403); die('Acceso denegado.');
}
$pdo = Database::getInstance()->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 '<p style="font-family:sans-serif;padding:2rem">
<span style="color:green;font-size:1.2rem">✅ Condiciones restauradas</span><br><br>
<strong>' . $restaurados . ' separadores</strong> actualizados con condicion sobre _c8j2g16.<br>
<small style="color:#666">Tipos de examen encontrados: ' . implode(', ', array_map('htmlspecialchars', $examOptions)) . '</small><br><br>
<small style="color:#999">Este archivo fue eliminado automáticamente.</small><br><br>
<a href="lab_formularios.php" style="color:#0d6efd">← Volver a Formularios</a>
</p>';
+44 -4
View File
@@ -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);
});