TreeTable
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
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
value | TreeTableNode[] | [] | Array radice dei nodi |
dataKey | string | 'key' | Campo usato come chiave univoca del nodo |
expandedKeys | Record<string | number, boolean> | {} | Chiavi dei nodi espansi (v-model:expandedKeys) |
selectionMode | 'single' | 'multiple' | 'checkbox' | undefined | Modalità selezione nodi |
selectionKeys | Record<string | number, boolean> | null | null | Chiavi dei nodi selezionati (v-model:selectionKeys) |
sortField | string | — | Campo di ordinamento iniziale |
sortOrder | 1 | -1 | 0 | null | null | Direzione ordinamento (1=asc, -1=desc) |
sortMode | 'single' | 'multiple' | 'single' | Modalità ordinamento |
multiSortMeta | SortMeta[] | [] | Metadati per ordinamento multi-colonna |
removableSort | boolean | false | Permette di rimuovere l'ordinamento |
paginator | boolean | false | Abilita la paginazione |
rows | number | 10 | Numero di righe per pagina |
first | number | 0 | Indice del primo record |
totalRecords | number | — | Totale record (per lazy mode) |
rowsPerPageOptions | number[] | [10, 25, 50] | Opzioni righe per pagina |
paginatorTemplate | string | 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink' | Template paginatore |
indentation | number | 16 | Indentazione in pixel per livello gerarchico |
loading | boolean | false | Mostra indicatore di caricamento |
loadingIcon | string | undefined | Icona di caricamento custom |
stripedRows | boolean | false | Righe alternate con sfondo diverso |
showGridlines | boolean | false | Mostra linee di separazione celle |
size | 'small' | 'medium' | 'large' | 'medium' | Dimensione del componente |
showHeader | boolean | true | Mostra l'intestazione della tabella |
rowHover | boolean | true | Evidenzia riga al passaggio del mouse |
scrollable | boolean | false | Abilita scroll |
scrollHeight | string | '400px' | Altezza area di scroll |
emptyMessage | string | — | Testo stato vuoto |
globalFilter | string | — | Testo filtro globale |
contextMenu | boolean | — | Abilita menu contestuale |
caption | string | — | Didascalia della treegrid, resa come <caption> visibile solo agli screen reader: è il suo nome accessibile |
droppable | boolean | false | I nodi accettano le righe trascinate da una DataTable con draggable-rows ed emettono nodeDrop (dalla 1.24.0). Vedi Righe rilasciate su un nodo |
rowClass | string | ((node: TreeTableNode) => string) | — | Classe CSS dinamica per riga |
rowStyle | Record<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
| Evento | Payload | Descrizione |
|---|---|---|
update:expandedKeys | Record<string | number, boolean> | Chiavi espanse cambiate |
update:selectionKeys | Record<string | number, boolean> | null | Selezione cambiata |
update:first | number | Prima riga cambiata |
update:rows | number | Righe per pagina cambiate |
update:sortField | string | Campo di sort cambiato |
update:sortOrder | TreeTableSortOrder | Ordine sort cambiato |
update:multiSortMeta | SortMeta[] | Multi-sort meta cambiati |
nodeExpand | TreeTableExpandEvent | Nodo espanso ({ node: TreeTableNode }) |
nodeCollapse | TreeTableCollapseEvent | Nodo collassato ({ node: TreeTableNode }) |
nodeSelect | TreeTableSelectEvent | Nodo selezionato ({ originalEvent: Event; node: TreeTableNode }) |
nodeUnselect | TreeTableUnselectEvent | Nodo deselezionato ({ originalEvent: Event; node: TreeTableNode }) |
sort | TreeTableSortEvent | Ordinamento cambiato |
page | TreeTablePageEvent | Pagina cambiata |
nodeContextmenu | { originalEvent: MouseEvent; node: TreeTableNode } | Right-click su nodo |
nodeDrop | TreeTableNodeDropEvent | Righe di una DataTable rilasciate su un nodo, con droppable ({ originalEvent: DragEvent; node: TreeTableNode; data: unknown[] }, dalla 1.24.0) |
Slot
| Slot | Scope | Descrizione |
|---|---|---|
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)
| Metodo | Descrizione |
|---|---|
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 allaTreeTable(aria-label,aria-describedby…) finiscono sulla<table>che ha il ruolotreegrid; classi edata-*restano sul contenitore (dalla 1.24.0). - Nel tema scuro il testo dei livelli 2 e 3 usa
neutral-400:neutral-500su 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'
Tree
Visualizzazione gerarchica interattiva con supporto per selezione (single, multiple, checkbox), filtro testuale e espansione/collasso dei nodi.
WeekScheduler
Griglia settimanale risorsa x giorno (es. autisti x giorni della settimana), con giorni divisi in turni opzionali e slot personalizzabili per intestazioni, celle ed eventi. Pensato per planner, scheduler, gestione turni e assegnazioni.