diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 4a05e29..51d2bd2 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -207,19 +207,46 @@ defmodule MvWeb.MemberLive.Index do # Function to sort the column if needed defp maybe_sort(query, nil, _), do: query - defp maybe_sort(query, field, :asc), do: Ash.Query.sort(query, [{field, :asc}]) - defp maybe_sort(query, field, :desc), do: Ash.Query.sort(query, [{field, :desc}]) + defp maybe_sort(query, field, :asc) when not is_nil(field), do: Ash.Query.sort(query, [{field, :asc}]) + defp maybe_sort(query, field, :desc) when not is_nil(field), do: Ash.Query.sort(query, [{field, :desc}]) + defp maybe_sort(query, _, _), do: query + + # Validate that a field is sortable + defp valid_sort_field?(field) when is_atom(field) do + valid_fields = [ + :first_name, :last_name, :email, :street, :house_number, + :postal_code, :city, :phone_number, :join_date + ] + field in valid_fields + end + defp valid_sort_field?(_), do: false # Function to maybe update the sort defp maybe_update_sort(socket, %{"sort_field" => sf, "sort_order" => so}) do - field = - try do - String.to_existing_atom(sf) - rescue - ArgumentError -> socket.assigns.sort_field - end + # Handle empty strings and nil values + field = 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 - order = if so in ["asc", "desc"], do: String.to_atom(so), else: socket.assigns.sort_order + # 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 |> assign(:sort_field, field)