prop/lib/microwaveprop/radio
Graham McIntire fb503ed2e7
feat(contacts): record + show flagger attribution; admin delete
Two related changes to the contact detail page:

1. The "Flagged invalid" badge was wrapping to two lines on
   narrow widths because the daisyUI badge has no explicit
   no-wrap class. Add `whitespace-nowrap`, drop the redundant
   capitalization on "Invalid", and append the flagger's
   callsign so the badge reads "Flagged invalid by W5XYZ".
   Hover tooltip carries the timestamp.

2. New `flagged_by_user_id` + `flagged_at` columns on contacts.
   `Radio.toggle_flagged_invalid!/2` now takes the admin User
   doing the flagging; on unflag it clears both fields so a
   subsequent re-flag gets a fresh attribution and the badge
   never shows a stale flagger.

3. `Radio.delete_contact!/1` + a Delete button next to Flag.
   Admin-only, gated in both the event handler and the template.
   Uses LV's `data-confirm` for the destructive-action prompt.
   All FK references to `contacts` already declare
   `on_delete: :delete_all` (terrain_profiles, contact_edits,
   contact_common_volume_radar) so a single Repo.delete!
   cascades cleanly.
2026-05-04 10:15:13 -05:00
..
adif_import.ex feat(import): strip non-printables from CSV/ADIF uploads 2026-04-26 15:34:46 -05:00
band_resolver.ex Rename 9cm band 3456 → 3400 2026-04-16 12:40:38 -05:00
callsign_client.ex Drop gridmap.org dependency, resolve callsigns locally 2026-04-12 17:43:29 -05:00
contact.ex feat(contacts): record + show flagger attribution; admin delete 2026-05-04 10:15:13 -05:00
contact_common_volume_radar.ex feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
contact_edit.ex feat(contacts): private flag with scope-aware visibility 2026-04-18 17:49:01 -05:00
csv_import.ex feat(import): strip non-printables from CSV/ADIF uploads 2026-04-26 15:34:46 -05:00
edit_notifier.ex Send mail as prop@w5isp.com with reply-to graham@mcintire.me 2026-04-12 14:00:38 -05:00
enrichment_status.ex Add dialyzer specs and types across the codebase 2026-04-12 08:55:04 -05:00
import_matcher.ex CSV/ADIF import: upsert existing contacts on grid/mode refinement 2026-04-16 10:57:37 -05:00
import_run.ex feat(import): async CSV import with progress-tracking schema 2026-04-17 09:31:22 -05:00
maidenhead.ex feat(rover): URL station persistence + 10-digit grids on calculated values 2026-04-25 16:36:34 -05:00
text_sanitizer.ex feat(import): strip non-printables from CSV/ADIF uploads 2026-04-26 15:34:46 -05:00