LearnNewsExamplesServices
Frontmatter
id18981
titleCell editing on nested record fields and in a tree column has no witness
stateClosed
labels
aitestinggrid
assigneesneo-fable
createdAtSep 19, 2026, 5:48 PM
updatedAtSep 19, 2026, 6:23 PM
githubUrlhttps://github.com/neomjs/neo/issues/18981
authorneo-fable
commentsCount0
parentIssue18762
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 19, 2026, 6:23 PM

Cell editing on nested record fields and in a tree column has no witness

neo-fable
neo-fable commented on Sep 19, 2026, 5:48 PM

Context

Leaf of #18762 (its public-proof responsibility). Both surfaces were measured healthy on 2026-09-19, real Chromium (Playwright e2e rig), dev@bd2a404560, on a throwaway fixture: nothing is broken. What is missing is the witness: every tracked cell-editing arm drives a flat String model in a plain column, so these two code paths can regress unseen.

The Problem

Path Why it is its own code path Tracked arms today
A dotted dataField (user.firstname) the commit is record.set({[dataField]: …}), which data.RecordFactory#setRecordFields resolves through fieldsMap and Neo.ns; the cell lookup, data-field and isModifiedField all take the dotted name 0
A tree column (grid.column.Tree → grid.column.Component) the cell's content is a component reference; grid.Row#applyRendererOutput swaps it for the editor's reference and has to give the component back, showing the new value through applyRecordConfigs 0

Measured today (all green, no page error):

  • Nested: double-click, Enter commit, Tab and Shift+Tab across nested and flat columns, Escape, F2, an emptied required draft stays open, neo-is-modified appears on the edited nested cell and disappears when the original value returns (body.highlightModifiedCells + trackModifiedFields).
  • Tree: renaming a leaf and a folder in the tree column (the double-click on a folder's label starts the edit and does not toggle the node; after the commit the tree component is back with the new name, indent and toggle intact); a plain column next to it; collapsing the parent by its toggle while a child's edit is open commits the draft, as any click-away does, and expanding shows the committed value.

The Fix

Test-only.

  • New fixture test/playwright/component/apps/grid-cell-editing-record-shapes: one grid over a model with a nested user object, one grid over a TreeStore with an editable tree column. A fixture of its own, because a third grid in grid-cell-editing would shrink the row windows its pooling arms depend on.
  • New test/playwright/e2e/grid/CellEditingRecordShapes.spec.mjs, on the shared e2e/utils/gridCellEditing.mjs reads, record ids resolved from cell text (the grid renders internal ids).
  • Each arm gets a mutant that reddens it, stated in the PR.

Acceptance Criteria

  • A nested field commits through Enter and through Tab, keeps its value on Escape, and carries neo-is-modified exactly while it differs from its original value.
  • Renaming a node in the tree column shows the new name inside the returned tree component, and the double-click does not toggle a folder.
  • Collapsing the parent of an edited child by its toggle commits the draft; after expanding, the child shows it.
  • Every arm is reddened by a named mutant; grid e2e stays green; the spec is inside the CI selection.

Out of Scope

  • A programmatic collapse or a store-side removal of the edited tree record with no focus change (no user gesture reaches it: the keys belong to the editor).
  • Non-text editors on these shapes.

Related

#18762 · #18837 (the public-example witness, same helper)

Live latest-open sweep: checked latest 12 open issues at 2026-09-19T15:48Z, plus all-state searches "cell editing nested" and "cell editing tree column"; no equivalent found. A2A claim sweep: latest 30 messages (all read-states) at 15:35Z; no claim on either surface (I announced both as undriven at 13:30Z; nobody picked them up). MC sweep: "grid cell editing on nested record fields or a tree column component cell: witness, test coverage", 5 results: the 2026-03 tree-component refactor (primitives through applyRecordConfigs, which is why a rename shows up) and my own 09-18 coverage inventory (text-only fixture); no prior decision on these witnesses. Own-assignment sweep: 1 open (#15252), not overlapping.

Origin Session ID: 2c9503fc-beef-4d80-939b-7d616601cd97 Retrieval Hint: "cell editing nested record field dotted dataField tree column component cell rename witness e2e record shapes"