|
|
@ -1,18 +1,21 @@
|
|
|
|
defmodule DecentralisedBookIndexWeb.AuthorLive.Index do
|
|
|
|
defmodule DecentralisedBookIndexWeb.AuthorLive.Index do
|
|
|
|
use DecentralisedBookIndexWeb, :live_view
|
|
|
|
use DecentralisedBookIndexWeb, :live_view
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alias DecentralisedBookIndex.Metadata
|
|
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
@impl true
|
|
|
|
def render(assigns) do
|
|
|
|
def render(assigns) do
|
|
|
|
~H"""
|
|
|
|
~H"""
|
|
|
|
<.header>
|
|
|
|
<.header class="pb-2">
|
|
|
|
Listing Authors
|
|
|
|
Listing Authors
|
|
|
|
<:actions>
|
|
|
|
|
|
|
|
<.link patch={~p"/authors/new"}>
|
|
|
|
|
|
|
|
<.button>New Author</.button>
|
|
|
|
|
|
|
|
</.link>
|
|
|
|
|
|
|
|
</:actions>
|
|
|
|
|
|
|
|
</.header>
|
|
|
|
</.header>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<.author_search
|
|
|
|
|
|
|
|
search_query={@search_query}
|
|
|
|
|
|
|
|
select_options={@select_options}
|
|
|
|
|
|
|
|
selected_option={@sort_by}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
<.table
|
|
|
|
<.table
|
|
|
|
id="authors"
|
|
|
|
id="authors"
|
|
|
|
rows={@streams.authors}
|
|
|
|
rows={@streams.authors}
|
|
|
@ -76,7 +79,26 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Index do
|
|
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
@impl true
|
|
|
|
def handle_params(params, _url, socket) do
|
|
|
|
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
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
defp apply_action(socket, :edit, %{"id" => id}) do
|
|
|
|
defp apply_action(socket, :edit, %{"id" => id}) do
|
|
|
@ -114,4 +136,31 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Index do
|
|
|
|
|
|
|
|
|
|
|
|
{:noreply, stream_delete(socket, :authors, author)}
|
|
|
|
{:noreply, stream_delete(socket, :authors, author)}
|
|
|
|
end
|
|
|
|
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
|
|
|
|
end
|
|
|
|