Photo detail page: each photo gets a real page, not a bare image

/photos/view/{name} shows the photo large in the shell, every title
read from it with status chips and BGG matches, its reshoot tickets
with working dismiss, prev/next navigation with arrow keys, position
in the gallery, and a link to the raw full-size file. Gallery and
catalog photo links point here now (review's shots keep linking to the
raw image — zooming spine text is their whole purpose). The status
chip renderer moves to app.js so the catalog and photo pages can't
drift; render_page learns an `active` override so a detail page keeps
its nav section lit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-02 18:37:31 -04:00
parent 08b741671d
commit 33cbfffbd6
7 changed files with 153 additions and 14 deletions
+12
View File
@@ -621,3 +621,15 @@ def test_pipeline_reports_badge_fields(tmp_path):
p = _app(cfg).get("/api/pipeline").json()
assert p["pending_review"] == 2 # one match + one edition decision
assert p["to_add"] == 2 # header excluded
def test_photo_detail_page_serves_with_photos_nav_active(tmp_path):
web = _app(_cfg(tmp_path))
html = web.get("/photos/view/shelf.jpg").text
assert "all photos" in html
# the Photos nav entry stays highlighted on the detail page
import re
(current,) = re.findall(r'<a href="([^"]+)" aria-current="page"', html)
assert current == "/photos"
assert 'src="/static/app.js"' in html