Data

DataTable

Tabella dati avanzata con supporto per ordinamento, filtri, paginazione, selezione righe, espansione e raggruppamento. Il sub-componente Column definisce le colonne in modo dichiarativo.

Import

import { DataTable, Column } from '@pzeta/vue-components'
import type {
  DataTableProps,
  DataTableEmits,
  DataTableFilterMeta,
  DataTableSortMeta,
  ColumnProps,
} from '@pzeta/vue-components'

Esempio Base

Props — DataTable

PropTipoDefaultDescrizione
valueT[][]Array di dati da visualizzare
dataKeystring'id'Campo che identifica univocamente ogni riga
loadingbooleanfalseMostra indicatore di caricamento
loadingIconstringundefinedIcona di caricamento custom
lazybooleanfalseAbilita lazy loading (paginazione/sort/filter server-side)
stripedRowsbooleanfalseRighe alternate con sfondo diverso
showGridlinesbooleanfalseMostra linee di separazione celle
size'small' | 'medium' | 'large''medium'Dimensione del componente
showHeaderbooleantrueMostra l'intestazione della tabella
rowHoverbooleantrueEvidenzia riga al passaggio del mouse
tableClassstringClasse CSS aggiuntiva per la tabella
tableStylestring | Record<string, string | number>Stile inline per la tabella
scrollablebooleanfalseAbilita scroll orizzontale/verticale
scrollHeightstring'400px'Altezza area di scroll
sortFieldstringCampo di ordinamento iniziale
sortOrder1 | -1 | 0 | nullnullDirezione ordinamento (1=asc, -1=desc)
multiSortMetaSortMeta[]Metadati per ordinamento multi-colonna
sortMode'single' | 'multiple''single'Modalità ordinamento
removableSortbooleanfalsePermette di rimuovere l'ordinamento con un terzo click
paginatorbooleanfalseAbilita la paginazione
rowsnumber10Numero di righe per pagina
firstnumber0Indice della prima riga visualizzata
totalRecordsnumberNumero totale di record (necessario in lazy mode)
rowsPerPageOptionsnumber[][10, 25, 50]Opzioni per il dropdown righe per pagina
pageLinkSizenumber5Numero di link pagina da mostrare
paginatorPosition'top' | 'bottom' | 'both''bottom'Posizione del paginatore
alwaysShowPaginatorbooleantrueMostra paginatore anche con una sola pagina
currentPageReportTemplatestring'Showing {first} to {last} of {totalRecords} entries'Template report pagina corrente
filtersFilterMetaFiltri attivi (v-model:filters)
filterDisplay'menu' | 'row''menu'Modalità visualizzazione filtri
globalFilterFieldsstring[]Campi inclusi nel filtro globale
selectionT | T[]Righe selezionate (v-model:selection)
selectionMode'single' | 'multiple' | 'checkbox'undefinedModalità selezione righe
metaKeySelectionbooleantrueRichiede Ctrl/Meta per selezione multipla
selectAllbooleanStato checkbox header (v-model:selectAll)
expandedRowsT[]Righe espanse (v-model:expandedRows)
editMode'cell' | 'row'Modalità editing inline
editingRowsT[]Righe in fase di modifica (v-model:editingRows)
rowGroupMode'subheader' | 'rowspan'Modalità raggruppamento righe
groupRowsBystring | string[]Campo per raggruppamento
expandableRowGroupsbooleanGruppi espandibili
resizableColumnsbooleanfalseAbilita ridimensionamento colonne
columnResizeMode'fit' | 'expand''fit'Modalità ridimensionamento
reorderableColumnsbooleanfalseAbilita riordinamento colonne tramite drag
contextMenubooleanAbilita menu contestuale al right-click
frozenValueT[]Righe fisse in cima alla tabella
stateStorage'session' | 'local'Storage per persistenza stato
stateKeystringChiave univoca per lo stato salvato
responsiveLayout'scroll' | 'stack''scroll'Comportamento responsive
breakpointstring'768px'Breakpoint per layout stack
csvSeparatorstring','Separatore CSV per export
exportFilenamestring'download'Nome file per export CSV
emptyMessagestringTesto mostrato quando non ci sono dati
rowClassstring | ((data: T) => string)Classe CSS dinamica per riga
rowStyleRecord<string, string | number> | ((data: T) => Record<string, string | number>)Stile inline dinamico per riga

Props — Column

PropTipoDefaultDescrizione
fieldstringCampo dati della colonna
headerstringTesto intestazione
footerstringTesto footer
columnKeystringChiave univoca se field non è definito
dataType'string' | 'number' | 'date' | 'boolean' | 'custom'Tipo dato (determina allineamento automatico)
sortablebooleanfalseAbilita ordinamento su questa colonna
sortFieldstringCampo usato per l'ordinamento (default: field)
filterFieldstringCampo usato per il filtro (default: field)
filterMatchModestringModalità di match per il filtro (attiva la colonna filtrabile)
hiddenbooleanfalseNasconde la colonna
widthstringLarghezza colonna (es. '200px', '20%')
minWidthstringLarghezza minima
maxWidthstringLarghezza massima
frozenbooleanfalseColonna fissa (frozen)
alignFrozen'left' | 'right''left'Lato della colonna frozen
expanderbooleanfalseLa colonna mostra il pulsante di espansione riga
rowReorderbooleanfalseLa colonna abilita drag-and-drop riordinamento righe
rowEditorbooleanfalseLa colonna mostra i controlli di editing riga
selectionMode'single' | 'multiple' | 'checkbox'Rende questa colonna la colonna di selezione
exportablebooleantrueInclude la colonna nell'export CSV
exportHeaderstringHeader usato nell'export CSV
alignHeader'left' | 'center' | 'right''left'Allineamento intestazione
alignBody'left' | 'center' | 'right'Allineamento celle body (default: automatico da dataType)
stylestring | Record<string, string | number>Stile cella
classstring | Record<string, unknown>Classe CSS cella
headerStylestring | Record<string, string | number>Stile intestazione
headerClassstring | Record<string, unknown>Classe intestazione
bodyStylestring | Record<string, string | number>Stile body
bodyClassstring | Record<string, unknown>Classe body
colspannumberColspan per raggruppamento celle
rowspannumberRowspan per raggruppamento celle
excludeGlobalFilterbooleanfalseEsclude la colonna dal filtro globale
showFilterMenubooleantrueMostra menu filtro
showClearButtonbooleanfalseMostra pulsante reset filtro
maxConstraintsnumber2Numero massimo di filtri per colonna

Emits

EventoPayloadDescrizione
update:firstnumberCambio indice prima riga (paginazione)
update:rowsnumberCambio righe per pagina
update:sortFieldstringCambio campo di ordinamento
update:sortOrderSortOrderCambio direzione ordinamento
update:multiSortMetaSortMeta[]Cambio metadati multi-sort
update:selectionT | T[]Cambio selezione righe
update:filtersFilterMetaCambio filtri attivi
update:expandedRowsT[]Cambio righe espanse
update:selectAllbooleanCambio stato "seleziona tutto"
update:editingRowsT[]Cambio righe in editing
pagePageEventCambio pagina
sortSortEventCambio ordinamento
filterFilterEventApplicazione filtro
rowClickRowClickEvent<T>Click su una riga
rowDblclickRowClickEvent<T>Doppio click su una riga
rowSelectRowSelectEvent<T>Riga selezionata
rowUnselectRowSelectEvent<T>Riga deselezionata
rowSelectAll{ originalEvent: Event; data: T[] }Selezionate tutte le righe
rowUnselectAll{ originalEvent: Event }Deselezionate tutte le righe
rowExpand{ data: T }Riga espansa
rowCollapse{ data: T }Riga collassata
rowContextmenu{ originalEvent: MouseEvent; data: T; index: number }Right-click su riga
columnReorder{ dragIndex: number; dropIndex: number; columns: unknown[] }Colonne riordinate
rowReorder{ dragIndex: number; dropIndex: number; value: T[] }Righe riordinate via drag
columnResize{ element: HTMLElement; delta: number }Colonna ridimensionata
cellEditInit{ data: T; field: string; index: number }Inizio editing cella
cellEditComplete{ data: T; field: string; newValue: unknown; index: number }Editing cella completato
cellEditCancel{ data: T; field: string; index: number }Editing cella annullato
rowEditInit{ data: T; index: number }Inizio editing riga
rowEditSave{ data: T; newData: T; index: number }Editing riga salvato
rowEditCancel{ data: T; index: number }Editing riga annullato
rowgroupExpand{ originalEvent: Event; data: unknown }Gruppo espanso
rowgroupCollapse{ originalEvent: Event; data: unknown }Gruppo collassato
stateSave{ state: TableState }Stato salvato
stateRestore{ state: TableState }Stato ripristinato
valueChangeT[]Dati processati cambiati

Slot — DataTable

SlotScopeDescrizione
defaultPosizione per i componenti Column
headerContenuto sopra la tabella
footerContenuto sotto il body della tabella
emptyTemplate per stato vuoto (nessun dato)
loadingTemplate per stato di caricamento
expansion{ data: T; index: number }Contenuto riga espansa
groupheader{ data: T[]; value: unknown; expanded: boolean }Header gruppo righe
groupfooter{ data: T[]; value: unknown }Footer gruppo righe
paginatorstartContenuto a sinistra del paginatore
paginatorendContenuto a destra del paginatore
body-{field}{ data: T; field: string; index: number; column: ColumnProps }Template body per campo specifico (alternativa agli slot di Column)

Slot — Column

SlotScopeDescrizione
body{ data: T; field: string; index: number; column: ColumnProps }Template cella body
header{ column: ColumnProps }Template intestazione
footer{ column: ColumnProps }Template footer
filter{ field: string; filterModel: unknown; filterCallback: () => void }Template filtro custom
editor{ data: T; field: string; index: number; editorCallback: (value: unknown) => void }Template editor inline

Esempi

Ordinamento

Filtri per riga

Selezione righe

Espansione riga

Lazy Loading (server-side)

<script setup lang="ts">
import { ref } from 'vue'
import type { DataTablePageEvent, DataTableSortEvent } from '@pzeta/vue-components'

const products = ref<Product[]>([])
const totalRecords = ref(0)
const loading = ref(false)

async function loadData(event: DataTablePageEvent) {
  loading.value = true
  const { data, total } = await fetchProducts({
    first: event.first,
    rows: event.rows,
  })
  products.value = data
  totalRecords.value = total
  loading.value = false
}
</script>

<template>
  <DataTable
    :value="products"
    :total-records="totalRecords"
    :loading="loading"
    :lazy="true"
    :paginator="true"
    :rows="10"
    @page="loadData"
    @sort="loadData"
  >
    <Column field="name" header="Nome" :sortable="true" />
    <Column field="price" header="Prezzo" :sortable="true" data-type="number" />
  </DataTable>
</template>

Editing inline (cell mode)

Allineamento automatico per dataType

L'allineamento delle celle body viene determinato automaticamente dal dataType se alignBody non è specificato esplicitamente:

dataTypeAllineamento body
stringsinistra
numberdestra
datecentro
booleancentro

L'header è sempre allineato a sinistra per default. Usa alignHeader e alignBody per override esplicito.

Metodi esposti (defineExpose)

MetodoDescrizione
clearFilter(field)Rimuove il filtro di una colonna
clearAllFilters()Rimuove tutti i filtri attivi
hasActiveFilter(field)Verifica se una colonna ha un filtro attivo
getFilterValue(field)Restituisce il valore del filtro corrente
processedDataDati dopo filtro e ordinamento
paginatedDataDati della pagina corrente
saveState()Salva lo stato corrente nello storage configurato
restoreState()Ripristina lo stato dallo storage
clearState()Cancella lo stato salvato

Accessibilità

La tabella usa markup semantico <table>, <thead>, <th>, <td>. Le colonne ordinabili ricevono l'attributo aria-sort. Il paginatore interno usa <nav> con aria-label localizzato tramite il sistema i18n.

TypeScript

import type {
  DataTableProps,
  DataTableEmits,
  DataTableFilterMeta,
  DataTableSortMeta,
  DataTablePageEvent,
  DataTableSortEvent,
  DataTableFilterEvent,
  DataTableRowClickEvent,
  DataTableRowSelectEvent,
  DataTableState,
  ColumnProps,
  ColumnSlots,
} from '@pzeta/vue-components'