Forms

TreeSelect

Dropdown con struttura ad albero per selezione gerarchica. Supporta modalità single, multiple e checkbox con selezione a cascata, filtro e visualizzazione chip.

Import

import { TreeSelect } from '@pzeta/vue-components'
import type { TreeNode } from '@pzeta/vue-components'

Struttura TreeNode

Ogni nodo dell'albero è un oggetto TreeNode:

interface TreeNode {
  key?: string | number       // Chiave univoca del nodo (obbligatoria per la selezione)
  label?: string              // Testo visualizzato
  icon?: string               // Classe icona (es. 'pi pi-folder')
  data?: unknown              // Dati custom associati al nodo
  type?: string               // Tipo del nodo (per template personalizzati)
  children?: TreeNode[]       // Nodi figli
  style?: Record<string, string | number>
  class?: string
  selectable?: boolean        // Se false il nodo non è selezionabile (default: true)
  leaf?: boolean              // Se true non ha figli (anche se children è vuoto)
  expanded?: boolean          // Stato di espansione iniziale
}

Esempio Base

Valore del v-model per modalità

Il formato del v-model dipende dalla selectionMode:

  • single: string | number | null — la key del nodo selezionato
  • multiple: TreeSelectSelectionKeys — oggetto { [key]: true } per ogni nodo selezionato
  • checkbox: TreeSelectSelectionKeys — oggetto { [key]: { checked: boolean, partialChecked: boolean } } per ogni nodo
// single
const selected = ref<string | null>(null)

// multiple / checkbox
const selected = ref<TreeSelectSelectionKeys>({})
// dopo selezione: { 'rome': true, 'milan': true }

// checkbox con stato parziale del padre:
// { 'italy': { checked: false, partialChecked: true }, 'rome': { checked: true } }

Props

PropTipoDefaultDescrizione
modelValueTreeSelectSelectionKeys | string | number | nullnullValore selezionato (v-model)
optionsTreeNode[][]Array di nodi radice dell'albero
selectionMode'single' | 'multiple' | 'checkbox''single'Modalità di selezione
display'comma' | 'chip''comma'Modalità di visualizzazione dei valori selezionati
placeholderstringTesto quando nessun nodo è selezionato
maxSelectedLabelsnumber3Numero massimo di label visibili prima di mostrare il conteggio
selectedItemsLabelstring'{0} items selected'Template per il conteggio oltre maxSelectedLabels
metaKeySelectionbooleanfalseRichiede Meta/Ctrl per la selezione multipla
expandedKeysTreeSelectExpandedKeys{}Chiavi dei nodi espansi (v-model:expandedKeys)
filterbooleanfalseMostra campo di ricerca nel dropdown
filterPlaceholderstringPlaceholder del campo filtro
filterMode'lenient' | 'strict''lenient'Modalità filtro: lenient mostra i padri dei risultati, strict solo i match esatti
filterBystring'label'Campo del nodo su cui applicare il filtro
filterLocalestringLocale per il filtro
labelstringLabel mostrata sopra il campo
helperTextstringTesto di aiuto sotto il campo
errorstringMessaggio di errore
invalidbooleanfalseStato di validazione invalido
disabledbooleanfalseDisabilita il componente
requiredbooleanfalseCampo obbligatorio
fluidbooleantrueOccupa tutta la larghezza disponibile
size'small' | 'medium' | 'large''medium'Dimensione del componente
variant'outlined' | 'filled''outlined'Variante visiva
loadingbooleanfalseStato di caricamento
showClearbooleanfalseMostra pulsante per azzerare la selezione
scrollHeightstring'20rem'Altezza massima del pannello dropdown
appendTo'body' | 'self''body'Target Teleport del dropdown
inputIdstringID dell'input per accessibilità
ariaLabelstringAria label per screen reader
ariaLabelledbystringID dell'elemento label ARIA
autoFilterFocusbooleanfalseFocus automatico sul filtro all'apertura
resetFilterOnHidebooleanfalseResetta il filtro alla chiusura
expandOnOpenbooleanfalseEspande tutti i nodi all'apertura del dropdown
loadingIconstringClasse CSS icona di caricamento
dropdownIconstringClasse CSS icona dropdown
clearIconstringClasse CSS icona clear

Emits

EventoPayloadDescrizione
update:modelValueTreeSelectSelectionKeys | string | number | nullAggiornamento v-model
update:expandedKeysTreeSelectExpandedKeysAggiornamento chiavi espanse
change{ originalEvent: Event, value }Cambio di selezione
nodeSelectTreeNodeNodo selezionato
nodeUnselectTreeNodeNodo deselezionato
nodeExpandTreeNodeNodo espanso
nodeCollapseTreeNodeNodo collassato
filter{ originalEvent: Event, value: string }Cambio del testo filtro
clearEventSelezione azzerata
focusFocusEventIl componente riceve il focus
blurFocusEventIl componente perde il focus
beforeShowPrima dell'apertura del dropdown
showDropdown aperto
beforeHidePrima della chiusura del dropdown
hideDropdown chiuso

Slot

SlotScopeDescrizione
value{ value, placeholder }Personalizza la visualizzazione del valore nel trigger
headerContenuto in cima al dropdown
footerContenuto in fondo al dropdown
emptyMessaggio quando non ci sono nodi
emptyfilterMessaggio quando il filtro non produce risultati
option{ node: TreeNode, selected: boolean }Template per il contenuto di ogni nodo
togglericon{ node: TreeNode, expanded: boolean }Icona di espansione/collasso del nodo
checkboxicon{ checked: boolean, partialChecked: boolean }Icona checkbox del nodo
nodeicon{ node: TreeNode }Icona del nodo
dropdownicon{ expanded: boolean }Icona del dropdown personalizzata
cleariconIcona del pulsante clear personalizzata
loadingiconIcona di caricamento personalizzata

Esempi

Modalità checkbox con selezione a cascata

Selezionando un nodo padre tutti i figli vengono automaticamente selezionati:

Modalità multiple

Con filtro

Nodo non selezionabile

Impostare selectable: false sul nodo per renderlo non selezionabile (utile per categorie o sezioni):

const nodes: TreeNode[] = [
  {
    key: 'settings',
    label: 'Impostazioni',
    icon: 'pi pi-cog',
    selectable: false,   // Non selezionabile
    children: [
      { key: 'profile', label: 'Profilo' },
    ],
  },
]

Gestione eventi nodo

<TreeSelect
  v-model="selected"
  :options="nodes"
  @node-select="node => console.log('Selezionato:', node.label)"
  @node-unselect="node => console.log('Deselezionato:', node.label)"
  @node-expand="node => console.log('Espanso:', node.label)"
/>

Accessibilità

  • Il trigger ha role="combobox" con aria-expanded e aria-haspopup
  • Supporto navigazione tastiera: ArrowDown apre il dropdown, Enter/Space apre il dropdown, Escape chiude
  • aria-label e aria-labelledby configurabili
  • Input nascosto associato alla label per compatibilità form

TypeScript

import type {
  TreeSelectProps,
  TreeSelectEmits,
  TreeSelectSelectionKeys,
  TreeSelectExpandedKeys,
  TreeSelectChangeEvent,
} from '@pzeta/vue-components'
import type { TreeNode } from '@pzeta/vue-components'

// Selezione checkbox
const selected = ref<TreeSelectSelectionKeys>({})
// Esempio valore: { 'rome': { checked: true, partialChecked: false } }

// Selezione singola
const selectedKey = ref<string | null>(null)
// Esempio valore: 'rome'