+
+ <.stat_field label="Frequency">
+ {Beacon.format_freq(@beacon.frequency_mhz)} MHz
+
+ <.stat_field label="Callsign">{@beacon.callsign}
+ <.stat_field label="Keying">{Beacon.keying_label(@beacon.keying)}
+ <.stat_field label="On the air">
+
+ {if @beacon.on_the_air, do: "Yes", else: "No"}
+
+
- <.stat_field label="Grid">{@beacon.grid}
- <.stat_field label="Latitude">{format_coord(@beacon.lat)}
- <.stat_field label="Longitude">{format_coord(@beacon.lon)}
- <.stat_field label="EIRP">{Beacon.format_mw(@beacon.power_mw)} mW
+ <.stat_field label="Grid">{@beacon.grid}
+ <.stat_field label="Latitude">{format_coord(@beacon.lat)}
+ <.stat_field label="Longitude">{format_coord(@beacon.lon)}
+ <.stat_field label="EIRP">{Beacon.format_mw(@beacon.power_mw)} mW
- <.stat_field label="Height AGL">{@beacon.height_ft} ft
- <.stat_field label="Bearing">{bearing_label(@beacon.bearing)}
- <.stat_field :if={@beacon.beamwidth_deg} label="Beamwidth">
- {Beacon.format_mw(@beacon.beamwidth_deg)}°
-
-
+ <.stat_field label="Height AGL">{@beacon.height_ft} ft
+ <.stat_field label="Bearing">{bearing_label(@beacon.bearing)}
+ <.stat_field :if={@beacon.beamwidth_deg} label="Beamwidth">
+ {Beacon.format_mw(@beacon.beamwidth_deg)}°
+
+
-
-
- Notes
+
+
+ Notes
+
+
{@beacon.notes}
-
{@beacon.notes}
-
-
-
Submitted by
-
{@beacon.user.callsign}
+
+ Submitted by
+ {@beacon.user.callsign}
+
diff --git a/lib/microwaveprop_web/live/contact_live/show.ex b/lib/microwaveprop_web/live/contact_live/show.ex
index 390d2c32..bc3ca5e1 100644
--- a/lib/microwaveprop_web/live/contact_live/show.ex
+++ b/lib/microwaveprop_web/live/contact_live/show.ex
@@ -569,7 +569,7 @@ defmodule MicrowavepropWeb.ContactLive.Show do
<%= if @pending_edit && !@editing && !admin?(assigns) do %>
-
+
<.icon name="hero-clock" class="w-4 h-4 inline" />
You have a pending edit for this contact awaiting admin review.
@@ -665,12 +665,12 @@ defmodule MicrowavepropWeb.ContactLive.Show do
<%= if @elevation_profile.verdict == "BLOCKED" && @elevation_profile.first_obstruction_km do %>
-
+
Obstructed at {format_dist(@elevation_profile.first_obstruction_km)}
<% end %>
<%= if @elevation_profile.verdict == "CLEAR" do %>
-
+
Line of sight clear
<% end %>
@@ -1087,77 +1087,89 @@ defmodule MicrowavepropWeb.ContactLive.Show do
Data Sources
-
-
HRRR Model
- <%= if @data_sources.hrrr do %>
-
{@data_sources.hrrr.profile_count} path profiles
-
{@data_sources.hrrr.levels} pressure levels each
-
Valid: {@data_sources.hrrr.valid_time}
-
Grid: {@data_sources.hrrr.lat}, {@data_sources.hrrr.lon}
- <% else %>
-
Not available
- <% end %>
+
+
+
HRRR Model
+ <%= if @data_sources.hrrr do %>
+
{@data_sources.hrrr.profile_count} path profiles
+
{@data_sources.hrrr.levels} pressure levels each
+
Valid: {@data_sources.hrrr.valid_time}
+
Grid: {@data_sources.hrrr.lat}, {@data_sources.hrrr.lon}
+ <% else %>
+
Not available
+ <% end %>
+
-
-
Elevation Profile
- <%= if @data_sources.elevation do %>
-
{@data_sources.elevation.samples} samples along path
-
{@data_sources.elevation.dist} path distance
-
Source: {@data_sources.elevation.source}
-
{@data_sources.elevation.duct_count} duct layers detected
- <% else %>
-
Not available
- <% end %>
+
+
+
Elevation Profile
+ <%= if @data_sources.elevation do %>
+
{@data_sources.elevation.samples} samples along path
+
{@data_sources.elevation.dist} path distance
+
Source: {@data_sources.elevation.source}
+
{@data_sources.elevation.duct_count} duct layers detected
+ <% else %>
+
Not available
+ <% end %>
+
-
-
Terrain Analysis
- <%= if @data_sources.terrain do %>
-
{@data_sources.terrain.samples} profile samples
-
Verdict: {@data_sources.terrain.verdict}
-
Max elevation: {@data_sources.terrain.max_elev} m
-
Diffraction: {@data_sources.terrain.diffraction} dB
- <% else %>
-
Not available
- <% end %>
+
+
+
Terrain Analysis
+ <%= if @data_sources.terrain do %>
+
{@data_sources.terrain.samples} profile samples
+
Verdict: {@data_sources.terrain.verdict}
+
Max elevation: {@data_sources.terrain.max_elev} m
+
Diffraction: {@data_sources.terrain.diffraction} dB
+ <% else %>
+
Not available
+ <% end %>
+
-
-
Surface Observations
-
{length(@surface_observations)} stations
- <%= if @surface_observations != [] do %>
-
- {Calendar.strftime(hd(@surface_observations).observed_at, "%H:%M")} – {Calendar.strftime(
- List.last(@surface_observations).observed_at,
- "%H:%M"
- )} UTC
-
- <% end %>
+
+
+
Surface Observations
+
{length(@surface_observations)} stations
+ <%= if @surface_observations != [] do %>
+
+ {Calendar.strftime(hd(@surface_observations).observed_at, "%H:%M")} – {Calendar.strftime(
+ List.last(@surface_observations).observed_at,
+ "%H:%M"
+ )} UTC
+
+ <% end %>
+
-
-
Soundings (RAOB)
-
{length(@soundings)} profiles
- <%= if @soundings != [] do %>
-
- {Enum.map_join(@soundings, ", ", fn s ->
- "#{s.station.station_code} (#{s.level_count} levels)"
- end)}
-
-
{Enum.count(@soundings, & &1.ducting_detected)} with ducting
- <% end %>
+
+
+
Soundings (RAOB)
+
{length(@soundings)} profiles
+ <%= if @soundings != [] do %>
+
+ {Enum.map_join(@soundings, ", ", fn s ->
+ "#{s.station.station_code} (#{s.level_count} levels)"
+ end)}
+
+
{Enum.count(@soundings, & &1.ducting_detected)} with ducting
+ <% end %>
+
-
-
Solar Indices
- <%= if @solar do %>
-
SFI: {@solar.sfi || "—"}
-
SSN: {@solar.sunspot_number || "—"}
-
Ap: {@solar.ap_index || "—"}
- <% else %>
-
Not available
- <% end %>
+
+
+
Solar Indices
+ <%= if @solar do %>
+
SFI: {@solar.sfi || "—"}
+
SSN: {@solar.sunspot_number || "—"}
+
Ap: {@solar.ap_index || "—"}
+ <% else %>
+
Not available
+ <% end %>
+
<% end %>
diff --git a/lib/microwaveprop_web/live/submit_live.ex b/lib/microwaveprop_web/live/submit_live.ex
index bb7acb3c..ab52f401 100644
--- a/lib/microwaveprop_web/live/submit_live.ex
+++ b/lib/microwaveprop_web/live/submit_live.ex
@@ -240,17 +240,19 @@ defmodule MicrowavepropWeb.SubmitLive do
<:subtitle>Help us build a better propagation model
-
-
Every contact matters
-
- Our propagation model improves with real-world data. Each verified contact
- you submit is matched against atmospheric conditions at the time of your contact,
- helping us calibrate predictions for all amateur bands from 902 MHz and up. The
- more contacts we have, the better our forecasts get for everyone.
-
+
+
+
Every contact matters
+
+ Our propagation model improves with real-world data. Each verified contact
+ you submit is matched against atmospheric conditions at the time of your contact,
+ helping us calibrate predictions for all amateur bands from 902 MHz and up. The
+ more contacts we have, the better our forecasts get for everyone.
+
+
-
+
Your contact will be available on the
<.link navigate="/contacts" class="link link-primary">contacts page
@@ -259,35 +261,26 @@ defmodule MicrowavepropWeb.SubmitLive do
-
+