defmodule OutlookWeb.ArticleLive.FormComponent do use OutlookWeb, :live_component alias Outlook.Articles @impl true def render(assigns) do ~H"""
<.header> <%= @title %> <:subtitle>Use this form to manage article records in your database. <.simple_form :let={f} for={@changeset} id="article-form" phx-target={@myself} phx-change="validate" phx-submit="save" > <.input field={{f, :author_id}} type="hidden" /> <.input field={{f, :title}} type="text" label="title" /> <.input field={{f, :url}} type="text" label="url" /> <.input field={{f, :language}} type="select" label="language" options={Application.get_env(:outlook,:deepl)[:source_langs]} /> <.input field={{f, :date}} type="datetime-local" label="date" /> <:actions> <.button phx-disable-with="Saving...">Save Article
""" end @impl true def update(%{article: article} = assigns, socket) do changeset = Articles.change_article(article) {:ok, socket |> assign(assigns) |> assign(:changeset, changeset)} end @impl true def handle_event("validate", %{"article" => article_params}, socket) do changeset = socket.assigns.article |> Articles.change_article(article_params) |> Map.put(:action, :validate) {:noreply, assign(socket, :changeset, changeset)} end def handle_event("save", %{"article" => article_params}, socket) do save_article(socket, socket.assigns.action, article_params |> put_internal_tree(socket.assigns)) end defp put_internal_tree(article_params, %{internal_tree: internal_tree} = _) do article_params |> Map.put("content", internal_tree) end defp put_internal_tree(article_params, _), do: article_params defp save_article(socket, :edit, article_params) do case Articles.update_article(socket.assigns.article, article_params) do {:ok, _article} -> {:noreply, socket |> put_flash(:info, "Article updated successfully") |> push_navigate(to: socket.assigns.navigate)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, :changeset, changeset)} end end defp save_article(socket, :new, article_params) do case Articles.create_article(article_params) do {:ok, _article} -> {:noreply, socket |> put_flash(:info, "Article created successfully") |> push_navigate(to: socket.assigns.navigate)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, changeset: changeset)} end end end