Skip to content

fix(qcm): camera list focus, announcements and search recovery (QQA-16c) - #44

Merged
joepetjr merged 12 commits into
masterfrom
qqa-16c-camera-polish
Oct 25, 2026
Merged

joepetjr merged 12 commits into
masterfrom
qqa-16c-camera-polish

Conversation

@joepetjr

Copy link
Copy Markdown
Contributor

Ported from headlessmode-archive #801 (commit 8d41d5b0), QC U13 camera chain (QC-04), plan row U13. Base qqa-16b-camera-find (PR for #800), stacked. Closed in the archive, not merged there; this is the port.

What changes: focus handling, announcements and search recovery in the Cameras list, plus a leak-check helper for its tests.

Adapted: one md conflict with master's wording resolved (master's "Search places" kept); site-coupling.json regenerated.

Tests (through bin/pytest-slot.sh, logs unpiped):

  • Red on the base with this PR's tests only: 51 tests, 37 pass, 14 fail.
  • Green: targeted set 215 of 215 pass.
  • CI's node step, full (built site, browser tests ran), on this branch before opening: 3137 tests, 3137 pass, 0 fail, 0 skipped, exit 0. Python subset (front matter, content validation, privacy accuracy, headers wiring, a11y config, data contract, public tree): py_rc=0. The full run was with master at fdfc050; master then took fix(qcm): put the last seven map reads on fetchWithDeadline #38 (adapter reads on fetchWithDeadline), so this branch was rebased onto 530a556 (clean) and the boundary, no-raw-fetch, adapter-deadlines, control-register, acceptance-manifest and docs-promises checks re-run on the final head: all pass (log quick2.log).

Ported from headlessmode-archive #790 (commit 3e807b4f) onto master; conflicts in main.js and layer-registry.test.mjs resolved against master's groupHint and screen/names render maps.
… (QQA-18)

The Layers panel was headed by provider and rendering role. It now has ten
task headings (Map style, Places & routes, Land & access, Terrain &
landscape, Weather & conditions, Night sky, Cameras, Place facts, Explore
counties, Print options); every layer id has exactly one home. Search also
matches group purpose words and opens matching groups, restoring them when
cleared. An Active on map list shows each layer that is on with Remove and
Retry. Print-only pages are not counted as on the map.

Presentation only: ids, input ids, radio/checkbox roles, URL state and what
each layer draws are unchanged.

Ported from headlessmode-archive #794 (commit 7f665250). Adapted to the shipped catalogue: the
eleven layers added since get a task home, and the browser tests account for the default-on names
and roads layers in the Active list.
…16a)

Under the Cameras group, a list built from loaded camera records, not
pins: "In this view" (from zoom 7) or "Near selected place" (25 km, any
zoom), with purpose filters over the five camera layer ids.

- camera-layer.js: cameraList, cameraListStatus, cameraRowText,
  listLoadState, listPlace, PURPOSE_OF_LAYER, kmBetween, reachBox.
- main.js: builds and redraws the list (150 ms debounce, rows rebuilt
  only on change); the near scope loads the camera files around the
  place on demand. The latest place pick wins: finder, pin or places
  list, else the drawn area's centre.
- Counts are honest: "Listing the nearest 50 of 350" and the 300-pin
  cap is stated, never silent. Loading, zoom-in, nothing near,
  unavailable and partly-unavailable states are distinct, and a
  near-scope failure is judged on the near files alone.
- The Active on map list counts only layer rows, not the list controls.
- Tests: camera-list (11) and camera-list-browser J10, J10b-e (6).

Ported from headlessmode-archive #798 (commit 212364d9), stacked on the QQA-18 grouping PR.
…-16b)

The camera list gains a Saved scope keyed by camera:provider:providerId
through the saved-places store, with legacy alias refs treated as one
camera. Search this area reads only the index files within a true 100 km
of the map centre, on a press, latest search wins. Below the pin zoom the
list summarises loaded cameras instead of going blank. A throwing storage
accessor no longer crashes the page; saving shows as unavailable.

Ported from headlessmode-archive #800 (commit b8615f1f), stacked on the QQA-16a camera list PR.
Follow-ups from the QQA-16a and QQA-16b reviews. A repaint returns focus
to the same camera row (or the list, never the page); a separate polite
announcer speaks only settled answers that changed, and stays quiet while
a search is pending; rows are exposed as a list. A failed search shows a
failed state instead of hanging on Searching, and the Saved scope retries
a failed index or camera file on the next press or a saved-count change.
A shared leak check proves save and search send no camera ref, old ref,
id tail or name anywhere, with a negative control.

Ported from headlessmode-archive #801 (commit 8d41d5b0), stacked on the QQA-16b saved cameras PR.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Deploying headlessmode-current with  Cloudflare Pages  Cloudflare Pages

Latest commit: 3576885
Status: ✅  Deploy successful!
Preview URL: https://5a22a033.headlessmode-current.pages.dev
Branch Preview URL: https://qqa-16c-camera-polish.headlessmode-current.pages.dev

View logs

# Conflicts:
#	content/quiet-corners-maps.md
#	scripts/qcm/README.md
#	scripts/qcm/context-overlays-browser.test.mjs
#	scripts/qcm/layer-count-browser.test.mjs
#	themes/headlessmode/static/js/quiet-corners-maps/main.js
# Conflicts:
#	scripts/qcm/site-coupling.json
#	themes/headlessmode/static/js/quiet-corners-maps/main.js
# Conflicts:
#	scripts/qcm/README.md
#	themes/headlessmode/static/js/quiet-corners-maps/main.js
@joepetjr
joepetjr changed the base branch from qqa-16b-camera-find to master October 25, 2026 15:54
@joepetjr
joepetjr merged commit 1379f27 into master Oct 25, 2026
5 checks passed
@joepetjr
joepetjr deleted the qqa-16c-camera-polish branch October 25, 2026 17:02
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