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
reorderper 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
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
modelValue | Array<Record<string, unknown>> | null | [] | Array elementi nell'ordine corrente (v-model) |
label | string | — | Etichetta del campo |
helperText | string | — | Testo di supporto sotto il campo |
error | string | — | Messaggio di errore (attiva stato invalid) |
disabled | boolean | false | Disabilita il drag-and-drop |
invalid | boolean | false | Attiva visivamente lo stato di errore |
fetchFn | FetchFn | — | Funzione asincrona per caricare gli elementi |
filter | string | FilterCriteria | — | Filtro statico passato alla fetchFn |
optionLabel | string | 'label' | Proprietà da usare come etichetta elemento |
optionValue | string | 'value' | Proprietà da usare come identificatore elemento |
listTitle | string | — | Titolo mostrato sopra la lista |
dataKey | string | — | Chiave univoca per identificare gli elementi |
scrollHeight | string | '14rem' | Altezza area scrollabile |
striped | boolean | false | Righe alternate colorate |
Slot
| Slot | Props | Descrizione |
|---|---|---|
header | — | Header lista (sovrascrive listTitle) |
option | { option, index } | Template personalizzato per ogni elemento |
Metodi esposti
| Metodo | Descrizione |
|---|---|
reload() | Ricarica i dati chiamando nuovamente la fetchFn |
Eventi
| Evento | Payload | Descrizione |
|---|---|---|
update:modelValue | Array<Record<string, unknown>> | Array aggiornato con il nuovo ordine |
reorder | Array<Record<string, unknown>> | Emesso dopo ogni riordinamento drag-and-drop |
Note sul comportamento
- Al caricamento dei dati remoti, il componente inizializza
itemse emetteupdate:modelValuecon i dati ricevuti - Il parent può aggiornare l'ordine esternamente aggiornando
modelValue; il componente sincronizza internamente senza loop - Il flag
isInternalUpdatepreviene loop di aggiornamento tra il watcherremoteDatae il watchermodelValue