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
  • 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>

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 | FilterCriteriaFiltro 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