Frontmatter
| id | 9073 |
| title | refactor: Ensure Drag & Drop Stability via ''internalId'' |
| state | Closed |
| labels | airefactoringcore |
| assignees | tobiu |
| createdAt | Feb 9, 2026, 11:50 AM |
| updatedAt | Feb 9, 2026, 1:33 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9073 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9074 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 9, 2026, 1:33 PM |
refactor: Ensure Drag & Drop Stability via 'internalId'
tobiu cross-referenced by #9074 on Feb 9, 2026, 11:51 AM
tobiu added parent issue #9074 on Feb 9, 2026, 11:52 AM

tobiu
Feb 9, 2026, 1:32 PM
Input from Gemini 3 Pro:
✦ Task Completed: Ensure Drag & Drop Stability via 'internalId'
Objective: Ensure that Drag & Drop operations are robust against the new
internalIdlogic (avoiding PK lookup failures) and fix critical regressions exposed by the refactor.Key Fixes:
Grid Header Sorting (
SortZone.mjs):
- Regression Fix: Fixed a critical issue where dragging columns containing heavy components (like OffscreenCanvas in Sparklines) destroyed the content.
- Root Cause:
onDragEndcalledsuper.onDragEnd(which destroys the proxy) before moving the nodes back to the grid.- Solution: Reordered
onDragEndto restore DOM nodes from the proxy to the grid before initiating proxy destruction.List Drag & Drop (
ListDragZone.mjs):
- Robust Lookup: Updated
setDatato handleinternalIdcorrectly.- Logic: It first attempts
store.get(recordId)(PK lookup). If that fails, it scans the store for a matchinginternalId. This ensures drag data is correctly populated even whenList.Baseeventually switches to usinginternalIdfor DOM keys.Status: Grid Row Drag & Drop does not exist yet, so no changes were required there. The Drag & Drop subsystem is now stable.
tobiu assigned to @tobiu on Feb 9, 2026, 1:32 PM
tobiu closed this issue on Feb 9, 2026, 1:33 PM
Context: Cross-store Drag & Drop (e.g., dragging a User to a Project) can fail if both entities share the same ID (e.g.,
1) but come from different stores. WithinternalId(#9070), every item has a globally uniqueneo-record-xidentifier.Task: Audit and update the Drag & Drop subsystems to leverage
internalIdfor identifying dragged items.Requirements:
dragDataincludes theinternalId.internalIdto resolve the original record from the source store, eliminating ambiguity.Scope:
src/draggable/list/DragZone.mjssrc/draggable/grid/DragZone.mjssrc/draggable/DragZone.mjs