Frontmatter
| id | 9841 |
| title | Multi-Body: Peer State Adoption for Cell Selection Synchronization |
| state | Closed |
| labels | enhancementai |
| assignees | tobiu |
| createdAt | Apr 9, 2026, 11:30 PM |
| updatedAt | Apr 9, 2026, 11:40 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9841 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9492 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Apr 9, 2026, 11:40 PM |
Multi-Body: Peer State Adoption for Cell Selection Synchronization
Closedenhancementai
tobiu added parent issue #9492 on Apr 9, 2026, 11:30 PM
tobiu assigned to @tobiu on Apr 9, 2026, 11:40 PM

tobiu
Apr 9, 2026, 11:40 PM
Implementation complete via 6f42674. CellModel now delegates properly using Peer State Adoption and active peer synchronization overrides across selection workflows (select/deselect/deselectAll).
tobiu closed this issue on Apr 9, 2026, 11:40 PM
Architectural Context
In the Multi-Body Grid layout, single cell selection via
CellModel(items) faces unique topological isolation. A single logical cell index (e.g.,row3__firstName) only exists inside one specificGridBodycomponent (e.g.bodyEnd), unlike rows or columns which span across multiple bodies conceptually. However, visual correctness and keyboard navigation spanning across multi-view boundaries dictates that the logical pointer (items_state inherited fromNeo.selection.Model) must be shared perfectly across all body models.Objective
Harmonize
CellModelstate via the "Peer State Adoption" architecture to allow seamless keyboard routing across Grid Body interfaces.Implementation Details
CellModelmust securely ignorecellClickevent captures triggering outside its native.viewnode.Neo.selection.Modelconfiguresitems_: { cloneOnGet: 'none' }. We must utilize active Peer State sharing to bridge the array reference (me._items = peers[0]._items) across grid partitions, defeating the reactivity cloner, to merge arrow key navigations transparently.CellModel.deselectAll()blindly removes CSS classes if they intersect the active array. We must ensure state mutations in one physical partition update peers seamlessly (or ensureselection.Modeldoes not crash looking up disconnected node graphs in remote bodies).Avoided Pitfalls
_itemsconfiguration fromBase.mjsreactive setters to avoid destroying single-thread garbage collection.