diff --git a/lib/music_library/collection.ex b/lib/music_library/collection.ex
index 02ec4756..c9478187 100644
--- a/lib/music_library/collection.ex
+++ b/lib/music_library/collection.ex
@@ -8,8 +8,9 @@ defmodule MusicLibrary.Collection do
def search_records(query, opts \\ []) do
limit = Keyword.get(opts, :limit, 20)
offset = Keyword.get(opts, :offset, 0)
+ order = Keyword.get(opts, :order, :alphabetical)
- Records.search_records(base_search(), query, limit: limit, offset: offset)
+ Records.search_records(base_search(), query, limit: limit, offset: offset, order: order)
end
def search_records_count(query) do
diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex
index 42a15206..ed322ff2 100644
--- a/lib/music_library/records.ex
+++ b/lib/music_library/records.ex
@@ -28,10 +28,11 @@ defmodule MusicLibrary.Records do
def search_records(initial_search, query, opts) do
limit = Keyword.fetch!(opts, :limit)
offset = Keyword.fetch!(opts, :offset)
+ order = Keyword.fetch!(opts, :order)
search =
initial_search
- |> build_search(query)
+ |> build_search(query, order)
|> limit(^limit)
|> offset(^offset)
|> select(^essential_fields())
@@ -45,16 +46,23 @@ defmodule MusicLibrary.Records do
Repo.aggregate(search, :count)
end
- defp build_search(initial_search, query) do
+ defp build_search(initial_search, query, order \\ :alphabetical) do
{:ok, parsed_query} = SearchParser.parse(query)
search_with_order =
- initial_search
- |> order_by(
- fragment(
- "unaccent(json_extract(artists, '$[0].sort_name')) COLLATE NOCASE ASC, unaccent(title) COLLATE NOCASE ASC"
- )
- )
+ case order do
+ :alphabetical ->
+ initial_search
+ |> order_by(
+ fragment(
+ "unaccent(json_extract(artists, '$[0].sort_name')) COLLATE NOCASE ASC, unaccent(title) COLLATE NOCASE ASC"
+ )
+ )
+
+ :purchase ->
+ initial_search
+ |> order_by([r], {:desc, r.purchased_at})
+ end
Enum.reduce(parsed_query, search_with_order, fn
{:artist, artist}, search ->
diff --git a/lib/music_library/wishlist.ex b/lib/music_library/wishlist.ex
index 22281883..72512853 100644
--- a/lib/music_library/wishlist.ex
+++ b/lib/music_library/wishlist.ex
@@ -8,8 +8,9 @@ defmodule MusicLibrary.Wishlist do
def search_records(query, opts \\ []) do
limit = Keyword.get(opts, :limit, 20)
offset = Keyword.get(opts, :offset, 0)
+ order = Keyword.get(opts, :order, :alphabetical)
- Records.search_records(base_search(), query, limit: limit, offset: offset)
+ Records.search_records(base_search(), query, limit: limit, offset: offset, order: order)
end
def search_records_count(query) do
diff --git a/lib/music_library_web/components/pagination.ex b/lib/music_library_web/components/pagination.ex
index 962edbd1..f6283dfd 100644
--- a/lib/music_library_web/components/pagination.ex
+++ b/lib/music_library_web/components/pagination.ex
@@ -25,7 +25,7 @@ defmodule MusicLibraryWeb.Pagination do
]}>
<.link
:if={@page_links.prev_page}
- patch={"?" <> encode_query(page: @page_links.prev_page, page_size: @pagination_params.page_size, query: @pagination_params.query)}
+ patch={"?" <> encode_query(page: @page_links.prev_page, page_size: @pagination_params.page_size, query: @pagination_params.query, order: @pagination_params.order)}
phx-click={JS.dispatch("music_library:scroll_top")}
class={[
"relative inline-flex items-center rounded-md border",
@@ -39,7 +39,7 @@ defmodule MusicLibraryWeb.Pagination do
<.link
:if={@page_links.next_page}
- patch={"?" <> encode_query(page: @page_links.next_page, page_size: @pagination_params.page_size, query: @pagination_params.query)}
+ patch={"?" <> encode_query(page: @page_links.next_page, page_size: @pagination_params.page_size, query: @pagination_params.query, order: @pagination_params.order)}
phx-click={JS.dispatch("music_library:scroll_top")}
class={[
"relative ml-3 inline-flex items-center rounded-md border",
@@ -60,12 +60,14 @@ defmodule MusicLibraryWeb.Pagination do
page_number={@page_links.prev_page}
page_size={@pagination_params.page_size}
query={@pagination_params.query}
+ order={@pagination_params.order}
/>
<.numbered_link
:for={page_number <- @page_links.visible_left_pages}
page_number={page_number}
page_size={@pagination_params.page_size}
query={@pagination_params.query}
+ order={@pagination_params.order}
/>
<.separator :if={@page_links.left_separator} />
<.numbered_link
@@ -74,6 +76,7 @@ defmodule MusicLibraryWeb.Pagination do
active={page_number == @pagination_params.page}
page_size={@pagination_params.page_size}
query={@pagination_params.query}
+ order={@pagination_params.order}
/>
<.separator :if={@page_links.right_separator} />
<.numbered_link
@@ -81,12 +84,14 @@ defmodule MusicLibraryWeb.Pagination do
page_number={page_number}
page_size={@pagination_params.page_size}
query={@pagination_params.query}
+ order={@pagination_params.order}
/>
<.next_link
:if={@page_links.next_page}
page_number={@page_links.next_page}
page_size={@pagination_params.page_size}
query={@pagination_params.query}
+ order={@pagination_params.order}
/>
@@ -102,6 +107,7 @@ defmodule MusicLibraryWeb.Pagination do
attr :page_number, :integer, required: true
attr :page_size, :integer, required: true
attr :query, :string, required: true
+ attr :order, :atom, required: true
defp next_link(assigns) do
~H"""
@@ -111,7 +117,7 @@ defmodule MusicLibraryWeb.Pagination do
"text-zinc-400 ring-1 ring-inset ring-zinc-300 hover:bg-zinc-50 focus:z-20 focus:outline-offset-0"
]}
phx-click={JS.dispatch("music_library:scroll_top")}
- patch={"?" <> encode_query(page: @page_number, page_size: @page_size, query: @query)}
+ patch={"?" <> encode_query(page: @page_number, page_size: @page_size, query: @query, order: @order)}
>
{gettext("Next")}