Componenti Board

KanbanFasiBoard

Componente completo per pipeline fasi con drag-and-drop, metriche, slot dialog per CRUD schede/tag/attività/allegati/commenti.

Panoramica

KanbanFasiBoard è il componente principale per board basate sullo schema fasi. Gestisce autonomamente:

  • caricamento fasi, schede, campi custom, priorità, tag (useFasiService)
  • spostamento schede tramite RPC sposta_scheda_fase
  • riordino colonne tramite RPC riordina_fasi
  • metriche di avanzamento e stallo per fase (useFasiMetrics)
  • 5 slot per i dialog di scrittura (form scheda, allegati, tag, attività, commenti) — il consumer fornisce i wrapper concreti

Nota architettura: i dialog non sono più hard-coded nel componente. KanbanFasiBoard espone slot scopati (#dialog-form, #dialog-attachment, #dialog-tag, #dialog-activity, #dialog-comment) e il consumer integra i wrapper di @pzeta/vue-kanban/dialogs o componenti custom.

Props

PropTipoDefaultDescrizione
boardIdnumber | stringID numerico o codboard stringa
currentUserIdnumberID utente corrente (richiesto per RPC)
cardComponentComponentElementCardComponente card personalizzato
readonlybooleanfalseDisabilita drag-and-drop e azioni di scrittura
enableRealtimebooleanfalseAttiva connessione NATS per aggiornamenti live
showConfigbooleanfalseMostra pulsante configurazione fase nell'header
columnWidthnumber340Larghezza colonne in pixel
addItemLabelstring'Nuova'Prefisso del pulsante "aggiungi" per colonna
showToolbarbooleanfalseMostra toolbar superiore
showSearchbooleanfalseMostra campo ricerca nella toolbar
searchFieldsstring[]['titolo','descrizione']Campi su cui eseguire la ricerca
attivitaEntitastring'scheda'Tipo entità per @pzeta/attivita
getToken() => string | null() => nullProvider del token JWT/Bearer per le chiamate autenticate (fetch campi dinamici remote). Esposto anche come slot prop di #dialog-form e #dialog-activity
callbacksKanbanCallbacksCallback per eventi CRUD (alternativa agli emits)

KanbanCallbacks

interface KanbanCallbacks {
  onItemCreated?: (item: Record<string, unknown>) => void
  onItemUpdated?: (item: Record<string, unknown>) => void
  onItemDeleted?: (item: Record<string, unknown>) => void
}

Emits

EventoPayloadDescrizione
schedaspostata(idScheda, idFaseOrigine, idFaseDestinazione)Scheda spostata con successo
errorespostamento(idScheda, error)Errore durante lo spostamento
viewSchedaKanbanClic su "Visualizza" nel menu card
editSchedaSchedaKanbanClic su "Modifica" nel menu card
deleteSchedaSchedaKanbanScheda eliminata
addActivitySchedaKanbanAttività salvata dal dialog-activity
addAttachmentSchedaKanbanAllegato salvato dal dialog-attachment
addCommentSchedaKanbanCommento salvato dal dialog-comment
manageTagsSchedaKanbanTag salvati dal dialog-tag
itemCreatedRecord<string, unknown>Nuova scheda creata
itemUpdatedRecord<string, unknown>Scheda aggiornata
itemDeletedRecord<string, unknown>Scheda eliminata

Slot

Card

SlotPropsDescrizione
item{ item, fase }Override completo del rendering card

Dialog (nuovi nel refactoring)

I 5 slot dialog ricevono lo stato di apertura, i dati correlati e callback on-close/on-saved per chiudere/notificare il completamento. Nessuno ha contenuto di default: il consumer deve fornire i wrapper.

SlotSlot propsQuando attivo
dialog-form{ visible, boardId, idfase, campi, priorita, item?, getToken, onClose, onSaved }Click su "Nuovo" o "Modifica" su una card
dialog-attachment{ visible, referenceValue, onClose }Click "Aggiungi allegato"
dialog-tag{ visible, idscheda, availableTags, currentTagIds, onClose, onSaved }Click "Gestisci tag"
dialog-activity{ visible, entitasorgente, identitasorgente, getToken, onClose, onSaved }Click "Aggiungi attività"
dialog-comment{ visible, idscheda, idutente, onClose, onSaved }Click "Aggiungi commento"

Provide

Il componente fornisce ai discendenti tramite provide:

Inject keyTipoDescrizione
boardCampiRef<BoardCampoRow[]>Array reattivo dei campi dinamici (usato da ElementCard per render dati_extra)

Comportamento automatico al mount

  1. Carica in parallelo: fasi, schede, campi, priorità, tag, avanzamento, stalli
  2. Comprime automaticamente le fasi con finale: true
  3. Se enableRealtime: true avvia la connessione NATS

Esempi

Setup completo con dialog wrappers

<script setup lang="ts">
import {
  KanbanFasiBoard,
  SchedaFormDialog,
  SchedaTagDialog,
  SchedaCommentDialog
} from '@pzeta/vue-kanban'
import { AttivitaForm } from '@pzeta/attivita'
import { AttachmentDialog } from '@pzeta/vue-attachment'

function getToken() {
  return sessionStorage.getItem('token')
}
</script>

<template>
  <KanbanFasiBoard
    board-id="crm"
    :current-user-id="userId"
    :get-token="getToken"
    :show-search="true"
  >
    <template #dialog-form="{ visible, boardId, idfase, campi, priorita, item, onClose, onSaved }">
      <SchedaFormDialog
        :visible="visible"
        :board-id="boardId"
        :idfase="idfase"
        :campi="campi"
        :priorita="priorita"
        :item="item"
        :get-token="getToken"
        @close="onClose"
        @saved="onSaved"
      />
    </template>

    <template #dialog-tag="{ visible, idscheda, availableTags, currentTagIds, onClose, onSaved }">
      <SchedaTagDialog
        :visible="visible"
        :idscheda="idscheda"
        :available-tags="availableTags"
        :current-tag-ids="currentTagIds"
        @close="onClose"
        @saved="onSaved"
      />
    </template>

    <template #dialog-activity="{ visible, entitasorgente, identitasorgente, onClose, onSaved }">
      <AttivitaForm
        :visible="visible"
        :entitasorgente="entitasorgente"
        :identitasorgente="identitasorgente"
        @update:visible="(v) => !v && onClose()"
        @saved="onSaved"
      />
    </template>

    <template #dialog-attachment="{ visible, referenceValue, onClose }">
      <AttachmentDialog
        :visible="visible"
        reference-table="schedakanban"
        reference-column="idscheda"
        :reference-value="referenceValue"
        @update:visible="(v) => !v && onClose()"
      />
    </template>

    <template #dialog-comment="{ visible, idscheda, idutente, onClose, onSaved }">
      <SchedaCommentDialog
        :visible="visible"
        :idscheda="idscheda"
        :idutente="idutente"
        @close="onClose"
        @saved="onSaved"
      />
    </template>
  </KanbanFasiBoard>
</template>

Card personalizzata via slot

<KanbanFasiBoard board-id="crm" :current-user-id="userId" :get-token="getToken">
  <template #item="{ item, fase }">
    <MyCustomCard :scheda="item" :fase="fase" />
  </template>
</KanbanFasiBoard>

Card personalizzata via prop

<KanbanFasiBoard
  board-id="crm"
  :current-user-id="userId"
  :get-token="getToken"
  :card-component="MyCRMCard"
/>

Board in sola lettura

<KanbanFasiBoard
  board-id="crm"
  :current-user-id="userId"
  :readonly="true"
/>

Migrazione dalla versione precedente

PrimaAdesso
attivitaBaseUrl="..."rimosso — @pzeta/attivita è configurato a livello app
attivitaGetToken="..."sostituito da getToken unificato (provider singolo per tutta la board)
Dialog hard-codedsostituiti da 5 slot scopati — il consumer fornisce i wrapper
addActivity evento al clickora viene emesso quando il dialog-activity salva (chiama onSaved)