LearnNewsExamplesServices
Frontmatter
id19822
titleA grid built with locked columns never syncs row hover across regions
stateClosed
labels
bugaigrid
assigneesneo-opus-grace
createdAtOct 16, 2026, 6:44 PM
updatedAtOct 16, 2026, 8:23 PM
githubUrlhttps://github.com/neomjs/neo/issues/19822
authorneo-opus-grace
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtOct 16, 2026, 8:22 PM
milestonev13.3

A grid built with locked columns never syncs row hover across regions

neo-opus-grace
neo-opus-grace commented on Oct 16, 2026, 6:44 PM

Context

Found while fixing #19820, recorded as a defect-note at 15:35Z, and promoted by triage after a real-browser check. On the issues showcase, at dev eedc33c3dd plus #19821 (which only adds destroy-time retirement), hovering a row breaks the highlight at both locked seams:

  • Hovering row 3's center cells tints them rgb(250, 249, 253).
  • The same row's locked-start cell (19756) and locked-end cell (Open) stay rgb(255, 255, 255).
  • On the main thread, Neo.main.addon.GridRowHoverSync is not even loaded. GridDragScroll and GridRowScrollPinning each hold one registration for the same grid.

The Problem

#9630 made GridRowHoverSync sync a row's hover across the start, center and end bodies whenever the grid has locked columns. It registers through Container#updateColCount, inside if (me.scrollManager) (src/grid/Container.mjs:1637). A grid with locked columns in its initial config only calls updateColCount() from construct (:359). That is before onConstructed creates the ScrollManager (:1307–1312), so the block is skipped. ScrollManager#afterSetMounted registers drag scroll, row pinning and horizontal scroll sync, but not hover sync. Only a later column change (onColumnsMutate, :1300) registers it. #19820's unit recorder shows the same thing: a grid created with a locked column has no hover-sync registration after mount, and a runtime lock adds one.

The Architectural Reality

  • Design authority: #9630, which introduced hover sync so that hovering a row highlights its cells in every region.
  • GridRowHoverSync#register silently skips a view whose DOM node is absent (src/main/addon/GridRowHoverSync.mjs:116–138). A registration attempted before mount does nothing, so registration belongs to the mount lifecycle.
  • ScrollManager already owns the mount lifecycle of its other addons in afterSetMounted and afterSetWindowId (src/grid/ScrollManager.mjs:110–151).

The Fix

  • ScrollManager#afterSetMounted registers GridRowHoverSync on mount when rowHoverSync is on and the grid has locked columns, and retires it on unmount.
  • afterSetWindowId moves it with the others.
  • Container#updateColCount keeps toggling it when columns are locked or unlocked at run time.
  • No config or API change.

Acceptance Criteria

  • A grid constructed with locked columns registers GridRowHoverSync when it mounts. (Unit test, red on dev.)
  • In the issues showcase, hovering a center row also tints that row's locked start and end cells. (Real browser, both seams.)
  • Unmount retires the registration, and a lock change while mounted still registers or retires it.
  • A grid without locked columns registers no hover sync (negative control).

Out of Scope

  • The addon's own behaviour, since it syncs correctly once registered.
  • Destroy-time retirement, which is #19820.

Related

#9630 · #19820 · #19821

Live latest-open sweep: latest 20 open issues at 16:43Z, no equivalent. The only GridRowHoverSync matches are closed: #9630 and #18295. A2A claim sweep: no claim on hover sync. MC sweep ("row hover highlight does not sync across locked columns regions grid GridRowHoverSync not registered locked at construction") returned the April design: updateColCount(hasLockedColumns) enables the addon dynamically. No prior decision excludes construction. Own-assignment sweep: 5 open, and #19820 is adjacent but not overlapping (it covers destroy).

Origin Session ID: bb2e8968-a6d6-4ef7-a4ed-5ab3157b1ac8 Retrieval Hint: "grid locked columns row hover sync never registered at construction ScrollManager afterSetMounted"

tobiu closed this issue on Oct 16, 2026, 8:22 PM
tobiu referenced in commit 04ff2b0 - "fix(grid): a grid built with locked columns syncs row hover from its first mount (#19822) (#19824) on Oct 16, 2026, 8:22 PM