Skip to content

Add Subform container for Enter handling, drop Combobox onEnter - #3422

Open
david-crespo wants to merge 3 commits into
mainfrom
subform-enter-handling
Open

david-crespo wants to merge 3 commits into
mainfrom
subform-enter-handling

Conversation

@david-crespo

@david-crespo david-crespo commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

The diff is unreadable unless you hide whitespace changes because it adds a wrapper to existing code.

This is an alternative to #3417 that deletes the sad logic inside Combobox instead of fixing it. We get rid of onEnter, and instead of having to keep track of whether the list is open with isOpenRef and decide when to preventDefault, Combobox never calls preventDefault (unless it's done for it by Headless UI when selecting an option).

But in subforms we still need to capture those enter keypresses before they hit the parent form, so we wrap subforms in a Subform component with an onSubmit prop. The advantage is we no longer have to remember to do this for every field we add to a subform (and we have messed this up before).

This approach fixes the same problem cases as #3417, all of which are noops on main. Enter in a closed combobox now:

  • Adds the protocol filter from the ICMP type combobox, like Enter in the ICMP code field next to it
  • Applies the alert class filter (Alert list class search #3393)
  • Submits standalone forms from their pickers, like link silo, link pool, attach disk, create snapshot, and instance create's boot disk and image pickers

Subform.browser.spec.tsx tests Enter in a combobox, text input, and button inside a subform, and in a combobox outside a subform. In the e2e tests, Enter adds a firewall rule target, port and ICMP type, a webhook secret, and a transit IP. Enter in a closed combobox applies the alert class filter, attaches a disk, and creates an instance from the image picker (these tests fail on main).

@vercel

vercel Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
console Ready Ready Preview Oct 23, 2026 3:55pm UTC

Request Review

@david-crespo

Copy link
Copy Markdown
Collaborator Author

@claude review

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this PR and didn't find any bugs. Because it changes what Enter does in every Combobox across the app (Enter in a closed combobox now reaches and submits the enclosing form), a human should still confirm that is the intended UX for every form, beyond the pickers the e2e tests cover.

What was reviewed:

  • Subform's keydown guard (defaultPrevented, IME isComposing, and the target being an HTMLInputElement), and its reliance on Headless UI calling preventDefault/stopPropagation when the options list is open.
  • The Combobox refactor from a render prop to a plain child. No onEnter or isOpenRef references remain anywhere in app/.
  • The <Subform> wrapping in firewall-rules-common, network-interface-edit and webhook-create, plus the new browser spec and the e2e Enter cases.
Extended reasoning...

The change adds a Subform wrapper component, removes the per-field Enter handlers and the Combobox's onEnter and open-state tracking, and updates the firewall rule, webhook secret and transit IP subforms along with the e2e tests. It touches no security-sensitive surface: no auth, data exposure or injection. The code is coherent and has test coverage, but it changes Enter behavior in the shared Combobox for every form in the app, which is a UX decision rather than a mechanical change. That is the reason for deferring instead of approving.

This branch was successfully deployed

1 active deployment
Preview — 3ec10f85 Deployed Oct 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant