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/*" 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 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 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 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 def cancel_entry(socket, reload) do socket |> State.update_state(&DraftManagement.cancel_draft/1) |> reload.(socket.assigns.workbench) end 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 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 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 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 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 def menu_editor(assigns) attr :items, :list, required: true attr :menu_editor, :map, required: true attr :depth, :integer, required: true def menu_tree_level(assigns) do ~H""" <%= for item <- @items do %> <% end %> """ end attr :kind, :atom, required: true def kind_icon(assigns) do ~H""" <%= case @kind do %> <% :home -> %> <% :page -> %> <% :category_archive -> %> <% _other -> %> <% end %> """ end def translated(text, bindings \\ %{}), do: ShellData.translate(text, bindings, BDS.Desktop.UILocale.current()) def row_label(item, category_titles) do if item.kind == :category_archive do Map.get(category_titles || %{}, item.slug, item.label) else item.label end end def kind_label(:home), do: translated("menuEditor.type.home") def kind_label(:page), do: translated("menuEditor.type.page") def kind_label(:category_archive), do: translated("menuEditor.type.categoryArchive") def kind_label(:submenu), do: translated("menuEditor.type.submenu") defdelegate draft_item?(menu_editor, item_id), to: TreePredicates def editing_title(%{draft: %{type: :category}}), do: translated("menuEditor.addCategoryArchive") def editing_title(_menu_editor), do: translated("menuEditor.pagePicker.title") def editing_hint(%{draft: %{type: :category}}), do: translated("menuEditor.categoryPicker.hint") def editing_hint(_menu_editor), do: translated("menuEditor.createHint") def editing_placeholder(%{draft: %{type: :category}}), do: translated("menuEditor.newCategoryPlaceholder") def editing_placeholder(_menu_editor), do: translated("menuEditor.newEntryPlaceholder") end