fix: reworking some code smell issues
This commit is contained in:
@@ -18,6 +18,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
MediaEditor,
|
||||
MenuEditor,
|
||||
MiscEditor,
|
||||
NativeMenuEvents,
|
||||
OverlayManager,
|
||||
ScriptEditor,
|
||||
SettingsEditor,
|
||||
@@ -81,6 +82,8 @@ defmodule BDS.Desktop.ShellLive do
|
||||
|
||||
@git_action_events ["git_fetch", "git_pull", "git_push", "git_prune_lfs"]
|
||||
|
||||
@native_menu_events NativeMenuEvents.events()
|
||||
|
||||
@layout_menu_actions MapSet.new([
|
||||
:toggle_sidebar,
|
||||
:toggle_panel,
|
||||
@@ -524,31 +527,8 @@ defmodule BDS.Desktop.ShellLive do
|
||||
{:noreply, reload_shell(socket, SessionUtil.restore_workbench_session(session_payload))}
|
||||
end
|
||||
|
||||
def handle_event("native_menu_action", %{"action" => action}, socket) do
|
||||
{:noreply, handle_native_menu_action(socket, action)}
|
||||
end
|
||||
|
||||
def handle_event("titlebar_menu_keydown", %{"key" => key}, socket) do
|
||||
{:noreply, TitlebarMenu.handle_keydown(socket, key, &handle_native_menu_action/2)}
|
||||
end
|
||||
|
||||
def handle_event("toggle_titlebar_menu", %{"group" => group}, socket) do
|
||||
{:noreply, TitlebarMenu.toggle(socket, group)}
|
||||
end
|
||||
|
||||
def handle_event("hover_titlebar_menu", %{"group" => group}, socket) do
|
||||
{:noreply, TitlebarMenu.hover(socket, group)}
|
||||
end
|
||||
|
||||
def handle_event("close_titlebar_menu", _params, socket) do
|
||||
{:noreply, TitlebarMenu.close(socket)}
|
||||
end
|
||||
|
||||
def handle_event("titlebar_menu_action", %{"action" => action}, socket) do
|
||||
{:noreply,
|
||||
socket
|
||||
|> TitlebarMenu.close()
|
||||
|> handle_native_menu_action(action)}
|
||||
def handle_event(event, params, socket) when event in @native_menu_events do
|
||||
NativeMenuEvents.handle(event, params, socket, &handle_native_menu_action/2)
|
||||
end
|
||||
|
||||
@impl true
|
||||
|
||||
@@ -90,12 +90,10 @@ defmodule BDS.Desktop.ShellLive.ChatEditor do
|
||||
end
|
||||
|
||||
def handle_event("send_chat_editor_message", _params, socket) do
|
||||
Logger.info("CHAT send_chat_editor_message called, input=#{inspect(socket.assigns.input)}")
|
||||
{:noreply, do_send_message(socket)}
|
||||
end
|
||||
|
||||
def handle_event("abort_chat_editor_message", _params, socket) do
|
||||
Logger.info("CHAT abort_chat_editor_message called")
|
||||
{:noreply, do_abort_message(socket)}
|
||||
end
|
||||
|
||||
@@ -581,8 +579,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor do
|
||||
def chart_width(_max_value, _value), do: 0
|
||||
|
||||
@spec truthy?(term()) :: boolean()
|
||||
def truthy?(value) when value in [true, "true", 1, "1", "on"], do: true
|
||||
def truthy?(_value), do: false
|
||||
def truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
# ── HEEx components ───────────────────────────────────────────────────────
|
||||
|
||||
|
||||
@@ -303,6 +303,5 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolSurfaces do
|
||||
|
||||
defp map_value(_map, _key, default), do: default
|
||||
|
||||
defp truthy?(value) when value in [true, "true", 1, "1", "on"], do: true
|
||||
defp truthy?(_value), do: false
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
end
|
||||
|
||||
@@ -1452,6 +1452,6 @@ defmodule BDS.Desktop.ShellLive.ImportEditor do
|
||||
Map.get(item, :resolution) in ["overwrite", "merge"]
|
||||
end
|
||||
|
||||
defp present?(value), do: value not in [nil, ""]
|
||||
defp blank?(value), do: value in [nil, ""]
|
||||
defp present?(value), do: BDS.Values.present?(value)
|
||||
defp blank?(value), do: BDS.Values.blank?(value)
|
||||
end
|
||||
|
||||
@@ -310,5 +310,5 @@ defmodule BDS.Desktop.ShellLive.ImportEditor.AnalysisState do
|
||||
@spec translate_phase(term()) :: term()
|
||||
def translate_phase(other), do: other
|
||||
|
||||
defp present?(value), do: value not in [nil, ""]
|
||||
defp present?(value), do: BDS.Values.present?(value)
|
||||
end
|
||||
|
||||
@@ -284,5 +284,5 @@ defmodule BDS.Desktop.ShellLive.ImportEditor.TaxonomyEditing do
|
||||
def maybe_put_option(opts, _key, nil), do: opts
|
||||
def maybe_put_option(opts, key, value), do: Keyword.put(opts, key, value)
|
||||
|
||||
defp present?(value), do: value not in [nil, ""]
|
||||
defp present?(value), do: BDS.Values.present?(value)
|
||||
end
|
||||
|
||||
52
lib/bds/desktop/shell_live/native_menu_events.ex
Normal file
52
lib/bds/desktop/shell_live/native_menu_events.ex
Normal file
@@ -0,0 +1,52 @@
|
||||
defmodule BDS.Desktop.ShellLive.NativeMenuEvents do
|
||||
@moduledoc """
|
||||
Native- and titlebar-menu LiveView events extracted from `BDS.Desktop.ShellLive`.
|
||||
|
||||
`ShellLive` routes the events listed in `events/0` here via a single delegating
|
||||
`handle_event/3`, passing its `handle_native_menu_action/2` callback so the
|
||||
menu-action dispatch logic stays owned by `ShellLive`.
|
||||
"""
|
||||
|
||||
alias BDS.Desktop.ShellLive.TitlebarMenu
|
||||
|
||||
@events ~w(
|
||||
native_menu_action
|
||||
titlebar_menu_keydown
|
||||
toggle_titlebar_menu
|
||||
hover_titlebar_menu
|
||||
close_titlebar_menu
|
||||
titlebar_menu_action
|
||||
)
|
||||
|
||||
@doc "Event names handled by this module."
|
||||
@spec events() :: [String.t()]
|
||||
def events, do: @events
|
||||
|
||||
@typep socket :: Phoenix.LiveView.Socket.t()
|
||||
@typep native_action :: (socket(), String.t() -> socket())
|
||||
|
||||
@spec handle(String.t(), map(), socket(), native_action()) :: {:noreply, socket()}
|
||||
def handle("native_menu_action", %{"action" => action}, socket, native_action) do
|
||||
{:noreply, native_action.(socket, action)}
|
||||
end
|
||||
|
||||
def handle("titlebar_menu_keydown", %{"key" => key}, socket, native_action) do
|
||||
{:noreply, TitlebarMenu.handle_keydown(socket, key, native_action)}
|
||||
end
|
||||
|
||||
def handle("toggle_titlebar_menu", %{"group" => group}, socket, _native_action) do
|
||||
{:noreply, TitlebarMenu.toggle(socket, group)}
|
||||
end
|
||||
|
||||
def handle("hover_titlebar_menu", %{"group" => group}, socket, _native_action) do
|
||||
{:noreply, TitlebarMenu.hover(socket, group)}
|
||||
end
|
||||
|
||||
def handle("close_titlebar_menu", _params, socket, _native_action) do
|
||||
{:noreply, TitlebarMenu.close(socket)}
|
||||
end
|
||||
|
||||
def handle("titlebar_menu_action", %{"action" => action}, socket, native_action) do
|
||||
{:noreply, socket |> TitlebarMenu.close() |> native_action.(action)}
|
||||
end
|
||||
end
|
||||
@@ -7,12 +7,17 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
import Ecto.Query
|
||||
require Logger
|
||||
|
||||
alias BDS.{I18n, Media, Metadata, Posts, Repo}
|
||||
alias BDS.{I18n, Media, Metadata, Posts, Repo, Slug, Strings}
|
||||
alias BDS.Media.Media, as: MediaRecord
|
||||
alias BDS.Media.Translation, as: MediaTranslation
|
||||
alias BDS.Posts.{Post, PostMedia, Translation}
|
||||
alias BDS.Tags.Tag
|
||||
|
||||
# Expected data/DB exceptions for the overlay fallbacks below. Narrowed (not a
|
||||
# broad `rescue error ->`) so programmer bugs (MatchError, FunctionClauseError)
|
||||
# surface unmodified instead of being swallowed into a fallback value.
|
||||
@overlay_rescue [Ecto.NoResultsError, Ecto.QueryError, DBConnection.ConnectionError]
|
||||
|
||||
embed_templates("overlay_html/*")
|
||||
|
||||
def context(assigns, tab_title, tab_subtitle) do
|
||||
@@ -71,8 +76,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
{:ok, metadata} = Metadata.get_project_metadata(project_id)
|
||||
metadata
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("project metadata", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("project metadata", error)
|
||||
%{main_language: "en", blog_languages: []}
|
||||
end
|
||||
|
||||
@@ -140,8 +145,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
select: pm.media_id
|
||||
)
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("post media ids for #{post_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("post media ids for #{post_id}", error)
|
||||
[]
|
||||
end
|
||||
|
||||
@@ -155,8 +160,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
)
|
||||
|> Map.new(fn {language, status} -> {language, Atom.to_string(status || :draft)} end)
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("post translations for #{post_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("post translations for #{post_id}", error)
|
||||
%{}
|
||||
end
|
||||
|
||||
@@ -168,8 +173,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
)
|
||||
|> Map.new(fn {language, status} -> {language, status} end)
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("media translations for #{media_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("media translations for #{media_id}", error)
|
||||
%{}
|
||||
end
|
||||
|
||||
@@ -188,8 +193,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
_other -> metadata.main_language || "en"
|
||||
end
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("post source language for #{post_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("post source language for #{post_id}", error)
|
||||
metadata.main_language || "en"
|
||||
end
|
||||
|
||||
@@ -199,21 +204,16 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
_other -> metadata.main_language || "en"
|
||||
end
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("media source language for #{media_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("media source language for #{media_id}", error)
|
||||
metadata.main_language || "en"
|
||||
end
|
||||
|
||||
defp source_language(_tab, metadata), do: metadata.main_language || "en"
|
||||
|
||||
defp language_names do
|
||||
%{
|
||||
"en" => "English",
|
||||
"de" => "Deutsch",
|
||||
"fr" => "Francais",
|
||||
"it" => "Italiano",
|
||||
"es" => "Espanol"
|
||||
}
|
||||
I18n.supported_languages()
|
||||
|> Enum.into(%{}, fn language -> {language.code, I18n.language_name(language.code)} end)
|
||||
end
|
||||
|
||||
defp language_flags do
|
||||
@@ -244,7 +244,7 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
%{
|
||||
key: "slug",
|
||||
label: BDS.Gettext.lgettext(page_language, "ui", "Slug"),
|
||||
current_value: post.slug || slugify(post.title || title),
|
||||
current_value: post.slug || Slug.slugify(post.title || title),
|
||||
suggested_value: "",
|
||||
locked: post.status == :published,
|
||||
loading: true
|
||||
@@ -255,8 +255,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
[]
|
||||
end
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("post AI fields for #{post_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("post AI fields for #{post_id}", error)
|
||||
[]
|
||||
end
|
||||
|
||||
@@ -294,8 +294,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
[]
|
||||
end
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("media AI fields for #{media_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("media AI fields for #{media_id}", error)
|
||||
[]
|
||||
end
|
||||
|
||||
@@ -326,8 +326,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
reference_list: reference_list
|
||||
}
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("delete media details for #{media_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("delete media details for #{media_id}", error)
|
||||
|
||||
%{
|
||||
title: BDS.Gettext.lgettext(page_language, "ui", "Delete Media"),
|
||||
@@ -349,8 +349,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
reference_list: []
|
||||
}
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("delete tag details", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("delete tag details", error)
|
||||
|
||||
%{
|
||||
title: BDS.Gettext.lgettext(page_language, "ui", "Delete Tag"),
|
||||
@@ -388,8 +388,8 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
message: BDS.Gettext.lgettext(page_language, "ui", "Cannot be undone.")
|
||||
}
|
||||
rescue
|
||||
error ->
|
||||
log_overlay_warning("merge tag details for project #{project_id}", error)
|
||||
error in @overlay_rescue ->
|
||||
log_overlay_error("merge tag details for project #{project_id}", error)
|
||||
|
||||
%{
|
||||
target: "tag",
|
||||
@@ -402,20 +402,10 @@ defmodule BDS.Desktop.ShellLive.OverlayComponents do
|
||||
defp canonical_post_url(post) do
|
||||
timestamp = post.published_at || post.updated_at || System.system_time(:millisecond)
|
||||
date = DateTime.from_unix!(timestamp, :millisecond)
|
||||
"/#{date.year}/#{pad2(date.month)}/#{pad2(date.day)}/#{post.slug || post.id}"
|
||||
"/#{date.year}/#{Strings.pad2(date.month)}/#{Strings.pad2(date.day)}/#{post.slug || post.id}"
|
||||
end
|
||||
|
||||
defp pad2(value), do: value |> Integer.to_string() |> String.pad_leading(2, "0")
|
||||
|
||||
defp slugify(value) do
|
||||
value
|
||||
|> to_string()
|
||||
|> String.downcase()
|
||||
|> String.replace(~r/[^a-z0-9]+/u, "-")
|
||||
|> String.trim("-")
|
||||
end
|
||||
|
||||
defp log_overlay_warning(context, error) do
|
||||
Logger.warning("overlay component fallback for #{context}: #{Exception.message(error)}")
|
||||
defp log_overlay_error(context, error) do
|
||||
Logger.error("overlay component fallback for #{context}: #{Exception.message(error)}")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -300,5 +300,5 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
|
||||
"#{rounded}%"
|
||||
end
|
||||
|
||||
defp present?(value), do: value not in [nil, ""]
|
||||
defp present?(value), do: BDS.Values.present?(value)
|
||||
end
|
||||
|
||||
@@ -227,8 +227,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor.DraftManagement do
|
||||
active_language == canonical_language or not Map.has_key?(translations, active_language)
|
||||
end
|
||||
|
||||
defp truthy?(value) when value in [true, "true", "on", 1, "1"], do: true
|
||||
defp truthy?(_value), do: false
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
defp blank_to_nil(value) do
|
||||
value
|
||||
|
||||
@@ -201,18 +201,15 @@ defmodule BDS.Desktop.ShellLive.PostEditor.PostMetadata do
|
||||
|
||||
defp canonical_preview_path(created_at_ms, slug) do
|
||||
datetime = DateTime.from_unix!(created_at_ms, :millisecond)
|
||||
"/#{datetime.year}/#{pad2(datetime.month)}/#{pad2(datetime.day)}/#{slug || ""}"
|
||||
"/#{datetime.year}/#{BDS.Strings.pad2(datetime.month)}/#{BDS.Strings.pad2(datetime.day)}/#{slug || ""}"
|
||||
end
|
||||
|
||||
defp pad2(value), do: value |> Integer.to_string() |> String.pad_leading(2, "0")
|
||||
|
||||
defp maybe_put_query(query, _key, false), do: query
|
||||
defp maybe_put_query(query, _key, nil), do: query
|
||||
defp maybe_put_query(query, key, value), do: Map.put(query, key, value)
|
||||
|
||||
def truthy?(value) when value in [true, "true", "on", 1, "1"], do: true
|
||||
@spec truthy?(term()) :: term()
|
||||
def truthy?(_value), do: false
|
||||
@spec truthy?(term()) :: boolean()
|
||||
def truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
@spec blank?(term()) :: term()
|
||||
def blank?(value), do: blank_to_nil(value) == nil
|
||||
|
||||
@@ -312,7 +312,7 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.AISettings do
|
||||
defp normalize_endpoint_result({:ok, _endpoint}), do: :ok
|
||||
defp normalize_endpoint_result({:error, reason}), do: {:error, reason}
|
||||
|
||||
defp truthy?(value), do: value in [true, "true", "on", "1", 1]
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
defp blank_to_nil(nil), do: nil
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.EditorSettings do
|
||||
}
|
||||
end
|
||||
|
||||
defp truthy?(value), do: value in [true, "true", "on", "1", 1]
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
defp boolean_string(true), do: "true"
|
||||
defp boolean_string(false), do: "false"
|
||||
end
|
||||
|
||||
@@ -187,7 +187,7 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.ManagedCategories do
|
||||
end)
|
||||
end
|
||||
|
||||
defp truthy?(value), do: value in [true, "true", "on", "1", 1]
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
defp blank_to_nil(nil), do: nil
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.ProjectSettings do
|
||||
}
|
||||
end
|
||||
|
||||
defp truthy?(value), do: value in [true, "true", "on", "1", 1]
|
||||
defp truthy?(value), do: BDS.Values.truthy?(value)
|
||||
|
||||
defp parse_integer(nil, fallback), do: fallback
|
||||
defp parse_integer(value, _fallback) when is_integer(value), do: value
|
||||
|
||||
Reference in New Issue
Block a user