formularios: agregar botón Clonar para duplicar plantillas

- save_formulario.php: manejo de {clonar:true} → crea copia con "Copia de [nombre]"
- lab_formularios.php: botón icono copy en cada tarjeta + función clonarFormulario()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-03 08:21:50 -05:00
co-authored by Claude Sonnet 4.6
parent 17703f0157
commit 20146535c7
2 changed files with 32 additions and 0 deletions
+17
View File
@@ -445,6 +445,8 @@ function renderFormularios() {
<i class="fas fa-paper-plane me-1"></i>Enviar
</button>
${PUEDE_ESCRIBIR ? `
<button class="btn btn-sm btn-outline-secondary" onclick="clonarFormulario(${f.id},'${esc(f.nombre)}')"
title="Clonar formulario"><i class="fas fa-copy"></i></button>
<button class="btn btn-sm btn-outline-primary" onclick="builder.editar(${f.id})"
title="Editar diseño"><i class="fas fa-edit"></i></button>
<button class="btn btn-sm btn-outline-danger" onclick="confirmarBorrar(${f.id},'${esc(f.nombre)}')"
@@ -456,6 +458,21 @@ function renderFormularios() {
`).join('');
}
async function clonarFormulario(id, nombre) {
if (!confirm(`¿Clonar el formulario "${nombre}"?\nSe creará una copia con el nombre "Copia de ${nombre}".`)) return;
const r = await fetch('api/lab/save_formulario.php', {
method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify({ id, clonar: true }),
});
const d = await r.json();
if (d.success || d.ok) {
showToast('✅ Formulario clonado');
cargarFormularios();
} else {
alert(d.error || 'Error al clonar');
}
}
async function confirmarBorrar(id, nombre) {
if (!confirm(`¿Eliminar el formulario "${nombre}"?\nLos envíos existentes se conservarán.`)) return;
const r = await fetch('api/lab/save_formulario.php', {