prop/lib/microwaveprop_web/live
Graham McIntire 08ac76a4b8
refactor(rover): pattern-match-first event handlers + missing test branches
show.ex (rover-planning) and show.ex (rover-locations) auth + delete
flows go from nested case/case/case to a `with` ladder fed by a single
`authenticated/1` clause that returns `{:ok, user}` or
`{:error, :unauthenticated}`. The else block enumerates the small set
of failure tuples instead of rebuilding nested error returns.

Other idiomatic-Elixir tightening:
- `progress_summary/1` reduces with a `tally_path/2` multi-clause
  helper (status as a head pattern, not three Enum.count passes).
- `paths_by_rover_location/1` extracts `group_to_pair/1`,
  `station_position/1`, and `group_lat/1` so each transformation is a
  pattern match instead of an anonymous fn with `&& fallbacks`.
- `error_summary/1` is two clauses (empty vs populated errors)
  instead of a pipe-into-case.
- Drag-to-edit show.ex consolidates the working-coords assigns into
  `assign_working_coords/3`.

Bug fix uncovered while writing tests: `add_station` on a fresh
/rover-planning/new form was a visual no-op on the first click —
cast_assoc replaced the unseeded default Station struct with the new
params row instead of appending. Now the initial changeset is built
from `%{"stations" => %{"0" => %{"position" => "0"}}}` so add_station
appends from the get-go. Regression test added at
test/microwaveprop_web/live/rover_planning_live_test.exs.

New test branches:
- form: add_station appends on first click + remove_station drops
  the targeted row.
- rover-planning show: add_rover_site whitespace-input rejection,
  delete_rover_site permission denial.
- rover-locations show: save_edit rejects unauthenticated drivers.

Suite: 3228 tests, 0 failures. Credo strict: 0 issues.
2026-05-03 13:01:36 -05:00
..
admin docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
beacon_live docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
contact_live feat(contact): link grid squares to gridmap.org 2026-04-27 09:32:01 -05:00
rover_locations_live refactor(rover): pattern-match-first event handlers + missing test branches 2026-05-03 13:01:36 -05:00
rover_planning_live refactor(rover): pattern-match-first event handlers + missing test branches 2026-05-03 13:01:36 -05:00
user_management_live docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
about_live.ex docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
algo_live.ex docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
contact_map_live.ex feat(contact-map): date-range filter alongside callsign filter 2026-05-03 10:36:34 -05:00
eme_live.ex refactor: deduplicate helpers and simplify Scorer 2026-04-28 14:14:34 -05:00
import_live.ex fix(dialyzer): clear 125+ warnings under strict flags 2026-04-21 10:30:06 -05:00
live_stash_guard.ex feat(nav): add EME menu item to map + weather sidebars 2026-04-25 09:49:06 -05:00
map_live.ex feat(hrdps): activate Canadian propagation chain end-to-end 2026-04-29 17:29:37 -05:00
path_live.ex fix(path): stop warning on expected native-duct cache misses 2026-05-03 12:38:29 -05:00
privacy_live.ex docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
rover_live.ex refactor(rover-locations): rename status atoms ideal→good, off_limits→bad 2026-05-03 11:13:18 -05:00
rover_locations_live.ex feat(rover-locations): /rover-locations/map page with Maidenhead overlay 2026-05-03 11:14:58 -05:00
rover_planning_live.ex feat(rover-planning): /rover-planning page with path-profile worker 2026-05-03 11:04:11 -05:00
skewt_live.ex feat(skewt): fetch full 25-level profile and drop valid_time URL param 2026-04-25 15:19:34 -05:00
skewt_location_resolver.ex feat(skewt): add /skewt LiveView with HRRR-backed Skew-T-Log-P plot 2026-04-25 12:13:46 -05:00
skewt_svg.ex fix(path): handle ProfilesFile cell shape correctly + log async exits 2026-04-25 15:57:20 -05:00
status_live.ex fix(status): mobile layout — tables no longer truncate column headers 2026-04-24 15:45:01 -05:00
submit_live.ex fix(submit): allowlist switch_tab values instead of trusting client input 2026-04-25 10:10:42 -05:00
user_profile_live.ex docs/tests: moduledocs on 18 LiveViews, MapLive event coverage, Rust pipeline roundtrip 2026-04-21 17:16:12 -05:00
weather_ca_map_live.ex fix(weather): default selected time to current hour, not clock-closest 2026-04-30 13:50:33 -05:00
weather_map_live.ex fix(weather): tolerate stale map_bounds from /map → /weather navigation 2026-04-30 17:34:38 -05:00