Problemas frecuentes
Bitácora de síntomas conocidos con su causa verificada y su solución.
Formato bitácora: síntoma → causa → solución.
La tabla se ve "rota": sin bordes, sin espaciados, botones pegados
Causa: Tailwind no está escaneando las clases de la librería.
Solución: añade en globals.css: @source "../node_modules/@fesa/components/src"; y reinicia el dev server.
Zebra, hover o fila seleccionada invisibles
Causa: faltan los tokens --color-background, --color-muted o --color-primary en el @theme de la app.
Solución: define el bloque @theme inline estándar de shadcn v4 (mapea --color-muted: var(--muted), etc.).
Export/copiar/imprimir sacan celdas vacías
Causa: columnas sin accessorKey — la librería no sabe de dónde sacar el valor plano.
Solución: añade accessorKey a cada columna de datos.
Cambié un filtro externo y la tabla busca con el valor anterior
Causa: el filtro solo vive en useState; el fetchFn corre antes del re-render y lee el closure viejo.
Solución: patrón estado + ref (receta): actualiza la ref, luego el estado, luego resetAndRefetch().
Tras crear/editar/borrar, la tabla no refleja el cambio
Causa: la mutación solo hace router.refresh(); con paginación en servidor eso no toca los datos que la tabla ya cargó.
Solución: tableRef.current?.silentRefetch() (+ router.refresh() únicamente para stats server-rendered).
Dos tablas en la misma página se pisan la paginación
Causa: ambas escriben ?page= sin prefijo.
Solución: paramPrefix distinto por tabla, también en la view (guía).
La URL se reescribe "sola" o pierde parámetros
Causa: la tabla tiene dos escritores de URL — useTableSearchParams (o useSmartTable) y syncSearchParams: true a la vez.
Solución: usa uno u otro por tabla, nunca ambos.
bun install no trae mi último cambio de la librería
Causa: bun cachea la resolución del repo git y a veces no mueve el commit aunque muevas el tag.
Solución:
bun pm cache rm
# borra la(s) línea(s) @fesa/components/datatable del bun.lock
rm -rf node_modules/@fesa
bun installEn el VPS el install falla resolviendo @fesa/components/datatable
Causa: el servidor no puede leer el repo privado por SSH.
Solución: deploy key read-only en GitHub → fesa-components → Settings → Deploy keys. El VPS fesa.prod ya la tiene (~/.ssh/fesa_datatable_deploy). Verifica con git ls-remote [email protected]:AdanSerrano/fesa-components.git HEAD.
Typecheck de la app falla con tipos duplicados de React (VoidOrUndefinedOnly…)
Causa: estás usando dependencia file:../fesa-components local y el node_modules de la lib duplica @types/react.
Solución: para iterar en local borra fesa-components/node_modules/@types y react*; para consumo normal usa la dependencia git (instala limpia y el problema no existe).
La virtualización no virtualiza (o descuadra las filas)
Causa: falta style.maxHeight (el contenedor no scrollea) o las filas no miden el rowHeight declarado.
Solución: pon maxHeight, ajusta rowHeight a la densidad real (48px en "default"), y no combines con filas expandibles.
El toast de error tarda ~10 segundos en aparecer con la base caída
Causa: no es la tabla — es el pool_timeout de Prisma esperando conexión antes de rendirse.
Solución: es el comportamiento esperado; el mensaje que llega al toast es el del servidor. Si quieres fallar antes, baja pool_timeout en la DATABASE_URL.
La selección desaparece al buscar
Causa: es a propósito — una búsqueda nueva limpia la selección para que una acción masiva nunca opere sobre filas que ya no coinciden con el filtro.
Solución: ninguna; es el contrato de la selección cross-page.