diff --git a/lib/decentralised_book_index_web/live/author_live/index.ex b/lib/decentralised_book_index_web/live/author_live/index.ex index 9e13420..7f97b74 100644 --- a/lib/decentralised_book_index_web/live/author_live/index.ex +++ b/lib/decentralised_book_index_web/live/author_live/index.ex @@ -1,18 +1,21 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Index do use DecentralisedBookIndexWeb, :live_view + alias DecentralisedBookIndex.Metadata + @impl true def render(assigns) do ~H""" - <.header> + <.header class="pb-2"> Listing Authors - <:actions> - <.link patch={~p"/authors/new"}> - <.button>New Author - - + <.author_search + search_query={@search_query} + select_options={@select_options} + selected_option={@sort_by} + /> + <.table id="authors" rows={@streams.authors} @@ -76,7 +79,26 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Index do @impl true def handle_params(params, _url, socket) do - {:noreply, apply_action(socket, socket.assigns.live_action, params)} + search_query = Map.get(params, "query", "") + sort_by = Map.get(params, "sort_by", "name") |> validate_sort_by() + page_params = AshPhoenix.LiveView.page_from_params(params, 10) + + page = Metadata.search_author!( + search_query, + page: page_params, + ) + + socket = + socket + |> assign(:sort_by, sort_by) + |> assign(:search_query, search_query) + |> assign(:select_options, sort_options()) + |> assign(:page_params, page_params) + |> assign(:page, page) + |> assign(:params, params) + |> apply_action(socket.assigns.live_action, params) + + {:noreply, socket} end defp apply_action(socket, :edit, %{"id" => id}) do @@ -114,4 +136,31 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Index do {:noreply, stream_delete(socket, :authors, author)} end + + defp sort_options do + [ + {"Sort by name", "name"}, + {"Sort by recently updated", "-updated_at"}, + {"Sort by recently added", "-inserted_at"}, + ] + end + + def validate_sort_by(key) do + valid_keys = Enum.map(sort_options(), &elem(&1, 1)) + + if key in valid_keys do + key + else + List.first(valid_keys) + end + end + + @impl true + def handle_event("change-sort", %{"sort_by" => sort_by}, socket) do + params = + socket.assigns.params + |> Map.put("sort_by", sort_by) + + {:noreply, push_patch(socket, to: ~p"/authors?#{params}")} + end end