chore: converted post editor to live component
This commit is contained in:
@@ -162,14 +162,6 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
|> assign(:project_menu_open, false)
|
|> assign(:project_menu_open, false)
|
||||||
|> assign(:sidebar_filters_by_view, %{})
|
|> assign(:sidebar_filters_by_view, %{})
|
||||||
|> assign(:sidebar_filter_panels, %{})
|
|> assign(:sidebar_filter_panels, %{})
|
||||||
|> assign(:post_editor_drafts, %{})
|
|
||||||
|> assign(:post_editor_active_languages, %{})
|
|
||||||
|> assign(:post_editor_tag_queries, %{})
|
|
||||||
|> assign(:post_editor_category_queries, %{})
|
|
||||||
|> assign(:post_editor_quick_actions_open, %{})
|
|
||||||
|> assign(:post_editor_modes, %{})
|
|
||||||
|> assign(:post_editor_expanded, %{})
|
|
||||||
|> assign(:post_editor_save_states, %{})
|
|
||||||
|> assign(:media_editor_drafts, %{})
|
|> assign(:media_editor_drafts, %{})
|
||||||
|> assign(:media_editor_quick_actions_open, %{})
|
|> assign(:media_editor_quick_actions_open, %{})
|
||||||
|> assign(:media_editor_post_pickers_open, %{})
|
|> assign(:media_editor_post_pickers_open, %{})
|
||||||
@@ -339,79 +331,6 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
{:noreply, reload_shell(socket, workbench)}
|
{:noreply, reload_shell(socket, workbench)}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("change_post_editor", %{"post_editor" => params}, socket) do
|
|
||||||
{:noreply, PostEditor.update(socket, params, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("save_post_editor", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply,
|
|
||||||
PostEditor.persist_socket(socket, post_id, :save, &reload_shell/2, &append_output_entry/5)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("publish_post_editor", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply,
|
|
||||||
PostEditor.persist_socket(socket, post_id, :publish, &reload_shell/2, &append_output_entry/5)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("discard_post_editor", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply,
|
|
||||||
PostEditor.discard_socket(socket, post_id, &reload_shell/2, &append_output_entry/5)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("delete_post_editor", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply, PostEditor.delete_socket(socket, post_id, &reload_shell/2, &append_output_entry/5)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("set_post_editor_mode", %{"id" => post_id, "mode" => mode}, socket) do
|
|
||||||
{:noreply, PostEditor.set_mode(socket, post_id, mode, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("toggle_post_metadata", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply, PostEditor.toggle_section(socket, post_id, :metadata, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("toggle_post_excerpt", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply, PostEditor.toggle_section(socket, post_id, :excerpt, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event(
|
|
||||||
"select_post_editor_language",
|
|
||||||
%{"id" => post_id, "language" => language},
|
|
||||||
socket
|
|
||||||
) do
|
|
||||||
{:noreply, PostEditor.select_language(socket, post_id, language, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("toggle_post_editor_quick_actions", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply, PostEditor.toggle_quick_actions(socket, post_id, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("detect_post_editor_language", %{"id" => post_id}, socket) do
|
|
||||||
{:noreply,
|
|
||||||
PostEditor.detect_language(socket, post_id, &reload_shell/2, &append_output_entry/5)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("add_post_editor_tag", %{"id" => post_id, "tag" => tag}, socket) do
|
|
||||||
{:noreply, PostEditor.add_list_value(socket, post_id, :tags, tag, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("remove_post_editor_tag", %{"id" => post_id, "tag" => tag}, socket) do
|
|
||||||
{:noreply, PostEditor.remove_list_value(socket, post_id, :tags, tag, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("add_post_editor_category", %{"id" => post_id, "category" => category}, socket) do
|
|
||||||
{:noreply, PostEditor.add_list_value(socket, post_id, :categories, category, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event(
|
|
||||||
"remove_post_editor_category",
|
|
||||||
%{"id" => post_id, "category" => category},
|
|
||||||
socket
|
|
||||||
) do
|
|
||||||
{:noreply,
|
|
||||||
PostEditor.remove_list_value(socket, post_id, :categories, category, &reload_shell/2)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("change_media_editor", %{"media_editor" => params}, socket) do
|
def handle_event("change_media_editor", %{"media_editor" => params}, socket) do
|
||||||
{:noreply, MediaEditor.update(socket, params, &reload_shell/2)}
|
{:noreply, MediaEditor.update(socket, params, &reload_shell/2)}
|
||||||
end
|
end
|
||||||
@@ -769,11 +688,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
socket =
|
socket =
|
||||||
case socket.assigns[:current_tab] do
|
case socket.assigns[:current_tab] do
|
||||||
%{type: :post, id: post_id} when kind in ["ai_suggestions", "language_picker"] ->
|
%{type: :post, id: post_id} when kind in ["ai_suggestions", "language_picker"] ->
|
||||||
assign(
|
send_update(__MODULE__.PostEditor, id: "post-editor-#{post_id}", action: :close_quick_actions)
|
||||||
socket,
|
socket
|
||||||
:post_editor_quick_actions_open,
|
|
||||||
Map.put(socket.assigns.post_editor_quick_actions_open, post_id, false)
|
|
||||||
)
|
|
||||||
|
|
||||||
%{type: :media, id: media_id}
|
%{type: :media, id: media_id}
|
||||||
when kind in ["ai_suggestions", "language_picker", "confirm_delete"] ->
|
when kind in ["ai_suggestions", "language_picker", "confirm_delete"] ->
|
||||||
@@ -868,12 +784,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
socket
|
socket
|
||||||
|
|
||||||
result ->
|
result ->
|
||||||
PostEditor.insert_content(
|
send(self(), {:post_editor_insert_content, post_id, ShellOverlayComponents.markdown_link(result.title, result.canonical_url)})
|
||||||
socket,
|
socket
|
||||||
post_id,
|
|
||||||
ShellOverlayComponents.markdown_link(result.title, result.canonical_url),
|
|
||||||
&reload_shell/2
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
{%{kind: :insert_media}, %{type: :post, id: post_id}} ->
|
{%{kind: :insert_media}, %{type: :post, id: post_id}} ->
|
||||||
@@ -889,7 +801,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
"[#{result.original_name}](bds-media://#{result.media_id})"
|
"[#{result.original_name}](bds-media://#{result.media_id})"
|
||||||
end
|
end
|
||||||
|
|
||||||
PostEditor.insert_content(socket, post_id, syntax, &reload_shell/2)
|
send(self(), {:post_editor_insert_content, post_id, syntax})
|
||||||
|
socket
|
||||||
end
|
end
|
||||||
|
|
||||||
_other ->
|
_other ->
|
||||||
@@ -913,11 +826,11 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
end
|
end
|
||||||
|
|
||||||
if details do
|
if details do
|
||||||
PostEditor.insert_content(socket, post_id, details, &reload_shell/2)
|
send(self(), {:post_editor_insert_content, post_id, details})
|
||||||
else
|
|
||||||
socket
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
socket
|
||||||
|
|
||||||
_other ->
|
_other ->
|
||||||
socket
|
socket
|
||||||
end
|
end
|
||||||
@@ -931,7 +844,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
socket =
|
socket =
|
||||||
case {socket.assigns[:shell_overlay], current_tab} do
|
case {socket.assigns[:shell_overlay], current_tab} do
|
||||||
{%{kind: :language_picker}, %{type: :post, id: post_id}} ->
|
{%{kind: :language_picker}, %{type: :post, id: post_id}} ->
|
||||||
PostEditor.translate(socket, post_id, code, &reload_shell/2, &append_output_entry/5)
|
send(self(), {:post_editor_translate, post_id, code})
|
||||||
|
socket
|
||||||
|
|
||||||
{%{kind: :language_picker}, %{type: :media, id: media_id}} ->
|
{%{kind: :language_picker}, %{type: :media, id: media_id}} ->
|
||||||
MediaEditor.translate(socket, media_id, code, &reload_shell/2, &append_output_entry/5)
|
MediaEditor.translate(socket, media_id, code, &reload_shell/2, &append_output_entry/5)
|
||||||
@@ -952,13 +866,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
execute_sidebar_delete(socket, route, id)
|
execute_sidebar_delete(socket, route, id)
|
||||||
|
|
||||||
{%{kind: :ai_suggestions} = overlay, %{type: :post, id: post_id}} ->
|
{%{kind: :ai_suggestions} = overlay, %{type: :post, id: post_id}} ->
|
||||||
PostEditor.apply_ai_suggestions(
|
send(self(), {:post_editor_apply_ai_suggestions, post_id, Overlay.selected_ai_fields(overlay)})
|
||||||
socket,
|
socket
|
||||||
post_id,
|
|
||||||
Overlay.selected_ai_fields(overlay),
|
|
||||||
&reload_shell/2,
|
|
||||||
&append_output_entry/5
|
|
||||||
)
|
|
||||||
|
|
||||||
{%{kind: :ai_suggestions} = overlay, %{type: :media, id: media_id}} ->
|
{%{kind: :ai_suggestions} = overlay, %{type: :media, id: media_id}} ->
|
||||||
MediaEditor.apply_ai_suggestions(
|
MediaEditor.apply_ai_suggestions(
|
||||||
@@ -1272,6 +1181,47 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
{:noreply, append_output_entry(socket, title, message, nil, level)}
|
{:noreply, append_output_entry(socket, title, message, nil, level)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_output, title, message, level}, socket) do
|
||||||
|
{:noreply, append_output_entry(socket, title, message, nil, level)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_dirty, post_id, dirty?}, socket) do
|
||||||
|
workbench =
|
||||||
|
if dirty? do
|
||||||
|
BDS.UI.Workbench.mark_dirty(socket.assigns.workbench, :post, post_id)
|
||||||
|
else
|
||||||
|
BDS.UI.Workbench.clear_dirty(socket.assigns.workbench, :post, post_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
{:noreply, assign(socket, :workbench, workbench)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_tab_meta, post_id, title, subtitle}, socket) do
|
||||||
|
tab_meta =
|
||||||
|
Map.put(socket.assigns.tab_meta, {:post, post_id}, %{title: title, subtitle: subtitle})
|
||||||
|
|
||||||
|
{:noreply, assign(socket, :tab_meta, tab_meta)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_insert_content, post_id, content}, socket) do
|
||||||
|
send_update(PostEditor, id: "post-editor-#{post_id}", action: :insert_content, content: content)
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_translate, post_id, language}, socket) do
|
||||||
|
send_update(PostEditor, id: "post-editor-#{post_id}", action: :translate, language: language)
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_info({:post_editor_apply_ai_suggestions, post_id, fields}, socket) do
|
||||||
|
send_update(PostEditor, id: "post-editor-#{post_id}",
|
||||||
|
action: :apply_ai_suggestions,
|
||||||
|
fields: fields
|
||||||
|
)
|
||||||
|
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
|
||||||
def handle_info(:reload_shell, socket) do
|
def handle_info(:reload_shell, socket) do
|
||||||
{:noreply, reload_shell(socket, socket.assigns.workbench)}
|
{:noreply, reload_shell(socket, socket.assigns.workbench)}
|
||||||
end
|
end
|
||||||
@@ -1348,7 +1298,6 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
|> assign(:menu_groups, socket.assigns[:menu_groups] || TitlebarMenu.groups())
|
|> assign(:menu_groups, socket.assigns[:menu_groups] || TitlebarMenu.groups())
|
||||||
|> assign(:titlebar_menu_item_index, socket.assigns[:titlebar_menu_item_index])
|
|> assign(:titlebar_menu_item_index, socket.assigns[:titlebar_menu_item_index])
|
||||||
|> assign(:current_tab, current_tab(workbench))
|
|> assign(:current_tab, current_tab(workbench))
|
||||||
|> assign_post_editor()
|
|
||||||
|> assign_media_editor()
|
|> assign_media_editor()
|
||||||
|> assign_chat_editor()
|
|> assign_chat_editor()
|
||||||
|> assign_import_editor()
|
|> assign_import_editor()
|
||||||
@@ -1394,10 +1343,6 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
Enum.find(tabs, &(&1.type == type and &1.id == id))
|
Enum.find(tabs, &(&1.type == type and &1.id == id))
|
||||||
end
|
end
|
||||||
|
|
||||||
defp assign_post_editor(socket) do
|
|
||||||
PostEditor.assign_socket(socket)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp assign_media_editor(socket) do
|
defp assign_media_editor(socket) do
|
||||||
MediaEditor.assign_socket(socket)
|
MediaEditor.assign_socket(socket)
|
||||||
end
|
end
|
||||||
@@ -1562,7 +1507,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
defp shell_command?(action), do: not is_nil(shell_command_atom(action))
|
defp shell_command?(action), do: not is_nil(shell_command_atom(action))
|
||||||
|
|
||||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
defp save_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||||
PostEditor.persist_socket(socket, post_id, :save, &reload_shell/2, &append_output_entry/5)
|
send_update(PostEditor, id: "post-editor-#{post_id}", action: :save)
|
||||||
|
socket
|
||||||
end
|
end
|
||||||
|
|
||||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :media, id: media_id}}} = socket) do
|
defp save_current_tab(%{assigns: %{current_tab: %{type: :media, id: media_id}}} = socket) do
|
||||||
@@ -1597,7 +1543,8 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
defp save_current_tab(socket), do: reload_shell(socket, socket.assigns.workbench)
|
defp save_current_tab(socket), do: reload_shell(socket, socket.assigns.workbench)
|
||||||
|
|
||||||
defp publish_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
defp publish_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||||
PostEditor.persist_socket(socket, post_id, :publish, &reload_shell/2, &append_output_entry/5)
|
send_update(PostEditor, id: "post-editor-#{post_id}", action: :publish)
|
||||||
|
socket
|
||||||
end
|
end
|
||||||
|
|
||||||
defp publish_current_tab(socket), do: reload_shell(socket, socket.assigns.workbench)
|
defp publish_current_tab(socket), do: reload_shell(socket, socket.assigns.workbench)
|
||||||
@@ -1657,9 +1604,21 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
defp execute_sidebar_delete(socket, route, id) do
|
defp execute_sidebar_delete(socket, route, id) do
|
||||||
case route do
|
case route do
|
||||||
"post" ->
|
"post" ->
|
||||||
|
case Posts.delete_post(id) do
|
||||||
|
{:ok, :deleted} ->
|
||||||
|
workbench = BDS.UI.Workbench.close_tab(socket.assigns.workbench, :post, id)
|
||||||
|
|
||||||
socket
|
socket
|
||||||
|> assign(:shell_overlay, nil)
|
|> assign(:shell_overlay, nil)
|
||||||
|> PostEditor.delete_socket(id, &reload_shell/2, &append_output_entry/5)
|
|> assign(:tab_meta, Map.delete(socket.assigns.tab_meta, {:post, id}))
|
||||||
|
|> reload_shell(workbench)
|
||||||
|
|
||||||
|
{:error, reason} ->
|
||||||
|
socket
|
||||||
|
|> assign(:shell_overlay, nil)
|
||||||
|
|> append_output_entry(sidebar_delete_title("post"), inspect(reason), nil, "error")
|
||||||
|
|> reload_shell(socket.assigns.workbench)
|
||||||
|
end
|
||||||
|
|
||||||
"media" ->
|
"media" ->
|
||||||
socket
|
socket
|
||||||
|
|||||||
@@ -46,29 +46,6 @@ defmodule BDS.Desktop.ShellLive.CliSync do
|
|||||||
|> assign(:workbench, workbench)
|
|> assign(:workbench, workbench)
|
||||||
|> assign(:shell_overlay, nil)
|
|> assign(:shell_overlay, nil)
|
||||||
|> assign(:tab_meta, Map.delete(socket.assigns.tab_meta, {:post, post_id}))
|
|> assign(:tab_meta, Map.delete(socket.assigns.tab_meta, {:post, post_id}))
|
||||||
|> assign(:post_editor_drafts, Map.delete(socket.assigns.post_editor_drafts, post_id))
|
|
||||||
|> assign(
|
|
||||||
:post_editor_active_languages,
|
|
||||||
Map.delete(socket.assigns.post_editor_active_languages, post_id)
|
|
||||||
)
|
|
||||||
|> assign(
|
|
||||||
:post_editor_tag_queries,
|
|
||||||
Map.delete(socket.assigns.post_editor_tag_queries, post_id)
|
|
||||||
)
|
|
||||||
|> assign(
|
|
||||||
:post_editor_category_queries,
|
|
||||||
Map.delete(socket.assigns.post_editor_category_queries, post_id)
|
|
||||||
)
|
|
||||||
|> assign(
|
|
||||||
:post_editor_quick_actions_open,
|
|
||||||
Map.delete(socket.assigns.post_editor_quick_actions_open, post_id)
|
|
||||||
)
|
|
||||||
|> assign(:post_editor_modes, Map.delete(socket.assigns.post_editor_modes, post_id))
|
|
||||||
|> assign(:post_editor_expanded, Map.delete(socket.assigns.post_editor_expanded, post_id))
|
|
||||||
|> assign(
|
|
||||||
:post_editor_save_states,
|
|
||||||
Map.delete(socket.assigns.post_editor_save_states, post_id)
|
|
||||||
)
|
|
||||||
|
|
||||||
{socket, workbench}
|
{socket, workbench}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -382,8 +382,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= cond do %>
|
<%= cond do %>
|
||||||
<% @current_tab.type == :post and @post_editor -> %>
|
<% @current_tab.type == :post -> %>
|
||||||
<PostEditor.post_editor post_editor={@post_editor} toolbar_buttons={BDS.Desktop.ShellLive.PanelRenderer.editor_toolbar_buttons(@current_tab)} />
|
<.live_component module={PostEditor} id={"post-editor-#{@current_tab.id}"} current_tab={@current_tab} offline_mode={@offline_mode} />
|
||||||
|
|
||||||
<% @current_tab.type == :media and @media_editor -> %>
|
<% @current_tab.type == :media and @media_editor -> %>
|
||||||
<MediaEditor.media_editor media_editor={@media_editor} />
|
<MediaEditor.media_editor media_editor={@media_editor} />
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@
|
|||||||
class="secondary quick-actions-btn"
|
class="secondary quick-actions-btn"
|
||||||
type="button"
|
type="button"
|
||||||
phx-click="toggle_post_editor_quick_actions"
|
phx-click="toggle_post_editor_quick_actions"
|
||||||
phx-value-id={@post_editor.id}
|
phx-target={@myself}
|
||||||
>
|
>
|
||||||
<span class="quick-actions-btn-icon">⚡</span>
|
<span class="quick-actions-btn-icon">⚡</span>
|
||||||
<span class="quick-actions-btn-label"><%= translated("Quick Actions") %></span>
|
<span class="quick-actions-btn-label"><%= translated("Quick Actions") %></span>
|
||||||
@@ -66,26 +66,26 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= if @post_editor.can_publish? do %>
|
<%= if @post_editor.can_publish? do %>
|
||||||
<button class="success" data-testid="post-publish-button" type="button" phx-click="publish_post_editor" phx-value-id={@post_editor.id}>
|
<button class="success" data-testid="post-publish-button" type="button" phx-click="publish_post_editor" phx-target={@myself}>
|
||||||
<%= translated("Publish") %>
|
<%= translated("Publish") %>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= if @post_editor.can_publish? do %>
|
<%= if @post_editor.can_publish? do %>
|
||||||
<button class="secondary danger" data-testid="post-discard-button" type="button" phx-click="discard_post_editor" phx-value-id={@post_editor.id} title={@post_editor.discard_title}>
|
<button class="secondary danger" data-testid="post-discard-button" type="button" phx-click="discard_post_editor" phx-target={@myself} title={@post_editor.discard_title}>
|
||||||
<%= @post_editor.discard_label %>
|
<%= @post_editor.discard_label %>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= if @post_editor.can_delete? do %>
|
<%= if @post_editor.can_delete? do %>
|
||||||
<button class="secondary danger" data-testid="post-delete-button" type="button" phx-click="delete_post_editor" phx-value-id={@post_editor.id}>
|
<button class="secondary danger" data-testid="post-delete-button" type="button" phx-click="delete_post_editor" phx-target={@myself}>
|
||||||
<%= translated("Delete") %>
|
<%= translated("Delete") %>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form class="post-editor-form editor-content" data-testid="post-editor-form" phx-change="change_post_editor">
|
<form class="post-editor-form editor-content" data-testid="post-editor-form" phx-change="change_post_editor" phx-target={@myself}>
|
||||||
<div class="metadata-toggle-header">
|
<div class="metadata-toggle-header">
|
||||||
<button class={["metadata-toggle", if(@post_editor.metadata_expanded, do: "expanded")]} type="button" phx-click="toggle_post_metadata" phx-value-id={@post_editor.id}>
|
<button class={["metadata-toggle", if(@post_editor.metadata_expanded, do: "expanded")]} type="button" phx-click="toggle_post_metadata" phx-target={@myself}>
|
||||||
<span class="metadata-toggle-chevron"><%= if @post_editor.metadata_expanded, do: "▼", else: "▶" %></span>
|
<span class="metadata-toggle-chevron"><%= if @post_editor.metadata_expanded, do: "▼", else: "▶" %></span>
|
||||||
<span><%= translated("Metadata") %></span>
|
<span><%= translated("Metadata") %></span>
|
||||||
</button>
|
</button>
|
||||||
@@ -100,8 +100,8 @@
|
|||||||
]}
|
]}
|
||||||
type="button"
|
type="button"
|
||||||
phx-click="select_post_editor_language"
|
phx-click="select_post_editor_language"
|
||||||
phx-value-id={@post_editor.id}
|
|
||||||
phx-value-language={flag.language}
|
phx-value-language={flag.language}
|
||||||
|
phx-target={@myself}
|
||||||
title={flag.label}
|
title={flag.label}
|
||||||
aria-label={flag.label}
|
aria-label={flag.label}
|
||||||
>
|
>
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
<%= for tag <- @post_editor.tag_chips do %>
|
<%= for tag <- @post_editor.tag_chips do %>
|
||||||
<span class={["tag-chip", if(tag.color, do: "has-color")]} style={tag_chip_style(tag.color)}>
|
<span class={["tag-chip", if(tag.color, do: "has-color")]} style={tag_chip_style(tag.color)}>
|
||||||
<span><%= tag.name %></span>
|
<span><%= tag.name %></span>
|
||||||
<button class="tag-chip-remove" type="button" phx-click="remove_post_editor_tag" phx-value-id={@post_editor.id} phx-value-tag={tag.name} aria-label={translated("Remove tag")}>×</button>
|
<button class="tag-chip-remove" type="button" phx-click="remove_post_editor_tag" phx-value-tag={tag.name} phx-target={@myself} aria-label={translated("Remove tag")}>×</button>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
<%= if String.trim(@post_editor.tag_query || "") != "" and (Enum.any?(@post_editor.tag_suggestions) or @post_editor.tag_query_addable?) do %>
|
<%= if String.trim(@post_editor.tag_query || "") != "" and (Enum.any?(@post_editor.tag_suggestions) or @post_editor.tag_query_addable?) do %>
|
||||||
<div class="tag-suggestions">
|
<div class="tag-suggestions">
|
||||||
<%= for tag <- @post_editor.tag_suggestions do %>
|
<%= for tag <- @post_editor.tag_suggestions do %>
|
||||||
<button class="tag-suggestion" type="button" phx-click="add_post_editor_tag" phx-value-id={@post_editor.id} phx-value-tag={tag.name}>
|
<button class="tag-suggestion" type="button" phx-click="add_post_editor_tag" phx-value-tag={tag.name} phx-target={@myself}>
|
||||||
<%= if tag.color do %>
|
<%= if tag.color do %>
|
||||||
<span class="tag-suggestion-color" style={"background-color: #{tag.color}"}></span>
|
<span class="tag-suggestion-color" style={"background-color: #{tag.color}"}></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= if @post_editor.tag_query_addable? do %>
|
<%= if @post_editor.tag_query_addable? do %>
|
||||||
<button class="tag-suggestion create-new" type="button" phx-click="add_post_editor_tag" phx-value-id={@post_editor.id} phx-value-tag={@post_editor.tag_query}>
|
<button class="tag-suggestion create-new" type="button" phx-click="add_post_editor_tag" phx-value-tag={@post_editor.tag_query} phx-target={@myself}>
|
||||||
<span class="tag-suggestion-icon">+</span>
|
<span class="tag-suggestion-icon">+</span>
|
||||||
<span><%= translated("Create tag") %>: <strong><%= @post_editor.tag_query %></strong></span>
|
<span><%= translated("Create tag") %>: <strong><%= @post_editor.tag_query %></strong></span>
|
||||||
</button>
|
</button>
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
data-testid="post-detect-language-button"
|
data-testid="post-detect-language-button"
|
||||||
type="button"
|
type="button"
|
||||||
phx-click="detect_post_editor_language"
|
phx-click="detect_post_editor_language"
|
||||||
phx-value-id={@post_editor.id}
|
phx-target={@myself}
|
||||||
disabled={not @post_editor.detect_language_enabled?}
|
disabled={not @post_editor.detect_language_enabled?}
|
||||||
>
|
>
|
||||||
<%= translated("Detect") %>
|
<%= translated("Detect") %>
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
<%= for category <- @post_editor.category_values do %>
|
<%= for category <- @post_editor.category_values do %>
|
||||||
<span class="tag-chip">
|
<span class="tag-chip">
|
||||||
<span><%= category %></span>
|
<span><%= category %></span>
|
||||||
<button class="tag-chip-remove" type="button" phx-click="remove_post_editor_category" phx-value-id={@post_editor.id} phx-value-category={category} aria-label={translated("Remove category")}>×</button>
|
<button class="tag-chip-remove" type="button" phx-click="remove_post_editor_category" phx-value-category={category} phx-target={@myself} aria-label={translated("Remove category")}>×</button>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
@@ -228,13 +228,13 @@
|
|||||||
<%= if String.trim(@post_editor.category_query || "") != "" and (Enum.any?(@post_editor.category_suggestions) or @post_editor.category_query_addable?) do %>
|
<%= if String.trim(@post_editor.category_query || "") != "" and (Enum.any?(@post_editor.category_suggestions) or @post_editor.category_query_addable?) do %>
|
||||||
<div class="tag-suggestions">
|
<div class="tag-suggestions">
|
||||||
<%= for category <- @post_editor.category_suggestions do %>
|
<%= for category <- @post_editor.category_suggestions do %>
|
||||||
<button class="tag-suggestion" type="button" phx-click="add_post_editor_category" phx-value-id={@post_editor.id} phx-value-category={category}>
|
<button class="tag-suggestion" type="button" phx-click="add_post_editor_category" phx-value-category={category} phx-target={@myself}>
|
||||||
<span class="tag-suggestion-name"><%= category %></span>
|
<span class="tag-suggestion-name"><%= category %></span>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= if @post_editor.category_query_addable? do %>
|
<%= if @post_editor.category_query_addable? do %>
|
||||||
<button class="tag-suggestion create-new" type="button" phx-click="add_post_editor_category" phx-value-id={@post_editor.id} phx-value-category={@post_editor.category_query}>
|
<button class="tag-suggestion create-new" type="button" phx-click="add_post_editor_category" phx-value-category={@post_editor.category_query} phx-target={@myself}>
|
||||||
<span class="tag-suggestion-icon">+</span>
|
<span class="tag-suggestion-icon">+</span>
|
||||||
<span><%= translated("Create category") %>: <strong><%= @post_editor.category_query %></strong></span>
|
<span><%= translated("Create category") %>: <strong><%= @post_editor.category_query %></strong></span>
|
||||||
</button>
|
</button>
|
||||||
@@ -308,7 +308,7 @@
|
|||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class={["metadata-toggle", if(@post_editor.excerpt_expanded, do: "expanded")]} type="button" phx-click="toggle_post_excerpt" phx-value-id={@post_editor.id}>
|
<button class={["metadata-toggle", if(@post_editor.excerpt_expanded, do: "expanded")]} type="button" phx-click="toggle_post_excerpt" phx-target={@myself}>
|
||||||
<span class="metadata-toggle-chevron"><%= if @post_editor.excerpt_expanded, do: "▼", else: "▶" %></span>
|
<span class="metadata-toggle-chevron"><%= if @post_editor.excerpt_expanded, do: "▼", else: "▶" %></span>
|
||||||
<span><%= translated("Excerpt") %></span>
|
<span><%= translated("Excerpt") %></span>
|
||||||
</button>
|
</button>
|
||||||
@@ -333,8 +333,8 @@
|
|||||||
class={if(@post_editor.mode == mode, do: "active")}
|
class={if(@post_editor.mode == mode, do: "active")}
|
||||||
type="button"
|
type="button"
|
||||||
phx-click="set_post_editor_mode"
|
phx-click="set_post_editor_mode"
|
||||||
phx-value-id={@post_editor.id}
|
|
||||||
phx-value-mode={mode}
|
phx-value-mode={mode}
|
||||||
|
phx-target={@myself}
|
||||||
>
|
>
|
||||||
<%= post_editor_mode_label(mode) %>
|
<%= post_editor_mode_label(mode) %>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -863,6 +863,7 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
|> render_change()
|
|> render_change()
|
||||||
|
|
||||||
_html = render_hook(view, "native_menu_action", %{"action" => "save"})
|
_html = render_hook(view, "native_menu_action", %{"action" => "save"})
|
||||||
|
_html = render(view)
|
||||||
|
|
||||||
saved_post = Posts.get_post!(post.id)
|
saved_post = Posts.get_post!(post.id)
|
||||||
assert saved_post.title == "Saved Through Menu"
|
assert saved_post.title == "Saved Through Menu"
|
||||||
@@ -2096,26 +2097,35 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
refute html =~ "gallery-button"
|
refute html =~ "gallery-button"
|
||||||
refute html =~ "Desktop workbench content routed through the Elixir shell."
|
refute html =~ "Desktop workbench content routed through the Elixir shell."
|
||||||
|
|
||||||
html = render_click(view, "toggle_post_editor_quick_actions", %{"id" => post.id})
|
html =
|
||||||
|
view
|
||||||
|
|> element("[data-testid='post-editor'] .quick-actions-btn")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
assert html =~ "quick-actions-menu"
|
assert html =~ "quick-actions-menu"
|
||||||
assert html =~ "quick-action-item"
|
assert html =~ "quick-action-item"
|
||||||
assert html =~ "quick-actions-divider"
|
assert html =~ "quick-actions-divider"
|
||||||
|
|
||||||
html = render_click(view, "set_post_editor_mode", %{"id" => post.id, "mode" => "preview"})
|
html =
|
||||||
|
view
|
||||||
|
|> element("[phx-click='set_post_editor_mode'][phx-value-mode='preview']")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
assert html =~ ~s(data-testid="post-editor-preview")
|
assert html =~ ~s(data-testid="post-editor-preview")
|
||||||
assert html =~ "editor-preview-frame"
|
assert html =~ "editor-preview-frame"
|
||||||
refute html =~ ~s(data-testid="post-editor-content")
|
refute html =~ ~s(data-testid="post-editor-content")
|
||||||
|
|
||||||
html = render_click(view, "set_post_editor_mode", %{"id" => post.id, "mode" => "markdown"})
|
html =
|
||||||
|
view
|
||||||
|
|> element("[phx-click='set_post_editor_mode'][phx-value-mode='markdown']")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
assert html =~ ~s(data-testid="post-editor-content")
|
assert html =~ ~s(data-testid="post-editor-content")
|
||||||
assert html =~ ~s(data-monaco-language="markdown-with-macros")
|
assert html =~ ~s(data-monaco-language="markdown-with-macros")
|
||||||
assert html =~ ~s(phx-hook="MonacoEditor")
|
assert html =~ ~s(phx-hook="MonacoEditor")
|
||||||
refute html =~ "post-editor-markdown-highlight"
|
refute html =~ "post-editor-markdown-highlight"
|
||||||
|
|
||||||
html =
|
_html =
|
||||||
view
|
view
|
||||||
|> form("[data-testid='post-editor-form']", %{
|
|> form("[data-testid='post-editor-form']", %{
|
||||||
post_editor: %{
|
post_editor: %{
|
||||||
@@ -2131,10 +2141,12 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
})
|
})
|
||||||
|> render_change()
|
|> render_change()
|
||||||
|
|
||||||
|
html = render(view)
|
||||||
assert html =~ ~s(class="tab active dirty")
|
assert html =~ ~s(class="tab active dirty")
|
||||||
assert html =~ "Updated Shell Post"
|
assert html =~ "Updated Shell Post"
|
||||||
|
|
||||||
_html = render_click(view, "save_post_editor", %{"id" => post.id})
|
_html = render_hook(view, "native_menu_action", %{"action" => "save"})
|
||||||
|
_html = render(view)
|
||||||
|
|
||||||
saved_post = Posts.get_post!(post.id)
|
saved_post = Posts.get_post!(post.id)
|
||||||
assert saved_post.title == "Updated Shell Post"
|
assert saved_post.title == "Updated Shell Post"
|
||||||
@@ -2145,7 +2157,10 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
assert saved_post.author == "Ada Lovelace"
|
assert saved_post.author == "Ada Lovelace"
|
||||||
assert saved_post.language == "de"
|
assert saved_post.language == "de"
|
||||||
|
|
||||||
html = render_click(view, "publish_post_editor", %{"id" => post.id})
|
html =
|
||||||
|
view
|
||||||
|
|> element("[data-testid='post-publish-button']")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
assert html =~ ~s(data-testid="post-status-badge")
|
assert html =~ ~s(data-testid="post-status-badge")
|
||||||
assert html =~ ~s(data-testid="post-delete-button")
|
assert html =~ ~s(data-testid="post-delete-button")
|
||||||
@@ -2169,10 +2184,14 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
})
|
})
|
||||||
|> render_change()
|
|> render_change()
|
||||||
|
|
||||||
_html = render_click(view, "save_post_editor", %{"id" => post.id})
|
_html = render_hook(view, "native_menu_action", %{"action" => "save"})
|
||||||
|
_html = render(view)
|
||||||
assert Posts.get_post!(post.id).status == :draft
|
assert Posts.get_post!(post.id).status == :draft
|
||||||
|
|
||||||
html = render_click(view, "discard_post_editor", %{"id" => post.id})
|
html =
|
||||||
|
view
|
||||||
|
|> element("[data-testid='post-discard-button']")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
discarded_post = Posts.get_post!(post.id)
|
discarded_post = Posts.get_post!(post.id)
|
||||||
assert html =~ "Updated Shell Post"
|
assert html =~ "Updated Shell Post"
|
||||||
|
|||||||
@@ -379,8 +379,8 @@ defmodule BDS.UI.ShellTest do
|
|||||||
"/Users/gb/Projects/bDS2/lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex"
|
"/Users/gb/Projects/bDS2/lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex"
|
||||||
)
|
)
|
||||||
|
|
||||||
assert template =~ "<PostEditor.post_editor"
|
assert template =~ "<.live_component module={PostEditor}"
|
||||||
assert post_editor_ex =~ "def build(%{current_tab: %{type: :post, id: post_id}} = assigns)"
|
assert post_editor_ex =~ "defp build_data(socket)"
|
||||||
|
|
||||||
assert Regex.match?(
|
assert Regex.match?(
|
||||||
~r/class="secondary quick-actions-btn".*?<span class="quick-actions-btn-icon">⚡<\/span>\s*<span class="quick-actions-btn-label"><%= translated\("Quick Actions"\) %><\/span>/s,
|
~r/class="secondary quick-actions-btn".*?<span class="quick-actions-btn-icon">⚡<\/span>\s*<span class="quick-actions-btn-label"><%= translated\("Quick Actions"\) %><\/span>/s,
|
||||||
|
|||||||
Reference in New Issue
Block a user