Componenti Board

KanbanBoard

Componente board generico con drag-and-drop, indipendente dal dominio.

Panoramica

KanbanBoard è il componente di basso livello: riceve colonne e items come props generici e non sa nulla di fasi, schede o PostgREST. Tutta la logica di dominio è delegata al consumer tramite emits e slot.

Anteprima live

Props

PropTipoDefaultDescrizione
columnsRecord<string, unknown>[][]Array di oggetti colonna
columnKeyFieldstring—Nome del campo chiave nelle colonne
columnTitleFieldstring—Nome del campo titolo nelle colonne
itemsRecord<string, unknown>[][]Array di oggetti elemento
itemKeyFieldstring—Nome del campo chiave negli elementi
itemTitleFieldstring—Nome del campo titolo negli elementi
itemColumnFieldstring—Campo che collega l'elemento alla colonna
searchQuerystring''Query di ricerca per filtrare elementi
searchFieldsstring[]—Campi in cui cercare (supporta dot notation)
addItemLabelstring'Nuova'Prefisso etichetta pulsante aggiungi (il titolo della colonna viene accodato)
showAddItembooleantrueMostra il pulsante "aggiungi" in fondo alle colonne. false per chi non ha il permesso di creare
emptyLabelstring'Trascina qui gli elementi'Testo delle colonne vuote
emptyInsertThresholdnumber—Distanza in px entro cui una colonna vuota accetta il drop (opzione SortableJS, default di libreria 5)
showToolbarbooleantrueMostra toolbar superiore
columnWidthnumber280Larghezza minima delle colonne in pixel: la griglia usa minmax(columnWidth px, 1fr)
enableColumnDragbooleanfalseAbilita drag delle colonne per riordino

Emits

EventoPayloadDescrizione
moveItem(itemId, sourceId, targetId, newIndex)Elemento spostato. sourceId è letto dall'item originale tramite itemColumnField (anche con dot notation)
addItemcolumnIdClic "aggiungi" in una colonna
editItemitemClic "modifica" su un elemento
deleteItemitemIdClic "elimina" su un elemento
reorderColumnscolumn[]Colonne riordinate tramite drag
updateItemsitem[]Lista elementi aggiornata

Slot

SlotPropsDescrizione
header-start—Sinistra della toolbar
header-center—Centro della toolbar
header-end—Destra della toolbar
column-header{ column }Intestazione colonna custom
item{ item }Rendering card custom

Area di drop

Ogni colonna occupa tutta l'altezza della riga della griglia e la lista draggable si estende fino in fondo (flex-1): il drop funziona anche nella parte bassa di una colonna vuota o corta, senza aggiramenti lato consumer. Per board molto dense si può allargare la soglia di aggancio delle colonne vuote con emptyInsertThreshold.

Pulsante "aggiungi" e colonne vuote

<KanbanBoard
  ...
  :show-add-item="puoCreare"
  empty-label="Nessuna opportunità in questa fase"
/>

addItemLabel='' non nasconde il pulsante (l'etichetta diventa il solo titolo della colonna): per nasconderlo si usa showAddItem.

Colonne compresse

Una colonna viene resa compressa (52px di larghezza) se il suo oggetto ha la proprietà _compressa: true. KanbanFasiBoard gestisce questo stato internamente tramite faseCompresse.

Esempio con dati arbitrari

<template>
  <KanbanBoard
    :columns="[
      { id: 'todo', label: 'Da fare' },
      { id: 'doing', label: 'In corso' },
      { id: 'done', label: 'Fatto' },
    ]"
    column-key-field="id"
    column-title-field="label"
    :items="tasks"
    item-key-field="id"
    item-title-field="title"
    item-column-field="status"
    :enable-column-drag="true"
    @move-item="handleMove"
    @reorder-columns="handleReorder"
  >
    <template #item="{ item }">
      <div class="p-3 bg-white rounded shadow text-sm">{{ item.title }}</div>
    </template>
  </KanbanBoard>
</template>