Saltar al contenido principal
Neural UIv2.0.0Documentación
Ver v1 GitHub

TreeTable

Muestra registros jerárquicos en columnas, con relaciones, expansión y selección explícitas.

Categoría
Datos y jerarquía
Import
@neural-ui/core/tree-table
Selector
neu-tree-table
import { NeuTreeTableComponent } from '@neural-ui/core/tree-table';

Jerarquía y expansión

Usa TreeTable cuando los registros jerárquicos también necesitan columnas, por ejemplo un desglose de trabajo con tareas y horas. Es un componente independiente: Tree muestra jerarquía sin columnas; Table muestra registros planos.

Aporta los registros en data y sus relaciones en hierarchy. rowKey identifica cada registro; las raíces y relaciones de hijos hacen referencia a esas claves. Una relación cargada sin hijos representa una hoja; unloaded indica que aún no se han cargado. Aplica expandedKeysChange.next para aceptar la expansión o el cierre.

Jerarquía y expansión
Tarea Horas
Entrega
12

Claves expandidas: —

Configurador

Cambia la densidad, los bordes, las filas alternas, la cabecera fija, la sangría y el modo de selección. La expansión y selección siguen siendo interactivas; el template generado refleja los ajustes aplicados.

Configurador
Tarea Horas
Diseño
24
Investigación
8
Prototipo
16
Entrega
12

El template generado refleja las opciones seleccionadas. La pestaña Código incluye datos, imports y estado.

template.html
<neu-tree-table
  [data]="rows()"
  [columns]="columns()"
  [rowKey]="rowKey"
  [hierarchy]="hierarchy"
  [labels]="labels()"
  [appearance]='{
      "density": "normal",
      "borders": "rows",
      "striped": false,
      "stickyHeader": false,
      "responsive": "contained-scroll"
    }'
  [hierarchyOptions]='{
      "treeColumnId": "name",
      "indentSize": 20
    }'
  [expandedKeys]="expanded()"
  (expandedKeysChange)="expanded.set($event.next)"
  [selection]="selection()"
  [selectionOptions]='{
      "mode": "single",
      "indicator": "radio",
      "selectOnRowClick": true,
      "allowClear": false
    }'
  (selectionChange)="selection.set($event.next)"
  [query]="query()"
  (queryChange)="query.set($event)"
  [filterOptions]='{
      "surfaces": [],
      "globalFields": [],
      "predicates": {},
      "debounceMs": 0,
      "commit": "immediate"
    }'
  [exportOptions]="{ formats: ['csv'], defaultFilename: 'work-plan' }"
/>

Seleccionar descendientes cargados

El ejemplo usa selección por casillas con propagación loaded-subtree. Al seleccionar Diseño también se seleccionan sus hijos cargados. selectionChange propone next; la aplicación lo aplica a selection.

La propagación se limita a las relaciones cargadas. No selecciona descendientes desconocidos del servidor. Elige propagation none para seleccionar cada nodo de forma independiente.

Seleccionar descendientes cargados
Tarea Horas
Diseño
24
Investigación
8
Prototipo
16
Entrega
12

Claves seleccionadas: —

Cargar raíces e hijos

En modo remoto, dataRequest distingue solicitudes de raíces y de hijos. Una solicitud de hijos incluye parentKey; ambas transportan la consulta, revisiones de jerarquía y relación e identificador requestId. Tu aplicación carga los registros y aplica la relación correspondiente.

Esta es una simulación local con un botón de respuesta explícito, no un servicio de red. Aplica las raíces, expande Diseño y después aplica sus hijos. En producción, conserva la identidad de la solicitud y rechaza respuestas antiguas. Los estados de carga, error y relación cargada pertenecen a la aplicación.

Cargar raíces e hijos

Aplica primero la respuesta de raíces. Después expande Diseño y aplica la respuesta de sus hijos.

Tarea Horas
No hay tareas

Solicitud pendiente: —

Virtualizar filas visibles

La virtualización renderiza una ventana de filas jerárquicas visibles. Aporta valores fijos de itemSize y overscan y mantén el contenido dentro de esa altura. La expansión cambia la secuencia visible; no requiere sustituir la jerarquía por datos de Table.

Con virtualización, el desplazamiento contenido tiene prioridad sobre las filas apiladas para conservar la geometría fija. rangeChange informa de la ventana; la carga remota de la jerarquía mantiene su contrato independiente de raíces e hijos.

Virtualizar filas visibles
Tarea Horas
Tarea 1
1
Tarea 2
2
Tarea 3
3
Tarea 4
4
Tarea 5
5
Tarea 6
6
Tarea 7
7
Tarea 8
8
Tarea 9
1
Tarea 10
2
Tarea 11
3
Tarea 12
4
Tarea 13
5
Tarea 14
6

Accesibilidad y teclado

Core aporta la estructura treegrid, niveles de jerarquía, estado de expansión y navegación por teclado. Tu aplicación aporta un nombre útil para la tabla, cabeceras comprensibles y nombres para los controles personalizados. Una plantilla de nodo debe conservar el propósito y un nombre legible para ese nodo.

Usa la columna de árbol para la jerarquía y mantén visible el foco al expandir, seleccionar o editar. Prueba la selección de descendientes cargados, los recorridos de error y reintento y los editores con tu contenido real y tecnología de asistencia.

Tecla
Acción
Tab / Shift+Tab Entra y sal del treegrid y de sus controles habilitados.
ArrowUp / ArrowDown Recorre las filas visibles cuando está activa la navegación por filas.
ArrowRight / ArrowLeft Expande o cierra un nodo en la navegación jerárquica.
Enter / Space Activa el control de expansión o selección enfocado.

API

TreeTable tiene sus propios tipos públicos y contextos de plantilla. No sustituyas sus opciones o eventos por los de Table solo porque los nombres se parezcan. Los inputs contienen el estado aplicado; los outputs de propuesta solicitan a la aplicación que aplique el siguiente estado. TreeTable no tiene modelos bidireccionales.

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
appearanceNeuTreeTableAppearance{ density: 'normal', borders: 'rows', striped: false, stickyHeader: false, responsive: 'contained-scroll', }[appearance]Densidad, bordes, filas alternas, cabeceras fijas y presentación responsive.
columnsreadonly NeuTreeTableColumn<T, F>[][][columns]Identificadores, cabeceras, campos y descriptores opcionales de columnas de TreeTable.
datareadonly T[][][data]Registros de nodos cargados; hierarchy los referencia mediante rowKey.
dataModeNeuTreeTableDataMode'client'[dataMode]client usa las relaciones cargadas; remote emite solicitudes de raíces e hijos.
editingOptionsNeuTreeTableEditingOptions<T, K, F>{ mode: 'none' }[editingOptions]Edición desactivada, de celda o de fila y validador opcional que devuelve true o un mensaje de error.
editStateNeuTreeTableEditState<K>{ kind: 'none', }[editState]Sesión aplicada de edición de celda o fila de nodo, o kind none.
expandedKeysreadonly K[][][expandedKeys]Claves aplicadas de los nodos expandidos.
exportOptionsNeuTreeTableExportOptions{ formats: [], defaultFilename: 'tree-table', }[exportOptions]Formatos de exportación habilitados y nombre de archivo por defecto.
filterOptionsNeuTreeTableFilterOptions<T, F>{ surfaces: [], globalFields: [], predicates: {}, debounceMs: 0, commit: 'immediate' }[filterOptions]Superficies de filtro, campos globales, predicados, retardo y aplicación inmediata o explícita.
hierarchyNeuTreeTableHierarchy<K>EMPTY_HIERARCHY as NeuTreeTableHierarchy<K>Valor derivado[hierarchy]Raíces y relaciones de hijos, con estado loaded/loading/error/unloaded e identidades de revisión.
hierarchyOptionsNeuTreeTableHierarchyOptionsObligatorio[hierarchyOptions]Columna usada para el árbol y sangría en píxeles por nivel de profundidad.
interactionOptionsNeuTreeTableInteractionOptions{ navigation: 'row', wrapFocus: false, announceChanges: false, contextMenuAction: false, }[interactionOptions]Navegación por filas, retorno circular del foco, anuncios y acción de menú contextual.
labelsNeuTreeTableLabels{ ariaLabel: 'Tree table', empty: 'No data', loading: 'Loading', error: 'Unable to load tree data', retry: 'Retry', expand: 'Expand node', collapse: 'Collapse node', selection: 'Selection', pagination: 'Pagination', }[labels]Nombre localizado del treegrid y mensajes de expansión, selección, paginación y estados.
layoutNeuTreeTableLayoutState{ order: [], hidden: [], widths: {}, pinnedStart: [], pinnedEnd: [], }[layout]Orden, visibilidad, anchos y fijación de columnas aplicados.
paginationOptionsNeuTreeTablePaginationOptions{ enabled: false, pageSizeOptions: [], position: 'bottom', report: 'none', }[paginationOptions]Política de paginación de TreeTable y controles de páginas de raíces.
queryNeuTreeTableQuery<F>{ page: 0, pageSize: 25, search: '', sort: [], filters: null, }[query]Página, tamaño, búsqueda, ordenación y expresión de filtro aplicados con tipos de TreeTable.
rowKey(value: T) => KObligatorio[rowKey]Función obligatoria que devuelve una clave única y estable para cada nodo.
rowOptionsNeuTreeTableRowOptions<T>{}[rowOptions]Función className opcional que devuelve clases CSS de la aplicación para una fila de nodo.
selectionNeuTreeTableSelection<K>{ kind: 'keys', keys: [], }[selection]Claves de nodos seleccionados aplicadas. La selección no modifica hierarchy ni data.
selectionOptionsNeuTreeTableSelectionOptions<T>{ mode: 'none' }[selectionOptions]Modo, indicadores, selección al pulsar filas, modificadores, intervalos y propagación a descendientes cargados.
sortOptionsNeuTreeTableSortOptions{ mode: 'single', removable: true, defaultDirection: 'asc', resetRootPageOnChange: true, }[sortOptions]Ordenación simple o múltiple, dirección inicial, eliminación y reinicio de página de raíces.
virtualizationOptionsNeuTreeTableVirtualizationOptions{ enabled: false }[virtualizationOptions]Activa una ventana de filas visibles de altura fija con itemSize y overscan.

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
dataRequestNeuTreeTableDataRequest<K, F>(dataRequest)="onDataRequest($event)"Solicita raíces o hijos con revisiones de consulta/jerarquía/relación e identificador; los hijos incluyen parentKey.
editCancelNeuTreeTableEditCancel<T, K>(editCancel)="onEditCancel($event)"Informa de la cancelación de la edición sin confirmar el borrador.
editCommitNeuTreeTableEditCommit<T, K, F>(editCommit)="onEditCommit($event)"Propone un borrador de nodo con clave, campo, valor original y origen; aplica los cambios aceptados a data.
editStateChangeNeuTreeTableEditChange<K>(editStateChange)="onEditStateChange($event)"Propone la siguiente sesión de edición mediante next.
expandedKeysChangeNeuTreeTableExpandedKeysChange<K>(expandedKeysChange)="onExpandedKeysChange($event)"Propone next para las claves expandidas, changedKey y origen por control o teclado.
exportRequestNeuTreeTableExportRequest<F>(exportRequest)="onExportRequest($event)"Solicita una exportación jerárquica gestionada por la aplicación.
featureErrorNeuTreeTableFeatureError(featureError)="onFeatureError($event)"Informa de un diagnóstico tipado de jerarquía o de una función.
layoutChangeNeuTreeTableLayoutChange(layoutChange)="onLayoutChange($event)"Propone un cambio de disposición de columnas; la aplicación controla la disposición aplicada.
queryChangeNeuTreeTableQuery<F>(queryChange)="onQueryChange($event)"Propone la consulta completa siguiente de TreeTable; aplica $event a query.
rangeChangeNeuTreeTableRangeChange(rangeChange)="onRangeChange($event)"Informa de la ventana de filas jerárquicas visibles y renderizadas.
rowActionNeuTreeTableRowAction<T, K>(rowAction)="onRowAction($event)"Informa de una interacción en una fila con la identidad del nodo.
selectionChangeNeuTreeTableSelectionChange<T, K>(selectionChange)="onSelectionChange($event)"Propone next para la selección con claves añadidas/eliminadas, valores cargados y política de propagación.

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
NeuTreeTableCaptionDirective

Encima de la tabla

Directiva pública de template

Un título identifica los datos.

ng-template[neuTreeTableCaption]

Contexto utilizado: —

NeuTreeTableCellDirective

Celda de datos

Directiva pública de template

Los clientes o las horas planificadas usan tu presentación.

ng-template[neuTreeTableCell]

Contexto utilizado: $implicit

NeuTreeTableEditorDirective

Editor de la celda activa

Directiva pública de template

Pulsa una celda editable, cambia su valor y guarda o cancela.

ng-template[neuTreeTableEditor]

Contexto utilizado: draftValue, update, commit, cancel

NeuTreeTableEmptyDirective

Área sin datos

Directiva pública de template

Elige Vacío en el ejemplo para ver el mensaje.

ng-template[neuTreeTableEmpty]

Contexto utilizado: —

NeuTreeTableErrorDirective

Área de error

Directiva pública de template

Elige Error y pulsa Reintentar para volver a solicitar los datos.

ng-template[neuTreeTableError]

Contexto utilizado: retry

NeuTreeTableFooterDirective

Pie de columna

Directiva pública de template

Una etiqueta aparece bajo los datos de la columna indicada.

ng-template[neuTreeTableFooter]

Contexto utilizado: —

NeuTreeTableHeaderDirective

Cabecera de columna

Directiva pública de template

La cabecera usa el nombre de la columna con contenido personalizado.

ng-template[neuTreeTableHeader]

Contexto utilizado: column

NeuTreeTableLoadingDirective

Área de carga

Directiva pública de template

Elige Carga para mostrar un mensaje de estado.

ng-template[neuTreeTableLoading]

Contexto utilizado: —

NeuTreeTableNodeDirective

Columna jerárquica

Directiva pública de template

Expande Diseño para ver las tareas hijas y su nivel.

ng-template[neuTreeTableNode]

Contexto utilizado: $implicit, depth

NeuTreeTableSummaryDirective

Debajo de la tabla

Directiva pública de template

Un total calculado por la aplicación acompaña a la tabla.

ng-template[neuTreeTableSummary]

Contexto utilizado: —

NeuTreeTableToolbarDirective

Antes de las filas

Directiva pública de template

Las instrucciones o acciones de la aplicación acompañan a los datos.

ng-template[neuTreeTableToolbar]

Contexto utilizado: —

Ejemplo de uso

Importa las directivas de TreeTable, no las de Table. neuTreeTableNode personaliza el contenido de la columna jerárquica; neuTreeTableCell personaliza una columna concreta. El contexto incluye el nodo, su profundidad y su estado. El editor usa draftValue y update; no el contrato del editor de Table. El selector de estado permite revisar vacío, carga y error.

Personalizar contenido

Pulsa el lápiz para editar las horas. Guarda el cambio o cancela desde el editor.

Plan de trabajo
Tarea Horas
Diseño(nivel 0)
24 h
Investigación(nivel 1)
8 h
Prototipo(nivel 1)
16 h
Entrega(nivel 0)
12 h
Horas planificadas

Tareas disponibles: 4

Métodos públicos

Nombre
Contrato
exportexport(request: NeuTreeTableExportRequest<F>): Promise<NeuTreeTableExportOutcome>;

Exporta los datos visibles, cargados o seleccionados. Comprueba el resultado y gestiona las solicitudes delegadas en tu aplicación.

example.ts
await table()?.export({ format: 'csv', scope: 'visible' });
focusfocus(target: NeuTreeTableFocusTarget<K>): void;

Enfoca un nodo, una celda o el primer o último nodo visible. No expande los padres cerrados.

example.ts
table()?.focus({ kind: 'node', key: 'design' });
retryDataretryData(target: NeuTreeTableRetryTarget<K>): void;

Reintenta cargar las raíces o los hijos de un padre. La aplicación gestiona el dataRequest resultante.

example.ts
table()?.retryData({ kind: 'children', parentKey: 'design' });
scrollToscrollTo(target: NeuTreeTableScrollTarget<K>): void;

Desplaza la tabla hasta un nodo, un índice de fila o una posición en píxeles. Indica el tipo de destino explícitamente.

example.ts
table()?.scrollTo({ kind: 'node', key: 'design' });

Public Types

Abre un tipo para consultar su definición y los campos de sus interfaces.

Apariencia y tokens

Usa appearance para elegir densidad, bordes, filas alternas y cabeceras fijas. Estas opciones cambian el renderizado propio de TreeTable. Conserva contained-scroll para datos anchos o usa stacked en disposiciones cortas sin virtualización.

El ejemplo local cambia el relleno vertical y horizontal de las celdas y el fondo de selección de TreeTable. Los tokens compartidos de superficie, texto y foco también afectan a otros componentes del contenedor. Elige densidad y bordes para comparar su efecto; el ejemplo anterior de selección muestra cómo se controlan las filas seleccionadas.

Tokens específicos

Token
Efecto
Estado / variante
Valor / origen
Alternativa
--neu-tree-table-cell-block Relleno vertical base; compact usa el 60% y relaxed el 140%. Celdas de tabla 0.625remAlternativa del componenteSin alias de token
--neu-tree-table-cell-inline Relleno horizontal de celda, independiente de la sangría del árbol. Celdas de tabla var(--neu-space-3)Alternativa del componente--neu-space-3
--neu-tree-table-selected-background Fondo de la fila seleccionada, con prioridad sobre las bandas alternas. Fila seleccionada color-mix(in srgb, currentColor 9%, transparent)Alternativa del componenteSin alias de token
--neu-tree-table-virtual-block-size Altura del área virtualizada de la jerarquía. Virtualización 24remDeclaración raízSin 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-focus-color Contorno visible del foco de teclado Compartido con otros consumidores de Core; limita el cambio a un ámbito. var(--neu-primary)
--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
--neu-text-muted Etiquetas secundarias y contenido de ayuda Compartido con otros consumidores de Core; limita el cambio a un ámbito. #475569
--neu-space-1 Separación entre contenido y controles Compartido con otros consumidores de Core; limita el cambio a un ámbito. 0.25rem
--neu-space-3 Separación entre contenido y controles Compartido con otros consumidores de Core; limita el cambio a un ámbito. 0.75rem