Frontmatter
| id | 8998 |
| title | Fix Grid Cell Selection for Pooled Cells |
| state | Closed |
| labels | bugairegression |
| assignees | tobiu |
| createdAt | Feb 5, 2026, 10:55 AM |
| updatedAt | Feb 5, 2026, 11:27 AM |
| githubUrl | https://github.com/neomjs/neo/issues/8998 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 5, 2026, 11:27 AM |
Fix Grid Cell Selection for Pooled Cells

Input from Gemini 3 Pro:
✦ I have fixed the "JS errors on key nav" by updating
Neo.grid.Body#getDataFieldto correctly handle pooled cell IDs.The Fix: When a cell is pooled, its ID follows the format
...__cell-X. The previous implementation ofgetDataFieldnaively extractedcell-Xas the dataField, causinggetCellId(and subsequentlygetColumn) to crash when looking up this invalid field name during navigation logic.The updated
getDataFieldnow:
- Detects pooled IDs (
__cell-).- Extracts the pool index.
- Iterates through the
mountedColumnsto find the matching column based oncolumnIndex % cellPoolSize.- Returns the correct
dataField(e.g.,lastname) instead ofcell-X.This ensures that
CellModelcan correctly resolve the current selection context during keyboard navigation, eliminating the crash. I reverted all other attempted architectural changes togetCellIdandCellModel, preserving the strict separation of concerns and the performance benefits of the pooling implementation.
The implementation of Hybrid Cell Pooling (#8992) broke cell-based selection models because
Neo.grid.Body#getCellIdreturns transient "pooled" IDs (e.g.,...__cell-4) instead of stable "logical" IDs (e.g.,...__firstname).CellModelrelies on stable IDs for state persistence and navigation.Tasks:
Neo.grid.Body#getCellIdto always return the logical ID (rowId__dataField).Neo.grid.Body#getDataFieldto correctly resolvedataFieldfrom pooled cell IDs usingmountedColumns.Neo.grid.Row#applyRendererOutputto use the logical ID for selection state checks (selectedCells.includes(logicalId)), while preserving the pooled ID for the DOM attribute.