feat: condición multi-valor en visibilidad condicional de formularios

Builder:
- Picker de valor ahora es <select multiple> — Ctrl+clic para varios
- Al re-editar un separador, los valores guardados quedan preseleccionados
- aplicarCampo() guarda siempre como condicion.valores (array)
- Badge en canvas muestra todos los valores separados por coma

form_cliente.php / iniciarCondiciones():
- Soporta tanto .valor (string legacy) como .valores (array nuevo)
- Evaluación: activo si CUALQUIER valor de la lista está marcado

BD (ya aplicado):
- Formulario id=15 actualizado con condiciones en los separadores
- Taukit → valor único; Heliprobe → valor único
- Glicemia/Prolactina/etc. → valores[] con todos los prolongados
- Cortisol AM/PM → valores[] para sección de tomas hora fija

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-23 23:35:03 -05:00
co-authored by Claude Sonnet 4.6
parent 21e7c6a836
commit 8bf3614fa0
2 changed files with 33 additions and 20 deletions
+5 -6
View File
@@ -1126,21 +1126,20 @@ function iniciarCondiciones(esquema) {
function evaluar() {
condicionales.forEach(sec => {
const { campo_id, valor } = sec.condicion;
// Leer valor del campo controlador
const { campo_id, valor, valores } = sec.condicion;
const valoresCond = valores ? valores : (valor ? [valor] : []);
const ctrl = document.querySelector(`[data-campo-id="${campo_id}"]`);
if (!ctrl) return;
let activo = false;
const checks = ctrl.querySelectorAll('input[type="checkbox"]');
if (checks.length) {
// checkbox múltiple: activo si alguno con ese valor está checked
checks.forEach(cb => { if (cb.value === valor && cb.checked) activo = true; });
checks.forEach(cb => { if (valoresCond.includes(cb.value) && cb.checked) activo = true; });
} else {
const radio = ctrl.querySelector(`input[type="radio"]:checked`);
const sel = ctrl.querySelector('select');
if (radio) activo = radio.value === valor;
else if (sel) activo = sel.value === valor;
const v = radio ? radio.value : (sel ? sel.value : '');
activo = valoresCond.includes(v);
}
// Mostrar u ocultar toda la sección