fix(app,web): put the caret in the target picker's search when it opens - #721
Conversation
f22bd7a to
cb3f212
Compare
|
Amended (cb3f212): in the app, a sheet that closes with the focus inside now hands it back to its toggle ( |
|
Review before merge: two points to change, two suggestions. Found by reading the code at cb3f212, not run in a browser. 1. Escape in the web sender picker can clear the sender filter (change requested) 2. The app sheet's own close button bypasses 3. Suggestion: a test for 4. Suggestion: the repaint test |
Reaching a node by name took three actions: open the picker, press its search field, type. Opening the app's target sheet and the web's sender picker now focuses the search in the same tap, so a phone raises its keyboard and the next keystroke searches. The app's sheet also opens on an empty query every time; a query left from the last open used to come back with a list narrowed by it. On web the field keeps its value, since it is the sender filter bound to ?sender=. Closing with the focus inside lets go of it rather than leaving it on a hidden field. Closes efiten#714 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cb3f212 to
5d6d451
Compare
|
Pushed 5d6d451 for the review, rebased on master. Per point:
App: 1632 tests, eslint, build. Web: 765 tests, eslint, Playwright 298 passed. The app's sheets were not clicked through in a browser. |
🤖 I have created a release *beep* *boop* --- <details><summary>app: 1.30.0</summary> ## [1.30.0](app-v1.29.1...app-v1.30.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> <details><summary>server: 1.10.1</summary> ## [1.10.1](server-v1.10.0...server-v1.10.1) (2026-09-30) ### Bug Fixes * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **server:** read a refused frame again when the message-id decoder changes ([#737](#737)) ([8586c71](8586c71)) </details> <details><summary>web: 1.26.0</summary> ## [1.26.0](web-v1.25.1...web-v1.26.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Closes #714
What
Reaching a node by name took three actions: open the picker, press its search field, type. Opening now puts the caret in the search in the same tap, so a phone raises its keyboard and the next keystroke searches.
app.
createTargetListgetsopen(), which the target chip calls where it calledreset():#ts-searchtakes the focus (preventScroll).A sheet that closes with the focus inside lets go of it (
releaseFocus), so the caret and the keyboard do not stay on a hidden field.web.
wirePopovertakes afocusEl. The sender picker passes#f-sender, which keeps its value: on web it is the sender filter itself, bound to?sender=. Closing with the focus inside hands it back to the toggle; that holds for the hunter and ignore pickers too, which pass nofocusEl.Verification
targetlist.test.js(new):open()focuses the field, clears the query and repaints. Each line ofopen()red when removed.multiselect.test.js: focus on open withpreventScrolland the value kept; focus back to the toggle on Escape, and left alone when it was elsewhere. Red under mutation.e2e/targetpicker.spec.js: in Chromium the caret is in#f-senderafter the toggle, typing lands there, Escape hands focus back. Red without thefocusEl.#ts-search,diknarrows to one row, the field and the matches stay above a 300 px keyboard; reopening shows an empty field and the full list.🤖 Generated with Claude Code