defmodule BDS.Desktop.ShellLive.MenuEditor do @moduledoc false use Phoenix.Component alias BDS.Desktop.ShellData alias BDS.Desktop.ShellLive.MenuEditor.{ DraftManagement, PageCategory, State, TreeOps, TreePredicates } embed_templates("menu_editor_html/*") @spec assign_socket(term()) :: term() def assign_socket(socket) do case socket.assigns[:current_tab] do %{type: :menu_editor, id: tab_id} -> state = State.ensure_state(socket.assigns) menu_editor = State.build(socket.assigns, state) socket |> assign(:menu_editor_state, state) |> assign(:menu_editor, menu_editor) |> assign( :tab_meta, Map.put(socket.assigns.tab_meta, {:menu_editor, tab_id}, %{ title: translated("menuEditor.tabTitle"), subtitle: translated("menuEditor.description") }) ) _other -> assign(socket, :menu_editor, nil) end end @spec select_item(term(), term(), term()) :: term() def select_item(socket, item_id, reload) do socket |> State.update_state(fn state -> %{state | selected_id: item_id} end) |> reload.(socket.assigns.workbench) end @spec change_entry(term(), term(), term()) :: term() def change_entry(socket, params, reload) do query = Map.get(params, "query", "") socket |> State.update_state(fn state -> put_in(state, [:draft, :query], query) end) |> reload.(socket.assigns.workbench) end @spec submit_entry(term(), term()) :: term() def submit_entry(socket, reload) do case DraftManagement.current_draft(socket.assigns) do %{type: :page} -> socket |> State.update_state(&DraftManagement.finalize_submenu_draft/1) |> reload.(socket.assigns.workbench) %{type: :category} -> socket |> DraftManagement.confirm_category_draft(&State.update_state/2) |> reload.(socket.assigns.workbench) _other -> reload.(socket, socket.assigns.workbench) end end @spec cancel_entry(term(), term()) :: term() def cancel_entry(socket, reload) do socket |> State.update_state(&DraftManagement.cancel_draft/1) |> reload.(socket.assigns.workbench) end @spec select_page(term(), term(), term()) :: term() def select_page(socket, post_id, reload) do case PageCategory.page_post(socket.assigns.projects.active_project_id, post_id) do nil -> reload.(socket, socket.assigns.workbench) post -> socket |> State.update_state(&DraftManagement.assign_page_to_draft(&1, post)) |> reload.(socket.assigns.workbench) end end @spec select_category(term(), term(), term()) :: term() def select_category(socket, name, reload) do project_id = socket.assigns.projects.active_project_id case Enum.find(PageCategory.category_options(project_id), &(&1.name == name)) do nil -> reload.(socket, socket.assigns.workbench) category -> socket |> State.update_state(&DraftManagement.assign_category_to_draft(&1, category)) |> reload.(socket.assigns.workbench) end end @spec toolbar_action(term(), term(), term(), term()) :: term() def toolbar_action(socket, action, reload, append_output) do case action do "add-entry" -> socket |> State.update_state(&DraftManagement.start_page_draft/1) |> reload.(socket.assigns.workbench) "add-category-archive" -> socket |> State.update_state(&DraftManagement.start_category_draft/1) |> reload.(socket.assigns.workbench) "save" -> State.save(socket, reload, append_output) "move-up" -> socket |> State.update_state(&TreeOps.move_selected(&1, :up)) |> reload.(socket.assigns.workbench) "move-down" -> socket |> State.update_state(&TreeOps.move_selected(&1, :down)) |> reload.(socket.assigns.workbench) "indent" -> socket |> State.update_state(&TreeOps.indent_selected/1) |> reload.(socket.assigns.workbench) "unindent" -> socket |> State.update_state(&TreeOps.unindent_selected/1) |> reload.(socket.assigns.workbench) "delete" -> socket |> State.update_state(&TreeOps.delete_selected/1) |> reload.(socket.assigns.workbench) _other -> reload.(socket, socket.assigns.workbench) end end @spec drop_item(term(), term(), term(), term(), term()) :: term() def drop_item(socket, drag_item_id, target_item_id, position, reload) do socket |> State.update_state(&TreeOps.drop_selected(&1, drag_item_id, target_item_id, position)) |> reload.(socket.assigns.workbench) end @spec handle_keydown(term(), term(), term()) :: term() def handle_keydown(socket, "Escape", reload) do cancel_entry(socket, reload) end def handle_keydown(socket, _key, reload) do reload.(socket, socket.assigns.workbench) end attr(:menu_editor, :map, required: true) @spec menu_editor(term()) :: term() def menu_editor(assigns) attr(:items, :list, required: true) attr(:menu_editor, :map, required: true) attr(:depth, :integer, required: true) @spec menu_tree_level(term()) :: term() def menu_tree_level(assigns) do ~H""" <%= for item <- @items do %>