fix: refactorings to remove anti-patterns
This commit is contained in:
@@ -2,6 +2,7 @@ defmodule BDS.Desktop.Automation do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
require Logger
|
||||
|
||||
@ready_timeout 60_000
|
||||
@request_timeout 30_000
|
||||
@@ -13,7 +14,9 @@ defmodule BDS.Desktop.Automation do
|
||||
def stop_session(session) do
|
||||
GenServer.stop(session, :normal, @request_timeout)
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed desktop automation stop_session exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
def snapshot(session) do
|
||||
@@ -220,7 +223,12 @@ defmodule BDS.Desktop.Automation do
|
||||
defp safe_driver_request(state, payload) do
|
||||
driver_request(state, payload)
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug(
|
||||
"swallowed desktop automation safe_driver_request error: #{inspect(error)} payload=#{inspect(payload)}"
|
||||
)
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
defp shutdown_driver(state) do
|
||||
@@ -368,7 +376,9 @@ defmodule BDS.Desktop.Automation do
|
||||
defp safe_close_port(port) do
|
||||
Port.close(port)
|
||||
catch
|
||||
:error, _reason -> :ok
|
||||
:error, reason ->
|
||||
Logger.debug("swallowed desktop automation safe_close_port error: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
defp normalize_simple_reply("ok"), do: :ok
|
||||
|
||||
@@ -66,7 +66,9 @@ defmodule BDS.Desktop.DeepLink do
|
||||
try do
|
||||
Desktop.Env.subscribe()
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed deep_link Desktop.Env.subscribe exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ defmodule BDS.Desktop.MainWindow do
|
||||
use GenServer
|
||||
|
||||
alias Desktop.Window
|
||||
require Logger
|
||||
|
||||
@window_id __MODULE__
|
||||
@server_name BDS.Desktop.MainWindow.Watcher
|
||||
@@ -22,7 +23,9 @@ defmodule BDS.Desktop.MainWindow do
|
||||
def persist_now(timeout \\ 100) do
|
||||
GenServer.call(@server_name, :persist_bounds_now, timeout)
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed main_window persist_now exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
def window_options(extra_opts \\ []) do
|
||||
@@ -169,10 +172,17 @@ defmodule BDS.Desktop.MainWindow do
|
||||
end
|
||||
end)
|
||||
rescue
|
||||
ErlangError -> nil
|
||||
FunctionClauseError -> nil
|
||||
error in ErlangError ->
|
||||
Logger.debug("swallowed main_window restore_bounds error: #{inspect(error)}")
|
||||
nil
|
||||
|
||||
error in FunctionClauseError ->
|
||||
Logger.debug("swallowed main_window restore_bounds error: #{inspect(error)}")
|
||||
nil
|
||||
catch
|
||||
:exit, _reason -> nil
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed main_window restore_bounds exit: #{inspect(reason)}")
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
Bridges,
|
||||
ChatEditor,
|
||||
GalleryImport,
|
||||
GitHandler,
|
||||
ImportEditor,
|
||||
MediaEditor,
|
||||
MenuEditor,
|
||||
@@ -22,6 +23,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
SettingsEditor,
|
||||
SidebarDelete,
|
||||
TagsEditor,
|
||||
TabActions,
|
||||
TemplateEditor
|
||||
}
|
||||
|
||||
@@ -34,13 +36,14 @@ defmodule BDS.Desktop.ShellLive do
|
||||
alias BDS.Desktop.ShellLive.{
|
||||
ChatSurface,
|
||||
Layout,
|
||||
PanelRenderer,
|
||||
SessionUtil,
|
||||
ShellCommandRunner,
|
||||
SidebarCreate,
|
||||
SocketState,
|
||||
TabHelpers,
|
||||
TaskLocalization,
|
||||
TitlebarMenu
|
||||
TitlebarMenu,
|
||||
UrlState
|
||||
}
|
||||
|
||||
import TaskLocalization,
|
||||
@@ -64,8 +67,6 @@ defmodule BDS.Desktop.ShellLive do
|
||||
@refresh_interval 1_500
|
||||
|
||||
def refresh_interval, do: @refresh_interval
|
||||
|
||||
@output_entry_limit 20
|
||||
@sidebar_filter_events [
|
||||
"toggle_sidebar_filters",
|
||||
"toggle_sidebar_archive",
|
||||
@@ -180,7 +181,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
|> assign(:panel_git_entries, [])
|
||||
|> assign(:auto_save_timers, %{})
|
||||
|> reload_shell(workbench)
|
||||
|> apply_url_params(params)
|
||||
|> UrlState.apply_params(params)
|
||||
|> tap(&sync_menu_bar_locale/1)}
|
||||
end
|
||||
|
||||
@@ -208,7 +209,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
{:noreply,
|
||||
socket
|
||||
|> refresh_sidebar(workbench)
|
||||
|> push_url_state()}
|
||||
|> UrlState.push()}
|
||||
end
|
||||
|
||||
def handle_event("select_panel_tab", %{"tab" => tab}, socket) do
|
||||
@@ -241,17 +242,18 @@ defmodule BDS.Desktop.ShellLive do
|
||||
end
|
||||
|
||||
def handle_event(event, _params, socket) when event in @git_action_events do
|
||||
{:noreply, run_git_action(socket, event)}
|
||||
{:noreply, GitHandler.run_action(socket, event)}
|
||||
end
|
||||
|
||||
def handle_event("git_commit", params, socket) do
|
||||
message = params |> get_in(["git", "message"]) |> to_string() |> String.trim()
|
||||
{:noreply, commit_git(socket, message)}
|
||||
|
||||
{:noreply, GitHandler.commit(socket, message)}
|
||||
end
|
||||
|
||||
def handle_event("git_initialize", params, socket) do
|
||||
remote_url = params |> get_in(["git", "remote_url"]) |> normalize_git_remote_url()
|
||||
{:noreply, initialize_git(socket, remote_url)}
|
||||
remote_url = params |> get_in(["git", "remote_url"]) |> GitHandler.normalize_remote_url()
|
||||
{:noreply, GitHandler.initialize(socket, remote_url)}
|
||||
end
|
||||
|
||||
def handle_event("create_sidebar_item", %{"kind" => kind}, socket) do
|
||||
@@ -270,7 +272,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
end
|
||||
|
||||
def handle_event("select_tab", %{"type" => type, "id" => id}, socket) do
|
||||
socket = auto_save_current_post(socket)
|
||||
socket = TabActions.auto_save_current_post(socket)
|
||||
|
||||
workbench =
|
||||
Workbench.open_tab(
|
||||
@@ -286,11 +288,11 @@ defmodule BDS.Desktop.ShellLive do
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> refresh_layout(workbench)
|
||||
|> push_url_state()}
|
||||
|> UrlState.push()}
|
||||
end
|
||||
|
||||
def handle_event("close_tab", %{"type" => type, "id" => id}, socket) do
|
||||
socket = auto_save_current_post(socket)
|
||||
socket = TabActions.auto_save_current_post(socket)
|
||||
|
||||
type_atom = BoundedAtoms.editor_route(type, :post)
|
||||
workbench = Workbench.close_tab(socket.assigns.workbench, type_atom, id)
|
||||
@@ -300,7 +302,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> refresh_layout(workbench)
|
||||
|> push_url_state()}
|
||||
|> UrlState.push()}
|
||||
end
|
||||
|
||||
def handle_event(
|
||||
@@ -722,167 +724,9 @@ defmodule BDS.Desktop.ShellLive do
|
||||
index(assigns)
|
||||
end
|
||||
|
||||
defp refresh_layout(socket, workbench) do
|
||||
git_badge_count = socket.assigns[:git_badge_count] || 0
|
||||
activity_buttons = Workbench.activity_buttons(workbench, git_badge_count)
|
||||
defp refresh_layout(socket, workbench), do: SocketState.refresh_layout(socket, workbench)
|
||||
|
||||
task_status =
|
||||
socket.assigns[:task_status] || %{running_task_message: nil, running_task_overflow: nil}
|
||||
|
||||
dashboard = socket.assigns[:dashboard] || BDS.UI.Dashboard.empty_snapshot()
|
||||
page_language = socket.assigns[:page_language] || ShellData.ui_language()
|
||||
offline_mode = Map.get(socket.assigns, :offline_mode, true)
|
||||
sidebar_data = socket.assigns[:sidebar_data] || %{}
|
||||
current_tab = current_tab(workbench)
|
||||
prev_tab = socket.assigns[:current_tab]
|
||||
|
||||
prev_panel_tab =
|
||||
case socket.assigns[:workbench] do
|
||||
%Workbench{panel: %{active_tab: tab}} -> tab
|
||||
_ -> nil
|
||||
end
|
||||
|
||||
socket =
|
||||
socket
|
||||
|> assign(:workbench, workbench)
|
||||
|> assign(:activity_buttons, activity_buttons)
|
||||
|> assign(
|
||||
:sidebar_header,
|
||||
active_sidebar_label(activity_buttons, workbench.active_view, sidebar_data)
|
||||
)
|
||||
|> assign(:panel_tabs, ShellData.panel_tabs(workbench))
|
||||
|> assign(:current_tab, current_tab)
|
||||
|> assign(:editor_meta, ShellData.editor_meta(task_status))
|
||||
|> assign(
|
||||
:status,
|
||||
ShellData.status_bar(workbench, task_status, dashboard,
|
||||
ui_language: page_language,
|
||||
offline_mode: offline_mode
|
||||
)
|
||||
)
|
||||
|
||||
if panel_data_stale?(current_tab, prev_tab, workbench.panel.active_tab, prev_panel_tab) do
|
||||
refresh_panel_data(socket)
|
||||
else
|
||||
socket
|
||||
end
|
||||
end
|
||||
|
||||
defp panel_data_stale?(current_tab, prev_tab, panel_tab, prev_panel_tab) do
|
||||
current_tab != prev_tab or panel_tab != prev_panel_tab
|
||||
end
|
||||
|
||||
defp refresh_panel_data(socket) do
|
||||
panel_tab = socket.assigns.workbench.panel.active_tab
|
||||
|
||||
socket
|
||||
|> assign(
|
||||
:panel_post_links,
|
||||
if(panel_tab == :post_links,
|
||||
do: PanelRenderer.fetch_post_link_entries(socket.assigns),
|
||||
else: socket.assigns[:panel_post_links] || %{backlinks: [], outlinks: []}
|
||||
)
|
||||
)
|
||||
|> assign(
|
||||
:panel_git_entries,
|
||||
if(panel_tab == :git_log,
|
||||
do: PanelRenderer.fetch_git_log_entries(socket.assigns),
|
||||
else: socket.assigns[:panel_git_entries] || []
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
defp push_url_state(socket) do
|
||||
workbench = socket.assigns.workbench
|
||||
|
||||
params =
|
||||
%{}
|
||||
|> put_url_view(workbench.active_view)
|
||||
|> put_url_tab(workbench.active_tab)
|
||||
|
||||
query = URI.encode_query(params)
|
||||
path = if query == "", do: "/", else: "/?" <> query
|
||||
|
||||
push_event(socket, "url-state", %{path: path})
|
||||
end
|
||||
|
||||
defp put_url_view(params, :posts), do: params
|
||||
defp put_url_view(params, view), do: Map.put(params, "view", Atom.to_string(view))
|
||||
|
||||
defp put_url_tab(params, nil), do: params
|
||||
|
||||
defp put_url_tab(params, {type, id}),
|
||||
do: Map.put(params, "tab", Atom.to_string(type) <> ":" <> id)
|
||||
|
||||
defp apply_url_params(socket, params) when is_map(params) and map_size(params) > 0 do
|
||||
workbench = socket.assigns.workbench
|
||||
|
||||
workbench = apply_url_view(workbench, Map.get(params, "view"))
|
||||
workbench = apply_url_tab(workbench, Map.get(params, "tab"))
|
||||
|
||||
if workbench == socket.assigns.workbench do
|
||||
socket
|
||||
else
|
||||
tab_meta = TabHelpers.sync_tab_meta(workbench, socket.assigns[:tab_meta] || %{})
|
||||
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> refresh_sidebar(workbench)
|
||||
end
|
||||
end
|
||||
|
||||
defp apply_url_params(socket, _params), do: socket
|
||||
|
||||
defp apply_url_view(workbench, nil), do: workbench
|
||||
|
||||
defp apply_url_view(workbench, view_str) do
|
||||
view = BoundedAtoms.sidebar_view(view_str, nil)
|
||||
|
||||
if view && view != workbench.active_view do
|
||||
Workbench.click_activity(workbench, view)
|
||||
else
|
||||
workbench
|
||||
end
|
||||
end
|
||||
|
||||
defp apply_url_tab(workbench, nil), do: workbench
|
||||
|
||||
defp apply_url_tab(workbench, tab_str) do
|
||||
case String.split(tab_str, ":", parts: 2) do
|
||||
[type_str, id] ->
|
||||
type = BoundedAtoms.editor_route(type_str, nil)
|
||||
|
||||
if type && workbench.active_tab != {type, id} do
|
||||
Workbench.open_tab(workbench, type, id, :preview)
|
||||
else
|
||||
workbench
|
||||
end
|
||||
|
||||
_ ->
|
||||
workbench
|
||||
end
|
||||
end
|
||||
|
||||
defp refresh_sidebar(socket, workbench) do
|
||||
project_id = (socket.assigns[:projects] || %{})[:active_project_id]
|
||||
active_view_id = Atom.to_string(workbench.active_view)
|
||||
|
||||
sidebar_data =
|
||||
case ShellData.sidebar_view(
|
||||
project_id,
|
||||
active_view_id,
|
||||
ShellSidebarState.current_filters(socket, active_view_id)
|
||||
) do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> BDS.UI.Sidebar.view(nil, active_view_id, %{})
|
||||
end
|
||||
|
||||
sidebar_data = ShellSidebarState.merge_ui_state(socket, active_view_id, sidebar_data)
|
||||
|
||||
socket
|
||||
|> assign(:sidebar_data, sidebar_data)
|
||||
|> refresh_layout(workbench)
|
||||
end
|
||||
defp refresh_sidebar(socket, workbench), do: SocketState.refresh_sidebar(socket, workbench)
|
||||
|
||||
defp refresh_content(socket, workbench) do
|
||||
projects =
|
||||
@@ -971,12 +815,6 @@ defmodule BDS.Desktop.ShellLive do
|
||||
defp activity_label("Source Control"), do: dgettext("ui", "Git")
|
||||
defp activity_label(label), do: label
|
||||
|
||||
defp active_sidebar_label(activity_buttons, active_view, sidebar_data) do
|
||||
Enum.find_value(activity_buttons, Map.get(sidebar_data, :title, ""), fn button ->
|
||||
if button.id == active_view, do: activity_label(button.label), else: nil
|
||||
end)
|
||||
end
|
||||
|
||||
defp sidebar_header_label(label), do: label
|
||||
|
||||
defp timeline_height(entry, entries) do
|
||||
@@ -988,12 +826,6 @@ defmodule BDS.Desktop.ShellLive do
|
||||
max(4, (entry.count || 0) / max_count * 100)
|
||||
end
|
||||
|
||||
defp current_tab(%{active_tab: nil}), do: nil
|
||||
|
||||
defp current_tab(%{tabs: tabs, active_tab: {type, id}}) do
|
||||
Enum.find(tabs, &(&1.type == type and &1.id == id))
|
||||
end
|
||||
|
||||
defp create_sidebar_item(socket, kind),
|
||||
do: SidebarCreate.create(socket, kind, sidebar_create_callbacks())
|
||||
|
||||
@@ -1097,125 +929,11 @@ defmodule BDS.Desktop.ShellLive do
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> refresh_layout(workbench)
|
||||
|> push_url_state()
|
||||
end
|
||||
|
||||
defp run_git_action(socket, event) do
|
||||
project_id = current_project_id(socket)
|
||||
|
||||
{label, result} =
|
||||
case event do
|
||||
"git_fetch" -> {dgettext("ui", "Fetch"), git_call(project_id, &BDS.Git.fetch/1)}
|
||||
"git_pull" -> {dgettext("ui", "Pull"), git_call(project_id, &BDS.Git.pull/1)}
|
||||
"git_push" -> {dgettext("ui", "Push"), git_call(project_id, &BDS.Git.push/1)}
|
||||
"git_prune_lfs" -> {dgettext("ui", "Prune LFS"), prune_lfs(project_id)}
|
||||
end
|
||||
|
||||
socket
|
||||
|> append_git_result(label, result)
|
||||
|> refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
|
||||
defp commit_git(socket, "") do
|
||||
socket
|
||||
|> append_output_entry(
|
||||
dgettext("ui", "Commit"),
|
||||
dgettext("ui", "Commit message is required"),
|
||||
nil,
|
||||
"error"
|
||||
)
|
||||
|> refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
|
||||
defp commit_git(socket, message) do
|
||||
case git_call(current_project_id(socket), &BDS.Git.commit_all(&1, message)) do
|
||||
{:ok, _result} ->
|
||||
workbench = close_git_diff_tabs(socket.assigns.workbench)
|
||||
tab_meta = TabHelpers.sync_tab_meta(workbench, socket.assigns[:tab_meta] || %{})
|
||||
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> append_output_entry(dgettext("ui", "Commit"), message)
|
||||
|> refresh_sidebar(workbench)
|
||||
|> push_url_state()
|
||||
|
||||
{:error, reason} ->
|
||||
socket
|
||||
|> append_output_entry(dgettext("ui", "Commit"), format_git_error(reason), nil, "error")
|
||||
|> refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
end
|
||||
|
||||
defp initialize_git(socket, remote_url) do
|
||||
project_id = current_project_id(socket)
|
||||
|
||||
case git_call(project_id, &BDS.Git.initialize_repo/1) do
|
||||
{:ok, _repo} ->
|
||||
_ = maybe_set_git_remote(project_id, remote_url)
|
||||
|
||||
socket
|
||||
|> append_output_entry(
|
||||
dgettext("ui", "Initialize Git"),
|
||||
dgettext("ui", "Repository initialized")
|
||||
)
|
||||
|> refresh_sidebar(socket.assigns.workbench)
|
||||
|
||||
{:error, reason} ->
|
||||
socket
|
||||
|> append_output_entry(
|
||||
dgettext("ui", "Initialize Git"),
|
||||
format_git_error(reason),
|
||||
nil,
|
||||
"error"
|
||||
)
|
||||
|> refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
end
|
||||
|
||||
defp git_call(nil, _fun), do: {:error, :no_project}
|
||||
defp git_call("default", _fun), do: {:error, :no_project}
|
||||
defp git_call(project_id, fun) when is_binary(project_id), do: fun.(project_id)
|
||||
|
||||
defp prune_lfs(nil), do: {:error, :no_project}
|
||||
defp prune_lfs("default"), do: {:error, :no_project}
|
||||
|
||||
defp prune_lfs(project_id) when is_binary(project_id),
|
||||
do: BDS.Git.prune_lfs_cache(project_id, 10)
|
||||
|
||||
defp maybe_set_git_remote(_project_id, nil), do: :ok
|
||||
|
||||
defp maybe_set_git_remote(project_id, remote_url),
|
||||
do: BDS.Git.set_remote(project_id, remote_url)
|
||||
|
||||
defp append_git_result(socket, label, {:ok, _result}) do
|
||||
append_output_entry(socket, label, dgettext("ui", "Done"))
|
||||
end
|
||||
|
||||
defp append_git_result(socket, label, {:error, reason}) do
|
||||
append_output_entry(socket, label, format_git_error(reason), nil, "error")
|
||||
end
|
||||
|
||||
defp format_git_error(:no_project), do: dgettext("ui", "No active project")
|
||||
defp format_git_error(%{message: message}) when is_binary(message), do: message
|
||||
defp format_git_error(%{guidance: guidance}) when is_binary(guidance), do: guidance
|
||||
defp format_git_error({:git_failed, message}) when is_binary(message), do: message
|
||||
defp format_git_error(reason), do: inspect(reason)
|
||||
|
||||
defp close_git_diff_tabs(workbench) do
|
||||
workbench.tabs
|
||||
|> Enum.filter(&(&1.type == :git_diff))
|
||||
|> Enum.reduce(workbench, fn tab, wb -> Workbench.close_tab(wb, :git_diff, tab.id) end)
|
||||
|> UrlState.push()
|
||||
end
|
||||
|
||||
defp current_project_id(socket), do: (socket.assigns[:projects] || %{})[:active_project_id]
|
||||
|
||||
defp normalize_git_remote_url(value) do
|
||||
case value |> to_string() |> String.trim() do
|
||||
"" -> nil
|
||||
url -> url
|
||||
end
|
||||
end
|
||||
|
||||
defp sidebar_create_action(view), do: SidebarCreate.action(view)
|
||||
|
||||
defp set_page_language(socket, language) do
|
||||
@@ -1258,7 +976,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
|> assign(:sidebar_filters_by_view, %{})
|
||||
|> append_output_entry(title, message_fun.(project))
|
||||
|> reload_shell(Workbench.new())
|
||||
|> push_url_state()
|
||||
|> UrlState.push()
|
||||
|
||||
{:error, reason} ->
|
||||
socket
|
||||
@@ -1268,11 +986,8 @@ defmodule BDS.Desktop.ShellLive do
|
||||
end
|
||||
end
|
||||
|
||||
defp append_output_entry(socket, title, message, details \\ nil, level \\ "info") do
|
||||
entry = %{title: title, message: message, details: details, level: level}
|
||||
entries = [entry | socket.assigns.output_entries] |> Enum.take(@output_entry_limit)
|
||||
assign(socket, :output_entries, entries)
|
||||
end
|
||||
defp append_output_entry(socket, title, message, details \\ nil, level \\ "info"),
|
||||
do: SocketState.append_output_entry(socket, title, message, details, level)
|
||||
|
||||
defp handle_native_menu_action(socket, action) do
|
||||
case BoundedAtoms.menu_action(action) do
|
||||
@@ -1293,7 +1008,7 @@ defmodule BDS.Desktop.ShellLive do
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> refresh_sidebar(workbench)
|
||||
|> push_url_state()
|
||||
|> UrlState.push()
|
||||
|
||||
MapSet.member?(@socket_menu_actions, action) ->
|
||||
handle_socket_menu_action(socket, action)
|
||||
@@ -1317,8 +1032,10 @@ defmodule BDS.Desktop.ShellLive do
|
||||
|
||||
defp handle_socket_menu_action(socket, :new_post), do: create_sidebar_item(socket, "post")
|
||||
defp handle_socket_menu_action(socket, :import_media), do: create_sidebar_item(socket, "media")
|
||||
defp handle_socket_menu_action(socket, :save), do: save_current_tab(socket)
|
||||
defp handle_socket_menu_action(socket, :publish_selected), do: publish_current_tab(socket)
|
||||
|
||||
defp handle_socket_menu_action(socket, :save), do: TabActions.save_current_tab(socket)
|
||||
|
||||
defp handle_socket_menu_action(socket, :publish_selected), do: TabActions.publish_current_tab(socket)
|
||||
|
||||
defp handle_socket_menu_action(socket, :quit) do
|
||||
Shutdown.request_quit()
|
||||
@@ -1347,62 +1064,6 @@ defmodule BDS.Desktop.ShellLive do
|
||||
|
||||
defp shell_command?(action), do: not is_nil(shell_command_atom(action))
|
||||
|
||||
defp auto_save_current_post(
|
||||
%{assigns: %{current_tab: %{type: :post, id: post_id}, workbench: workbench}} = socket
|
||||
) do
|
||||
if Workbench.dirty?(workbench, :post, post_id) do
|
||||
send_update(PostEditor, id: "post-editor-#{post_id}", action: :save)
|
||||
end
|
||||
|
||||
socket
|
||||
end
|
||||
|
||||
defp auto_save_current_post(socket), do: socket
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||
send_update(PostEditor, id: "post-editor-#{post_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :media, id: media_id}}} = socket) do
|
||||
send_update(MediaEditor, id: "media-editor-#{media_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :settings}}} = socket) do
|
||||
send_update(SettingsEditor, id: "settings-editor", action: :save_project)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :menu_editor}}} = socket) do
|
||||
send_update(MenuEditor, id: "menu-editor", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :tags}}} = socket) do
|
||||
send_update(TagsEditor, id: "tags-editor", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :scripts, id: script_id}}} = socket) do
|
||||
send_update(ScriptEditor, id: "script-editor-#{script_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(%{assigns: %{current_tab: %{type: :templates, id: template_id}}} = socket) do
|
||||
send_update(TemplateEditor, id: "template-editor-#{template_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
defp save_current_tab(socket), do: refresh_layout(socket, socket.assigns.workbench)
|
||||
|
||||
defp publish_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||
send_update(PostEditor, id: "post-editor-#{post_id}", action: :publish)
|
||||
socket
|
||||
end
|
||||
|
||||
defp publish_current_tab(socket), do: refresh_layout(socket, socket.assigns.workbench)
|
||||
|
||||
defp apply_shell_command(socket, action, params \\ %{}),
|
||||
do: ShellCommandRunner.execute(socket, action, params, shell_command_callbacks())
|
||||
|
||||
|
||||
@@ -996,7 +996,9 @@ defmodule BDS.Desktop.ShellLive.ChatEditor do
|
||||
try do
|
||||
Ecto.Adapters.SQL.Sandbox.allow(BDS.Repo, self(), pid)
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed chat_editor allow_repo_sandbox error: #{inspect(error)}")
|
||||
:ok
|
||||
end
|
||||
else
|
||||
:ok
|
||||
|
||||
126
lib/bds/desktop/shell_live/git_handler.ex
Normal file
126
lib/bds/desktop/shell_live/git_handler.ex
Normal file
@@ -0,0 +1,126 @@
|
||||
defmodule BDS.Desktop.ShellLive.GitHandler do
|
||||
@moduledoc false
|
||||
|
||||
import Phoenix.Component, only: [assign: 3]
|
||||
|
||||
alias BDS.Desktop.ShellLive.{SocketState, TabHelpers, UrlState}
|
||||
alias BDS.UI.Workbench
|
||||
|
||||
use Gettext, backend: BDS.Gettext
|
||||
|
||||
def run_action(socket, event) do
|
||||
project_id = current_project_id(socket)
|
||||
|
||||
{label, result} =
|
||||
case event do
|
||||
"git_fetch" -> {dgettext("ui", "Fetch"), git_call(project_id, &BDS.Git.fetch/1)}
|
||||
"git_pull" -> {dgettext("ui", "Pull"), git_call(project_id, &BDS.Git.pull/1)}
|
||||
"git_push" -> {dgettext("ui", "Push"), git_call(project_id, &BDS.Git.push/1)}
|
||||
"git_prune_lfs" -> {dgettext("ui", "Prune LFS"), prune_lfs(project_id)}
|
||||
end
|
||||
|
||||
socket
|
||||
|> append_git_result(label, result)
|
||||
|> SocketState.refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
|
||||
def commit(socket, "") do
|
||||
socket
|
||||
|> SocketState.append_output_entry(
|
||||
dgettext("ui", "Commit"),
|
||||
dgettext("ui", "Commit message is required"),
|
||||
nil,
|
||||
"error"
|
||||
)
|
||||
|> SocketState.refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
|
||||
def commit(socket, message) do
|
||||
case git_call(current_project_id(socket), &BDS.Git.commit_all(&1, message)) do
|
||||
{:ok, _result} ->
|
||||
workbench = close_git_diff_tabs(socket.assigns.workbench)
|
||||
tab_meta = TabHelpers.sync_tab_meta(workbench, socket.assigns[:tab_meta] || %{})
|
||||
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> SocketState.append_output_entry(dgettext("ui", "Commit"), message, nil, "info")
|
||||
|> SocketState.refresh_sidebar(workbench)
|
||||
|> UrlState.push()
|
||||
|
||||
{:error, reason} ->
|
||||
socket
|
||||
|> SocketState.append_output_entry(dgettext("ui", "Commit"), format_git_error(reason), nil, "error")
|
||||
|> SocketState.refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(socket, remote_url) do
|
||||
project_id = current_project_id(socket)
|
||||
|
||||
case git_call(project_id, &BDS.Git.initialize_repo/1) do
|
||||
{:ok, _repo} ->
|
||||
_ = maybe_set_git_remote(project_id, remote_url)
|
||||
|
||||
socket
|
||||
|> SocketState.append_output_entry(
|
||||
dgettext("ui", "Initialize Git"),
|
||||
dgettext("ui", "Repository initialized"),
|
||||
nil,
|
||||
"info"
|
||||
)
|
||||
|> SocketState.refresh_sidebar(socket.assigns.workbench)
|
||||
|
||||
{:error, reason} ->
|
||||
socket
|
||||
|> SocketState.append_output_entry(
|
||||
dgettext("ui", "Initialize Git"),
|
||||
format_git_error(reason),
|
||||
nil,
|
||||
"error"
|
||||
)
|
||||
|> SocketState.refresh_sidebar(socket.assigns.workbench)
|
||||
end
|
||||
end
|
||||
|
||||
def normalize_remote_url(value) do
|
||||
case value |> to_string() |> String.trim() do
|
||||
"" -> nil
|
||||
url -> url
|
||||
end
|
||||
end
|
||||
|
||||
defp git_call(nil, _fun), do: {:error, :no_project}
|
||||
defp git_call("default", _fun), do: {:error, :no_project}
|
||||
defp git_call(project_id, fun) when is_binary(project_id), do: fun.(project_id)
|
||||
|
||||
defp prune_lfs(nil), do: {:error, :no_project}
|
||||
defp prune_lfs("default"), do: {:error, :no_project}
|
||||
|
||||
defp prune_lfs(project_id) when is_binary(project_id),
|
||||
do: BDS.Git.prune_lfs_cache(project_id, 10)
|
||||
|
||||
defp maybe_set_git_remote(_project_id, nil), do: :ok
|
||||
defp maybe_set_git_remote(project_id, remote_url), do: BDS.Git.set_remote(project_id, remote_url)
|
||||
|
||||
defp append_git_result(socket, label, {:ok, _result}) do
|
||||
SocketState.append_output_entry(socket, label, dgettext("ui", "Done"), nil, "info")
|
||||
end
|
||||
|
||||
defp append_git_result(socket, label, {:error, reason}) do
|
||||
SocketState.append_output_entry(socket, label, format_git_error(reason), nil, "error")
|
||||
end
|
||||
|
||||
defp format_git_error(:no_project), do: dgettext("ui", "No active project")
|
||||
defp format_git_error(%{message: message}) when is_binary(message), do: message
|
||||
defp format_git_error(%{guidance: guidance}) when is_binary(guidance), do: guidance
|
||||
defp format_git_error({:git_failed, message}) when is_binary(message), do: message
|
||||
defp format_git_error(reason), do: inspect(reason)
|
||||
|
||||
defp close_git_diff_tabs(workbench) do
|
||||
workbench.tabs
|
||||
|> Enum.filter(&(&1.type == :git_diff))
|
||||
|> Enum.reduce(workbench, fn tab, wb -> Workbench.close_tab(wb, :git_diff, tab.id) end)
|
||||
end
|
||||
|
||||
defp current_project_id(socket), do: (socket.assigns[:projects] || %{})[:active_project_id]
|
||||
end
|
||||
@@ -6,6 +6,7 @@ defmodule BDS.Desktop.ShellLive.ImportEditor do
|
||||
alias BDS.{AI, ImportAnalysis, ImportDefinitions, ImportExecution}
|
||||
alias BDS.Desktop.{FilePicker, FolderPicker, ShellData}
|
||||
alias BDS.Desktop.ShellLive.Notify
|
||||
require Logger
|
||||
|
||||
alias BDS.Desktop.ShellLive.ImportEditor.{
|
||||
AnalysisState,
|
||||
@@ -1417,7 +1418,9 @@ defmodule BDS.Desktop.ShellLive.ImportEditor do
|
||||
try do
|
||||
Ecto.Adapters.SQL.Sandbox.allow(BDS.Repo, self(), pid)
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed import_editor allow_repo_sandbox error: #{inspect(error)}")
|
||||
:ok
|
||||
end
|
||||
else
|
||||
:ok
|
||||
|
||||
@@ -3,6 +3,7 @@ defmodule BDS.Desktop.ShellLive.ImportEditor.AnalysisState do
|
||||
|
||||
alias BDS.{ImportAnalysis, ImportDefinitions, Metadata}
|
||||
alias BDS.Desktop.{FilePicker, FolderPicker}
|
||||
require Logger
|
||||
use Gettext, backend: BDS.Gettext
|
||||
|
||||
@spec change_definition(term(), term(), term()) :: term()
|
||||
@@ -280,7 +281,12 @@ defmodule BDS.Desktop.ShellLive.ImportEditor.AnalysisState do
|
||||
try do
|
||||
Ecto.Adapters.SQL.Sandbox.allow(BDS.Repo, self(), pid)
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug(
|
||||
"swallowed import_editor analysis_state allow_repo_sandbox error: #{inspect(error)}"
|
||||
)
|
||||
|
||||
:ok
|
||||
end
|
||||
else
|
||||
:ok
|
||||
|
||||
@@ -2,6 +2,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor.ListValues do
|
||||
@moduledoc false
|
||||
|
||||
alias BDS.{Metadata, Tags}
|
||||
require Logger
|
||||
|
||||
@spec field_key(term()) :: term()
|
||||
def field_key(:tags), do: "tags"
|
||||
@@ -91,7 +92,9 @@ defmodule BDS.Desktop.ShellLive.PostEditor.ListValues do
|
||||
:ok
|
||||
end
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.warning("swallowed list_values ensure_list_value error: #{inspect(error)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
@spec csv_to_list(term()) :: term()
|
||||
|
||||
@@ -5,6 +5,7 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.AISettings do
|
||||
|
||||
alias BDS.AI
|
||||
alias BDS.Desktop.ShellLive.SettingsEditor.EditorSettings
|
||||
require Logger
|
||||
use Gettext, backend: BDS.Gettext
|
||||
|
||||
@spec ai_form(term()) :: term()
|
||||
@@ -171,7 +172,9 @@ defmodule BDS.Desktop.ShellLive.SettingsEditor.AISettings do
|
||||
defp safe_endpoint(kind) do
|
||||
case AI.get_endpoint(kind) do
|
||||
{:ok, ep} -> ep
|
||||
_error -> nil
|
||||
error ->
|
||||
Logger.debug("swallowed AI settings safe_endpoint error: #{inspect(error)}")
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
123
lib/bds/desktop/shell_live/socket_state.ex
Normal file
123
lib/bds/desktop/shell_live/socket_state.ex
Normal file
@@ -0,0 +1,123 @@
|
||||
defmodule BDS.Desktop.ShellLive.SocketState do
|
||||
@moduledoc false
|
||||
|
||||
import Phoenix.Component, only: [assign: 3]
|
||||
|
||||
alias BDS.Desktop.ShellData
|
||||
alias BDS.Desktop.ShellLive.{PanelRenderer, SidebarState}
|
||||
alias BDS.UI.Workbench
|
||||
|
||||
use Gettext, backend: BDS.Gettext
|
||||
|
||||
@output_entry_limit 20
|
||||
|
||||
def refresh_layout(socket, workbench) do
|
||||
git_badge_count = socket.assigns[:git_badge_count] || 0
|
||||
activity_buttons = Workbench.activity_buttons(workbench, git_badge_count)
|
||||
|
||||
task_status =
|
||||
socket.assigns[:task_status] || %{running_task_message: nil, running_task_overflow: nil}
|
||||
|
||||
dashboard = socket.assigns[:dashboard] || BDS.UI.Dashboard.empty_snapshot()
|
||||
page_language = socket.assigns[:page_language] || ShellData.ui_language()
|
||||
offline_mode = Map.get(socket.assigns, :offline_mode, true)
|
||||
sidebar_data = socket.assigns[:sidebar_data] || %{}
|
||||
current_tab = current_tab(workbench)
|
||||
prev_tab = socket.assigns[:current_tab]
|
||||
|
||||
prev_panel_tab =
|
||||
case socket.assigns[:workbench] do
|
||||
%Workbench{panel: %{active_tab: tab}} -> tab
|
||||
_ -> nil
|
||||
end
|
||||
|
||||
socket =
|
||||
socket
|
||||
|> assign(:workbench, workbench)
|
||||
|> assign(:activity_buttons, activity_buttons)
|
||||
|> assign(:sidebar_header, active_sidebar_label(activity_buttons, workbench.active_view, sidebar_data))
|
||||
|> assign(:panel_tabs, ShellData.panel_tabs(workbench))
|
||||
|> assign(:current_tab, current_tab)
|
||||
|> assign(:editor_meta, ShellData.editor_meta(task_status))
|
||||
|> assign(
|
||||
:status,
|
||||
ShellData.status_bar(workbench, task_status, dashboard,
|
||||
ui_language: page_language,
|
||||
offline_mode: offline_mode
|
||||
)
|
||||
)
|
||||
|
||||
if panel_data_stale?(current_tab, prev_tab, workbench.panel.active_tab, prev_panel_tab) do
|
||||
refresh_panel_data(socket)
|
||||
else
|
||||
socket
|
||||
end
|
||||
end
|
||||
|
||||
def refresh_sidebar(socket, workbench) do
|
||||
project_id = (socket.assigns[:projects] || %{})[:active_project_id]
|
||||
active_view_id = Atom.to_string(workbench.active_view)
|
||||
|
||||
sidebar_data =
|
||||
case ShellData.sidebar_view(
|
||||
project_id,
|
||||
active_view_id,
|
||||
SidebarState.current_filters(socket, active_view_id)
|
||||
) do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> BDS.UI.Sidebar.view(nil, active_view_id, %{})
|
||||
end
|
||||
|
||||
sidebar_data = SidebarState.merge_ui_state(socket, active_view_id, sidebar_data)
|
||||
|
||||
socket
|
||||
|> assign(:sidebar_data, sidebar_data)
|
||||
|> refresh_layout(workbench)
|
||||
end
|
||||
|
||||
def append_output_entry(socket, title, message, details \\ nil, level \\ "info") do
|
||||
entry = %{title: title, message: message, details: details, level: level}
|
||||
entries = [entry | socket.assigns.output_entries] |> Enum.take(@output_entry_limit)
|
||||
assign(socket, :output_entries, entries)
|
||||
end
|
||||
|
||||
defp panel_data_stale?(current_tab, prev_tab, panel_tab, prev_panel_tab) do
|
||||
current_tab != prev_tab or panel_tab != prev_panel_tab
|
||||
end
|
||||
|
||||
defp refresh_panel_data(socket) do
|
||||
panel_tab = socket.assigns.workbench.panel.active_tab
|
||||
|
||||
socket
|
||||
|> assign(
|
||||
:panel_post_links,
|
||||
if(panel_tab == :post_links,
|
||||
do: PanelRenderer.fetch_post_link_entries(socket.assigns),
|
||||
else: socket.assigns[:panel_post_links] || %{backlinks: [], outlinks: []}
|
||||
)
|
||||
)
|
||||
|> assign(
|
||||
:panel_git_entries,
|
||||
if(panel_tab == :git_log,
|
||||
do: PanelRenderer.fetch_git_log_entries(socket.assigns),
|
||||
else: socket.assigns[:panel_git_entries] || []
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
defp activity_label("AI Assistant"), do: dgettext("ui", "Chat")
|
||||
defp activity_label("Source Control"), do: dgettext("ui", "Git")
|
||||
defp activity_label(label), do: label
|
||||
|
||||
defp active_sidebar_label(activity_buttons, active_view, sidebar_data) do
|
||||
Enum.find_value(activity_buttons, Map.get(sidebar_data, :title, ""), fn button ->
|
||||
if button.id == active_view, do: activity_label(button.label), else: nil
|
||||
end)
|
||||
end
|
||||
|
||||
defp current_tab(%{active_tab: nil}), do: nil
|
||||
|
||||
defp current_tab(%{tabs: tabs, active_tab: {type, id}}) do
|
||||
Enum.find(tabs, &(&1.type == type and &1.id == id))
|
||||
end
|
||||
end
|
||||
72
lib/bds/desktop/shell_live/tab_actions.ex
Normal file
72
lib/bds/desktop/shell_live/tab_actions.ex
Normal file
@@ -0,0 +1,72 @@
|
||||
defmodule BDS.Desktop.ShellLive.TabActions do
|
||||
@moduledoc false
|
||||
|
||||
alias BDS.Desktop.ShellLive.{
|
||||
MediaEditor,
|
||||
MenuEditor,
|
||||
PostEditor,
|
||||
ScriptEditor,
|
||||
SocketState,
|
||||
SettingsEditor,
|
||||
TagsEditor,
|
||||
TemplateEditor
|
||||
}
|
||||
|
||||
alias BDS.UI.Workbench
|
||||
|
||||
def auto_save_current_post(
|
||||
%{assigns: %{current_tab: %{type: :post, id: post_id}, workbench: workbench}} = socket
|
||||
) do
|
||||
if Workbench.dirty?(workbench, :post, post_id) do
|
||||
Phoenix.LiveView.send_update(PostEditor, id: "post-editor-#{post_id}", action: :save)
|
||||
end
|
||||
|
||||
socket
|
||||
end
|
||||
|
||||
def auto_save_current_post(socket), do: socket
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||
Phoenix.LiveView.send_update(PostEditor, id: "post-editor-#{post_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :media, id: media_id}}} = socket) do
|
||||
Phoenix.LiveView.send_update(MediaEditor, id: "media-editor-#{media_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :settings}}} = socket) do
|
||||
Phoenix.LiveView.send_update(SettingsEditor, id: "settings-editor", action: :save_project)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :menu_editor}}} = socket) do
|
||||
Phoenix.LiveView.send_update(MenuEditor, id: "menu-editor", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :tags}}} = socket) do
|
||||
Phoenix.LiveView.send_update(TagsEditor, id: "tags-editor", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :scripts, id: script_id}}} = socket) do
|
||||
Phoenix.LiveView.send_update(ScriptEditor, id: "script-editor-#{script_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(%{assigns: %{current_tab: %{type: :templates, id: template_id}}} = socket) do
|
||||
Phoenix.LiveView.send_update(TemplateEditor, id: "template-editor-#{template_id}", action: :save)
|
||||
socket
|
||||
end
|
||||
|
||||
def save_current_tab(socket), do: SocketState.refresh_layout(socket, socket.assigns.workbench)
|
||||
|
||||
def publish_current_tab(%{assigns: %{current_tab: %{type: :post, id: post_id}}} = socket) do
|
||||
Phoenix.LiveView.send_update(PostEditor, id: "post-editor-#{post_id}", action: :publish)
|
||||
socket
|
||||
end
|
||||
|
||||
def publish_current_tab(socket), do: SocketState.refresh_layout(socket, socket.assigns.workbench)
|
||||
end
|
||||
78
lib/bds/desktop/shell_live/url_state.ex
Normal file
78
lib/bds/desktop/shell_live/url_state.ex
Normal file
@@ -0,0 +1,78 @@
|
||||
defmodule BDS.Desktop.ShellLive.UrlState do
|
||||
@moduledoc false
|
||||
|
||||
import Phoenix.Component, only: [assign: 3]
|
||||
|
||||
alias BDS.BoundedAtoms
|
||||
alias BDS.Desktop.ShellLive.{SocketState, TabHelpers}
|
||||
alias BDS.UI.Workbench
|
||||
|
||||
def push(socket) do
|
||||
workbench = socket.assigns.workbench
|
||||
|
||||
params =
|
||||
%{}
|
||||
|> put_url_view(workbench.active_view)
|
||||
|> put_url_tab(workbench.active_tab)
|
||||
|
||||
query = URI.encode_query(params)
|
||||
path = if query == "", do: "/", else: "/?" <> query
|
||||
|
||||
Phoenix.LiveView.push_event(socket, "url-state", %{path: path})
|
||||
end
|
||||
|
||||
def apply_params(socket, params) when is_map(params) and map_size(params) > 0 do
|
||||
workbench = socket.assigns.workbench
|
||||
|
||||
workbench = apply_url_view(workbench, Map.get(params, "view"))
|
||||
workbench = apply_url_tab(workbench, Map.get(params, "tab"))
|
||||
|
||||
if workbench == socket.assigns.workbench do
|
||||
socket
|
||||
else
|
||||
tab_meta = TabHelpers.sync_tab_meta(workbench, socket.assigns[:tab_meta] || %{})
|
||||
|
||||
socket
|
||||
|> assign(:tab_meta, tab_meta)
|
||||
|> SocketState.refresh_sidebar(workbench)
|
||||
end
|
||||
end
|
||||
|
||||
def apply_params(socket, _params), do: socket
|
||||
|
||||
defp put_url_view(params, :posts), do: params
|
||||
defp put_url_view(params, view), do: Map.put(params, "view", Atom.to_string(view))
|
||||
|
||||
defp put_url_tab(params, nil), do: params
|
||||
defp put_url_tab(params, {type, id}), do: Map.put(params, "tab", Atom.to_string(type) <> ":" <> id)
|
||||
|
||||
defp apply_url_view(workbench, nil), do: workbench
|
||||
|
||||
defp apply_url_view(workbench, view_str) do
|
||||
view = BoundedAtoms.sidebar_view(view_str, nil)
|
||||
|
||||
if view && view != workbench.active_view do
|
||||
Workbench.click_activity(workbench, view)
|
||||
else
|
||||
workbench
|
||||
end
|
||||
end
|
||||
|
||||
defp apply_url_tab(workbench, nil), do: workbench
|
||||
|
||||
defp apply_url_tab(workbench, tab_str) do
|
||||
case String.split(tab_str, ":", parts: 2) do
|
||||
[type_str, id] ->
|
||||
type = BoundedAtoms.editor_route(type_str, nil)
|
||||
|
||||
if type && workbench.active_tab != {type, id} do
|
||||
Workbench.open_tab(workbench, type, id, :preview)
|
||||
else
|
||||
workbench
|
||||
end
|
||||
|
||||
_ ->
|
||||
workbench
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -5,6 +5,7 @@ defmodule BDS.Desktop.Shutdown do
|
||||
alias Desktop.Wx
|
||||
alias Desktop.Window
|
||||
|
||||
require Logger
|
||||
require Record
|
||||
|
||||
Record.defrecordp(:wx, Record.extract(:wx, from_lib: "wx/include/wx.hrl"))
|
||||
@@ -25,9 +26,13 @@ defmodule BDS.Desktop.Shutdown do
|
||||
|
||||
:ok
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed shutdown install_handlers error: #{inspect(error)}")
|
||||
:ok
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed shutdown install_handlers exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
@spec request_quit() :: :ok
|
||||
@@ -102,9 +107,13 @@ defmodule BDS.Desktop.Shutdown do
|
||||
fun.()
|
||||
:ok
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed shutdown persist_step error: #{inspect(error)}")
|
||||
:ok
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed shutdown persist_step exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
# heart, when present, would relaunch the app after we kill the BEAM, so it
|
||||
@@ -120,9 +129,13 @@ defmodule BDS.Desktop.Shutdown do
|
||||
_ -> :ok
|
||||
end
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed shutdown kill_heart error: #{inspect(error)}")
|
||||
:ok
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed shutdown kill_heart exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
defp kill_beam do
|
||||
@@ -133,9 +146,13 @@ defmodule BDS.Desktop.Shutdown do
|
||||
os_kill_fun().(os_pid)
|
||||
:ok
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed shutdown os_kill error: #{inspect(error)}")
|
||||
:ok
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed shutdown os_kill exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
defp os_kill_fun do
|
||||
@@ -158,9 +175,13 @@ defmodule BDS.Desktop.Shutdown do
|
||||
|
||||
:ok
|
||||
rescue
|
||||
_error -> :ok
|
||||
error ->
|
||||
Logger.debug("swallowed shutdown maybe_hide_window error: #{inspect(error)}")
|
||||
:ok
|
||||
catch
|
||||
:exit, _reason -> :ok
|
||||
:exit, reason ->
|
||||
Logger.debug("swallowed shutdown maybe_hide_window exit: #{inspect(reason)}")
|
||||
:ok
|
||||
end
|
||||
|
||||
@doc false
|
||||
|
||||
Reference in New Issue
Block a user