This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user