Overview

Kanban

Archetype business per gestione attività a colonne (board) con drag&drop metadata-driven.

Screenshot reference (manuale utente)

  • manual__kanban__01.png: board kanban con colonne status, card e drag&drop.

Use cases

  • Task board operative (To Do, In Progress, Review, Done).
  • Gestione ticket/stati processo.
  • Smistamento rapido record in base a stato.

md_props_bag: archetypes.kanban

Snippet 1JSON
{
  "archetypes": {
    "kanban": {
      "advancedFilter": false,
      "statusField": "StatusId",
      "colorField": "ColorHex",
      "wipLimitField": "WipLimit",
  • advancedFilter: quando true mostra la wuic-filter-bar per l'archetype kanban (a livello data-repeater).
  • statusField: campo metadata che identifica lo stato della card/record (obbligatorio per board funzionante).
  • colorField: nome campo sulla route lookup dello statusField da usare come colore colonna/tile; se assente/vuoto usa il fallback statico.
  • wipLimitField: nome campo sulla route lookup dello statusField usato per valorizzare dinamicamente il limite WIP per ogni tile (quando statusColumns non è definito).
  • wipLimitHardField: nome campo booleano (bit) sulla route lookup che decide se il

limite WIP della tile è hard (true, drop bloccante) o soft (false, solo warning).

Esempio nel sample dataset: la route lookup wuic_kanban_status espone le colonne

WipLimit (int) e WipLimitHard (bit); la riga Review ha WipLimitHard=1,

quindi raggiunto WipLimit=3 ulteriori drop sulla colonna Review vengono bloccati.

  • assignedUserIdField: campo metadata lookup che contiene l'ID utente assegnatario task; sulla card viene renderizzato il valore descrittivo lookup (non l'ID raw).
  • statusColumns[]: definizione colonne board (ordine, label, colore, opzionale wipLimit = Work In Progress Limit e wipLimitHard).
  • titleField: campo testo usato come titolo card.
  • descriptionField: campo descrizione card.
  • cardSubtitleField: campo sottotitolo card.
  • clickAction (enum): none, detail, edit.
  • persistMode (enum):
  • immediate: ogni drop persiste subito lato server.
  • batch: accumula modifiche locali e salva/annulla in blocco.

Note operative

  • Se statusField manca, la board mostra warning configurazione e non crasha.
  • Se una card ha stato vuoto/null finisce nella colonna "Da assegnare".
  • Se statusColumns non è definito (o è vuoto), le colonne vengono generate automaticamente dalla route lookup collegata a statusField:

- value: preso da mc_ui_lookup_dataValueField

- label: preso da mc_ui_lookup_dataTextField

- order: ordine naturale restituito dalla route lookup (getFlatData senza sort aggiuntivo)

- color: preso da colorField se configurato; in fallback usa la palette statica runtime (defaultStatusColors[]).

- wipLimit: preso da wipLimitField se configurato.

- wipLimitHard: preso da wipLimitHardField (booleano).

  • In caso di superamento wipLimit:

- hard (wipLimitHard=true): drop bloccato.

- soft (wipLimitHard=false): drop consentito con warning.

Eventi e subscriptions (host)

Eventi disponibili su wuic-kanban-list:

  • onKanbanDataBound: emesso quando il board viene ricostruito dal datasource.
  • onKanbanCardDrop: emesso su drop card con fromStatus/toStatus.
  • onKanbanCardClick: emesso su click card.
  • onKanbanBatchSave: emesso dopo salvataggio batch.
  • onKanbanBatchCancel: emesso dopo annullamento batch.
  • onKanbanConfigApplied: emesso dopo apply configurazione archetype.

Esempio subscribe:

Snippet 2ts
@ViewChild(KanbanListComponent) kanban?: KanbanListComponent;
private readonly subs = new Subscription();

ngAfterViewInit(): void {
  if (!this.kanban) return;
  this.subs.add(this.kanban.onKanbanDataBound.subscribe((e) => console.log(e)));
  this.subs.add(this.kanban.onKanbanCardDrop.subscribe((e) => console.log(e)));

<!-- import-and-mount -->

Import e mount (componente Angular)

Importa LazyKanbanListComponent da 'wuic-framework-lib' e montalo col DataSource del framework:

Snippet 3ts
import { DataSourceComponent, LazyKanbanListComponent } from 'wuic-framework-lib';

@Component({
  selector: 'app-esempio',
  imports: [DataSourceComponent, LazyKanbanListComponent],
  template: `
    <wuic-data-source #ds [hardcodedRoute]="'<route>'" [autoload]="true"></wuic-data-source>

Nomi ESATTI (barrel wuic-framework-lib): classe LazyKanbanListComponent, selector <wuic-kanban-list-lazy>. Importa quella classe, non altri nomi inventati (es. un prefisso Lazy dove non c'è, o viceversa) → altrimenti il build dà has no exported member.

Config metadata-driven: il tag accetta SOLO gli input standard [hardcodedRoute], [hardcodedDatasource], [autoload], [hideToolbar]. La configurazione specifica (qui: le colonne/lo stato di raggruppamento (KanbanOptions)) NON è un input HTML ([groupField], [type], ecc. danno NG8002 not a known property) → va nei metadata (md_props_bag/archetipo) o in-code via metaInfo.

Screenshot

Kanban drag & drop base
Kanban drag & drop base
kanban-list / manual-kanban-01
kanban-list / manual-kanban-01