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")} {gettext("Previous")}