Display type stats

This commit is contained in:
Claudio Ortolina
2024-10-14 22:33:05 +01:00
parent 7a0d017965
commit 2661c9f60d
3 changed files with 33 additions and 3 deletions
@@ -8,11 +8,16 @@ defmodule MusicLibraryWeb.StatsController do
Records.count_records_by_format()
|> Enum.sort_by(fn {_format, count} -> count end, :desc)
records_count_by_type =
Records.count_records_by_type()
|> Enum.sort_by(fn {_type, count} -> count end, :desc)
records_count = Enum.reduce(records_count_by_format, 0, fn {_, count}, acc -> acc + count end)
latest_record = Records.get_latest_record!()
render(conn, :index,
records_count_by_format: records_count_by_format,
records_count_by_type: records_count_by_type,
records_count: records_count,
latest_record: latest_record,
nav_section: :stats
@@ -54,3 +54,20 @@
</div>
</dl>
</div>
<div>
<dl class="mt-5 grid divide-y divide-gray-200 overflow-hidden rounded-lg bg-white shadow grid-cols-6 md:divide-x md:divide-y-0">
<div :for={{type, count} <- @records_count_by_type} class="px-4 py-5 sm:p-6">
<dt class="text-base max-sm:text-xs font-normal text-gray-900 break-keep">
<%= Record.type_long_label(type) %>
</dt>
<dd class="mt-1 flex items-baseline justify-between md:block lg:flex">
<div class="flex items-baseline text-2xl font-semibold">
<a href={~p"/records?query=type:#{type}"}>
<%= count %>
</a>
</div>
</dd>
</div>
</dl>
</div>
@@ -19,18 +19,26 @@ defmodule MusicLibraryWeb.StatsControllerTest do
describe "GET /" do
setup [:create_records]
test "it shows the record count (total and by format)", %{conn: conn, records: records} do
test "it shows the record counts (total, format, and type)", %{conn: conn, records: records} do
conn = get(conn, "/")
assert html_response(conn, 200) =~ records |> length() |> Integer.to_string()
response = html_response(conn, 200)
assert response =~ records |> length() |> Integer.to_string()
records
|> Enum.frequencies_by(& &1.format)
|> Enum.each(fn {format, count} ->
response = html_response(conn, 200)
assert response =~ "\n#{count}\n"
assert response =~ "\n#{Record.format_long_label(format)}\n"
end)
records
|> Enum.frequencies_by(& &1.type)
|> Enum.each(fn {type, count} ->
assert response =~ "\n#{count}\n"
assert response =~ "\n#{Record.type_long_label(type)}\n"
end)
end
test "it shows the latest record", %{conn: conn, records: records} do