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
  • In alternativa a fetchFn, la chiamata PostgREST può essere composta dal componente dichiarando la risorsa: Sorgente dati endpoint
  • 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

Sorgente dati endpoint

In alternativa a fetchFn, ListboxRemote può comporre da sé la chiamata PostgREST a partire dalla risorsa dichiarata:

props: {
  endpoint: 'auth.ruoli',
  order: 'descrizione.asc',
  optionLabel: 'descrizione',
  optionValue: 'idruolo',
  multiple: true
}

fetchFn ha sempre la precedenza: se sono presenti entrambe, endpoint viene ignorato. La forma dell'endpoint, la traduzione dei filtri e l'ordine con cui viene risolto il trasporto sono descritti in Sorgente dati endpoint.

Props

PropTipoDefaultDescrizione
modelValueunknown—Valore/i selezionato/i (v-model); array se multiple: true
labelstring—Etichetta del campo
helperTextstring—Testo di supporto sotto il campo
errorstring—Messaggio di errore (attiva stato invalid)
disabledbooleanfalseDisabilita il campo
invalidbooleanfalseAttiva visivamente lo stato di errore
requiredbooleanfalseIndica campo obbligatorio
fetchFnFetchFn—Funzione asincrona per caricare le opzioni
filterstring | FilterCriteria—Filtro statico passato alla fetchFn
filterFieldsRemoteFilterField[][]Campi del form da osservare per filtri dinamici; la forma estesa { field, column, operator } permette colonna e operatore diversi
fullDataRecord<string, unknown>{}Dati completi del form (per filtri dinamici)
endpointstring—Risorsa PostgREST [schema.]risorsa, alternativa a fetchFn — vedi Sorgente dati endpoint
selectstring—Colonne da selezionare (solo con endpoint)
orderstring—Ordinamento PostgREST, es. 'nome.asc' (solo con endpoint)
limitnumber—Numero massimo di righe restituite (solo con endpoint)
baseUrlstring''Prefisso del gateway PostgREST, se l'endpoint dichiara uno schema
keyNamestring'id'Chiave primaria della risorsa (solo client PostgREST standalone)
optionLabelstring'label'Proprietà da usare come etichetta
optionTemplatestring—Template interpolato per l'etichetta
optionValuestring'value'Proprietà da usare come valore
optionImagestring—Proprietà contenente URL immagine
optionDisabledstring | Function—Proprietà o funzione per disabilitare opzioni
optionGroupLabelstring—Proprietà per etichetta gruppo
optionGroupChildrenstring—Proprietà 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
header—Contenuto sopra la lista
footer—Contenuto sotto la lista
option{ option }Template personalizzato per ogni opzione
optiongroup{ option }Template personalizzato per intestazione gruppo
empty—Contenuto lista vuota
loader—Contenuto 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'),
})