Communications Workbench Overview Map with Clustering #169

Closed
ned wants to merge 5 commits from issue-164-overview-map into main
Member

Implements the overview map for issue #164: every communication is now visible on the map at once.

  • All filtered communications drawn directly as points (no clustering): status-colored (new = hot pink, opened = orange, pending = yellow, possible-issue = red, resolved = green, invalid = gray) with recency opacity — fully opaque only when brand new, fading linearly to 95% transparent by 14 days — so recent work stands out while older density still ghosts in
  • Map bounds follow the list: fits the filtered communications by default, zooms to a communication when selected (list row or map marker)
  • Map/Satellite toggle keeps all points (deterministic source/layer replay on style.load)
  • Backend: communication payloads carry a representative Location derived from the source report geometry, falling back to the pinned address geometry when the report row has none; contact-less communications no longer 500 the whole list

Closes #164

Implements the overview map for issue #164: every communication is now visible on the map at once. - All filtered communications drawn directly as points (no clustering): status-colored (new = hot pink, opened = orange, pending = yellow, possible-issue = red, resolved = green, invalid = gray) with recency opacity — fully opaque only when brand new, fading linearly to 95% transparent by 14 days — so recent work stands out while older density still ghosts in - Map bounds follow the list: fits the filtered communications by default, zooms to a communication when selected (list row or map marker) - Map/Satellite toggle keeps all points (deterministic source/layer replay on style.load) - Backend: communication payloads carry a representative Location derived from the source report geometry, falling back to the pinned address geometry when the report row has none; contact-less communications no longer 500 the whole list Closes #164
eliribble force-pushed issue-164-overview-map from b434bbe824
Some checks failed
/ golint (push) Successful in 22s
/ pnpm-build (push) Failing after 39s
to 459bcbd78e
Some checks failed
/ golint (push) Successful in 19s
/ pnpm-build (push) Failing after 38s
2026-08-29 22:18:15 +00:00
Compare
eliribble force-pushed issue-164-overview-map from 459bcbd78e
Some checks failed
/ golint (push) Successful in 19s
/ pnpm-build (push) Failing after 38s
to 11a8b9bbaa
All checks were successful
/ golint (push) Successful in 2m11s
/ pnpm-build (push) Successful in 2m27s
/ gotest (push) Successful in 1m49s
/ pnpm-test (push) Successful in 10s
2026-09-05 00:02:03 +00:00
Compare
eliribble approved these changes 2026-09-05 00:07:55 +00:00
Overview-map location fell back to the address-row POINT when the source report row had no geometry of its own (525/574 Delta reports store the resident pin on the address, not the report). CommunicationsContactByID and hydration now skip/placeholder communications with unresolvable contacts instead of 500ing the whole /api/communication list — an incoming text from an unknown number previously broke the entire workbench.
communications: overview map shows all points with recency opacity
All checks were successful
/ golint (push) Successful in 2m9s
/ pnpm-build (push) Successful in 2m39s
/ gotest (push) Successful in 1m49s
/ pnpm-test (push) Successful in 10s
f529ca32ec
Replaced clustering with direct rendering of every filtered communication. Per-point opacity is computed at data-build time because MapLibre has no style-level clock — the previous ["now"] expression made the whole circle layer fail to render. Points fully opaque up to 7 days old fade linearly to 0.25 by 60 days; oldest are drawn first so recent points sit on top. Map bounds now fit the filtered list extent when nothing is selected and zoom to the selected communication's payload location (plus loaded report/address geometry) on selection. ts/map/Source.vue geojson sources now push async data via setData() — previously the overview source stayed stuck on its initial empty FeatureCollection, so points never appeared after load.
Sources and layers were re-applied on a one-shot 'load' plus a per-toggle once('styledata') handler. MapLibre fires styledata at unpredictable times relative to setStyle (sometimes before the listener registers, and addSource/addLayer throw 'Style is not done loading' mid-swap), so a replay could run at the wrong moment, throw, and abort the whole batch — leaving sources/layers missing until a later toggle happened to time correctly.

- Register on the persistent style.load event (fires once the new style is fully loaded, the only moment adds are guaranteed safe); per-item try/catch so one failure cannot abort the batch
- Registry now stores the latest config on every registerSource/registerLayer call, so replays recreate sources with current (post-load) data and layers with current paint, instead of mount-time empties
- Layer event handlers attach once per map instance (they survive style switches), no duplicate re-attachment
- Remove the racy once('styledata') re-registration and the Source.vue setTimeout(0) style.load helper
communications: tune overview marker opacity fade and status colors
Some checks failed
/ golint (push) Successful in 2m8s
/ gotest (push) Has been cancelled
/ pnpm-test (push) Has been cancelled
/ pnpm-build (push) Has been cancelled
6f6f5af99e
Overview markers now fade linearly from fully opaque at creation to 5% opacity (95% transparent) by 14 days, with no full-opacity plateau. Status colors switched from blue/green to hot pink (new) and orange (opened), which stay visible against satellite imagery.
benjaminsperry force-pushed issue-164-overview-map from 6f6f5af99e
Some checks failed
/ golint (push) Successful in 2m8s
/ gotest (push) Has been cancelled
/ pnpm-test (push) Has been cancelled
/ pnpm-build (push) Has been cancelled
to 81bf9bfe2d
All checks were successful
/ golint (push) Successful in 3m9s
/ pnpm-build (push) Successful in 1m39s
/ gotest (push) Successful in 1m48s
/ pnpm-test (push) Successful in 10s
2026-09-05 22:53:05 +00:00
Compare
eliribble closed this pull request 2026-10-13 18:29:38 +00:00
All checks were successful
/ golint (push) Successful in 3m9s
/ pnpm-build (push) Successful in 1m39s
/ gotest (push) Successful in 1m48s
/ pnpm-test (push) Successful in 10s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Gleipnir/nidus-sync!169
No description provided.