Skip to content

Viewer: pagination, search filtering, and per-sender hide with show-hidden toggle #21

Description

@zbuc

Problem

The viewer renders the entire sender table at once — 1,400+ rows on a realistic dataset — with no way to find a specific sender or dismiss ones you don't care about.

Proposal

Front-end only (web/, so the Pages demo inherits it via #19/#20):

  • Search filter: text input, case-insensitive substring match on sender addresses
  • Pagination: client-side, 50 rows per page, prev/next controls with page info
  • Hide button: an emoji button on each row that hides that sender from the list and subtracts its count from the Total messages tile (top-sender and distinct-senders tiles recompute too); hidden senders persist in localStorage
  • Show hidden toggle: reveals hidden senders (dimmed, with an unhide button) without adding them back into the totals

Acceptance criteria

  • Works in both the local viewer and the static demo (no server changes needed)
  • Sender strings still rendered exclusively via textContent (they are attacker-controlled)
  • Search and pagination compose (filtering resets to page 1; page clamps when rows disappear)
  • Hidden state survives reload; totals always exclude hidden senders
  • build_demo.py anchors (Generate the Pages demo from web/ at deploy time #20) remain intact so the demo build keeps working

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions