Problem
There is no way to find a channel in the grid. Browser find-in-page (Ctrl+F / Cmd+F) looks like it should work, but it cannot match any channel data.
Chrome's find-in-page does not search <input value="..."> attributes, and the grid renders every editable cell as an <input> or a <select>. Walking the text nodes of a single rendered row on a Baofeng 5RM confirms what is actually matchable:
"289" — the Location button label, i.e. the row's own index
- 345
<option> labels belonging to the collapsed tone/DTCS/mode dropdowns
Name ("CH289") and Frequency ("146.520000") appear nowhere as text.
So Ctrl+F can only find a channel by its Location number — which you must already know — while stopping on hundreds of invisible option strings on the way. Searching 88.5 matches the tone dropdown of every row in the codeplug.
This predates the grid virtualization in ed394fb; that change did not cause it. Virtualization does mean find-in-page now sees only the rendered rows, but since it could never match channel data in the first place, there is nothing to restore.
Proposal
An in-app find that searches state.currentRows rather than the DOM. That is strictly better than find-in-page could ever be here: the model is complete in memory including off-screen rows, and it can search columns that have never been findable at all (Name, Frequency, Comment).
Suggested shape, as a web/js/ui/channel-find.js module following the conventions in AGENTS.md:
- Find box in the channel toolbar; Cmd/Ctrl+F focuses it (
preventDefault), Escape closes and hands the shortcut back to the browser
- Enter / Shift+Enter step through matches, scrolling each into view and selecting its row; match count next to the box
- Case-insensitive substring match across all columns
Most of the machinery already exists:
channelShortcutsActive() in web/js/ui/channel-table.js already decides when a keystroke belongs to the grid rather than a cell editor or an open modal — the guard needed to intercept Cmd/Ctrl+F
- virtualization made scroll-to-channel-N trivial: set
scrollTop, and the right rows mount themselves
selectedRowIndexes already drives row highlighting, so a match can simply select its row
Overriding Cmd+F is normally rude, but the native behaviour is useless on this page and Escape restores it.
Out of scope
Filter mode (show only matching rows) is a natural follow-on and is nearly free now that the DOM no longer mirrors the model 1:1, but it muddies what Insert / Move / Location mean while a filter is active. Worth deciding separately.
Problem
There is no way to find a channel in the grid. Browser find-in-page (Ctrl+F / Cmd+F) looks like it should work, but it cannot match any channel data.
Chrome's find-in-page does not search
<input value="...">attributes, and the grid renders every editable cell as an<input>or a<select>. Walking the text nodes of a single rendered row on a Baofeng 5RM confirms what is actually matchable:"289"— the Location button label, i.e. the row's own index<option>labels belonging to the collapsed tone/DTCS/mode dropdownsName("CH289") andFrequency("146.520000") appear nowhere as text.So Ctrl+F can only find a channel by its Location number — which you must already know — while stopping on hundreds of invisible option strings on the way. Searching
88.5matches the tone dropdown of every row in the codeplug.This predates the grid virtualization in ed394fb; that change did not cause it. Virtualization does mean find-in-page now sees only the rendered rows, but since it could never match channel data in the first place, there is nothing to restore.
Proposal
An in-app find that searches
state.currentRowsrather than the DOM. That is strictly better than find-in-page could ever be here: the model is complete in memory including off-screen rows, and it can search columns that have never been findable at all (Name, Frequency, Comment).Suggested shape, as a
web/js/ui/channel-find.jsmodule following the conventions in AGENTS.md:preventDefault), Escape closes and hands the shortcut back to the browserMost of the machinery already exists:
channelShortcutsActive()inweb/js/ui/channel-table.jsalready decides when a keystroke belongs to the grid rather than a cell editor or an open modal — the guard needed to intercept Cmd/Ctrl+FscrollTop, and the right rows mount themselvesselectedRowIndexesalready drives row highlighting, so a match can simply select its rowOverriding Cmd+F is normally rude, but the native behaviour is useless on this page and Escape restores it.
Out of scope
Filter mode (show only matching rows) is a natural follow-on and is nearly free now that the DOM no longer mirrors the model 1:1, but it muddies what Insert / Move / Location mean while a filter is active. Worth deciding separately.