Composables
useFasiService
Composable principale per board pipeline — caricamento, spostamento schede, CRUD e team.
Panoramica
useFasiService è il composable centrale per board basate sullo schema fasi. Coordina tutti i dati e le operazioni di una pipeline: fasi, schede, campi, priorità, tag e team. Internamente usa @pzeta/postgrest per le chiamate API con header Content-Profile: fasi.
Inizializzazione
import { useFasiService } from '@pzeta/vue-kanban'
// Con ID numerico
const fasiService = useFasiService(42)
// Con codboard stringa (auto-resolve → ID)
const fasiService = useFasiService('crm')
Stato reattivo
| Proprietà | Tipo | Descrizione |
|---|---|---|
fasi | Ref<FasePipeline[]> | Fasi ordinate da v_fasi_pipeline |
schede | Ref<SchedaKanban[]> | Schede da v_schede_kanban |
campi | Ref<BoardCampoRow[]> | Campi dinamici attivi |
priorita | Ref<BoardPrioritaRow[]> | Priorità della board |
tags | Ref<BoardTagRow[]> | Tag disponibili |
loading | Ref<boolean> | Caricamento in corso |
error | Ref<string | null> | Messaggio errore |
Metodi di caricamento
// Caricamento iniziale completo (fasi + schede in parallelo)
await fasiService.loadFasiData()
// Ricaricamenti parziali
await fasiService.loadFasi()
await fasiService.loadSchede()
await fasiService.loadCampi()
await fasiService.loadPriorita()
await fasiService.loadTags()
Spostamento schede
// BR-003: SEMPRE tramite RPC, mai PATCH diretto su idfase
const response = await fasiService.spostaScheda(
idScheda,
idFaseDestinazione,
idUtente
)
// response: SpostaSchedaResponse
// - response.notifiche_accodate > 0 se fase con template email/SMS
// - response.datachiusura valorizzata se fase finale
Lo spostamento è ottimistico: aggiorna schede.value immediatamente, poi chiama la RPC. In caso di errore esegue rollback ripristinando lo stato precedente.
Riordino fasi
// Aggiorna l'ordine delle colonne tramite RPC riordina_fasi
await fasiService.riordinaFasi([
{ idfase: 1, ordine: 1 },
{ idfase: 2, ordine: 2 },
{ idfase: 3, ordine: 3 },
])
// Il payload deve includere TUTTE le fasi della board
CRUD schede
const nuovaScheda = await fasiService.creaScheda({
titolo: 'Nuovo lead',
idfase: 5,
descrizione: 'Cliente da contattare',
idpriorita: 2,
})
await fasiService.aggiornaScheda(idScheda, {
titolo: 'Lead aggiornato',
idpriorita: 1,
})
await fasiService.eliminaScheda(idScheda)
// Tag: sostituzione completa del set
await fasiService.aggiornaSchedaTag(idScheda, [1, 3, 5])
Gestione fasi
const nuovaFase = await fasiService.creaFase({
idboard: 42,
nome: 'Qualificazione',
ordine: 2,
colore: '#3b82f6',
})
await fasiService.aggiornaFase(idfase, { nome: 'Nuova qualificazione' })
await fasiService.eliminaFase(idfase)
Team per fase
// Carica team disponibili nel sistema
const teamsDisponibili = await fasiService.caricaTeamDisponibili()
// Team assegnati a una fase specifica
const teamFase = await fasiService.caricaTeamFase(idfase)
// Sincronizza: sostituisce completamente i team della fase
await fasiService.sincronizzaTeamFase(idfase, [
{ idteam: 10 },
{ idteam: 15 },
])
Note
- La board è identificata all'init: se
boardIdè una stringa viene risolto tramiteGET /board?codboard=eq.{cod}al primo accesso. - Lo schema PostgreSQL
fasiè richiesto comeContent-Profilesu ogni chiamata. v_fasi_pipelineinclude metriche aggregate (totale_schede,schede_incorso,schede_pronto,schede_stallo,teams).v_schede_kanbaninclude dati denormalizzati per la card:priorita_nome,priorita_colore,assegnatario_nome,etichette(array JSON).