From be55a087aa3fa470f511cb4eec15425b2a2865c8 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 10 Jul 2026 11:05:45 -0500 Subject: [PATCH] =?UTF-8?q?Tomas:=20a=C3=B1adir=20tipo=20de=20examen=20inl?= =?UTF-8?q?ine=20sin=20p=C3=A1gina=20separada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Botón "Añadir tipo de examen…" debajo del selector _c8j2g16 - Al escribir y guardar, añade la opción vía API y la selecciona al instante - api/lab/add_exam_option.php: guarda la nueva opción en el esquema del formulario - Migración actualizada: solo elimina condiciones de separadores (no toca el selector) Co-Authored-By: Claude Sonnet 4.6 --- _migrate_tomas_simplify.php | 12 +---- api/lab/add_exam_option.php | 42 ++++++++++++++++ ver_formulario_enviado.php | 96 +++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 api/lab/add_exam_option.php diff --git a/_migrate_tomas_simplify.php b/_migrate_tomas_simplify.php index 61edcc0..08a258c 100644 --- a/_migrate_tomas_simplify.php +++ b/_migrate_tomas_simplify.php @@ -22,14 +22,6 @@ foreach ($esquema as &$campo) { $id = $campo['id'] ?? ''; $tipo = $campo['tipo'] ?? ''; - // Campo selector → texto libre - if ($id === '_c8j2g16') { - $campo['tipo'] = 'texto'; - $campo['label'] = 'Tipo de examen'; - unset($campo['options'], $campo['multiple'], $campo['required']); - $cambios++; - } - // Separadores con condición sobre _c8j2g16 → quitar condición if ($tipo === 'separador' && isset($campo['condicion'])) { $condCampo = $campo['condicion']['campo_id'] ?? ''; @@ -49,8 +41,8 @@ $pdo->prepare("UPDATE lab_formularios SET esquema = ? WHERE id = 15") echo '

✅ Migración completada

' . $cambios . ' campos modificados:
- • Campo _c8j2g16 → texto libre "Tipo de examen"
- • Condiciones eliminadas de separadores de tomas

+ • Condiciones eliminadas de separadores de tomas
+ • Campo _c8j2g16 conservado como selector (+ botón "Añadir tipo")

Este archivo fue eliminado automáticamente.

← Volver a Formularios

'; diff --git a/api/lab/add_exam_option.php b/api/lab/add_exam_option.php new file mode 100644 index 0000000..78b0d39 --- /dev/null +++ b/api/lab/add_exam_option.php @@ -0,0 +1,42 @@ + 80) jsonError('Nombre demasiado largo (máx 80 chars).'); +if (!preg_match('/\S/', $examName)) jsonError('Nombre inválido.'); + +$db = Database::getInstance(); +$row = $db->fetch("SELECT esquema FROM lab_formularios WHERE id = 15 LIMIT 1"); +if (!$row) jsonError('Formulario no encontrado.', 404); + +$esquema = json_decode($row['esquema'], true); +if (!is_array($esquema)) jsonError('Esquema inválido.', 500); + +$updated = false; +foreach ($esquema as &$campo) { + if (($campo['id'] ?? '') !== '_c8j2g16') continue; + $opts = $campo['options'] ?? []; + if (in_array($examName, $opts, true)) jsonError("El tipo \"$examName\" ya existe."); + $opts[] = $examName; + $campo['options'] = $opts; + $updated = true; + break; +} +unset($campo); + +if (!$updated) jsonError('Campo selector de examen no encontrado en el formulario.', 500); + +$db->getConnection()->prepare("UPDATE lab_formularios SET esquema = ? WHERE id = 15") + ->execute([json_encode($esquema, JSON_UNESCAPED_UNICODE)]); + +jsonOk(['exam_name' => $examName], "Tipo \"$examName\" añadido."); diff --git a/ver_formulario_enviado.php b/ver_formulario_enviado.php index 01a32b7..34e0d77 100644 --- a/ver_formulario_enviado.php +++ b/ver_formulario_enviado.php @@ -994,6 +994,28 @@ function esc2(mixed $v): string { + +
+ +
+ + + +
+
+
+ + +
+ +
+ + + +
+
+
+ +/* ── Añadir tipo de examen inline ── */ +function toggleAddExam(cid) { + var box = document.getElementById('add-exam-box-' + cid); + if (!box) return; + box.classList.toggle('d-none'); + if (!box.classList.contains('d-none')) { + var inp = document.getElementById('add-exam-input-' + cid); + if (inp) inp.focus(); + } +} +function guardarNuevoExamen(cid) { + var inp = document.getElementById('add-exam-input-' + cid); + var msg = document.getElementById('add-exam-msg-' + cid); + if (!inp) return; + var name = inp.value.trim(); + if (!name) { if (msg) msg.innerHTML = 'Ingrese un nombre.'; return; } + var base = window.location.href.split('/ver_formulario_enviado.php')[0]; + fetch(base + '/api/lab/add_exam_option.php', { + method: 'POST', headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({exam_name: name}) + }) + .then(function(r) { return r.json(); }) + .then(function(d) { + if (d.ok) { + // Añadir radio button al grupo y seleccionarlo + var wrap = document.querySelector('[data-campo-id="' + cid + '"]'); + if (wrap) { + var div = document.createElement('div'); + div.className = 'form-check'; + div.innerHTML = '' + + '