diff --git a/lib/mv_web/live/components/search_bar_component.ex b/lib/mv_web/live/components/search_bar_component.ex new file mode 100644 index 0000000..b1c4a10 --- /dev/null +++ b/lib/mv_web/live/components/search_bar_component.ex @@ -0,0 +1,62 @@ +defmodule MvWeb.Components.SearchBarComponent do + @moduledoc """ + Provides the SearchBar Live-Component. + + - uses the DaisyUI search input field + - sends search_changed event to parent live view with a query + """ + use MvWeb, :live_component + + @impl true + def update(assigns, socket) do + socket = + socket + |> assign_new(:query, fn -> "" end) + |> assign_new(:placeholder, fn -> gettext("Search...") end) + + {:ok, socket} + end + + @impl true + def render(assigns) do + ~H""" +
+ """ + end + + @impl true + # Function to handle the search + def handle_event("search", %{"query" => q}, socket) do + # Forward a high level message to the parent + send(self(), {:search_changed, q}) + {:noreply, assign(socket, :query, q)} + end +end diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 476abd1..d238436 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -1,5 +1,7 @@ defmodule MvWeb.MemberLive.Index do use MvWeb, :live_view + import Ash.Expr + import Ash.Query import MvWeb.TableComponents @impl true @@ -10,12 +12,38 @@ defmodule MvWeb.MemberLive.Index do {:ok, socket |> assign(:page_title, gettext("Members")) + |> assign(:query, "") |> assign(:sort_field, :first_name) |> assign(:sort_order, :asc) |> assign(:members, sorted) |> assign(:selected_members, [])} end + # ----------------------------------------------------------------- + # Receive messages from any toolbar component + # ----------------------------------------------------------------- + + # Function to handle search + @impl true + def handle_info({:search_changed, q}, socket) do + members = + Mv.Membership.Member + |> Ash.Query.filter( + expr(fragment("search_vector @@ plainto_tsquery('simple', ?)", ^q)) + ) + |> Ash.read!() + + IO.inspect(members) + {:noreply, + socket + |> assign(:query, q) + |> assign(:members, members)} + end + + # ----------------------------------------------------------------- + # Handle Events + # ----------------------------------------------------------------- + @impl true def handle_event("delete", %{"id" => id}, socket) do member = Ash.get!(Mv.Membership.Member, id) diff --git a/lib/mv_web/live/member_live/index.html.heex b/lib/mv_web/live/member_live/index.html.heex index fc38889..aa7a820 100644 --- a/lib/mv_web/live/member_live/index.html.heex +++ b/lib/mv_web/live/member_live/index.html.heex @@ -8,6 +8,13 @@ + <.live_component + module={MvWeb.Components.SearchBarComponent} + id="search-bar" + query={@query} + placeholder={gettext("Search...")} + /> + <.table id="members" rows={@members}