Implementing Syncfusion ASP.NET Core Kanban
Table of Contents
Quick Start
// HomeController.cs
public IActionResult Index()
{
ViewBag.data = new KanbanDataModels().KanbanTasks();
return View();
}
<!-- Index.cshtml -->
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Testing" keyField="Testing"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
</ejs-kanban>
Prerequisites:
- NuGet:
Install-Package Syncfusion.EJ2.AspNet.Core
_ViewImports.cshtml: @addTagHelper *, Syncfusion.EJ2
_Layout.cshtml: Fluent CSS + ej2.min.js CDN links + <ejs-scripts></ejs-scripts>
→ For full setup details, see references/getting-started.md
When to Use This Skill
Use this skill when you need to:
- Build a Kanban board — multi-column workflow visualization
- Configure columns — single/multi-key columns, stacked headers, toggle, drag
- Add swimlanes — group cards by team, user, or category with frozen rows
- Enable drag-and-drop — between columns, swimlanes, or external components
- Implement card dialogs — edit dialog with custom fields, templates, CRUD persistence
- Bind remote data — OData, WebAPI, UrlAdaptor with CRUD operations
- Apply sorting — by index, data source order, or custom field
- Set card priorities — exact-position drop ordering via numeric rank field
- Add column constraints — min/max card count validation per column
- Show tooltips — default or template-based hover tooltips
- Enable virtual scrolling — handle large datasets (100k+ cards) efficiently
- Configure accessibility — WCAG 2.2 AA, keyboard navigation, screen reader support
- Localize or RTL — multi-language support and right-to-left layout
- Filter or search cards — using the
query property
- Change columns dynamically — update column configuration at runtime
- Handle events — react to card clicks, drags, dialog open/close, data binding, and more
- Call methods programmatically — add/update/delete cards, open dialogs, show/hide columns, refresh the board
- Reference all properties — full list of component and sub-model properties with types and defaults
Documentation and Navigation Guide
Setup and First Board
📄 Read: references/getting-started.md
- NuGet installation and package setup
- Tag Helper registration in
_ViewImports.cshtml
- CDN configuration (CSS + JS) in
_Layout.cshtml
- Minimal Kanban board with 4 columns
- Basic swimlane quickstart
- License key registration
Data Binding
📄 Read: references/data-binding.md
- Local data binding via
@ViewBag.data
- Remote data: OData, ODataV4, WebAPI, UrlAdaptor
<e-data-manager> configuration
- CRUD operations with
insertUrl, updateUrl, removeUrl, crudUrl
- Custom adaptor pattern
actionFailure event handling
- Ajax loading indicator behavior
Cards
📄 Read: references/cards.md
headerField (mandatory unique card ID)
showHeader — show/hide card header
contentField — card body text field
- Card template with jsrender syntax
selectionType — None, Single, Multiple
- Card color customization via
colorField
Columns
📄 Read: references/columns.md
- Single-key and multi-key
keyField mapping
headerText — column display name
- Column header template
allowToggle — collapsible columns
isExpanded — initial expand/collapse state
- Stacked headers (
<e-kanban-stackedheaders>)
- Column-level drag (
allowColumnDragAndDrop)
showItemCount — display card count in header
Swimlanes
📄 Read: references/swimlane.md
keyField — data field to group by
textField — display label field
- Swimlane header template
sortBy — sort swimlane rows
allowDragAndDrop — enable cross-swimlane card drag
showEmptyRow — display empty swimlane rows
showItemCount — card count per swimlane
enableFrozenRows — sticky swimlane headers on scroll
Drag and Drop
📄 Read: references/drag-and-drop.md
- Internal column drag (default enabled)
allowDragAndDrop="false" — disable all drag
- Per-column
allowDrag/allowDrop flags
transitionColumns — restrict allowed column transitions
- Cross-swimlane drag via
swimlaneSettings.allowDragAndDrop
- External drag:
externalDropId property
- Kanban-to-Kanban drag (
dragStop event + deleteCard/addCard)
- Kanban-to-Treeview and Kanban-to-Schedule integration
Card Edit Dialog
📄 Read: references/dialog.md
- Default dialog (double-click card)
- Custom dialog fields via
<e-kanban-dialogsettings fields="...">
- Field types: String, Numeric, TextArea, DropDown, TextBox, Input
- Custom dialog template with EJ2 component initialization
- Preventing dialog open with
dialogOpen event + args.cancel = true
- Programmatic add:
kanbanObj.openDialog('Add', data)
- CRUD persistence via UrlAdaptor with server-side
EditParams class
Sorting, Priority, and Validation
📄 Read: references/sorting-priority-validation.md
<e-kanban-sortsettings> with sortBy, field, direction
sortBy values: Index, DataSourceOrder, Custom
- Priority field:
<e-kanban-cardsettings priority="RankId"> for exact-position drops
- Column min/max card count:
minCount, maxCount on <e-kanban-column>
- Constraint type: Column (default) or Swimlane
- Visual color indication on constraint violation
Tooltip, Style, and Dimensions
📄 Read: references/tooltip-style-dimensions.md
enableTooltip="true" — hover tooltip on cards
tooltipTemplate — custom HTML tooltip template
- CSS class reference for all Kanban elements
- Sticky header pattern
width and height — auto, pixel, percentage values
Persistence, Localization, and Responsive
📄 Read: references/persistence-localization-responsive.md
enablePersistence="true" — localStorage state saving
locale property + ej.base.L10n.load() script
- All locale key names for Kanban strings
enableRtl="true" — right-to-left layout
- Mobile responsive behavior (swipe, tap-hold, swimlane menu)
Virtual Scrolling and Accessibility
📄 Read: references/virtual-scrolling-accessibility.md
enableVirtualization="true" — on-demand card rendering
cardHeight — fixed height required for virtualization
- Server-side
KanbanVirtualization parameter handling
- WCAG 2.2 AA compliance table
- WAI-ARIA attributes (
aria-label, aria-expanded, aria-selected, etc.)
- Keyboard shortcuts reference
AllowKeyboard="false" — disable keyboard interaction
Events
📄 Read: references/events.md
ActionBegin / ActionComplete / ActionFailure — lifecycle and error handling
CardClick / CardDoubleClick / CardRendered — card interaction hooks
ColumnDrag / ColumnDragStart / ColumnDrop — column reorder events
Created / DataBinding / DataBound / DataSourceChanged — initialization and data events
DialogOpen / DialogClose — intercept or cancel dialog (use args.cancel = true)
Drag / DragStart / DragStop — card drag lifecycle (cross-Kanban scenarios use DragStop)
QueryCellInfo — customize column cell elements before render
Methods
📄 Read: references/methods.md
AddCard / UpdateCard / DeleteCard — CRUD card operations
AddColumn / DeleteColumn — dynamic column management
OpenDialog / CloseDialog — programmatic dialog control
ShowColumn / HideColumn — toggle column visibility
GetCardDetails / GetColumnData / GetSelectedCards / GetSwimlaneData — data retrieval
ShowSpinner / HideSpinner — loading indicator control
Refresh / RefreshHeader / RefreshUI — board re-render helpers
DataBind / Destroy / AppendTo / Inject — component lifecycle utilities
All Properties Reference
📄 Read: references/properties.md
- Complete list of all
<ejs-kanban> root properties with types, defaults, and examples
- Sub-model properties:
CardSettings, Columns, SwimlaneSettings, SortSettings, DialogSettings, StackedHeaders
- Enum values:
ConstraintType, SelectionType, SortOrderBy, SortDirection
How-To Recipes
📄 Read: references/how-to.md
- Dynamically change columns at runtime
- Filter cards using the
query property with dropdown
- Search cards by field values with text input
- Add header double-click event handler
Common Patterns
Swimlane Board with Remote Data
Use when: You need to group cards by user/team and load data from an API endpoint (OData, WebAPI, etc.) instead of a local collection.
<ejs-kanban id="Kanban" keyField="Status">
<e-data-manager url="/api/tasks" adaptor="ODataV4Adaptor"></e-data-manager>
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
<e-kanban-swimlanesettings keyField="Assignee" textField="Assignee"></e-kanban-swimlanesettings>
</ejs-kanban>
Board with Column Constraints
Use when: You need to enforce WIP (Work-In-Progress) limits — preventing too few or too many cards from stacking in a column.
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"
minCount="3" maxCount="5" showItemCount="true"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
</ejs-kanban>
Board with Card Edit Dialog + CRUD
Use when: Users need to create, edit, or delete cards through a dialog form, with changes persisted to the server via UrlAdaptor.
<ejs-kanban id="Kanban" keyField="Status">
<e-data-manager url="/Home/UpdateData" adaptor="UrlAdaptor"
crudUrl="/Home/UpdateData"></e-data-manager>
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
<e-kanban-dialogsettings fields="@ViewBag.dialogFields"></e-kanban-dialogsettings>
</ejs-kanban>
Virtual Scrolling Board
Use when: The dataset is large (hundreds to thousands of cards) and rendering all cards at once would cause performance issues.
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data"
enableVirtualization="true">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"
selectionType="Multiple"></e-kanban-cardsettings>
</ejs-kanban>
Key Properties Reference
| Property |
Tag |
Values |
Purpose |
keyField |
<ejs-kanban> |
Field name string |
Maps cards to columns by status value |
dataSource |
<ejs-kanban> |
@ViewBag.data |
Local data collection |
enableVirtualization |
<ejs-kanban> |
true/false |
Virtual scrolling for large data |
enableTooltip |
<ejs-kanban> |
true/false |
Hover tooltip on cards |
tooltipTemplate |
<ejs-kanban> |
Template ID string |
Custom tooltip HTML template |
allowDragAndDrop |
<ejs-kanban> |
true/false |
Global drag-and-drop toggle |
externalDropId |
<ejs-kanban> |
Element ID array |
Target IDs for external drop |
enablePersistence |
<ejs-kanban> |
true/false |
Save state to localStorage |
locale |
<ejs-kanban> |
Locale string (e.g. "de") |
UI string localization |
enableRtl |
<ejs-kanban> |
true/false |
Right-to-left layout |
width |
<ejs-kanban> |
auto/px/% |
Board width |
height |
<ejs-kanban> |
auto/px/% |
Board height |
AllowKeyboard |
<ejs-kanban> |
true/false |
Keyboard navigation toggle |
headerField |
<e-kanban-cardsettings> |
Field name string |
Unique card ID field (mandatory) |
contentField |
<e-kanban-cardsettings> |
Field name string |
Card body text field |
template |
<e-kanban-cardsettings> |
Template ID string |
Custom card HTML template |
selectionType |
<e-kanban-cardsettings> |
None/Single/Multiple |
Card selection mode |
priority |
<e-kanban-cardsettings> |
Field name string |
Numeric rank field for ordering |
showHeader |
<e-kanban-cardsettings> |
true/false |
Show/hide card header |
keyField |
<e-kanban-column> |
Status value(s) |
Column card filter (single or comma-separated) |
headerText |
<e-kanban-column> |
Display string |
Column title |
allowToggle |
<e-kanban-column> |
true/false |
Collapsible column |
isExpanded |
<e-kanban-column> |
true/false |
Initial expand state |
minCount |
<e-kanban-column> |
Integer |
Minimum cards constraint |
maxCount |
<e-kanban-column> |
Integer |
Maximum cards constraint |
showItemCount |
<e-kanban-column> |
true/false |
Show card count badge |
allowDrag |
<e-kanban-column> |
true/false |
Allow cards to be dragged from column |
allowDrop |
<e-kanban-column> |
true/false |
Allow cards to be dropped into column |
keyField |
<e-kanban-swimlanesettings> |
Field name string |
Swimlane grouping field |
textField |
<e-kanban-swimlanesettings> |
Field name string |
Swimlane display label field |
sortBy |
<e-kanban-sortsettings> |
Index/DataSourceOrder/Custom |
Card sort strategy |
field |
<e-kanban-sortsettings> |
Field name string |
Field to sort by |
direction |
<e-kanban-sortsettings> |
Ascending/Descending |
Sort direction |
Data Model
The standard KanbanDataModels class for all examples:
public class KanbanDataModels
{
public string Id { get; set; }
public string Title { get; set; }
public string Status { get; set; } // Maps to keyField
public string Summary { get; set; } // Card body content
public string Type { get; set; }
public string Priority { get; set; }
public string Tags { get; set; }
public double Estimate { get; set; }
public string Assignee { get; set; } // Used for swimlane grouping
public int RankId { get; set; } // Numeric rank for priority ordering
public string Color { get; set; } // Optional card color field
}
1---2name: syncfusion-aspnetcore-kanban3description: Guide for implementing the Syncfusion ASP.NET Core Kanban component using Tag Helper syntax. Use this skill when building task boards, configuring columns and swimlanes, or enabling drag-and-drop. Covers card settings, dialogs, and binding remote data for ASP.NET Core MVC and Razor Pages.4---56# Implementing Syncfusion ASP.NET Core Kanban78## Table of Contents9- [Quick Start](#quick-start)10- [When to Use This Skill](#when-to-use-this-skill)11- [Documentation and Navigation Guide](#documentation-and-navigation-guide)12 - [Setup and First Board](#setup-and-first-board)13 - [Data Binding](#data-binding)14 - [Cards](#cards)15 - [Columns](#columns)16 - [Swimlanes](#swimlanes)17 - [Drag and Drop](#drag-and-drop)18 - [Card Edit Dialog](#card-edit-dialog)19 - [Sorting, Priority, and Validation](#sorting-priority-and-validation)20 - [Tooltip, Style, and Dimensions](#tooltip-style-and-dimensions)21 - [Persistence, Localization, and Responsive](#persistence-localization-and-responsive)22 - [Virtual Scrolling and Accessibility](#virtual-scrolling-and-accessibility)23 - [Events](#events)24 - [Methods](#methods)25 - [All Properties Reference](#all-properties-reference)26 - [How-To Recipes](#how-to-recipes)27- [Common Patterns](#common-patterns)28- [Key Properties Reference](#key-properties-reference)29- [Data Model](#data-model)3031## Quick Start3233```csharp34// HomeController.cs35public IActionResult Index()36{37 ViewBag.data = new KanbanDataModels().KanbanTasks();38 return View();39}40```4142```html43<!-- Index.cshtml -->44<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">45 <e-kanban-columns>46 <e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>47 <e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>48 <e-kanban-column headerText="Testing" keyField="Testing"></e-kanban-column>49 <e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>50 </e-kanban-columns>51 <e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>52</ejs-kanban>53```5455**Prerequisites:**56- NuGet: `Install-Package Syncfusion.EJ2.AspNet.Core`57- `_ViewImports.cshtml`: `@addTagHelper *, Syncfusion.EJ2`58- `_Layout.cshtml`: Fluent CSS + `ej2.min.js` CDN links + `<ejs-scripts></ejs-scripts>`5960→ For full setup details, see [references/getting-started.md](references/getting-started.md)6162## When to Use This Skill6364Use this skill when you need to:65- **Build a Kanban board** — multi-column workflow visualization66- **Configure columns** — single/multi-key columns, stacked headers, toggle, drag67- **Add swimlanes** — group cards by team, user, or category with frozen rows68- **Enable drag-and-drop** — between columns, swimlanes, or external components69- **Implement card dialogs** — edit dialog with custom fields, templates, CRUD persistence70- **Bind remote data** — OData, WebAPI, UrlAdaptor with CRUD operations71- **Apply sorting** — by index, data source order, or custom field72- **Set card priorities** — exact-position drop ordering via numeric rank field73- **Add column constraints** — min/max card count validation per column74- **Show tooltips** — default or template-based hover tooltips75- **Enable virtual scrolling** — handle large datasets (100k+ cards) efficiently76- **Configure accessibility** — WCAG 2.2 AA, keyboard navigation, screen reader support77- **Localize or RTL** — multi-language support and right-to-left layout78- **Filter or search cards** — using the `query` property79- **Change columns dynamically** — update column configuration at runtime80- **Handle events** — react to card clicks, drags, dialog open/close, data binding, and more81- **Call methods programmatically** — add/update/delete cards, open dialogs, show/hide columns, refresh the board82- **Reference all properties** — full list of component and sub-model properties with types and defaults8384## Documentation and Navigation Guide8586### Setup and First Board87📄 **Read:** [references/getting-started.md](references/getting-started.md)88- NuGet installation and package setup89- Tag Helper registration in `_ViewImports.cshtml`90- CDN configuration (CSS + JS) in `_Layout.cshtml`91- Minimal Kanban board with 4 columns92- Basic swimlane quickstart93- License key registration9495### Data Binding96📄 **Read:** [references/data-binding.md](references/data-binding.md)97- Local data binding via `@ViewBag.data`98- Remote data: OData, ODataV4, WebAPI, UrlAdaptor99- `<e-data-manager>` configuration100- CRUD operations with `insertUrl`, `updateUrl`, `removeUrl`, `crudUrl`101- Custom adaptor pattern102- `actionFailure` event handling103- Ajax loading indicator behavior104105### Cards106📄 **Read:** [references/cards.md](references/cards.md)107- `headerField` (mandatory unique card ID)108- `showHeader` — show/hide card header109- `contentField` — card body text field110- Card template with jsrender syntax111- `selectionType` — None, Single, Multiple112- Card color customization via `colorField`113114### Columns115📄 **Read:** [references/columns.md](references/columns.md)116- Single-key and multi-key `keyField` mapping117- `headerText` — column display name118- Column header template119- `allowToggle` — collapsible columns120- `isExpanded` — initial expand/collapse state121- Stacked headers (`<e-kanban-stackedheaders>`)122- Column-level drag (`allowColumnDragAndDrop`)123- `showItemCount` — display card count in header124125### Swimlanes126📄 **Read:** [references/swimlane.md](references/swimlane.md)127- `keyField` — data field to group by128- `textField` — display label field129- Swimlane header template130- `sortBy` — sort swimlane rows131- `allowDragAndDrop` — enable cross-swimlane card drag132- `showEmptyRow` — display empty swimlane rows133- `showItemCount` — card count per swimlane134- `enableFrozenRows` — sticky swimlane headers on scroll135136### Drag and Drop137📄 **Read:** [references/drag-and-drop.md](references/drag-and-drop.md)138- Internal column drag (default enabled)139- `allowDragAndDrop="false"` — disable all drag140- Per-column `allowDrag`/`allowDrop` flags141- `transitionColumns` — restrict allowed column transitions142- Cross-swimlane drag via `swimlaneSettings.allowDragAndDrop`143- External drag: `externalDropId` property144- Kanban-to-Kanban drag (`dragStop` event + `deleteCard`/`addCard`)145- Kanban-to-Treeview and Kanban-to-Schedule integration146147### Card Edit Dialog148📄 **Read:** [references/dialog.md](references/dialog.md)149- Default dialog (double-click card)150- Custom dialog fields via `<e-kanban-dialogsettings fields="...">`151- Field types: String, Numeric, TextArea, DropDown, TextBox, Input152- Custom dialog template with EJ2 component initialization153- Preventing dialog open with `dialogOpen` event + `args.cancel = true`154- Programmatic add: `kanbanObj.openDialog('Add', data)`155- CRUD persistence via UrlAdaptor with server-side `EditParams` class156157### Sorting, Priority, and Validation158📄 **Read:** [references/sorting-priority-validation.md](references/sorting-priority-validation.md)159- `<e-kanban-sortsettings>` with `sortBy`, `field`, `direction`160- `sortBy` values: Index, DataSourceOrder, Custom161- Priority field: `<e-kanban-cardsettings priority="RankId">` for exact-position drops162- Column min/max card count: `minCount`, `maxCount` on `<e-kanban-column>`163- Constraint type: Column (default) or Swimlane164- Visual color indication on constraint violation165166### Tooltip, Style, and Dimensions167📄 **Read:** [references/tooltip-style-dimensions.md](references/tooltip-style-dimensions.md)168- `enableTooltip="true"` — hover tooltip on cards169- `tooltipTemplate` — custom HTML tooltip template170- CSS class reference for all Kanban elements171- Sticky header pattern172- `width` and `height` — auto, pixel, percentage values173174### Persistence, Localization, and Responsive175📄 **Read:** [references/persistence-localization-responsive.md](references/persistence-localization-responsive.md)176- `enablePersistence="true"` — localStorage state saving177- `locale` property + `ej.base.L10n.load()` script178- All locale key names for Kanban strings179- `enableRtl="true"` — right-to-left layout180- Mobile responsive behavior (swipe, tap-hold, swimlane menu)181182### Virtual Scrolling and Accessibility183📄 **Read:** [references/virtual-scrolling-accessibility.md](references/virtual-scrolling-accessibility.md)184- `enableVirtualization="true"` — on-demand card rendering185- `cardHeight` — fixed height required for virtualization186- Server-side `KanbanVirtualization` parameter handling187- WCAG 2.2 AA compliance table188- WAI-ARIA attributes (`aria-label`, `aria-expanded`, `aria-selected`, etc.)189- Keyboard shortcuts reference190- `AllowKeyboard="false"` — disable keyboard interaction191192### Events193📄 **Read:** [references/events.md](references/events.md)194- `ActionBegin` / `ActionComplete` / `ActionFailure` — lifecycle and error handling195- `CardClick` / `CardDoubleClick` / `CardRendered` — card interaction hooks196- `ColumnDrag` / `ColumnDragStart` / `ColumnDrop` — column reorder events197- `Created` / `DataBinding` / `DataBound` / `DataSourceChanged` — initialization and data events198- `DialogOpen` / `DialogClose` — intercept or cancel dialog (use `args.cancel = true`)199- `Drag` / `DragStart` / `DragStop` — card drag lifecycle (cross-Kanban scenarios use `DragStop`)200- `QueryCellInfo` — customize column cell elements before render201202### Methods203📄 **Read:** [references/methods.md](references/methods.md)204- `AddCard` / `UpdateCard` / `DeleteCard` — CRUD card operations205- `AddColumn` / `DeleteColumn` — dynamic column management206- `OpenDialog` / `CloseDialog` — programmatic dialog control207- `ShowColumn` / `HideColumn` — toggle column visibility208- `GetCardDetails` / `GetColumnData` / `GetSelectedCards` / `GetSwimlaneData` — data retrieval209- `ShowSpinner` / `HideSpinner` — loading indicator control210- `Refresh` / `RefreshHeader` / `RefreshUI` — board re-render helpers211- `DataBind` / `Destroy` / `AppendTo` / `Inject` — component lifecycle utilities212213### All Properties Reference214📄 **Read:** [references/properties.md](references/properties.md)215- Complete list of all `<ejs-kanban>` root properties with types, defaults, and examples216- Sub-model properties: `CardSettings`, `Columns`, `SwimlaneSettings`, `SortSettings`, `DialogSettings`, `StackedHeaders`217- Enum values: `ConstraintType`, `SelectionType`, `SortOrderBy`, `SortDirection`218219### How-To Recipes220📄 **Read:** [references/how-to.md](references/how-to.md)221- Dynamically change columns at runtime222- Filter cards using the `query` property with dropdown223- Search cards by field values with text input224- Add header double-click event handler225226## Common Patterns227228### Swimlane Board with Remote Data229230> **Use when:** You need to group cards by user/team and load data from an API endpoint (OData, WebAPI, etc.) instead of a local collection.231232```html233<ejs-kanban id="Kanban" keyField="Status">234 <e-data-manager url="/api/tasks" adaptor="ODataV4Adaptor"></e-data-manager>235 <e-kanban-columns>236 <e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>237 <e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>238 <e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>239 </e-kanban-columns>240 <e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>241 <e-kanban-swimlanesettings keyField="Assignee" textField="Assignee"></e-kanban-swimlanesettings>242</ejs-kanban>243```244245### Board with Column Constraints246247> **Use when:** You need to enforce WIP (Work-In-Progress) limits — preventing too few or too many cards from stacking in a column.248249```html250<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">251 <e-kanban-columns>252 <e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>253 <e-kanban-column headerText="In Progress" keyField="InProgress"254 minCount="3" maxCount="5" showItemCount="true"></e-kanban-column>255 <e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>256 </e-kanban-columns>257 <e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>258</ejs-kanban>259```260261### Board with Card Edit Dialog + CRUD262263> **Use when:** Users need to create, edit, or delete cards through a dialog form, with changes persisted to the server via `UrlAdaptor`.264265```html266<ejs-kanban id="Kanban" keyField="Status">267 <e-data-manager url="/Home/UpdateData" adaptor="UrlAdaptor"268 crudUrl="/Home/UpdateData"></e-data-manager>269 <e-kanban-columns>270 <e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>271 <e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>272 </e-kanban-columns>273 <e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>274 <e-kanban-dialogsettings fields="@ViewBag.dialogFields"></e-kanban-dialogsettings>275</ejs-kanban>276```277278### Virtual Scrolling Board279280> **Use when:** The dataset is large (hundreds to thousands of cards) and rendering all cards at once would cause performance issues.281282```html283<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data"284 enableVirtualization="true">285 <e-kanban-columns>286 <e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>287 <e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>288 <e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>289 </e-kanban-columns>290 <e-kanban-cardsettings headerField="Title" contentField="Summary"291 selectionType="Multiple"></e-kanban-cardsettings>292</ejs-kanban>293```294295## Key Properties Reference296297| Property | Tag | Values | Purpose |298|---|---|---|---|299| `keyField` | `<ejs-kanban>` | Field name string | Maps cards to columns by status value |300| `dataSource` | `<ejs-kanban>` | `@ViewBag.data` | Local data collection |301| `enableVirtualization` | `<ejs-kanban>` | true/false | Virtual scrolling for large data |302| `enableTooltip` | `<ejs-kanban>` | true/false | Hover tooltip on cards |303| `tooltipTemplate` | `<ejs-kanban>` | Template ID string | Custom tooltip HTML template |304| `allowDragAndDrop` | `<ejs-kanban>` | true/false | Global drag-and-drop toggle |305| `externalDropId` | `<ejs-kanban>` | Element ID array | Target IDs for external drop |306| `enablePersistence` | `<ejs-kanban>` | true/false | Save state to localStorage |307| `locale` | `<ejs-kanban>` | Locale string (e.g. `"de"`) | UI string localization |308| `enableRtl` | `<ejs-kanban>` | true/false | Right-to-left layout |309| `width` | `<ejs-kanban>` | auto/px/% | Board width |310| `height` | `<ejs-kanban>` | auto/px/% | Board height |311| `AllowKeyboard` | `<ejs-kanban>` | true/false | Keyboard navigation toggle |312| `headerField` | `<e-kanban-cardsettings>` | Field name string | Unique card ID field (mandatory) |313| `contentField` | `<e-kanban-cardsettings>` | Field name string | Card body text field |314| `template` | `<e-kanban-cardsettings>` | Template ID string | Custom card HTML template |315| `selectionType` | `<e-kanban-cardsettings>` | None/Single/Multiple | Card selection mode |316| `priority` | `<e-kanban-cardsettings>` | Field name string | Numeric rank field for ordering |317| `showHeader` | `<e-kanban-cardsettings>` | true/false | Show/hide card header |318| `keyField` | `<e-kanban-column>` | Status value(s) | Column card filter (single or comma-separated) |319| `headerText` | `<e-kanban-column>` | Display string | Column title |320| `allowToggle` | `<e-kanban-column>` | true/false | Collapsible column |321| `isExpanded` | `<e-kanban-column>` | true/false | Initial expand state |322| `minCount` | `<e-kanban-column>` | Integer | Minimum cards constraint |323| `maxCount` | `<e-kanban-column>` | Integer | Maximum cards constraint |324| `showItemCount` | `<e-kanban-column>` | true/false | Show card count badge |325| `allowDrag` | `<e-kanban-column>` | true/false | Allow cards to be dragged from column |326| `allowDrop` | `<e-kanban-column>` | true/false | Allow cards to be dropped into column |327| `keyField` | `<e-kanban-swimlanesettings>` | Field name string | Swimlane grouping field |328| `textField` | `<e-kanban-swimlanesettings>` | Field name string | Swimlane display label field |329| `sortBy` | `<e-kanban-sortsettings>` | Index/DataSourceOrder/Custom | Card sort strategy |330| `field` | `<e-kanban-sortsettings>` | Field name string | Field to sort by |331| `direction` | `<e-kanban-sortsettings>` | Ascending/Descending | Sort direction |332333## Data Model334335The standard `KanbanDataModels` class for all examples:336337```csharp338public class KanbanDataModels339{340 public string Id { get; set; }341 public string Title { get; set; }342 public string Status { get; set; } // Maps to keyField343 public string Summary { get; set; } // Card body content344 public string Type { get; set; }345 public string Priority { get; set; }346 public string Tags { get; set; }347 public double Estimate { get; set; }348 public string Assignee { get; set; } // Used for swimlane grouping349 public int RankId { get; set; } // Numeric rank for priority ordering350 public string Color { get; set; } // Optional card color field351}352```