Add the BookSearch component.
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-04-03 21:46:59 +03:00
parent 877bc63f9b
commit 73f69a72a5
3 changed files with 145 additions and 1 deletions
@@ -15,6 +15,14 @@ defmodule DecentralisedBookIndexWeb.BookLive.Index do
</:actions>
</.header>
<.book_search
search_query={@search_query}
search_mode={@search_mode}
search_mode_options={@search_mode_options}
select_options={@select_options}
selected_option={@sort_by}
/>
<.table
id="books"
rows={@streams.books}
@@ -94,7 +102,8 @@ defmodule DecentralisedBookIndexWeb.BookLive.Index do
@impl true
def mount(params, _session, socket) do
search_query = Map.get(params, "query", "")
sort_by = Map.get(params, "sort_by", "name") |> validate_sort_by()
sort_by = Map.get(params, "sort_by", "title") |> validate_sort_by()
search_mode = Map.get(params, "search_mode", "title") |> validate_search_mode()
page_params = AshPhoenix.LiveView.page_from_params(params, 10)
page = Metadata.search_book!(
@@ -111,6 +120,8 @@ defmodule DecentralisedBookIndexWeb.BookLive.Index do
)
|> assign(:sort_by, sort_by)
|> assign(:search_query, search_query)
|> assign(:search_mode, search_mode)
|> assign(:search_mode_options, search_mode_options())
|> assign(:select_options, sort_options())
|> assign(:page_params, page_params)
|> assign(:page, page)
@@ -176,4 +187,41 @@ defmodule DecentralisedBookIndexWeb.BookLive.Index do
List.first(valid_keys)
end
end
@impl true
def handle_event("change-sort", %{"sort_by" => sort_by}, socket) do
params =
socket.assigns.params
|> Map.put("sort_by", sort_by)
{:noreply, push_patch(socket, to: ~p"/books?#{params}")}
end
defp search_mode_options do
[
{"Search by title", "title"},
{"Search by isbn13", "isbn13"},
{"Search by isbn", "isbn"},
{"Search by asin", "asin"},
]
end
def validate_search_mode(key) do
valid_keys = Enum.map(sort_options(), &elem(&1, 1))
if key in valid_keys do
key
else
List.first(valid_keys)
end
end
@impl true
def handle_event("change-search-mode", %{"search_mode" => search_mode}, socket) do
params =
socket.assigns.params
|> Map.put("search_mode", search_mode)
{:noreply, push_patch(socket, to: ~p"/books?#{params}")}
end
end