FesaComponents
DataTableReferencia de API

Configs campo a campo

Selección, expansión, paginación, estilo, toolbar, export y el resto de configs.

En SmartDataTable las configs marcadas con 🔄 pierden sus campos de estado (selectedRows, pageIndex…): el store interno los gestiona y tú solo pasas las opciones.

SelectionConfig 🔄

CampoTipoDefaultDescripción
enabled *booleanActiva la selección.
mode"single"|"multiple""multiple"Radio o checkboxes.
showCheckboxbooleanfalseColumna de checkboxes (con "seleccionar todo" en la cabecera).
selectOnRowClickbooleanfalseClic en la fila alterna la selección.
onRowSelect(row) => voidCallback al seleccionar por clic.
canSelect(row) => booleanFilas no seleccionables.

Solo modo controlado: selectedRows, onSelectionChange, allMatchingSelected, onAllMatchingChange.

ExpansionConfig 🔄

CampoTipoDefaultDescripción
enabled *booleanActiva la columna del expansor.
renderContent(row) => ReactNodeEl contenido expandido (fila a todo lo ancho).
expandOnClickbooleanfalseClic en la fila expande (además del chevron).
canExpand(row) => booleanFilas sin expansor.

Solo controlado: expandedRows, onExpansionChange. Incompatible con virtualización.

PaginationConfig 🔄

CampoTipoDefaultDescripción
pageSizeOptionsnumber[][10, 20, 30, 50, 100]Opciones del selector.
showPageNumbersbooleantrueBotones numerados (con elipsis inteligente).
showFirstLastbooleantrueBotones primera/última.
showRowsInfobooleantrue"Mostrando X a Y de Z".
showSelectedInfobooleantrue"(N seleccionados)".

Solo controlado: pageIndex, pageSize, totalRows, totalPages, onPaginationChange.

SortingConfig 🔄

CampoTipoDefaultDescripción
enableMultiSortbooleanfalseOrden por varias columnas.
manualSortingbooleansmart: truetrue = ordena el servidor. En smart siempre.

Solo controlado: sorting, onSortingChange. Ciclo del clic: sin orden → asc → desc → sin orden.

FilterConfig 🔄

CampoTipoDefaultDescripción
placeholderstring"Buscar..."Placeholder del input.
showClearButtonbooleantrueLa X de limpiar.
debounceMsnumber700Espera tras el último tecleo. Enter dispara al instante.

Solo controlado: globalFilter, onGlobalFilterChange, filterFn (filtrado client-side).

ColumnVisibilityConfig 🔄

CampoTipoDefaultDescripción
enabled *booleanActiva el dropdown "Columnas" del toolbar.
alwaysVisibleColumnsstring[][]Ids que no se pueden ocultar (aparecen deshabilitados).

Solo controlado: columnVisibility, onColumnVisibilityChange.

StyleConfig

CampoTipoDefaultDescripción
stripedbooleanfalseFilas zebra.
hoverbooleantrueResaltado al pasar.
stickyHeaderbooleanfalseCabecera fija al scrollear.
stickyFooterbooleanfalseFila de totales fija abajo.
density"compact"|"default"|"comfortable""default"Alto de fila (h-8 / h-12 / h-16). El usuario puede cambiarla desde el toolbar.
borderStyle"default"|"none"|"horizontal"|"vertical"|"all""default"Bordes.
maxHeight / minHeightnumberAlto del contenedor con scroll. maxHeight es requisito de la virtualización.
roundedbooleanfalseEsquinas redondeadas.
showColumnBordersbooleanfalseSeparadores verticales.

ToolbarConfig

CampoTipoDefaultDescripción
showbooleanautofalse oculta el toolbar entero.
showSearchbooleantrueInput de búsqueda.
showExportbooleansegún export.enabledDropdown de export.
showColumnVisibilitybooleansegún configDropdown de columnas.
showDensityTogglebooleanfalseSelector de densidad.
showRefreshbooleanfalseBotón actualizar (usa onRefresh).
showCopy / showPrint / showFullscreenbooleansegún configsBotones de copiar / imprimir / pantalla completa.
onRefresh() => voidHandler del botón actualizar.
customStart / customEndReactNodeContenido propio a los lados (los filtros facetados van en customStart).

ExportConfig

CampoTipoDefaultDescripción
enabled *booleanActiva el export.
formats("csv"|"json"|"xlsx")[]los tresFormatos del dropdown.
filenamestring"export"Nombre del archivo (sin extensión).
includeHeadersbooleantrueFila de cabeceras.
scope"page"|"selected"|"all""page"Qué filas: la página cargada, la selección, o todo el filtro.
fetchAllFn() => Promise<T[]>Requerido para scope: "all". Trae todo el resultado filtrado.
onExport(format, rows) => voidSi lo defines, la app exporta y la librería no hace nada más.

XLSX usa exceljs por import dinámico: no pesa en el bundle hasta que alguien exporta. CSV sale con BOM (Excel lo abre con acentos correctos).

CopyConfig / PrintConfig

CampoConfigDefaultDescripción
enabled *ambasActiva el botón.
includeHeaderscopytrueCabeceras en lo copiado.
formatcopy"text""text"|"csv"|"json".
titleprintTítulo del documento.
pageSizeprint"A4""A4"|"Letter"|"Legal".
orientationprint"portrait""portrait"|"landscape".
fetchAllFnambasCopiar/imprimir todo el filtro en vez de la página.

ColumnOrderConfig / ColumnPinningConfig / ColumnResizingConfig

ConfigCamposNotas
columnOrderenabled, order?: string[], onOrderChange?Reordenar arrastrando cabeceras. Sin order el estado es interno. Persiste con persistence ("columnOrder"). Las columnas fijas no se arrastran.
columnPinningenabled, leftPinnedColumns?, rightPinnedColumns?Fija por config (el pinned de la columna gana). Varios pins por lado acumulan offsets usando width (fallback 150px). Las no listadas pierden el pin implícito.
columnResizingenabled, columnSizing: Record<string, number>, onColumnSizingChange, minColumnWidth? (50), maxColumnWidth? (500)Controlada: la app guarda los anchos (o los persiste con persistence).

VirtualizationConfig / KeyboardNavigationConfig / PersistenceConfig

ConfigCamposNotas
virtualizationenabled, rowHeight? (48), overscan? (5)Ventana de filas con spacers. Requiere style.maxHeight y alto de fila fijo. Incompatible con expansión.
keyboardNavigationenabled, onEnter?, onEscape?, onDelete?↑/↓ mueven el foco, PageUp/Down saltan 10, Espacio selecciona, E expande, Enter/Escape/Supr llaman tus callbacks.
persistenceenabled, key *, include?, storage?include: subconjunto de ["columnVisibility","sorting","density","pageSize","columnSizing","columnPinning","columnOrder"] (default: todos). storage: "localStorage" (default) o "sessionStorage". Guarda con debounce de 300ms y restaura al montar.

LoadingConfig / EmptyStateConfig / FullscreenConfig

ConfigCamposNotas
loadingConfigskeletonCount?, loadingText?, loadingOverlay?, showSkeletons?skeletonCount manda sobre pageSize para las filas skeleton; loadingText reemplaza "Actualizando".
emptyStatemessage?, description?, icon?, action?, customContent?Estado vacío completo. customContent reemplaza todo. La tabla lo usa también para el error de fetch con reintento.
fullscreenenabled, onFullscreenChange?Botón de pantalla completa (API nativa; Escape sale).

bulkActions

bulkActions?: (rows: T[], context: BulkActionsContext) => ReactNode

interface BulkActionsContext {
  allMatchingSelected: boolean;   // "seleccionar los N que coinciden" activo
  totalRows: number;              // el N
}

Se renderiza dentro de la barra integrada (contador + limpiar incluidos). Con allMatchingSelected, opera server-side sobre el filtro completo.

En esta pagina