feat: add total spot count and per-band breakdown to /pskreporter header

This commit is contained in:
Graham McInitre 2026-07-15 14:32:55 -05:00
parent 51dda456aa
commit 3297147c31
2 changed files with 42 additions and 6 deletions

View file

@ -18,7 +18,9 @@ defmodule MicrowavepropWeb.PskrSpotsLive do
assign(socket,
page_title: "PSK Reporter Spots",
limit: @limit,
spots: spots
spots: spots,
total_spots: fetch_total_spots(),
band_counts: fetch_band_counts()
)}
end
@ -29,6 +31,20 @@ defmodule MicrowavepropWeb.PskrSpotsLive do
|> Repo.all()
end
defp fetch_total_spots do
Repo.one(from(s in SpotHourly, select: coalesce(sum(s.spot_count), 0)))
end
defp fetch_band_counts do
Repo.all(
from(s in SpotHourly,
group_by: s.band,
select: {s.band, sum(s.spot_count)},
order_by: [desc: sum(s.spot_count)]
)
)
end
defp fmt_dt(nil), do: ""
defp fmt_dt(dt), do: Calendar.strftime(dt, "%Y-%m-%d %H:%M UTC")
@ -47,6 +63,16 @@ defmodule MicrowavepropWeb.PskrSpotsLive do
<:subtitle>Last {@limit} spot aggregates from the MQTT firehose</:subtitle>
</.header>
<div class="flex flex-wrap items-baseline gap-x-6 gap-y-1 text-sm mb-4">
<span class="font-semibold">
Total spots stored: <span class="font-mono">{Format.number(@total_spots)}</span>
</span>
<span :for={{band, count} <- @band_counts} class="text-base-content/70">
<span class="badge badge-sm mr-1">{band}</span>
<span class="font-mono">{Format.number(count)}</span>
</span>
</div>
<div class="overflow-x-auto">
<table class="table table-sm table-zebra whitespace-nowrap">
<thead>

View file

@ -69,17 +69,27 @@ defmodule MicrowavepropWeb.PskrSpotsLiveTest do
{:ok, _lv, html} = live(conn, ~p"/pskreporter")
assert html =~ "No PSK Reporter spots received yet"
end
test "shows total spots count of zero when empty", %{conn: conn} do
{:ok, _lv, html} = live(conn, ~p"/pskreporter")
assert html =~ "Total spots stored:"
assert html =~ "0"
end
end
describe "with spots in the database" do
test "displays spot grid and count data in table", %{conn: conn} do
insert_spot(%{sender_grid: "EM12KL", receiver_grid: "DM43ST", spot_count: 42})
test "displays total spots count and per-band counts", %{conn: conn} do
insert_spot(%{band: "2m", spot_count: 42})
insert_spot(%{band: "70cm", spot_count: 7})
{:ok, _lv, html} = live(conn, ~p"/pskreporter")
assert html =~ "EM12KL"
assert html =~ "DM43ST"
assert html =~ "42"
assert html =~ "Total spots stored:"
# 42 + 7 = 49 total
assert html =~ "49"
# Band badges show per-band counts
assert html =~ "2m"
assert html =~ "70cm"
end
test "displays band as badge", %{conn: conn} do