PivotTable
Import
import { PivotTable } from '@pzeta/vue-components'
Esempio Base
Reportistica ferie/assenze: ore per reparto x (mese / tipo), con aggregazione commutabile e totali.
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
data | Record<string, unknown>[] | (required) | Array dei record sorgente da aggregare |
rows | string[] | (required) | Campi-dimensione disposti sulle righe |
cols | string[] | (required) | Campi-dimensione disposti sulle colonne (generano intestazioni multi-livello) |
measure | string | — | Campo numerico aggregato (ignorato per count). Serve measure oppure measures |
measures | PivotMeasure[] | — | Più misure affiancate, in alternativa a measure/aggregate. Vedi Misure multiple |
aggregate | PivotAggregate | 'sum' | Funzione di aggregazione: 'sum', 'count' o 'avg'. Con measures è il default delle misure che non indicano la propria |
rowHeaderLabels | string[] | undefined | Etichette delle colonne dimensione-riga (default: nome campo) |
measureLabel | string | 'Totale' | Etichetta della colonna/riga dei totali misura |
showRowTotals | boolean | true | Mostra la colonna dei totali di riga |
showColTotals | boolean | true | Mostra la riga dei totali di colonna |
valueFormatter | (value: number) => string | undefined | Formattatore custom del valore numerico delle celle |
emptyText | string | 'Nessun dato da aggregare' | Testo mostrato quando non ci sono dati |
locale | string | 'it-IT' | Locale per ordinamento delle dimensioni e formattazione numerica |
Slots
| Slot | Props | Descrizione |
|---|---|---|
empty | - | Override del contenuto mostrato quando non ci sono dati da aggregare |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
cell-click | PivotCellClickPayload | Emesso al click su una cella valore. Espone rowValues, colValues, value aggregato, measure e records sottostanti |
PivotCellClickPayload
| Proprieta' | Tipo | Descrizione |
|---|---|---|
rowValues | string[] | Valori della tupla dimensione-riga della cella cliccata |
colValues | string[] | Valori della tupla dimensione-colonna della cella cliccata |
value | number | Valore aggregato della cella |
measure | string | Campo della misura della cella (con measures, quello della colonna cliccata) |
records | Record<string, unknown>[] | Record sorgente che concorrono alla cella (utili per drill-down) |
PivotMeasure
Elemento di measures. I campi opzionali ereditano le props di tabella corrispondenti.
| Proprieta' | Tipo | Default | Descrizione |
|---|---|---|---|
field | string | (required) | Campo numerico aggregato (ignorato per count) |
label | string | field | Etichetta nell'intestazione e nei nomi accessibili |
aggregate | PivotAggregate | prop aggregate | Funzione di aggregazione della misura |
parser | (raw: unknown) => number | null | prop measureParser | Parser del valore grezzo |
formatter | (value: number) => string | prop valueFormatter | Formattatore del valore |
numberFormatOptions | Intl.NumberFormatOptions | prop numberFormatOptions | Opzioni Intl.NumberFormat della misura (es. valuta) |
Esempi
Drill-down al click sulla cella
L'evento cell-click restituisce i record sottostanti la cella aggregata, ideale per aprire un dettaglio o un drill-down.
Formattazione valori e dimensioni multiple su riga
valueFormatter permette di formattare i valori (es. come valuta) e rows/cols accettano piu' campi per creare gerarchie.
Misure multiple
Con measures più misure stanno affiancate nella stessa pivot: ogni tupla di colonna ha una colonna per misura, che diventa l'ultimo livello delle intestazioni. Ogni misura ha la sua aggregazione e il suo formato, e totali di riga, di colonna e generale sono calcolati per misura. Con cols: [] si ottiene semplicemente una colonna per misura.
- Le colonne di totale stanno sotto un gruppo "Totale" (l'etichetta di
aggregateLabelsse tutte le misure hanno la stessa aggregazione, altrimenti "Totali"); concols: []ogni colonna di totale indica misura e aggregazione, es. "Lead (Conteggio)" cell-clickriporta inmeasureil campo della misura della colonna cliccata, evalueè il valore di quella misura- Il nome accessibile di ogni cella include la misura (es. "Web, T1, Valore: 16.500 €"); la caption predefinita elenca le misure con la loro aggregazione
measure/aggregaterestano validi per la misura singola: una pivot con un solo elemento inmeasuresè identica a una conmeasure
Note Comportamento
- Le tuple di riga e colonna vengono ordinate con
localeCompare(opzionenumeric: true) secondolocale: i valori numerici espressi come stringa risultano ordinati in modo naturale - L'indicizzazione dei record per
(riga, colonna)avviene in un'unica passata sudataed e' reattiva: mutare la reference didataricalcola il modello in modo efficiente - Le intestazioni di colonna sono multi-livello: con piu' campi in
colsogni livello genera segmenti concolspanaccorpati per prefisso comune - I totali di riga, colonna e il totale generale sono calcolati sui record sottostanti (non come somma dei valori di cella), quindi restano coerenti anche con
aggregate: 'avg' - Con
aggregate: 'count'il campomeasureviene ignorato e si conta il numero di record per cella - La prima colonna (dimensione-riga) e' sticky (
position: sticky; left: 0); il contenitore va inoverflow-x-autosu viewport stretti - Lo stato "vuoto" viene mostrato quando
datae' vuoto oppure non esistono tuple di colonna
TypeScript
import type {
PivotTableProps,
PivotAggregate,
PivotMeasure,
PivotCellClickPayload,
} from '@pzeta/vue-components'
const misure: PivotMeasure[] = [
{ field: 'ore', label: 'Ore', aggregate: 'sum' },
{ field: 'ore', label: 'Richieste', aggregate: 'count' },
]
interface RigaAssenza {
reparto: string
mese: string
tipo: string
ore: number
}
const aggregate: PivotAggregate = 'sum'
const onCellClick = (payload: PivotCellClickPayload) => {
const righe = payload.records as RigaAssenza[]
console.log('drill-down', payload.value, righe.length)
}
Quando usarlo
- Reportistica tabellare con aggregazione per due assi (es. reparto x mese, area x anno)
- Riepiloghi con totali di riga/colonna e totale generale
- Analisi rapida di dataset piatti senza ricorrere a una libreria BI esterna
- Drill-down dalle celle aggregate ai record sorgente
Per casi diversi:
- Mappa di densita' a calendario (valore per giorno) -> HeatmapCalendar
- Griglia risorsa x giorno con eventi -> WeekScheduler
- Tabella dati interattiva (ordinamento, paginazione, selezione) ->
DataTable(categoria data)
PickList
Componente a doppia lista per il trasferimento di elementi da source a target (e viceversa), con pulsanti di spostamento, riordinamento interno e selezione multipla.
QRCode
Genera lato client un QR code da una stringa o URL e lo mostra come immagine, con dimensione, livello di correzione d'errore e colori configurabili.