feat(ui): virtualized event timeline#35
Merged
Merged
Conversation
Add the inspector's centerpiece — a windowed virtual list of trace events in a model-owned split (S3): - The timeline uses `ui.virtualList`, so the visible window (and the widget-node budget) stays viewport-sized no matter the trace length: a 500k-event trace materializes a few dozen row nodes, not 500k. Proven by a dataset-scale window-math test. - Each row shows a severity dot (when the event participates in a detected failure), the index, UTC time, a direction affordance, the message (action / responded id / error), and the message type. Clicking a row selects the event through the pressable row. - A model-owned splitter separates the timeline from a detail pane; the fraction echoes back through `value` after each drag. - A first-cut detail pane shows the selected event's normalized fields; the full inspector (raw array, payload tree, session panel) is #30. Closes #28
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
The inspector's centerpiece: a virtualized event timeline. One row per OCPP
event, in a model-owned split beside a detail pane — and it stays viewport-sized
in widget nodes no matter how large the trace is.
ui.virtualList/ui.virtualWindow) over theactive trace's events. The runtime owns the scroll; the view builds only the
visible window, keyed by event index. A 500 000-event trace materializes a few
dozen row nodes, not 500k — well under the 1024 widget-node per-view budget.
failure, colored by severity), the index, UTC time-of-day, a direction
affordance (CS→CSMS / CSMS→CS / unknown), the message (action for calls, the
responded UniqueId for results,
code: descriptionfor errors), and the messagetype. Clicking a row selects the event.
model-owned
split; the divider fraction echoes back throughvalueaftereach drag (
timeline_resized).inspector — raw OCPP-J array, payload tree, and session panel — is feat(ui): message inspector + session panel #30; this
establishes the pane and the selection wiring.
Verification
native test -Dplatform=null— 65/65 pass (macOS; CI also runs Linux).New coverage: the timeline renders sample rows; a row press selects the event
and the detail pane reflects it (through
msgForPointer); the splitter fractionround-trips; the virtual window stays viewport-sized at 500 000 items
(
window.itemCount() < 64); and the accessibility sweep still passes over thesplit + timeline tree.
native check --strictclean;native buildproduces the ReleaseFast binary.scripts/smoke.shnow also asserts a timeline row (BootNotification) renderslive — the CI Linux · Xvfb job drives the real window.
Notes
correlated) lands with the trusted-ingestion engine path in feat(engine): trusted-ingestion parse path + streaming (500k / 100 MB) #29; this PR proves
the UI side — the window math is viewport-bounded regardless of item count.
accessibility labels (no font-coverage risk, a11y-clean).
Closes #28