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)
sortFieldstringCampo 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
totalRecordsnumberTotale 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
emptyMessagestringTesto stato vuoto
globalFilterstringTesto filtro globale
contextMenubooleanAbilita menu contestuale
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

Slot

SlotScopeDescrizione
headerContenuto sopra la tabella
footerContenuto sotto il body della tabella
emptyTemplate per stato vuoto
loadingTemplate 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 }.

Esempi

Selezione con checkbox

Ordinamento

Paginazione

Template body personalizzato

Metodi esposti (defineExpose)

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

Accessibilità

La tabella usa markup semantico. La gerarchia viene comunicata tramite data-level per l'indentazione visiva. I controlli di espansione sono <button> accessibili da tastiera.

TypeScript

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