Skip to content

feat(web): find, filter, and sort the Watchlist and History - #11

Merged
danielrpof merged 142 commits into
mainfrom
gsd/phase-25-find-filter-watchlist-and-history
Oct 13, 2026
Merged

danielrpof merged 142 commits into
mainfrom
gsd/phase-25-find-filter-watchlist-and-history

Conversation

@danielrpof

Copy link
Copy Markdown
Owner

No description provided.

- two LEFT JOIN LATERAL ... LIMIT 1 joins in ListWatchlist and GetWatchlistEntry
- upcoming decided in Postgres at the date's own precision against UTC today
- Entry.LatestReleaseDate / NextReleaseDate as always-present nullable JSON keys
- table of subtests for precision, event types, age, null dates and UTC-year boundary
- ProjectionParity now seeds releases and asserts both fields across Add/Update/UpdateNote
- add latest_release_date/next_release_date to WatchlistEntry
- add formatReleaseDate (string-only, no Date construction)
- render latest-release line and conditional Upcoming segment
…oute comment

- formatReleaseDate table over year, year-month, full date, malformed
- makeEntry builder for later Phase 25 plans
- upcoming-only and literal-markup route tests
- replace outdated Phase 06 module comment
- EXISTS over artist_tags in ListEvents and HasOlderEvents
- events.ListParams.TagID passed to both queries
- tag_id parsing with fixed invalid tag_id 400
- tracer test over two artists with no watchlist rows
…tion

- retention holds on first page, every cursor page, and has_older_events
- tag_id composes with artist_id and event_type; unknown id yields empty page
- tag_id validation cases and TagID reaching both queries
- pure watchlistView fold/match/select helpers, kept out of api.ts
- useUrlParams as the single URL writer (preventScrollReset always on)
- Your artists section, name filter toolbar, debounced q write
- toolbar clear x and Esc cases fail until implemented
…, sticky cards

- Clear filters resets q/tags/muted/custom in one push and keeps sort
- count announcements debounced 500ms through the route status region
- in-card edits, adds, and Undo restores join the sticky set (G4)
- listEvents sends tag_id; sortTagsByName helper
- Tag combobox after Event type, one GET /tags per mount
- Load more carries the selected tag
… labels

- Loading tags / Tag unavailable trigger labels
- listbox max height, scrollIntoView, trigger truncation
- sortTagsByName collation and id tie-break
- listbox max-h-72 with scroll, highlighted option scrolled into view
- trigger max-w-64 with truncated, titled label
- Loading tags / Tag unavailable labels when a selected tag can't be named
- precedence: retention, tag, filtered, unfiltered
- Show all tags clears only the tag and refocuses the Tag trigger
- six sort modes with id-ascending tie-break and null-last latest release
- sort follows the URL (push) and clears sticky cards
…ment

- comparator tables for all six modes
- invalid sort cleanup, sort announcement, Clear filters keeps sort
- unknown or default sort is dropped from the URL with replace
- sort change cancels the pending count message and announces Sorted by
- parseHistoryParams/canonicalHistoryParams for artist, type, tag
- filters read via useUrlParams; changes and Show all tags push
25-20: focus relocation is keyboard-only (click detail === 0); mouse-click no-move tests; route tests cited by name. 25-21: race exception sourced from the 2026-10-12 UAT waiver. 25-19: note why CONTEXT stays unchanged. UAT checks now baseline on 1cb2a7b.
…leaves

- anchorCandidates lists every sibling card nearest-first, next before previous
- hook and route tests cover a run of adjacent leaving cards (G-25-11)
…ard toggle removes the card

- TagChips passes click detail === 0 as viaKeyboard; chip label gains data-chip-label
- useScrollAnchor reports the surviving card via useEffectEvent when a keyboard capture's focus is lost
- route focuses the fallback card's pressed chip label with preventScroll
- heading gets tabIndex -1 and a ref as the no-survivor focus target
- tests pin the heading fallback, the run-of-leavers target, and the hook's keyboard-only gates
…hint

- sr-only hint span with a per-row useId id, aria-describedby on the button
- wrapper title and 40% cap unchanged; no visual change
- fallback anchor, keyboard focus move, and Deezer button description
- superseded hashed assets removed
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Coverage

Area Coverage Δ vs main Gate Status
Backend 90.25% +0.07pp 80% ✅
Frontend 97.16% +1.81pp 70% ✅

head b36b27b · 2026-10-13T02:33:07Z
baseline: main@72f26da

Clears CVE-2026-78667, CVE-2026-78669 and CVE-2026-97031 flagged by Trivy in usr/local/bin/server.
@danielrpof
danielrpof merged commit 5c0d214 into main Oct 13, 2026
26 checks passed
@danielrpof
danielrpof deleted the gsd/phase-25-find-filter-watchlist-and-history branch October 13, 2026 02:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant