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
+15
View File
@@ -22,6 +22,21 @@ try {
jsonOk(['id' => (int)$datos['id']], 'Formulario eliminado');
}
// Clonar
if (!empty($datos['id']) && !empty($datos['clonar'])) {
$original = $form->obtener((int)$datos['id']);
if (!$original) jsonError('Formulario no encontrado', 404);
$nuevoId = $form->crear([
'nombre' => 'Copia de ' . $original['nombre'],
'descripcion' => $original['descripcion'] ?? null,
'categoria' => $original['categoria'] ?? 'otro',
'esquema' => $original['esquema'] ?? '[]',
'permite_firma' => $original['permite_firma'] ?? 0,
'requiere_firma' => $original['requiere_firma'] ?? 0,
], $admin);
jsonOk(['id' => $nuevoId], 'Formulario clonado');
}
// Editar
if (!empty($datos['id'])) {
$id = (int)$datos['id'];
+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', {