Forms

MultiSelect

Dropdown per la selezione multipla con chips, filtro, toggle-all e limite di selezione. Supporta visualizzazione comma e chip per i valori selezionati.

Import

import { MultiSelect } from '@pzeta/vue-components'

Esempio Base

Props

PropTipoDefaultDescrizione
modelValueOptionValue[][]Array di valori selezionati (v-model)
optionsArray<string | number | Record<string, unknown>>[]Array di opzioni
optionLabelstring | ((o) => string)nullProprietà o funzione per il testo visualizzato
optionValuestring | ((o) => OptionValue)nullProprietà o funzione per il valore
optionDisabledstring | ((o) => boolean)nullProprietà o funzione per opzione disabilitata
optionGroupLabelstring | ((o) => string)nullLabel del gruppo di opzioni
optionGroupChildrenstring | ((o) => Record<string,unknown>[])nullProprietà con le opzioni figlie
placeholderstring—Testo quando nessuna opzione è selezionata
display'comma' | 'chip''comma'Modalità di visualizzazione dei valori selezionati
maxSelectedLabelsnumber3Numero massimo di label prima di mostrare il conteggio
selectedItemsLabelstring—Testo mostrato quando le selezioni superano maxSelectedLabels
selectionLimitnumbernullNumero massimo di selezioni consentite
showToggleAllbooleantrueMostra checkbox per selezionare/deselezionare tutto
filterbooleanfalseMostra campo di ricerca nel dropdown
filterMatchMode'startsWith' | 'contains' | 'endsWith''contains'Modalità di matching del filtro
filterPlaceholderstring—Placeholder del campo filtro
filterFieldsstring[]nullCampi su cui applicare il filtro
showClearbooleanfalseMostra pulsante per azzerare tutte le selezioni
labelstringnullLabel mostrata sopra il campo
helperTextstringnullTesto di aiuto sotto il campo
errorstringnullMessaggio di errore
reserveMessageSpacebooleantrueRiserva lo spazio del messaggio sotto il campo; false nelle barre filtri (dalla 1.19.0)
invalidbooleanfalseStato di validazione invalido
disabledbooleanfalseDisabilita il componente. Lo stile (bordo, sfondo, testo) è lo stesso di InputText, con l'opacità solo sul wrapper (dalla 1.24.0)
readonlybooleanfalseCampo in sola lettura
requiredbooleanfalseCampo obbligatorio
fluidbooleantrueOccupa tutta la larghezza disponibile
size'small' | 'medium' | 'large''medium'Dimensione del componente
variant'outlined' | 'filled''outlined'Variante visiva
severitySeverity'primary'Colore tema
loadingbooleanfalseStato di caricamento
scrollHeightstring'14rem'Altezza massima del dropdown
appendTo'body' | 'self''body'Target Teleport del dropdown
dataKeystringnullChiave univoca per le opzioni
inputIdstringnullID dell'input per accessibilità
namestringnullNome per i form nativi
ariaLabelstringnullAria label per screen reader
ariaLabelledbystringnullID dell'elemento label ARIA
checkmarkbooleantrueMostra checkbox accanto a ogni opzione
highlightOnSelectbooleantrueEvidenzia le opzioni selezionate
autoFilterFocusbooleanfalseFocus automatico sul filtro all'apertura
resetFilterOnHidebooleantrueResetta il filtro alla chiusura del dropdown
resetFilterOnClearbooleantrueResetta il filtro al clear
defaultValueOptionValue[]nullValore predefinito se modelValue non è fornito
loadingIconstring—Classe CSS icona di caricamento
clearIconstring—Classe CSS icona di cancellazione
dropdownIconstring—Classe CSS icona dropdown

Emits

EventoPayloadDescrizione
update:modelValueOptionValue[]Aggiornamento v-model
change{ originalEvent: Event, value: OptionValue[] }Cambio di selezione
filter{ originalEvent: Event, value: string }Cambio del testo filtro
clearEventTutte le selezioni azzerate
selectAllChange{ originalEvent: Event, checked: boolean }Toggle-all attivato
chipRemove{ originalEvent: Event, value: OptionValue }Chip rimossa
focusEventIl componente riceve il focus
blurEventIl componente perde il focus
keydownKeyboardEventPressione tasto
keyupKeyboardEventRilascio tasto
beforeShow—Prima dell'apertura del dropdown
show—Dropdown aperto
beforeHide—Prima della chiusura del dropdown
hide—Dropdown chiuso

Slot

SlotScopeDescrizione
value{ value: OptionValue[], placeholder: string | null }Personalizza la visualizzazione del valore in modalità comma
chip{ value: OptionValue, option: Record<string, unknown> }Template per ogni chip in modalità chip
option{ option, selected, index }Template per ogni singola opzione
optiongroup{ option }Template per l'intestazione del gruppo
header—Contenuto in cima al dropdown
footer—Contenuto in fondo al dropdown
content{ options, value, selectOption }Override completo del contenuto del dropdown
empty—Messaggio quando non ci sono opzioni
emptyfilter—Messaggio quando il filtro non produce risultati
loader—Stato di caricamento nel dropdown
loadingicon—Icona di caricamento personalizzata
clearicon—Icona del pulsante clear personalizzata
dropdownicon{ expanded: boolean }Icona del dropdown personalizzata
removetokenicon—Icona di rimozione chip personalizzata
headercheckboxicon{ allSelected, partialSelected }Icona checkbox del toggle-all
itemcheckboxicon{ selected: boolean }Icona checkbox di ogni opzione

Esempi

Modalità chip

I valori selezionati vengono visualizzati come badge rimuovibili nel trigger:

Limite di selezione

Con filtro di ricerca

Numero massimo di label

Quando le selezioni superano maxSelectedLabels, viene mostrato un conteggio:

Stati

Chip personalizzata

Accessibilità

  • Il trigger ha role="combobox" con aria-expanded e aria-haspopup="listbox"
  • Supporto navigazione tastiera: ArrowDown/Up naviga le opzioni, Enter/Space seleziona/deseleziona, Escape chiude
  • Un clic su un'opzione o su «seleziona tutti» non toglie il focus al campo (o al filtro), come nel pattern combobox: la tendina resta aperta e il tasto successivo arriva ancora a lei (dalla 1.24.0)
  • In un Dialog, Escape chiude solo la tendina e il dialog si chiude al tasto successivo; vale anche se il focus è finito sul body (useEscapeWhileOpen, dalla 1.24.0)
  • Il pulsante di rimozione di ogni chip si chiama «Rimuovi » (dalla 1.24.0)
  • Il toggle-all è cliccabile e supporta stato parziale (partial check)
  • aria-label e aria-labelledby configurabili

TypeScript

import type { MultiSelectProps, MultiSelectEmits } from '@pzeta/vue-components'

const selectedCodes = ref<string[]>([])

const cities: Array<{ name: string; code: string }> = [
  { name: 'Roma', code: 'RM' },
  { name: 'Milano', code: 'MI' },
]