diff --git a/lib/music_library/search.ex b/lib/music_library/search.ex
index c30563cd..3d96a883 100644
--- a/lib/music_library/search.ex
+++ b/lib/music_library/search.ex
@@ -11,7 +11,7 @@ defmodule MusicLibrary.Search do
import Ecto.Query, warn: false
alias MusicLibrary.Artists.ArtistInfo
- alias MusicLibrary.{Collection, Repo, Wishlist}
+ alias MusicLibrary.{Collection, RecordSets, Repo, Wishlist}
alias MusicLibrary.Records.ArtistRecord
@doc """
@@ -31,7 +31,8 @@ defmodule MusicLibrary.Search do
%{
collection: search_collection(query, limit),
wishlist: search_wishlist(query, limit),
- artists: search_artists(query, limit)
+ artists: search_artists(query, limit),
+ record_sets: search_record_sets(query, limit)
}
end
@@ -90,10 +91,18 @@ defmodule MusicLibrary.Search do
%{
collection_count: Collection.search_records_count(query),
wishlist_count: Wishlist.search_records_count(query),
- artists_count: search_artists_count(query)
+ artists_count: search_artists_count(query),
+ record_sets_count: RecordSets.count_record_sets(query)
}
end
+ @doc """
+ Searches record sets by name, description, and contained records.
+ """
+ def search_record_sets(query, limit \\ 5) do
+ RecordSets.search_record_sets(query, limit: limit)
+ end
+
@doc """
Gets the count of artists matching the search query.
"""
diff --git a/lib/music_library_web/components/search_components.ex b/lib/music_library_web/components/search_components.ex
index 4cdb83d8..282dc7c9 100644
--- a/lib/music_library_web/components/search_components.ex
+++ b/lib/music_library_web/components/search_components.ex
@@ -9,6 +9,7 @@ defmodule MusicLibraryWeb.SearchComponents do
import MusicLibraryWeb.ArtistComponents, only: [artist_image: 1]
alias MusicLibrary.Records.Record
+ alias MusicLibraryWeb.Markdown
@doc """
Renders a search result item for records.
@@ -102,6 +103,47 @@ defmodule MusicLibraryWeb.SearchComponents do
"""
end
+ @doc """
+ Renders a search result item for record sets.
+
+ ## Examples
+
+ <.search_result_record_set record_set={record_set} />
+ """
+ attr :record_set, :map, required: true
+ attr :rest, :global, include: ~w(phx-click phx-value-id)
+
+ def search_result_record_set(assigns) do
+ ~H"""
+
+
+
+ <.icon name="hero-queue-list" class="h-6 w-6 text-zinc-400 dark:text-zinc-500" />
+
+
+
+ {@record_set.name}
+
+
+ {render_description(@record_set.description)}
+
+
+
+
+ """
+ end
+
@doc """
Renders a search result group with a title and items.
@@ -249,4 +291,11 @@ defmodule MusicLibraryWeb.SearchComponents do
"""
end
+
+ defp render_description(description) do
+ description
+ |> String.slice(0, 100)
+ |> Markdown.to_html()
+ |> raw()
+ end
end
diff --git a/lib/music_library_web/live/universal_search_live/index.ex b/lib/music_library_web/live/universal_search_live/index.ex
index c98876df..900f942a 100644
--- a/lib/music_library_web/live/universal_search_live/index.ex
+++ b/lib/music_library_web/live/universal_search_live/index.ex
@@ -79,7 +79,8 @@ defmodule MusicLibraryWeb.UniversalSearchLive.Index do
total_results =
length(search_results.collection) +
length(search_results.wishlist) +
- length(search_results.artists)
+ length(search_results.artists) +
+ length(search_results.record_sets)
{:noreply,
socket
@@ -145,11 +146,32 @@ defmodule MusicLibraryWeb.UniversalSearchLive.Index do
|> push_navigate(to: ~p"/wishlist?query=#{query}")}
end
+ @impl true
+ def handle_event("navigate_to_record_set", %{"id" => id}, socket) do
+ {:noreply,
+ socket
+ |> assign(:show_modal, false)
+ |> push_navigate(to: ~p"/record-sets/#{id}")}
+ end
+
+ @impl true
+ def handle_event("navigate_to_record_sets", %{"query" => query}, socket) do
+ {:noreply,
+ socket
+ |> assign(:show_modal, false)
+ |> push_navigate(to: ~p"/record-sets?query=#{query}")}
+ end
+
defp reset(socket) do
socket
|> assign(:search_query, "")
- |> assign(:search_results, %{collection: [], wishlist: [], artists: []})
- |> assign(:search_counts, %{collection_count: 0, wishlist_count: 0, artists_count: 0})
+ |> assign(:search_results, %{collection: [], wishlist: [], artists: [], record_sets: []})
+ |> assign(:search_counts, %{
+ collection_count: 0,
+ wishlist_count: 0,
+ artists_count: 0,
+ record_sets_count: 0
+ })
|> assign(:total_results, 0)
end
end
diff --git a/lib/music_library_web/live/universal_search_live/index.html.heex b/lib/music_library_web/live/universal_search_live/index.html.heex
index 61cb0882..a450f133 100644
--- a/lib/music_library_web/live/universal_search_live/index.html.heex
+++ b/lib/music_library_web/live/universal_search_live/index.html.heex
@@ -96,6 +96,30 @@
/>
+ <.search_result_group
+ :if={length(@search_results.record_sets) > 0}
+ title="Record Sets"
+ count={length(@search_results.record_sets)}
+ total_count={@search_counts.record_sets_count}
+ >
+ <.search_result_record_set
+ :for={record_set <- @search_results.record_sets}
+ record_set={record_set}
+ phx-click="navigate_to_record_set"
+ phx-value-id={record_set.id}
+ phx-target={@myself}
+ />
+ <:actions>
+ <.view_all_button
+ :if={@search_counts.record_sets_count > length(@search_results.record_sets)}
+ count={@search_counts.record_sets_count}
+ target="record set"
+ phx-click="navigate_to_record_sets"
+ phx-value-query={@search_query}
+ phx-target={@myself}
+ />
+
+
<.results_footer total_results={@total_results} />