Add in-view incremental Find (Ctrl+F) with match highlighting#649
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Adds an in-pane “Find in view” experience for the log table (Ctrl+F) that scans the currently displayed rows (without altering filters/sort/selection), supports incremental navigation, and renders accessible match highlighting (including group-aware behavior).
Changes:
- Introduces a Find overlay (
FindBar) with incremental search, navigation, and options (case/whole-word), plus UI highlighting styles. - Adds LogTablePane-side find state management and background scanning using a shared runtime matcher (
EventFindMatcher). - Routes Ctrl+F through the keyboard shortcut bridge via a singleton
FindCoordinator, and adds unit/UI tests.
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/Unit/EventLogExpert.UI.Tests/TestUtils/LogTablePaneDependenciesExtensions.cs | Registers IFindCoordinator for UI tests. |
| tests/Unit/EventLogExpert.UI.Tests/LogTable/LogTablePaneFindTests.cs | Adds integration-style bUnit tests covering find behavior in LogTablePane. |
| tests/Unit/EventLogExpert.UI.Tests/LogTable/FindBarTests.cs | Adds unit tests for FindBar interactions and rendering. |
| tests/Unit/EventLogExpert.Runtime.Tests/LogTable/EventFindMatcherTests.cs | Adds unit tests for the runtime matcher semantics (case/whole-word). |
| src/EventLogExpert.UI/wwwroot/Keyboard/Keyboard.js | Extends Ctrl+ shortcut routing to include Ctrl+F. |
| src/EventLogExpert.UI/wwwroot/app.css | Adds theme variables for find highlight colors. |
| src/EventLogExpert.UI/LogTable/LogTablePane.razor.js | Adds focusTableContainer() interop used when there’s no focusable row. |
| src/EventLogExpert.UI/LogTable/LogTablePane.razor.css | Adds find highlight styling (marks + match/current rings + forced-colors handling). |
| src/EventLogExpert.UI/LogTable/LogTablePane.razor.cs | Hooks Find lifecycle into pane init/dispose/render and group ownership rules. |
| src/EventLogExpert.UI/LogTable/LogTablePane.razor | Renders FindBar overlay and match mark rendering for the current match row. |
| src/EventLogExpert.UI/LogTable/LogTablePane.Find.cs | Implements pane-local find logic: debounce, cancellable scanning, navigation, and group-aware scrolling. |
| src/EventLogExpert.UI/LogTable/Find/IFindCoordinator.cs | Defines coordinator interface for Ctrl+F routing to the active pane. |
| src/EventLogExpert.UI/LogTable/Find/FindCoordinator.cs | Implements coordinator registration/ownership behavior. |
| src/EventLogExpert.UI/LogTable/Find/FindBar.razor.js | Adds JS helpers (native F3 suppression; focus/select input). |
| src/EventLogExpert.UI/LogTable/Find/FindBar.razor.css | Adds styles for the find bar UI and options tray. |
| src/EventLogExpert.UI/LogTable/Find/FindBar.razor.cs | Implements find bar component behavior, JS module hookup, and key handling. |
| src/EventLogExpert.UI/LogTable/Find/FindBar.razor | Defines find bar markup and accessibility attributes. |
| src/EventLogExpert.UI/Keyboard/KeyboardShortcutService.cs | Routes Ctrl+F to IFindCoordinator.RequestOpen(). |
| src/EventLogExpert.UI/DependencyInjection/UiServiceCollectionExtensions.cs | Registers IFindCoordinator in production DI. |
| src/EventLogExpert.Runtime/LogTable/SetAllGroupsCollapsedAction.cs | Makes action public so UI can subscribe. |
| src/EventLogExpert.Runtime/LogTable/EventFindMatcher.cs | Adds the shared matcher used by both scanning and highlighting. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
jschick04
force-pushed
the
feat/in-view-find
branch
from
July 15, 2026 05:00
fd0c569 to
fe666b5
Compare
jschick04
force-pushed
the
feat/in-view-find
branch
from
July 15, 2026 05:21
fe666b5 to
7b6ef4c
Compare
jschick04
force-pushed
the
feat/in-view-find
branch
from
July 15, 2026 05:36
7b6ef4c to
6e3f223
Compare
jschick04
marked this pull request as ready for review
July 15, 2026 05:40
NikTilton
approved these changes
Jul 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds an in-view incremental Find (Ctrl+F) to the log-table pane (ADO 62704674). It is a component-local overlay over the current filtered view: it never dispatches a filter / lens / sort / selection action, it only reads the view to derive matches, scrolls the current match into view, and (in grouped mode) toggles group collapse to reveal a hidden match.
What's included
N/M; prev/next navigation (buttons, Enter / Shift+Enter, F3 / Shift+F3) with wrap-around and a screen-reader wrap announcement.wordSeparatorsboundary rule (correct for EventIDs, GUIDs, and hyphenated provider names, and still findable for punctuation-edged queries like.NET/-Auditing).Implementation notes
EventFindMatcher) in the Runtime layer:RowMatches/IndexOfMatch/ whole-wordIsWordBounded, Ordinal comparison for machine-shaped cell text, shared by the row scan and the current-match mark splitter so highlighted spans are exactly the spans that counted as a match.MarkupString), capped per cell against a pathological hit count.FindCoordinatorbridge (keyboard shortcut -> currently-mounted pane), mount-order-safe across WebView reloads.Validation
EventFindMatcherTests(18, incl. a whole-word Theory),FindBarTests,LogTablePaneFindTests.Manual acceptance (WebView2)
Visual / interaction outcomes automated tests can't verify: