Inventario de entidades¶
Qué se modeló en este Payload para gestionar el sitio, y qué es cada cosa. El criterio para leer las tablas es la columna Origen:
- Propio — desarrollado para este proyecto. Es lo que hay que mantener.
- Template — viene del website template oficial de Payload, sin cambios.
- Template (modificado) — viene del template pero se le cambió el comportamiento acá.
- Plugin — la genera un plugin de Payload; no hay config propia que mantener.
Detalle de campos: solo para las entidades propias. Para el resto alcanza con saber que existen y de dónde salen.
Colecciones¶
| Slug | Nombre en el admin | Lectura | Para qué | Origen |
|---|---|---|---|---|
banners |
Banners | pública | Piezas gráficas con enlace y botón opcional | Propio |
sliders |
Sliders | pública | Carruseles de slides, identificados por clave | Propio |
media |
Media | pública | Todas las imágenes; se almacenan en Cloudflare Images | Template (modificado) |
pages |
Pages | pública si está publicada | Páginas armadas con bloques | Template |
posts |
Posts | pública si está publicada | Entradas de blog | Template |
categories |
Categorías del blog | pública | Categorías anidables de posts. Son del blog, no del catálogo de venta: esas van en catalog-categories |
Template (modificado) |
users |
Users | solo autenticados | Usuarios del panel de administración | Template |
menus |
Menús | pública | Menús reutilizables con entradas, submenús e inclusión (RF-007) | Propio |
catalog-categories |
Categorías del catálogo | pública | Rubros de venta con los que se arman los menús (RF-007): nombre, dirección, categoría padre e imagen. Alta a mano por ahora | Propio |
pages y posts usan borradores con autoguardado cada 100 ms (para el live
preview) y publicación programada.
Globales¶
| Slug | Nombre en el admin | Lectura | Para qué | Origen |
|---|---|---|---|---|
main-navigation |
Menu de Navegación | pública | Barra de menú del storefront, debajo del header. Cada ítem puede además desplegar un menú (RF-007) | Propio |
header |
Header | pública | Navegación del sitio Next local (hasta 10 ítems) | Template |
footer |
Footer | pública | Pie del sitio Next local (hasta 6 ítems) | Template |
header y footer pertenecen al sitio Next incluido en este repo, no al
storefront: el storefront arma su navegación con main-navigation.
Bloques¶
Bloques disponibles en el layout de las páginas:
| Slug | Nombre en el admin | ¿Componente React acá? | Origen |
|---|---|---|---|
hero |
Banner | No — lo renderiza el storefront | Propio |
heroSlider |
Slider | No — lo renderiza el storefront | Propio |
productGrid |
Cuadrícula de Productos | No — lo renderiza el storefront | Propio |
cta |
Call to Action | Sí | Template |
content |
Content | Sí | Template |
mediaBlock |
Media | Sí | Template |
archive |
Archive | Sí | Template |
formBlock |
Form | Sí | Template |
Que los tres bloques comerciales no tengan componente React es deliberado — ver ADR-0001.
Dentro del texto enriquecido de los posts se pueden insertar además los
bloques banner, code y mediaBlock (los tres del template).
Entidades propias, en detalle¶
Colección banners¶
Una pieza gráfica reutilizable. El bloque hero no define su contenido: apunta
a un banner de esta colección, así que el mismo banner puede aparecer en varias
páginas y se edita en un solo lugar.
| Campo | Tipo | Notas |
|---|---|---|
titulo |
texto | Requerido. Es el título en el listado del admin |
imagen |
upload → media |
Requerido. Versión desktop |
imagenMobile |
upload → media |
Opcional |
link |
grupo linkConfig |
A dónde lleva el banner al hacer clic |
cta |
grupo ctaButton |
Botón opcional dibujado sobre el banner |
enlace |
texto | [Obsoleto] — oculto, se conserva por compatibilidad |
Colección sliders¶
Un carrusel completo. Cada slider tiene una key única (ej. home-hero) con la
que el storefront lo pide, y adentro un array de slides.
| Campo | Tipo | Notas |
|---|---|---|
name |
texto | Requerido. Nombre interno |
key |
texto | Requerido y único. Identificador con el que lo busca el storefront |
description |
textarea | Descripción interna |
slides |
array | Mínimo 1 slide |
Cada slide:
| Campo | Tipo | Notas |
|---|---|---|
enabled |
checkbox | Por defecto true |
duration |
número | Segundos en pantalla. Por defecto 5 |
title |
texto | Requerido |
image |
upload → media |
Requerido. Versión desktop |
mobileImage |
upload → media |
Opcional |
linkConfig |
grupo | Enlace principal del slide |
primaryCTA |
grupo | Botón opcional: solo texto, solo imagen, o texto + imagen |
publishFrom / publishUntil |
fecha | Ventana de visibilidad del slide |
tags |
texto | Etiquetas separadas por coma |
primaryLink |
grupo | [Obsoleto] — oculto, reemplazado por linkConfig |
El filtrado de slides no está activo
Existe un hook filterActiveSlides
(src/collections/Sliders/hooks/filterSlides.ts)
escrito para descartar en las lecturas los slides con enabled: false o
fuera de su ventana publishFrom / publishUntil, pero no está enganchado
en la config de la colección: Sliders.ts no lo importa ni declara
hooks. Es decir que hoy la API devuelve todos los slides, y quien
respeta enabled, publishFrom y publishUntil es el storefront. Verificar
si es intencional o si quedó a medias.
Global main-navigation¶
La barra de menú del storefront. Es un array de ítems; cada uno apunta a un filtro de productos, a una página del CMS, o a una URL libre.
| Campo | Tipo | Notas |
|---|---|---|
label |
texto | Requerido. Texto visible en el menú |
destinationType |
radio | filter (por defecto) · page · custom |
filterType |
select | Solo si destinationType = filter. Ver Descriptores de filtro |
filterValue |
texto | El valor a buscar; varios separados por coma |
filterQuery |
textarea | Query JSON de Algolia, solo para el filtro personalizado |
page |
relación → pages |
Solo si destinationType = page |
customUrl |
texto | Solo si destinationType = custom |
badgeText |
texto | Etiqueta opcional sobre el ítem |
highlight |
checkbox | Resaltar el ítem |
isVisible |
checkbox | Por defecto true |
categories |
texto | [Obsoleto] — oculto, reemplazado por el sistema de filtros |
Bloque hero¶
Un solo campo: banner, relación requerida a la colección banners. Los campos
titulo, subtitulo, imagenDeFondo y enlace siguen definidos pero ocultos,
por compatibilidad con las páginas que se cargaron antes de que el bloque pasara
a referenciar la colección.
Bloque heroSlider¶
Un solo campo: slider, relación requerida a la colección sliders.
Bloque productGrid¶
El CMS nunca consulta productos: este bloque guarda un descriptor de filtro que resuelve el storefront contra Algolia.
| Campo | Tipo | Notas |
|---|---|---|
titulo |
texto | Por defecto Productos Destacados |
filterType |
select | tag por defecto. Ver Descriptores de filtro |
filterValue |
texto | El valor a buscar; varios separados por coma |
itemsPerPage |
número | Por defecto 12, entre 1 y 100 |
sortBy |
select | relevance · price_asc · price_desc · created_at_desc · name_asc · name_desc |
tagDeBusqueda |
texto | [OBSOLETO] — visible solo si la fila ya tenía valor |
filterQuery |
textarea | [Obsoleto] — oculto |
Campos reutilizables propios¶
Dos field builders que se reusan en varias entidades, en
src/fields/:
| Archivo | Qué genera | Dónde se usa |
|---|---|---|
linkConfig.ts |
Grupo de enlace con destino filter / page / custom y opción de nueva pestaña |
banners.link; equivalente inline en cada slide |
ctaButton.ts |
Grupo de botón: modo de visualización (texto / imagen / texto+imagen), posición en una grilla 3×3, y el mismo sistema de destinos | banners.cta |
Descriptores de filtro¶
Cuatro lugares distintos permiten armar un filtro de Algolia (main-navigation,
los slides, el bloque productGrid y los campos linkConfig / ctaButton). El
patrón es siempre filterType + filterValue, pero los valores del select no
coinciden entre sí:
| Definición | Categoría | Tag | Colección | Personalizado |
|---|---|---|---|---|
main-navigation y slides |
category |
tag |
collection |
custom |
Bloque productGrid |
category |
tag |
collection |
index |
ctaButton.ts |
category |
tag |
collection |
index |
linkConfig.ts |
category |
product_tag |
collection |
index |
Vigencia por confirmar
Esta divergencia sale de leer las cuatro definiciones, no de un problema reportado. El storefront tiene que estar contemplando las tres variantes, o alguna combinación no está funcionando. Confirmar con quien mantiene el storefront antes de unificar: cambiar los valores rompe las filas ya cargadas.
Colecciones generadas por plugins¶
No tienen configuración propia en este repo; aparecen en el admin igual.
| Colección | Plugin | Para qué |
|---|---|---|
forms, form-submissions |
plugin-form-builder |
Formularios y sus envíos |
redirects |
plugin-redirects |
Redirecciones para pages y posts |
search |
plugin-search |
Índice de búsqueda de posts |
Además, sin crear colecciones: plugin-seo agrega el grupo meta a pages y
posts, y plugin-nested-docs habilita el anidamiento de categories.
Observaciones para revisar¶
filterActiveSlidesno está enganchado (ver el aviso ensliders). Es lo más concreto de esta lista.- Los valores de
filterTypedivergen entre las cuatro definiciones. heroSliderno declarainterfaceName, a diferencia dehero(HeroBlock) yproductGrid(ProductGridBlock). Su tipo queda inline dentro dePage['layout']enpayload-types.ts, así que el storefront no lo puede importar por nombre.- Los campos heredados se acumulan: hay 9 ocultos en el admin —
8 con
condition: () => false(banners.enlace,sliders.primaryLink,main-navigation.categories,productGrid.filterQueryy los cuatro dehero:titulo,subtitulo,imagenDeFondo,enlace) másproductGrid.tagDeBusqueda, que aparece solo si la fila ya tenía valor. De los 9, únicamente 5 llevan la etiqueta[Obsoleto]; los cuatro deheroestán ocultos sin marcar. Ocultarlos en vez de borrarlos es la convención del repo — pero conviene etiquetar los cuatro sin marcar y confirmar que el storefront ya no lee ninguno.