108 lines
3.6 KiB
Elixir
108 lines
3.6 KiB
Elixir
defmodule OutlookWeb.ArticleLive.New do
|
|
use OutlookWeb, :live_view
|
|
|
|
import OutlookWeb.ArticleLive.NewComponents
|
|
|
|
alias OutlookWeb.ArticleLive.FormComponent
|
|
alias Outlook.{Articles,Authors,HtmlPreparations,InternalTree}
|
|
alias Articles.{Article,RawHtmlInput}
|
|
|
|
require Logger
|
|
|
|
@impl true
|
|
def mount(_params, _session, socket) do
|
|
{:ok,
|
|
socket
|
|
|> assign(:page_title, "New Article")
|
|
|> assign(:raw_html_input, %RawHtmlInput{})
|
|
|> assign(:changeset, Articles.change_raw_html_input(%RawHtmlInput{}))
|
|
|> assign(:selected_els, [])
|
|
|> assign(:selected_tunits, [])
|
|
|> assign(:step, :import_raw_html)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_params(%{"author_id" => author_id}, _, socket) do
|
|
author = Authors.get_author!(author_id)
|
|
article = %Article{author_id: author.id}
|
|
{:noreply,
|
|
socket
|
|
|> assign(:menu_entries, InternalTree.tunit_modifiers()) # REMOVE ME!
|
|
|> assign(:author, author)
|
|
|> assign(:article, article)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("validate_raw_html_input", %{"raw_html_input" => raw_html_input_params}, socket) do
|
|
changeset = validate_raw_html_input(raw_html_input_params, socket)
|
|
{:noreply, assign(socket, :changeset, changeset)}
|
|
end
|
|
|
|
def handle_event("convert_raw_html_input", %{"raw_html_input" => raw_html_input_params}, socket) do
|
|
changeset = validate_raw_html_input(raw_html_input_params, socket)
|
|
case changeset.valid? do
|
|
true ->
|
|
{:noreply,
|
|
socket
|
|
|> assign(:raw_internal_tree,
|
|
HtmlPreparations.convert_raw_html_input(raw_html_input_params["content"])
|
|
|> InternalTree.garnish(%{})
|
|
)
|
|
|> assign(:step, :review_raw_internaltree)}
|
|
false ->
|
|
{:noreply, assign(socket, :changeset, changeset)}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("approve_raw_internaltree", _, socket) do
|
|
socket = socket
|
|
|> assign(:raw_internal_tree,
|
|
InternalTree.partition_text(socket.assigns.raw_internal_tree)
|
|
|> InternalTree.garnish(%{tunits: %{class: :tunit}})
|
|
|> InternalTree.add_phx_click_event(
|
|
nodes: :tunits,
|
|
click: "toggle_selected_tunit")
|
|
)
|
|
|> assign(:menu_entries, InternalTree.tunit_modifiers())
|
|
{:noreply, socket |> assign(:step, :review_translation_units)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("toggle_selected_tunit", %{"nid" => tunit_id}, socket) do
|
|
{:noreply, toggle_selected_tunit(socket, tunit_id)}
|
|
end
|
|
|
|
defp toggle_selected_tunit(socket, tunit_id) do
|
|
before = socket.assigns.selected_tunits
|
|
selected_tunits = case Enum.member?(before, tunit_id) do
|
|
false -> List.insert_at(before, -1, tunit_id)
|
|
true -> List.delete(before, tunit_id)
|
|
end
|
|
fun = fn n -> n.nid in selected_tunits && "yes" || "no" end
|
|
socket
|
|
|> assign(:raw_internal_tree, InternalTree.garnish(socket.assigns.raw_internal_tree, %{tunits: %{selected: fun}}))
|
|
|> assign(:selected_tunits, selected_tunits)
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("modify_tunits", %{"modifier" => modifier}, socket) do
|
|
{:noreply,
|
|
socket
|
|
|> assign(:raw_internal_tree,
|
|
InternalTree.modify_tunits(socket.assigns.raw_internal_tree, modifier, socket.assigns.selected_tunits)
|
|
)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("approve_translation_units", _, socket) do
|
|
{:noreply, socket |> assign(:step, :final_form)}
|
|
end
|
|
|
|
defp validate_raw_html_input(raw_html_input_params, socket) do
|
|
socket.assigns.raw_html_input
|
|
|> Articles.change_raw_html_input(raw_html_input_params)
|
|
|> Map.put(:action, :validate)
|
|
end
|
|
end
|