diff --git a/form_cliente.php b/form_cliente.php index b9ada7c..66fd770 100644 --- a/form_cliente.php +++ b/form_cliente.php @@ -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 diff --git a/lab_formulario_builder.php b/lab_formulario_builder.php index 2a017fd..0b6da64 100644 --- a/lab_formulario_builder.php +++ b/lab_formulario_builder.php @@ -708,7 +708,7 @@ function renderPreview() { function renderCampoPreview(c) { if (c.tipo === 'separador') { const condBadge = c.condicion - ? ` si: ${esc(c.condicion.valor)}` + ? (()=>{ const vs=(c.condicion.valores||[c.condicion.valor]).join(', '); return ` si: ${esc(vs)}`; })() : ''; return `
${esc(c.label)}${condBadge}
`; } @@ -786,30 +786,33 @@ function abrirEditorCampo(idx) { const camposOpciones = _campos.filter(f => ['checkbox','radio','select'].includes(f.tipo) && f.id !== c.id && (f.options||[]).length ); - const condCampoId = c.condicion?.campo_id || ''; - const condValor = c.condicion?.valor || ''; - const campoCtrl = camposOpciones.find(f => f.id === condCampoId); - const optsCtrl = campoCtrl ? (campoCtrl.options||[]) : []; + const condCampoId = c.condicion?.campo_id || ''; + // soporta tanto valor (string) como valores (array) + const condValores = c.condicion?.valores || (c.condicion?.valor ? [c.condicion.valor] : []); + const campoCtrl = camposOpciones.find(f => f.id === condCampoId); + const optsCtrl = campoCtrl ? (campoCtrl.options||[]) : []; const optsCampos = camposOpciones.map(f => `` ).join(''); const optsValores = optsCtrl.map(o => - `` + `` ).join(''); html += `
-
Esta sección (y los campos hasta el siguiente separador) se muestra solo si se cumple la condición.
+
Se muestra si alguno de los valores seleccionados está marcado en el campo elegido. Ctrl+clic para selección múltiple.
- ${optsValores} +
Ctrl+clic para marcar varios valores.
`; } else if (c.tipo === 'linked') { html += `
@@ -913,12 +916,19 @@ function abrirEditorCampo(idx) { function actualizarOpcionesCondicion(campoId) { const selValor = document.getElementById('ce-cond-valor'); if (!selValor) return; - if (!campoId) { selValor.innerHTML = ''; selValor.disabled = true; return; } + if (!campoId) { + selValor.innerHTML = ''; + selValor.disabled = true; + selValor.style.opacity = '.4'; + selValor.style.pointerEvents = 'none'; + return; + } const campo = _campos.find(f => f.id === campoId); const opts = campo?.options || []; - selValor.innerHTML = '' + - opts.map(o => ``).join(''); + selValor.innerHTML = opts.map(o => ``).join(''); selValor.disabled = false; + selValor.style.opacity = ''; + selValor.style.pointerEvents = ''; } function _insertarKey(key) { @@ -967,8 +977,12 @@ function aplicarCampo() { const condCampo = document.getElementById('ce-cond-campo'); const condValor = document.getElementById('ce-cond-valor'); if (condCampo !== null) { - if (condCampo.value && condValor.value) { - c.condicion = { campo_id: condCampo.value, valor: condValor.value }; + const selVals = condValor + ? [...condValor.selectedOptions].map(o => o.value).filter(Boolean) + : []; + if (condCampo.value && selVals.length) { + // ponytail: valores[] siempre, forma unificada + c.condicion = { campo_id: condCampo.value, valores: selVals }; } else { delete c.condicion; }