Add grouped upper-air and ducting layer buttons to weather map

This commit is contained in:
Graham McIntire 2026-04-03 16:53:22 -05:00
parent 9cbf8b91f4
commit 08844d3515
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59

View file

@ -12,12 +12,24 @@ defmodule MicrowavepropWeb.WeatherMapLive do
}
@layers [
%{id: "refractivity_gradient", label: "Refractivity Gradient", unit: "N/km"},
%{id: "bl_height", label: "Boundary Layer", unit: "m"},
%{id: "dewpoint_depression", label: "Dewpoint Depression", unit: "°C"},
%{id: "pwat", label: "Precipitable Water", unit: "mm"},
%{id: "temperature", label: "Temperature", unit: "°C"},
%{id: "ducting", label: "Ducting Detected", unit: ""}
# Surface
%{id: "temperature", label: "Temperature", unit: "°C", group: "Surface"},
%{id: "dewpoint_depression", label: "Td Depression", unit: "°C", group: "Surface"},
%{id: "surface_rh", label: "Humidity", unit: "%", group: "Surface"},
%{id: "pwat", label: "PWAT", unit: "mm", group: "Surface"},
%{id: "surface_refractivity", label: "Refractivity", unit: "N", group: "Surface"},
%{id: "refractivity_gradient", label: "N-Gradient", unit: "N/km", group: "Surface"},
%{id: "bl_height", label: "BL Height", unit: "m", group: "Surface"},
# Upper Air
%{id: "temp_850mb", label: "T @ 850mb", unit: "°C", group: "Upper Air"},
%{id: "dewpoint_850mb", label: "Td @ 850mb", unit: "°C", group: "Upper Air"},
%{id: "lapse_rate", label: "Lapse Rate", unit: "°C/km", group: "Upper Air"},
%{id: "inversion_strength", label: "Inversion", unit: "°C", group: "Upper Air"},
%{id: "inversion_base_m", label: "Inv. Base", unit: "m", group: "Upper Air"},
# Ducting
%{id: "ducting", label: "Ducting", unit: "", group: "Ducting"},
%{id: "duct_base_m", label: "Duct Base", unit: "m", group: "Ducting"},
%{id: "duct_strength", label: "Duct Strength", unit: "M", group: "Ducting"}
]
@impl true
@ -79,6 +91,14 @@ defmodule MicrowavepropWeb.WeatherMapLive do
{:noreply, socket}
end
@group_order ["Surface", "Upper Air", "Ducting"]
defp group_layers(layers) do
layers
|> Enum.group_by(& &1.group)
|> Enum.sort_by(fn {group, _} -> Enum.find_index(@group_order, &(&1 == group)) || 99 end)
end
@impl true
def render(assigns) do
~H"""
@ -121,19 +141,26 @@ defmodule MicrowavepropWeb.WeatherMapLive do
</div>
</div>
<%!-- Layer pill buttons --%>
<div class="flex flex-wrap gap-1">
<button
:for={layer <- @layers}
phx-click="select_layer"
phx-value-layer={layer.id}
class={[
"btn btn-xs rounded-full",
if(@selected_layer == layer.id, do: "btn-primary", else: "btn-ghost")
]}
>
{layer.label}
</button>
<%!-- Layer pill buttons grouped --%>
<div class="flex flex-col gap-1.5">
<div :for={{group, layers} <- group_layers(@layers)}>
<div class="text-[10px] font-semibold opacity-50 uppercase tracking-wider px-1 mb-0.5">
{group}
</div>
<div class="flex flex-wrap gap-1">
<button
:for={layer <- layers}
phx-click="select_layer"
phx-value-layer={layer.id}
class={[
"btn btn-xs rounded-full",
if(@selected_layer == layer.id, do: "btn-primary", else: "btn-ghost")
]}
>
{layer.label}
</button>
</div>
</div>
</div>
<%!-- Links --%>