Bug: Kanban view - reordering cards within a stack is never persisted
Please confirm that the bug report does not already exist
- I confirm there is no existing issue for this bug.
Steps to reproduce
- Create a table (e.g. tasks) with a single-select field (e.g. status) and a few rows.
- Create a Kanban view stacked by the single-select field. Leave the view unsorted.
- Drag a card to a different position within the same stack. The UI accepts the drag and shows the new order.
- Switch to the grid view (or reload the page), then return to the Kanban view.
- The cards are back in their previous order. The reorder from step 3 was lost.
Watching the backend confirms nothing is persisted: no row update request is issued on a within-stack drop, and the table's internal order column (nc_order) never changes. Reordering rows in the grid view does update nc_order, and the Kanban view then reflects it. So ordering only flows grid → kanban, never kanban → anywhere.
Desired Behavior
Order should be persisted when dragging cards within a stack. The docs state):
"You can move records within a stack by dragging and dropping the card to the desired position within the stack"
I am new to nocodb, so I don't know if this is a regression.
Project Details
NocoDB used as docker : true NocoDB version : 2026.08.2 (nocodb/nocodb:2026.08.2) Database used in NC_DB URL : pg (via NC_DB_JSON_FILE) Project was created by clicking : New Project Database on which spreadsheet is created : pg OS on which NocoDB is running : Linux (Docker, docker compose) Node.js version if running as node : v24.14.0 Database version : PostgreSQL 18 (postgis/postgis:18-3.6)
(Code references below are from the develop branch at #588d513)
Attachments
Technical
The card list's @change handler chain (onMoveAndPersistExpand → onMove) only handles vuedraggable's added and removed events. A within-stack reorder emits moved, which falls through both branches, so nothing is saved:
By contrast, stack reordering (onMoveStack, same file, L696–L720) does handle event.moved and persists it via updateKanbanMeta. The omission is specific to cards.
Additionally, even the cross-stack path persists only the grouping field, never a position - updateOrSaveRow calls updateRowProperty(row, groupingField.value):
The cards visually rearrange only because vuedraggable mutates the local array; the next data fetch re-sorts by the view's sorts or default nc_order.
Source: nocodb/nocodb