fix: fix CSM-012

This commit is contained in:
2026-05-09 15:04:10 +02:00
parent 35b3818d58
commit 44b88056e3
5 changed files with 162 additions and 32 deletions

View File

@@ -2,9 +2,13 @@ defmodule BDS.Desktop.FilePicker do
@moduledoc false
def choose_file(prompt) when is_binary(prompt) do
case :os.type() do
{:unix, :darwin} -> choose_file_macos(prompt)
_other -> {:error, %{message: "File selection is only supported on macOS desktop"}}
if System.get_env("BDS_DESKTOP_AUTOMATION") == "1" do
:cancel
else
case :os.type() do
{:unix, :darwin} -> choose_file_macos(prompt)
_other -> {:error, %{message: "File selection is only supported on macOS desktop"}}
end
end
end

View File

@@ -170,6 +170,7 @@ defmodule BDS.Desktop.ShellLive do
|> assign(:sidebar_filters_by_view, %{})
|> assign(:sidebar_filter_panels, %{})
|> assign(:chat_editor_request_refs, %{})
|> assign(:file_picker_task, nil)
|> assign(:shell_overlay, nil)
|> assign(:output_entries, [])
|> assign(:panel_post_links, %{backlinks: [], outlinks: []})
@@ -508,6 +509,12 @@ defmodule BDS.Desktop.ShellLive do
Process.demonitor(ref, [:flush])
cond do
socket.assigns.file_picker_task == ref ->
{:noreply,
socket
|> assign(:file_picker_task, nil)
|> handle_file_picker_result(result)}
Map.has_key?(socket.assigns.chat_editor_request_refs, ref) ->
{conversation_id, remaining_refs} = Map.pop(socket.assigns.chat_editor_request_refs, ref)
@@ -527,6 +534,21 @@ defmodule BDS.Desktop.ShellLive do
def handle_info({:DOWN, ref, :process, _pid, reason}, socket) when is_reference(ref) do
next_socket =
cond do
socket.assigns.file_picker_task == ref ->
if reason == :normal do
assign(socket, :file_picker_task, nil)
else
socket
|> assign(:file_picker_task, nil)
|> append_output_entry(
dgettext("ui", "Import media"),
inspect(reason),
nil,
"error"
)
|> refresh_content(socket.assigns.workbench)
end
Map.has_key?(socket.assigns.chat_editor_request_refs, ref) ->
{conversation_id, remaining_refs} =
Map.pop(socket.assigns.chat_editor_request_refs, ref)
@@ -839,6 +861,23 @@ defmodule BDS.Desktop.ShellLive do
defp create_sidebar_item(socket, kind),
do: SidebarCreate.create(socket, kind, sidebar_create_callbacks())
defp handle_file_picker_result(socket, {:ok, _media}),
do: refresh_content(socket, socket.assigns.workbench)
defp handle_file_picker_result(socket, :cancel), do: socket
defp handle_file_picker_result(socket, {:error, %{message: message}}),
do:
socket
|> append_output_entry(dgettext("ui", "Import media"), message, nil, "error")
|> refresh_content(socket.assigns.workbench)
defp handle_file_picker_result(socket, {:error, reason}),
do:
socket
|> append_output_entry(dgettext("ui", "Import media"), inspect(reason), nil, "error")
|> refresh_content(socket.assigns.workbench)
defp sidebar_create_callbacks do
%{
reload: &reload_shell/2,

View File

@@ -1,6 +1,8 @@
defmodule BDS.Desktop.ShellLive.SidebarCreate do
@moduledoc false
import Phoenix.Component, only: [assign: 3]
alias BDS.Desktop.{FilePicker}
alias BDS.AI
alias BDS.ImportDefinitions
@@ -41,32 +43,24 @@ defmodule BDS.Desktop.ShellLive.SidebarCreate do
end
end
def create(socket, project_id, "media", callbacks) do
case FilePicker.choose_file(dgettext("ui", "Import media")) do
{:ok, source_path} ->
case BDS.Media.import_media(%{project_id: project_id, source_path: source_path}) do
{:ok, _media} ->
callbacks.refresh_content.(socket, socket.assigns.workbench)
def create(socket, project_id, "media", _callbacks) do
prompt = dgettext("ui", "Import media")
task =
Task.async(fn ->
case FilePicker.choose_file(prompt) do
{:ok, source_path} ->
BDS.Media.import_media(%{project_id: project_id, source_path: source_path})
:cancel ->
:cancel
{:error, reason} ->
socket
|> callbacks.append_output.(
dgettext("ui", "Import media"),
inspect(reason),
nil,
"error"
)
|> callbacks.refresh_content.(socket.assigns.workbench)
{:error, reason}
end
end)
:cancel ->
callbacks.refresh_content.(socket, socket.assigns.workbench)
{:error, %{message: message}} ->
socket
|> callbacks.append_output.(dgettext("ui", "Import media"), message, nil, "error")
|> callbacks.refresh_content.(socket.assigns.workbench)
end
assign(socket, :file_picker_task, task.ref)
end
def create(socket, project_id, "script", callbacks) do