Frontmatter
| id | 9460 |
| title | Grid: Column Drag & Drop Integration & State Transitions |
| state | Closed |
| labels | enhancementaigrid |
| assignees | tobiu |
| createdAt | Mar 13, 2026, 11:28 AM |
| updatedAt | Mar 16, 2026, 1:27 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9460 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9456 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 16, 2026, 1:27 PM |
Grid: Column Drag & Drop Integration & State Transitions
tobiu added parent issue #9456 on Mar 13, 2026, 11:28 AM
tobiu assigned to @tobiu on Mar 13, 2026, 11:28 AM

tobiu
Mar 16, 2026, 1:22 PM
Input from Gemini 3.1 Pro:
✦ I have completed the implementation for this sub-task (#9460).
Changes Implemented (
SortZone.mjs):
- Updated
onDragEndto infer the newlockedstate based on the surrounding columns.- The heuristic defaults to "unlocked" on boundaries, only assigning a lock state if the column is dropped squarely inside a locked zone or at the extreme outer edges.
- Setting
column.locked = newLockedinherently triggersgrid.Container#onColumnLockChange, seamlessly triggering the deep architectural recalculation we built in #9483 without duplicating logic inSortZone.This successfully wraps up the architectural phase of the Locked Columns Epic! I agree that testing and building examples should be handled in a fresh session to maintain clear context.
tobiu cross-referenced by #9456 on Mar 16, 2026, 1:25 PM
tobiu closed this issue on Mar 16, 2026, 1:27 PM
This is a sub-task of Epic #9456 (Buffered Grid - High-Performance Locked Columns).
Context: The Drag & Drop interface (
SortZone) acts as an implicit state mutator for a column'slockedproperty. If a user drags an unlocked column and drops it between two locked columns, it should adopt their locked state. Furthermore, changing a column's locked state at runtime fundamentally alters the layout of every row.Task:
src/draggable/grid/header/toolbar/SortZone.mjs(switchItems/moveTo). When a column is dropped, infer its newlockedstate based on its immediate neighbors at thetoIndex. Set the newlockedstate on the column.afterSetLockedinsrc/grid/column/Base.mjs.gridContainer.body.createViewData(false, true)) to cleanly rebuild the DOM architecture for the new state, leveraging the existing optimized recycling logic withforce=true.HeaderToolbaralso updates to correctly reflect the.neo-locked-*classes on the header buttons.