Components

OrderListRemote

Lista ordinabile tramite drag-and-drop con caricamento dati remoto per gestire l'ordine degli elementi.

Panoramica

OrderListRemote è un componente che carica una lista di elementi da una sorgente remota e consente di riordinarli tramite drag-and-drop. Il valore emesso è l'array degli elementi nell'ordine corrente.

Caratteristiche principali:

  • Caricamento asincrono elementi tramite fetchFn
  • In alternativa a fetchFn, la chiamata PostgREST può essere composta dal componente dichiarando la risorsa: Sorgente dati endpoint
  • Riordinamento visuale drag-and-drop
  • Evento reorder per tracking delle modifiche di ordine
  • Template personalizzato per la visualizzazione degli elementi
  • Supporto lista con righe alternate (striped)
  • Sincronizzazione bidirezionale: il parent può aggiornare l'ordine anche esternamente

Casi d'uso tipici: ordinamento voci di menu, priorità task, sequenza fasi di workflow, ordinamento categorie.

Anteprima live (con fetchFn mockato)

Utilizzo nello schema

const schema = [{
  name: 'vociMenu',
  type: 'orderlist',
  label: 'Ordine voci menu',
  props: {
    fetchFn: fetchVociMenu,
    optionLabel: 'titolo',
    optionValue: 'id',
    listTitle: 'Trascina per riordinare',
    striped: true,
  }
}]

Utilizzo diretto

<OrderListRemote
  v-model="elementiOrdinati"
  :fetch-fn="fetchElementi"
  option-label="nome"
  option-value="id"
  list-title="Ordine di visualizzazione"
  :striped="true"
  @reorder="handleReorder"
/>

Con template personalizzato per ogni elemento

<OrderListRemote
  v-model="task"
  :fetch-fn="fetchTask"
  option-value="id"
  list-title="Priorità task"
>
  <template #option="{ option }">
    <div class="flex items-center gap-3 py-1">
      <i :class="option.icona" class="text-primary" />
      <div>
        <div class="font-medium">{{ option.titolo }}</div>
        <div class="text-sm text-gray-500">{{ option.assegnatoA }}</div>
      </div>
      <Tag :value="option.priorita" class="ml-auto" />
    </div>
  </template>
</OrderListRemote>

Salvare l'ordine al riordinamento

<script setup lang="ts">
const handleReorder = async (nuovoOrdine: Array<Record<string, unknown>>) => {
  // nuovoOrdine è l'array completo nell'ordine aggiornato
  const aggiornamenti = nuovoOrdine.map((item, index) => ({
    id: item.id,
    posizione: index + 1,
  }))
  await api.aggiornaOrdine(aggiornamenti)
}
</script>

Sorgente dati endpoint

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

props: {
  endpoint: 'prezzi.elementi',
  select: 'idelemento,descrizione,ordinamento',
  order: 'ordinamento.asc',
  optionLabel: 'descrizione'
}

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
modelValueArray<Record<string, unknown>> | null[]Array elementi nell'ordine corrente (v-model)
labelstringEtichetta del campo
helperTextstringTesto di supporto sotto il campo
errorstringMessaggio di errore (attiva stato invalid)
disabledbooleanfalseDisabilita il drag-and-drop
invalidbooleanfalseAttiva visivamente lo stato di errore
fetchFnFetchFnFunzione asincrona per caricare gli elementi
filterstring | endpoint`string
selectstringColonne da selezionare (solo con endpoint)
orderstringOrdinamento PostgREST, es. 'nome.asc' (solo con endpoint)
limitnumberNumero 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)
FilterCriteria`Filtro statico passato alla fetchFn
optionLabelstring'label'Proprietà da usare come etichetta elemento
optionValuestring'value'Proprietà da usare come identificatore elemento
listTitlestringTitolo mostrato sopra la lista
dataKeystringChiave univoca per identificare gli elementi
scrollHeightstring'14rem'Altezza area scrollabile
stripedbooleanfalseRighe alternate colorate

Slot

SlotPropsDescrizione
headerHeader lista (sovrascrive listTitle)
option{ option, index }Template personalizzato per ogni elemento

Metodi esposti

MetodoDescrizione
reload()Ricarica i dati chiamando nuovamente la fetchFn

Eventi

EventoPayloadDescrizione
update:modelValueArray<Record<string, unknown>>Array aggiornato con il nuovo ordine
reorderArray<Record<string, unknown>>Emesso dopo ogni riordinamento drag-and-drop

Note sul comportamento

  • Al caricamento dei dati remoti, il componente inizializza items e emette update:modelValue con i dati ricevuti
  • Il parent può aggiornare l'ordine esternamente aggiornando modelValue; il componente sincronizza internamente senza loop
  • Il flag isInternalUpdate previene loop di aggiornamento tra il watcher remoteData e il watcher modelValue