Components

AddressAutocompleteInput

Input con autocompletamento per indirizzi geografici, integrabile con Google Places, Mapbox o API custom.

Panoramica

AddressAutocompleteInput è un componente per la ricerca e selezione di indirizzi geografici tramite autocompletamento. Non è legato a un provider specifico: accetta funzioni esterne (searchFn, getDetailsFn) che permettono l'integrazione con qualsiasi servizio (Google Places API, Mapbox, HERE, API interne).

Caratteristiche principali:

  • Ricerca indirizzi con debounce configurabile
  • Evento addressResolved con campi strutturati (via, numero civico, CAP, città)
  • Filtro per città tramite prop cityFilter
  • Precisione di ricerca configurabile (searchPrecision)
  • Stato di caricamento durante il fetch

Casi d'uso tipici: form anagrafica, registrazione utenti, indirizzi di spedizione/fatturazione, ricerca punti di interesse.

Anteprima live (con searchFn/getDetailsFn mockati)

Nel preview qui sotto le funzioni simulano un provider esterno con un dataset statico — in produzione si interfacciano a Google Places, Mapbox, HERE o un'API custom.

Utilizzo nello schema

const schema = [{
  name: 'indirizzo',
  type: 'address',
  label: 'Indirizzo',
  props: {
    searchFn: searchAddresses,
    getDetailsFn: getAddressDetails,
    cityFilter: formData.citta,    // Filtro dinamico
    debounceTime: 400,
    placeholder: 'Inizia a digitare l\'indirizzo...',
  }
}]

Utilizzo diretto

Senza funzione di dettaglio (solo autocompletamento)

Struttura tipi

interface Prediction {
  place_id: string
  description: string
}

interface Address {
  formatted_address: string
  place_id?: string
  streetNumber?: string
  postalCode?: string
  city?: string
  [key: string]: unknown
}

interface AddressResolvedData {
  formattedAddress: string
  placeId?: string
  streetNumber?: string
  postalCode?: string
  city?: string
}

Props

PropTipoDefaultDescrizione
modelValueAddress | nullnullIndirizzo selezionato (v-model)
labelstringEtichetta del campo
helperTextstringTesto di supporto sotto il campo
errorstringMessaggio di errore (attiva stato invalid)
disabledbooleanfalseDisabilita il campo
invalidbooleanfalseAttiva visivamente lo stato di errore
loadingbooleanfalseMostra stato di caricamento esterno
searchFn(query: string, cityFilter?: string) => Promise<Prediction[]>Funzione per cercare suggerimenti
getDetailsFn(placeId: string) => Promise<Address>Funzione per ottenere dettagli indirizzo
cityFilterstringFiltro città per raffinare i risultati
debounceTimenumber300Ritardo debounce in ms prima di invocare searchFn
searchPrecisionnumber3Numero di caratteri aggiuntivi richiesti dopo il primo spazio
placeholderstring(da i18n)Testo placeholder
languagestring'it'Lingua dei risultati (passata a searchFn)

Deprecate (backward compatibility): cityInputId, streetNumberId, postalCodeId — usano document.getElementById con sanitizzazione. Preferire cityFilter e l'evento addressResolved.

Eventi

EventoPayloadDescrizione
update:modelValueAddress | nullIndirizzo aggiornato
addressResolvedAddressResolvedDataEmesso dopo la selezione con tutti i campi strutturati
addressClearedEmesso quando l'utente cancella la selezione
errorErrorEmesso in caso di errore durante searchFn o getDetailsFn

Validazione suggerita

import { z } from 'zod'

const schema = z.object({
  indirizzo: z.object({
    formatted_address: z.string().min(1),
    place_id: z.string().optional(),
  }).nullable().refine(v => v !== null, {
    message: 'L\'indirizzo è obbligatorio'
  }),
})