Sorting header for members list closes #152 #175 #166

Merged
moritz merged 11 commits from feature/152_sorting_default_fields into main 2025-10-30 16:44:50 +01:00
Showing only changes of commit 9d98ec2494 - Show all commits

View file

@ -2,14 +2,13 @@ defmodule MvWeb.MemberLive.Index do
use MvWeb, :live_view use MvWeb, :live_view
import Ash.Expr import Ash.Expr
import Ash.Query import Ash.Query
import MvWeb.TableComponents
@impl true @impl true
def mount(params, _session, socket) do def mount(params, _session, socket) do
socket = socket =
socket socket
|> assign(:page_title, gettext("Members")) |> assign(:page_title, gettext("Members"))
|> assign(:query, "") |> assign(:query, "")
|> assign_new(:sort_field, fn -> :first_name end) |> assign_new(:sort_field, fn -> :first_name end)
|> assign_new(:sort_order, fn -> :asc end) |> assign_new(:sort_order, fn -> :asc end)
|> assign(:selected_members, []) |> assign(:selected_members, [])
@ -19,32 +18,6 @@ defmodule MvWeb.MemberLive.Index do
{:ok, socket} {:ok, socket}
end end
# -----------------------------------------------------------------
# Receive messages from any toolbar component
# -----------------------------------------------------------------
# Function to handle search
@impl true
def handle_info({:search_changed, q}, socket) do
members =
if String.trim(q) == "" do
Ash.read!(Mv.Membership.Member)
else
Mv.Membership.Member
|> filter(expr(fragment("search_vector @@ plainto_tsquery('simple', ?)", ^q)))
|> Ash.read!()
end
{:noreply,
socket
|> assign(:query, q)
|> assign(:members, members)}
end
# -----------------------------------------------------------------
# Handle Events
# -----------------------------------------------------------------
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# Handle Events # Handle Events
# ----------------------------------------------------------------- # -----------------------------------------------------------------
@ -132,6 +105,24 @@ defmodule MvWeb.MemberLive.Index do
)} )}
end end
# Function to handle search
@impl true
moritz marked this conversation as resolved Outdated

This function ignores the sorting. This leads to reset the sorting while searching.
To avoid duplicate code I would recommend to integrate the search logic into load_members.

This function ignores the sorting. This leads to reset the sorting while searching. To avoid duplicate code I would recommend to integrate the search logic into `load_members`.
def handle_info({:search_changed, q}, socket) do
members =
if String.trim(q) == "" do
Ash.read!(Mv.Membership.Member)
else
Mv.Membership.Member
|> filter(expr(fragment("search_vector @@ plainto_tsquery('simple', ?)", ^q)))
|> Ash.read!()
end
{:noreply,
socket
|> assign(:query, q)
|> assign(:members, members)}
end
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# Handle Params from the URL # Handle Params from the URL
# ----------------------------------------------------------------- # -----------------------------------------------------------------