diff --git a/lib/aprsme_web/live/weather_live/callsign_view.ex b/lib/aprsme_web/live/weather_live/callsign_view.ex index c932a6b..9be2f17 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.ex +++ b/lib/aprsme_web/live/weather_live/callsign_view.ex @@ -195,6 +195,20 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do rain_since_midnight: {&WeatherUnits.format_rain/2, " "} } + @doc """ + Checks if a weather field has a valid value (not nil, "N/A", or empty). + """ + def has_weather_field?(packet, field) do + value = PacketUtils.get_weather_field(packet, field) + + case value do + nil -> false + "N/A" -> false + "" -> false + _ -> true + end + end + @doc """ Formats weather values with appropriate units based on locale. """ @@ -202,8 +216,21 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do value = PacketUtils.get_weather_field(packet, key) case value do + nil -> + nil + "N/A" -> - "N/A" + nil + + value when is_number(value) -> + case @weather_formatters[key] do + {formatter, separator} -> + {converted_value, unit} = formatter.(value, locale) + "#{converted_value}#{separator}#{unit}" + + nil -> + "#{value}" + end value when is_binary(value) -> case @weather_formatters[key] do @@ -214,12 +241,15 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do "#{converted_value}#{separator}#{unit}" :error -> - value + nil end nil -> "#{value}" end + + _ -> + nil end end end diff --git a/lib/aprsme_web/live/weather_live/callsign_view.html.heex b/lib/aprsme_web/live/weather_live/callsign_view.html.heex index bd5a66a..e87e743 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.html.heex +++ b/lib/aprsme_web/live/weather_live/callsign_view.html.heex @@ -86,58 +86,75 @@ <% end %> -
-
{gettext("Temperature")}
-
- {format_weather_value(@weather_packet, :temperature, @locale)} -
-
-
-
{gettext("Humidity")}
-
- {PacketUtils.get_weather_field(@weather_packet, :humidity)}% -
-
-
-
{gettext("Wind")}
-
- {PacketUtils.get_weather_field(@weather_packet, :wind_direction)}° @ {format_weather_value( - @weather_packet, - :wind_speed, - @locale - )} -
-
-
-
{gettext("Gusts")}
-
- {format_weather_value(@weather_packet, :wind_gust, @locale)} -
-
-
-
{gettext("Pressure")}
-
- {PacketUtils.get_weather_field(@weather_packet, :pressure)} hPa -
-
-
-
{gettext("Rain (1h)")}
-
- {format_weather_value(@weather_packet, :rain_1h, @locale)} -
-
-
-
{gettext("Rain (24h)")}
-
- {format_weather_value(@weather_packet, :rain_24h, @locale)} -
-
-
-
{gettext("Rain (since midnight)")}
-
- {format_weather_value(@weather_packet, :rain_since_midnight, @locale)} -
-
+ <%= if has_weather_field?(@weather_packet, :temperature) do %> +
+
{gettext("Temperature")}
+
+ {format_weather_value(@weather_packet, :temperature, @locale)} +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :humidity) do %> +
+
{gettext("Humidity")}
+
+ {PacketUtils.get_weather_field(@weather_packet, :humidity)}% +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :wind_direction) || has_weather_field?(@weather_packet, :wind_speed) do %> +
+
{gettext("Wind")}
+
+ <%= if has_weather_field?(@weather_packet, :wind_direction) do %> + {PacketUtils.get_weather_field(@weather_packet, :wind_direction)}° + <% end %> + <%= if has_weather_field?(@weather_packet, :wind_speed) do %> + @ {format_weather_value(@weather_packet, :wind_speed, @locale)} + <% end %> +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :wind_gust) do %> +
+
{gettext("Gusts")}
+
+ {format_weather_value(@weather_packet, :wind_gust, @locale)} +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :pressure) do %> +
+
{gettext("Pressure")}
+
+ {PacketUtils.get_weather_field(@weather_packet, :pressure)} hPa +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :rain_1h) do %> +
+
{gettext("Rain (1h)")}
+
+ {format_weather_value(@weather_packet, :rain_1h, @locale)} +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :rain_24h) do %> +
+
{gettext("Rain (24h)")}
+
+ {format_weather_value(@weather_packet, :rain_24h, @locale)} +
+
+ <% end %> + <%= if has_weather_field?(@weather_packet, :rain_since_midnight) do %> +
+
{gettext("Rain (since midnight)")}
+
+ {format_weather_value(@weather_packet, :rain_since_midnight, @locale)} +
+
+ <% end %>
{gettext("Raw Packet")}