format and linting: reduced complexity of function
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
bb362e1636
commit
8104451d35
2 changed files with 44 additions and 40 deletions
|
|
@ -237,40 +237,8 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
|
|
||||||
# Function to maybe update the sort
|
# Function to maybe update the sort
|
||||||
defp maybe_update_sort(socket, %{"sort_field" => sf, "sort_order" => so}) do
|
defp maybe_update_sort(socket, %{"sort_field" => sf, "sort_order" => so}) do
|
||||||
# Handle empty strings and nil values
|
field = determine_field(socket.assigns.sort_field, sf)
|
||||||
field =
|
order = determine_order(socket.assigns.sort_order, so)
|
||||||
case sf do
|
|
||||||
"" ->
|
|
||||||
socket.assigns.sort_field
|
|
||||||
|
|
||||||
nil ->
|
|
||||||
socket.assigns.sort_field
|
|
||||||
|
|
||||||
sf when is_binary(sf) ->
|
|
||||||
try do
|
|
||||||
String.to_existing_atom(sf)
|
|
||||||
rescue
|
|
||||||
ArgumentError -> socket.assigns.sort_field
|
|
||||||
end
|
|
||||||
|
|
||||||
sf when is_atom(sf) ->
|
|
||||||
sf
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
socket.assigns.sort_field
|
|
||||||
end
|
|
||||||
|
|
||||||
# Validate that the field is actually sortable
|
|
||||||
field = if valid_sort_field?(field), do: field, else: socket.assigns.sort_field
|
|
||||||
|
|
||||||
# Handle empty strings and nil values for sort order
|
|
||||||
order =
|
|
||||||
case so do
|
|
||||||
"" -> socket.assigns.sort_order
|
|
||||||
nil -> socket.assigns.sort_order
|
|
||||||
so when so in ["asc", "desc"] -> String.to_atom(so)
|
|
||||||
_ -> socket.assigns.sort_order
|
|
||||||
end
|
|
||||||
|
|
||||||
socket
|
socket
|
||||||
|> assign(:sort_field, field)
|
|> assign(:sort_field, field)
|
||||||
|
|
@ -279,6 +247,42 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
|
|
||||||
defp maybe_update_sort(socket, _), do: socket
|
defp maybe_update_sort(socket, _), do: socket
|
||||||
|
|
||||||
|
defp determine_field(default, sf) do
|
||||||
|
case sf do
|
||||||
|
"" ->
|
||||||
|
default
|
||||||
|
|
||||||
|
nil ->
|
||||||
|
default
|
||||||
|
|
||||||
|
sf when is_binary(sf) ->
|
||||||
|
sf
|
||||||
|
|> String.to_existing_atom()
|
||||||
|
|> handle_atom_conversion(default)
|
||||||
|
|
||||||
|
sf when is_atom(sf) ->
|
||||||
|
handle_atom_conversion(sf, default)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
default
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp handle_atom_conversion(val, default) when is_atom(val) do
|
||||||
|
if valid_sort_field?(val), do: val, else: default
|
||||||
|
end
|
||||||
|
|
||||||
|
defp handle_atom_conversion(_, default), do: default
|
||||||
|
|
||||||
|
defp determine_order(default, so) do
|
||||||
|
case so do
|
||||||
|
"" -> default
|
||||||
|
nil -> default
|
||||||
|
so when so in ["asc", "desc"] -> String.to_atom(so)
|
||||||
|
_ -> default
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Function to update search parameters
|
# Function to update search parameters
|
||||||
defp maybe_update_search(socket, %{"query" => query}) when query != "" do
|
defp maybe_update_search(socket, %{"query" => query}) when query != "" do
|
||||||
assign(socket, :query, query)
|
assign(socket, :query, query)
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
|
||||||
describe "sort icons" do
|
describe "sort icons" do
|
||||||
test "shows neutral icon for specific field when not sorted", %{conn: conn} do
|
test "shows neutral icon for specific field when not sorted", %{conn: conn} do
|
||||||
conn = conn_with_oidc_user(conn)
|
conn = conn_with_oidc_user(conn)
|
||||||
{:ok, view, html} = live(conn, "/members")
|
{:ok, view, _html} = live(conn, "/members")
|
||||||
|
|
||||||
# The neutral icon has the opcity class we can test for
|
# The neutral icon has the opcity class we can test for
|
||||||
# Test that EMAIL field specifically shows neutral icon
|
# Test that EMAIL field specifically shows neutral icon
|
||||||
|
|
@ -68,23 +68,23 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
|
||||||
# Test that OTHER fields still show neutral icons
|
# Test that OTHER fields still show neutral icons
|
||||||
assert has_element?(view, "[data-testid='first_name'] .opacity-40")
|
assert has_element?(view, "[data-testid='first_name'] .opacity-40")
|
||||||
|
|
||||||
# Test HTML content - should contain chevron-up AND chevron-up-down
|
# Test HTML content - should contain chevronup AND chevron up down
|
||||||
assert html =~ "hero-chevron-up"
|
assert html =~ "hero-chevron-up"
|
||||||
assert html =~ "hero-chevron-up-down"
|
assert html =~ "hero-chevron-up-down"
|
||||||
|
|
||||||
# Count occurrences to ensure only one ascending icon
|
# Count occurrences to ensure only one ascending icon
|
||||||
up_count = html |> String.split("hero-chevron-up ") |> length() |> Kernel.-(1)
|
up_count = html |> String.split("hero-chevron-up ") |> length() |> Kernel.-(1)
|
||||||
# Should be exactly one chevron-up icon
|
# Should be exactly one chevronup icon
|
||||||
assert up_count == 1
|
assert up_count == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
test "shows descending icon for specific field when sorted descending", %{conn: conn} do
|
test "shows descending icon for specific field when sorted descending", %{conn: conn} do
|
||||||
conn = conn_with_oidc_user(conn)
|
conn = conn_with_oidc_user(conn)
|
||||||
{:ok, view, html} = live(conn, "/members?query=&sort_field=email&sort_order=desc")
|
{:ok, _view, html} = live(conn, "/members?query=&sort_field=email&sort_order=desc")
|
||||||
|
|
||||||
# Count occurrences to ensure only one descending icon
|
# Count occurrences to ensure only one descending icon
|
||||||
down_count = html |> String.split("hero-chevron-down ") |> length() |> Kernel.-(1)
|
down_count = html |> String.split("hero-chevron-down ") |> length() |> Kernel.-(1)
|
||||||
# Should be exactly one chevron-down icon
|
# Should be exactly one chevrondown icon
|
||||||
assert down_count == 1
|
assert down_count == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -237,7 +237,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
|
||||||
conn = conn_with_oidc_user(conn)
|
conn = conn_with_oidc_user(conn)
|
||||||
{:ok, view, _html} = live(conn, "/members")
|
{:ok, view, _html} = live(conn, "/members")
|
||||||
|
|
||||||
# Click on the first_name sort header
|
# Click on the first name sort header
|
||||||
view
|
view
|
||||||
|> element("button[phx-value-field='first_name']")
|
|> element("button[phx-value-field='first_name']")
|
||||||
|> render_click()
|
|> render_click()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue