Components

ListboxRemote

Listbox con caricamento dati remoto, selezione singola o multipla, raggruppamento e immagini nelle opzioni.

Panoramica

ListboxRemote è un componente listbox che carica le opzioni in modo asincrono tramite fetchFn. A differenza di SelectRemote (dropdown), la listbox mostra tutte le opzioni in una lista scorrevole sempre visibile.

Caratteristiche principali:

  • Selezione singola o multipla con checkbox visivi
  • Raggruppamento opzioni per categoria
  • Filtri dinamici su altri campi del form
  • Template personalizzato per etichette
  • Immagini nelle opzioni
  • Messaggio personalizzabile per lista vuota

Casi d'uso tipici: selezione permessi/ruoli, assegnazione tag multipli, selezione elementi da una lista breve sempre visibile.

Anteprima live (con fetchFn mockato)

Utilizzo nello schema

const schema = [{
  name: 'permessi',
  type: 'listboxremote',
  label: 'Permessi utente',
  props: {
    fetchFn: fetchPermessi,
    optionLabel: 'nome',
    optionValue: 'id',
    multiple: true,
    checkmark: true,
    showFilter: true,
  }
}, {
  name: 'paese',
  type: 'listboxremote',
  label: 'Paese',
  props: {
    fetchFn: fetchPaesi,
    optionLabel: 'nome',
    optionValue: 'codice',
    optionImage: 'bandiera',
    multiple: false,
  }
}, {
  // Con raggruppamento
  name: 'categorieSelezionate',
  type: 'listboxremote',
  label: 'Categorie',
  props: {
    fetchFn: fetchCategorieGruppate,
    optionGroupLabel: 'nomeGruppo',
    optionGroupChildren: 'voci',
    optionLabel: 'nome',
    optionValue: 'id',
    multiple: true,
  }
}]

Utilizzo diretto

Props

PropTipoDefaultDescrizione
modelValueunknownValore/i selezionato/i (v-model); array se multiple: true
labelstringEtichetta del campo
helperTextstringTesto di supporto sotto il campo
errorstringMessaggio di errore (attiva stato invalid)
disabledbooleanfalseDisabilita il campo
invalidbooleanfalseAttiva visivamente lo stato di errore
requiredbooleanfalseIndica campo obbligatorio
fetchFnFetchFnFunzione asincrona per caricare le opzioni
filterstring | FilterCriteriaFiltro statico passato alla fetchFn
filterFieldsstring[][]Campi del form da osservare per filtri dinamici
fullDataRecord<string, unknown>{}Dati completi del form (per filtri dinamici)
optionLabelstring'label'Proprietà da usare come etichetta
optionTemplatestringTemplate interpolato per l'etichetta
optionValuestring'value'Proprietà da usare come valore
optionImagestringProprietà contenente URL immagine
optionDisabledstring | FunctionProprietà o funzione per disabilitare opzioni
optionGroupLabelstringProprietà per etichetta gruppo
optionGroupChildrenstringProprietà contenente figli del gruppo
multiplebooleanfalseAbilita selezione multipla
showFilterbooleanfalseMostra campo di ricerca
filterPlaceholderstring(da i18n)Placeholder del campo di ricerca
checkmarkbooleantrueMostra checkmark sugli elementi selezionati
emptyMessagestring(da i18n)Messaggio lista vuota
listStylestring'max-height: 200px'Stile CSS inline per la lista

Slot

SlotPropsDescrizione
headerContenuto sopra la lista
footerContenuto sotto la lista
option{ option }Template personalizzato per ogni opzione
optiongroup{ option }Template personalizzato per intestazione gruppo
emptyContenuto lista vuota
loaderContenuto durante il caricamento

Metodi esposti

MetodoDescrizione
reload()Ricarica i dati chiamando nuovamente la fetchFn

Eventi

EventoPayloadDescrizione
update:modelValueunknownValore aggiornato
change{ originalEvent: Event, value: unknown }Emesso al cambio selezione

Validazione suggerita

import { z } from 'zod'

const schema = z.object({
  // Selezione singola
  paese: z.string().min(1, 'Seleziona un paese').nullable(),

  // Selezione multipla
  permessi: z.array(z.number())
    .min(1, 'Seleziona almeno un permesso'),
})