LearnNewsExamplesServices
Frontmatter
id9167
title[Grid] Fix Runtime Buffer Updates (Phase 1: Functional)
stateClosed
labels
bugairegression
assigneestobiu
createdAtFeb 15, 2026, 1:00 PM
updatedAtFeb 15, 2026, 1:47 PM
githubUrlhttps://github.com/neomjs/neo/issues/9167
authortobiu
commentsCount1
parentIssue9165
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtFeb 15, 2026, 1:47 PM

[Grid] Fix Runtime Buffer Updates (Phase 1: Functional)

Closed v12.0.0 bugairegression
tobiu
tobiu commented on Feb 15, 2026, 1:00 PM

Runtime changes to bufferRowRange and bufferColumnRange currently break the grid rendering (blank grid or missing cells).

This ticket covers the "Make it work" phase, prioritizing correctness over performance. We likely need to trigger a full re-render or correctly re-initialize the row/cell pools when these configs change.

Parent Issue: #9165

tobiu added the bug label on Feb 15, 2026, 1:00 PM
tobiu added the ai label on Feb 15, 2026, 1:00 PM
tobiu added the regression label on Feb 15, 2026, 1:00 PM
tobiu assigned to @tobiu on Feb 15, 2026, 1:01 PM
tobiu added parent issue #9165 on Feb 15, 2026, 1:01 PM
tobiu referenced in commit 868dca3 - "fix(grid): Resolve runtime buffer update regressions (#9167) on Feb 15, 2026, 1:45 PM
tobiu
tobiu Feb 15, 2026, 1:46 PM

Input from Gemini 3 Pro:

✦ Fixed the regression where runtime buffer updates caused the grid to render blank.

Resolution:

  1. Core Framework (src/grid/Body.mjs):

    • Updated updateMountedAndVisibleColumns to accept a force parameter, bypassing optimization checks when the buffer changes but the scroll position hasn't.
    • Ensured startIndex initializes to 0 to prevent NaN propagation.
    • Refactored afterSetBufferColumnRange and afterSetBufferRowRange to trigger a forced, non-recycled render (createViewData(false, true)), allowing the pooling logic to resize correctly.
  2. Application Logic (apps/devindex):

    • Controller: Fixed NaN bug in MainContainerController where onBuffer*Change handlers received Record objects instead of primitive values (due to forceSelection: true).
    • View: Synchronized ControlsContainer ComboBox defaults (5 rows, 3 cols) with GridContainer to prevent initial state mismatch.

Verification:

  • Added regression test: test/playwright/unit/grid/PoolingRuntimeUpdates.spec.mjs.
  • Verified both Row and Column buffer expansion at runtime.
tobiu closed this issue on Feb 15, 2026, 1:47 PM