feat(plantillas): ver cómo queda la plantilla mientras se edita

Se editaba HTML a ciegas: había que guardar y generar un documento real para
saber si estaba bien. Ahora el modal tiene un panel de vista previa al lado del
editor, que se actualiza mientras se escribe y se abre solo al editar una
plantilla o al importar una con IA.

Se ejecuta la plantilla de verdad contra datos de ejemplo, no se reemplaza
texto: es la única forma de que {{range .Items}} y los campos anidados se vean
como van a salir, y de que un error de sintaxis aparezca mientras se edita en
vez de al generar el PDF. Los datos de ejemplo salen de DatosBaseDocumento,
igual que en producción, para que la vista previa no muestre una cosa y el
documento otra.

El iframe va en sandbox sin scripts ni same-origin: el HTML lo escribe un
admin, pero no tiene por qué correr con los permisos del panel.

De paso, la ayuda de variables ofrecía {{.Cliente.Nit}}, que no existe en el
modelo — el campo es Documento.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-17 21:28:06 -05:00
co-authored by Claude Opus 5
parent 5f95e67595
commit 86cdb2d368
6 changed files with 218 additions and 12 deletions
@@ -151,6 +151,24 @@ func ImportarPlantillaDocumento(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"contenido_html": html})
}
// PrevisualizarPlantillaDocumento renderiza la plantilla con datos de ejemplo
// para ver cómo queda antes de guardarla.
// POST /app/api/plantillas-documento/previsualizar {tipo, contenido_html}
func PrevisualizarPlantillaDocumento(c *fiber.Ctx) error {
var req struct {
Tipo string `json:"tipo"`
ContenidoHTML string `json:"contenido_html"`
}
if err := c.BodyParser(&req); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "body inválido"})
}
html, err := services.RenderizarPlantillaEjemplo(req.Tipo, req.ContenidoHTML)
if err != nil {
return c.Status(400).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"html": html})
}
// ─── Tarifas ────────────────────────────────────────────────────────────────
func GetTarifas(c *fiber.Ctx) error {