From 71a61d37658c2fff3c06ed8d5c8f169b9f493574 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Sun, 20 Apr 2025 16:10:17 +0300 Subject: [PATCH] Add components to select and show selected Publisher. --- .../components/my_components.ex | 3 + .../my_components/select_publisher.ex | 87 +++++++++++++++++++ .../my_components/selected_publisher.ex | 29 +++++++ 3 files changed, 119 insertions(+) create mode 100644 lib/decentralised_book_index_web/components/my_components/select_publisher.ex create mode 100644 lib/decentralised_book_index_web/components/my_components/selected_publisher.ex diff --git a/lib/decentralised_book_index_web/components/my_components.ex b/lib/decentralised_book_index_web/components/my_components.ex index fcb46e2..cc5cf50 100644 --- a/lib/decentralised_book_index_web/components/my_components.ex +++ b/lib/decentralised_book_index_web/components/my_components.ex @@ -20,6 +20,9 @@ defmodule DecentralisedBookIndexWeb.Components.MyComponents do edit_button: 1, cancel_button: 1, ] + + alias MyComponents.SelectPublisher + import MyComponents.SelectedPublisher, only: [selected_publisher: 1] end end end diff --git a/lib/decentralised_book_index_web/components/my_components/select_publisher.ex b/lib/decentralised_book_index_web/components/my_components/select_publisher.ex new file mode 100644 index 0000000..56208fa --- /dev/null +++ b/lib/decentralised_book_index_web/components/my_components/select_publisher.ex @@ -0,0 +1,87 @@ +defmodule DecentralisedBookIndexWeb.Components.MyComponents.SelectPublisher do + use DecentralisedBookIndexWeb, :live_component + alias DecentralisedBookIndex.Metadata + + @impl true + def render(assigns) do + ~H""" +
+ <.header> + Select Publisher + + +
+ +
+
+ +
+ +
+
+ + <%= for publisher <- @page.results do %> +
+
{publisher.name}
+
+ <% end %> +
+ """ + end + + @impl true + def update(assigns, socket) do + {:ok, + socket + |> assign(assigns) + |> assign(:publisher_query, "") + |> search()} + end + + @impl true + def handle_event("validate", %{"publisher" => publisher_params}, socket) do + {:noreply, + assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, publisher_params))} + end + + def handle_event("save", %{"publisher" => publisher_id}, socket) do + notify_parent({:select_publisher, "416d2fc7-4470-4fde-aa64-501259335624"}) + {:noreply, socket} + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) + + defp assign_form(%{assigns: %{publisher: publisher}} = socket) do + form = + if publisher do + AshPhoenix.Form.for_update(publisher, :update, + as: "publisher", + actor: socket.assigns.current_user + ) + else + AshPhoenix.Form.for_create(DecentralisedBookIndex.Metadata.Publisher, :create, + as: "publisher", + actor: socket.assigns.current_user + ) + end + + assign(socket, form: to_form(form)) + end + + def handle_event("search", %{"query" => query}, socket) do + {:noreply, + socket + |> assign(:publisher_query, query) + |> search()} + end + + defp search(socket) do + query = Map.get(socket.assigns, :publisher_query, "") + page = Metadata.search_publisher!(query) + + socket + |> assign(page: page) + end +end diff --git a/lib/decentralised_book_index_web/components/my_components/selected_publisher.ex b/lib/decentralised_book_index_web/components/my_components/selected_publisher.ex new file mode 100644 index 0000000..49ac0b0 --- /dev/null +++ b/lib/decentralised_book_index_web/components/my_components/selected_publisher.ex @@ -0,0 +1,29 @@ +defmodule DecentralisedBookIndexWeb.Components.MyComponents.SelectedPublisher do + use Phoenix.Component + use DecentralisedBookIndexWeb, :verified_routes + + attr :publisher_form, :map, default: nil + + def selected_publisher(assigns) do + publisher_id = assigns.publisher_form.value + + publisher = + if publisher_id == nil do + publisher_id + else + DecentralisedBookIndex.Metadata.get_publisher_by_id!(publisher_id) + end + + assigns = assign(assigns, :publisher, publisher) + + ~H""" + + """ + end +end