Table
Muestra registros planos y añade selección, ordenación o edición mientras tu aplicación controla los datos y el estado.
- Categoría
- Datos y jerarquía
- Import
@neural-ui/core/table- Selector
neu-table
import { NeuTableComponent } from '@neural-ui/core/table';Mostrar datos
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Configurador
Vista previa
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Código de tu configuración
Este fragmento se actualiza al cambiar las opciones. La pestaña Código incluye el componente completo, los datos y los templates.
Los datos estructurados, callbacks y templates se muestran en los ejemplos y en la API.
El código añade las opciones avanzadas cuando difieren del valor predeterminado. Los datos y valores de esta configuración aparecen en el estado del template.
<neu-table
[data]="records()"
[columns]="columns()"
[rowKey]="rowKey"
[appearance]='{
"density": "normal",
"borders": "rows",
"striped": false,
"stickyHeader": false,
"responsive": "contained-scroll"
}'
[selectionOptions]='{
"mode": "none"
}'
[sortOptions]='{
"mode": "single",
"removable": true,
"defaultDirection": "asc",
"resetPageOnChange": true
}'
[filterOptions]='{
"surfaces": [],
"globalFields": [],
"predicates": {},
"debounceMs": 0,
"commit": "immediate"
}'
[paginationOptions]='{
"enabled": true,
"pageSizeOptions": [
3,
6,
10
],
"position": "bottom",
"report": "range",
"showPageJump": false
}'
[columnOptions]='{
"reorderable": false,
"resizable": false,
"hideable": false,
"pinnable": false
}'
[editingOptions]='{
"mode": "none",
"activation": "click",
"commitOnBlur": false
}'
[expansionOptions]='{
"enabled": false,
"toggleOnRowClick": false
}'
[interactionOptions]='{
"navigation": "native",
"wrapFocus": false,
"announceChanges": true
}'
[query]="query()"
(queryChange)="query.set($event)"
[selection]="selection()"
(selectionChange)="selection.set($event.next)"
[layout]="layout()"
(layoutChange)="layout.set($event.next)"
[editState]="editState()"
(editStateChange)="editState.set($event.next)"
(editCommit)="save($event)"
[expandedKeys]="expanded()"
(expandedKeysChange)="expanded.set($event.next)"
>
<!-- Incluye los templates de editor y detalle del ejemplo completo. -->
</neu-table>Estos valores corresponden a la vista previa actual. Los handlers, imports de Core y templates completos están en Código.
import { signal } from '@angular/core';
export const records = signal([
{
"id": 101,
"customer": "Atlas",
"amount": 240,
"region": "EU"
},
{
"id": 102,
"customer": "Birch",
"amount": 180,
"region": "US"
},
{
"id": 103,
"customer": "Cedar",
"amount": 420,
"region": "EU"
},
{
"id": 104,
"customer": "Delta",
"amount": 95,
"region": "US"
},
{
"id": 105,
"customer": "Elm",
"amount": 310,
"region": "EU"
},
{
"id": 106,
"customer": "Fern",
"amount": 160,
"region": "US"
}
]);
export const columns = signal([
{
"id": "customer",
"field": "customer",
"header": "Cliente",
"minWidth": "14rem",
"sort": {
"field": "customer"
}
},
{
"id": "amount",
"field": "amount",
"header": "Importe (€)",
"minWidth": "10rem",
"sort": {
"field": "amount"
}
},
{
"id": "region",
"field": "region",
"header": "Región",
"minWidth": "10rem",
"sort": {
"field": "region"
}
}
]);
export const rowKey = () => { /* Handler in the complete example. */ };
export const query = signal({
"page": 0,
"pageSize": 3,
"search": "",
"sort": [],
"filters": null
});
export const selection = signal({
"kind": "keys",
"keys": []
});
export const layout = signal({
"order": [],
"hidden": [],
"widths": {},
"pinnedStart": [],
"pinnedEnd": []
});
export const editState = signal({
"kind": "none"
});
export const expanded = signal([]);Estos inputs requieren un modelo o función, no un checkbox. Modifica el campo del mismo nombre en el componente de Código y enlázalo al template; los datos que ya usa esta vista previa se muestran en el estado anterior.
data · readonly T[]En Código: define data con este tipo y utiliza [data]="data" (o data() si es una signal).
grouping · NeuTableGroupingState<F> | nullEn Código: define grouping con este tipo y utiliza [grouping]="grouping" (o grouping() si es una signal).
groupingOptions · NeuTableGroupingOptions<T, F>En Código: define groupingOptions con este tipo y utiliza [groupingOptions]="groupingOptions" (o groupingOptions() si es una signal).
labels · NeuTableLabelsEn Código: define labels con este tipo y utiliza [labels]="labels" (o labels() si es una signal).
metadata · NeuTableMetadataEn Código: define metadata con este tipo y utiliza [metadata]="metadata" (o metadata() si es una signal).
rowKey · NeuRowKey<T, K>En Código: define rowKey con este tipo y utiliza [rowKey]="rowKey" (o rowKey() si es una signal).
rowOptions · NeuTableRowOptions<T, K>En Código: define rowOptions con este tipo y utiliza [rowOptions]="rowOptions" (o rowOptions() si es una signal).
rowTrackBy · NeuRowTrackBy<T> | undefinedEn Código: define rowTrackBy con este tipo y utiliza [rowTrackBy]="rowTrackBy" (o rowTrackBy() si es una signal).
virtualizationOptions · NeuTableVirtualizationOptionsEn Código: define virtualizationOptions con este tipo y utiliza [virtualizationOptions]="virtualizationOptions" (o virtualizationOptions() si es una signal).
Ejemplos por función
Selección
Cliente | Importe (€) | Región | |
|---|---|---|---|
| Atlas | 240 | EU | |
| Birch | 180 | US | |
| Cedar | 420 | EU |
Identificadores seleccionados: —
Accesibilidad y teclado
Tecla | Acción |
|---|---|
| Tab / Shift+Tab | Recorre los controles habilitados y el contenido interactivo de las plantillas. |
| Enter / Space | Activa el control nativo enfocado, por ejemplo de ordenación o expansión. |
| Enter / Escape | En el editor del ejemplo, confirma o cancela el borrador. |
API
Inputs
Configura el componente con [propiedad]="valor". Tu aplicación proporciona estos valores; el componente no debe reemplazar el estado que le pasas.
Nombre | Tipo | Por defecto | Uso en el template | Descripción |
|---|---|---|---|---|
appearance | NeuTableAppearance | {
density: 'normal',
borders: 'rows',
striped: false,
stickyHeader: false,
responsive: 'contained-scroll',
} | [appearance] | |
columnOptions | NeuTableColumnOptions | {} | [columnOptions] | |
columns | readonly NeuTableColumn<T, F>[] | [] | [columns] | |
data | readonly T[] | [] | [data] | |
dataMode | NeuTableDataMode | 'client' | [dataMode] | |
editingOptions | NeuTableEditingOptions<T, K, F> | { mode: 'none' } | [editingOptions] | |
editState | NeuTableEditState<K> | {
kind: 'none',
} | [editState] | |
expandedKeys | readonly K[] | [] | [expandedKeys] | |
expansionOptions | NeuTableExpansionOptions<T> | {
enabled: false,
toggleOnRowClick: false,
} | [expansionOptions] | |
filterOptions | NeuTableFilterOptions<T, F> | {
surfaces: [],
globalFields: [],
predicates: {},
debounceMs: 0,
commit: 'immediate',
} | [filterOptions] | |
grouping | NeuTableGroupingState<F> | null | null | [grouping] | |
groupingOptions | NeuTableGroupingOptions<T, F> | {
mode: 'subheader',
scope: 'loaded',
} | [groupingOptions] | |
interactionOptions | NeuTableInteractionOptions | {
navigation: 'native',
wrapFocus: false,
announceChanges: false,
} | [interactionOptions] | |
labels | NeuTableLabels | {
ariaLabel: 'Data table',
empty: 'No data',
loading: 'Loading',
error: 'Unable to load data',
retry: 'Retry',
selection: 'Selection',
pagination: 'Pagination',
} | [labels] | |
layout | NeuTableLayoutState | {
order: [],
hidden: [],
widths: {},
pinnedStart: [],
pinnedEnd: [],
} | [layout] | |
metadata | NeuTableMetadata | {
totalItems: null,
loading: false,
error: null,
queryRevision: 0,
appliedRequestId: null,
} | [metadata] | |
paginationOptions | NeuTablePaginationOptions | {
enabled: false,
pageSizeOptions: [],
position: 'bottom',
report: 'none',
showPageJump: false,
} | [paginationOptions] | |
query | NeuTableQuery<F> | {
page: 0,
pageSize: 25,
search: '',
sort: [],
filters: null,
} | [query] | |
rowKey | NeuRowKey<T, K> | Obligatorio | [rowKey] | |
rowOptions | NeuTableRowOptions<T, K> | {
reorderable: false,
} | [rowOptions] | |
rowTrackBy | NeuRowTrackBy<T> | undefined | Sin valor por defecto | [rowTrackBy] | |
selection | NeuTableSelection<K, F> | {
kind: 'keys',
keys: [],
} | [selection] | |
selectionOptions | NeuTableSelectionOptions<T> | { mode: 'none' } | [selectionOptions] | |
sortOptions | NeuTableSortOptions | {
mode: 'single',
removable: true,
defaultDirection: 'asc',
resetPageOnChange: true,
} | [sortOptions] | |
virtualizationOptions | NeuTableVirtualizationOptions | { enabled: false } | [virtualizationOptions] |
Outputs
Escucha un evento con (evento)="handler($event)". La tabla indica qué datos recibe tu función y cómo utilizarlos.
Nombre | Valor emitido | Uso en el template | Descripción |
|---|---|---|---|
dataRequest | NeuTableDataRequest<F> | (dataRequest)="onDataRequest($event)" | |
editCancel | NeuTableEditCancel<T, K> | (editCancel)="onEditCancel($event)" | |
editCommit | NeuTableEditCommit<T, K, F> | (editCommit)="onEditCommit($event)" | |
editStateChange | NeuTableEditChange<K> | (editStateChange)="onEditStateChange($event)" | |
expandedKeysChange | NeuTableExpandedKeysChange<K> | (expandedKeysChange)="onExpandedKeysChange($event)" | |
exportRequest | NeuTableExportRequest<F> | (exportRequest)="onExportRequest($event)" | |
featureError | NeuTableFeatureError | (featureError)="onFeatureError($event)" | |
groupingChange | NeuTableGroupingChange<F> | (groupingChange)="onGroupingChange($event)" | |
layoutChange | NeuTableLayoutChange | (layoutChange)="onLayoutChange($event)" | |
queryChange | NeuTableQuery<F> | (queryChange)="onQueryChange($event)" | |
rangeChange | NeuTableRangeChange | (rangeChange)="onRangeChange($event)" | |
rowAction | NeuTableRowAction<T, K> | (rowAction)="onRowAction($event)" | |
rowReorder | NeuTableRowMove<K> | (rowReorder)="onRowReorder($event)" | |
selectionChange | NeuTableSelectionChange<T, K, F> | (selectionChange)="onSelectionChange($event)" |
Templates
ng-content proyecta contenido dentro del componente. Los inputs TemplateRef reciben un template; las directivas ng-template identifican templates con un contexto tipado. Una directiva compartida en el entrypoint no es necesariamente un slot de este componente.
Nombre | Mecanismo | Contrato |
|---|---|---|
NeuTableCaptionDirective | Directiva pública de template | ng-template[neuTableCaption]Contexto utilizado: template.d.ts context.d.ts |
NeuTableCellDirective | Directiva pública de template | ng-template[neuTableCell]Contexto utilizado: template.d.ts context.d.ts |
NeuTableEditorDirective | Directiva pública de template | ng-template[neuTableEditor]Contexto utilizado: template.d.ts context.d.ts |
NeuTableEmptyDirective | Directiva pública de template | ng-template[neuTableEmpty]Contexto utilizado: template.d.ts context.d.ts |
NeuTableErrorDirective | Directiva pública de template | ng-template[neuTableError]Contexto utilizado: template.d.ts context.d.ts |
NeuTableFilterDirective | Directiva pública de template | ng-template[neuTableFilter]Contexto utilizado: template.d.ts context.d.ts |
NeuTableFooterDirective | Directiva pública de template | ng-template[neuTableFooter]Contexto utilizado: template.d.ts context.d.ts |
NeuTableGroupFooterDirective | Directiva pública de template | ng-template[neuTableGroupFooter]Contexto utilizado: template.d.ts context.d.ts |
NeuTableGroupHeaderDirective | Directiva pública de template | ng-template[neuTableGroupHeader]Contexto utilizado: template.d.ts context.d.ts |
NeuTableHeaderDirective | Directiva pública de template | ng-template[neuTableHeader]Contexto utilizado: template.d.ts context.d.ts |
NeuTableLoadingDirective | Directiva pública de template | ng-template[neuTableLoading]Contexto utilizado: template.d.ts context.d.ts |
NeuTablePaginatorDirective | Directiva pública de template | ng-template[neuTablePaginator]Contexto utilizado: template.d.ts context.d.ts |
NeuTableRowDetailDirective | Directiva pública de template | ng-template[neuTableRowDetail]Contexto utilizado: template.d.ts context.d.ts |
NeuTableSummaryDirective | Directiva pública de template | ng-template[neuTableSummary]Contexto utilizado: template.d.ts context.d.ts |
NeuTableToolbarDirective | Directiva pública de template | ng-template[neuTableToolbar]Contexto utilizado: template.d.ts context.d.ts |
Cada ejemplo muestra un template diferente. Alterna entre Demo y Código para consultar su implementación, imports y estado.
Título de la tabla
NeuTableCaptionDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Acciones de la tabla
NeuTableToolbarDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Resumen de resultados
NeuTableSummaryDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Pedidos mostrados: 3 · Importe total: 840 € | ||
Cabecera de columna
NeuTableHeaderDirective
Cliente Cuenta comercial | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Contenido de celda
NeuTableCellDirective
Cliente | Importe (€) | Región |
|---|---|---|
| AtlasPedido #101 | 240 | EU |
| BirchPedido #102 | 180 | US |
| CedarPedido #103 | 420 | EU |
Pie de columna
NeuTableFooterDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
| Total: 840 € |
Filtro personalizado
NeuTableFilterDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Editor personalizado
NeuTableEditorDirective
Pulsa el lápiz de una fila para editar su cliente. Guarda los cambios o cancela desde las acciones de esa fila.
Cliente | Importe (€) | Región | Editar |
|---|---|---|---|
| Atlas | 240 | EU | |
| Birch | 180 | US | |
| Cedar | 420 | EU |
Detalle de fila
NeuTableRowDetailDirective
| Detalle | Cliente | Importe (€) | Región | ||||
|---|---|---|---|---|---|---|---|
| Atlas | 240 | EU | |||||
Detalle del pedido #101
| |||||||
| Birch | 180 | US | |||||
| Cedar | 420 | EU | |||||
Cabecera de grupo
NeuTableGroupHeaderDirective
Despliega una región para ver sus pedidos.
Cliente | Importe (€) | Región |
|---|---|---|
Resumen de grupo
NeuTableGroupFooterDirective
Despliega una región para ver sus pedidos y su resumen.
Cliente | Importe (€) | Región |
|---|---|---|
Estado vacío
NeuTableEmptyDirective
Cliente | Importe (€) | Región |
|---|---|---|
Todavía no hay pedidos Los nuevos pedidos aparecerán aquí. | ||
Estado de carga
NeuTableLoadingDirective
Cliente | Importe (€) | Región |
|---|---|---|
Cargando pedidos… Estamos recuperando los resultados. | ||
Estado de error y reintento
NeuTableErrorDirective
Cliente | Importe (€) | Región |
|---|---|---|
No se han podido cargar los pedidos. | ||
Paginación personalizada
NeuTablePaginatorDirective
Cliente | Importe (€) | Región |
|---|---|---|
| Atlas | 240 | EU |
| Birch | 180 | US |
| Cedar | 420 | EU |
Métodos públicos
Nombre | Contrato |
|---|---|
export | export(request: NeuTableExportRequest<F>): Promise<NeuTableExportOutcome>;Crea una exportación del ámbito solicitado. Comprueba el resultado; una exportación delegada requiere la intervención de la aplicación. El ejemplo Exportar muestra la llamada y el resultado completos. example.ts |
focusCell | focusCell(target: {
readonly key: K;
readonly columnId: string;
}): boolean;Mueve el foco a una celda renderizada mediante la clave estable de fila y el identificador de columna. El booleano indica si se ha podido enfocar. example.ts |
retryData | retryData(): void;Solicita otro intento para la consulta remota actual. Gestiona dataRequest en la aplicación; este método no carga datos por sí mismo. example.ts |
scrollTo | scrollTo(target: {
readonly index?: number;
readonly key?: K;
}): Promise<void>;Desplaza la tabla hasta una fila por índice o clave. Espera a que termine si otra acción depende de que la fila sea visible. example.ts |
Public Types
Abre un tipo para consultar su definición y los campos de sus interfaces.
import type { NeuFilterConstraint } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuFilterConstraint<F extends string> {
readonly field: F;
readonly kind: 'condition';
readonly rule: 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'between' | 'in' | 'notIn' | 'isNull' | 'isNotNull' | 'isEmpty' | 'isNotEmpty';
readonly value: unknown;
}import type { NeuFilterConstraint } from '@neural-ui/core/table';
import type { NeuFilterGroup } from '@neural-ui/core/table';
import type { NeuFilterExpression } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuFilterExpression<F extends string> = NeuFilterConstraint<F> | NeuFilterGroup<F>;import type { NeuFilterExpression } from '@neural-ui/core/table';
import type { NeuFilterOperator } from '@neural-ui/core/table';
import type { NeuFilterGroup } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuFilterGroup<F extends string> {
readonly children: readonly NeuFilterExpression<F>[];
readonly kind: 'group';
readonly operator: NeuFilterOperator;
}import type { NeuFilterOperator } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuFilterOperator = 'and' | 'or';import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuRowKey } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuRowKey<T, K extends NeuTableKey> = (row: T) => K;import type { NeuRowTrackBy } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuRowTrackBy<T> = (index: number, row: T) => unknown;import type { NeuSortDirection } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuSortDirection = 'asc' | 'desc';import type { NeuSortDirection } from '@neural-ui/core/table';
import type { NeuSortEntry } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuSortEntry<F extends string> {
readonly direction: NeuSortDirection;
readonly field: F;
}import type { NeuTableAppearance } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableAppearance {
readonly borders: 'none' | 'rows' | 'cells';
readonly density: 'compact' | 'normal' | 'relaxed';
readonly responsive: 'contained-scroll' | 'stacked';
readonly stickyHeader: boolean;
readonly striped: boolean;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowContext } from '@neural-ui/core/table';
import type { NeuTableCellContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableCellContext<T, K extends NeuTableKey> extends NeuTableRowContext<T, K> {
readonly columnId: string;
readonly value: unknown;
}import type { NeuTableEditColumn } from '@neural-ui/core/table';
import type { NeuTableFilterColumn } from '@neural-ui/core/table';
import type { NeuTableSortColumn } from '@neural-ui/core/table';
import type { NeuTableValueAccessor } from '@neural-ui/core/table';
import type { NeuTableColumn } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableColumn<T, F extends string> {
readonly align?: 'start' | 'center' | 'end';
readonly edit?: NeuTableEditColumn<T, F>;
readonly field?: F;
readonly filter?: NeuTableFilterColumn<T, F>;
readonly header: string;
readonly id: string;
readonly maxWidth?: string;
readonly minWidth?: string;
readonly sort?: NeuTableSortColumn<T, F>;
readonly value?: NeuTableValueAccessor<T>;
readonly width?: string;
}import type { NeuTableColumnOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableColumnOptions {
readonly hideable?: boolean;
readonly pinnable?: boolean;
readonly reorderable?: boolean;
readonly resizable?: boolean;
}import type { NeuTableDataMode } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableDataMode = 'client' | 'remote';import type { NeuTableDataRequestReason } from '@neural-ui/core/table';
import type { NeuTableQuery } from '@neural-ui/core/table';
import type { NeuTableRange } from '@neural-ui/core/table';
import type { NeuTableDataRequest } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableDataRequest<F extends string> {
readonly query: NeuTableQuery<F>;
readonly queryRevision: number;
readonly range?: NeuTableRange;
readonly reason: NeuTableDataRequestReason;
readonly requestId: number;
}import type { NeuTableDataRequestReason } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableDataRequestReason = 'initial' | 'query' | 'viewport' | 'retry';import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowContext } from '@neural-ui/core/table';
import type { NeuTableDetailContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableDetailContext<T, K extends NeuTableKey> extends NeuTableRowContext<T, K> {
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditCancel } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditCancel<T, K extends NeuTableKey> {
readonly key: K;
readonly reason: 'escape' | 'consumer' | 'data-change';
readonly row: T;
}import type { NeuTableEditState } from '@neural-ui/core/table';
import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditChange<K extends NeuTableKey> {
readonly next: NeuTableEditState<K>;
readonly source: 'pointer' | 'keyboard' | 'programmatic' | 'commit' | 'cancel';
}import type { NeuTableValueAccessor } from '@neural-ui/core/table';
import type { NeuTableEditColumn } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditColumn<T, F extends string> {
readonly field: F;
readonly read?: NeuTableValueAccessor<T>;
readonly write?: (row: T, value: unknown) => T;
}import type { NeuTableEditValueChange } from '@neural-ui/core/table';
import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditCommit } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditCommit<T, K extends NeuTableKey, F extends string> {
readonly changes: readonly NeuTableEditValueChange<F>[];
readonly key: K;
readonly row: T;
}import type { NeuTableEditError } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditError {
readonly code: string;
readonly columnId?: string;
readonly message: string;
}import type { NeuTableEditValidation } from '@neural-ui/core/table';
import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditingOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableEditingOptions<T, K extends NeuTableKey, F extends string> = {
readonly mode: 'none';
} | {
readonly mode: 'cell' | 'row';
readonly activation: 'click' | 'double-click' | 'enter' | 'f2';
readonly validate?: NeuTableEditValidation<T, K, F>;
readonly commitOnBlur: boolean;
};import type { NeuTableCellContext } from '@neural-ui/core/table';
import type { NeuTableEditError } from '@neural-ui/core/table';
import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditorContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditorContext<T, K extends NeuTableKey, F extends string> extends NeuTableCellContext<T, K> {
readonly cancel: () => void;
readonly commit: () => void;
readonly errors: Signal<readonly NeuTableEditError[]>;
readonly setValue: (value: unknown) => void;
readonly valueSignal: Signal<unknown>;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditState } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableEditState<K extends NeuTableKey> = {
readonly kind: 'none';
} | {
readonly kind: 'cell';
readonly key: K;
readonly columnId: string;
} | {
readonly kind: 'row';
readonly key: K;
};import type { NeuTableEditCommit } from '@neural-ui/core/table';
import type { NeuTableEditError } from '@neural-ui/core/table';
import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableEditValidation } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableEditValidation<T, K extends NeuTableKey, F extends string> = (event: NeuTableEditCommit<T, K, F>) => readonly NeuTableEditError[] | Promise<readonly NeuTableEditError[]>;import type { NeuTableEditValueChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableEditValueChange<F extends string> {
readonly columnId: string;
readonly field?: F;
readonly previous: unknown;
readonly value: unknown;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableExpandedKeysChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableExpandedKeysChange<K extends NeuTableKey> {
readonly expanded: boolean;
readonly key: K;
readonly next: readonly K[];
readonly source: 'toggle' | 'keyboard' | 'programmatic';
}import type { NeuTableExpansionOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableExpansionOptions<T> {
readonly enabled: boolean;
readonly isExpandable?: (row: T) => boolean;
readonly toggleOnRowClick: boolean;
}import type { NeuTableExportFormat } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableExportFormat = 'csv' | 'json' | 'xlsx';import type { NeuTableExportResult } from '@neural-ui/core/table';
import type { NeuTableExportOutcome } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableExportOutcome = {
readonly kind: 'generated';
readonly result: NeuTableExportResult;
} | {
readonly kind: 'delegated';
};import type { NeuTableExportFormat } from '@neural-ui/core/table';
import type { NeuTableExportScope } from '@neural-ui/core/table';
import type { NeuTableQuery } from '@neural-ui/core/table';
import type { NeuTableExportRequest } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableExportRequest<F extends string> {
readonly fileName: string;
readonly format: NeuTableExportFormat;
readonly query: NeuTableQuery<F>;
readonly scope: NeuTableExportScope;
}import type { NeuTableExportResult } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableExportResult {
readonly bytes: Uint8Array;
readonly fileName: string;
readonly mediaType: string;
}import type { NeuTableExportScope } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableExportScope = 'page' | 'loaded' | 'filtered' | 'selected' | 'all';import type { NeuTableFeatureError } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableFeatureError {
readonly cause: unknown;
readonly feature: 'filters' | 'editing' | 'virtualization' | 'export';
readonly recoverable: boolean;
}import type { NeuFilterConstraint } from '@neural-ui/core/table';
import type { NeuTableValueAccessor } from '@neural-ui/core/table';
import type { NeuTableFilterColumn } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableFilterColumn<T, F extends string> {
readonly defaultRule: NeuFilterConstraint<F>['rule'];
readonly field: F;
readonly rules: readonly NeuFilterConstraint<F>['rule'][];
readonly value?: NeuTableValueAccessor<T>;
}import type { NeuFilterConstraint } from '@neural-ui/core/table';
import type { NeuTableHeaderContext } from '@neural-ui/core/table';
import type { NeuTableFilterContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableFilterContext<T, F extends string> extends NeuTableHeaderContext<T, F> {
readonly apply: (value: unknown, rule?: NeuFilterConstraint<F>['rule']) => void;
readonly clear: () => void;
readonly rule: NeuFilterConstraint<F>['rule'];
readonly value: unknown;
}import type { NeuTableFilterPredicate } from '@neural-ui/core/table';
import type { NeuTableFilterSurface } from '@neural-ui/core/table';
import type { NeuTableFilterOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableFilterOptions<T, F extends string> {
readonly commit: 'immediate' | 'explicit';
readonly debounceMs: number;
readonly equals?: (left: unknown, right: unknown) => boolean;
readonly globalFields: readonly F[];
readonly predicates: Readonly<Record<string, NeuTableFilterPredicate<T, F>>>;
readonly surfaces: readonly NeuTableFilterSurface[];
}import type { NeuTableFilterPredicateContext } from '@neural-ui/core/table';
import type { NeuTableFilterPredicate } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableFilterPredicate<T, F extends string> = (context: NeuTableFilterPredicateContext<T, F>) => boolean;import type { NeuTableFilterPredicateContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableFilterPredicateContext<T, F extends string> {
readonly candidate: unknown;
readonly field: F;
readonly filterValue: unknown;
readonly row: T;
}import type { NeuTableFilterSurface } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableFilterSurface = 'row' | 'menu' | 'builder';import type { NeuTableGroupContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableGroupContext<T> {
readonly expanded: boolean;
readonly id: string;
readonly level: number;
readonly rows: readonly T[];
readonly value: unknown;
}import type { NeuTableGroupingState } from '@neural-ui/core/table';
import type { NeuTableGroupingChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableGroupingChange<F extends string> {
readonly next: NeuTableGroupingState<F>;
readonly source: 'toggle' | 'programmatic';
}import type { NeuTableGroupingOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableGroupingOptions<T, F extends string> {
readonly aggregate?: (rows: readonly T[], field: F) => unknown;
readonly mode: 'subheader' | 'rowspan';
readonly scope: 'loaded';
readonly value?: (row: T, field: F) => unknown;
}import type { NeuTableGroupingState } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableGroupingState<F extends string> {
readonly by: readonly F[];
readonly expandedGroupIds: readonly string[];
}import type { NeuSortEntry } from '@neural-ui/core/table';
import type { NeuTableColumn } from '@neural-ui/core/table';
import type { NeuTableHeaderContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableHeaderContext<T, F extends string> {
readonly column: NeuTableColumn<T, F>;
readonly sort: readonly NeuSortEntry<F>[];
}import type { NeuTableInteractionOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableInteractionOptions {
readonly announceChanges: boolean;
readonly navigation: 'native' | 'rows' | 'cells';
readonly wrapFocus: boolean;
}import type { NeuTableKey } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableKey = string | number;import type { NeuTableMessage } from '@neural-ui/core/table';
import type { NeuTableLabels } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableLabels {
readonly ariaLabel: string;
readonly empty: string;
readonly error: string;
readonly loading: string;
readonly messages?: Partial<Record<NeuTableMessage, string>>;
readonly pagination: string;
readonly retry: string;
readonly selection: string;
}import type { NeuTableLayoutState } from '@neural-ui/core/table';
import type { NeuTableLayoutChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableLayoutChange {
readonly next: NeuTableLayoutState;
readonly source: 'resize' | 'reorder' | 'visibility' | 'pin';
}import type { NeuTableLayoutState } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableLayoutState {
readonly hidden: readonly string[];
readonly order: readonly string[];
readonly pinnedEnd: readonly string[];
readonly pinnedStart: readonly string[];
readonly widths: Readonly<Record<string, string>>;
}import type { NeuFilterConstraint } from '@neural-ui/core/table';
import type { NeuTableMessage } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableMessage = 'stateAnnouncement' | 'firstPage' | 'previousPage' | 'nextPage' | 'lastPage' | 'page' | 'of' | 'goToPage' | 'rowsPerPage' | 'searchTable' | 'search' | 'clearSearch' | 'clear' | 'advancedFilters' | 'hiddenColumns' | 'showColumn' | 'expansion' | 'selectAll' | 'filterColumn' | 'filter' | 'moveLeft' | 'moveRight' | 'pinColumn' | 'pin' | 'hideColumn' | 'hide' | 'resizeColumn' | 'rule' | 'value' | 'applyColumnFilter' | 'clearColumnFilter' | 'cancelFilter' | 'filterRule' | 'filterValue' | 'apply' | 'collapseRow' | 'expandRow' | 'selectRow' | 'sortAction' | 'ascending' | 'descending' | 'none' | 'field' | 'join' | 'and' | 'or' | 'applyAdvancedFilter' | 'cancelAdvancedFilter' | 'edit' | 'save' | 'cancel' | 'validating' | NeuFilterConstraint<string>['rule'];import type { NeuTableRange } from '@neural-ui/core/table';
import type { NeuTableMetadata } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableMetadata {
readonly appliedRequestId: number | null;
readonly dataRange?: NeuTableRange;
readonly error: unknown | null;
readonly loading: boolean;
readonly queryRevision: number;
readonly totalItems: number | null;
}import type { NeuTablePaginationOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTablePaginationOptions {
readonly enabled: boolean;
readonly pageSizeOptions: readonly number[];
readonly position: 'top' | 'bottom' | 'both';
readonly report: 'none' | 'summary' | 'range';
readonly showPageJump: boolean;
}import type { NeuTablePaginatorContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTablePaginatorContext {
readonly canFirst: boolean;
readonly canLast: boolean;
readonly canNext: boolean;
readonly canPrevious: boolean;
readonly changePage: (page: number) => void;
readonly changePageSize: (pageSize: number) => void;
readonly humanPage: number;
readonly page: number;
readonly pageCount: number | null;
readonly pageSize: number;
readonly pageSizeOptions: readonly number[];
readonly rangeEnd: number;
readonly rangeStart: number;
readonly total: number | null;
}import type { NeuFilterExpression } from '@neural-ui/core/table';
import type { NeuSortEntry } from '@neural-ui/core/table';
import type { NeuTableQuery } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableQuery<F extends string> {
readonly filters: NeuFilterExpression<F> | null;
readonly page: number;
readonly pageSize: number;
readonly search: string;
readonly sort: readonly NeuSortEntry<F>[];
}import type { NeuTableRange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRange {
readonly end: number;
readonly start: number;
}import type { NeuTableRange } from '@neural-ui/core/table';
import type { NeuTableRangeChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRangeChange {
readonly reason: 'scroll' | 'resize' | 'programmatic' | 'query';
readonly render: NeuTableRange;
readonly visible: NeuTableRange;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowAction } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRowAction<T, K extends NeuTableKey> {
readonly action: 'activate' | 'double-activate' | 'context-menu';
readonly index: number;
readonly key: K;
readonly row: T;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRowContext<T, K extends NeuTableKey> {
readonly $implicit: T;
readonly disabled: boolean;
readonly expanded: boolean;
readonly index: number;
readonly key: K;
readonly row: T;
readonly selected: boolean;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowMove } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRowMove<K extends NeuTableKey> {
readonly beforeKey: K | null;
readonly fromIndex: number;
readonly key: K;
readonly toIndex: number;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableRowOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableRowOptions<T, K extends NeuTableKey> {
readonly className?: (row: T) => string | readonly string[] | null;
readonly isDisabled?: (row: T) => boolean;
readonly pin?: (row: T, key: K) => 'start' | 'end' | null;
readonly reorderable: boolean;
}import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableSelectionScope } from '@neural-ui/core/table';
import type { NeuTableSelection } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableSelection<K extends NeuTableKey, F extends string> = {
readonly kind: 'keys';
readonly keys: readonly K[];
} | {
readonly kind: 'all-matching';
readonly scope: NeuTableSelectionScope<F>;
readonly excludedKeys: readonly K[];
};import type { NeuTableKey } from '@neural-ui/core/table';
import type { NeuTableSelection } from '@neural-ui/core/table';
import type { NeuTableSelectionChange } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableSelectionChange<T, K extends NeuTableKey, F extends string> {
readonly addedKeys: readonly K[];
readonly loadedRows: readonly T[];
readonly next: NeuTableSelection<K, F>;
readonly removedKeys: readonly K[];
readonly source: 'row' | 'radio' | 'checkbox' | 'keyboard' | 'toggle-all';
}import type { NeuTableSelectionOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableSelectionOptions<T> = {
readonly mode: 'none';
} | {
readonly mode: 'single';
readonly indicator: 'none' | 'radio';
readonly selectOnRowClick: boolean;
readonly allowClear: boolean;
readonly isRowDisabled?: (row: T) => boolean;
} | {
readonly mode: 'multiple';
readonly indicator: 'none' | 'checkbox';
readonly selectOnRowClick: boolean;
readonly modifier: 'replace' | 'platform' | 'toggle';
readonly range: boolean;
readonly toggleAllScope: 'rendered' | 'page' | 'loaded' | 'all-matching';
readonly isRowDisabled?: (row: T) => boolean;
};import type { NeuFilterExpression } from '@neural-ui/core/table';
import type { NeuTableSelectionScope } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableSelectionScope<F extends string> {
readonly filters: NeuFilterExpression<F> | null;
readonly globalFields: readonly F[];
readonly search: string;
}import type { NeuTableValueAccessor } from '@neural-ui/core/table';
import type { NeuTableSortColumn } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableSortColumn<T, F extends string> {
readonly compare?: (left: T, right: T) => number;
readonly field: F;
readonly value?: NeuTableValueAccessor<T>;
}import type { NeuSortDirection } from '@neural-ui/core/table';
import type { NeuTableSortOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableSortOptions {
readonly defaultDirection: NeuSortDirection;
readonly mode: 'single' | 'multiple';
readonly removable: boolean;
readonly resetPageOnChange: boolean;
}import type { NeuTableStateTemplateContext } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export interface NeuTableStateTemplateContext {
readonly error: unknown | null;
readonly loading: boolean;
readonly retry: () => void;
}import type { NeuTableValueAccessor } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableValueAccessor<T> = (row: T) => unknown;import type { NeuTableVirtualizationOptions } from '@neural-ui/core/table';
// Declaración pública (solo referencia)
export type NeuTableVirtualizationOptions = {
readonly enabled: false;
} | {
readonly enabled: true;
readonly itemSize: number;
readonly overscan: number;
readonly requestStep?: number;
};Apariencia y tokens
Tokens específicos
Token | Efecto | Estado / variante | Valor / origen | Alternativa |
|---|---|---|---|---|
--neu-table-cell-block | Relleno vertical de las celdas con densidad normal. | density="normal" | 0.625remDeclaración raíz | Sin alias de token |
--neu-table-cell-block-compact | Relleno vertical de las celdas con densidad compacta. | density="compact" | 0.375remDeclaración raíz | Sin alias de token |
--neu-table-cell-block-relaxed | Relleno vertical de las celdas con densidad amplia. | density="relaxed" | 0.875remDeclaración raíz | Sin alias de token |
--neu-table-cell-inline | Relleno horizontal de las celdas. | Celdas de tabla | var(--neu-space-3)Declaración raíz | --neu-space-3 |
--neu-table-group-background | Fondo de las filas de encabezado de grupo. | Cabecera de grupo | color-mix(in srgb, currentColor 4%, transparent)Declaración raíz | Sin alias de token |
--neu-table-header-height | Altura de las celdas de cabecera; el contenido multilínea puede necesitar más espacio. | Cabecera de columna | 44pxDeclaración raíz | Sin alias de token |
--neu-table-max-height | Altura máxima del área sin virtualización; los datos que la superan se desplazan dentro. | Área sin virtualización | 480pxDeclaración raíz | Sin alias de token |
--neu-table-selected-background | Fondo de las filas seleccionadas, con prioridad sobre las bandas alternas. | Fila seleccionada | color-mix(in srgb, currentColor 9%, transparent)Declaración raíz | Sin alias de token |
--neu-table-space-sm | Separación en controles y grupos de acciones de la tabla. | Controles y acciones | var(--neu-space-2)Declaración raíz | --neu-space-2 |
--neu-table-space-xs | Separación pequeña entre controles contiguos de la tabla. | Controles y acciones | var(--neu-space-1)Declaración raíz | --neu-space-1 |
--neu-table-state-block | Relleno vertical del contenido de carga, vacío y error. | Vacío / carga / error | var(--neu-space-6)Declaración raíz | --neu-space-6 |
--neu-table-sticky-offset | Desplazamiento superior de la cabecera con stickyHeader activado. | stickyHeader | 0pxDeclaración raíz | Sin alias de token |
--neu-table-stripe-background | Fondo de las filas alternas cuando striped está activado. | striped | color-mix(in srgb, currentColor 4%, transparent)Declaración raíz | Sin alias de token |
--neu-table-virtual-block-size | Altura del área de desplazamiento virtualizado. | Virtualización | 24remDeclaración raíz | Sin alias de token |
Tokens compartidos utilizados
Sobrescríbelos en un contenedor local para afectar a este ejemplo. Una modificación en :root afecta a los demás componentes que utilizan el mismo token.
Token | Efecto aquí | Otros efectos | Valor / alternativa |
|---|---|---|---|
--neu-border | Bordes normales de controles y celdas | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | rgba(15, 23, 42, 0.08) |
--neu-border-hover | Bordes de controles al pasar el puntero | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | rgba(15, 23, 42, 0.16) |
--neu-focus-color | Contorno visible del foco de teclado | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | var(--neu-primary) |
--neu-primary | Color de marca en controles activos y énfasis | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | #007aff |
--neu-primary-soft | Superficie tenue de selección o estado activo | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | var(--neu-primary-50) |
--neu-surface | Superficie principal del campo, cabecera o control | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | #ffffff |
--neu-surface-2 | Superficies secundarias y filas alternas | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | #f1f5f9 |
--neu-text | Color del texto principal y de los iconos que lo heredan | Compartido con otros consumidores de Core; limita el cambio a un ámbito. | #0f172a |