A column-based task board that groups cards by a status field, supports drag-and-drop reordering, swimlane row grouping, column validation (WIP limits), and virtual scrolling for large datasets.
When to Use This Skill
- User needs a Kanban / sprint board with status columns (To Do, In Progress, Done, etc.)
- User wants drag-and-drop card movement between columns or across swimlane rows
- User needs to bind Kanban to a REST API, OData, or local JSON dataset
- User wants to group cards by assignee, team, or any field (swimlanes)
- User needs WIP limits (min/max card counts per column)
- User wants virtual scrolling for 1000+ cards without performance issues
- User wants to customize card layout with a template or apply custom CSS
Component Overview
| Concept | What it does |
|---|---|
keyField |
Board-level field that maps data records to columns (e.g. "Status") |
cardSettings |
Specifies headerField (unique ID) and contentField (body text) |
<e-columns> |
Declare each board column; keyField on column matches data values |
swimlaneSettings |
Groups cards into horizontal rows by a data field |
allowDragAndDrop |
Enables/disables card drag between columns (default: true) |
enableVirtualization |
Enables virtual scrolling for large datasets |
Documentation and Navigation Guide
Component Overview
📄 Read: references/overview.md
- Full feature list with descriptions (drag-and-drop, swimlanes, WIP, virtual scrolling, etc.)
- When-to-use decision table matching user needs to features
- Package installation and all required CSS imports
- Minimal working example
Accessibility
📄 Read: references/accessibility.md
- WCAG 2.2 and Section 508 compliance summary
- All WAI-ARIA attributes (
aria-label,aria-expanded,aria-selected,aria-grabbed, etc.) - Full keyboard shortcut reference
- Disabling keyboard interaction (
allowKeyboard: false) - Screen reader support details
- RTL accessibility with
enableRtl - Testing with axe-core and accessibility checker tools
Getting Started
📄 Read: references/getting-started.md
- Vite + Vue 3 project setup
- Package installation (
@syncfusion/ej2-vue-kanban) - CSS imports (tailwind3 theme)
- Minimal Kanban with columns
- Populating cards from a local data array
- Enabling swimlanes on first render
Data Binding
📄 Read: references/data-binding.md
- Binding local JSON arrays
- Remote data with
DataManager+ODataAdaptor/ODataV4Adaptor - Web API binding with
WebApiAdaptor - CRUD operations with
UrlAdaptor(insertUrl,updateUrl,removeUrl) - Custom adaptor by extending
ODataAdaptor - Sending extra query parameters with
Query.addParams - Loading data dynamically via Ajax
- Handling HTTP errors with
actionFailure
Cards
📄 Read: references/cards.md
headerField(mandatory unique ID) andcontentField- Hiding the card header with
showHeader: false - Custom card layout using Vue component template
- Card selection: None / Single / Multiple (
selectionType) - Multi-select with Ctrl+click / Shift+click
Columns
📄 Read: references/columns.md
- Single-key and multi-key column mapping
- Column header text and header templates
- Toggle columns (expand/collapse) with
allowToggle - Rendering a column initially collapsed (
isExpanded: false) - Stacked headers grouping multiple columns
- Column-level drag-and-drop reordering (
allowColumnDragAndDrop)
Dialog (Add / Edit / Delete Cards)
📄 Read: references/dialog.md
- Default built-in dialog (double-click to open)
- Custom dialog fields with
dialogSettings.fields - Custom field labels and field types
- Field validation with
validationRules - Full dialog template using Vue component
- Preventing dialog open with
dialogOpenevent - Programmatic
openDialog()andcloseDialog()
Dimensions (Height and Width)
📄 Read: references/dimensions.md
- Auto height/width (default)
- Pixel dimensions (
height="550px",:width="650") - Percentage dimensions (
width="100%",height="100%") - When to use each mode
Events
📄 Read: references/events.md
- Action events:
actionBegin,actionComplete,actionFailure - Card events:
cardClick,cardDoubleClick,cardRendered - Column drag events:
columnDragStart,columnDrag,columnDrop - Data events:
dataBinding,dataBound,dataSourceChanged,dataStateChange - Dialog events:
dialogOpen,dialogClose - Card drag events:
dragStart,drag,dragStop - Lifecycle:
created,queryCellInfo
Swimlanes
📄 Read: references/swimlane.md
- Rendering swimlane rows with
swimlaneSettings.keyField - Custom row label text with
textField - Custom swimlane header template
- Sorting rows (Ascending / Descending)
- Cross-row drag-and-drop (
allowDragAndDrop: truein swimlaneSettings) - Empty row display (
showEmptyRow) - Card count badge (
showItemCount) - Frozen swimlane header while scrolling (
enableFrozenRows)
Drag and Drop
📄 Read: references/drag-and-drop.md
- Disabling drag-and-drop globally (
allowDragAndDrop: false) - Per-column drag/drop control (
allowDrag,allowDrop) - Cross-swimlane drag-and-drop
- Kanban-to-Kanban drag-and-drop (
externalDropId,dragStop,addCard,deleteCard) - Kanban to TreeView drag-and-drop
- Kanban to Scheduler drag-and-drop
Localization and RTL
📄 Read: references/localization.md
- All locale keys reference table
- Loading translations with
L10n.load() - Setting
localeprop on the board - Right-to-left (RTL) mode with
enableRtl
Public Methods
📄 Read: references/methods.md
- Card CRUD:
addCard,updateCard,deleteCard,getCardDetails - Column methods:
addColumn,deleteColumn,showColumn,hideColumn,getColumnData - Dialog:
openDialog,closeDialog - Data:
getSwimlaneData - Selection:
getSelectedCards - UI:
refreshHeader,refreshUI,showSpinner,hideSpinner,destroy
State Persistence
📄 Read: references/persistence.md
- Enabling
enablePersistenceto save state inlocalStorage - Persisted state: data source, column expand/collapse, swimlane expand/collapse
- Setting a unique
idto avoid key collisions - Clearing persisted state
Priority and Sort Settings
📄 Read: references/priority-and-sort.md
cardSettings.priorityfor rank-based card positioningsortSettings.sortBy:'Index','DataSourceOrder','Custom'sortSettings.fieldfor field-mapped orderingsortSettings.direction:'Ascending'/'Descending'
Responsive Mode
📄 Read: references/responsive-mode.md
- Mobile layout: column sizing, swipe navigation, tap-and-hold drag
- Swimlane popup menu on mobile
- Single and multiple card selection on touch devices
Tooltip
📄 Read: references/tooltip.md
- Enabling default card tooltip (
enableTooltip) e-tooltip-textclass for custom element tooltips- Custom tooltip template via
tooltipTemplate
Customization and Troubleshooting
📄 Read: references/customization-and-troubleshooting.md
- CSS class reference table
- Sticky/fixed column headers
- Column WIP validation (
minCount,maxCount,constraintType) - WAI-ARIA attributes
- Full keyboard shortcut reference
- Theme Studio
Virtual Scrolling
📄 Read: references/virtual-scrolling.md
- Enabling virtualization (
enableVirtualization: true) - Setting
cardHeightin pixels - Remote data service configuration for virtual scrolling
- Known limitations (swimlane + virtualization, card position, % height)
How-To Recipes
📄 Read: references/how-to.md
- Dynamically change column properties at runtime
- Replace all columns at runtime
- Filter cards with a
Query - Search cards by text with
Query.search() - Handle column header double-click
Properties Reference
📄 Read: references/properties.md
- Complete root-level prop table (all types, defaults, descriptions)
cardSettingssub-properties (headerField,contentField,selectionType,priority, etc.)columnssub-properties (keyField,allowToggle,minCount,maxCount,transitionColumns, etc.)dialogSettingsandDialogFieldsModelfieldssortSettings,swimlaneSettings,stackedHeadersinterfaces- All enum values:
SelectionType,ConstraintType,SortOrderBy,SortDirection
Style and CSS Customization
📄 Read: references/style.md
- Full CSS class reference table for header cells and WIP limit indicators
- CSS classes for card elements (header, content, footer, tags, color stripe)
- Swimlane row and cell CSS selectors
- Compact table-scoped selector variants
- Fixed / sticky Kanban header (height-based and
position: sticky) - Theme Studio for generating custom themes
Validation (WIP Limits)
📄 Read: references/validation.md
minCount— minimum cards required per column/cellmaxCount— maximum cards allowed per column/cellconstraintType:'Column'(default) vs'Swimlane'scope- Visual feedback: highlight colors when limits are violated
- CSS classes to customize validation highlight colors
Quick Start
<template>
<div id="app">
<ejs-kanban id="kanban" keyField="Status" :dataSource="kanbanData" :cardSettings="cardSettings">
<e-columns>
<e-column headerText="To Do" keyField="Open"></e-column>
<e-column headerText="In Progress" keyField="InProgress"></e-column>
<e-column headerText="Testing" keyField="Testing"></e-column>
<e-column headerText="Done" keyField="Close"></e-column>
</e-columns>
</ejs-kanban>
</div>
</template>
<script setup>
import { KanbanComponent as EjsKanban, ColumnDirective as EColumn, ColumnsDirective as EColumns }
from '@syncfusion/ej2-vue-kanban';
import { extend } from '@syncfusion/ej2-base';
const rawData = [
{ Id: 1, Status: 'Open', Summary: 'Analyze requirements', Assignee: 'Nancy' },
{ Id: 2, Status: 'InProgress', Summary: 'Improve performance', Assignee: 'Andrew' },
{ Id: 3, Status: 'Testing', Summary: 'Fix IE browser bug', Assignee: 'Janet' },
{ Id: 4, Status: 'Close', Summary: 'Deploy to production', Assignee: 'Nancy' },
];
const kanbanData = extend([], rawData, null, true);
const cardSettings = { contentField: 'Summary', headerField: 'Id' };
</script>
<style>
@import '../node_modules/@syncfusion/ej2-base/styles/tailwind3.css';
@import '../node_modules/@syncfusion/ej2-buttons/styles/tailwind3.css';
@import '../node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css';
@import '../node_modules/@syncfusion/ej2-popups/styles/tailwind3.css';
@import '../node_modules/@syncfusion/ej2-vue-kanban/styles/tailwind3.css';
</style>
Common Patterns
Add swimlanes (group by assignee)
<ejs-kanban keyField="Status" :dataSource="kanbanData"
:cardSettings="cardSettings" :swimlaneSettings="swimlaneSettings">
...columns...
</ejs-kanban>
<script setup>
const swimlaneSettings = { keyField: 'Assignee' };
</script>
Bind to remote OData service
<script setup>
import { DataManager, ODataAdaptor } from '@syncfusion/ej2-data';
const kanbanData = new DataManager({
url: 'https://your-api.com/api/Tasks',
adaptor: new ODataAdaptor(),
crossDomain: true
});
</script>
Enable WIP limits on a column
<e-column headerText="In Progress" keyField="InProgress" :maxCount="5" :minCount="1"></e-column>
Enable virtual scrolling for large data
<ejs-kanban :enableVirtualization="true" keyField="Status" :dataSource="largeDataset"
:cardSettings="{ headerField: 'Id', contentField: 'Summary' }">
...
</ejs-kanban>
Key Props Reference
| Prop | Type | Purpose |
|---|---|---|
keyField |
String | Data field that maps records to columns |
dataSource |
Array / DataManager | Cards data source |
cardSettings |
Object | headerField (required), contentField, template, selectionType |
swimlaneSettings |
Object | keyField, textField, allowDragAndDrop, showEmptyRow, enableFrozenRows |
allowDragAndDrop |
Boolean | Board-level card drag-and-drop (default: true) |
allowColumnDragAndDrop |
Boolean | Reorder columns by dragging headers |
enableVirtualization |
Boolean | Virtual scrolling for large datasets |
enableTooltip |
Boolean | Show tooltip on card hover |
constraintType |
String | 'Column' or 'Swimlane' for WIP validation |