The "Recent decisions" feed appends every streamed decision (source.addEventListener("decision", ...), src/doberman/dash/app.py:563-615) up to MAX_FEED_ROWS = 200 (:329). Finding the BLOCKs in 200 mixed rows means scrolling.
What to do
- Tag each feed
<li> with li.dataset.verdict = row.verdict where it's created (around line 570).
- Add a
<select id="feed-filter"> with All / PASS / AUTH / BLOCK in the Recent decisions header row (<h2> at line 274).
- On change, either toggle a class on
#feed with matching CSS (.feed-only-block li:not([data-verdict="BLOCK"]) { display: none } and friends), or walk feedEl.children and set hidden. Rows added later must obey the current filter too, so apply it when a row is inserted.
- Test in
tests/unit/test_dash_polish.py: the shell contains feed-filter and data-verdict/dataset.verdict.
Client-side only; nothing changes in what the server sends. Heads-up: two dashboard PRs are in flight (#401, #415), both editing dash/app.py's top bar; branch from a fresh main and expect a small rebase if they land while you work.
The "Recent decisions" feed appends every streamed decision (
source.addEventListener("decision", ...),src/doberman/dash/app.py:563-615) up toMAX_FEED_ROWS = 200(:329). Finding the BLOCKs in 200 mixed rows means scrolling.What to do
<li>withli.dataset.verdict = row.verdictwhere it's created (around line 570).<select id="feed-filter">with All / PASS / AUTH / BLOCK in theRecent decisionsheader row (<h2>at line 274).#feedwith matching CSS (.feed-only-block li:not([data-verdict="BLOCK"]) { display: none }and friends), or walkfeedEl.childrenand sethidden. Rows added later must obey the current filter too, so apply it when a row is inserted.tests/unit/test_dash_polish.py: the shell containsfeed-filteranddata-verdict/dataset.verdict.Client-side only; nothing changes in what the server sends. Heads-up: two dashboard PRs are in flight (#401, #415), both editing
dash/app.py's top bar; branch from a freshmainand expect a small rebase if they land while you work.