Skip to content

Channel grid has no working search: Ctrl+F cannot match channel data #17

Description

@jasiek

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions