From 6339196b17274dae7eee730bd90e0fe9dcb45d76 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 26 Nov 2024 13:35:15 +0000 Subject: [PATCH] Search by genre Can also click on genres in detail views. --- lib/music_library/records.ex | 4 +++ lib/music_library/records/search_parser.ex | 10 ++++++- .../live/collection_live/show.html.heex | 8 ++++- .../live/wishlist_live/show.html.heex | 8 ++++- priv/gettext/default.pot | 30 +++++++++---------- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index 2f6a6b54..162c0b17 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -64,6 +64,10 @@ defmodule MusicLibrary.Records do search |> where(fragment("records_search_index match 'title : ?*'", literal(^album))) + {:genre, genre}, search -> + search + |> where(fragment("records_search_index match 'genres : ?*'", literal(^genre))) + {:mbid, mbid}, search -> search |> where(fragment("records_search_index = '?*'", literal(^mbid))) diff --git a/lib/music_library/records/search_parser.ex b/lib/music_library/records/search_parser.ex index 67c8df36..b8cde5d0 100644 --- a/lib/music_library/records/search_parser.ex +++ b/lib/music_library/records/search_parser.ex @@ -28,6 +28,9 @@ defmodule MusicLibrary.Records.SearchParser do mbid_filter = ignore(string("mbid:")) mbid = concat(mbid_filter, query) |> tag(:mbid) + genre_filter = ignore(string("genre:")) + genre = concat(genre_filter, query) |> tag(:genre) + format_filter = ignore(string("format:")) formats = @@ -56,7 +59,7 @@ defmodule MusicLibrary.Records.SearchParser do choice([concat(type_filter, types), ignore(invalid_type)]) |> tag(:type) - search = repeat(choice([artist, album, mbid, space, format, type, query])) + search = repeat(choice([artist, album, mbid, genre, space, format, type, query])) defparsecp(:search_parser, search) @@ -75,6 +78,8 @@ defmodule MusicLibrary.Records.SearchParser do {:ok, %{artist: "the pineapple thief", query: "wilderness"}} iex> MusicLibrary.Records.SearchParser.parse(~s(artist:"the pineapple thief" format:cd)) {:ok, %{artist: "the pineapple thief", format: :cd}} + iex> MusicLibrary.Records.SearchParser.parse(~s(genre:"psychedelic rock")) + {:ok, %{genre: "psychedelic rock"}} iex> MusicLibrary.Records.SearchParser.parse("format:vin") {:ok, %{query: ""}} iex> MusicLibrary.Records.SearchParser.parse("type:alb") @@ -111,6 +116,9 @@ defmodule MusicLibrary.Records.SearchParser do {:mbid, [{:query, [value]}]}, acc -> Map.put(acc, :mbid, value) + {:genre, [{:query, [value]}]}, acc -> + Map.put(acc, :genre, value) + {:format, [value]}, acc -> Map.put(acc, :format, value) diff --git a/lib/music_library_web/live/collection_live/show.html.heex b/lib/music_library_web/live/collection_live/show.html.heex index 013db75a..f5db27c5 100644 --- a/lib/music_library_web/live/collection_live/show.html.heex +++ b/lib/music_library_web/live/collection_live/show.html.heex @@ -77,7 +77,13 @@ <%= gettext("Genres") %>
- <%= Enum.join(@record.genres, ", ") %> + <.link + :for={genre <- @record.genres} + class="mr-2 text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" + patch={~p"/collection?#{%{query: ~s(genre:"#{genre}")}}"} + > + <%= genre %> +
diff --git a/lib/music_library_web/live/wishlist_live/show.html.heex b/lib/music_library_web/live/wishlist_live/show.html.heex index 2be6d9b6..6ee3ff19 100644 --- a/lib/music_library_web/live/wishlist_live/show.html.heex +++ b/lib/music_library_web/live/wishlist_live/show.html.heex @@ -78,7 +78,13 @@ <%= gettext("Genres") %>
- <%= Enum.join(@record.genres, ", ") %> + <.link + :for={genre <- @record.genres} + class="mr-2 text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" + patch={~p"/wishlist?#{%{query: ~s(genre:"#{genre}")}}"} + > + <%= genre %> +
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 974242a3..35c028bf 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -29,12 +29,12 @@ msgstr "" msgid "Attempting to reconnect" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:155 +#: lib/music_library_web/live/collection_live/show.html.heex:161 #, elixir-autogen, elixir-format msgid "Back to records" msgstr "" -#: lib/music_library_web/live/wishlist_live/show.html.heex:148 +#: lib/music_library_web/live/wishlist_live/show.html.heex:154 #, elixir-autogen, elixir-format msgid "Back to wishlist" msgstr "" @@ -128,8 +128,8 @@ msgstr "" msgid "Import from MusicBrainz" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:130 -#: lib/music_library_web/live/wishlist_live/show.html.heex:123 +#: lib/music_library_web/live/collection_live/show.html.heex:136 +#: lib/music_library_web/live/wishlist_live/show.html.heex:129 #, elixir-autogen, elixir-format msgid "Inserted at" msgstr "" @@ -154,9 +154,9 @@ msgstr "" msgid "Logout" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:85 +#: lib/music_library_web/live/collection_live/show.html.heex:91 #: lib/music_library_web/live/record_live/form_component.ex:47 -#: lib/music_library_web/live/wishlist_live/show.html.heex:86 +#: lib/music_library_web/live/wishlist_live/show.html.heex:92 #, elixir-autogen, elixir-format msgid "MusicBrainz ID" msgstr "" @@ -204,7 +204,7 @@ msgstr "" msgid "Purchased at" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:107 +#: lib/music_library_web/live/collection_live/show.html.heex:113 #, elixir-autogen, elixir-format msgid "Purchased on" msgstr "" @@ -311,8 +311,8 @@ msgstr "" msgid "Types" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:138 -#: lib/music_library_web/live/wishlist_live/show.html.heex:131 +#: lib/music_library_web/live/collection_live/show.html.heex:144 +#: lib/music_library_web/live/wishlist_live/show.html.heex:137 #, elixir-autogen, elixir-format msgid "Updated at" msgstr "" @@ -350,14 +350,14 @@ msgstr "" msgid "close" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:95 -#: lib/music_library_web/live/wishlist_live/show.html.heex:96 +#: lib/music_library_web/live/collection_live/show.html.heex:101 +#: lib/music_library_web/live/wishlist_live/show.html.heex:102 #, elixir-autogen, elixir-format msgid "Copy MusicBrainz ID to clipboard" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:149 -#: lib/music_library_web/live/wishlist_live/show.html.heex:142 +#: lib/music_library_web/live/collection_live/show.html.heex:155 +#: lib/music_library_web/live/wishlist_live/show.html.heex:148 #, elixir-autogen, elixir-format msgid "MusicBrainz data" msgstr "" @@ -391,8 +391,8 @@ msgstr "" msgid "Number of included records" msgstr "" -#: lib/music_library_web/live/collection_live/show.html.heex:118 -#: lib/music_library_web/live/wishlist_live/show.html.heex:111 +#: lib/music_library_web/live/collection_live/show.html.heex:124 +#: lib/music_library_web/live/wishlist_live/show.html.heex:117 #, elixir-autogen, elixir-format msgid "Includes" msgstr ""