Skip to content

Cards, Columns, And Ordering

Kanban reads and updates ordinary RevoGrid source rows. A card needs a stable ID, workflow-column value, and preferably a numeric order:

grid.source = [
{
workId: 'PAY-104',
summary: 'Retry declined payments',
stage: 'active',
rank: 1000,
team: 'billing',
},
];
grid.kanban = {
idField: 'workId',
columnField: 'stage',
orderField: 'rank',
swimlaneField: 'team',
columns: [
{ prop: 'queued', name: 'Queued' },
{ prop: 'active', name: 'Active' },
{ prop: 'done', name: 'Done' },
],
};

When a card has no rank, source order is used. The first move assigns fractional ranks between neighboring cards. If the available numeric gap becomes unsafe, Kanban rebalances only the destination bucket and reports the affected IDs in kanbancardmove.

kanban.columns is the workflow schema; grid.columns remains the canonical table/card-field schema. A card belongs to a workflow column when card[columnField] === column.prop.

Workflow definitions reuse the safe RevoGrid header and sizing subset and add Kanban behavior such as WIP limits, collapse state, transition rules, metadata, and card filtering.

The array is optional and defaults to []. This supports loading workflow metadata and cards independently: no columns plus no cards is an empty board, while cards without configured columns use the managed Unmapped column by default. Supplying workflow columns later rebuilds the projection from the same canonical grid.source records.

columns: [
{ prop: 'queued', name: 'Queued', size: 260 },
{
prop: 'active',
name: 'Active',
minSize: 240,
maxSize: 360,
wipLimit: 4,
allowedFrom: ['queued', 'active'],
collapsible: true,
},
]

Projected workflow columns keep the exact authored prop; no synthetic grid property is introduced. If name is omitted, Kanban displays String(prop). The default size is 288 and minSize is 220. The core column-move plugin handles header dragging; kanbancolumnorderchange exposes the resulting prop order for persistence.

Every workflow column is collapsible by default. Set collapsible: false to lock a column open, or use collapsed: true for its initial state. At runtime, setColumnCollapsed(prop, collapsed) changes one column and getCollapsedColumnProps() returns the active collapsed set. A collapsed column remains visible as a narrow rail with a vertical resolved-name badge, so users can restore it without losing board context.

  • Unknown statuses render in a localized Unmapped column by default. Set unmappedColumn: false only when the host deliberately hides them.
  • Missing or duplicate card IDs produce blocking diagnostics. Those cards remain visible but cannot be moved.
  • Duplicate column props produce a blocking configuration diagnostic.
  • Invalid numeric ranks fall back to source order and produce a diagnostic.

Listen to kanbandiagnostics or call getDiagnostics() on the plugin during development and after remote data refreshes.

Column and swimlane headers distinguish:

  • visible count: cards passing RevoGrid filters, Kanban search, and the optional predicate;
  • total count: all canonical cards in that bucket.

WIP limits always use total counts so a filter cannot accidentally permit over-capacity work.