refactor: split long sort handler into smaller functions
Extract determine_new_sort/2, update_sort_components/4, and push_sort_url/3
from handle_info({:sort, ...}). Reduces function from 46 to 7 lines.
This commit is contained in:
parent
150bba2ef8
commit
c416d0fb91
1 changed files with 53 additions and 43 deletions
|
|
@ -109,50 +109,11 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:sort, field_str}, socket) do
|
def handle_info({:sort, field_str}, socket) do
|
||||||
field = String.to_existing_atom(field_str)
|
field = String.to_existing_atom(field_str)
|
||||||
old_field = socket.assigns.sort_field
|
{new_field, new_order} = determine_new_sort(field, socket)
|
||||||
|
|
||||||
{new_order, new_field} =
|
socket
|
||||||
if socket.assigns.sort_field == field do
|
|> update_sort_components(socket.assigns.sort_field, new_field, new_order)
|
||||||
{toggle_order(socket.assigns.sort_order), field}
|
|> push_sort_url(new_field, new_order)
|
||||||
else
|
|
||||||
{:asc, field}
|
|
||||||
end
|
|
||||||
|
|
||||||
active_id = :"sort_#{new_field}"
|
|
||||||
old_id = :"sort_#{old_field}"
|
|
||||||
|
|
||||||
# Update the new SortHeader
|
|
||||||
send_update(MvWeb.Components.SortHeaderComponent,
|
|
||||||
id: active_id,
|
|
||||||
sort_field: new_field,
|
|
||||||
sort_order: new_order
|
|
||||||
)
|
|
||||||
|
|
||||||
# Reset the current SortHeader
|
|
||||||
send_update(MvWeb.Components.SortHeaderComponent,
|
|
||||||
id: old_id,
|
|
||||||
sort_field: new_field,
|
|
||||||
sort_order: new_order
|
|
||||||
)
|
|
||||||
|
|
||||||
existing_search_query = socket.assigns.query
|
|
||||||
|
|
||||||
# Build the URL with queries
|
|
||||||
query_params = %{
|
|
||||||
"query" => existing_search_query,
|
|
||||||
"sort_field" => Atom.to_string(new_field),
|
|
||||||
"sort_order" => Atom.to_string(new_order)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set the new path with params
|
|
||||||
new_path = ~p"/members?#{query_params}"
|
|
||||||
|
|
||||||
# Push the new URL
|
|
||||||
{:noreply,
|
|
||||||
push_patch(socket,
|
|
||||||
to: new_path,
|
|
||||||
replace: true
|
|
||||||
)}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
|
@ -204,6 +165,55 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
# -------------------------------------------------------------
|
# -------------------------------------------------------------
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
# -------------------------------------------------------------
|
# -------------------------------------------------------------
|
||||||
|
|
||||||
|
# Determines new sort field and order based on current state
|
||||||
|
defp determine_new_sort(field, socket) do
|
||||||
|
if socket.assigns.sort_field == field do
|
||||||
|
{field, toggle_order(socket.assigns.sort_order)}
|
||||||
|
else
|
||||||
|
{field, :asc}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Updates both the active and old SortHeader components
|
||||||
|
defp update_sort_components(socket, old_field, new_field, new_order) do
|
||||||
|
active_id = :"sort_#{new_field}"
|
||||||
|
old_id = :"sort_#{old_field}"
|
||||||
|
|
||||||
|
# Update the new SortHeader
|
||||||
|
send_update(MvWeb.Components.SortHeaderComponent,
|
||||||
|
id: active_id,
|
||||||
|
sort_field: new_field,
|
||||||
|
sort_order: new_order
|
||||||
|
)
|
||||||
|
|
||||||
|
# Reset the current SortHeader
|
||||||
|
send_update(MvWeb.Components.SortHeaderComponent,
|
||||||
|
id: old_id,
|
||||||
|
sort_field: new_field,
|
||||||
|
sort_order: new_order
|
||||||
|
)
|
||||||
|
|
||||||
|
socket
|
||||||
|
end
|
||||||
|
|
||||||
|
# Builds sort URL and pushes navigation patch
|
||||||
|
defp push_sort_url(socket, field, order) do
|
||||||
|
query_params = %{
|
||||||
|
"query" => socket.assigns.query,
|
||||||
|
"sort_field" => Atom.to_string(field),
|
||||||
|
"sort_order" => Atom.to_string(order)
|
||||||
|
}
|
||||||
|
|
||||||
|
new_path = ~p"/members?#{query_params}"
|
||||||
|
|
||||||
|
{:noreply,
|
||||||
|
push_patch(socket,
|
||||||
|
to: new_path,
|
||||||
|
replace: true
|
||||||
|
)}
|
||||||
|
end
|
||||||
|
|
||||||
# Load members eg based on a query for sorting
|
# Load members eg based on a query for sorting
|
||||||
defp load_members(socket, search_query) do
|
defp load_members(socket, search_query) do
|
||||||
query =
|
query =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue