Data

TreeTable

Tabella con struttura dati gerarchica espandibile, supporto per ordinamento, paginazione e selezione nodi tramite il sub-componente Column.

Import

import { TreeTable, Column } from '@pzeta/vue-components'
import type {
  TreeTableProps,
  TreeTableEmits,
  TreeTableNode,
  TreeTableSortEvent,
  TreeTableExpandEvent,
  TreeTableSelectEvent,
} from '@pzeta/vue-components'

Esempio Base

TreeTableNode

interface TreeTableNode {
  key?: string | number           // Chiave univoca del nodo
  data?: Record<string, unknown>  // Dati del nodo (campi corrispondono ai field delle Column)
  children?: TreeTableNode[]      // Nodi figli
  style?: Record<string, string | number>
  class?: string
  selectable?: boolean            // Se false il nodo non è selezionabile
  leaf?: boolean                  // Nodo foglia (nasconde il toggle anche se non ha figli caricati)
}

Props

PropTipoDefaultDescrizione
valueTreeTableNode[][]Array radice dei nodi
dataKeystring'key'Campo usato come chiave univoca del nodo
expandedKeysRecord<string | number, boolean>{}Chiavi dei nodi espansi (v-model:expandedKeys)
selectionMode'single' | 'multiple' | 'checkbox'undefinedModalità selezione nodi
selectionKeysRecord<string | number, boolean> | nullnullChiavi dei nodi selezionati (v-model:selectionKeys)
sortFieldstring—Campo di ordinamento iniziale
sortOrder1 | -1 | 0 | nullnullDirezione ordinamento (1=asc, -1=desc)
sortMode'single' | 'multiple''single'Modalità ordinamento
multiSortMetaSortMeta[][]Metadati per ordinamento multi-colonna
removableSortbooleanfalsePermette di rimuovere l'ordinamento
paginatorbooleanfalseAbilita la paginazione
rowsnumber10Numero di righe per pagina
firstnumber0Indice del primo record
totalRecordsnumber—Totale record (per lazy mode)
rowsPerPageOptionsnumber[][10, 25, 50]Opzioni righe per pagina
paginatorTemplatestring'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink'Template paginatore
indentationnumber16Indentazione in pixel per livello gerarchico
loadingbooleanfalseMostra indicatore di caricamento
loadingIconstringundefinedIcona di caricamento custom
stripedRowsbooleanfalseRighe alternate con sfondo diverso
showGridlinesbooleanfalseMostra linee di separazione celle
size'small' | 'medium' | 'large''medium'Dimensione del componente
showHeaderbooleantrueMostra l'intestazione della tabella
rowHoverbooleantrueEvidenzia riga al passaggio del mouse
scrollablebooleanfalseAbilita scroll
scrollHeightstring'400px'Altezza area di scroll
emptyMessagestring—Testo stato vuoto
globalFilterstring—Testo filtro globale
contextMenuboolean—Abilita menu contestuale
captionstring—Didascalia della treegrid, resa come <caption> visibile solo agli screen reader: è il suo nome accessibile
droppablebooleanfalseI nodi accettano le righe trascinate da una DataTable con draggable-rows ed emettono nodeDrop (dalla 1.24.0). Vedi Righe rilasciate su un nodo
rowClassstring | ((node: TreeTableNode) => string)—Classe CSS dinamica per riga
rowStyleRecord<string, string | number> | ((node: TreeTableNode) => Record<string, string | number>)—Stile inline dinamico per riga

Per le props delle colonne si usa lo stesso Column di DataTable. Vedere la sezione Props — Column.

Emits

EventoPayloadDescrizione
update:expandedKeysRecord<string | number, boolean>Chiavi espanse cambiate
update:selectionKeysRecord<string | number, boolean> | nullSelezione cambiata
update:firstnumberPrima riga cambiata
update:rowsnumberRighe per pagina cambiate
update:sortFieldstringCampo di sort cambiato
update:sortOrderTreeTableSortOrderOrdine sort cambiato
update:multiSortMetaSortMeta[]Multi-sort meta cambiati
nodeExpandTreeTableExpandEventNodo espanso ({ node: TreeTableNode })
nodeCollapseTreeTableCollapseEventNodo collassato ({ node: TreeTableNode })
nodeSelectTreeTableSelectEventNodo selezionato ({ originalEvent: Event; node: TreeTableNode })
nodeUnselectTreeTableUnselectEventNodo deselezionato ({ originalEvent: Event; node: TreeTableNode })
sortTreeTableSortEventOrdinamento cambiato
pageTreeTablePageEventPagina cambiata
nodeContextmenu{ originalEvent: MouseEvent; node: TreeTableNode }Right-click su nodo
nodeDropTreeTableNodeDropEventRighe di una DataTable rilasciate su un nodo, con droppable ({ originalEvent: DragEvent; node: TreeTableNode; data: unknown[] }, dalla 1.24.0)

Slot

SlotScopeDescrizione
header—Contenuto sopra la tabella
footer—Contenuto sotto il body della tabella
empty—Template per stato vuoto
loading—Template per stato di caricamento
body-{field}{ node: TreeTableNode; data: unknown; field: string; column: ColumnProps }Template body per campo specifico

Il sub-componente Column supporta gli stessi slot di DataTable: body, header, footer. Lo scope del slot body riceve { data: node.data, node: TreeTableNode, field, column }. Il contenuto dello slot non viene ricreato quando la tabella si ridisegna (dalla 1.24.0): prima il focus di una riga lo rimontava e il primo clic su un pulsante della cella andava perso.

Esempi

Selezione con checkbox

Ordinamento

Paginazione

Template body personalizzato

Righe rilasciate su un nodo

Con droppable (dalla 1.24.0) ogni nodo accetta le righe trascinate da una DataTable con draggable-rows: il nodo sotto il puntatore è evidenziato e il rilascio emette nodeDrop con il nodo e le righe (data). Una riga che fa parte della selezione trascina tutta la selezione. Il componente non sposta nulla da sé: è il chiamante a aggiornare i dati.

Il trascinamento richiede un puntatore: da tastiera serve un'alternativa equivalente, per esempio un'azione «Sposta in…».

Metodi esposti (defineExpose)

MetodoDescrizione
expandAll()Espande tutti i nodi che hanno figli
collapseAll()Collassa tutti i nodi

Accessibilità

La tabella usa markup semantico con ruolo treegrid: livello, stato di espansione e selezione sono negli attributi aria-level, aria-expanded e aria-selected di ogni riga, e data-level guida l'indentazione visiva. I controlli di espansione sono <button> accessibili da tastiera.

  • caption è il nome della treegrid, reso come <caption> visibile solo agli screen reader (dalla 1.24.0 la classe che la nasconde ha la sua regola: prima la didascalia compariva sopra la tabella).
  • Gli attributi aria-* passati alla TreeTable (aria-label, aria-describedby…) finiscono sulla <table> che ha il ruolo treegrid; classi e data-* restano sul contenitore (dalla 1.24.0).
  • Nel tema scuro il testo dei livelli 2 e 3 usa neutral-400: neutral-500 su slate-800 si fermava a circa 3:1 (dalla 1.24.0).

TypeScript

import type {
  TreeTableProps,
  TreeTableEmits,
  TreeTableNode,
  TreeTableColumnProps,
  TreeTableSortEvent,
  TreeTableExpandEvent,
  TreeTableCollapseEvent,
  TreeTableSelectEvent,
  TreeTableUnselectEvent,
  TreeTablePageEvent,
  TreeTableSelectionMode,
  TreeTableNodeDropEvent,
} from '@pzeta/vue-components'