feat: more work on UI cleanup

This commit is contained in:
2026-04-24 17:11:55 +02:00
parent 7a4c46b0df
commit eb609e1934
16 changed files with 1372 additions and 61 deletions

View File

@@ -19,6 +19,10 @@ defmodule BDS.Tasks do
GenServer.call(__MODULE__, {:get_task, task_id})
end
def status_snapshot do
GenServer.call(__MODULE__, :status_snapshot)
end
def cancel_task(task_id) when is_binary(task_id) do
GenServer.call(__MODULE__, {:cancel_task, task_id})
end
@@ -67,6 +71,10 @@ defmodule BDS.Tasks do
{:reply, state.tasks[task_id] && public_task(state.tasks[task_id]), state}
end
def handle_call(:status_snapshot, _from, state) do
{:reply, build_status_snapshot(state), state}
end
def handle_call({:cancel_task, task_id}, _from, state) do
cond do
Map.has_key?(state.running, task_id) ->
@@ -302,6 +310,46 @@ defmodule BDS.Tasks do
Map.drop(task, [:last_reported_at])
end
defp build_status_snapshot(state) do
tasks = active_tasks(state)
%{
active_count: length(tasks),
running_count: Enum.count(tasks, &(&1.status == :running)),
pending_count: Enum.count(tasks, &(&1.status == :pending)),
running_task_message: running_task_message(tasks),
running_task_overflow: running_task_overflow(tasks),
tasks: Enum.map(tasks, &public_task/1)
}
end
defp active_tasks(state) do
state.tasks
|> Map.values()
|> Enum.filter(&(&1.status in [:running, :pending]))
|> Enum.sort_by(&task_sort_key/1)
end
defp task_sort_key(task) do
{task_priority(task.status), task.started_at || task.created_at}
end
defp task_priority(:running), do: 0
defp task_priority(:pending), do: 1
defp running_task_message([]), do: nil
defp running_task_message([task | _rest]) do
cond do
task.status == :pending -> "Queued: #{task.name}"
is_binary(task.message) and task.message != "" -> "#{task.name}: #{task.message}"
true -> task.name
end
end
defp running_task_overflow([]), do: 0
defp running_task_overflow(tasks), do: max(length(tasks) - 1, 0)
defp normalize_result({:ok, _value} = result), do: result
defp normalize_result({:error, _reason} = result), do: result
defp normalize_result(value), do: {:ok, value}