Skip to content

Commit

Permalink
Refactor search_state
Browse files Browse the repository at this point in the history
  • Loading branch information
eliotjordan committed Oct 24, 2024
1 parent c521683 commit 36c66f6
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 33 deletions.
14 changes: 7 additions & 7 deletions lib/dpul_collections/solr.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ defmodule DpulCollections.Solr do
end

@spec query(map()) :: map()
def query(params) do
def query(search_state) do
solr_params = [
q: query_param(params),
q: query_param(search_state),
"q.op": "AND",
sort: sort_param(params),
rows: params[:per_page],
start: pagination_offset(params)
sort: sort_param(search_state),
rows: search_state[:per_page],
start: pagination_offset(search_state)
]

{:ok, response} =
Expand All @@ -29,8 +29,8 @@ defmodule DpulCollections.Solr do
response.body["response"]
end

defp query_param(params) do
Enum.reject([params[:q], date_query(params)], &is_nil(&1))
defp query_param(search_state) do
Enum.reject([search_state[:q], date_query(search_state)], &is_nil(&1))
|> Enum.join(" ")
end

Expand Down
61 changes: 35 additions & 26 deletions lib/dpul_collections_web/live/search_live.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,33 @@ defmodule DpulCollectionsWeb.SearchLive do
defstruct [:id, :title, :date]
end

defmodule SearchState do
def from_params(params) do
%{
q: params["q"],
sort_by: valid_sort_by(params),
page: (params["page"] || "1") |> String.to_integer(),
per_page: (params["per_page"] || "10") |> String.to_integer(),
date_from: params["date_from"] || nil,
date_to: params["date_to"] || nil
}
end

defp valid_sort_by(%{"sort_by" => sort_by})
when sort_by in ["relevance", "date_desc", "date_asc"] do
String.to_existing_atom(sort_by)
end

defp valid_sort_by(_), do: :relevance
end

def mount(_params, _session, socket) do
{:ok, socket}
end

def handle_params(params, _uri, socket) do
filters = %{
q: params["q"],
sort_by: valid_sort_by(params),
page: (params["page"] || "1") |> String.to_integer(),
per_page: (params["per_page"] || "10") |> String.to_integer(),
date_from: params["date_from"] || nil,
date_to: params["date_to"] || nil
}

solr_response = Solr.query(filters)
search_state = SearchState.from_params(params)
solr_response = Solr.query(search_state)

items =
solr_response["docs"]
Expand All @@ -31,7 +43,7 @@ defmodule DpulCollectionsWeb.SearchLive do

socket =
assign(socket,
filters: filters,
search_state: search_state,
items: items,
total_items: solr_response["numFound"]
)
Expand All @@ -44,7 +56,7 @@ defmodule DpulCollectionsWeb.SearchLive do
<div class="my-5 grid grid-flow-row auto-rows-max gap-10">
<form id="search-form" phx-submit="search">
<div class="grid grid-cols-4">
<input class="col-span-3" type="text" name="q" value={@filters.q} />
<input class="col-span-3" type="text" name="q" value={@search_state.q} />
<button class="col-span-1 font-bold uppercase" type="submit">
Search
</button>
Expand All @@ -58,15 +70,15 @@ defmodule DpulCollectionsWeb.SearchLive do
placeholder="From"
form="search-form"
name="date-from"
value={@filters.date_from}
value={@search_state.date_from}
/>
<input
class="col-span-1"
type="text"
placeholder="To"
form="search-form"
name="date-to"
value={@filters.date_to}
value={@search_state.date_to}
/>
</div>
<form id="sort-form" phx-change="sort">
Expand All @@ -77,7 +89,7 @@ defmodule DpulCollectionsWeb.SearchLive do
<select class="col-span-1" name="sort-by">
<%= Phoenix.HTML.Form.options_for_select(
["relevance", "date desc": "date_desc", "date asc": "date_asc"],
@filters.sort_by
@search_state.sort_by
) %>
</select>
</div>
Expand All @@ -87,7 +99,11 @@ defmodule DpulCollectionsWeb.SearchLive do
<.search_item :for={item <- @items} item={item} />
</div>
<div class="text-center bg-white max-w-5xl mx-auto text-lg py-8">
<.paginator page={@filters.page} per_page={@filters.per_page} total_items={@total_items} />
<.paginator
page={@search_state.page}
per_page={@search_state.per_page}
total_items={@total_items}
/>
</div>
"""
end
Expand Down Expand Up @@ -133,7 +149,7 @@ defmodule DpulCollectionsWeb.SearchLive do
def handle_event("search", params, socket) do
params =
%{
socket.assigns.filters
socket.assigns.search_state
| q: params["q"],
date_to: params["date-to"],
date_from: params["date-from"]
Expand All @@ -146,15 +162,15 @@ defmodule DpulCollectionsWeb.SearchLive do

def handle_event("sort", params, socket) do
params =
%{socket.assigns.filters | sort_by: params["sort-by"]}
%{socket.assigns.search_state | sort_by: params["sort-by"]}
|> Helpers.clean_params()

socket = push_patch(socket, to: ~p"/search?#{params}")
{:noreply, socket}
end

def handle_event("paginate", %{"page" => page}, socket) when page != "..." do
params = %{socket.assigns.filters | page: page} |> Helpers.clean_params()
params = %{socket.assigns.search_state | page: page} |> Helpers.clean_params()
socket = push_patch(socket, to: ~p"/search?#{params}")
{:noreply, socket}
end
Expand All @@ -163,13 +179,6 @@ defmodule DpulCollectionsWeb.SearchLive do
{:noreply, socket}
end

defp valid_sort_by(%{"sort_by" => sort_by})
when sort_by in ["relevance", "date_desc", "date_asc"] do
String.to_existing_atom(sort_by)
end

defp valid_sort_by(_), do: :relevance

defp more_pages?(page, per_page, total_items) do
page * per_page < total_items
end
Expand Down

0 comments on commit 36c66f6

Please sign in to comment.