Saltar a contenido

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

  1. filterActiveSlides no está enganchado (ver el aviso en sliders). Es lo más concreto de esta lista.
  2. Los valores de filterType divergen entre las cuatro definiciones.
  3. heroSlider no declara interfaceName, a diferencia de hero (HeroBlock) y productGrid (ProductGridBlock). Su tipo queda inline dentro de Page['layout'] en payload-types.ts, así que el storefront no lo puede importar por nombre.
  4. Los campos heredados se acumulan: hay 9 ocultos en el admin — 8 con condition: () => false (banners.enlace, sliders.primaryLink, main-navigation.categories, productGrid.filterQuery y los cuatro de hero: titulo, subtitulo, imagenDeFondo, enlace) más productGrid.tagDeBusqueda, que aparece solo si la fila ya tenía valor. De los 9, únicamente 5 llevan la etiqueta [Obsoleto]; los cuatro de hero está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.