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