Add Top 20 Release Years widget

This commit is contained in:
Claudio Ortolina
2026-03-21 09:02:25 +00:00
parent 55aa7aa9d3
commit 5a27fc46ac
5 changed files with 120 additions and 1 deletions
+17
View File
@@ -161,6 +161,23 @@ defmodule MusicLibrary.Collection do
Repo.all(q)
end
@spec count_records_by_release_year(keyword()) :: [{String.t(), non_neg_integer()}]
def count_records_by_release_year(opts \\ []) do
limit = Keyword.get(opts, :limit, @pagination[:stats_limit])
q =
from r in Record,
where: not is_nil(r.purchased_at),
where: not is_nil(r.release_date),
where: r.release_date != "",
group_by: fragment("substr(?, 1, 4)", r.release_date),
order_by: [desc: fragment("count(1)")],
select: {fragment("substr(?, 1, 4)", r.release_date), fragment("count(1)")},
limit: ^limit
Repo.all(q)
end
@spec collected_releases_query() :: Ecto.Query.t()
def collected_releases_query do
from rr in RecordRelease,
+20 -1
View File
@@ -292,7 +292,7 @@ defmodule MusicLibraryWeb.StatsLive.Index do
</.tabs>
</div>
<div class="mt-5 grid grid-cols-1 gap-5 lg:grid-cols-2">
<div class="mt-5 grid grid-cols-1 gap-5 lg:grid-cols-3">
<div>
<h1 class="text-base font-semibold text-zinc-900 lg:text-2xl dark:text-zinc-200">
{gettext("Top %{n} Collection Artists", %{n: length(@records_by_artist)})}
@@ -336,6 +336,23 @@ defmodule MusicLibraryWeb.StatsLive.Index do
/>
</div>
</div>
<div>
<h1 class="text-base font-semibold text-zinc-900 lg:text-2xl dark:text-zinc-200">
{gettext("Top 20 Release Years")}
</h1>
<div class="mt-5 rounded-md bg-white shadow-sm dark:bg-zinc-800">
<.vertical_bar_chart
data={@records_by_release_year}
width={600}
height={26 * length(@records_by_release_year)}
color_class="fill-red-500"
label_fn={fn {year, _count} -> year end}
value_fn={fn {_year, count} -> count end}
class="w-full"
/>
</div>
</div>
</div>
</Layouts.app>
"""
@@ -347,6 +364,7 @@ defmodule MusicLibraryWeb.StatsLive.Index do
latest_record = Collection.get_latest_record()
records_by_artists = Collection.count_records_by_artist(limit: 20)
records_by_genre = Collection.count_records_by_genre(limit: 20)
records_by_release_year = Collection.count_records_by_release_year(limit: 20)
records_on_this_day =
current_date
@@ -375,6 +393,7 @@ defmodule MusicLibraryWeb.StatsLive.Index do
current_section: :stats,
records_by_artist: records_by_artists,
records_by_genre: records_by_genre,
records_by_release_year: records_by_release_year,
records_on_this_day: records_on_this_day
)}
end