Componenti Board

EnhancedKanbanBoard

Board Kanban high-level facade con caricamento dati da backend, gestione CRUD schede, slot dialog e adapter item personalizzabile.

Panoramica

EnhancedKanbanBoard è la facade high-level per board generiche basate su useBoardService. Carica autonomamente metadati, colonne ed elementi dal backend tramite PostgRESTDataSource, espone la stessa architettura a slot di KanbanFasiBoard e supporta un ItemAdapter per normalizzare item con shape arbitraria.

Differenze rispetto a KanbanFasiBoard:

  • Usa useBoardService + schema generico board (non schema fasi)
  • Accetta boardIdOrCode (ID numerico o codice stringa)
  • Supporta override completo con items passati esternamente (senza backend)
  • itemAdapter personalizzabile per naming italiano/inglese/RPC
  • sortOptions configurabili inline
  • Toolbar con ricerca e ordinamento integrati

Per board basate su pipeline con fasi, metriche e stallo preferire KanbanFasiBoard.

Anteprima live

Il preview usa KanbanBoard + ElementCard con dati mock per mostrare l'output visivo. In produzione EnhancedKanbanBoard carica colonne ed elementi dal backend tramite boardIdOrCode.

Props

PropTipoDefaultDescrizione
boardIdOrCodenumber | stringID numerico o codboard stringa (carica metadati e colonne)
cardComponentComponentElementCardComponente card personalizzato
addItemLabelstring'Nuova'Etichetta del pulsante aggiungi nelle colonne
searchFieldsstring[]['titolo','descrizione']Campi su cui eseguire la ricerca fulltext
sortOptionsArray<{ field, label }>data/scadenza/titoloOpzioni di ordinamento nella toolbar
itemsRecord<string, unknown>[]undefinedElementi esterni (se assente vengono caricati dal backend)
callbacksKanbanCallbacksCallback CRUD alternativi agli emits
showToolbarbooleantrueMostra toolbar con ricerca e ordinamento
showSearchbooleantrueMostra campo di ricerca nella toolbar
columnWidthnumber340Larghezza colonne in pixel
attivitaEntitastring'scheda'Tipo entità esposto nel slot #dialog-activity
getToken() => string | null() => nullProvider JWT/Bearer per chiamate autenticate; passato come slot prop a #dialog-form e #dialog-activity
getCurrentUserId() => number() => 0Provider ID utente corrente per RPC e commenti
itemAdapterItemAdapterdefaultPostgRESTItemAdapterNormalizza item raw → NormalizedItem; sovrascrivere per backend con naming diverso

KanbanCallbacks

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

SortOption

interface SortOption {
  field: string | ((item: Record<string, unknown>) => string | number | Date | null | undefined)
  label: string
}

Emits

EventoPayloadDescrizione
itemCreatedRecord<string, unknown>Nuova scheda creata
itemUpdatedRecord<string, unknown>Scheda aggiornata
itemDeletedRecord<string, unknown>Scheda eliminata
itemMoved(itemId, sourceId, targetId, newIndex)Scheda spostata tra colonne
itemsLoadedRecord<string, unknown>[]Elementi caricati dal backend
addItemKanbanColumnIdClick su "aggiungi" in una colonna
viewRecord<string, unknown>Click su "Visualizza" nel menu card
editItemRecord<string, unknown>Click su "Modifica" nel menu card
deleteItemRecord<string, unknown>Click su "Elimina" nel menu card
addedActivityRecord<string, unknown>Attività salvata da #dialog-activity
editedActivityRecord<string, unknown>Attività modificata
deletedActivityRecord<string, unknown>Attività eliminata
addAttachmentRecord<string, unknown>Allegato salvato da #dialog-attachment
addCommentRecord<string, unknown>Commento salvato da #dialog-comment
manageTagsRecord<string, unknown>Tag aggiornati da #dialog-tag

Slot

Toolbar

SlotDescrizione
toolbar-startContenuto aggiuntivo a sinistra nella toolbar
toolbar-endContenuto aggiuntivo a destra nella toolbar

Dialog

Identici agli slot di KanbanFasiBoard. Senza slot i pulsanti azione sulle card non aprono dialog.

SlotSlot propsQuando attivo
dialog-form{ visible, boardId, idfase, campi, priorita, item?, getToken, onClose, onSaved }Click su "Nuovo" o "Modifica"
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 "Commenta"

Utilizzo base

<script setup lang="ts">
import { EnhancedKanbanBoard } from '@pzeta/vue-kanban'

const currentUserId = 42

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

<template>
  <EnhancedKanbanBoard
    board-id-or-code="progetti"
    :get-token="getToken"
    :get-current-user-id="() => currentUserId"
    :show-toolbar="true"
    :show-search="true"
    @item-created="item => console.log('creato', item)"
    @item-moved="(id, src, dst) => console.log('spostato', id, src, '→', dst)"
  />
</template>

Con slot dialog (@pzeta/vue-kanban/dialogs)

<script setup lang="ts">
import { EnhancedKanbanBoard } from '@pzeta/vue-kanban'
import {
  DefaultFormDialog,
  DefaultTagDialog,
  DefaultCommentDialog,
  DefaultAttachmentDialog,
  DefaultActivityDialog,
} from '@pzeta/vue-kanban/dialogs'

const currentUserId = 42
</script>

<template>
  <EnhancedKanbanBoard
    board-id-or-code="progetti"
    :get-token="() => sessionStorage.getItem('access_token')"
    :get-current-user-id="() => currentUserId"
  >
    <template #dialog-form="p">
      <DefaultFormDialog v-bind="p" />
    </template>
    <template #dialog-tag="p">
      <DefaultTagDialog v-bind="p" />
    </template>
    <template #dialog-comment="p">
      <DefaultCommentDialog v-bind="p" />
    </template>
    <template #dialog-attachment="p">
      <DefaultAttachmentDialog v-bind="p" />
    </template>
    <template #dialog-activity="p">
      <DefaultActivityDialog v-bind="p" />
    </template>
  </EnhancedKanbanBoard>
</template>

Con ItemAdapter personalizzato

import type { ItemAdapter, NormalizedItem } from '@pzeta/vue-kanban'

const myAdapter: ItemAdapter = (raw): NormalizedItem => ({
  id: raw.ticket_id as number,
  columnId: raw.status_code as string,
  title: raw.subject as string,
  description: raw.body as string,
  priority: raw.severity ? { name: raw.severity as string, color: '#ef4444' } : undefined,
  tags: [],
  raw,
})
<EnhancedKanbanBoard
  board-id-or-code="support"
  :item-adapter="myAdapter"
/>

Note

  • Il backend deve esporre la board via PostgREST sotto lo schema board. Per schema fasi usare KanbanFasiBoard.
  • Quando items è fornito via prop il caricamento dal backend viene saltato, ma i metadati (colonne, priorità, tag) vengono sempre caricati da boardIdOrCode.
  • defaultPostgRESTItemAdapter gestisce naming italiano (titolo, priorita, etichette) e inglese (title, priority, tags) e campo RPC flat (priorita_nome, priorita_colore).