|
| 1 | +defmodule OgCatalogWeb.OpenGraphObjectLive.Index do |
| 2 | + use OgCatalogWeb, :live_view |
| 3 | + |
| 4 | + alias OgCatalog.OpenGraphObjects |
| 5 | + alias OgCatalog.OpenGraphObjects.OpenGraphObject |
| 6 | + |
| 7 | + @impl true |
| 8 | + def mount(_params, _session, socket) do |
| 9 | + open_graph_object = %OpenGraphObject{} |
| 10 | + |
| 11 | + {:ok, |
| 12 | + socket |
| 13 | + |> assign(:page_title, "Open graph objects") |
| 14 | + |> stream(:open_graph_objects, list_open_graph_objects()) |
| 15 | + |> assign(:open_graph_object, open_graph_object) |
| 16 | + |> assign(:form, to_form(OpenGraphObjects.change_open_graph_object(open_graph_object)))} |
| 17 | + end |
| 18 | + |
| 19 | + @impl true |
| 20 | + def render(assigns) do |
| 21 | + ~H""" |
| 22 | + <Layouts.app flash={@flash}> |
| 23 | + <.header> |
| 24 | + {@page_title} |
| 25 | + <:subtitle>Manage open graph object records.</:subtitle> |
| 26 | + </.header> |
| 27 | +
|
| 28 | + <div class="grid gap-8"> |
| 29 | + <section> |
| 30 | + <h2 class="text-xl font-bold">Add New Open Graph Object</h2> |
| 31 | + <.form for={@form} id="open_graph_object-form" phx-change="validate" phx-submit="save"> |
| 32 | + <.input field={@form[:page_url]} type="text" label="Page url" /> |
| 33 | + <footer> |
| 34 | + <.button phx-disable-with="Saving...">Save Open graph object</.button> |
| 35 | + </footer> |
| 36 | + </.form> |
| 37 | + </section> |
| 38 | +
|
| 39 | + <section> |
| 40 | + <h2 class="text-xl font-bold">Open Graph Objects</h2> |
| 41 | + <.table |
| 42 | + id="open_graph_objects" |
| 43 | + rows={@streams.open_graph_objects} |
| 44 | + row_click={fn {_id, open_graph_object} -> JS.navigate(~p"/open_graph_objects/#{open_graph_object}") end} |
| 45 | + > |
| 46 | + <:col :let={{_id, open_graph_object}} label="Page url">{open_graph_object.page_url}</:col> |
| 47 | + <:col :let={{_id, open_graph_object}} label="Status">{open_graph_object.status}</:col> |
| 48 | + <:col :let={{_id, open_graph_object}} label="Og image url"> |
| 49 | + <img :if={open_graph_object.og_image_url} |
| 50 | + src={open_graph_object.og_image_url} |
| 51 | + alt={open_graph_object.page_url} |
| 52 | + class="max-w-[100px] max-h-[100px] object-cover"/> |
| 53 | + </:col> |
| 54 | + <:action :let={{id, open_graph_object}}> |
| 55 | + <.button |
| 56 | + phx-click={JS.push("delete", value: %{id: open_graph_object.id}) |> hide("##{id}")} |
| 57 | + data-confirm="Are you sure?" |
| 58 | + > |
| 59 | + Delete |
| 60 | + </.button> |
| 61 | + </:action> |
| 62 | + </.table> |
| 63 | + </section> |
| 64 | + </div> |
| 65 | + </Layouts.app> |
| 66 | + """ |
| 67 | + end |
| 68 | + |
| 69 | + @impl true |
| 70 | + def handle_event("validate", %{"open_graph_object" => params}, socket) do |
| 71 | + changeset = OpenGraphObjects.change_open_graph_object(socket.assigns.open_graph_object, params) |
| 72 | + {:noreply, assign(socket, form: to_form(changeset, action: :validate))} |
| 73 | + end |
| 74 | + |
| 75 | + @impl true |
| 76 | + def handle_event("save", %{"open_graph_object" => params}, socket) do |
| 77 | + case OpenGraphObjects.create_open_graph_object(params) do |
| 78 | + {:ok, _open_graph_object} -> |
| 79 | + {:noreply, |
| 80 | + socket |
| 81 | + |> put_flash(:info, "Open graph object created successfully") |
| 82 | + |> stream(:open_graph_objects, list_open_graph_objects(), reset: true) |
| 83 | + |> assign(:open_graph_object, %OpenGraphObject{}) |
| 84 | + |> assign(:form, to_form(OpenGraphObjects.change_open_graph_object(%OpenGraphObject{})))} |
| 85 | + |
| 86 | + {:error, %Ecto.Changeset{} = changeset} -> |
| 87 | + {:noreply, assign(socket, form: to_form(changeset, action: :insert))} |
| 88 | + end |
| 89 | + end |
| 90 | + |
| 91 | + @impl true |
| 92 | + def handle_event("delete", %{"id" => id}, socket) do |
| 93 | + open_graph_object = OpenGraphObjects.get_open_graph_object!(id) |
| 94 | + |
| 95 | + case OpenGraphObjects.delete_open_graph_object(open_graph_object) do |
| 96 | + {:ok, _deleted} -> |
| 97 | + {:noreply, stream_delete(socket, :open_graph_objects, open_graph_object)} |
| 98 | + {:error, _reason} -> |
| 99 | + {:noreply, |
| 100 | + socket |
| 101 | + |> put_flash(:error, "Could not delete open graph object")} |
| 102 | + end |
| 103 | + end |
| 104 | + |
| 105 | + defp list_open_graph_objects() do |
| 106 | + OpenGraphObjects.list_open_graph_objects() |
| 107 | + end |
| 108 | +end |
0 commit comments