Tipi
SchedaKanban
Tipo principale per le schede della pipeline fasi.
Panoramica
SchedaKanban è la view model usata per le card nel Kanban. Proviene dalla vista v_schede_kanban che denormalizza i join più comuni per evitare N+1.
Definizione
interface SchedaKanban {
// Identificativi
idscheda: number
idfase: number
idboard: number
// Dati principali
titolo: string
descrizione: string | null
codstatoscheda: CodStatoScheda
ordine: number
// Priorità (denormalizzata da fasi.priorita)
idpriorita: number | null
priorita_nome: string | null
priorita_colore: string | null // hex senza '#'
// Assegnatario
idassegnatario: number | null
assegnatario_nome: string | null
// Scadenza
datascadenza: string | null // ISO 8601
// Tag (array JSON da JOIN)
etichette: Array<{ idtag: number; nome: string; colore: string }> | null
// Attività e allegati (contatori)
nattivita: number
nallegati: number
ncommenti: number
// Metriche
giorni_infase: number // giorni trascorsi nella fase corrente
installo: boolean // true se giorni_infase > fase.giornistallo
// Campi dinamici — oggetto JSON flat
dati_extra: Record<string, unknown> | null
// Audit
datacreazione: string
datamodifica: string | null
datachisura: string | null // valorizzata quando fase.finale = true
}
Campi flat vs annidati
ElementCard è progettato per leggere sia la forma flat di SchedaKanban (priorita_nome, priorita_colore) sia forme annidate (item.priorita.nome). Questo permette di usare ElementCard anche con strutture dati legacy.
dati_extra
dati_extra è un oggetto JSON con una chiave per ogni campo dinamico configurato in BoardCampoRow.nomecampo. I tipi dei valori seguono BoardCampoRow.tipocampo:
// Esempio: board con campi 'budget' (number) e 'urgente' (boolean)
scheda.dati_extra = {
budget: 15000,
urgente: true,
}
ElementCard legge dati_extra filtrandolo tramite la configurazione BoardCampoRow e formatta i valori per tipo.
Utilizzo
// In useFasiService
const schede: Ref<SchedaKanban[]> = ref([])
// Popolato da GET /v_schede_kanban?idboard=eq.{id}
// Accesso diretto
const schedeInCorso = computed(() =>
fasiService.schede.value.filter(s => s.codstatoscheda === 'incorso')
)