From d4f3d3687e32ba6d972f23784feeded4f23c26fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Epu=C3=B1an?= Date: Mon, 14 Sep 2026 16:00:00 -0300 Subject: [PATCH] fix: preSave debe devolver el mapa de datos, no el entry El listener preSave de /admin devolvia el entry completo. Decap asigna lo que devuelve el handler como `data` del entry, por lo que `title` dejaba de existir en el nivel superior y slugFormatter fallaba al crear proyectos nuevos con: Collection must have a field name that is a valid entry identifier, or must have `identifier_field` set Afectaba a cualquier usuario creando un proyecto desde el CMS (ver decaporg/decap-cms#6775). Ahora el handler opera sobre entry.get('data') y devuelve ese mapa. Verificado reproduciendo el flujo completo (Decap 3.16.2 / core 3.19.0, misma config.yml, backend test-repo) en Chrome headless: falla antes del cambio y guarda despues, con owner_github correctamente asignado. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CVsDYH7KSgXYLrdAvkZgx7 --- static/admin/index.html | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/static/admin/index.html b/static/admin/index.html index 9cf2151..e5ee634 100644 --- a/static/admin/index.html +++ b/static/admin/index.html @@ -856,16 +856,20 @@ name: 'preSave', handler: function (ref) { var entry = ref.entry, author = ref.author; + // Decap espera que preSave devuelva el MAPA DE DATOS del entry, no el entry completo. + // Si se devuelve el entry, Decap lo asigna como `data` y se pierde el campo `title`, + // rompiendo el guardado con "Collection must have a field name that is a valid entry identifier". + var data = entry.get('data'); var login = getInAny(author, ['login']) || getInAny(author, ['name']) || getGitHubLogin(); login = login ? String(login).toLowerCase() : ''; - if (!login) return entry; + if (!login) return data; - var currentOwner = normalizeGitHubLogin(getInAny(entry, ['data', 'owner_github'])); + var currentOwner = normalizeGitHubLogin(data.get('owner_github')); if (currentOwner && currentOwner !== login) { throw new Error('No puedes guardar un proyecto que pertenece a @' + currentOwner + '.'); } - return entry.set('data', entry.get('data').set('owner_github', login)); + return data.set('owner_github', login); }, }); });